diff --git a/.github/ISSUE_TEMPLATE/10_question.md b/.github/ISSUE_TEMPLATE/10_question.md index 6e23fbdc605..a112b9599d5 100644 --- a/.github/ISSUE_TEMPLATE/10_question.md +++ b/.github/ISSUE_TEMPLATE/10_question.md @@ -7,6 +7,6 @@ assignees: '' --- -Make sure to check documentation https://clickhouse.yandex/docs/en/ first. If the question is concise and probably has a short answer, asking it in Telegram chat https://telegram.me/clickhouse_en is probably the fastest way to find the answer. For more complicated questions, consider asking them on StackOverflow with "clickhouse" tag https://stackoverflow.com/questions/tagged/clickhouse +> Make sure to check documentation https://clickhouse.yandex/docs/en/ first. If the question is concise and probably has a short answer, asking it in Telegram chat https://telegram.me/clickhouse_en is probably the fastest way to find the answer. For more complicated questions, consider asking them on StackOverflow with "clickhouse" tag https://stackoverflow.com/questions/tagged/clickhouse -If you still prefer GitHub issues, remove all this text and ask your question here. +> If you still prefer GitHub issues, remove all this text and ask your question here. diff --git a/.github/ISSUE_TEMPLATE/20_feature-request.md b/.github/ISSUE_TEMPLATE/20_feature-request.md index 99a762a2019..f59dbc2c40f 100644 --- a/.github/ISSUE_TEMPLATE/20_feature-request.md +++ b/.github/ISSUE_TEMPLATE/20_feature-request.md @@ -7,16 +7,20 @@ assignees: '' --- -(you don't have to strictly follow this form) +> (you don't have to strictly follow this form) **Use case** -A clear and concise description of what is the intended usage scenario is. + +> A clear and concise description of what is the intended usage scenario is. **Describe the solution you'd like** -A clear and concise description of what you want to happen. + +> A clear and concise description of what you want to happen. **Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. + +> A clear and concise description of any alternative solutions or features you've considered. **Additional context** -Add any other context or screenshots about the feature request here. + +> Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/50_build-issue.md b/.github/ISSUE_TEMPLATE/50_build-issue.md index 73c97cc3cfb..a358575cd7c 100644 --- a/.github/ISSUE_TEMPLATE/50_build-issue.md +++ b/.github/ISSUE_TEMPLATE/50_build-issue.md @@ -7,10 +7,11 @@ assignees: '' --- -Make sure that `git diff` result is empty and you've just pulled fresh master. Try cleaning up cmake cache. Just in case, official build instructions are published here: https://clickhouse.yandex/docs/en/development/build/ +> Make sure that `git diff` result is empty and you've just pulled fresh master. Try cleaning up cmake cache. Just in case, official build instructions are published here: https://clickhouse.yandex/docs/en/development/build/ **Operating system** -OS kind or distribution, specific version/release, non-standard kernel if any. If you are trying to build inside virtual machine, please mention it too. + +> OS kind or distribution, specific version/release, non-standard kernel if any. If you are trying to build inside virtual machine, please mention it too. **Cmake version** diff --git a/.github/ISSUE_TEMPLATE/40_bug-report.md b/.github/ISSUE_TEMPLATE/85_bug-report.md similarity index 65% rename from .github/ISSUE_TEMPLATE/40_bug-report.md rename to .github/ISSUE_TEMPLATE/85_bug-report.md index 5c8611d47e6..d78474670ff 100644 --- a/.github/ISSUE_TEMPLATE/40_bug-report.md +++ b/.github/ISSUE_TEMPLATE/85_bug-report.md @@ -1,17 +1,17 @@ --- name: Bug report -about: Create a report to help us improve ClickHouse +about: Wrong behaviour (visible to users) in official ClickHouse release. title: '' -labels: bug +labels: 'potential bug' assignees: '' --- -You have to provide the following information whenever possible. +> You have to provide the following information whenever possible. **Describe the bug** -A clear and concise description of what works not as it is supposed to. +> A clear and concise description of what works not as it is supposed to. **Does it reproduce on recent release?** @@ -19,7 +19,7 @@ A clear and concise description of what works not as it is supposed to. **Enable crash reporting** -If possible, change "enabled" to true in "send_crash_reports" section in `config.xml`: +> If possible, change "enabled" to true in "send_crash_reports" section in `config.xml`: ``` @@ -39,12 +39,12 @@ If possible, change "enabled" to true in "send_crash_reports" section in `config **Expected behavior** -A clear and concise description of what you expected to happen. +> A clear and concise description of what you expected to happen. **Error message and/or stacktrace** -If applicable, add screenshots to help explain your problem. +> If applicable, add screenshots to help explain your problem. **Additional context** -Add any other context about the problem here. +> Add any other context about the problem here. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index db923369296..d3fac8670e8 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -2,28 +2,26 @@ I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla Changelog category (leave one): - New Feature -- Bug Fix - Improvement +- Bug Fix - Performance Improvement - Backward Incompatible Change - Build/Testing/Packaging Improvement - Documentation (changelog entry is not required) -- Other - Not for changelog (changelog entry is not required) Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md): - ... Detailed description / Documentation draft: - ... -By adding documentation, you'll allow users to try your new feature immediately, not when someone else will have time to document it later. Documentation is necessary for all features that affect user experience in any way. You can add brief documentation draft above, or add documentation right into your patch as Markdown files in [docs](https://github.com/ClickHouse/ClickHouse/tree/master/docs) folder. -If you are doing this for the first time, it's recommended to read the lightweight [Contributing to ClickHouse Documentation](https://github.com/ClickHouse/ClickHouse/tree/master/docs/README.md) guide first. +> By adding documentation, you'll allow users to try your new feature immediately, not when someone else will have time to document it later. Documentation is necessary for all features that affect user experience in any way. You can add brief documentation draft above, or add documentation right into your patch as Markdown files in [docs](https://github.com/ClickHouse/ClickHouse/tree/master/docs) folder. + +> If you are doing this for the first time, it's recommended to read the lightweight [Contributing to ClickHouse Documentation](https://github.com/ClickHouse/ClickHouse/tree/master/docs/README.md) guide first. -Information about CI checks: https://clickhouse.tech/docs/en/development/continuous-integration/ +> Information about CI checks: https://clickhouse.tech/docs/en/development/continuous-integration/ diff --git a/.gitmodules b/.gitmodules index 1d9d4d25baf..37b22527eb4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -193,7 +193,7 @@ url = https://github.com/danlark1/miniselect [submodule "contrib/rocksdb"] path = contrib/rocksdb - url = https://github.com/ClickHouse-Extras/rocksdb.git + url = https://github.com/ClickHouse-Extras/rocksdb.git [submodule "contrib/xz"] path = contrib/xz url = https://github.com/xz-mirror/xz @@ -225,6 +225,24 @@ [submodule "contrib/yaml-cpp"] path = contrib/yaml-cpp url = https://github.com/ClickHouse-Extras/yaml-cpp.git +[submodule "contrib/libstemmer_c"] + path = contrib/libstemmer_c + url = https://github.com/ClickHouse-Extras/libstemmer_c.git +[submodule "contrib/wordnet-blast"] + path = contrib/wordnet-blast + url = https://github.com/ClickHouse-Extras/wordnet-blast.git +[submodule "contrib/lemmagen-c"] + path = contrib/lemmagen-c + url = https://github.com/ClickHouse-Extras/lemmagen-c.git [submodule "contrib/libpqxx"] path = contrib/libpqxx url = https://github.com/ClickHouse-Extras/libpqxx.git +[submodule "contrib/sqlite-amalgamation"] + path = contrib/sqlite-amalgamation + url = https://github.com/azadkuh/sqlite-amalgamation +[submodule "contrib/s2geometry"] + path = contrib/s2geometry + url = https://github.com/ClickHouse-Extras/s2geometry.git +[submodule "contrib/bzip2"] + path = contrib/bzip2 + url = https://github.com/ClickHouse-Extras/bzip2.git diff --git a/CHANGELOG.md b/CHANGELOG.md index 8987082db30..103d8e40fd9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,258 @@ +### ClickHouse release v21.8, 2021-08-12 + +#### New Features + +* Add support for a part of SQL/JSON standard. [#24148](https://github.com/ClickHouse/ClickHouse/pull/24148) ([l1tsolaiki](https://github.com/l1tsolaiki), [Kseniia Sumarokova](https://github.com/kssenii)). +* Collect common system metrics (in `system.asynchronous_metrics` and `system.asynchronous_metric_log`) on CPU usage, disk usage, memory usage, IO, network, files, load average, CPU frequencies, thermal sensors, EDAC counters, system uptime; also added metrics about the scheduling jitter and the time spent collecting the metrics. It works similar to `atop` in ClickHouse and allows access to monitoring data even if you have no additional tools installed. Close [#9430](https://github.com/ClickHouse/ClickHouse/issues/9430). [#24416](https://github.com/ClickHouse/ClickHouse/pull/24416) ([alexey-milovidov](https://github.com/alexey-milovidov), [Yegor Levankov](https://github.com/elevankoff)). +* Add MaterializedPostgreSQL table engine and database engine. This database engine allows replicating a whole database or any subset of database tables. [#20470](https://github.com/ClickHouse/ClickHouse/pull/20470) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add new functions `leftPad()`, `rightPad()`, `leftPadUTF8()`, `rightPadUTF8()`. [#26075](https://github.com/ClickHouse/ClickHouse/pull/26075) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add the `FIRST` keyword to the `ADD INDEX` command to be able to add the index at the beginning of the indices list. [#25904](https://github.com/ClickHouse/ClickHouse/pull/25904) ([xjewer](https://github.com/xjewer)). +* Introduce `system.data_skipping_indices` table containing information about existing data skipping indices. Close [#7659](https://github.com/ClickHouse/ClickHouse/issues/7659). [#25693](https://github.com/ClickHouse/ClickHouse/pull/25693) ([Dmitry Novik](https://github.com/novikd)). +* Add `bin`/`unbin` functions. [#25609](https://github.com/ClickHouse/ClickHouse/pull/25609) ([zhaoyu](https://github.com/zxc111)). +* Support `Map` and `UInt128`, `Int128`, `UInt256`, `Int256` types in `mapAdd` and `mapSubtract` functions. [#25596](https://github.com/ClickHouse/ClickHouse/pull/25596) ([Ildus Kurbangaliev](https://github.com/ildus)). +* Support `DISTINCT ON (columns)` expression, close [#25404](https://github.com/ClickHouse/ClickHouse/issues/25404). [#25589](https://github.com/ClickHouse/ClickHouse/pull/25589) ([Zijie Lu](https://github.com/TszKitLo40)). +* Add an ability to reset a custom setting to default and remove it from the table's metadata. It allows rolling back the change without knowing the system/config's default. Closes [#14449](https://github.com/ClickHouse/ClickHouse/issues/14449). [#17769](https://github.com/ClickHouse/ClickHouse/pull/17769) ([xjewer](https://github.com/xjewer)). +* Render pipelines as graphs in Web UI if `EXPLAIN PIPELINE graph = 1` query is submitted. [#26067](https://github.com/ClickHouse/ClickHouse/pull/26067) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### Performance Improvements + +* Compile aggregate functions. Use option `compile_aggregate_expressions` to enable it. [#24789](https://github.com/ClickHouse/ClickHouse/pull/24789) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve latency of short queries that require reading from tables with many columns. [#26371](https://github.com/ClickHouse/ClickHouse/pull/26371) ([Anton Popov](https://github.com/CurtizJ)). + +#### Improvements + +* Use `Map` data type for system logs tables (`system.query_log`, `system.query_thread_log`, `system.processes`, `system.opentelemetry_span_log`). These tables will be auto-created with new data types. Virtual columns are created to support old queries. Closes [#18698](https://github.com/ClickHouse/ClickHouse/issues/18698). [#23934](https://github.com/ClickHouse/ClickHouse/pull/23934), [#25773](https://github.com/ClickHouse/ClickHouse/pull/25773) ([hexiaoting](https://github.com/hexiaoting), [sundy-li](https://github.com/sundy-li), [Maksim Kita](https://github.com/kitaisreal)). +* For a dictionary with a complex key containing only one attribute, allow not wrapping the key expression in tuple for functions `dictGet`, `dictHas`. [#26130](https://github.com/ClickHouse/ClickHouse/pull/26130) ([Maksim Kita](https://github.com/kitaisreal)). +* Implement function `bin`/`hex` from `AggregateFunction` states. [#26094](https://github.com/ClickHouse/ClickHouse/pull/26094) ([zhaoyu](https://github.com/zxc111)). +* Support arguments of `UUID` type for `empty` and `notEmpty` functions. `UUID` is empty if it is all zeros (nil UUID). Closes [#3446](https://github.com/ClickHouse/ClickHouse/issues/3446). [#25974](https://github.com/ClickHouse/ClickHouse/pull/25974) ([zhaoyu](https://github.com/zxc111)). +* Add support for `SET SQL_SELECT_LIMIT` in MySQL protocol. Closes [#17115](https://github.com/ClickHouse/ClickHouse/issues/17115). [#25972](https://github.com/ClickHouse/ClickHouse/pull/25972) ([Kseniia Sumarokova](https://github.com/kssenii)). +* More instrumentation for network interaction: add counters for recv/send bytes; add gauges for recvs/sends. Added missing documentation. Close [#5897](https://github.com/ClickHouse/ClickHouse/issues/5897). [#25962](https://github.com/ClickHouse/ClickHouse/pull/25962) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add setting `optimize_move_to_prewhere_if_final`. If query has `FINAL`, the optimization `move_to_prewhere` will be enabled only if both `optimize_move_to_prewhere` and `optimize_move_to_prewhere_if_final` are enabled. Closes [#8684](https://github.com/ClickHouse/ClickHouse/issues/8684). [#25940](https://github.com/ClickHouse/ClickHouse/pull/25940) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Allow complex quoted identifiers of JOINed tables. Close [#17861](https://github.com/ClickHouse/ClickHouse/issues/17861). [#25924](https://github.com/ClickHouse/ClickHouse/pull/25924) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add support for Unicode (e.g. Chinese, Cyrillic) components in `Nested` data types. Close [#25594](https://github.com/ClickHouse/ClickHouse/issues/25594). [#25923](https://github.com/ClickHouse/ClickHouse/pull/25923) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow `quantiles*` functions to work with `aggregate_functions_null_for_empty`. Close [#25892](https://github.com/ClickHouse/ClickHouse/issues/25892). [#25919](https://github.com/ClickHouse/ClickHouse/pull/25919) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow parameters for parametric aggregate functions to be arbitrary constant expressions (e.g., `1 + 2`), not just literals. It also allows using the query parameters (in parameterized queries like `{param:UInt8}`) inside parametric aggregate functions. Closes [#11607](https://github.com/ClickHouse/ClickHouse/issues/11607). [#25910](https://github.com/ClickHouse/ClickHouse/pull/25910) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Correctly throw the exception on the attempt to parse an invalid `Date`. Closes [#6481](https://github.com/ClickHouse/ClickHouse/issues/6481). [#25909](https://github.com/ClickHouse/ClickHouse/pull/25909) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support for multiple includes in configuration. It is possible to include users configuration, remote server configuration from multiple sources. Simply place `` element with `from_zk`, `from_env` or `incl` attribute, and it will be replaced with the substitution. [#24404](https://github.com/ClickHouse/ClickHouse/pull/24404) ([nvartolomei](https://github.com/nvartolomei)). +* Support for queries with a column named `"null"` (it must be specified in back-ticks or double quotes) and `ON CLUSTER`. Closes [#24035](https://github.com/ClickHouse/ClickHouse/issues/24035). [#25907](https://github.com/ClickHouse/ClickHouse/pull/25907) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support `LowCardinality`, `Decimal`, and `UUID` for `JSONExtract`. Closes [#24606](https://github.com/ClickHouse/ClickHouse/issues/24606). [#25900](https://github.com/ClickHouse/ClickHouse/pull/25900) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Convert history file from `readline` format to `replxx` format. [#25888](https://github.com/ClickHouse/ClickHouse/pull/25888) ([Azat Khuzhin](https://github.com/azat)). +* Fix an issue which can lead to intersecting parts after `DROP PART` or background deletion of an empty part. [#25884](https://github.com/ClickHouse/ClickHouse/pull/25884) ([alesapin](https://github.com/alesapin)). +* Better handling of lost parts for `ReplicatedMergeTree` tables. Fixes rare inconsistencies in `ReplicationQueue`. Fixes [#10368](https://github.com/ClickHouse/ClickHouse/issues/10368). [#25820](https://github.com/ClickHouse/ClickHouse/pull/25820) ([alesapin](https://github.com/alesapin)). +* Allow starting clickhouse-client with unreadable working directory. [#25817](https://github.com/ClickHouse/ClickHouse/pull/25817) ([ianton-ru](https://github.com/ianton-ru)). +* Fix "No available columns" error for `Merge` storage. [#25801](https://github.com/ClickHouse/ClickHouse/pull/25801) ([Azat Khuzhin](https://github.com/azat)). +* MySQL Engine now supports the exchange of column comments between MySQL and ClickHouse. [#25795](https://github.com/ClickHouse/ClickHouse/pull/25795) ([Storozhuk Kostiantyn](https://github.com/sand6255)). +* Fix inconsistent behaviour of `GROUP BY` constant on empty set. Closes [#6842](https://github.com/ClickHouse/ClickHouse/issues/6842). [#25786](https://github.com/ClickHouse/ClickHouse/pull/25786) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Cancel already running merges in partition on `DROP PARTITION` and `TRUNCATE` for `ReplicatedMergeTree`. Resolves [#17151](https://github.com/ClickHouse/ClickHouse/issues/17151). [#25684](https://github.com/ClickHouse/ClickHouse/pull/25684) ([tavplubix](https://github.com/tavplubix)). +* Support ENUM` data type for MaterializeMySQL. [#25676](https://github.com/ClickHouse/ClickHouse/pull/25676) ([Storozhuk Kostiantyn](https://github.com/sand6255)). +* Support materialized and aliased columns in JOIN, close [#13274](https://github.com/ClickHouse/ClickHouse/issues/13274). [#25634](https://github.com/ClickHouse/ClickHouse/pull/25634) ([Vladimir C](https://github.com/vdimir)). +* Fix possible logical race condition between `ALTER TABLE ... DETACH` and background merges. [#25605](https://github.com/ClickHouse/ClickHouse/pull/25605) ([Azat Khuzhin](https://github.com/azat)). +* Make `NetworkReceiveElapsedMicroseconds` metric to correctly include the time spent waiting for data from the client to `INSERT`. Close [#9958](https://github.com/ClickHouse/ClickHouse/issues/9958). [#25602](https://github.com/ClickHouse/ClickHouse/pull/25602) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support `TRUNCATE TABLE` for S3 and HDFS. Close [#25530](https://github.com/ClickHouse/ClickHouse/issues/25530). [#25550](https://github.com/ClickHouse/ClickHouse/pull/25550) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support for dynamic reloading of config to change number of threads in pool for background jobs execution (merges, mutations, fetches). [#25548](https://github.com/ClickHouse/ClickHouse/pull/25548) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Allow extracting of non-string element as string using `JSONExtract`. This is for [#25414](https://github.com/ClickHouse/ClickHouse/issues/25414). [#25452](https://github.com/ClickHouse/ClickHouse/pull/25452) ([Amos Bird](https://github.com/amosbird)). +* Support regular expression in `Database` argument for `StorageMerge`. Close [#776](https://github.com/ClickHouse/ClickHouse/issues/776). [#25064](https://github.com/ClickHouse/ClickHouse/pull/25064) ([flynn](https://github.com/ucasfl)). +* Web UI: if the value looks like a URL, automatically generate a link. [#25965](https://github.com/ClickHouse/ClickHouse/pull/25965) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make `sudo service clickhouse-server start` to work on systems with `systemd` like Centos 8. Close [#14298](https://github.com/ClickHouse/ClickHouse/issues/14298). Close [#17799](https://github.com/ClickHouse/ClickHouse/issues/17799). [#25921](https://github.com/ClickHouse/ClickHouse/pull/25921) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### Bug Fixes + +* Fix incorrect `SET ROLE` in some cases. [#26707](https://github.com/ClickHouse/ClickHouse/pull/26707) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix potential `nullptr` dereference in window functions. Fix [#25276](https://github.com/ClickHouse/ClickHouse/issues/25276). [#26668](https://github.com/ClickHouse/ClickHouse/pull/26668) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fix incorrect function names of `groupBitmapAnd/Or/Xor`. Fix [#26557](https://github.com/ClickHouse/ClickHouse/pull/26557) ([Amos Bird](https://github.com/amosbird)). +* Fix crash in RabbitMQ shutdown in case RabbitMQ setup was not started. Closes [#26504](https://github.com/ClickHouse/ClickHouse/issues/26504). [#26529](https://github.com/ClickHouse/ClickHouse/pull/26529) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix issues with `CREATE DICTIONARY` query if dictionary name or database name was quoted. Closes [#26491](https://github.com/ClickHouse/ClickHouse/issues/26491). [#26508](https://github.com/ClickHouse/ClickHouse/pull/26508) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix broken name resolution after rewriting column aliases. Fix [#26432](https://github.com/ClickHouse/ClickHouse/issues/26432). [#26475](https://github.com/ClickHouse/ClickHouse/pull/26475) ([Amos Bird](https://github.com/amosbird)). +* Fix infinite non-joined block stream in `partial_merge_join` close [#26325](https://github.com/ClickHouse/ClickHouse/issues/26325). [#26374](https://github.com/ClickHouse/ClickHouse/pull/26374) ([Vladimir C](https://github.com/vdimir)). +* Fix possible crash when login as dropped user. Fix [#26073](https://github.com/ClickHouse/ClickHouse/issues/26073). [#26363](https://github.com/ClickHouse/ClickHouse/pull/26363) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix `optimize_distributed_group_by_sharding_key` for multiple columns (leads to incorrect result w/ `optimize_skip_unused_shards=1`/`allow_nondeterministic_optimize_skip_unused_shards=1` and multiple columns in sharding key expression). [#26353](https://github.com/ClickHouse/ClickHouse/pull/26353) ([Azat Khuzhin](https://github.com/azat)). +* `CAST` from `Date` to `DateTime` (or `DateTime64`) was not using the timezone of the `DateTime` type. It can also affect the comparison between `Date` and `DateTime`. Inference of the common type for `Date` and `DateTime` also was not using the corresponding timezone. It affected the results of function `if` and array construction. Closes [#24128](https://github.com/ClickHouse/ClickHouse/issues/24128). [#24129](https://github.com/ClickHouse/ClickHouse/pull/24129) ([Maksim Kita](https://github.com/kitaisreal)). +* Fixed rare bug in lost replica recovery that may cause replicas to diverge. [#26321](https://github.com/ClickHouse/ClickHouse/pull/26321) ([tavplubix](https://github.com/tavplubix)). +* Fix zstd decompression in case there are escape sequences at the end of internal buffer. Closes [#26013](https://github.com/ClickHouse/ClickHouse/issues/26013). [#26314](https://github.com/ClickHouse/ClickHouse/pull/26314) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix logical error on join with totals, close [#26017](https://github.com/ClickHouse/ClickHouse/issues/26017). [#26250](https://github.com/ClickHouse/ClickHouse/pull/26250) ([Vladimir C](https://github.com/vdimir)). +* Remove excessive newline in `thread_name` column in `system.stack_trace` table. Fix [#24124](https://github.com/ClickHouse/ClickHouse/issues/24124). [#26210](https://github.com/ClickHouse/ClickHouse/pull/26210) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `joinGet` with `LowCarinality` columns, close [#25993](https://github.com/ClickHouse/ClickHouse/issues/25993). [#26118](https://github.com/ClickHouse/ClickHouse/pull/26118) ([Vladimir C](https://github.com/vdimir)). +* Fix possible crash in `pointInPolygon` if the setting `validate_polygons` is turned off. [#26113](https://github.com/ClickHouse/ClickHouse/pull/26113) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix throwing exception when iterate over non-existing remote directory. [#26087](https://github.com/ClickHouse/ClickHouse/pull/26087) ([ianton-ru](https://github.com/ianton-ru)). +* Fix rare server crash because of `abort` in ZooKeeper client. Fixes [#25813](https://github.com/ClickHouse/ClickHouse/issues/25813). [#26079](https://github.com/ClickHouse/ClickHouse/pull/26079) ([alesapin](https://github.com/alesapin)). +* Fix wrong thread count estimation for right subquery join in some cases. Close [#24075](https://github.com/ClickHouse/ClickHouse/issues/24075). [#26052](https://github.com/ClickHouse/ClickHouse/pull/26052) ([Vladimir C](https://github.com/vdimir)). +* Fixed incorrect `sequence_id` in MySQL protocol packets that ClickHouse sends on exception during query execution. It might cause MySQL client to reset connection to ClickHouse server. Fixes [#21184](https://github.com/ClickHouse/ClickHouse/issues/21184). [#26051](https://github.com/ClickHouse/ClickHouse/pull/26051) ([tavplubix](https://github.com/tavplubix)). +* Fix possible mismatched header when using normal projection with `PREWHERE`. Fix [#26020](https://github.com/ClickHouse/ClickHouse/issues/26020). [#26038](https://github.com/ClickHouse/ClickHouse/pull/26038) ([Amos Bird](https://github.com/amosbird)). +* Fix formatting of type `Map` with integer keys to `JSON`. [#25982](https://github.com/ClickHouse/ClickHouse/pull/25982) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible deadlock during query profiler stack unwinding. Fix [#25968](https://github.com/ClickHouse/ClickHouse/issues/25968). [#25970](https://github.com/ClickHouse/ClickHouse/pull/25970) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix crash on call `dictGet()` with bad arguments. [#25913](https://github.com/ClickHouse/ClickHouse/pull/25913) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed `scram-sha-256` authentication for PostgreSQL engines. Closes [#24516](https://github.com/ClickHouse/ClickHouse/issues/24516). [#25906](https://github.com/ClickHouse/ClickHouse/pull/25906) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix extremely long backoff for background tasks when the background pool is full. Fixes [#25836](https://github.com/ClickHouse/ClickHouse/issues/25836). [#25893](https://github.com/ClickHouse/ClickHouse/pull/25893) ([alesapin](https://github.com/alesapin)). +* Fix ARM exception handling with non default page size. Fixes [#25512](https://github.com/ClickHouse/ClickHouse/issues/25512), [#25044](https://github.com/ClickHouse/ClickHouse/issues/25044), [#24901](https://github.com/ClickHouse/ClickHouse/issues/24901), [#23183](https://github.com/ClickHouse/ClickHouse/issues/23183), [#20221](https://github.com/ClickHouse/ClickHouse/issues/20221), [#19703](https://github.com/ClickHouse/ClickHouse/issues/19703), [#19028](https://github.com/ClickHouse/ClickHouse/issues/19028), [#18391](https://github.com/ClickHouse/ClickHouse/issues/18391), [#18121](https://github.com/ClickHouse/ClickHouse/issues/18121), [#17994](https://github.com/ClickHouse/ClickHouse/issues/17994), [#12483](https://github.com/ClickHouse/ClickHouse/issues/12483). [#25854](https://github.com/ClickHouse/ClickHouse/pull/25854) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix sharding_key from column w/o function for `remote()` (before `select * from remote('127.1', system.one, dummy)` leads to `Unknown column: dummy, there are only columns .` error). [#25824](https://github.com/ClickHouse/ClickHouse/pull/25824) ([Azat Khuzhin](https://github.com/azat)). +* Fixed `Not found column ...` and `Missing column ...` errors when selecting from `MaterializeMySQL`. Fixes [#23708](https://github.com/ClickHouse/ClickHouse/issues/23708), [#24830](https://github.com/ClickHouse/ClickHouse/issues/24830), [#25794](https://github.com/ClickHouse/ClickHouse/issues/25794). [#25822](https://github.com/ClickHouse/ClickHouse/pull/25822) ([tavplubix](https://github.com/tavplubix)). +* Fix `optimize_skip_unused_shards_rewrite_in` for non-UInt64 types (may select incorrect shards eventually or throw `Cannot infer type of an empty tuple` or `Function tuple requires at least one argument`). [#25798](https://github.com/ClickHouse/ClickHouse/pull/25798) ([Azat Khuzhin](https://github.com/azat)). +* Fix rare bug with `DROP PART` query for `ReplicatedMergeTree` tables which can lead to error message `Unexpected merged part intersecting drop range`. [#25783](https://github.com/ClickHouse/ClickHouse/pull/25783) ([alesapin](https://github.com/alesapin)). +* Fix bug in `TTL` with `GROUP BY` expression which refuses to execute `TTL` after first execution in part. [#25743](https://github.com/ClickHouse/ClickHouse/pull/25743) ([alesapin](https://github.com/alesapin)). +* Allow StorageMerge to access tables with aliases. Closes [#6051](https://github.com/ClickHouse/ClickHouse/issues/6051). [#25694](https://github.com/ClickHouse/ClickHouse/pull/25694) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix slow dict join in some cases, close [#24209](https://github.com/ClickHouse/ClickHouse/issues/24209). [#25618](https://github.com/ClickHouse/ClickHouse/pull/25618) ([Vladimir C](https://github.com/vdimir)). +* Fix `ALTER MODIFY COLUMN` of columns, which participates in TTL expressions. [#25554](https://github.com/ClickHouse/ClickHouse/pull/25554) ([Anton Popov](https://github.com/CurtizJ)). +* Fix assertion in `PREWHERE` with non-UInt8 type, close [#19589](https://github.com/ClickHouse/ClickHouse/issues/19589). [#25484](https://github.com/ClickHouse/ClickHouse/pull/25484) ([Vladimir C](https://github.com/vdimir)). +* Fix some fuzzed msan crash. Fixes [#22517](https://github.com/ClickHouse/ClickHouse/issues/22517). [#26428](https://github.com/ClickHouse/ClickHouse/pull/26428) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Update `chown` cmd check in `clickhouse-server` docker entrypoint. It fixes error 'cluster pod restart failed (or timeout)' on kubernetes. [#26545](https://github.com/ClickHouse/ClickHouse/pull/26545) ([Ky Li](https://github.com/Kylinrix)). + + +### ClickHouse release v21.7, 2021-07-09 + +#### Backward Incompatible Change + +* Improved performance of queries with explicitly defined large sets. Added compatibility setting `legacy_column_name_of_tuple_literal`. It makes sense to set it to `true`, while doing rolling update of cluster from version lower than 21.7 to any higher version. Otherwise distributed queries with explicitly defined sets at `IN` clause may fail during update. [#25371](https://github.com/ClickHouse/ClickHouse/pull/25371) ([Anton Popov](https://github.com/CurtizJ)). +* Forward/backward incompatible change of maximum buffer size in clickhouse-keeper (an experimental alternative to ZooKeeper). Better to do it now (before production), than later. [#25421](https://github.com/ClickHouse/ClickHouse/pull/25421) ([alesapin](https://github.com/alesapin)). + +#### New Feature + +* Support configuration in YAML format as alternative to XML. This closes [#3607](https://github.com/ClickHouse/ClickHouse/issues/3607). [#21858](https://github.com/ClickHouse/ClickHouse/pull/21858) ([BoloniniD](https://github.com/BoloniniD)). +* Provides a way to restore replicated table when the data is (possibly) present, but the ZooKeeper metadata is lost. Resolves [#13458](https://github.com/ClickHouse/ClickHouse/issues/13458). [#13652](https://github.com/ClickHouse/ClickHouse/pull/13652) ([Mike Kot](https://github.com/myrrc)). +* Support structs and maps in Arrow/Parquet/ORC and dictionaries in Arrow input/output formats. Present new setting `output_format_arrow_low_cardinality_as_dictionary`. [#24341](https://github.com/ClickHouse/ClickHouse/pull/24341) ([Kruglov Pavel](https://github.com/Avogar)). +* Added support for `Array` type in dictionaries. [#25119](https://github.com/ClickHouse/ClickHouse/pull/25119) ([Maksim Kita](https://github.com/kitaisreal)). +* Added function `bitPositionsToArray`. Closes [#23792](https://github.com/ClickHouse/ClickHouse/issues/23792). Author [Kevin Wan] (@MaxWk). [#25394](https://github.com/ClickHouse/ClickHouse/pull/25394) ([Maksim Kita](https://github.com/kitaisreal)). +* Added function `dateName` to return names like 'Friday' or 'April'. Author [Daniil Kondratyev] (@dankondr). [#25372](https://github.com/ClickHouse/ClickHouse/pull/25372) ([Maksim Kita](https://github.com/kitaisreal)). +* Add `toJSONString` function to serialize columns to their JSON representations. [#25164](https://github.com/ClickHouse/ClickHouse/pull/25164) ([Amos Bird](https://github.com/amosbird)). +* Now `query_log` has two new columns: `initial_query_start_time`, `initial_query_start_time_microsecond` that record the starting time of a distributed query if any. [#25022](https://github.com/ClickHouse/ClickHouse/pull/25022) ([Amos Bird](https://github.com/amosbird)). +* Add aggregate function `segmentLengthSum`. [#24250](https://github.com/ClickHouse/ClickHouse/pull/24250) ([flynn](https://github.com/ucasfl)). +* Add a new boolean setting `prefer_global_in_and_join` which defaults all IN/JOIN as GLOBAL IN/JOIN. [#23434](https://github.com/ClickHouse/ClickHouse/pull/23434) ([Amos Bird](https://github.com/amosbird)). +* Support `ALTER DELETE` queries for `Join` table engine. [#23260](https://github.com/ClickHouse/ClickHouse/pull/23260) ([foolchi](https://github.com/foolchi)). +* Add `quantileBFloat16` aggregate function as well as the corresponding `quantilesBFloat16` and `medianBFloat16`. It is very simple and fast quantile estimator with relative error not more than 0.390625%. This closes [#16641](https://github.com/ClickHouse/ClickHouse/issues/16641). [#23204](https://github.com/ClickHouse/ClickHouse/pull/23204) ([Ivan Novitskiy](https://github.com/RedClusive)). +* Implement `sequenceNextNode()` function useful for `flow analysis`. [#19766](https://github.com/ClickHouse/ClickHouse/pull/19766) ([achimbab](https://github.com/achimbab)). + +#### Experimental Feature + +* Add support for virtual filesystem over HDFS. [#11058](https://github.com/ClickHouse/ClickHouse/pull/11058) ([overshov](https://github.com/overshov)) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Now clickhouse-keeper (an experimental alternative to ZooKeeper) supports ZooKeeper-like `digest` ACLs. [#24448](https://github.com/ClickHouse/ClickHouse/pull/24448) ([alesapin](https://github.com/alesapin)). + +#### Performance Improvement + +* Added optimization that transforms some functions to reading of subcolumns to reduce amount of read data. E.g., statement `col IS NULL` is transformed to reading of subcolumn `col.null`. Optimization can be enabled by setting `optimize_functions_to_subcolumns` which is currently off by default. [#24406](https://github.com/ClickHouse/ClickHouse/pull/24406) ([Anton Popov](https://github.com/CurtizJ)). +* Rewrite more columns to possible alias expressions. This may enable better optimization, such as projections. [#24405](https://github.com/ClickHouse/ClickHouse/pull/24405) ([Amos Bird](https://github.com/amosbird)). +* Index of type `bloom_filter` can be used for expressions with `hasAny` function with constant arrays. This closes: [#24291](https://github.com/ClickHouse/ClickHouse/issues/24291). [#24900](https://github.com/ClickHouse/ClickHouse/pull/24900) ([Vasily Nemkov](https://github.com/Enmk)). +* Add exponential backoff to reschedule read attempt in case RabbitMQ queues are empty. (ClickHouse has support for importing data from RabbitMQ). Closes [#24340](https://github.com/ClickHouse/ClickHouse/issues/24340). [#24415](https://github.com/ClickHouse/ClickHouse/pull/24415) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Improvement + +* Allow to limit bandwidth for replication. Add two Replicated\*MergeTree settings: `max_replicated_fetches_network_bandwidth` and `max_replicated_sends_network_bandwidth` which allows to limit maximum speed of replicated fetches/sends for table. Add two server-wide settings (in `default` user profile): `max_replicated_fetches_network_bandwidth_for_server` and `max_replicated_sends_network_bandwidth_for_server` which limit maximum speed of replication for all tables. The settings are not followed perfectly accurately. Turned off by default. Fixes [#1821](https://github.com/ClickHouse/ClickHouse/issues/1821). [#24573](https://github.com/ClickHouse/ClickHouse/pull/24573) ([alesapin](https://github.com/alesapin)). +* Resource constraints and isolation for ODBC and Library bridges. Use separate `clickhouse-bridge` group and user for bridge processes. Set oom_score_adj so the bridges will be first subjects for OOM killer. Set set maximum RSS to 1 GiB. Closes [#23861](https://github.com/ClickHouse/ClickHouse/issues/23861). [#25280](https://github.com/ClickHouse/ClickHouse/pull/25280) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add standalone `clickhouse-keeper` symlink to the main `clickhouse` binary. Now it's possible to run coordination without the main clickhouse server. [#24059](https://github.com/ClickHouse/ClickHouse/pull/24059) ([alesapin](https://github.com/alesapin)). +* Use global settings for query to `VIEW`. Fixed the behavior when queries to `VIEW` use local settings, that leads to errors if setting on `CREATE VIEW` and `SELECT` were different. As for now, `VIEW` won't use these modified settings, but you can still pass additional settings in `SETTINGS` section of `CREATE VIEW` query. Close [#20551](https://github.com/ClickHouse/ClickHouse/issues/20551). [#24095](https://github.com/ClickHouse/ClickHouse/pull/24095) ([Vladimir](https://github.com/vdimir)). +* On server start, parts with incorrect partition ID would not be ever removed, but always detached. [#25070](https://github.com/ClickHouse/ClickHouse/issues/25070). [#25166](https://github.com/ClickHouse/ClickHouse/pull/25166) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Increase size of background schedule pool to 128 (`background_schedule_pool_size` setting). It allows avoiding replication queue hung on slow zookeeper connection. [#25072](https://github.com/ClickHouse/ClickHouse/pull/25072) ([alesapin](https://github.com/alesapin)). +* Add merge tree setting `max_parts_to_merge_at_once` which limits the number of parts that can be merged in the background at once. Doesn't affect `OPTIMIZE FINAL` query. Fixes [#1820](https://github.com/ClickHouse/ClickHouse/issues/1820). [#24496](https://github.com/ClickHouse/ClickHouse/pull/24496) ([alesapin](https://github.com/alesapin)). +* Allow `NOT IN` operator to be used in partition pruning. [#24894](https://github.com/ClickHouse/ClickHouse/pull/24894) ([Amos Bird](https://github.com/amosbird)). +* Recognize IPv4 addresses like `127.0.1.1` as local. This is controversial and closes [#23504](https://github.com/ClickHouse/ClickHouse/issues/23504). Michael Filimonov will test this feature. [#24316](https://github.com/ClickHouse/ClickHouse/pull/24316) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* ClickHouse database created with MaterializeMySQL (it is an experimental feature) now contains all column comments from the MySQL database that materialized. [#25199](https://github.com/ClickHouse/ClickHouse/pull/25199) ([Storozhuk Kostiantyn](https://github.com/sand6255)). +* Add settings (`connection_auto_close`/`connection_max_tries`/`connection_pool_size`) for MySQL storage engine. [#24146](https://github.com/ClickHouse/ClickHouse/pull/24146) ([Azat Khuzhin](https://github.com/azat)). +* Improve startup time of Distributed engine. [#25663](https://github.com/ClickHouse/ClickHouse/pull/25663) ([Azat Khuzhin](https://github.com/azat)). +* Improvement for Distributed tables. Drop replicas from dirname for internal_replication=true (allows INSERT into Distributed with cluster from any number of replicas, before only 15 replicas was supported, everything more will fail with ENAMETOOLONG while creating directory for async blocks). [#25513](https://github.com/ClickHouse/ClickHouse/pull/25513) ([Azat Khuzhin](https://github.com/azat)). +* Added support `Interval` type for `LowCardinality`. It is needed for intermediate values of some expressions. Closes [#21730](https://github.com/ClickHouse/ClickHouse/issues/21730). [#25410](https://github.com/ClickHouse/ClickHouse/pull/25410) ([Vladimir](https://github.com/vdimir)). +* Add `==` operator on time conditions for `sequenceMatch` and `sequenceCount` functions. For eg: sequenceMatch('(?1)(?t==1)(?2)')(time, data = 1, data = 2). [#25299](https://github.com/ClickHouse/ClickHouse/pull/25299) ([Christophe Kalenzaga](https://github.com/mga-chka)). +* Add settings `http_max_fields`, `http_max_field_name_size`, `http_max_field_value_size`. [#25296](https://github.com/ClickHouse/ClickHouse/pull/25296) ([Ivan](https://github.com/abyss7)). +* Add support for function `if` with `Decimal` and `Int` types on its branches. This closes [#20549](https://github.com/ClickHouse/ClickHouse/issues/20549). This closes [#10142](https://github.com/ClickHouse/ClickHouse/issues/10142). [#25283](https://github.com/ClickHouse/ClickHouse/pull/25283) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Update prompt in `clickhouse-client` and display a message when reconnecting. This closes [#10577](https://github.com/ClickHouse/ClickHouse/issues/10577). [#25281](https://github.com/ClickHouse/ClickHouse/pull/25281) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Correct memory tracking in aggregate function `topK`. This closes [#25259](https://github.com/ClickHouse/ClickHouse/issues/25259). [#25260](https://github.com/ClickHouse/ClickHouse/pull/25260) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `topLevelDomain` for IDN hosts (i.e. `example.рф`), before it returns empty string for such hosts. [#25103](https://github.com/ClickHouse/ClickHouse/pull/25103) ([Azat Khuzhin](https://github.com/azat)). +* Detect Linux kernel version at runtime (for worked nested epoll, that is required for `async_socket_for_remote`/`use_hedged_requests`, otherwise remote queries may stuck). [#25067](https://github.com/ClickHouse/ClickHouse/pull/25067) ([Azat Khuzhin](https://github.com/azat)). +* For distributed query, when `optimize_skip_unused_shards=1`, allow to skip shard with condition like `(sharding key) IN (one-element-tuple)`. (Tuples with many elements were supported. Tuple with single element did not work because it is parsed as literal). [#24930](https://github.com/ClickHouse/ClickHouse/pull/24930) ([Amos Bird](https://github.com/amosbird)). +* Improved log messages of S3 errors, no more double whitespaces in case of empty keys and buckets. [#24897](https://github.com/ClickHouse/ClickHouse/pull/24897) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Some queries require multi-pass semantic analysis. Try reusing built sets for `IN` in this case. [#24874](https://github.com/ClickHouse/ClickHouse/pull/24874) ([Amos Bird](https://github.com/amosbird)). +* Respect `max_distributed_connections` for `insert_distributed_sync` (otherwise for huge clusters and sync insert it may run out of `max_thread_pool_size`). [#24754](https://github.com/ClickHouse/ClickHouse/pull/24754) ([Azat Khuzhin](https://github.com/azat)). +* Avoid hiding errors like `Limit for rows or bytes to read exceeded` for scalar subqueries. [#24545](https://github.com/ClickHouse/ClickHouse/pull/24545) ([nvartolomei](https://github.com/nvartolomei)). +* Make String-to-Int parser stricter so that `toInt64('+')` will throw. [#24475](https://github.com/ClickHouse/ClickHouse/pull/24475) ([Amos Bird](https://github.com/amosbird)). +* If `SSD_CACHE` is created with DDL query, it can be created only inside `user_files` directory. [#24466](https://github.com/ClickHouse/ClickHouse/pull/24466) ([Maksim Kita](https://github.com/kitaisreal)). +* PostgreSQL support for specifying non default schema for insert queries. Closes [#24149](https://github.com/ClickHouse/ClickHouse/issues/24149). [#24413](https://github.com/ClickHouse/ClickHouse/pull/24413) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix IPv6 addresses resolving (i.e. fixes `select * from remote('[::1]', system.one)`). [#24319](https://github.com/ClickHouse/ClickHouse/pull/24319) ([Azat Khuzhin](https://github.com/azat)). +* Fix trailing whitespaces in FROM clause with subqueries in multiline mode, and also changes the output of the queries slightly in a more human friendly way. [#24151](https://github.com/ClickHouse/ClickHouse/pull/24151) ([Azat Khuzhin](https://github.com/azat)). +* Improvement for Distributed tables. Add ability to split distributed batch on failures (i.e. due to memory limits, corruptions), under `distributed_directory_monitor_split_batch_on_failure` (OFF by default). [#23864](https://github.com/ClickHouse/ClickHouse/pull/23864) ([Azat Khuzhin](https://github.com/azat)). +* Handle column name clashes for `Join` table engine. Closes [#20309](https://github.com/ClickHouse/ClickHouse/issues/20309). [#23769](https://github.com/ClickHouse/ClickHouse/pull/23769) ([Vladimir](https://github.com/vdimir)). +* Display progress for `File` table engine in `clickhouse-local` and on INSERT query in `clickhouse-client` when data is passed to stdin. Closes [#18209](https://github.com/ClickHouse/ClickHouse/issues/18209). [#23656](https://github.com/ClickHouse/ClickHouse/pull/23656) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Bugfixes and improvements of `clickhouse-copier`. Allow to copy tables with different (but compatible schemas). Closes [#9159](https://github.com/ClickHouse/ClickHouse/issues/9159). Added test to copy ReplacingMergeTree. Closes [#22711](https://github.com/ClickHouse/ClickHouse/issues/22711). Support TTL on columns and Data Skipping Indices. It simply removes it to create internal Distributed table (underlying table will have TTL and skipping indices). Closes [#19384](https://github.com/ClickHouse/ClickHouse/issues/19384). Allow to copy MATERIALIZED and ALIAS columns. There are some cases in which it could be helpful (e.g. if this column is in PRIMARY KEY). Now it could be allowed by setting `allow_to_copy_alias_and_materialized_columns` property to true in task configuration. Closes [#9177](https://github.com/ClickHouse/ClickHouse/issues/9177). Closes [#11007] (https://github.com/ClickHouse/ClickHouse/issues/11007). Closes [#9514](https://github.com/ClickHouse/ClickHouse/issues/9514). Added a property `allow_to_drop_target_partitions` in task configuration to drop partition in original table before moving helping tables. Closes [#20957](https://github.com/ClickHouse/ClickHouse/issues/20957). Get rid of `OPTIMIZE DEDUPLICATE` query. This hack was needed, because `ALTER TABLE MOVE PARTITION` was retried many times and plain MergeTree tables don't have deduplication. Closes [#17966](https://github.com/ClickHouse/ClickHouse/issues/17966). Write progress to ZooKeeper node on path `task_path + /status` in JSON format. Closes [#20955](https://github.com/ClickHouse/ClickHouse/issues/20955). Support for ReplicatedTables without arguments. Closes [#24834](https://github.com/ClickHouse/ClickHouse/issues/24834) .[#23518](https://github.com/ClickHouse/ClickHouse/pull/23518) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added sleep with backoff between read retries from S3. [#23461](https://github.com/ClickHouse/ClickHouse/pull/23461) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Respect `insert_allow_materialized_columns` (allows materialized columns) for INSERT into `Distributed` table. [#23349](https://github.com/ClickHouse/ClickHouse/pull/23349) ([Azat Khuzhin](https://github.com/azat)). +* Add ability to push down LIMIT for distributed queries. [#23027](https://github.com/ClickHouse/ClickHouse/pull/23027) ([Azat Khuzhin](https://github.com/azat)). +* Fix zero-copy replication with several S3 volumes (Fixes [#22679](https://github.com/ClickHouse/ClickHouse/issues/22679)). [#22864](https://github.com/ClickHouse/ClickHouse/pull/22864) ([ianton-ru](https://github.com/ianton-ru)). +* Resolve the actual port number bound when a user requests any available port from the operating system to show it in the log message. [#25569](https://github.com/ClickHouse/ClickHouse/pull/25569) ([bnaecker](https://github.com/bnaecker)). +* Fixed case, when sometimes conversion of postgres arrays resulted in String data type, not n-dimensional array, because `attndims` works incorrectly in some cases. Closes [#24804](https://github.com/ClickHouse/ClickHouse/issues/24804). [#25538](https://github.com/ClickHouse/ClickHouse/pull/25538) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix convertion of DateTime with timezone for MySQL, PostgreSQL, ODBC. Closes [#5057](https://github.com/ClickHouse/ClickHouse/issues/5057). [#25528](https://github.com/ClickHouse/ClickHouse/pull/25528) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Distinguish KILL MUTATION for different tables (fixes unexpected `Cancelled mutating parts` error). [#25025](https://github.com/ClickHouse/ClickHouse/pull/25025) ([Azat Khuzhin](https://github.com/azat)). +* Allow to declare S3 disk at root of bucket (S3 virtual filesystem is an experimental feature under development). [#24898](https://github.com/ClickHouse/ClickHouse/pull/24898) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Enable reading of subcolumns (e.g. components of Tuples) for distributed tables. [#24472](https://github.com/ClickHouse/ClickHouse/pull/24472) ([Anton Popov](https://github.com/CurtizJ)). +* A feature for MySQL compatibility protocol: make `user` function to return correct output. Closes [#25697](https://github.com/ClickHouse/ClickHouse/pull/25697). [#25697](https://github.com/ClickHouse/ClickHouse/pull/25697) ([sundyli](https://github.com/sundy-li)). + +#### Bug Fix + +* Improvement for backward compatibility. Use old modulo function version when used in partition key. Closes [#23508](https://github.com/ClickHouse/ClickHouse/issues/23508). [#24157](https://github.com/ClickHouse/ClickHouse/pull/24157) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix extremely rare bug on low-memory servers which can lead to the inability to perform merges without restart. Possibly fixes [#24603](https://github.com/ClickHouse/ClickHouse/issues/24603). [#24872](https://github.com/ClickHouse/ClickHouse/pull/24872) ([alesapin](https://github.com/alesapin)). +* Fix extremely rare error `Tagging already tagged part` in replication queue during concurrent `alter move/replace partition`. Possibly fixes [#22142](https://github.com/ClickHouse/ClickHouse/issues/22142). [#24961](https://github.com/ClickHouse/ClickHouse/pull/24961) ([alesapin](https://github.com/alesapin)). +* Fix potential crash when calculating aggregate function states by aggregation of aggregate function states of other aggregate functions (not a practical use case). See [#24523](https://github.com/ClickHouse/ClickHouse/issues/24523). [#25015](https://github.com/ClickHouse/ClickHouse/pull/25015) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the behavior when query `SYSTEM RESTART REPLICA` or `SYSTEM SYNC REPLICA` does not finish. This was detected on server with extremely low amount of RAM. [#24457](https://github.com/ClickHouse/ClickHouse/pull/24457) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix bug which can lead to ZooKeeper client hung inside clickhouse-server. [#24721](https://github.com/ClickHouse/ClickHouse/pull/24721) ([alesapin](https://github.com/alesapin)). +* If ZooKeeper connection was lost and replica was cloned after restoring the connection, its replication queue might contain outdated entries. Fixed failed assertion when replication queue contains intersecting virtual parts. It may rarely happen if some data part was lost. Print error in log instead of terminating. [#24777](https://github.com/ClickHouse/ClickHouse/pull/24777) ([tavplubix](https://github.com/tavplubix)). +* Fix lost `WHERE` condition in expression-push-down optimization of query plan (setting `query_plan_filter_push_down = 1` by default). Fixes [#25368](https://github.com/ClickHouse/ClickHouse/issues/25368). [#25370](https://github.com/ClickHouse/ClickHouse/pull/25370) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug which can lead to intersecting parts after merges with TTL: `Part all_40_40_0 is covered by all_40_40_1 but should be merged into all_40_41_1. This shouldn't happen often.`. [#25549](https://github.com/ClickHouse/ClickHouse/pull/25549) ([alesapin](https://github.com/alesapin)). +* On ZooKeeper connection loss `ReplicatedMergeTree` table might wait for background operations to complete before trying to reconnect. It's fixed, now background operations are stopped forcefully. [#25306](https://github.com/ClickHouse/ClickHouse/pull/25306) ([tavplubix](https://github.com/tavplubix)). +* Fix error `Key expression contains comparison between inconvertible types` for queries with `ARRAY JOIN` in case if array is used in primary key. Fixes [#8247](https://github.com/ClickHouse/ClickHouse/issues/8247). [#25546](https://github.com/ClickHouse/ClickHouse/pull/25546) ([Anton Popov](https://github.com/CurtizJ)). +* Fix wrong totals for query `WITH TOTALS` and `WITH FILL`. Fixes [#20872](https://github.com/ClickHouse/ClickHouse/issues/20872). [#25539](https://github.com/ClickHouse/ClickHouse/pull/25539) ([Anton Popov](https://github.com/CurtizJ)). +* Fix data race when querying `system.clusters` while reloading the cluster configuration at the same time. [#25737](https://github.com/ClickHouse/ClickHouse/pull/25737) ([Amos Bird](https://github.com/amosbird)). +* Fixed `No such file or directory` error on moving `Distributed` table between databases. Fixes [#24971](https://github.com/ClickHouse/ClickHouse/issues/24971). [#25667](https://github.com/ClickHouse/ClickHouse/pull/25667) ([tavplubix](https://github.com/tavplubix)). +* `REPLACE PARTITION` might be ignored in rare cases if the source partition was empty. It's fixed. Fixes [#24869](https://github.com/ClickHouse/ClickHouse/issues/24869). [#25665](https://github.com/ClickHouse/ClickHouse/pull/25665) ([tavplubix](https://github.com/tavplubix)). +* Fixed a bug in `Replicated` database engine that might rarely cause some replica to skip enqueued DDL query. [#24805](https://github.com/ClickHouse/ClickHouse/pull/24805) ([tavplubix](https://github.com/tavplubix)). +* Fix null pointer dereference in `EXPLAIN AST` without query. [#25631](https://github.com/ClickHouse/ClickHouse/pull/25631) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix waiting of automatic dropping of empty parts. It could lead to full filling of background pool and stuck of replication. [#23315](https://github.com/ClickHouse/ClickHouse/pull/23315) ([Anton Popov](https://github.com/CurtizJ)). +* Fix restore of a table stored in S3 virtual filesystem (it is an experimental feature not ready for production). [#25601](https://github.com/ClickHouse/ClickHouse/pull/25601) ([ianton-ru](https://github.com/ianton-ru)). +* Fix nullptr dereference in `Arrow` format when using `Decimal256`. Add `Decimal256` support for `Arrow` format. [#25531](https://github.com/ClickHouse/ClickHouse/pull/25531) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix excessive underscore before the names of the preprocessed configuration files. [#25431](https://github.com/ClickHouse/ClickHouse/pull/25431) ([Vitaly Baranov](https://github.com/vitlibar)). +* A fix for `clickhouse-copier` tool: Fix segfault when sharding_key is absent in task config for copier. [#25419](https://github.com/ClickHouse/ClickHouse/pull/25419) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix `REPLACE` column transformer when used in DDL by correctly quoting the formated query. This fixes [#23925](https://github.com/ClickHouse/ClickHouse/issues/23925). [#25391](https://github.com/ClickHouse/ClickHouse/pull/25391) ([Amos Bird](https://github.com/amosbird)). +* Fix the possibility of non-deterministic behaviour of the `quantileDeterministic` function and similar. This closes [#20480](https://github.com/ClickHouse/ClickHouse/issues/20480). [#25313](https://github.com/ClickHouse/ClickHouse/pull/25313) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support `SimpleAggregateFunction(LowCardinality)` for `SummingMergeTree`. Fixes [#25134](https://github.com/ClickHouse/ClickHouse/issues/25134). [#25300](https://github.com/ClickHouse/ClickHouse/pull/25300) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix logical error with exception message "Cannot sum Array/Tuple in min/maxMap". [#25298](https://github.com/ClickHouse/ClickHouse/pull/25298) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix error `Bad cast from type DB::ColumnLowCardinality to DB::ColumnVector` for queries where `LowCardinality` argument was used for IN (this bug appeared in 21.6). Fixes [#25187](https://github.com/ClickHouse/ClickHouse/issues/25187). [#25290](https://github.com/ClickHouse/ClickHouse/pull/25290) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix incorrect behaviour of `joinGetOrNull` with not-nullable columns. This fixes [#24261](https://github.com/ClickHouse/ClickHouse/issues/24261). [#25288](https://github.com/ClickHouse/ClickHouse/pull/25288) ([Amos Bird](https://github.com/amosbird)). +* Fix incorrect behaviour and UBSan report in big integers. In previous versions `CAST(1e19 AS UInt128)` returned zero. [#25279](https://github.com/ClickHouse/ClickHouse/pull/25279) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed an error which occurred while inserting a subset of columns using CSVWithNames format. Fixes [#25129](https://github.com/ClickHouse/ClickHouse/issues/25129). [#25169](https://github.com/ClickHouse/ClickHouse/pull/25169) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Do not use table's projection for `SELECT` with `FINAL`. It is not supported yet. [#25163](https://github.com/ClickHouse/ClickHouse/pull/25163) ([Amos Bird](https://github.com/amosbird)). +* Fix possible parts loss after updating up to 21.5 in case table used `UUID` in partition key. (It is not recommended to use `UUID` in partition key). Fixes [#25070](https://github.com/ClickHouse/ClickHouse/issues/25070). [#25127](https://github.com/ClickHouse/ClickHouse/pull/25127) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix crash in query with cross join and `joined_subquery_requires_alias = 0`. Fixes [#24011](https://github.com/ClickHouse/ClickHouse/issues/24011). [#25082](https://github.com/ClickHouse/ClickHouse/pull/25082) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug with constant maps in mapContains function that lead to error `empty column was returned by function mapContains`. Closes [#25077](https://github.com/ClickHouse/ClickHouse/issues/25077). [#25080](https://github.com/ClickHouse/ClickHouse/pull/25080) ([Kruglov Pavel](https://github.com/Avogar)). +* Remove possibility to create tables with columns referencing themselves like `a UInt32 ALIAS a + 1` or `b UInt32 MATERIALIZED b`. Fixes [#24910](https://github.com/ClickHouse/ClickHouse/issues/24910), [#24292](https://github.com/ClickHouse/ClickHouse/issues/24292). [#25059](https://github.com/ClickHouse/ClickHouse/pull/25059) ([alesapin](https://github.com/alesapin)). +* Fix wrong result when using aggregate projection with *not empty* `GROUP BY` key to execute query with `GROUP BY` by *empty* key. [#25055](https://github.com/ClickHouse/ClickHouse/pull/25055) ([Amos Bird](https://github.com/amosbird)). +* Fix serialization of splitted nested messages in Protobuf format. This PR fixes [#24647](https://github.com/ClickHouse/ClickHouse/issues/24647). [#25000](https://github.com/ClickHouse/ClickHouse/pull/25000) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix limit/offset settings for distributed queries (ignore on the remote nodes). [#24940](https://github.com/ClickHouse/ClickHouse/pull/24940) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible heap-buffer-overflow in `Arrow` format. [#24922](https://github.com/ClickHouse/ClickHouse/pull/24922) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixed possible error 'Cannot read from istream at offset 0' when reading a file from DiskS3 (S3 virtual filesystem is an experimental feature under development that should not be used in production). [#24885](https://github.com/ClickHouse/ClickHouse/pull/24885) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fix "Missing columns" exception when joining Distributed Materialized View. [#24870](https://github.com/ClickHouse/ClickHouse/pull/24870) ([Azat Khuzhin](https://github.com/azat)). +* Allow `NULL` values in postgresql compatibility protocol. Closes [#22622](https://github.com/ClickHouse/ClickHouse/issues/22622). [#24857](https://github.com/ClickHouse/ClickHouse/pull/24857) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix bug when exception `Mutation was killed` can be thrown to the client on mutation wait when mutation not loaded into memory yet. [#24809](https://github.com/ClickHouse/ClickHouse/pull/24809) ([alesapin](https://github.com/alesapin)). +* Fixed bug in deserialization of random generator state with might cause some data types such as `AggregateFunction(groupArraySample(N), T))` to behave in a non-deterministic way. [#24538](https://github.com/ClickHouse/ClickHouse/pull/24538) ([tavplubix](https://github.com/tavplubix)). +* Disallow building uniqXXXXStates of other aggregation states. [#24523](https://github.com/ClickHouse/ClickHouse/pull/24523) ([Raúl Marín](https://github.com/Algunenano)). Then allow it back by actually eliminating the root cause of the related issue. ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix usage of tuples in `CREATE .. AS SELECT` queries. [#24464](https://github.com/ClickHouse/ClickHouse/pull/24464) ([Anton Popov](https://github.com/CurtizJ)). +* Fix computation of total bytes in `Buffer` table. In current ClickHouse version total_writes.bytes counter decreases too much during the buffer flush. It leads to counter overflow and totalBytes return something around 17.44 EB some time after the flush. [#24450](https://github.com/ClickHouse/ClickHouse/pull/24450) ([DimasKovas](https://github.com/DimasKovas)). +* Fix incorrect information about the monotonicity of toWeek function. This fixes [#24422](https://github.com/ClickHouse/ClickHouse/issues/24422) . This bug was introduced in https://github.com/ClickHouse/ClickHouse/pull/5212 , and was exposed later by smarter partition pruner. [#24446](https://github.com/ClickHouse/ClickHouse/pull/24446) ([Amos Bird](https://github.com/amosbird)). +* When user authentication is managed by LDAP. Fixed potential deadlock that can happen during LDAP role (re)mapping, when LDAP group is mapped to a nonexistent local role. [#24431](https://github.com/ClickHouse/ClickHouse/pull/24431) ([Denis Glazachev](https://github.com/traceon)). +* In "multipart/form-data" message consider the CRLF preceding a boundary as part of it. Fixes [#23905](https://github.com/ClickHouse/ClickHouse/issues/23905). [#24399](https://github.com/ClickHouse/ClickHouse/pull/24399) ([Ivan](https://github.com/abyss7)). +* Fix drop partition with intersect fake parts. In rare cases there might be parts with mutation version greater than current block number. [#24321](https://github.com/ClickHouse/ClickHouse/pull/24321) ([Amos Bird](https://github.com/amosbird)). +* Fixed a bug in moving Materialized View from Ordinary to Atomic database (`RENAME TABLE` query). Now inner table is moved to new database together with Materialized View. Fixes [#23926](https://github.com/ClickHouse/ClickHouse/issues/23926). [#24309](https://github.com/ClickHouse/ClickHouse/pull/24309) ([tavplubix](https://github.com/tavplubix)). +* Allow empty HTTP headers. Fixes [#23901](https://github.com/ClickHouse/ClickHouse/issues/23901). [#24285](https://github.com/ClickHouse/ClickHouse/pull/24285) ([Ivan](https://github.com/abyss7)). +* Correct processing of mutations (ALTER UPDATE/DELETE) in Memory tables. Closes [#24274](https://github.com/ClickHouse/ClickHouse/issues/24274). [#24275](https://github.com/ClickHouse/ClickHouse/pull/24275) ([flynn](https://github.com/ucasfl)). +* Make column LowCardinality property in JOIN output the same as in the input, close [#23351](https://github.com/ClickHouse/ClickHouse/issues/23351), close [#20315](https://github.com/ClickHouse/ClickHouse/issues/20315). [#24061](https://github.com/ClickHouse/ClickHouse/pull/24061) ([Vladimir](https://github.com/vdimir)). +* A fix for Kafka tables. Fix the bug in failover behavior when Engine = Kafka was not able to start consumption if the same consumer had an empty assignment previously. Closes [#21118](https://github.com/ClickHouse/ClickHouse/issues/21118). [#21267](https://github.com/ClickHouse/ClickHouse/pull/21267) ([filimonov](https://github.com/filimonov)). + +#### Build/Testing/Packaging Improvement + +* Add `darwin-aarch64` (Mac M1 / Apple Silicon) builds in CI [#25560](https://github.com/ClickHouse/ClickHouse/pull/25560) ([Ivan](https://github.com/abyss7)) and put the links to the docs and website ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Adds cross-platform embedding of binary resources into executables. It works on Illumos. [#25146](https://github.com/ClickHouse/ClickHouse/pull/25146) ([bnaecker](https://github.com/bnaecker)). +* Add join related options to stress tests to improve fuzzing. [#25200](https://github.com/ClickHouse/ClickHouse/pull/25200) ([Vladimir](https://github.com/vdimir)). +* Enable build with s3 module in osx [#25217](https://github.com/ClickHouse/ClickHouse/issues/25217). [#25218](https://github.com/ClickHouse/ClickHouse/pull/25218) ([kevin wan](https://github.com/MaxWk)). +* Add integration test cases to cover JDBC bridge. [#25047](https://github.com/ClickHouse/ClickHouse/pull/25047) ([Zhichun Wu](https://github.com/zhicwu)). +* Integration tests configuration has special treatment for dictionaries. Removed remaining dictionaries manual setup. [#24728](https://github.com/ClickHouse/ClickHouse/pull/24728) ([Ilya Yatsishin](https://github.com/qoega)). +* Add libfuzzer tests for YAMLParser class. [#24480](https://github.com/ClickHouse/ClickHouse/pull/24480) ([BoloniniD](https://github.com/BoloniniD)). +* Ubuntu 20.04 is now used to run integration tests, docker-compose version used to run integration tests is updated to 1.28.2. Environment variables now take effect on docker-compose. Rework test_dictionaries_all_layouts_separate_sources to allow parallel run. [#20393](https://github.com/ClickHouse/ClickHouse/pull/20393) ([Ilya Yatsishin](https://github.com/qoega)). +* Fix TOCTOU error in installation script. [#25277](https://github.com/ClickHouse/ClickHouse/pull/25277) ([alexey-milovidov](https://github.com/alexey-milovidov)). + + ### ClickHouse release 21.6, 2021-06-05 #### Upgrade Notes @@ -1027,13 +1282,6 @@ * PODArray: Avoid call to memcpy with (nullptr, 0) arguments (Fix UBSan report). This fixes [#18525](https://github.com/ClickHouse/ClickHouse/issues/18525). [#18526](https://github.com/ClickHouse/ClickHouse/pull/18526) ([alexey-milovidov](https://github.com/alexey-milovidov)). * Minor improvement for path concatenation of zookeeper paths inside DDLWorker. [#17767](https://github.com/ClickHouse/ClickHouse/pull/17767) ([Bharat Nallan](https://github.com/bharatnc)). * Allow to reload symbols from debug file. This PR also fixes a build-id issue. [#17637](https://github.com/ClickHouse/ClickHouse/pull/17637) ([Amos Bird](https://github.com/amosbird)). -* TestFlows: fixes to LDAP tests that fail due to slow test execution. [#18790](https://github.com/ClickHouse/ClickHouse/pull/18790) ([vzakaznikov](https://github.com/vzakaznikov)). -* TestFlows: Merging requirements for AES encryption functions. Updating aes_encryption tests to use new requirements. Updating TestFlows version to 1.6.72. [#18221](https://github.com/ClickHouse/ClickHouse/pull/18221) ([vzakaznikov](https://github.com/vzakaznikov)). -* TestFlows: Updating TestFlows version to the latest 1.6.72. Re-generating requirements.py. [#18208](https://github.com/ClickHouse/ClickHouse/pull/18208) ([vzakaznikov](https://github.com/vzakaznikov)). -* TestFlows: Updating TestFlows README.md to include "How To Debug Why Test Failed" section. [#17808](https://github.com/ClickHouse/ClickHouse/pull/17808) ([vzakaznikov](https://github.com/vzakaznikov)). -* TestFlows: tests for RBAC [ACCESS MANAGEMENT](https://clickhouse.tech/docs/en/sql-reference/statements/grant/#grant-access-management) privileges. [#17804](https://github.com/ClickHouse/ClickHouse/pull/17804) ([MyroTk](https://github.com/MyroTk)). -* TestFlows: RBAC tests for SHOW, TRUNCATE, KILL, and OPTIMIZE. - Updates to old tests. - Resolved comments from #https://github.com/ClickHouse/ClickHouse/pull/16977. [#17657](https://github.com/ClickHouse/ClickHouse/pull/17657) ([MyroTk](https://github.com/MyroTk)). -* TestFlows: Added RBAC tests for `ATTACH`, `CREATE`, `DROP`, and `DETACH`. [#16977](https://github.com/ClickHouse/ClickHouse/pull/16977) ([MyroTk](https://github.com/MyroTk)). ## [Changelog for 2020](https://github.com/ClickHouse/ClickHouse/blob/master/docs/en/whats-new/changelog/2020.md) diff --git a/CMakeLists.txt b/CMakeLists.txt index ba705d527f2..5c004a4a372 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -271,12 +271,6 @@ endif() include(cmake/cpu_features.cmake) -option(ARCH_NATIVE "Add -march=native compiler flag. This makes your binaries non-portable but more performant code may be generated.") - -if (ARCH_NATIVE) - set (COMPILER_FLAGS "${COMPILER_FLAGS} -march=native") -endif () - # Asynchronous unwind tables are needed for Query Profiler. # They are already by default on some platforms but possibly not on all platforms. # Enable it explicitly. @@ -401,9 +395,10 @@ endif () # Turns on all external libs like s3, kafka, ODBC, ... option(ENABLE_LIBRARIES "Enable all external libraries by default" ON) -# We recommend avoiding this mode for production builds because we can't guarantee all needed libraries exist in your -# system. +# We recommend avoiding this mode for production builds because we can't guarantee +# all needed libraries exist in your system. # This mode exists for enthusiastic developers who are searching for trouble. +# The whole idea of using unknown version of libraries from the OS distribution is deeply flawed. # Useful for maintainers of OS packages. option (UNBUNDLED "Use system libraries instead of ones in contrib/" OFF) @@ -536,11 +531,15 @@ include (cmake/find/rapidjson.cmake) include (cmake/find/fastops.cmake) include (cmake/find/odbc.cmake) include (cmake/find/nanodbc.cmake) +include (cmake/find/sqlite.cmake) include (cmake/find/rocksdb.cmake) include (cmake/find/libpqxx.cmake) include (cmake/find/nuraft.cmake) include (cmake/find/yaml-cpp.cmake) include (cmake/find/lz4.cmake) +include (cmake/find/s2geometry.cmake) +include (cmake/find/nlp.cmake) +include (cmake/find/bzip2.cmake) if(NOT USE_INTERNAL_PARQUET_LIBRARY) set (ENABLE_ORC OFF CACHE INTERNAL "") diff --git a/README.md b/README.md index a915570122d..178547ea523 100644 --- a/README.md +++ b/README.md @@ -15,4 +15,4 @@ ClickHouse® is an open-source column-oriented database management system that a * You can also [fill this form](https://clickhouse.tech/#meet) to meet Yandex ClickHouse team in person. ## Upcoming Events -* [China ClickHouse Community Meetup (online)](http://hdxu.cn/rhbfZ) on 26 June 2021. +* [SF Bay Area ClickHouse August Community Meetup (online)](https://www.meetup.com/San-Francisco-Bay-Area-ClickHouse-Meetup/events/279109379/) on 25 August 2021. diff --git a/base/common/DateLUTImpl.cpp b/base/common/DateLUTImpl.cpp index e7faeb63760..472f24f3805 100644 --- a/base/common/DateLUTImpl.cpp +++ b/base/common/DateLUTImpl.cpp @@ -60,6 +60,7 @@ DateLUTImpl::DateLUTImpl(const std::string & time_zone_) offset_at_start_of_epoch = cctz_time_zone.lookup(cctz_time_zone.lookup(epoch).pre).offset; offset_at_start_of_lut = cctz_time_zone.lookup(cctz_time_zone.lookup(lut_start).pre).offset; offset_is_whole_number_of_hours_during_epoch = true; + offset_is_whole_number_of_minutes_during_epoch = true; cctz::civil_day date = lut_start; @@ -108,6 +109,9 @@ DateLUTImpl::DateLUTImpl(const std::string & time_zone_) if (offset_is_whole_number_of_hours_during_epoch && start_of_day > 0 && start_of_day % 3600) offset_is_whole_number_of_hours_during_epoch = false; + if (offset_is_whole_number_of_minutes_during_epoch && start_of_day > 0 && start_of_day % 60) + offset_is_whole_number_of_minutes_during_epoch = false; + /// If UTC offset was changed this day. /// Change in time zone without transition is possible, e.g. Moscow 1991 Sun, 31 Mar, 02:00 MSK to EEST cctz::time_zone::civil_transition transition{}; diff --git a/base/common/DateLUTImpl.h b/base/common/DateLUTImpl.h index 2ccad4be348..012d2cefe84 100644 --- a/base/common/DateLUTImpl.h +++ b/base/common/DateLUTImpl.h @@ -18,6 +18,8 @@ #define DATE_LUT_MAX (0xFFFFFFFFU - 86400) #define DATE_LUT_MAX_DAY_NUM 0xFFFF +/// Max int value of Date32, DATE LUT cache size minus daynum_offset_epoch +#define DATE_LUT_MAX_EXTEND_DAY_NUM (DATE_LUT_SIZE - 16436) /// A constant to add to time_t so every supported time point becomes non-negative and still has the same remainder of division by 3600. /// If we treat "remainder of division" operation in the sense of modular arithmetic (not like in C++). @@ -191,6 +193,7 @@ private: /// UTC offset at the beginning of the first supported year. Time offset_at_start_of_lut; bool offset_is_whole_number_of_hours_during_epoch; + bool offset_is_whole_number_of_minutes_during_epoch; /// Time zone name. std::string time_zone; @@ -249,18 +252,23 @@ private: } template - static inline T roundDown(T x, Divisor divisor) + inline T roundDown(T x, Divisor divisor) const { static_assert(std::is_integral_v && std::is_integral_v); assert(divisor > 0); - if (likely(x >= 0)) - return x / divisor * divisor; + if (likely(offset_is_whole_number_of_hours_during_epoch)) + { + if (likely(x >= 0)) + return x / divisor * divisor; - /// Integer division for negative numbers rounds them towards zero (up). - /// We will shift the number so it will be rounded towards -inf (down). + /// Integer division for negative numbers rounds them towards zero (up). + /// We will shift the number so it will be rounded towards -inf (down). + return (x + 1 - divisor) / divisor * divisor; + } - return (x + 1 - divisor) / divisor * divisor; + Time date = find(x).date; + return date + (x - date) / divisor * divisor; } public: @@ -270,6 +278,8 @@ public: auto getOffsetAtStartOfEpoch() const { return offset_at_start_of_epoch; } auto getTimeOffsetAtStartOfLUT() const { return offset_at_start_of_lut; } + auto getDayNumOffsetEpoch() const { return daynum_offset_epoch; } + /// All functions below are thread-safe; arguments are not checked. inline ExtendedDayNum toDayNum(ExtendedDayNum d) const @@ -455,10 +465,21 @@ public: inline unsigned toSecond(Time t) const { - auto res = t % 60; - if (likely(res >= 0)) - return res; - return res + 60; + if (likely(offset_is_whole_number_of_minutes_during_epoch)) + { + Time res = t % 60; + if (likely(res >= 0)) + return res; + return res + 60; + } + + LUTIndex index = findIndex(t); + Time time = t - lut[index].date; + + if (time >= lut[index].time_at_offset_change()) + time += lut[index].amount_of_offset_change(); + + return time % 60; } inline unsigned toMinute(Time t) const @@ -479,29 +500,11 @@ public: } /// NOTE: Assuming timezone offset is a multiple of 15 minutes. - inline Time toStartOfMinute(Time t) const { return roundDown(t, 60); } - inline Time toStartOfFiveMinute(Time t) const { return roundDown(t, 300); } - inline Time toStartOfFifteenMinutes(Time t) const { return roundDown(t, 900); } - - inline Time toStartOfTenMinutes(Time t) const - { - if (t >= 0 && offset_is_whole_number_of_hours_during_epoch) - return t / 600 * 600; - - /// More complex logic is for Nepal - it has offset 05:45. Australia/Eucla is also unfortunate. - Time date = find(t).date; - return date + (t - date) / 600 * 600; - } - - /// NOTE: Assuming timezone transitions are multiple of hours. Lord Howe Island in Australia is a notable exception. - inline Time toStartOfHour(Time t) const - { - if (t >= 0 && offset_is_whole_number_of_hours_during_epoch) - return t / 3600 * 3600; - - Time date = find(t).date; - return date + (t - date) / 3600 * 3600; - } + inline Time toStartOfMinute(Time t) const { return toStartOfMinuteInterval(t, 1); } + inline Time toStartOfFiveMinute(Time t) const { return toStartOfMinuteInterval(t, 5); } + inline Time toStartOfFifteenMinutes(Time t) const { return toStartOfMinuteInterval(t, 15); } + inline Time toStartOfTenMinutes(Time t) const { return toStartOfMinuteInterval(t, 10); } + inline Time toStartOfHour(Time t) const { return roundDown(t, 3600); } /** Number of calendar day since the beginning of UNIX epoch (1970-01-01 is zero) * We use just two bytes for it. It covers the range up to 2105 and slightly more. @@ -899,25 +902,24 @@ public: inline Time toStartOfMinuteInterval(Time t, UInt64 minutes) const { - if (minutes == 1) - return toStartOfMinute(t); + UInt64 divisor = 60 * minutes; + if (likely(offset_is_whole_number_of_minutes_during_epoch)) + { + if (likely(t >= 0)) + return t / divisor * divisor; + return (t + 1 - divisor) / divisor * divisor; + } - /** In contrast to "toStartOfHourInterval" function above, - * the minute intervals are not aligned to the midnight. - * You will get unexpected results if for example, you round down to 60 minute interval - * and there was a time shift to 30 minutes. - * - * But this is not specified in docs and can be changed in future. - */ - - UInt64 seconds = 60 * minutes; - return roundDown(t, seconds); + Time date = find(t).date; + return date + (t - date) / divisor * divisor; } inline Time toStartOfSecondInterval(Time t, UInt64 seconds) const { if (seconds == 1) return t; + if (seconds % 60 == 0) + return toStartOfMinuteInterval(t, seconds / 60); return roundDown(t, seconds); } @@ -926,15 +928,17 @@ public: { if (unlikely(year < DATE_LUT_MIN_YEAR || year > DATE_LUT_MAX_YEAR || month < 1 || month > 12 || day_of_month < 1 || day_of_month > 31)) return LUTIndex(0); - - return LUTIndex{years_months_lut[(year - DATE_LUT_MIN_YEAR) * 12 + month - 1] + day_of_month - 1}; + auto year_lut_index = (year - DATE_LUT_MIN_YEAR) * 12 + month - 1; + UInt32 index = years_months_lut[year_lut_index].toUnderType() + day_of_month - 1; + /// When date is out of range, default value is DATE_LUT_SIZE - 1 (2283-11-11) + return LUTIndex{std::min(index, static_cast(DATE_LUT_SIZE - 1))}; } /// Create DayNum from year, month, day of month. - inline ExtendedDayNum makeDayNum(Int16 year, UInt8 month, UInt8 day_of_month) const + inline ExtendedDayNum makeDayNum(Int16 year, UInt8 month, UInt8 day_of_month, Int32 default_error_day_num = 0) const { if (unlikely(year < DATE_LUT_MIN_YEAR || year > DATE_LUT_MAX_YEAR || month < 1 || month > 12 || day_of_month < 1 || day_of_month > 31)) - return ExtendedDayNum(0); + return ExtendedDayNum(default_error_day_num); return toDayNum(makeLUTIndex(year, month, day_of_month)); } @@ -949,7 +953,7 @@ public: inline Time makeDateTime(Int16 year, UInt8 month, UInt8 day_of_month, UInt8 hour, UInt8 minute, UInt8 second) const { size_t index = makeLUTIndex(year, month, day_of_month); - UInt32 time_offset = hour * 3600 + minute * 60 + second; + Time time_offset = hour * 3600 + minute * 60 + second; if (time_offset >= lut[index].time_at_offset_change()) time_offset -= lut[index].amount_of_offset_change(); @@ -1091,9 +1095,9 @@ public: return lut[new_index].date + time; } - inline NO_SANITIZE_UNDEFINED Time addWeeks(Time t, Int64 delta) const + inline NO_SANITIZE_UNDEFINED Time addWeeks(Time t, Int32 delta) const { - return addDays(t, delta * 7); + return addDays(t, static_cast(delta) * 7); } inline UInt8 saturateDayOfMonth(Int16 year, UInt8 month, UInt8 day_of_month) const @@ -1158,14 +1162,14 @@ public: return toDayNum(addMonthsIndex(d, delta)); } - inline Time NO_SANITIZE_UNDEFINED addQuarters(Time t, Int64 delta) const + inline Time NO_SANITIZE_UNDEFINED addQuarters(Time t, Int32 delta) const { - return addMonths(t, delta * 3); + return addMonths(t, static_cast(delta) * 3); } - inline ExtendedDayNum addQuarters(ExtendedDayNum d, Int64 delta) const + inline ExtendedDayNum addQuarters(ExtendedDayNum d, Int32 delta) const { - return addMonths(d, delta * 3); + return addMonths(d, static_cast(delta) * 3); } template diff --git a/base/common/LocalDate.h b/base/common/LocalDate.h index b1e6eeb907c..484847e1ff4 100644 --- a/base/common/LocalDate.h +++ b/base/common/LocalDate.h @@ -70,6 +70,14 @@ public: m_day = values.day_of_month; } + explicit LocalDate(ExtendedDayNum day_num) + { + const auto & values = DateLUT::instance().getValues(day_num); + m_year = values.year; + m_month = values.month; + m_day = values.day_of_month; + } + LocalDate(unsigned short year_, unsigned char month_, unsigned char day_) : m_year(year_), m_month(month_), m_day(day_) { @@ -98,6 +106,12 @@ public: return DayNum(lut.makeDayNum(m_year, m_month, m_day).toUnderType()); } + ExtendedDayNum getExtenedDayNum() const + { + const auto & lut = DateLUT::instance(); + return ExtendedDayNum (lut.makeDayNum(m_year, m_month, m_day).toUnderType()); + } + operator DayNum() const { return getDayNum(); diff --git a/base/common/ReplxxLineReader.cpp b/base/common/ReplxxLineReader.cpp index 9c65b1dfe4c..c79013f1850 100644 --- a/base/common/ReplxxLineReader.cpp +++ b/base/common/ReplxxLineReader.cpp @@ -69,7 +69,7 @@ void convertHistoryFile(const std::string & path, replxx::Replxx & rx) } std::string line; - if (!getline(in, line).good()) + if (getline(in, line).bad()) { rx.print("Cannot read from %s (for conversion): %s\n", path.c_str(), errnoToString(errno).c_str()); @@ -78,7 +78,7 @@ void convertHistoryFile(const std::string & path, replxx::Replxx & rx) /// This is the marker of the date, no need to convert. static char const REPLXX_TIMESTAMP_PATTERN[] = "### dddd-dd-dd dd:dd:dd.ddd"; - if (line.starts_with("### ") && line.size() == strlen(REPLXX_TIMESTAMP_PATTERN)) + if (line.empty() || (line.starts_with("### ") && line.size() == strlen(REPLXX_TIMESTAMP_PATTERN))) { return; } diff --git a/base/common/memory.h b/base/common/memory.h deleted file mode 100644 index e82c019ceab..00000000000 --- a/base/common/memory.h +++ /dev/null @@ -1,57 +0,0 @@ -#pragma once - -#include -#include "defines.h" - -#if USE_JEMALLOC -# include -#endif - -#if !USE_JEMALLOC || JEMALLOC_VERSION_MAJOR < 4 -# include -#endif - - -namespace Memory -{ - -inline ALWAYS_INLINE void * newImpl(std::size_t size) -{ - auto * ptr = malloc(size); - if (likely(ptr != nullptr)) - return ptr; - - /// @note no std::get_new_handler logic implemented - throw std::bad_alloc{}; -} - -inline ALWAYS_INLINE void * newNoExept(std::size_t size) noexcept -{ - return malloc(size); -} - -inline ALWAYS_INLINE void deleteImpl(void * ptr) noexcept -{ - free(ptr); -} - -#if USE_JEMALLOC && JEMALLOC_VERSION_MAJOR >= 4 - -inline ALWAYS_INLINE void deleteSized(void * ptr, std::size_t size) noexcept -{ - if (unlikely(ptr == nullptr)) - return; - - sdallocx(ptr, size, 0); -} - -#else - -inline ALWAYS_INLINE void deleteSized(void * ptr, std::size_t size [[maybe_unused]]) noexcept -{ - free(ptr); -} - -#endif - -} diff --git a/base/common/removeDuplicates.h b/base/common/removeDuplicates.h new file mode 100644 index 00000000000..a0142b1a948 --- /dev/null +++ b/base/common/removeDuplicates.h @@ -0,0 +1,24 @@ +#pragma once +#include + +/// Removes duplicates from a container without changing the order of its elements. +/// Keeps the last occurrence of each element. +/// Should NOT be used for containers with a lot of elements because it has O(N^2) complexity. +template +void removeDuplicatesKeepLast(std::vector & vec) +{ + auto begin = vec.begin(); + auto end = vec.end(); + auto new_begin = end; + for (auto current = end; current != begin;) + { + --current; + if (std::find(new_begin, end, *current) == end) + { + --new_begin; + if (new_begin != current) + *new_begin = *current; + } + } + vec.erase(begin, new_begin); +} diff --git a/base/daemon/BaseDaemon.cpp b/base/daemon/BaseDaemon.cpp index ed5c81e89fa..745e020c8bb 100644 --- a/base/daemon/BaseDaemon.cpp +++ b/base/daemon/BaseDaemon.cpp @@ -259,10 +259,25 @@ private: Poco::Logger * log; BaseDaemon & daemon; - void onTerminate(const std::string & message, UInt32 thread_num) const + void onTerminate(std::string_view message, UInt32 thread_num) const { + size_t pos = message.find('\n'); + LOG_FATAL(log, "(version {}{}, {}) (from thread {}) {}", - VERSION_STRING, VERSION_OFFICIAL, daemon.build_id_info, thread_num, message); + VERSION_STRING, VERSION_OFFICIAL, daemon.build_id_info, thread_num, message.substr(0, pos)); + + /// Print trace from std::terminate exception line-by-line to make it easy for grep. + while (pos != std::string_view::npos) + { + ++pos; + size_t next_pos = message.find('\n', pos); + size_t size = next_pos; + if (next_pos != std::string_view::npos) + size = next_pos - pos; + + LOG_FATAL(log, "{}", message.substr(pos, size)); + pos = next_pos; + } } void onFault( diff --git a/base/glibc-compatibility/CMakeLists.txt b/base/glibc-compatibility/CMakeLists.txt index 8cba91de33f..4fc2a002cd8 100644 --- a/base/glibc-compatibility/CMakeLists.txt +++ b/base/glibc-compatibility/CMakeLists.txt @@ -9,10 +9,6 @@ if (GLIBC_COMPATIBILITY) check_include_file("sys/random.h" HAVE_SYS_RANDOM_H) - if(COMPILER_CLANG) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-builtin-requires-header") - endif() - add_headers_and_sources(glibc_compatibility .) add_headers_and_sources(glibc_compatibility musl) if (ARCH_AARCH64) @@ -35,11 +31,9 @@ if (GLIBC_COMPATIBILITY) add_library(glibc-compatibility STATIC ${glibc_compatibility_sources}) - if (COMPILER_CLANG) - target_compile_options(glibc-compatibility PRIVATE -Wno-unused-command-line-argument) - elseif (COMPILER_GCC) - target_compile_options(glibc-compatibility PRIVATE -Wno-unused-but-set-variable) - endif () + target_no_warning(glibc-compatibility unused-command-line-argument) + target_no_warning(glibc-compatibility unused-but-set-variable) + target_no_warning(glibc-compatibility builtin-requires-header) target_include_directories(glibc-compatibility PRIVATE libcxxabi ${musl_arch_include_dir}) diff --git a/base/glibc-compatibility/musl/getauxval.c b/base/glibc-compatibility/musl/getauxval.c index a429273fa1a..dad7aa938d7 100644 --- a/base/glibc-compatibility/musl/getauxval.c +++ b/base/glibc-compatibility/musl/getauxval.c @@ -1,4 +1,5 @@ #include +#include "atomic.h" #include // __environ #include @@ -17,18 +18,7 @@ static size_t __find_auxv(unsigned long type) return (size_t) -1; } -__attribute__((constructor)) static void __auxv_init() -{ - size_t i; - for (i = 0; __environ[i]; i++); - __auxv = (unsigned long *) (__environ + i + 1); - - size_t secure_idx = __find_auxv(AT_SECURE); - if (secure_idx != ((size_t) -1)) - __auxv_secure = __auxv[secure_idx]; -} - -unsigned long getauxval(unsigned long type) +unsigned long __getauxval(unsigned long type) { if (type == AT_SECURE) return __auxv_secure; @@ -43,3 +33,38 @@ unsigned long getauxval(unsigned long type) errno = ENOENT; return 0; } + +static void * volatile getauxval_func; + +static unsigned long __auxv_init(unsigned long type) +{ + if (!__environ) + { + // __environ is not initialized yet so we can't initialize __auxv right now. + // That's normally occurred only when getauxval() is called from some sanitizer's internal code. + errno = ENOENT; + return 0; + } + + // Initialize __auxv and __auxv_secure. + size_t i; + for (i = 0; __environ[i]; i++); + __auxv = (unsigned long *) (__environ + i + 1); + + size_t secure_idx = __find_auxv(AT_SECURE); + if (secure_idx != ((size_t) -1)) + __auxv_secure = __auxv[secure_idx]; + + // Now we've initialized __auxv, next time getauxval() will only call __get_auxval(). + a_cas_p(&getauxval_func, (void *)__auxv_init, (void *)__getauxval); + + return __getauxval(type); +} + +// First time getauxval() will call __auxv_init(). +static void * volatile getauxval_func = (void *)__auxv_init; + +unsigned long getauxval(unsigned long type) +{ + return ((unsigned long (*)(unsigned long))getauxval_func)(type); +} diff --git a/base/mysqlxx/Pool.cpp b/base/mysqlxx/Pool.cpp index 386b4544b78..2f47aa67356 100644 --- a/base/mysqlxx/Pool.cpp +++ b/base/mysqlxx/Pool.cpp @@ -296,7 +296,7 @@ void Pool::initialize() Pool::Connection * Pool::allocConnection(bool dont_throw_if_failed_first_time) { - std::unique_ptr conn_ptr{new Connection}; + std::unique_ptr conn_ptr = std::make_unique(); try { diff --git a/benchmark/clickhouse/benchmark-new.sh b/benchmark/clickhouse/benchmark-new.sh index 876ff87f58d..0c4cad6e5e3 100755 --- a/benchmark/clickhouse/benchmark-new.sh +++ b/benchmark/clickhouse/benchmark-new.sh @@ -4,13 +4,24 @@ QUERIES_FILE="queries.sql" TABLE=$1 TRIES=3 +if [ -x ./clickhouse ] +then + CLICKHOUSE_CLIENT="./clickhouse client" +elif command -v clickhouse-client >/dev/null 2>&1 +then + CLICKHOUSE_CLIENT="clickhouse-client" +else + echo "clickhouse-client is not found" + exit 1 +fi + cat "$QUERIES_FILE" | sed "s/{table}/${TABLE}/g" | while read query; do sync echo 3 | sudo tee /proc/sys/vm/drop_caches >/dev/null echo -n "[" for i in $(seq 1 $TRIES); do - RES=$(clickhouse-client --time --format=Null --query="$query" 2>&1) + RES=$(${CLICKHOUSE_CLIENT} --time --format=Null --max_memory_usage=100G --query="$query" 2>&1) [[ "$?" == "0" ]] && echo -n "${RES}" || echo -n "null" [[ "$i" != $TRIES ]] && echo -n ", " done diff --git a/benchmark/hardware.sh b/benchmark/hardware.sh index e7773ab1d1e..e4a94ef1854 100755 --- a/benchmark/hardware.sh +++ b/benchmark/hardware.sh @@ -11,8 +11,8 @@ DATASET="${TABLE}_v1.tar.xz" QUERIES_FILE="queries.sql" TRIES=3 -AMD64_BIN_URL="https://clickhouse-builds.s3.yandex.net/0/e29c4c3cc47ab2a6c4516486c1b77d57e7d42643/clickhouse_build_check/gcc-10_relwithdebuginfo_none_bundled_unsplitted_disable_False_binary/clickhouse" -AARCH64_BIN_URL="https://clickhouse-builds.s3.yandex.net/0/e29c4c3cc47ab2a6c4516486c1b77d57e7d42643/clickhouse_special_build_check/clang-10-aarch64_relwithdebuginfo_none_bundled_unsplitted_disable_False_binary/clickhouse" +AMD64_BIN_URL="https://builds.clickhouse.tech/master/amd64/clickhouse" +AARCH64_BIN_URL="https://builds.clickhouse.tech/master/aarch64/clickhouse" # Note: on older Ubuntu versions, 'axel' does not support IPv6. If you are using IPv6-only servers on very old Ubuntu, just don't install 'axel'. @@ -89,7 +89,7 @@ cat "$QUERIES_FILE" | sed "s/{table}/${TABLE}/g" | while read query; do echo -n "[" for i in $(seq 1 $TRIES); do - RES=$(./clickhouse client --max_memory_usage 100000000000 --time --format=Null --query="$query" 2>&1 ||:) + RES=$(./clickhouse client --max_memory_usage 100G --time --format=Null --query="$query" 2>&1 ||:) [[ "$?" == "0" ]] && echo -n "${RES}" || echo -n "null" [[ "$i" != $TRIES ]] && echo -n ", " done diff --git a/cmake/add_warning.cmake b/cmake/add_warning.cmake index 3a776c98ab6..bc9642c9cc6 100644 --- a/cmake/add_warning.cmake +++ b/cmake/add_warning.cmake @@ -27,3 +27,22 @@ endmacro () macro (no_warning flag) add_warning(no-${flag}) endmacro () + + +# The same but only for specified target. +macro (target_add_warning target flag) + string (REPLACE "-" "_" underscored_flag ${flag}) + string (REPLACE "+" "x" underscored_flag ${underscored_flag}) + + check_cxx_compiler_flag("-W${flag}" SUPPORTS_CXXFLAG_${underscored_flag}) + + if (SUPPORTS_CXXFLAG_${underscored_flag}) + target_compile_options (${target} PRIVATE "-W${flag}") + else () + message (WARNING "Flag -W${flag} is unsupported") + endif () +endmacro () + +macro (target_no_warning target flag) + target_add_warning(${target} no-${flag}) +endmacro () diff --git a/cmake/autogenerated_versions.txt b/cmake/autogenerated_versions.txt index 49cf30d2556..2435335f669 100644 --- a/cmake/autogenerated_versions.txt +++ b/cmake/autogenerated_versions.txt @@ -2,11 +2,11 @@ # NOTE: has nothing common with DBMS_TCP_PROTOCOL_VERSION, # only DBMS_TCP_PROTOCOL_VERSION should be incremented on protocol changes. -SET(VERSION_REVISION 54453) +SET(VERSION_REVISION 54454) SET(VERSION_MAJOR 21) -SET(VERSION_MINOR 8) +SET(VERSION_MINOR 9) SET(VERSION_PATCH 1) -SET(VERSION_GITHASH fb895056568e26200629c7d19626e92d2dedc70d) -SET(VERSION_DESCRIBE v21.8.1.1-prestable) -SET(VERSION_STRING 21.8.1.1) +SET(VERSION_GITHASH f063e44131a048ba2d9af8075f03700fd5ec3e69) +SET(VERSION_DESCRIBE v21.9.1.7770-prestable) +SET(VERSION_STRING 21.9.1.7770) # end of autochange diff --git a/cmake/cpu_features.cmake b/cmake/cpu_features.cmake index d12eac2e3c4..46e42329958 100644 --- a/cmake/cpu_features.cmake +++ b/cmake/cpu_features.cmake @@ -5,109 +5,128 @@ include (CMakePushCheckState) cmake_push_check_state () -# gcc -dM -E -mno-sse2 - < /dev/null | sort > gcc-dump-nosse2 -# gcc -dM -E -msse2 - < /dev/null | sort > gcc-dump-sse2 -#define __SSE2__ 1 -#define __SSE2_MATH__ 1 +# The variables HAVE_* determine if compiler has support for the flag to use the corresponding instruction set. +# The options ENABLE_* determine if we will tell compiler to actually use the corresponding instruction set if compiler can do it. -# gcc -dM -E -msse4.1 - < /dev/null | sort > gcc-dump-sse41 -#define __SSE4_1__ 1 +# All of them are unrelated to the instruction set at the host machine +# (you can compile for newer instruction set on old machines and vice versa). -set (TEST_FLAG "-msse4.1") -set (CMAKE_REQUIRED_FLAGS "${TEST_FLAG} -O0") -check_cxx_source_compiles(" - #include - int main() { - auto a = _mm_insert_epi8(__m128i(), 0, 0); - (void)a; - return 0; - } -" HAVE_SSE41) -if (HAVE_SSE41) - set (COMPILER_FLAGS "${COMPILER_FLAGS} ${TEST_FLAG}") -endif () +option (ENABLE_SSSE3 "Use SSSE3 instructions on x86_64" 1) +option (ENABLE_SSE41 "Use SSE4.1 instructions on x86_64" 1) +option (ENABLE_SSE42 "Use SSE4.2 instructions on x86_64" 1) +option (ENABLE_PCLMULQDQ "Use pclmulqdq instructions on x86_64" 1) +option (ENABLE_POPCNT "Use popcnt instructions on x86_64" 1) +option (ENABLE_AVX "Use AVX instructions on x86_64" 0) +option (ENABLE_AVX2 "Use AVX2 instructions on x86_64" 0) -if (ARCH_PPC64LE) - set (COMPILER_FLAGS "${COMPILER_FLAGS} -maltivec -D__SSE2__=1 -DNO_WARN_X86_INTRINSICS") -endif () +option (ARCH_NATIVE "Add -march=native compiler flag. This makes your binaries non-portable but more performant code may be generated. This option overrides ENABLE_* options for specific instruction set. Highly not recommended to use." 0) -# gcc -dM -E -msse4.2 - < /dev/null | sort > gcc-dump-sse42 -#define __SSE4_2__ 1 +if (ARCH_NATIVE) + set (COMPILER_FLAGS "${COMPILER_FLAGS} -march=native") -set (TEST_FLAG "-msse4.2") -set (CMAKE_REQUIRED_FLAGS "${TEST_FLAG} -O0") -check_cxx_source_compiles(" - #include - int main() { - auto a = _mm_crc32_u64(0, 0); - (void)a; - return 0; - } -" HAVE_SSE42) -if (HAVE_SSE42) - set (COMPILER_FLAGS "${COMPILER_FLAGS} ${TEST_FLAG}") -endif () +else () + set (TEST_FLAG "-mssse3") + set (CMAKE_REQUIRED_FLAGS "${TEST_FLAG} -O0") + check_cxx_source_compiles(" + #include + int main() { + __m64 a = _mm_abs_pi8(__m64()); + (void)a; + return 0; + } + " HAVE_SSSE3) + if (HAVE_SSSE3 AND ENABLE_SSSE3) + set (COMPILER_FLAGS "${COMPILER_FLAGS} ${TEST_FLAG}") + endif () -set (TEST_FLAG "-mssse3") -set (CMAKE_REQUIRED_FLAGS "${TEST_FLAG} -O0") -check_cxx_source_compiles(" - #include - int main() { - __m64 a = _mm_abs_pi8(__m64()); - (void)a; - return 0; - } -" HAVE_SSSE3) -set (TEST_FLAG "-mavx") -set (CMAKE_REQUIRED_FLAGS "${TEST_FLAG} -O0") -check_cxx_source_compiles(" - #include - int main() { - auto a = _mm256_insert_epi8(__m256i(), 0, 0); - (void)a; - return 0; - } -" HAVE_AVX) + set (TEST_FLAG "-msse4.1") + set (CMAKE_REQUIRED_FLAGS "${TEST_FLAG} -O0") + check_cxx_source_compiles(" + #include + int main() { + auto a = _mm_insert_epi8(__m128i(), 0, 0); + (void)a; + return 0; + } + " HAVE_SSE41) + if (HAVE_SSE41 AND ENABLE_SSE41) + set (COMPILER_FLAGS "${COMPILER_FLAGS} ${TEST_FLAG}") + endif () -set (TEST_FLAG "-mavx2") -set (CMAKE_REQUIRED_FLAGS "${TEST_FLAG} -O0") -check_cxx_source_compiles(" - #include - int main() { - auto a = _mm256_add_epi16(__m256i(), __m256i()); - (void)a; - return 0; - } -" HAVE_AVX2) + if (ARCH_PPC64LE) + set (COMPILER_FLAGS "${COMPILER_FLAGS} -maltivec -D__SSE2__=1 -DNO_WARN_X86_INTRINSICS") + endif () -set (TEST_FLAG "-mpclmul") -set (CMAKE_REQUIRED_FLAGS "${TEST_FLAG} -O0") -check_cxx_source_compiles(" - #include - int main() { - auto a = _mm_clmulepi64_si128(__m128i(), __m128i(), 0); - (void)a; - return 0; - } -" HAVE_PCLMULQDQ) + set (TEST_FLAG "-msse4.2") + set (CMAKE_REQUIRED_FLAGS "${TEST_FLAG} -O0") + check_cxx_source_compiles(" + #include + int main() { + auto a = _mm_crc32_u64(0, 0); + (void)a; + return 0; + } + " HAVE_SSE42) + if (HAVE_SSE42 AND ENABLE_SSE42) + set (COMPILER_FLAGS "${COMPILER_FLAGS} ${TEST_FLAG}") + endif () -# gcc -dM -E -mpopcnt - < /dev/null | sort > gcc-dump-popcnt -#define __POPCNT__ 1 + set (TEST_FLAG "-mpclmul") + set (CMAKE_REQUIRED_FLAGS "${TEST_FLAG} -O0") + check_cxx_source_compiles(" + #include + int main() { + auto a = _mm_clmulepi64_si128(__m128i(), __m128i(), 0); + (void)a; + return 0; + } + " HAVE_PCLMULQDQ) + if (HAVE_PCLMULQDQ AND ENABLE_PCLMULQDQ) + set (COMPILER_FLAGS "${COMPILER_FLAGS} ${TEST_FLAG}") + endif () -set (TEST_FLAG "-mpopcnt") + set (TEST_FLAG "-mpopcnt") -set (CMAKE_REQUIRED_FLAGS "${TEST_FLAG} -O0") -check_cxx_source_compiles(" - int main() { - auto a = __builtin_popcountll(0); - (void)a; - return 0; - } -" HAVE_POPCNT) + set (CMAKE_REQUIRED_FLAGS "${TEST_FLAG} -O0") + check_cxx_source_compiles(" + int main() { + auto a = __builtin_popcountll(0); + (void)a; + return 0; + } + " HAVE_POPCNT) + if (HAVE_POPCNT AND ENABLE_POPCNT) + set (COMPILER_FLAGS "${COMPILER_FLAGS} ${TEST_FLAG}") + endif () -if (HAVE_POPCNT AND NOT ARCH_AARCH64) - set (COMPILER_FLAGS "${COMPILER_FLAGS} ${TEST_FLAG}") + set (TEST_FLAG "-mavx") + set (CMAKE_REQUIRED_FLAGS "${TEST_FLAG} -O0") + check_cxx_source_compiles(" + #include + int main() { + auto a = _mm256_insert_epi8(__m256i(), 0, 0); + (void)a; + return 0; + } + " HAVE_AVX) + if (HAVE_AVX AND ENABLE_AVX) + set (COMPILER_FLAGS "${COMPILER_FLAGS} ${TEST_FLAG}") + endif () + + set (TEST_FLAG "-mavx2") + set (CMAKE_REQUIRED_FLAGS "${TEST_FLAG} -O0") + check_cxx_source_compiles(" + #include + int main() { + auto a = _mm256_add_epi16(__m256i(), __m256i()); + (void)a; + return 0; + } + " HAVE_AVX2) + if (HAVE_AVX2 AND ENABLE_AVX2) + set (COMPILER_FLAGS "${COMPILER_FLAGS} ${TEST_FLAG}") + endif () endif () cmake_pop_check_state () diff --git a/cmake/embed_binary.cmake b/cmake/embed_binary.cmake index d15962c05d4..e5428c24939 100644 --- a/cmake/embed_binary.cmake +++ b/cmake/embed_binary.cmake @@ -53,5 +53,6 @@ macro(clickhouse_embed_binaries) set_property(SOURCE "${CMAKE_CURRENT_BINARY_DIR}/${ASSEMBLY_FILE_NAME}" APPEND PROPERTY INCLUDE_DIRECTORIES "${EMBED_RESOURCE_DIR}") target_sources("${EMBED_TARGET}" PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/${ASSEMBLY_FILE_NAME}") + set_target_properties("${EMBED_TARGET}" PROPERTIES OBJECT_DEPENDS "${RESOURCE_FILE}") endforeach() endmacro() diff --git a/cmake/find/bzip2.cmake b/cmake/find/bzip2.cmake new file mode 100644 index 00000000000..15532a67c00 --- /dev/null +++ b/cmake/find/bzip2.cmake @@ -0,0 +1,19 @@ +option(ENABLE_BZIP2 "Enable bzip2 compression support" ${ENABLE_LIBRARIES}) + +if (NOT ENABLE_BZIP2) + message (STATUS "bzip2 compression disabled") + return() +endif() + +if (NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/bzip2/bzlib.h") + message (WARNING "submodule contrib/bzip2 is missing. to fix try run: \n git submodule update --init --recursive") + message (${RECONFIGURE_MESSAGE_LEVEL} "Can't find internal bzip2 library") + set (USE_NLP 0) + return() +endif () + +set (USE_BZIP2 1) +set (BZIP2_INCLUDE_DIR "${ClickHouse_SOURCE_DIR}/contrib/bzip2") +set (BZIP2_LIBRARY bzip2) + +message (STATUS "Using bzip2=${USE_BZIP2}: ${BZIP2_INCLUDE_DIR} : ${BZIP2_LIBRARY}") diff --git a/cmake/find/nlp.cmake b/cmake/find/nlp.cmake new file mode 100644 index 00000000000..f1204a85dea --- /dev/null +++ b/cmake/find/nlp.cmake @@ -0,0 +1,32 @@ +option(ENABLE_NLP "Enable NLP functions support" ${ENABLE_LIBRARIES}) + +if (NOT ENABLE_NLP) + + message (STATUS "NLP functions disabled") + return() +endif() + +if (NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/libstemmer_c/Makefile") + message (WARNING "submodule contrib/libstemmer_c is missing. to fix try run: \n git submodule update --init --recursive") + message (${RECONFIGURE_MESSAGE_LEVEL} "Can't find internal libstemmer_c library, NLP functions will be disabled") + set (USE_NLP 0) + return() +endif () + +if (NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/wordnet-blast/CMakeLists.txt") + message (WARNING "submodule contrib/wordnet-blast is missing. to fix try run: \n git submodule update --init --recursive") + message (${RECONFIGURE_MESSAGE_LEVEL} "Can't find internal wordnet-blast library, NLP functions will be disabled") + set (USE_NLP 0) + return() +endif () + +if (NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/lemmagen-c/README.md") + message (WARNING "submodule contrib/lemmagen-c is missing. to fix try run: \n git submodule update --init --recursive") + message (${RECONFIGURE_MESSAGE_LEVEL} "Can't find internal lemmagen-c library, NLP functions will be disabled") + set (USE_NLP 0) + return() +endif () + +set (USE_NLP 1) + +message (STATUS "Using Libraries for NLP functions: contrib/wordnet-blast, contrib/libstemmer_c, contrib/lemmagen-c") diff --git a/cmake/find/s2geometry.cmake b/cmake/find/s2geometry.cmake new file mode 100644 index 00000000000..2364c6ba193 --- /dev/null +++ b/cmake/find/s2geometry.cmake @@ -0,0 +1,24 @@ + +option(ENABLE_S2_GEOMETRY "Enable S2 geometry library" ${ENABLE_LIBRARIES}) + +if (ENABLE_S2_GEOMETRY) + if (NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/s2geometry") + message (WARNING "submodule contrib/s2geometry is missing. to fix try run: \n git submodule update --init --recursive") + set (ENABLE_S2_GEOMETRY 0) + set (USE_S2_GEOMETRY 0) + else() + if (OPENSSL_FOUND) + set (S2_GEOMETRY_LIBRARY s2) + set (S2_GEOMETRY_INCLUDE_DIR ${ClickHouse_SOURCE_DIR}/contrib/s2geometry/src/s2) + set (USE_S2_GEOMETRY 1) + else() + message (WARNING "S2 uses OpenSSL, but the latter is absent.") + endif() + endif() + + if (NOT USE_S2_GEOMETRY) + message (${RECONFIGURE_MESSAGE_LEVEL} "Can't enable S2 geometry library") + endif() +endif() + +message (STATUS "Using s2geometry=${USE_S2_GEOMETRY} : ${S2_GEOMETRY_INCLUDE_DIR}") diff --git a/cmake/find/sqlite.cmake b/cmake/find/sqlite.cmake new file mode 100644 index 00000000000..cfa33fdebbb --- /dev/null +++ b/cmake/find/sqlite.cmake @@ -0,0 +1,16 @@ +option(ENABLE_SQLITE "Enable sqlite" ${ENABLE_LIBRARIES}) + +if (NOT ENABLE_SQLITE) + return() +endif() + +if (NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/sqlite-amalgamation/sqlite3.c") + message (WARNING "submodule contrib/sqlite3-amalgamation is missing. to fix try run: \n git submodule update --init --recursive") + message (${RECONFIGURE_MESSAGE_LEVEL} "Can't find internal sqlite library") + set (USE_SQLITE 0) + return() +endif() + +set (USE_SQLITE 1) +set (SQLITE_LIBRARY sqlite) +message (STATUS "Using sqlite=${USE_SQLITE}") diff --git a/cmake/find/stats.cmake b/cmake/find/stats.cmake index 339e8524598..dea108ed920 100644 --- a/cmake/find/stats.cmake +++ b/cmake/find/stats.cmake @@ -1,4 +1,4 @@ -option(ENABLE_STATS "Enalbe StatsLib library" ${ENABLE_LIBRARIES}) +option(ENABLE_STATS "Enable StatsLib library" ${ENABLE_LIBRARIES}) if (ENABLE_STATS) if (NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/stats") diff --git a/contrib/AMQP-CPP b/contrib/AMQP-CPP index 03781aaff0f..1a6c51f4ac5 160000 --- a/contrib/AMQP-CPP +++ b/contrib/AMQP-CPP @@ -1 +1 @@ -Subproject commit 03781aaff0f10ef41f902b8cf865fe0067180c10 +Subproject commit 1a6c51f4ac51ac56610fa95081bd2f349911375a diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt index 164692fb893..e6e098a05b3 100644 --- a/contrib/CMakeLists.txt +++ b/contrib/CMakeLists.txt @@ -1,3 +1,4 @@ +# Third-party libraries may have substandard code. # Put all targets defined here and in added subfolders under "contrib/" folder in GUI-based IDEs by default. # Some of third-party projects may override CMAKE_FOLDER or FOLDER property of their targets, so they will @@ -10,10 +11,8 @@ else () endif () unset (_current_dir_name) -# Third-party libraries may have substandard code. -# Also remove a possible source of nondeterminism. -set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w -D__DATE__= -D__TIME__= -D__TIMESTAMP__=") -set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w -D__DATE__= -D__TIME__= -D__TIMESTAMP__=") +set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w") +set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w") if (WITH_COVERAGE) set (WITHOUT_COVERAGE_LIST ${WITHOUT_COVERAGE}) @@ -329,3 +328,20 @@ endif() add_subdirectory(fast_float) +if (USE_NLP) + add_subdirectory(libstemmer-c-cmake) + add_subdirectory(wordnet-blast-cmake) + add_subdirectory(lemmagen-c-cmake) +endif() + +if (USE_BZIP2) + add_subdirectory(bzip2-cmake) +endif() + +if (USE_SQLITE) + add_subdirectory(sqlite-cmake) +endif() + +if (USE_S2_GEOMETRY) + add_subdirectory(s2geometry-cmake) +endif() diff --git a/contrib/NuRaft b/contrib/NuRaft index 976874b7aa7..7ecb16844af 160000 --- a/contrib/NuRaft +++ b/contrib/NuRaft @@ -1 +1 @@ -Subproject commit 976874b7aa7f422bf4ea595bb7d1166c617b1c26 +Subproject commit 7ecb16844af6a9c283ad432d85ecc2e7d1544676 diff --git a/contrib/amqpcpp-cmake/CMakeLists.txt b/contrib/amqpcpp-cmake/CMakeLists.txt index 4e8342af125..5637db4cf41 100644 --- a/contrib/amqpcpp-cmake/CMakeLists.txt +++ b/contrib/amqpcpp-cmake/CMakeLists.txt @@ -10,11 +10,12 @@ set (SRCS "${LIBRARY_DIR}/src/deferredconsumer.cpp" "${LIBRARY_DIR}/src/deferredextreceiver.cpp" "${LIBRARY_DIR}/src/deferredget.cpp" - "${LIBRARY_DIR}/src/deferredpublisher.cpp" + "${LIBRARY_DIR}/src/deferredrecall.cpp" "${LIBRARY_DIR}/src/deferredreceiver.cpp" "${LIBRARY_DIR}/src/field.cpp" "${LIBRARY_DIR}/src/flags.cpp" "${LIBRARY_DIR}/src/linux_tcp/openssl.cpp" + "${LIBRARY_DIR}/src/linux_tcp/sslerrorprinter.cpp" "${LIBRARY_DIR}/src/linux_tcp/tcpconnection.cpp" "${LIBRARY_DIR}/src/inbuffer.cpp" "${LIBRARY_DIR}/src/receivedframe.cpp" diff --git a/contrib/arrow b/contrib/arrow index debf751a129..078e21bad34 160000 --- a/contrib/arrow +++ b/contrib/arrow @@ -1 +1 @@ -Subproject commit debf751a129bdda9ff4d1e895e08957ff77000a1 +Subproject commit 078e21bad344747b7656ef2d7a4f7410a0a303eb diff --git a/contrib/arrow-cmake/CMakeLists.txt b/contrib/arrow-cmake/CMakeLists.txt index 2237be9913a..427379dc9b2 100644 --- a/contrib/arrow-cmake/CMakeLists.txt +++ b/contrib/arrow-cmake/CMakeLists.txt @@ -119,12 +119,9 @@ set(ORC_SRCS "${ORC_SOURCE_SRC_DIR}/ColumnWriter.cc" "${ORC_SOURCE_SRC_DIR}/Common.cc" "${ORC_SOURCE_SRC_DIR}/Compression.cc" - "${ORC_SOURCE_SRC_DIR}/Exceptions.cc" "${ORC_SOURCE_SRC_DIR}/Int128.cc" "${ORC_SOURCE_SRC_DIR}/LzoDecompressor.cc" "${ORC_SOURCE_SRC_DIR}/MemoryPool.cc" - "${ORC_SOURCE_SRC_DIR}/OrcFile.cc" - "${ORC_SOURCE_SRC_DIR}/Reader.cc" "${ORC_SOURCE_SRC_DIR}/RLE.cc" "${ORC_SOURCE_SRC_DIR}/RLEv1.cc" "${ORC_SOURCE_SRC_DIR}/RLEv2.cc" @@ -194,9 +191,18 @@ set(ARROW_SRCS "${LIBRARY_DIR}/compute/cast.cc" "${LIBRARY_DIR}/compute/exec.cc" "${LIBRARY_DIR}/compute/function.cc" + "${LIBRARY_DIR}/compute/function_internal.cc" "${LIBRARY_DIR}/compute/kernel.cc" "${LIBRARY_DIR}/compute/registry.cc" + "${LIBRARY_DIR}/compute/exec/exec_plan.cc" + "${LIBRARY_DIR}/compute/exec/expression.cc" + "${LIBRARY_DIR}/compute/exec/key_compare.cc" + "${LIBRARY_DIR}/compute/exec/key_encode.cc" + "${LIBRARY_DIR}/compute/exec/key_hash.cc" + "${LIBRARY_DIR}/compute/exec/key_map.cc" + "${LIBRARY_DIR}/compute/exec/util.cc" + "${LIBRARY_DIR}/compute/kernels/aggregate_basic.cc" "${LIBRARY_DIR}/compute/kernels/aggregate_mode.cc" "${LIBRARY_DIR}/compute/kernels/aggregate_quantile.cc" @@ -207,6 +213,7 @@ set(ARROW_SRCS "${LIBRARY_DIR}/compute/kernels/scalar_arithmetic.cc" "${LIBRARY_DIR}/compute/kernels/scalar_boolean.cc" "${LIBRARY_DIR}/compute/kernels/scalar_cast_boolean.cc" + "${LIBRARY_DIR}/compute/kernels/scalar_cast_dictionary.cc" "${LIBRARY_DIR}/compute/kernels/scalar_cast_internal.cc" "${LIBRARY_DIR}/compute/kernels/scalar_cast_nested.cc" "${LIBRARY_DIR}/compute/kernels/scalar_cast_numeric.cc" @@ -214,15 +221,18 @@ set(ARROW_SRCS "${LIBRARY_DIR}/compute/kernels/scalar_cast_temporal.cc" "${LIBRARY_DIR}/compute/kernels/scalar_compare.cc" "${LIBRARY_DIR}/compute/kernels/scalar_fill_null.cc" + "${LIBRARY_DIR}/compute/kernels/scalar_if_else.cc" "${LIBRARY_DIR}/compute/kernels/scalar_nested.cc" "${LIBRARY_DIR}/compute/kernels/scalar_set_lookup.cc" "${LIBRARY_DIR}/compute/kernels/scalar_string.cc" + "${LIBRARY_DIR}/compute/kernels/scalar_temporal.cc" "${LIBRARY_DIR}/compute/kernels/scalar_validity.cc" + "${LIBRARY_DIR}/compute/kernels/util_internal.cc" "${LIBRARY_DIR}/compute/kernels/vector_hash.cc" "${LIBRARY_DIR}/compute/kernels/vector_nested.cc" + "${LIBRARY_DIR}/compute/kernels/vector_replace.cc" "${LIBRARY_DIR}/compute/kernels/vector_selection.cc" "${LIBRARY_DIR}/compute/kernels/vector_sort.cc" - "${LIBRARY_DIR}/compute/kernels/util_internal.cc" "${LIBRARY_DIR}/csv/chunker.cc" "${LIBRARY_DIR}/csv/column_builder.cc" @@ -231,6 +241,7 @@ set(ARROW_SRCS "${LIBRARY_DIR}/csv/options.cc" "${LIBRARY_DIR}/csv/parser.cc" "${LIBRARY_DIR}/csv/reader.cc" + "${LIBRARY_DIR}/csv/writer.cc" "${LIBRARY_DIR}/ipc/dictionary.cc" "${LIBRARY_DIR}/ipc/feather.cc" @@ -247,6 +258,7 @@ set(ARROW_SRCS "${LIBRARY_DIR}/io/interfaces.cc" "${LIBRARY_DIR}/io/memory.cc" "${LIBRARY_DIR}/io/slow.cc" + "${LIBRARY_DIR}/io/stdio.cc" "${LIBRARY_DIR}/io/transform.cc" "${LIBRARY_DIR}/tensor/coo_converter.cc" @@ -257,9 +269,9 @@ set(ARROW_SRCS "${LIBRARY_DIR}/util/bit_block_counter.cc" "${LIBRARY_DIR}/util/bit_run_reader.cc" "${LIBRARY_DIR}/util/bit_util.cc" - "${LIBRARY_DIR}/util/bitmap.cc" "${LIBRARY_DIR}/util/bitmap_builders.cc" "${LIBRARY_DIR}/util/bitmap_ops.cc" + "${LIBRARY_DIR}/util/bitmap.cc" "${LIBRARY_DIR}/util/bpacking.cc" "${LIBRARY_DIR}/util/cancel.cc" "${LIBRARY_DIR}/util/compression.cc" diff --git a/contrib/boost b/contrib/boost index 1ccbb5a522a..9cf09dbfd55 160000 --- a/contrib/boost +++ b/contrib/boost @@ -1 +1 @@ -Subproject commit 1ccbb5a522a571ce83b606dbc2e1011c42ecccfb +Subproject commit 9cf09dbfd55a5c6202dedbdf40781a51b02c2675 diff --git a/contrib/boost-cmake/CMakeLists.txt b/contrib/boost-cmake/CMakeLists.txt index 9f6c5b1255d..675931d319f 100644 --- a/contrib/boost-cmake/CMakeLists.txt +++ b/contrib/boost-cmake/CMakeLists.txt @@ -13,11 +13,12 @@ if (NOT USE_INTERNAL_BOOST_LIBRARY) regex context coroutine + graph ) if(Boost_INCLUDE_DIR AND Boost_FILESYSTEM_LIBRARY AND Boost_FILESYSTEM_LIBRARY AND Boost_PROGRAM_OPTIONS_LIBRARY AND Boost_REGEX_LIBRARY AND Boost_SYSTEM_LIBRARY AND Boost_CONTEXT_LIBRARY AND - Boost_COROUTINE_LIBRARY) + Boost_COROUTINE_LIBRARY AND Boost_GRAPH_LIBRARY) set(EXTERNAL_BOOST_FOUND 1) @@ -32,6 +33,7 @@ if (NOT USE_INTERNAL_BOOST_LIBRARY) add_library (_boost_system INTERFACE) add_library (_boost_context INTERFACE) add_library (_boost_coroutine INTERFACE) + add_library (_boost_graph INTERFACE) target_link_libraries (_boost_filesystem INTERFACE ${Boost_FILESYSTEM_LIBRARY}) target_link_libraries (_boost_iostreams INTERFACE ${Boost_IOSTREAMS_LIBRARY}) @@ -40,6 +42,7 @@ if (NOT USE_INTERNAL_BOOST_LIBRARY) target_link_libraries (_boost_system INTERFACE ${Boost_SYSTEM_LIBRARY}) target_link_libraries (_boost_context INTERFACE ${Boost_CONTEXT_LIBRARY}) target_link_libraries (_boost_coroutine INTERFACE ${Boost_COROUTINE_LIBRARY}) + target_link_libraries (_boost_graph INTERFACE ${Boost_GRAPH_LIBRARY}) add_library (boost::filesystem ALIAS _boost_filesystem) add_library (boost::iostreams ALIAS _boost_iostreams) @@ -48,6 +51,7 @@ if (NOT USE_INTERNAL_BOOST_LIBRARY) add_library (boost::system ALIAS _boost_system) add_library (boost::context ALIAS _boost_context) add_library (boost::coroutine ALIAS _boost_coroutine) + add_library (boost::graph ALIAS _boost_graph) else() set(EXTERNAL_BOOST_FOUND 0) message (${RECONFIGURE_MESSAGE_LEVEL} "Can't find system boost") @@ -221,4 +225,17 @@ if (NOT EXTERNAL_BOOST_FOUND) add_library (boost::coroutine ALIAS _boost_coroutine) target_include_directories (_boost_coroutine PRIVATE ${LIBRARY_DIR}) target_link_libraries(_boost_coroutine PRIVATE _boost_context) + + # graph + + set (SRCS_GRAPH + "${LIBRARY_DIR}/libs/graph/src/graphml.cpp" + "${LIBRARY_DIR}/libs/graph/src/read_graphviz_new.cpp" + ) + + add_library (_boost_graph ${SRCS_GRAPH}) + add_library (boost::graph ALIAS _boost_graph) + target_include_directories (_boost_graph PRIVATE ${LIBRARY_DIR}) + target_link_libraries(_boost_graph PRIVATE _boost_regex) + endif () diff --git a/contrib/bzip2 b/contrib/bzip2 new file mode 160000 index 00000000000..bf905ea2251 --- /dev/null +++ b/contrib/bzip2 @@ -0,0 +1 @@ +Subproject commit bf905ea2251191ff9911ae7ec0cfc35d41f9f7f6 diff --git a/contrib/bzip2-cmake/CMakeLists.txt b/contrib/bzip2-cmake/CMakeLists.txt new file mode 100644 index 00000000000..a9d2efa43c1 --- /dev/null +++ b/contrib/bzip2-cmake/CMakeLists.txt @@ -0,0 +1,23 @@ +set(BZIP2_SOURCE_DIR "${ClickHouse_SOURCE_DIR}/contrib/bzip2") +set(BZIP2_BINARY_DIR "${ClickHouse_BINARY_DIR}/contrib/bzip2") + +set(SRCS + "${BZIP2_SOURCE_DIR}/blocksort.c" + "${BZIP2_SOURCE_DIR}/huffman.c" + "${BZIP2_SOURCE_DIR}/crctable.c" + "${BZIP2_SOURCE_DIR}/randtable.c" + "${BZIP2_SOURCE_DIR}/compress.c" + "${BZIP2_SOURCE_DIR}/decompress.c" + "${BZIP2_SOURCE_DIR}/bzlib.c" +) + +# From bzip2/CMakeLists.txt +set(BZ_VERSION "1.0.7") +configure_file ( + "${BZIP2_SOURCE_DIR}/bz_version.h.in" + "${BZIP2_BINARY_DIR}/bz_version.h" +) + +add_library(bzip2 ${SRCS}) + +target_include_directories(bzip2 PUBLIC "${BZIP2_SOURCE_DIR}" "${BZIP2_BINARY_DIR}") diff --git a/contrib/croaring-cmake/CMakeLists.txt b/contrib/croaring-cmake/CMakeLists.txt index f4a5d8a01dc..3d327d068c1 100644 --- a/contrib/croaring-cmake/CMakeLists.txt +++ b/contrib/croaring-cmake/CMakeLists.txt @@ -24,3 +24,15 @@ add_library(roaring ${SRCS}) target_include_directories(roaring PRIVATE "${LIBRARY_DIR}/include/roaring") target_include_directories(roaring SYSTEM BEFORE PUBLIC "${LIBRARY_DIR}/include") target_include_directories(roaring SYSTEM BEFORE PUBLIC "${LIBRARY_DIR}/cpp") + +# We redirect malloc/free family of functions to different functions that will track memory in ClickHouse. +# Also note that we exploit implicit function declarations. +target_compile_definitions(roaring PRIVATE + -Dmalloc=clickhouse_malloc + -Dcalloc=clickhouse_calloc + -Drealloc=clickhouse_realloc + -Dreallocarray=clickhouse_reallocarray + -Dfree=clickhouse_free + -Dposix_memalign=clickhouse_posix_memalign) + +target_link_libraries(roaring PUBLIC clickhouse_common_io) diff --git a/contrib/h3 b/contrib/h3 index e209086ae1b..c7f46cfd71f 160000 --- a/contrib/h3 +++ b/contrib/h3 @@ -1 +1 @@ -Subproject commit e209086ae1b5477307f545a0f6111780edc59940 +Subproject commit c7f46cfd71fb60e2fefc90e28abe81657deff735 diff --git a/contrib/h3-cmake/CMakeLists.txt b/contrib/h3-cmake/CMakeLists.txt index 6b184a175b0..f4c70dc476f 100644 --- a/contrib/h3-cmake/CMakeLists.txt +++ b/contrib/h3-cmake/CMakeLists.txt @@ -3,21 +3,22 @@ set(H3_BINARY_DIR "${ClickHouse_BINARY_DIR}/contrib/h3/src/h3lib") set(SRCS "${H3_SOURCE_DIR}/lib/algos.c" -"${H3_SOURCE_DIR}/lib/baseCells.c" -"${H3_SOURCE_DIR}/lib/bbox.c" "${H3_SOURCE_DIR}/lib/coordijk.c" -"${H3_SOURCE_DIR}/lib/faceijk.c" -"${H3_SOURCE_DIR}/lib/geoCoord.c" -"${H3_SOURCE_DIR}/lib/h3Index.c" -"${H3_SOURCE_DIR}/lib/h3UniEdge.c" -"${H3_SOURCE_DIR}/lib/linkedGeo.c" -"${H3_SOURCE_DIR}/lib/localij.c" -"${H3_SOURCE_DIR}/lib/mathExtensions.c" +"${H3_SOURCE_DIR}/lib/bbox.c" "${H3_SOURCE_DIR}/lib/polygon.c" +"${H3_SOURCE_DIR}/lib/h3Index.c" "${H3_SOURCE_DIR}/lib/vec2d.c" "${H3_SOURCE_DIR}/lib/vec3d.c" "${H3_SOURCE_DIR}/lib/vertex.c" +"${H3_SOURCE_DIR}/lib/linkedGeo.c" +"${H3_SOURCE_DIR}/lib/localij.c" +"${H3_SOURCE_DIR}/lib/latLng.c" +"${H3_SOURCE_DIR}/lib/directedEdge.c" +"${H3_SOURCE_DIR}/lib/mathExtensions.c" +"${H3_SOURCE_DIR}/lib/iterators.c" "${H3_SOURCE_DIR}/lib/vertexGraph.c" +"${H3_SOURCE_DIR}/lib/faceijk.c" +"${H3_SOURCE_DIR}/lib/baseCells.c" ) configure_file("${H3_SOURCE_DIR}/include/h3api.h.in" "${H3_BINARY_DIR}/include/h3api.h") diff --git a/contrib/jemalloc-cmake/CMakeLists.txt b/contrib/jemalloc-cmake/CMakeLists.txt index 9531a5a4f9e..52208bb0278 100644 --- a/contrib/jemalloc-cmake/CMakeLists.txt +++ b/contrib/jemalloc-cmake/CMakeLists.txt @@ -1,10 +1,9 @@ +# Disabled under OSX until https://github.com/ClickHouse/ClickHouse/issues/27568 is fixed if (SANITIZE OR NOT ( - ((OS_LINUX OR OS_FREEBSD) AND (ARCH_AMD64 OR ARCH_ARM OR ARCH_PPC64LE)) OR - (OS_DARWIN AND (CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo" OR CMAKE_BUILD_TYPE STREQUAL "Debug")) -)) + ((OS_LINUX OR OS_FREEBSD) AND (ARCH_AMD64 OR ARCH_ARM OR ARCH_PPC64LE)))) if (ENABLE_JEMALLOC) message (${RECONFIGURE_MESSAGE_LEVEL} - "jemalloc is disabled implicitly: it doesn't work with sanitizers and can only be used with x86_64, aarch64, or ppc64le Linux or FreeBSD builds and RelWithDebInfo macOS builds.") + "jemalloc is disabled implicitly: it doesn't work with sanitizers and can only be used with x86_64, aarch64, or ppc64le Linux or FreeBSD builds") endif () set (ENABLE_JEMALLOC OFF) else () diff --git a/contrib/lemmagen-c b/contrib/lemmagen-c new file mode 160000 index 00000000000..59537bdcf57 --- /dev/null +++ b/contrib/lemmagen-c @@ -0,0 +1 @@ +Subproject commit 59537bdcf57bbed17913292cb4502d15657231f1 diff --git a/contrib/lemmagen-c-cmake/CMakeLists.txt b/contrib/lemmagen-c-cmake/CMakeLists.txt new file mode 100644 index 00000000000..b5b92b774e1 --- /dev/null +++ b/contrib/lemmagen-c-cmake/CMakeLists.txt @@ -0,0 +1,9 @@ +set(LIBRARY_DIR "${ClickHouse_SOURCE_DIR}/contrib/lemmagen-c") +set(LEMMAGEN_INCLUDE_DIR "${LIBRARY_DIR}/include") + +set(SRCS + "${LIBRARY_DIR}/src/RdrLemmatizer.cpp" +) + +add_library(lemmagen STATIC ${SRCS}) +target_include_directories(lemmagen PUBLIC "${LEMMAGEN_INCLUDE_DIR}") diff --git a/contrib/libmetrohash/CMakeLists.txt b/contrib/libmetrohash/CMakeLists.txt index 9304cb3644c..4ec5a58717d 100644 --- a/contrib/libmetrohash/CMakeLists.txt +++ b/contrib/libmetrohash/CMakeLists.txt @@ -2,9 +2,5 @@ set (SRCS src/metrohash64.cpp src/metrohash128.cpp ) -if (HAVE_SSE42) # Not used. Pretty easy to port. - list (APPEND SRCS src/metrohash128crc.cpp) -endif () - add_library(metrohash ${SRCS}) target_include_directories(metrohash PUBLIC src) diff --git a/contrib/libstemmer-c-cmake/CMakeLists.txt b/contrib/libstemmer-c-cmake/CMakeLists.txt new file mode 100644 index 00000000000..2d38e5f3612 --- /dev/null +++ b/contrib/libstemmer-c-cmake/CMakeLists.txt @@ -0,0 +1,31 @@ +set(LIBRARY_DIR "${ClickHouse_SOURCE_DIR}/contrib/libstemmer_c") +set(STEMMER_INCLUDE_DIR "${LIBRARY_DIR}/include") + +FILE ( READ "${LIBRARY_DIR}/mkinc.mak" _CONTENT ) +# replace '\ ' into one big line +STRING ( REGEX REPLACE "\\\\\n " " ${LIBRARY_DIR}/" _CONTENT "${_CONTENT}" ) +# escape ';' (if any) +STRING ( REGEX REPLACE ";" "\\\\;" _CONTENT "${_CONTENT}" ) +# now replace lf into ';' (it makes list from the line) +STRING ( REGEX REPLACE "\n" ";" _CONTENT "${_CONTENT}" ) +FOREACH ( LINE ${_CONTENT} ) + # skip comments (beginning with #) + IF ( NOT "${LINE}" MATCHES "^#.*" ) + # parse 'name=value1 value2..." - extract the 'name' part + STRING ( REGEX REPLACE "=.*$" "" _NAME "${LINE}" ) + # extract the list of values part + STRING ( REGEX REPLACE "^.*=" "" _LIST "${LINE}" ) + # replace (multi)spaces into ';' (it makes list from the line) + STRING ( REGEX REPLACE " +" ";" _LIST "${_LIST}" ) + # finally get our two variables + IF ( "${_NAME}" MATCHES "snowball_sources" ) + SET ( _SOURCES "${_LIST}" ) + ELSEIF ( "${_NAME}" MATCHES "snowball_headers" ) + SET ( _HEADERS "${_LIST}" ) + ENDIF () + endif () +endforeach () + +# all the sources parsed. Now just add the lib +add_library ( stemmer STATIC ${_SOURCES} ${_HEADERS} ) +target_include_directories (stemmer PUBLIC "${STEMMER_INCLUDE_DIR}") diff --git a/contrib/libstemmer_c b/contrib/libstemmer_c new file mode 160000 index 00000000000..c753054304d --- /dev/null +++ b/contrib/libstemmer_c @@ -0,0 +1 @@ +Subproject commit c753054304d87daf460057c1a649c482aa094835 diff --git a/contrib/nuraft-cmake/CMakeLists.txt b/contrib/nuraft-cmake/CMakeLists.txt index 725e86195e1..d9e0aa6efc7 100644 --- a/contrib/nuraft-cmake/CMakeLists.txt +++ b/contrib/nuraft-cmake/CMakeLists.txt @@ -22,6 +22,7 @@ set(SRCS "${LIBRARY_DIR}/src/launcher.cxx" "${LIBRARY_DIR}/src/srv_config.cxx" "${LIBRARY_DIR}/src/snapshot_sync_req.cxx" + "${LIBRARY_DIR}/src/snapshot_sync_ctx.cxx" "${LIBRARY_DIR}/src/handle_timeout.cxx" "${LIBRARY_DIR}/src/handle_append_entries.cxx" "${LIBRARY_DIR}/src/cluster_config.cxx" diff --git a/contrib/poco b/contrib/poco index 59945069080..7351c4691b5 160000 --- a/contrib/poco +++ b/contrib/poco @@ -1 +1 @@ -Subproject commit 5994506908028612869fee627d68d8212dfe7c1e +Subproject commit 7351c4691b5d401f59e3959adfc5b4fa263b32da diff --git a/contrib/protobuf b/contrib/protobuf index 73b12814204..75601841d17 160000 --- a/contrib/protobuf +++ b/contrib/protobuf @@ -1 +1 @@ -Subproject commit 73b12814204ad9068ba352914d0dc244648b48ee +Subproject commit 75601841d172c73ae6bf4ce8121f42b875cdbabd diff --git a/contrib/rocksdb b/contrib/rocksdb index 07c77549a20..b6480c69bf3 160000 --- a/contrib/rocksdb +++ b/contrib/rocksdb @@ -1 +1 @@ -Subproject commit 07c77549a20b63ff6981b400085eba36bb5c80c4 +Subproject commit b6480c69bf3ab6e298e0d019a07fd4f69029b26a diff --git a/contrib/rocksdb-cmake/CMakeLists.txt b/contrib/rocksdb-cmake/CMakeLists.txt index bccc9ed5294..e7ff1f548e3 100644 --- a/contrib/rocksdb-cmake/CMakeLists.txt +++ b/contrib/rocksdb-cmake/CMakeLists.txt @@ -70,11 +70,6 @@ else() endif() endif() -set(BUILD_VERSION_CC rocksdb_build_version.cc) -add_library(rocksdb_build_version OBJECT ${BUILD_VERSION_CC}) - -target_include_directories(rocksdb_build_version PRIVATE "${ROCKSDB_SOURCE_DIR}/util") - include(CheckCCompilerFlag) if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64") CHECK_C_COMPILER_FLAG("-mcpu=power9" HAS_POWER9) @@ -243,272 +238,293 @@ find_package(Threads REQUIRED) # Main library source code set(SOURCES - "${ROCKSDB_SOURCE_DIR}/cache/cache.cc" - "${ROCKSDB_SOURCE_DIR}/cache/clock_cache.cc" - "${ROCKSDB_SOURCE_DIR}/cache/lru_cache.cc" - "${ROCKSDB_SOURCE_DIR}/cache/sharded_cache.cc" - "${ROCKSDB_SOURCE_DIR}/db/arena_wrapped_db_iter.cc" - "${ROCKSDB_SOURCE_DIR}/db/blob/blob_file_addition.cc" - "${ROCKSDB_SOURCE_DIR}/db/blob/blob_file_builder.cc" - "${ROCKSDB_SOURCE_DIR}/db/blob/blob_file_cache.cc" - "${ROCKSDB_SOURCE_DIR}/db/blob/blob_file_garbage.cc" - "${ROCKSDB_SOURCE_DIR}/db/blob/blob_file_meta.cc" - "${ROCKSDB_SOURCE_DIR}/db/blob/blob_file_reader.cc" - "${ROCKSDB_SOURCE_DIR}/db/blob/blob_log_format.cc" - "${ROCKSDB_SOURCE_DIR}/db/blob/blob_log_sequential_reader.cc" - "${ROCKSDB_SOURCE_DIR}/db/blob/blob_log_writer.cc" - "${ROCKSDB_SOURCE_DIR}/db/builder.cc" - "${ROCKSDB_SOURCE_DIR}/db/c.cc" - "${ROCKSDB_SOURCE_DIR}/db/column_family.cc" - "${ROCKSDB_SOURCE_DIR}/db/compacted_db_impl.cc" - "${ROCKSDB_SOURCE_DIR}/db/compaction/compaction.cc" - "${ROCKSDB_SOURCE_DIR}/db/compaction/compaction_iterator.cc" - "${ROCKSDB_SOURCE_DIR}/db/compaction/compaction_picker.cc" - "${ROCKSDB_SOURCE_DIR}/db/compaction/compaction_job.cc" - "${ROCKSDB_SOURCE_DIR}/db/compaction/compaction_picker_fifo.cc" - "${ROCKSDB_SOURCE_DIR}/db/compaction/compaction_picker_level.cc" - "${ROCKSDB_SOURCE_DIR}/db/compaction/compaction_picker_universal.cc" - "${ROCKSDB_SOURCE_DIR}/db/compaction/sst_partitioner.cc" - "${ROCKSDB_SOURCE_DIR}/db/convenience.cc" - "${ROCKSDB_SOURCE_DIR}/db/db_filesnapshot.cc" - "${ROCKSDB_SOURCE_DIR}/db/db_impl/db_impl.cc" - "${ROCKSDB_SOURCE_DIR}/db/db_impl/db_impl_write.cc" - "${ROCKSDB_SOURCE_DIR}/db/db_impl/db_impl_compaction_flush.cc" - "${ROCKSDB_SOURCE_DIR}/db/db_impl/db_impl_files.cc" - "${ROCKSDB_SOURCE_DIR}/db/db_impl/db_impl_open.cc" - "${ROCKSDB_SOURCE_DIR}/db/db_impl/db_impl_debug.cc" - "${ROCKSDB_SOURCE_DIR}/db/db_impl/db_impl_experimental.cc" - "${ROCKSDB_SOURCE_DIR}/db/db_impl/db_impl_readonly.cc" - "${ROCKSDB_SOURCE_DIR}/db/db_impl/db_impl_secondary.cc" - "${ROCKSDB_SOURCE_DIR}/db/db_info_dumper.cc" - "${ROCKSDB_SOURCE_DIR}/db/db_iter.cc" - "${ROCKSDB_SOURCE_DIR}/db/dbformat.cc" - "${ROCKSDB_SOURCE_DIR}/db/error_handler.cc" - "${ROCKSDB_SOURCE_DIR}/db/event_helpers.cc" - "${ROCKSDB_SOURCE_DIR}/db/experimental.cc" - "${ROCKSDB_SOURCE_DIR}/db/external_sst_file_ingestion_job.cc" - "${ROCKSDB_SOURCE_DIR}/db/file_indexer.cc" - "${ROCKSDB_SOURCE_DIR}/db/flush_job.cc" - "${ROCKSDB_SOURCE_DIR}/db/flush_scheduler.cc" - "${ROCKSDB_SOURCE_DIR}/db/forward_iterator.cc" - "${ROCKSDB_SOURCE_DIR}/db/import_column_family_job.cc" - "${ROCKSDB_SOURCE_DIR}/db/internal_stats.cc" - "${ROCKSDB_SOURCE_DIR}/db/logs_with_prep_tracker.cc" - "${ROCKSDB_SOURCE_DIR}/db/log_reader.cc" - "${ROCKSDB_SOURCE_DIR}/db/log_writer.cc" - "${ROCKSDB_SOURCE_DIR}/db/malloc_stats.cc" - "${ROCKSDB_SOURCE_DIR}/db/memtable.cc" - "${ROCKSDB_SOURCE_DIR}/db/memtable_list.cc" - "${ROCKSDB_SOURCE_DIR}/db/merge_helper.cc" - "${ROCKSDB_SOURCE_DIR}/db/merge_operator.cc" - "${ROCKSDB_SOURCE_DIR}/db/output_validator.cc" - "${ROCKSDB_SOURCE_DIR}/db/periodic_work_scheduler.cc" - "${ROCKSDB_SOURCE_DIR}/db/range_del_aggregator.cc" - "${ROCKSDB_SOURCE_DIR}/db/range_tombstone_fragmenter.cc" - "${ROCKSDB_SOURCE_DIR}/db/repair.cc" - "${ROCKSDB_SOURCE_DIR}/db/snapshot_impl.cc" - "${ROCKSDB_SOURCE_DIR}/db/table_cache.cc" - "${ROCKSDB_SOURCE_DIR}/db/table_properties_collector.cc" - "${ROCKSDB_SOURCE_DIR}/db/transaction_log_impl.cc" - "${ROCKSDB_SOURCE_DIR}/db/trim_history_scheduler.cc" - "${ROCKSDB_SOURCE_DIR}/db/version_builder.cc" - "${ROCKSDB_SOURCE_DIR}/db/version_edit.cc" - "${ROCKSDB_SOURCE_DIR}/db/version_edit_handler.cc" - "${ROCKSDB_SOURCE_DIR}/db/version_set.cc" - "${ROCKSDB_SOURCE_DIR}/db/wal_edit.cc" - "${ROCKSDB_SOURCE_DIR}/db/wal_manager.cc" - "${ROCKSDB_SOURCE_DIR}/db/write_batch.cc" - "${ROCKSDB_SOURCE_DIR}/db/write_batch_base.cc" - "${ROCKSDB_SOURCE_DIR}/db/write_controller.cc" - "${ROCKSDB_SOURCE_DIR}/db/write_thread.cc" - "${ROCKSDB_SOURCE_DIR}/env/env.cc" - "${ROCKSDB_SOURCE_DIR}/env/env_chroot.cc" - "${ROCKSDB_SOURCE_DIR}/env/env_encryption.cc" - "${ROCKSDB_SOURCE_DIR}/env/env_hdfs.cc" - "${ROCKSDB_SOURCE_DIR}/env/file_system.cc" - "${ROCKSDB_SOURCE_DIR}/env/file_system_tracer.cc" - "${ROCKSDB_SOURCE_DIR}/env/mock_env.cc" - "${ROCKSDB_SOURCE_DIR}/file/delete_scheduler.cc" - "${ROCKSDB_SOURCE_DIR}/file/file_prefetch_buffer.cc" - "${ROCKSDB_SOURCE_DIR}/file/file_util.cc" - "${ROCKSDB_SOURCE_DIR}/file/filename.cc" - "${ROCKSDB_SOURCE_DIR}/file/random_access_file_reader.cc" - "${ROCKSDB_SOURCE_DIR}/file/read_write_util.cc" - "${ROCKSDB_SOURCE_DIR}/file/readahead_raf.cc" - "${ROCKSDB_SOURCE_DIR}/file/sequence_file_reader.cc" - "${ROCKSDB_SOURCE_DIR}/file/sst_file_manager_impl.cc" - "${ROCKSDB_SOURCE_DIR}/file/writable_file_writer.cc" - "${ROCKSDB_SOURCE_DIR}/logging/auto_roll_logger.cc" - "${ROCKSDB_SOURCE_DIR}/logging/event_logger.cc" - "${ROCKSDB_SOURCE_DIR}/logging/log_buffer.cc" - "${ROCKSDB_SOURCE_DIR}/memory/arena.cc" - "${ROCKSDB_SOURCE_DIR}/memory/concurrent_arena.cc" - "${ROCKSDB_SOURCE_DIR}/memory/jemalloc_nodump_allocator.cc" - "${ROCKSDB_SOURCE_DIR}/memory/memkind_kmem_allocator.cc" - "${ROCKSDB_SOURCE_DIR}/memtable/alloc_tracker.cc" - "${ROCKSDB_SOURCE_DIR}/memtable/hash_linklist_rep.cc" - "${ROCKSDB_SOURCE_DIR}/memtable/hash_skiplist_rep.cc" - "${ROCKSDB_SOURCE_DIR}/memtable/skiplistrep.cc" - "${ROCKSDB_SOURCE_DIR}/memtable/vectorrep.cc" - "${ROCKSDB_SOURCE_DIR}/memtable/write_buffer_manager.cc" - "${ROCKSDB_SOURCE_DIR}/monitoring/histogram.cc" - "${ROCKSDB_SOURCE_DIR}/monitoring/histogram_windowing.cc" - "${ROCKSDB_SOURCE_DIR}/monitoring/in_memory_stats_history.cc" - "${ROCKSDB_SOURCE_DIR}/monitoring/instrumented_mutex.cc" - "${ROCKSDB_SOURCE_DIR}/monitoring/iostats_context.cc" - "${ROCKSDB_SOURCE_DIR}/monitoring/perf_context.cc" - "${ROCKSDB_SOURCE_DIR}/monitoring/perf_level.cc" - "${ROCKSDB_SOURCE_DIR}/monitoring/persistent_stats_history.cc" - "${ROCKSDB_SOURCE_DIR}/monitoring/statistics.cc" - "${ROCKSDB_SOURCE_DIR}/monitoring/thread_status_impl.cc" - "${ROCKSDB_SOURCE_DIR}/monitoring/thread_status_updater.cc" - "${ROCKSDB_SOURCE_DIR}/monitoring/thread_status_util.cc" - "${ROCKSDB_SOURCE_DIR}/monitoring/thread_status_util_debug.cc" - "${ROCKSDB_SOURCE_DIR}/options/cf_options.cc" - "${ROCKSDB_SOURCE_DIR}/options/configurable.cc" - "${ROCKSDB_SOURCE_DIR}/options/customizable.cc" - "${ROCKSDB_SOURCE_DIR}/options/db_options.cc" - "${ROCKSDB_SOURCE_DIR}/options/options.cc" - "${ROCKSDB_SOURCE_DIR}/options/options_helper.cc" - "${ROCKSDB_SOURCE_DIR}/options/options_parser.cc" - "${ROCKSDB_SOURCE_DIR}/port/stack_trace.cc" - "${ROCKSDB_SOURCE_DIR}/table/adaptive/adaptive_table_factory.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/binary_search_index_reader.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/block.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/block_based_filter_block.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/block_based_table_builder.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/block_based_table_factory.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/block_based_table_iterator.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/block_based_table_reader.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/block_builder.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/block_prefetcher.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/block_prefix_index.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/data_block_hash_index.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/data_block_footer.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/filter_block_reader_common.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/filter_policy.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/flush_block_policy.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/full_filter_block.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/hash_index_reader.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/index_builder.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/index_reader_common.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/parsed_full_filter_block.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/partitioned_filter_block.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/partitioned_index_iterator.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/partitioned_index_reader.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/reader_common.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_based/uncompression_dict_reader.cc" - "${ROCKSDB_SOURCE_DIR}/table/block_fetcher.cc" - "${ROCKSDB_SOURCE_DIR}/table/cuckoo/cuckoo_table_builder.cc" - "${ROCKSDB_SOURCE_DIR}/table/cuckoo/cuckoo_table_factory.cc" - "${ROCKSDB_SOURCE_DIR}/table/cuckoo/cuckoo_table_reader.cc" - "${ROCKSDB_SOURCE_DIR}/table/format.cc" - "${ROCKSDB_SOURCE_DIR}/table/get_context.cc" - "${ROCKSDB_SOURCE_DIR}/table/iterator.cc" - "${ROCKSDB_SOURCE_DIR}/table/merging_iterator.cc" - "${ROCKSDB_SOURCE_DIR}/table/meta_blocks.cc" - "${ROCKSDB_SOURCE_DIR}/table/persistent_cache_helper.cc" - "${ROCKSDB_SOURCE_DIR}/table/plain/plain_table_bloom.cc" - "${ROCKSDB_SOURCE_DIR}/table/plain/plain_table_builder.cc" - "${ROCKSDB_SOURCE_DIR}/table/plain/plain_table_factory.cc" - "${ROCKSDB_SOURCE_DIR}/table/plain/plain_table_index.cc" - "${ROCKSDB_SOURCE_DIR}/table/plain/plain_table_key_coding.cc" - "${ROCKSDB_SOURCE_DIR}/table/plain/plain_table_reader.cc" - "${ROCKSDB_SOURCE_DIR}/table/sst_file_dumper.cc" - "${ROCKSDB_SOURCE_DIR}/table/sst_file_reader.cc" - "${ROCKSDB_SOURCE_DIR}/table/sst_file_writer.cc" - "${ROCKSDB_SOURCE_DIR}/table/table_factory.cc" - "${ROCKSDB_SOURCE_DIR}/table/table_properties.cc" - "${ROCKSDB_SOURCE_DIR}/table/two_level_iterator.cc" - "${ROCKSDB_SOURCE_DIR}/test_util/sync_point.cc" - "${ROCKSDB_SOURCE_DIR}/test_util/sync_point_impl.cc" - "${ROCKSDB_SOURCE_DIR}/test_util/testutil.cc" - "${ROCKSDB_SOURCE_DIR}/test_util/transaction_test_util.cc" - "${ROCKSDB_SOURCE_DIR}/tools/block_cache_analyzer/block_cache_trace_analyzer.cc" - "${ROCKSDB_SOURCE_DIR}/tools/dump/db_dump_tool.cc" - "${ROCKSDB_SOURCE_DIR}/tools/io_tracer_parser_tool.cc" - "${ROCKSDB_SOURCE_DIR}/tools/ldb_cmd.cc" - "${ROCKSDB_SOURCE_DIR}/tools/ldb_tool.cc" - "${ROCKSDB_SOURCE_DIR}/tools/sst_dump_tool.cc" - "${ROCKSDB_SOURCE_DIR}/tools/trace_analyzer_tool.cc" - "${ROCKSDB_SOURCE_DIR}/trace_replay/trace_replay.cc" - "${ROCKSDB_SOURCE_DIR}/trace_replay/block_cache_tracer.cc" - "${ROCKSDB_SOURCE_DIR}/trace_replay/io_tracer.cc" - "${ROCKSDB_SOURCE_DIR}/util/coding.cc" - "${ROCKSDB_SOURCE_DIR}/util/compaction_job_stats_impl.cc" - "${ROCKSDB_SOURCE_DIR}/util/comparator.cc" - "${ROCKSDB_SOURCE_DIR}/util/compression_context_cache.cc" - "${ROCKSDB_SOURCE_DIR}/util/concurrent_task_limiter_impl.cc" - "${ROCKSDB_SOURCE_DIR}/util/crc32c.cc" - "${ROCKSDB_SOURCE_DIR}/util/dynamic_bloom.cc" - "${ROCKSDB_SOURCE_DIR}/util/hash.cc" - "${ROCKSDB_SOURCE_DIR}/util/murmurhash.cc" - "${ROCKSDB_SOURCE_DIR}/util/random.cc" - "${ROCKSDB_SOURCE_DIR}/util/rate_limiter.cc" - "${ROCKSDB_SOURCE_DIR}/util/slice.cc" - "${ROCKSDB_SOURCE_DIR}/util/file_checksum_helper.cc" - "${ROCKSDB_SOURCE_DIR}/util/status.cc" - "${ROCKSDB_SOURCE_DIR}/util/string_util.cc" - "${ROCKSDB_SOURCE_DIR}/util/thread_local.cc" - "${ROCKSDB_SOURCE_DIR}/util/threadpool_imp.cc" - "${ROCKSDB_SOURCE_DIR}/util/xxhash.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/backupable/backupable_db.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/blob_db/blob_compaction_filter.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/blob_db/blob_db.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/blob_db/blob_db_impl.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/blob_db/blob_db_impl_filesnapshot.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/blob_db/blob_dump_tool.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/blob_db/blob_file.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/cassandra/cassandra_compaction_filter.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/cassandra/format.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/cassandra/merge_operator.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/checkpoint/checkpoint_impl.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/debug.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/env_mirror.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/env_timed.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/fault_injection_env.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/fault_injection_fs.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/leveldb_options/leveldb_options.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/memory/memory_util.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/merge_operators/bytesxor.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/merge_operators/max.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/merge_operators/put.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/merge_operators/sortlist.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/merge_operators/string_append/stringappend.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/merge_operators/string_append/stringappend2.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/merge_operators/uint64add.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/object_registry.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/option_change_migration/option_change_migration.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/options/options_util.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/persistent_cache/block_cache_tier.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/persistent_cache/block_cache_tier_file.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/persistent_cache/block_cache_tier_metadata.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/persistent_cache/persistent_cache_tier.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/persistent_cache/volatile_tier_impl.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/simulator_cache/cache_simulator.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/simulator_cache/sim_cache.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/table_properties_collectors/compact_on_deletion_collector.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/trace/file_trace_reader_writer.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/transactions/lock/lock_manager.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/transactions/lock/point/point_lock_tracker.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/transactions/lock/point/point_lock_manager.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/transactions/optimistic_transaction_db_impl.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/transactions/optimistic_transaction.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/transactions/pessimistic_transaction.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/transactions/pessimistic_transaction_db.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/transactions/snapshot_checker.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/transactions/transaction_base.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/transactions/transaction_db_mutex_impl.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/transactions/transaction_util.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/transactions/write_prepared_txn.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/transactions/write_prepared_txn_db.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/transactions/write_unprepared_txn.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/transactions/write_unprepared_txn_db.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/ttl/db_ttl_impl.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/write_batch_with_index/write_batch_with_index.cc" - "${ROCKSDB_SOURCE_DIR}/utilities/write_batch_with_index/write_batch_with_index_internal.cc" - $) + ${ROCKSDB_SOURCE_DIR}/cache/cache.cc + ${ROCKSDB_SOURCE_DIR}/cache/cache_entry_roles.cc + ${ROCKSDB_SOURCE_DIR}/cache/clock_cache.cc + ${ROCKSDB_SOURCE_DIR}/cache/lru_cache.cc + ${ROCKSDB_SOURCE_DIR}/cache/sharded_cache.cc + ${ROCKSDB_SOURCE_DIR}/db/arena_wrapped_db_iter.cc + ${ROCKSDB_SOURCE_DIR}/db/blob/blob_fetcher.cc + ${ROCKSDB_SOURCE_DIR}/db/blob/blob_file_addition.cc + ${ROCKSDB_SOURCE_DIR}/db/blob/blob_file_builder.cc + ${ROCKSDB_SOURCE_DIR}/db/blob/blob_file_cache.cc + ${ROCKSDB_SOURCE_DIR}/db/blob/blob_file_garbage.cc + ${ROCKSDB_SOURCE_DIR}/db/blob/blob_file_meta.cc + ${ROCKSDB_SOURCE_DIR}/db/blob/blob_file_reader.cc + ${ROCKSDB_SOURCE_DIR}/db/blob/blob_garbage_meter.cc + ${ROCKSDB_SOURCE_DIR}/db/blob/blob_log_format.cc + ${ROCKSDB_SOURCE_DIR}/db/blob/blob_log_sequential_reader.cc + ${ROCKSDB_SOURCE_DIR}/db/blob/blob_log_writer.cc + ${ROCKSDB_SOURCE_DIR}/db/builder.cc + ${ROCKSDB_SOURCE_DIR}/db/c.cc + ${ROCKSDB_SOURCE_DIR}/db/column_family.cc + ${ROCKSDB_SOURCE_DIR}/db/compaction/compaction.cc + ${ROCKSDB_SOURCE_DIR}/db/compaction/compaction_iterator.cc + ${ROCKSDB_SOURCE_DIR}/db/compaction/compaction_picker.cc + ${ROCKSDB_SOURCE_DIR}/db/compaction/compaction_job.cc + ${ROCKSDB_SOURCE_DIR}/db/compaction/compaction_picker_fifo.cc + ${ROCKSDB_SOURCE_DIR}/db/compaction/compaction_picker_level.cc + ${ROCKSDB_SOURCE_DIR}/db/compaction/compaction_picker_universal.cc + ${ROCKSDB_SOURCE_DIR}/db/compaction/sst_partitioner.cc + ${ROCKSDB_SOURCE_DIR}/db/convenience.cc + ${ROCKSDB_SOURCE_DIR}/db/db_filesnapshot.cc + ${ROCKSDB_SOURCE_DIR}/db/db_impl/compacted_db_impl.cc + ${ROCKSDB_SOURCE_DIR}/db/db_impl/db_impl.cc + ${ROCKSDB_SOURCE_DIR}/db/db_impl/db_impl_write.cc + ${ROCKSDB_SOURCE_DIR}/db/db_impl/db_impl_compaction_flush.cc + ${ROCKSDB_SOURCE_DIR}/db/db_impl/db_impl_files.cc + ${ROCKSDB_SOURCE_DIR}/db/db_impl/db_impl_open.cc + ${ROCKSDB_SOURCE_DIR}/db/db_impl/db_impl_debug.cc + ${ROCKSDB_SOURCE_DIR}/db/db_impl/db_impl_experimental.cc + ${ROCKSDB_SOURCE_DIR}/db/db_impl/db_impl_readonly.cc + ${ROCKSDB_SOURCE_DIR}/db/db_impl/db_impl_secondary.cc + ${ROCKSDB_SOURCE_DIR}/db/db_info_dumper.cc + ${ROCKSDB_SOURCE_DIR}/db/db_iter.cc + ${ROCKSDB_SOURCE_DIR}/db/dbformat.cc + ${ROCKSDB_SOURCE_DIR}/db/error_handler.cc + ${ROCKSDB_SOURCE_DIR}/db/event_helpers.cc + ${ROCKSDB_SOURCE_DIR}/db/experimental.cc + ${ROCKSDB_SOURCE_DIR}/db/external_sst_file_ingestion_job.cc + ${ROCKSDB_SOURCE_DIR}/db/file_indexer.cc + ${ROCKSDB_SOURCE_DIR}/db/flush_job.cc + ${ROCKSDB_SOURCE_DIR}/db/flush_scheduler.cc + ${ROCKSDB_SOURCE_DIR}/db/forward_iterator.cc + ${ROCKSDB_SOURCE_DIR}/db/import_column_family_job.cc + ${ROCKSDB_SOURCE_DIR}/db/internal_stats.cc + ${ROCKSDB_SOURCE_DIR}/db/logs_with_prep_tracker.cc + ${ROCKSDB_SOURCE_DIR}/db/log_reader.cc + ${ROCKSDB_SOURCE_DIR}/db/log_writer.cc + ${ROCKSDB_SOURCE_DIR}/db/malloc_stats.cc + ${ROCKSDB_SOURCE_DIR}/db/memtable.cc + ${ROCKSDB_SOURCE_DIR}/db/memtable_list.cc + ${ROCKSDB_SOURCE_DIR}/db/merge_helper.cc + ${ROCKSDB_SOURCE_DIR}/db/merge_operator.cc + ${ROCKSDB_SOURCE_DIR}/db/output_validator.cc + ${ROCKSDB_SOURCE_DIR}/db/periodic_work_scheduler.cc + ${ROCKSDB_SOURCE_DIR}/db/range_del_aggregator.cc + ${ROCKSDB_SOURCE_DIR}/db/range_tombstone_fragmenter.cc + ${ROCKSDB_SOURCE_DIR}/db/repair.cc + ${ROCKSDB_SOURCE_DIR}/db/snapshot_impl.cc + ${ROCKSDB_SOURCE_DIR}/db/table_cache.cc + ${ROCKSDB_SOURCE_DIR}/db/table_properties_collector.cc + ${ROCKSDB_SOURCE_DIR}/db/transaction_log_impl.cc + ${ROCKSDB_SOURCE_DIR}/db/trim_history_scheduler.cc + ${ROCKSDB_SOURCE_DIR}/db/version_builder.cc + ${ROCKSDB_SOURCE_DIR}/db/version_edit.cc + ${ROCKSDB_SOURCE_DIR}/db/version_edit_handler.cc + ${ROCKSDB_SOURCE_DIR}/db/version_set.cc + ${ROCKSDB_SOURCE_DIR}/db/wal_edit.cc + ${ROCKSDB_SOURCE_DIR}/db/wal_manager.cc + ${ROCKSDB_SOURCE_DIR}/db/write_batch.cc + ${ROCKSDB_SOURCE_DIR}/db/write_batch_base.cc + ${ROCKSDB_SOURCE_DIR}/db/write_controller.cc + ${ROCKSDB_SOURCE_DIR}/db/write_thread.cc + ${ROCKSDB_SOURCE_DIR}/env/composite_env.cc + ${ROCKSDB_SOURCE_DIR}/env/env.cc + ${ROCKSDB_SOURCE_DIR}/env/env_chroot.cc + ${ROCKSDB_SOURCE_DIR}/env/env_encryption.cc + ${ROCKSDB_SOURCE_DIR}/env/env_hdfs.cc + ${ROCKSDB_SOURCE_DIR}/env/file_system.cc + ${ROCKSDB_SOURCE_DIR}/env/file_system_tracer.cc + ${ROCKSDB_SOURCE_DIR}/env/fs_remap.cc + ${ROCKSDB_SOURCE_DIR}/env/mock_env.cc + ${ROCKSDB_SOURCE_DIR}/file/delete_scheduler.cc + ${ROCKSDB_SOURCE_DIR}/file/file_prefetch_buffer.cc + ${ROCKSDB_SOURCE_DIR}/file/file_util.cc + ${ROCKSDB_SOURCE_DIR}/file/filename.cc + ${ROCKSDB_SOURCE_DIR}/file/line_file_reader.cc + ${ROCKSDB_SOURCE_DIR}/file/random_access_file_reader.cc + ${ROCKSDB_SOURCE_DIR}/file/read_write_util.cc + ${ROCKSDB_SOURCE_DIR}/file/readahead_raf.cc + ${ROCKSDB_SOURCE_DIR}/file/sequence_file_reader.cc + ${ROCKSDB_SOURCE_DIR}/file/sst_file_manager_impl.cc + ${ROCKSDB_SOURCE_DIR}/file/writable_file_writer.cc + ${ROCKSDB_SOURCE_DIR}/logging/auto_roll_logger.cc + ${ROCKSDB_SOURCE_DIR}/logging/event_logger.cc + ${ROCKSDB_SOURCE_DIR}/logging/log_buffer.cc + ${ROCKSDB_SOURCE_DIR}/memory/arena.cc + ${ROCKSDB_SOURCE_DIR}/memory/concurrent_arena.cc + ${ROCKSDB_SOURCE_DIR}/memory/jemalloc_nodump_allocator.cc + ${ROCKSDB_SOURCE_DIR}/memory/memkind_kmem_allocator.cc + ${ROCKSDB_SOURCE_DIR}/memtable/alloc_tracker.cc + ${ROCKSDB_SOURCE_DIR}/memtable/hash_linklist_rep.cc + ${ROCKSDB_SOURCE_DIR}/memtable/hash_skiplist_rep.cc + ${ROCKSDB_SOURCE_DIR}/memtable/skiplistrep.cc + ${ROCKSDB_SOURCE_DIR}/memtable/vectorrep.cc + ${ROCKSDB_SOURCE_DIR}/memtable/write_buffer_manager.cc + ${ROCKSDB_SOURCE_DIR}/monitoring/histogram.cc + ${ROCKSDB_SOURCE_DIR}/monitoring/histogram_windowing.cc + ${ROCKSDB_SOURCE_DIR}/monitoring/in_memory_stats_history.cc + ${ROCKSDB_SOURCE_DIR}/monitoring/instrumented_mutex.cc + ${ROCKSDB_SOURCE_DIR}/monitoring/iostats_context.cc + ${ROCKSDB_SOURCE_DIR}/monitoring/perf_context.cc + ${ROCKSDB_SOURCE_DIR}/monitoring/perf_level.cc + ${ROCKSDB_SOURCE_DIR}/monitoring/persistent_stats_history.cc + ${ROCKSDB_SOURCE_DIR}/monitoring/statistics.cc + ${ROCKSDB_SOURCE_DIR}/monitoring/thread_status_impl.cc + ${ROCKSDB_SOURCE_DIR}/monitoring/thread_status_updater.cc + ${ROCKSDB_SOURCE_DIR}/monitoring/thread_status_util.cc + ${ROCKSDB_SOURCE_DIR}/monitoring/thread_status_util_debug.cc + ${ROCKSDB_SOURCE_DIR}/options/cf_options.cc + ${ROCKSDB_SOURCE_DIR}/options/configurable.cc + ${ROCKSDB_SOURCE_DIR}/options/customizable.cc + ${ROCKSDB_SOURCE_DIR}/options/db_options.cc + ${ROCKSDB_SOURCE_DIR}/options/options.cc + ${ROCKSDB_SOURCE_DIR}/options/options_helper.cc + ${ROCKSDB_SOURCE_DIR}/options/options_parser.cc + ${ROCKSDB_SOURCE_DIR}/port/stack_trace.cc + ${ROCKSDB_SOURCE_DIR}/table/adaptive/adaptive_table_factory.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/binary_search_index_reader.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/block.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/block_based_filter_block.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/block_based_table_builder.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/block_based_table_factory.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/block_based_table_iterator.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/block_based_table_reader.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/block_builder.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/block_prefetcher.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/block_prefix_index.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/data_block_hash_index.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/data_block_footer.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/filter_block_reader_common.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/filter_policy.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/flush_block_policy.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/full_filter_block.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/hash_index_reader.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/index_builder.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/index_reader_common.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/parsed_full_filter_block.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/partitioned_filter_block.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/partitioned_index_iterator.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/partitioned_index_reader.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/reader_common.cc + ${ROCKSDB_SOURCE_DIR}/table/block_based/uncompression_dict_reader.cc + ${ROCKSDB_SOURCE_DIR}/table/block_fetcher.cc + ${ROCKSDB_SOURCE_DIR}/table/cuckoo/cuckoo_table_builder.cc + ${ROCKSDB_SOURCE_DIR}/table/cuckoo/cuckoo_table_factory.cc + ${ROCKSDB_SOURCE_DIR}/table/cuckoo/cuckoo_table_reader.cc + ${ROCKSDB_SOURCE_DIR}/table/format.cc + ${ROCKSDB_SOURCE_DIR}/table/get_context.cc + ${ROCKSDB_SOURCE_DIR}/table/iterator.cc + ${ROCKSDB_SOURCE_DIR}/table/merging_iterator.cc + ${ROCKSDB_SOURCE_DIR}/table/meta_blocks.cc + ${ROCKSDB_SOURCE_DIR}/table/persistent_cache_helper.cc + ${ROCKSDB_SOURCE_DIR}/table/plain/plain_table_bloom.cc + ${ROCKSDB_SOURCE_DIR}/table/plain/plain_table_builder.cc + ${ROCKSDB_SOURCE_DIR}/table/plain/plain_table_factory.cc + ${ROCKSDB_SOURCE_DIR}/table/plain/plain_table_index.cc + ${ROCKSDB_SOURCE_DIR}/table/plain/plain_table_key_coding.cc + ${ROCKSDB_SOURCE_DIR}/table/plain/plain_table_reader.cc + ${ROCKSDB_SOURCE_DIR}/table/sst_file_dumper.cc + ${ROCKSDB_SOURCE_DIR}/table/sst_file_reader.cc + ${ROCKSDB_SOURCE_DIR}/table/sst_file_writer.cc + ${ROCKSDB_SOURCE_DIR}/table/table_factory.cc + ${ROCKSDB_SOURCE_DIR}/table/table_properties.cc + ${ROCKSDB_SOURCE_DIR}/table/two_level_iterator.cc + ${ROCKSDB_SOURCE_DIR}/test_util/sync_point.cc + ${ROCKSDB_SOURCE_DIR}/test_util/sync_point_impl.cc + ${ROCKSDB_SOURCE_DIR}/test_util/testutil.cc + ${ROCKSDB_SOURCE_DIR}/test_util/transaction_test_util.cc + ${ROCKSDB_SOURCE_DIR}/tools/block_cache_analyzer/block_cache_trace_analyzer.cc + ${ROCKSDB_SOURCE_DIR}/tools/dump/db_dump_tool.cc + ${ROCKSDB_SOURCE_DIR}/tools/io_tracer_parser_tool.cc + ${ROCKSDB_SOURCE_DIR}/tools/ldb_cmd.cc + ${ROCKSDB_SOURCE_DIR}/tools/ldb_tool.cc + ${ROCKSDB_SOURCE_DIR}/tools/sst_dump_tool.cc + ${ROCKSDB_SOURCE_DIR}/tools/trace_analyzer_tool.cc + ${ROCKSDB_SOURCE_DIR}/trace_replay/trace_replay.cc + ${ROCKSDB_SOURCE_DIR}/trace_replay/block_cache_tracer.cc + ${ROCKSDB_SOURCE_DIR}/trace_replay/io_tracer.cc + ${ROCKSDB_SOURCE_DIR}/util/coding.cc + ${ROCKSDB_SOURCE_DIR}/util/compaction_job_stats_impl.cc + ${ROCKSDB_SOURCE_DIR}/util/comparator.cc + ${ROCKSDB_SOURCE_DIR}/util/compression_context_cache.cc + ${ROCKSDB_SOURCE_DIR}/util/concurrent_task_limiter_impl.cc + ${ROCKSDB_SOURCE_DIR}/util/crc32c.cc + ${ROCKSDB_SOURCE_DIR}/util/dynamic_bloom.cc + ${ROCKSDB_SOURCE_DIR}/util/hash.cc + ${ROCKSDB_SOURCE_DIR}/util/murmurhash.cc + ${ROCKSDB_SOURCE_DIR}/util/random.cc + ${ROCKSDB_SOURCE_DIR}/util/rate_limiter.cc + ${ROCKSDB_SOURCE_DIR}/util/ribbon_config.cc + ${ROCKSDB_SOURCE_DIR}/util/slice.cc + ${ROCKSDB_SOURCE_DIR}/util/file_checksum_helper.cc + ${ROCKSDB_SOURCE_DIR}/util/status.cc + ${ROCKSDB_SOURCE_DIR}/util/string_util.cc + ${ROCKSDB_SOURCE_DIR}/util/thread_local.cc + ${ROCKSDB_SOURCE_DIR}/util/threadpool_imp.cc + ${ROCKSDB_SOURCE_DIR}/util/xxhash.cc + ${ROCKSDB_SOURCE_DIR}/utilities/backupable/backupable_db.cc + ${ROCKSDB_SOURCE_DIR}/utilities/blob_db/blob_compaction_filter.cc + ${ROCKSDB_SOURCE_DIR}/utilities/blob_db/blob_db.cc + ${ROCKSDB_SOURCE_DIR}/utilities/blob_db/blob_db_impl.cc + ${ROCKSDB_SOURCE_DIR}/utilities/blob_db/blob_db_impl_filesnapshot.cc + ${ROCKSDB_SOURCE_DIR}/utilities/blob_db/blob_dump_tool.cc + ${ROCKSDB_SOURCE_DIR}/utilities/blob_db/blob_file.cc + ${ROCKSDB_SOURCE_DIR}/utilities/cassandra/cassandra_compaction_filter.cc + ${ROCKSDB_SOURCE_DIR}/utilities/cassandra/format.cc + ${ROCKSDB_SOURCE_DIR}/utilities/cassandra/merge_operator.cc + ${ROCKSDB_SOURCE_DIR}/utilities/checkpoint/checkpoint_impl.cc + ${ROCKSDB_SOURCE_DIR}/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc + ${ROCKSDB_SOURCE_DIR}/utilities/debug.cc + ${ROCKSDB_SOURCE_DIR}/utilities/env_mirror.cc + ${ROCKSDB_SOURCE_DIR}/utilities/env_timed.cc + ${ROCKSDB_SOURCE_DIR}/utilities/fault_injection_env.cc + ${ROCKSDB_SOURCE_DIR}/utilities/fault_injection_fs.cc + ${ROCKSDB_SOURCE_DIR}/utilities/leveldb_options/leveldb_options.cc + ${ROCKSDB_SOURCE_DIR}/utilities/memory/memory_util.cc + ${ROCKSDB_SOURCE_DIR}/utilities/merge_operators/bytesxor.cc + ${ROCKSDB_SOURCE_DIR}/utilities/merge_operators/max.cc + ${ROCKSDB_SOURCE_DIR}/utilities/merge_operators/put.cc + ${ROCKSDB_SOURCE_DIR}/utilities/merge_operators/sortlist.cc + ${ROCKSDB_SOURCE_DIR}/utilities/merge_operators/string_append/stringappend.cc + ${ROCKSDB_SOURCE_DIR}/utilities/merge_operators/string_append/stringappend2.cc + ${ROCKSDB_SOURCE_DIR}/utilities/merge_operators/uint64add.cc + ${ROCKSDB_SOURCE_DIR}/utilities/object_registry.cc + ${ROCKSDB_SOURCE_DIR}/utilities/option_change_migration/option_change_migration.cc + ${ROCKSDB_SOURCE_DIR}/utilities/options/options_util.cc + ${ROCKSDB_SOURCE_DIR}/utilities/persistent_cache/block_cache_tier.cc + ${ROCKSDB_SOURCE_DIR}/utilities/persistent_cache/block_cache_tier_file.cc + ${ROCKSDB_SOURCE_DIR}/utilities/persistent_cache/block_cache_tier_metadata.cc + ${ROCKSDB_SOURCE_DIR}/utilities/persistent_cache/persistent_cache_tier.cc + ${ROCKSDB_SOURCE_DIR}/utilities/persistent_cache/volatile_tier_impl.cc + ${ROCKSDB_SOURCE_DIR}/utilities/simulator_cache/cache_simulator.cc + ${ROCKSDB_SOURCE_DIR}/utilities/simulator_cache/sim_cache.cc + ${ROCKSDB_SOURCE_DIR}/utilities/table_properties_collectors/compact_on_deletion_collector.cc + ${ROCKSDB_SOURCE_DIR}/utilities/trace/file_trace_reader_writer.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/lock/lock_manager.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/lock/point/point_lock_tracker.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/lock/point/point_lock_manager.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/optimistic_transaction_db_impl.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/optimistic_transaction.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/pessimistic_transaction.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/pessimistic_transaction_db.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/snapshot_checker.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/transaction_base.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/transaction_db_mutex_impl.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/transaction_util.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/write_prepared_txn.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/write_prepared_txn_db.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/write_unprepared_txn.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/write_unprepared_txn_db.cc + ${ROCKSDB_SOURCE_DIR}/utilities/ttl/db_ttl_impl.cc + ${ROCKSDB_SOURCE_DIR}/utilities/write_batch_with_index/write_batch_with_index.cc + ${ROCKSDB_SOURCE_DIR}/utilities/write_batch_with_index/write_batch_with_index_internal.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/lock/range/range_tree/lib/locktree/manager.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/lock/range/range_tree/lib/locktree/treenode.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/lock/range/range_tree/lib/locktree/txnid_set.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/lock/range/range_tree/lib/locktree/wfg.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/lock/range/range_tree/lib/standalone_port.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc + ${ROCKSDB_SOURCE_DIR}/utilities/transactions/lock/range/range_tree/lib/util/memarena.cc + rocksdb_build_version.cc) if(HAVE_SSE42 AND NOT MSVC) set_source_files_properties( diff --git a/contrib/rocksdb-cmake/rocksdb_build_version.cc b/contrib/rocksdb-cmake/rocksdb_build_version.cc index 8697652ae9f..f9639da516f 100644 --- a/contrib/rocksdb-cmake/rocksdb_build_version.cc +++ b/contrib/rocksdb-cmake/rocksdb_build_version.cc @@ -1,3 +1,62 @@ -const char* rocksdb_build_git_sha = "rocksdb_build_git_sha:0"; -const char* rocksdb_build_git_date = "rocksdb_build_git_date:2000-01-01"; -const char* rocksdb_build_compile_date = "2000-01-01"; +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. +/// This file was edited for ClickHouse. + +#include + +#include "rocksdb/version.h" +#include "util/string_util.h" + +// The build script may replace these values with real values based +// on whether or not GIT is available and the platform settings +static const std::string rocksdb_build_git_sha = "rocksdb_build_git_sha:0"; +static const std::string rocksdb_build_git_tag = "rocksdb_build_git_tag:master"; +static const std::string rocksdb_build_date = "rocksdb_build_date:2000-01-01"; + +namespace ROCKSDB_NAMESPACE { +static void AddProperty(std::unordered_map *props, const std::string& name) { + size_t colon = name.find(":"); + if (colon != std::string::npos && colon > 0 && colon < name.length() - 1) { + // If we found a "@:", then this property was a build-time substitution that failed. Skip it + size_t at = name.find("@", colon); + if (at != colon + 1) { + // Everything before the colon is the name, after is the value + (*props)[name.substr(0, colon)] = name.substr(colon + 1); + } + } +} + +static std::unordered_map* LoadPropertiesSet() { + auto * properties = new std::unordered_map(); + AddProperty(properties, rocksdb_build_git_sha); + AddProperty(properties, rocksdb_build_git_tag); + AddProperty(properties, rocksdb_build_date); + return properties; +} + +const std::unordered_map& GetRocksBuildProperties() { + static std::unique_ptr> props(LoadPropertiesSet()); + return *props; +} + +std::string GetRocksVersionAsString(bool with_patch) { + std::string version = ToString(ROCKSDB_MAJOR) + "." + ToString(ROCKSDB_MINOR); + if (with_patch) { + return version + "." + ToString(ROCKSDB_PATCH); + } else { + return version; + } +} + +std::string GetRocksBuildInfoAsString(const std::string& program, bool verbose) { + std::string info = program + " (RocksDB) " + GetRocksVersionAsString(true); + if (verbose) { + for (const auto& it : GetRocksBuildProperties()) { + info.append("\n "); + info.append(it.first); + info.append(": "); + info.append(it.second); + } + } + return info; +} +} // namespace ROCKSDB_NAMESPACE diff --git a/contrib/s2geometry b/contrib/s2geometry new file mode 160000 index 00000000000..20ea540d81f --- /dev/null +++ b/contrib/s2geometry @@ -0,0 +1 @@ +Subproject commit 20ea540d81f4575a3fc0aea585aac611bcd03ede diff --git a/contrib/s2geometry-cmake/CMakeLists.txt b/contrib/s2geometry-cmake/CMakeLists.txt new file mode 100644 index 00000000000..41d570c9afd --- /dev/null +++ b/contrib/s2geometry-cmake/CMakeLists.txt @@ -0,0 +1,128 @@ +set(S2_SOURCE_DIR "${ClickHouse_SOURCE_DIR}/contrib/s2geometry/src") + +set(S2_SRCS + "${S2_SOURCE_DIR}/s2/base/stringprintf.cc" + "${S2_SOURCE_DIR}/s2/base/strtoint.cc" + "${S2_SOURCE_DIR}/s2/encoded_s2cell_id_vector.cc" + "${S2_SOURCE_DIR}/s2/encoded_s2point_vector.cc" + "${S2_SOURCE_DIR}/s2/encoded_s2shape_index.cc" + "${S2_SOURCE_DIR}/s2/encoded_string_vector.cc" + "${S2_SOURCE_DIR}/s2/id_set_lexicon.cc" + "${S2_SOURCE_DIR}/s2/mutable_s2shape_index.cc" + "${S2_SOURCE_DIR}/s2/r2rect.cc" + "${S2_SOURCE_DIR}/s2/s1angle.cc" + "${S2_SOURCE_DIR}/s2/s1chord_angle.cc" + "${S2_SOURCE_DIR}/s2/s1interval.cc" + "${S2_SOURCE_DIR}/s2/s2boolean_operation.cc" + "${S2_SOURCE_DIR}/s2/s2builder.cc" + "${S2_SOURCE_DIR}/s2/s2builder_graph.cc" + "${S2_SOURCE_DIR}/s2/s2builderutil_closed_set_normalizer.cc" + "${S2_SOURCE_DIR}/s2/s2builderutil_find_polygon_degeneracies.cc" + "${S2_SOURCE_DIR}/s2/s2builderutil_lax_polygon_layer.cc" + "${S2_SOURCE_DIR}/s2/s2builderutil_s2point_vector_layer.cc" + "${S2_SOURCE_DIR}/s2/s2builderutil_s2polygon_layer.cc" + "${S2_SOURCE_DIR}/s2/s2builderutil_s2polyline_layer.cc" + "${S2_SOURCE_DIR}/s2/s2builderutil_s2polyline_vector_layer.cc" + "${S2_SOURCE_DIR}/s2/s2builderutil_snap_functions.cc" + "${S2_SOURCE_DIR}/s2/s2cap.cc" + "${S2_SOURCE_DIR}/s2/s2cell.cc" + "${S2_SOURCE_DIR}/s2/s2cell_id.cc" + "${S2_SOURCE_DIR}/s2/s2cell_index.cc" + "${S2_SOURCE_DIR}/s2/s2cell_union.cc" + "${S2_SOURCE_DIR}/s2/s2centroids.cc" + "${S2_SOURCE_DIR}/s2/s2closest_cell_query.cc" + "${S2_SOURCE_DIR}/s2/s2closest_edge_query.cc" + "${S2_SOURCE_DIR}/s2/s2closest_point_query.cc" + "${S2_SOURCE_DIR}/s2/s2contains_vertex_query.cc" + "${S2_SOURCE_DIR}/s2/s2convex_hull_query.cc" + "${S2_SOURCE_DIR}/s2/s2coords.cc" + "${S2_SOURCE_DIR}/s2/s2crossing_edge_query.cc" + "${S2_SOURCE_DIR}/s2/s2debug.cc" + "${S2_SOURCE_DIR}/s2/s2earth.cc" + "${S2_SOURCE_DIR}/s2/s2edge_clipping.cc" + "${S2_SOURCE_DIR}/s2/s2edge_crosser.cc" + "${S2_SOURCE_DIR}/s2/s2edge_crossings.cc" + "${S2_SOURCE_DIR}/s2/s2edge_distances.cc" + "${S2_SOURCE_DIR}/s2/s2edge_tessellator.cc" + "${S2_SOURCE_DIR}/s2/s2error.cc" + "${S2_SOURCE_DIR}/s2/s2furthest_edge_query.cc" + "${S2_SOURCE_DIR}/s2/s2latlng.cc" + "${S2_SOURCE_DIR}/s2/s2latlng_rect.cc" + "${S2_SOURCE_DIR}/s2/s2latlng_rect_bounder.cc" + "${S2_SOURCE_DIR}/s2/s2lax_loop_shape.cc" + "${S2_SOURCE_DIR}/s2/s2lax_polygon_shape.cc" + "${S2_SOURCE_DIR}/s2/s2lax_polyline_shape.cc" + "${S2_SOURCE_DIR}/s2/s2loop.cc" + "${S2_SOURCE_DIR}/s2/s2loop_measures.cc" + "${S2_SOURCE_DIR}/s2/s2measures.cc" + "${S2_SOURCE_DIR}/s2/s2metrics.cc" + "${S2_SOURCE_DIR}/s2/s2max_distance_targets.cc" + "${S2_SOURCE_DIR}/s2/s2min_distance_targets.cc" + "${S2_SOURCE_DIR}/s2/s2padded_cell.cc" + "${S2_SOURCE_DIR}/s2/s2point_compression.cc" + "${S2_SOURCE_DIR}/s2/s2point_region.cc" + "${S2_SOURCE_DIR}/s2/s2pointutil.cc" + "${S2_SOURCE_DIR}/s2/s2polygon.cc" + "${S2_SOURCE_DIR}/s2/s2polyline.cc" + "${S2_SOURCE_DIR}/s2/s2polyline_alignment.cc" + "${S2_SOURCE_DIR}/s2/s2polyline_measures.cc" + "${S2_SOURCE_DIR}/s2/s2polyline_simplifier.cc" + "${S2_SOURCE_DIR}/s2/s2predicates.cc" + "${S2_SOURCE_DIR}/s2/s2projections.cc" + "${S2_SOURCE_DIR}/s2/s2r2rect.cc" + "${S2_SOURCE_DIR}/s2/s2region.cc" + "${S2_SOURCE_DIR}/s2/s2region_term_indexer.cc" + "${S2_SOURCE_DIR}/s2/s2region_coverer.cc" + "${S2_SOURCE_DIR}/s2/s2region_intersection.cc" + "${S2_SOURCE_DIR}/s2/s2region_union.cc" + "${S2_SOURCE_DIR}/s2/s2shape_index.cc" + "${S2_SOURCE_DIR}/s2/s2shape_index_buffered_region.cc" + "${S2_SOURCE_DIR}/s2/s2shape_index_measures.cc" + "${S2_SOURCE_DIR}/s2/s2shape_measures.cc" + "${S2_SOURCE_DIR}/s2/s2shapeutil_build_polygon_boundaries.cc" + "${S2_SOURCE_DIR}/s2/s2shapeutil_coding.cc" + "${S2_SOURCE_DIR}/s2/s2shapeutil_contains_brute_force.cc" + "${S2_SOURCE_DIR}/s2/s2shapeutil_edge_iterator.cc" + "${S2_SOURCE_DIR}/s2/s2shapeutil_get_reference_point.cc" + "${S2_SOURCE_DIR}/s2/s2shapeutil_range_iterator.cc" + "${S2_SOURCE_DIR}/s2/s2shapeutil_visit_crossing_edge_pairs.cc" + "${S2_SOURCE_DIR}/s2/s2text_format.cc" + "${S2_SOURCE_DIR}/s2/s2wedge_relations.cc" + "${S2_SOURCE_DIR}/s2/strings/ostringstream.cc" + "${S2_SOURCE_DIR}/s2/strings/serialize.cc" + # ClickHouse doesn't use strings from abseil. + # So, there is no duplicate symbols. + "${S2_SOURCE_DIR}/s2/third_party/absl/base/dynamic_annotations.cc" + "${S2_SOURCE_DIR}/s2/third_party/absl/base/internal/raw_logging.cc" + "${S2_SOURCE_DIR}/s2/third_party/absl/base/internal/throw_delegate.cc" + "${S2_SOURCE_DIR}/s2/third_party/absl/numeric/int128.cc" + "${S2_SOURCE_DIR}/s2/third_party/absl/strings/ascii.cc" + "${S2_SOURCE_DIR}/s2/third_party/absl/strings/match.cc" + "${S2_SOURCE_DIR}/s2/third_party/absl/strings/numbers.cc" + "${S2_SOURCE_DIR}/s2/third_party/absl/strings/str_cat.cc" + "${S2_SOURCE_DIR}/s2/third_party/absl/strings/str_split.cc" + "${S2_SOURCE_DIR}/s2/third_party/absl/strings/string_view.cc" + "${S2_SOURCE_DIR}/s2/third_party/absl/strings/strip.cc" + "${S2_SOURCE_DIR}/s2/third_party/absl/strings/internal/memutil.cc" + "${S2_SOURCE_DIR}/s2/util/bits/bit-interleave.cc" + "${S2_SOURCE_DIR}/s2/util/bits/bits.cc" + "${S2_SOURCE_DIR}/s2/util/coding/coder.cc" + "${S2_SOURCE_DIR}/s2/util/coding/varint.cc" + "${S2_SOURCE_DIR}/s2/util/math/exactfloat/exactfloat.cc" + "${S2_SOURCE_DIR}/s2/util/math/mathutil.cc" + "${S2_SOURCE_DIR}/s2/util/units/length-units.cc" +) + +add_library(s2 ${S2_SRCS}) + +set_property(TARGET s2 PROPERTY CXX_STANDARD 11) + +if (OPENSSL_FOUND) + target_link_libraries(s2 PRIVATE ${OPENSSL_LIBRARIES}) +endif() + +target_include_directories(s2 SYSTEM BEFORE PUBLIC "${S2_SOURCE_DIR}/") + +if(M_LIBRARY) + target_link_libraries(s2 PRIVATE ${M_LIBRARY}) +endif() diff --git a/contrib/simdjson-cmake/CMakeLists.txt b/contrib/simdjson-cmake/CMakeLists.txt index d3bcf6c046c..862d8dc50f8 100644 --- a/contrib/simdjson-cmake/CMakeLists.txt +++ b/contrib/simdjson-cmake/CMakeLists.txt @@ -4,3 +4,6 @@ set(SIMDJSON_SRC "${SIMDJSON_SRC_DIR}/simdjson.cpp") add_library(simdjson ${SIMDJSON_SRC}) target_include_directories(simdjson SYSTEM PUBLIC "${SIMDJSON_INCLUDE_DIR}" PRIVATE "${SIMDJSON_SRC_DIR}") + +# simdjson is using its own CPU dispatching and get confused if we enable AVX/AVX2 flags. +target_compile_options(simdjson PRIVATE -mno-avx -mno-avx2) diff --git a/contrib/sqlite-amalgamation b/contrib/sqlite-amalgamation new file mode 160000 index 00000000000..9818baa5d02 --- /dev/null +++ b/contrib/sqlite-amalgamation @@ -0,0 +1 @@ +Subproject commit 9818baa5d027ffb26d57f810dc4c597d4946781c diff --git a/contrib/sqlite-cmake/CMakeLists.txt b/contrib/sqlite-cmake/CMakeLists.txt new file mode 100644 index 00000000000..495cb63798d --- /dev/null +++ b/contrib/sqlite-cmake/CMakeLists.txt @@ -0,0 +1,6 @@ +set (LIBRARY_DIR "${ClickHouse_SOURCE_DIR}/contrib/sqlite-amalgamation") + +set(SRCS ${LIBRARY_DIR}/sqlite3.c) + +add_library(sqlite ${SRCS}) +target_include_directories(sqlite SYSTEM PUBLIC "${LIBRARY_DIR}") diff --git a/contrib/wordnet-blast b/contrib/wordnet-blast new file mode 160000 index 00000000000..1d16ac28036 --- /dev/null +++ b/contrib/wordnet-blast @@ -0,0 +1 @@ +Subproject commit 1d16ac28036e19fe8da7ba72c16a307fbdf8c87e diff --git a/contrib/wordnet-blast-cmake/CMakeLists.txt b/contrib/wordnet-blast-cmake/CMakeLists.txt new file mode 100644 index 00000000000..8d59c312664 --- /dev/null +++ b/contrib/wordnet-blast-cmake/CMakeLists.txt @@ -0,0 +1,13 @@ +set(LIBRARY_DIR "${ClickHouse_SOURCE_DIR}/contrib/wordnet-blast") + +set(SRCS + "${LIBRARY_DIR}/wnb/core/info_helper.cc" + "${LIBRARY_DIR}/wnb/core/load_wordnet.cc" + "${LIBRARY_DIR}/wnb/core/wordnet.cc" +) + +add_library(wnb ${SRCS}) + +target_link_libraries(wnb PRIVATE boost::headers_only boost::graph) + +target_include_directories(wnb PUBLIC "${LIBRARY_DIR}") \ No newline at end of file diff --git a/contrib/zlib-ng b/contrib/zlib-ng index db232d30b4c..6a5e93b9007 160000 --- a/contrib/zlib-ng +++ b/contrib/zlib-ng @@ -1 +1 @@ -Subproject commit db232d30b4c72fd58e6d7eae2d12cebf9c3d90db +Subproject commit 6a5e93b9007782115f7f7e5235dedc81c4f1facb diff --git a/debian/changelog b/debian/changelog index 36c29fce1d0..38f740ae062 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,5 @@ -clickhouse (21.8.1.1) unstable; urgency=low +clickhouse (21.9.1.1) unstable; urgency=low * Modified source code - -- clickhouse-release Mon, 28 Jun 2021 00:50:15 +0300 + -- clickhouse-release Sat, 10 Jul 2021 08:22:49 +0300 diff --git a/docker/client/Dockerfile b/docker/client/Dockerfile index 19cadccb926..f17fa8ade16 100644 --- a/docker/client/Dockerfile +++ b/docker/client/Dockerfile @@ -1,7 +1,7 @@ FROM ubuntu:18.04 ARG repository="deb https://repo.clickhouse.tech/deb/stable/ main/" -ARG version=21.8.1.* +ARG version=21.9.1.* RUN apt-get update \ && apt-get install --yes --no-install-recommends \ diff --git a/docker/packager/deb/Dockerfile b/docker/packager/deb/Dockerfile index 2f1d28efe61..241b691cd23 100644 --- a/docker/packager/deb/Dockerfile +++ b/docker/packager/deb/Dockerfile @@ -27,7 +27,7 @@ RUN apt-get update \ # Special dpkg-deb (https://github.com/ClickHouse-Extras/dpkg) version which is able # to compress files using pigz (https://zlib.net/pigz/) instead of gzip. # Significantly increase deb packaging speed and compatible with old systems -RUN curl -O https://clickhouse-builds.s3.yandex.net/utils/1/dpkg-deb \ +RUN curl -O https://clickhouse-datasets.s3.yandex.net/utils/1/dpkg-deb \ && chmod +x dpkg-deb \ && cp dpkg-deb /usr/bin diff --git a/docker/packager/packager b/docker/packager/packager index c05c85d3e28..95b7fcd8568 100755 --- a/docker/packager/packager +++ b/docker/packager/packager @@ -151,8 +151,14 @@ def parse_env_variables(build_type, compiler, sanitizer, package_type, image_typ cmake_flags.append('-DENABLE_TESTS=1') cmake_flags.append('-DUSE_GTEST=1') + # "Unbundled" build is not suitable for any production usage. + # But it is occasionally used by some developers. + # The whole idea of using unknown version of libraries from the OS distribution is deeply flawed. + # We wish these developers good luck. if unbundled: - cmake_flags.append('-DUNBUNDLED=1 -DUSE_INTERNAL_RDKAFKA_LIBRARY=1 -DENABLE_ARROW=0 -DENABLE_AVRO=0 -DENABLE_ORC=0 -DENABLE_PARQUET=0') + # We also disable all CPU features except basic x86_64. + # It is only slightly related to "unbundled" build, but it is a good place to test if code compiles without these instruction sets. + cmake_flags.append('-DUNBUNDLED=1 -DUSE_INTERNAL_RDKAFKA_LIBRARY=1 -DENABLE_ARROW=0 -DENABLE_AVRO=0 -DENABLE_ORC=0 -DENABLE_PARQUET=0 -DENABLE_SSSE3=0 -DENABLE_SSE41=0 -DENABLE_SSE42=0 -DENABLE_PCLMULQDQ=0 -DENABLE_POPCNT=0 -DENABLE_AVX=0 -DENABLE_AVX2=0') if split_binary: cmake_flags.append('-DUSE_STATIC_LIBRARIES=0 -DSPLIT_SHARED_LIBRARIES=1 -DCLICKHOUSE_SPLIT_BINARY=1') diff --git a/docker/packager/unbundled/Dockerfile b/docker/packager/unbundled/Dockerfile index 4dd6dbc61d8..07031aa2d1b 100644 --- a/docker/packager/unbundled/Dockerfile +++ b/docker/packager/unbundled/Dockerfile @@ -2,7 +2,7 @@ FROM yandex/clickhouse-deb-builder RUN export CODENAME="$(lsb_release --codename --short | tr 'A-Z' 'a-z')" \ - && wget -nv -O /tmp/arrow-keyring.deb "https://apache.bintray.com/arrow/ubuntu/apache-arrow-archive-keyring-latest-${CODENAME}.deb" \ + && wget -nv -O /tmp/arrow-keyring.deb "https://apache.jfrog.io/artifactory/arrow/ubuntu/apache-arrow-apt-source-latest-${CODENAME}.deb" \ && dpkg -i /tmp/arrow-keyring.deb # Libraries from OS are only needed to test the "unbundled" build (that is not used in production). @@ -23,6 +23,7 @@ RUN apt-get update \ libboost-regex-dev \ libboost-context-dev \ libboost-coroutine-dev \ + libboost-graph-dev \ zlib1g-dev \ liblz4-dev \ libdouble-conversion-dev \ diff --git a/docker/server/Dockerfile b/docker/server/Dockerfile index 65d90bf52ce..5da9e703f4d 100644 --- a/docker/server/Dockerfile +++ b/docker/server/Dockerfile @@ -1,7 +1,7 @@ FROM ubuntu:20.04 ARG repository="deb https://repo.clickhouse.tech/deb/stable/ main/" -ARG version=21.8.1.* +ARG version=21.9.1.* ARG gosu_ver=1.10 # set non-empty deb_location_url url to create a docker image diff --git a/docker/server/entrypoint.sh b/docker/server/entrypoint.sh index c93017bd0d3..40ba9f730cb 100755 --- a/docker/server/entrypoint.sh +++ b/docker/server/entrypoint.sh @@ -72,7 +72,10 @@ do if [ "$DO_CHOWN" = "1" ]; then # ensure proper directories permissions - chown -R "$USER:$GROUP" "$dir" + # but skip it for if directory already has proper premissions, cause recursive chown may be slow + if [ "$(stat -c %u "$dir")" != "$USER" ] || [ "$(stat -c %g "$dir")" != "$GROUP" ]; then + chown -R "$USER:$GROUP" "$dir" + fi elif ! $gosu test -d "$dir" -a -w "$dir" -a -r "$dir"; then echo "Necessary directory '$dir' isn't accessible by user with id '$USER'" exit 1 @@ -161,6 +164,10 @@ fi # if no args passed to `docker run` or first argument start with `--`, then the user is passing clickhouse-server arguments if [[ $# -lt 1 ]] || [[ "$1" == "--"* ]]; then + # Watchdog is launched by default, but does not send SIGINT to the main process, + # so the container can't be finished by ctrl+c + CLICKHOUSE_WATCHDOG_ENABLE=${CLICKHOUSE_WATCHDOG_ENABLE:-0} + export CLICKHOUSE_WATCHDOG_ENABLE exec $gosu /usr/bin/clickhouse-server --config-file="$CLICKHOUSE_CONFIG" "$@" fi diff --git a/docker/test/Dockerfile b/docker/test/Dockerfile index 687393025f0..5768753cd7c 100644 --- a/docker/test/Dockerfile +++ b/docker/test/Dockerfile @@ -1,7 +1,7 @@ FROM ubuntu:18.04 ARG repository="deb https://repo.clickhouse.tech/deb/stable/ main/" -ARG version=21.8.1.* +ARG version=21.9.1.* RUN apt-get update && \ apt-get install -y apt-transport-https dirmngr && \ diff --git a/docker/test/base/Dockerfile b/docker/test/base/Dockerfile index a722132c3a5..29ac7a925b8 100644 --- a/docker/test/base/Dockerfile +++ b/docker/test/base/Dockerfile @@ -27,7 +27,7 @@ RUN apt-get update \ # Special dpkg-deb (https://github.com/ClickHouse-Extras/dpkg) version which is able # to compress files using pigz (https://zlib.net/pigz/) instead of gzip. # Significantly increase deb packaging speed and compatible with old systems -RUN curl -O https://clickhouse-builds.s3.yandex.net/utils/1/dpkg-deb \ +RUN curl -O https://clickhouse-datasets.s3.yandex.net/utils/1/dpkg-deb \ && chmod +x dpkg-deb \ && cp dpkg-deb /usr/bin @@ -61,4 +61,7 @@ ENV TSAN_OPTIONS='halt_on_error=1 history_size=7' ENV UBSAN_OPTIONS='print_stacktrace=1' ENV MSAN_OPTIONS='abort_on_error=1 poison_in_dtor=1' +ENV TZ=Europe/Moscow +RUN ln -snf "/usr/share/zoneinfo/$TZ" /etc/localtime && echo "$TZ" > /etc/timezone + CMD sleep 1 diff --git a/docker/test/fasttest/Dockerfile b/docker/test/fasttest/Dockerfile index 2864f7fc4da..916c94e7311 100644 --- a/docker/test/fasttest/Dockerfile +++ b/docker/test/fasttest/Dockerfile @@ -27,7 +27,7 @@ RUN apt-get update \ # Special dpkg-deb (https://github.com/ClickHouse-Extras/dpkg) version which is able # to compress files using pigz (https://zlib.net/pigz/) instead of gzip. # Significantly increase deb packaging speed and compatible with old systems -RUN curl -O https://clickhouse-builds.s3.yandex.net/utils/1/dpkg-deb \ +RUN curl -O https://clickhouse-datasets.s3.yandex.net/utils/1/dpkg-deb \ && chmod +x dpkg-deb \ && cp dpkg-deb /usr/bin @@ -65,7 +65,7 @@ RUN apt-get update \ unixodbc \ --yes --no-install-recommends -RUN pip3 install numpy scipy pandas +RUN pip3 install numpy scipy pandas Jinja2 # This symlink required by gcc to find lld compiler RUN ln -s /usr/bin/lld-${LLVM_VERSION} /usr/bin/ld.lld diff --git a/docker/test/fasttest/run.sh b/docker/test/fasttest/run.sh index bba20f64e5a..d0184bb1a64 100755 --- a/docker/test/fasttest/run.sh +++ b/docker/test/fasttest/run.sh @@ -279,6 +279,7 @@ function run_tests 00926_multimatch 00929_multi_match_edit_distance 01681_hyperscan_debug_assertion + 02004_max_hyperscan_regex_length 01176_mysql_client_interactive # requires mysql client 01031_mutations_interpreter_and_context @@ -299,6 +300,7 @@ function run_tests 01318_decrypt # Depends on OpenSSL 01663_aes_msan # Depends on OpenSSL 01667_aes_args_check # Depends on OpenSSL + 01683_codec_encrypted # Depends on OpenSSL 01776_decrypt_aead_size_check # Depends on OpenSSL 01811_filter_by_null # Depends on OpenSSL 01281_unsucceeded_insert_select_queries_counter @@ -310,6 +312,8 @@ function run_tests 01411_bayesian_ab_testing 01798_uniq_theta_sketch 01799_long_uniq_theta_sketch + 01890_stem # depends on libstemmer_c + 02003_compress_bz2 # depends on bzip2 collate collation _orc_ @@ -378,6 +382,16 @@ function run_tests # needs pv 01923_network_receive_time_metric_insert + + 01889_sqlite_read_write + + # needs s2 + 01849_geoToS2 + 01851_s2_to_geo + 01852_s2_get_neighbours + 01853_s2_cells_intersect + 01854_s2_cap_contains + 01854_s2_cap_union ) time clickhouse-test --hung-check -j 8 --order=random --use-skip-list \ diff --git a/docker/test/fuzzer/run-fuzzer.sh b/docker/test/fuzzer/run-fuzzer.sh index 3ca67a58278..44183a50ae5 100755 --- a/docker/test/fuzzer/run-fuzzer.sh +++ b/docker/test/fuzzer/run-fuzzer.sh @@ -194,6 +194,10 @@ continue jobs pstree -aspgT + server_exit_code=0 + wait $server_pid || server_exit_code=$? + echo "Server exit code is $server_exit_code" + # Make files with status and description we'll show for this check on Github. task_exit_code=$fuzzer_exit_code if [ "$server_died" == 1 ] @@ -222,7 +226,7 @@ continue task_exit_code=$fuzzer_exit_code echo "failure" > status.txt { grep --text -o "Found error:.*" fuzzer.log \ - || grep --text -o "Exception.*" fuzzer.log \ + || grep --text -ao "Exception:.*" fuzzer.log \ || echo "Fuzzer failed ($fuzzer_exit_code). See the logs." ; } \ | tail -1 > description.txt fi diff --git a/docker/test/integration/base/Dockerfile b/docker/test/integration/base/Dockerfile index e15697da029..344c1b9a698 100644 --- a/docker/test/integration/base/Dockerfile +++ b/docker/test/integration/base/Dockerfile @@ -32,7 +32,7 @@ RUN rm -rf \ RUN apt-get clean # Install MySQL ODBC driver -RUN curl 'https://cdn.mysql.com//Downloads/Connector-ODBC/8.0/mysql-connector-odbc-8.0.21-linux-glibc2.12-x86-64bit.tar.gz' --output 'mysql-connector.tar.gz' && tar -xzf mysql-connector.tar.gz && cd mysql-connector-odbc-8.0.21-linux-glibc2.12-x86-64bit/lib && mv * /usr/local/lib && ln -s /usr/local/lib/libmyodbc8a.so /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so +RUN curl 'https://downloads.mysql.com/archives/get/p/10/file/mysql-connector-odbc-8.0.21-linux-glibc2.12-x86-64bit.tar.gz' --location --output 'mysql-connector.tar.gz' && tar -xzf mysql-connector.tar.gz && cd mysql-connector-odbc-8.0.21-linux-glibc2.12-x86-64bit/lib && mv * /usr/local/lib && ln -s /usr/local/lib/libmyodbc8a.so /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so # Unfortunately this is required for a single test for conversion data from zookeeper to clickhouse-keeper. # ZooKeeper is not started by default, but consumes some space in containers. @@ -49,4 +49,3 @@ RUN mkdir /zookeeper && chmod -R 777 /zookeeper ENV TZ=Europe/Moscow RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone - diff --git a/docker/test/integration/runner/Dockerfile b/docker/test/integration/runner/Dockerfile index 0665ab7560f..6bde4ef60db 100644 --- a/docker/test/integration/runner/Dockerfile +++ b/docker/test/integration/runner/Dockerfile @@ -76,6 +76,7 @@ RUN python3 -m pip install \ pytest \ pytest-timeout \ pytest-xdist \ + pytest-repeat \ redis \ tzlocal \ urllib3 \ diff --git a/docker/test/integration/runner/compose/docker_compose_jdbc_bridge.yml b/docker/test/integration/runner/compose/docker_compose_jdbc_bridge.yml index e3e0d5d07ce..a65ef629df6 100644 --- a/docker/test/integration/runner/compose/docker_compose_jdbc_bridge.yml +++ b/docker/test/integration/runner/compose/docker_compose_jdbc_bridge.yml @@ -14,10 +14,14 @@ services: } EOF ./docker-entrypoint.sh' - ports: - - 9020:9019 + expose: + - 9019 healthcheck: test: ["CMD", "curl", "-s", "localhost:9019/ping"] interval: 5s timeout: 3s retries: 30 + volumes: + - type: ${JDBC_BRIDGE_FS:-tmpfs} + source: ${JDBC_BRIDGE_LOGS:-} + target: /app/logs \ No newline at end of file diff --git a/docker/test/integration/runner/compose/docker_compose_mongo_secure.yml b/docker/test/integration/runner/compose/docker_compose_mongo_secure.yml new file mode 100644 index 00000000000..5d283cfc343 --- /dev/null +++ b/docker/test/integration/runner/compose/docker_compose_mongo_secure.yml @@ -0,0 +1,13 @@ +version: '2.3' +services: + mongo1: + image: mongo:3.6 + restart: always + environment: + MONGO_INITDB_ROOT_USERNAME: root + MONGO_INITDB_ROOT_PASSWORD: clickhouse + volumes: + - ${MONGO_CONFIG_PATH}:/mongo/ + ports: + - ${MONGO_EXTERNAL_PORT}:${MONGO_INTERNAL_PORT} + command: --config /mongo/mongo_secure.conf --profile=2 --verbose diff --git a/docker/test/integration/runner/compose/docker_compose_mysql_5_7_for_materialize_mysql.yml b/docker/test/integration/runner/compose/docker_compose_mysql_5_7_for_materialized_mysql.yml similarity index 100% rename from docker/test/integration/runner/compose/docker_compose_mysql_5_7_for_materialize_mysql.yml rename to docker/test/integration/runner/compose/docker_compose_mysql_5_7_for_materialized_mysql.yml diff --git a/docker/test/integration/runner/compose/docker_compose_postgres.yml b/docker/test/integration/runner/compose/docker_compose_postgres.yml index 4b83ed21410..c444e71798e 100644 --- a/docker/test/integration/runner/compose/docker_compose_postgres.yml +++ b/docker/test/integration/runner/compose/docker_compose_postgres.yml @@ -2,7 +2,7 @@ version: '2.3' services: postgres1: image: postgres - command: ["postgres", "-c", "logging_collector=on", "-c", "log_directory=/postgres/logs", "-c", "log_filename=postgresql.log", "-c", "log_statement=all"] + command: ["postgres", "-c", "logging_collector=on", "-c", "log_directory=/postgres/logs", "-c", "log_filename=postgresql.log", "-c", "log_statement=all", "-c", "max_connections=200"] restart: always expose: - ${POSTGRES_PORT} diff --git a/docker/test/integration/runner/compose/docker_compose_rabbitmq.yml b/docker/test/integration/runner/compose/docker_compose_rabbitmq.yml index 99e0ea8e280..539c065e03b 100644 --- a/docker/test/integration/runner/compose/docker_compose_rabbitmq.yml +++ b/docker/test/integration/runner/compose/docker_compose_rabbitmq.yml @@ -2,7 +2,7 @@ version: '2.3' services: rabbitmq1: - image: rabbitmq:3-management-alpine + image: rabbitmq:3.8-management-alpine hostname: rabbitmq1 expose: - ${RABBITMQ_PORT} diff --git a/docker/test/performance-comparison/compare.sh b/docker/test/performance-comparison/compare.sh index c3447c17d35..e5c9f349ce3 100755 --- a/docker/test/performance-comparison/compare.sh +++ b/docker/test/performance-comparison/compare.sh @@ -628,6 +628,9 @@ cat analyze/errors.log >> report/errors.log ||: cat profile-errors.log >> report/errors.log ||: clickhouse-local --query " +-- We use decimals specifically to get fixed-point, fixed-width formatting. +set output_format_decimal_trailing_zeros = 1; + create view query_display_names as select * from file('analyze/query-display-names.tsv', TSV, 'test text, query_index int, query_display_name text') @@ -975,6 +978,9 @@ for version in {right,left} do rm -rf data clickhouse-local --query " +-- We use decimals specifically to get fixed-point, fixed-width formatting. +set output_format_decimal_trailing_zeros = 1; + create view query_profiles as with 0 as left, 1 as right select * from file('analyze/query-profiles.tsv', TSV, @@ -1170,6 +1176,9 @@ rm -rf metrics ||: mkdir metrics clickhouse-local --query " +-- We use decimals specifically to get fixed-point, fixed-width formatting. +set output_format_decimal_trailing_zeros = 1; + create view right_async_metric_log as select * from file('right-async-metric-log.tsv', TSVWithNamesAndTypes, '$(cat right-async-metric-log.tsv.columns)') @@ -1178,11 +1187,11 @@ create view right_async_metric_log as -- Use the right log as time reference because it may have higher precision. create table metrics engine File(TSV, 'metrics/metrics.tsv') as with (select min(event_time) from right_async_metric_log) as min_time - select name metric, r.event_time - min_time event_time, l.value as left, r.value as right + select metric, r.event_time - min_time event_time, l.value as left, r.value as right from right_async_metric_log r asof join file('left-async-metric-log.tsv', TSVWithNamesAndTypes, '$(cat left-async-metric-log.tsv.columns)') l - on l.name = r.name and r.event_time <= l.event_time + on l.metric = r.metric and r.event_time <= l.event_time order by metric, event_time ; @@ -1196,7 +1205,7 @@ create table changes engine File(TSV, 'metrics/changes.tsv') as if(left > right, left / right, right / left) times_diff from metrics group by metric - having abs(diff) > 0.05 and isFinite(diff) + having abs(diff) > 0.05 and isFinite(diff) and isFinite(times_diff) ) order by diff desc ; diff --git a/docker/test/performance-comparison/config/users.d/perf-comparison-tweaks-users.xml b/docker/test/performance-comparison/config/users.d/perf-comparison-tweaks-users.xml index 2c06be9bb91..1f5218c2d10 100644 --- a/docker/test/performance-comparison/config/users.d/perf-comparison-tweaks-users.xml +++ b/docker/test/performance-comparison/config/users.d/perf-comparison-tweaks-users.xml @@ -23,6 +23,7 @@ 0 + 0 diff --git a/docker/test/performance-comparison/perf.py b/docker/test/performance-comparison/perf.py index 9628c512e83..a6e7e397e32 100755 --- a/docker/test/performance-comparison/perf.py +++ b/docker/test/performance-comparison/perf.py @@ -183,6 +183,10 @@ for conn_index, c in enumerate(all_connections): # requires clickhouse-driver >= 1.1.5 to accept arbitrary new settings # (https://github.com/mymarilyn/clickhouse-driver/pull/142) c.settings[s.tag] = s.text + # We have to perform a query to make sure the settings work. Otherwise an + # unknown setting will lead to failing precondition check, and we will skip + # the test, which is wrong. + c.execute("select 1") reportStageEnd('settings') diff --git a/docker/test/pvs/Dockerfile b/docker/test/pvs/Dockerfile index 2983be2305f..7bd45ba4018 100644 --- a/docker/test/pvs/Dockerfile +++ b/docker/test/pvs/Dockerfile @@ -28,7 +28,7 @@ RUN apt-get update --yes \ ENV PKG_VERSION="pvs-studio-latest" RUN set -x \ - && export PUBKEY_HASHSUM="486a0694c7f92e96190bbfac01c3b5ac2cb7823981db510a28f744c99eabbbf17a7bcee53ca42dc6d84d4323c2742761" \ + && export PUBKEY_HASHSUM="686e5eb8b3c543a5c54442c39ec876b6c2d912fe8a729099e600017ae53c877dda3368fe38ed7a66024fe26df6b5892a" \ && wget -nv https://files.viva64.com/etc/pubkey.txt -O /tmp/pubkey.txt \ && echo "${PUBKEY_HASHSUM} /tmp/pubkey.txt" | sha384sum -c \ && apt-key add /tmp/pubkey.txt \ diff --git a/docker/test/stateful/run.sh b/docker/test/stateful/run.sh index d8ea2153b36..de058469192 100755 --- a/docker/test/stateful/run.sh +++ b/docker/test/stateful/run.sh @@ -2,6 +2,11 @@ set -e -x +# Choose random timezone for this test run +TZ="$(grep -v '#' /usr/share/zoneinfo/zone.tab | awk '{print $3}' | shuf | head -n1)" +echo "Choosen random timezone $TZ" +ln -snf "/usr/share/zoneinfo/$TZ" /etc/localtime && echo "$TZ" > /etc/timezone + dpkg -i package_folder/clickhouse-common-static_*.deb; dpkg -i package_folder/clickhouse-common-static-dbg_*.deb dpkg -i package_folder/clickhouse-server_*.deb diff --git a/docker/test/stateless/Dockerfile b/docker/test/stateless/Dockerfile index 658ae1f27ba..f5fa86a6f33 100644 --- a/docker/test/stateless/Dockerfile +++ b/docker/test/stateless/Dockerfile @@ -29,9 +29,10 @@ RUN apt-get update -y \ unixodbc \ wget \ mysql-client=5.7* \ - postgresql-client + postgresql-client \ + sqlite3 -RUN pip3 install numpy scipy pandas +RUN pip3 install numpy scipy pandas Jinja2 RUN mkdir -p /tmp/clickhouse-odbc-tmp \ && wget -nv -O - ${odbc_driver_url} | tar --strip-components=1 -xz -C /tmp/clickhouse-odbc-tmp \ diff --git a/docker/test/stateless/process_functional_tests_result.py b/docker/test/stateless/process_functional_tests_result.py index b3c8fa96144..e60424ad4d1 100755 --- a/docker/test/stateless/process_functional_tests_result.py +++ b/docker/test/stateless/process_functional_tests_result.py @@ -12,7 +12,7 @@ UNKNOWN_SIGN = "[ UNKNOWN " SKIPPED_SIGN = "[ SKIPPED " HUNG_SIGN = "Found hung queries in processlist" -NO_TASK_TIMEOUT_SIGN = "All tests have finished" +NO_TASK_TIMEOUT_SIGNS = ["All tests have finished", "No tests were run"] RETRIES_SIGN = "Some tests were restarted" @@ -29,7 +29,7 @@ def process_test_log(log_path): with open(log_path, 'r') as test_file: for line in test_file: line = line.strip() - if NO_TASK_TIMEOUT_SIGN in line: + if any(s in line for s in NO_TASK_TIMEOUT_SIGNS): task_timeout = False if HUNG_SIGN in line: hung = True @@ -80,6 +80,7 @@ def process_result(result_path): if result_path and os.path.exists(result_path): total, skipped, unknown, failed, success, hung, task_timeout, retries, test_results = process_test_log(result_path) is_flacky_check = 1 < int(os.environ.get('NUM_TRIES', 1)) + logging.info("Is flacky check: %s", is_flacky_check) # If no tests were run (success == 0) it indicates an error (e.g. server did not start or crashed immediately) # But it's Ok for "flaky checks" - they can contain just one test for check which is marked as skipped. if failed != 0 or unknown != 0 or (success == 0 and (not is_flacky_check)): diff --git a/docker/test/stateless/run.sh b/docker/test/stateless/run.sh index a7fb956bf94..e5ef72e747a 100755 --- a/docker/test/stateless/run.sh +++ b/docker/test/stateless/run.sh @@ -3,6 +3,11 @@ # fail on errors, verbose and export all env variables set -e -x -a +# Choose random timezone for this test run. +TZ="$(grep -v '#' /usr/share/zoneinfo/zone.tab | awk '{print $3}' | shuf | head -n1)" +echo "Choosen random timezone $TZ" +ln -snf "/usr/share/zoneinfo/$TZ" /etc/localtime && echo "$TZ" > /etc/timezone + dpkg -i package_folder/clickhouse-common-static_*.deb dpkg -i package_folder/clickhouse-common-static-dbg_*.deb dpkg -i package_folder/clickhouse-server_*.deb @@ -138,15 +143,18 @@ if [[ -n "$WITH_COVERAGE" ]] && [[ "$WITH_COVERAGE" -eq 1 ]]; then fi tar -chf /test_output/text_log_dump.tar /var/lib/clickhouse/data/system/text_log ||: tar -chf /test_output/query_log_dump.tar /var/lib/clickhouse/data/system/query_log ||: +tar -chf /test_output/zookeeper_log_dump.tar /var/lib/clickhouse/data/system/zookeeper_log ||: tar -chf /test_output/coordination.tar /var/lib/clickhouse/coordination ||: if [[ -n "$USE_DATABASE_REPLICATED" ]] && [[ "$USE_DATABASE_REPLICATED" -eq 1 ]]; then - grep -Fa "Fatal" /var/log/clickhouse-server/clickhouse-server1.log ||: - grep -Fa "Fatal" /var/log/clickhouse-server/clickhouse-server2.log ||: + grep -Fa "Fatal" /var/log/clickhouse-server/clickhouse-server1.log ||: + grep -Fa "Fatal" /var/log/clickhouse-server/clickhouse-server2.log ||: pigz < /var/log/clickhouse-server/clickhouse-server1.log > /test_output/clickhouse-server1.log.gz ||: pigz < /var/log/clickhouse-server/clickhouse-server2.log > /test_output/clickhouse-server2.log.gz ||: mv /var/log/clickhouse-server/stderr1.log /test_output/ ||: mv /var/log/clickhouse-server/stderr2.log /test_output/ ||: + tar -chf /test_output/zookeeper_log_dump1.tar /var/lib/clickhouse1/data/system/zookeeper_log ||: + tar -chf /test_output/zookeeper_log_dump2.tar /var/lib/clickhouse2/data/system/zookeeper_log ||: tar -chf /test_output/coordination1.tar /var/lib/clickhouse1/coordination ||: tar -chf /test_output/coordination2.tar /var/lib/clickhouse2/coordination ||: fi diff --git a/docker/test/stateless_unbundled/Dockerfile b/docker/test/stateless_unbundled/Dockerfile index c5463ac447d..53857a90ac7 100644 --- a/docker/test/stateless_unbundled/Dockerfile +++ b/docker/test/stateless_unbundled/Dockerfile @@ -77,9 +77,6 @@ RUN mkdir -p /tmp/clickhouse-odbc-tmp \ && odbcinst -i -s -l -f /tmp/clickhouse-odbc-tmp/share/doc/clickhouse-odbc/config/odbc.ini.sample \ && rm -rf /tmp/clickhouse-odbc-tmp -ENV TZ=Europe/Moscow -RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone - COPY run.sh / CMD ["/bin/bash", "/run.sh"] diff --git a/docker/test/stress/run.sh b/docker/test/stress/run.sh index 428fdb9fdb7..87d127ab946 100755 --- a/docker/test/stress/run.sh +++ b/docker/test/stress/run.sh @@ -58,11 +58,11 @@ function start() echo "Cannot start clickhouse-server" cat /var/log/clickhouse-server/stdout.log tail -n1000 /var/log/clickhouse-server/stderr.log - tail -n1000 /var/log/clickhouse-server/clickhouse-server.log + tail -n100000 /var/log/clickhouse-server/clickhouse-server.log | grep -F -v ' RaftInstance:' -e ' RaftInstance' | tail -n1000 break fi # use root to match with current uid - clickhouse start --user root >/var/log/clickhouse-server/stdout.log 2>/var/log/clickhouse-server/stderr.log + clickhouse start --user root >/var/log/clickhouse-server/stdout.log 2>>/var/log/clickhouse-server/stderr.log sleep 0.5 counter=$((counter + 1)) done @@ -118,35 +118,35 @@ clickhouse-client --query "SELECT 'Server successfully started', 'OK'" >> /test_ [ -f /var/log/clickhouse-server/stderr.log ] || echo -e "Stderr log does not exist\tFAIL" # Print Fatal log messages to stdout -zgrep -Fa " " /var/log/clickhouse-server/clickhouse-server.log +zgrep -Fa " " /var/log/clickhouse-server/clickhouse-server.log* # Grep logs for sanitizer asserts, crashes and other critical errors # Sanitizer asserts zgrep -Fa "==================" /var/log/clickhouse-server/stderr.log >> /test_output/tmp zgrep -Fa "WARNING" /var/log/clickhouse-server/stderr.log >> /test_output/tmp -zgrep -Fav "ASan doesn't fully support makecontext/swapcontext functions" > /dev/null \ +zgrep -Fav "ASan doesn't fully support makecontext/swapcontext functions" /test_output/tmp > /dev/null \ && echo -e 'Sanitizer assert (in stderr.log)\tFAIL' >> /test_output/test_results.tsv \ || echo -e 'No sanitizer asserts\tOK' >> /test_output/test_results.tsv rm -f /test_output/tmp # OOM -zgrep -Fa " Application: Child process was terminated by signal 9" /var/log/clickhouse-server/clickhouse-server.log > /dev/null \ +zgrep -Fa " Application: Child process was terminated by signal 9" /var/log/clickhouse-server/clickhouse-server.log* > /dev/null \ && echo -e 'OOM killer (or signal 9) in clickhouse-server.log\tFAIL' >> /test_output/test_results.tsv \ || echo -e 'No OOM messages in clickhouse-server.log\tOK' >> /test_output/test_results.tsv # Logical errors -zgrep -Fa "Code: 49, e.displayText() = DB::Exception:" /var/log/clickhouse-server/clickhouse-server.log > /dev/null \ +zgrep -Fa "Code: 49, e.displayText() = DB::Exception:" /var/log/clickhouse-server/clickhouse-server.log* > /dev/null \ && echo -e 'Logical error thrown (see clickhouse-server.log)\tFAIL' >> /test_output/test_results.tsv \ || echo -e 'No logical errors\tOK' >> /test_output/test_results.tsv # Crash -zgrep -Fa "########################################" /var/log/clickhouse-server/clickhouse-server.log > /dev/null \ +zgrep -Fa "########################################" /var/log/clickhouse-server/clickhouse-server.log* > /dev/null \ && echo -e 'Killed by signal (in clickhouse-server.log)\tFAIL' >> /test_output/test_results.tsv \ || echo -e 'Not crashed\tOK' >> /test_output/test_results.tsv # It also checks for crash without stacktrace (printed by watchdog) -zgrep -Fa " " /var/log/clickhouse-server/clickhouse-server.log > /dev/null \ +zgrep -Fa " " /var/log/clickhouse-server/clickhouse-server.log* > /dev/null \ && echo -e 'Fatal message in clickhouse-server.log\tFAIL' >> /test_output/test_results.tsv \ || echo -e 'No fatal messages in clickhouse-server.log\tOK' >> /test_output/test_results.tsv diff --git a/docker/test/stress/stress b/docker/test/stress/stress index c98a527c1fe..c71722809d7 100755 --- a/docker/test/stress/stress +++ b/docker/test/stress/stress @@ -20,6 +20,7 @@ def get_skip_list_cmd(path): def get_options(i): options = [] + client_options = [] if 0 < i: options.append("--order=random") @@ -27,25 +28,29 @@ def get_options(i): options.append("--db-engine=Ordinary") if i % 3 == 2: - options.append('''--client-option='allow_experimental_database_replicated=1' --db-engine="Replicated('/test/db/test_{}', 's1', 'r1')"'''.format(i)) + options.append('''--db-engine="Replicated('/test/db/test_{}', 's1', 'r1')"'''.format(i)) + client_options.append('allow_experimental_database_replicated=1') # If database name is not specified, new database is created for each functional test. # Run some threads with one database for all tests. if i % 2 == 1: options.append(" --database=test_{}".format(i)) - if i % 7 == 0: - options.append(" --client-option='join_use_nulls=1'") + if i % 5 == 1: + client_options.append("join_use_nulls=1") - if i % 14 == 0: - options.append(' --client-option="join_algorithm=\'partial_merge\'"') + if i % 15 == 6: + client_options.append("join_algorithm='partial_merge'") - if i % 21 == 0: - options.append(' --client-option="join_algorithm=\'auto\'"') - options.append(' --client-option="max_rows_in_join=1000"') + if i % 15 == 11: + client_options.append("join_algorithm='auto'") + client_options.append('max_rows_in_join=1000') if i == 13: - options.append(" --client-option='memory_tracker_fault_probability=0.00001'") + client_options.append('memory_tracker_fault_probability=0.001') + + if client_options: + options.append(" --client-option " + ' '.join(client_options)) return ' '.join(options) diff --git a/docker/test/testflows/runner/Dockerfile b/docker/test/testflows/runner/Dockerfile index 9fa028fedca..264b98c669d 100644 --- a/docker/test/testflows/runner/Dockerfile +++ b/docker/test/testflows/runner/Dockerfile @@ -35,7 +35,7 @@ RUN apt-get update \ ENV TZ=Europe/Moscow RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone -RUN pip3 install urllib3 testflows==1.6.90 docker-compose==1.29.1 docker==5.0.0 dicttoxml kazoo tzlocal python-dateutil numpy +RUN pip3 install urllib3 testflows==1.7.20 docker-compose==1.29.1 docker==5.0.0 dicttoxml kazoo tzlocal python-dateutil numpy ENV DOCKER_CHANNEL stable ENV DOCKER_VERSION 20.10.6 diff --git a/docker/test/unit/Dockerfile b/docker/test/unit/Dockerfile index e2f4a691939..e111611eecd 100644 --- a/docker/test/unit/Dockerfile +++ b/docker/test/unit/Dockerfile @@ -1,8 +1,6 @@ # docker build -t yandex/clickhouse-unit-test . FROM yandex/clickhouse-stateless-test -ENV TZ=Europe/Moscow -RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone RUN apt-get install gdb COPY run.sh / diff --git a/docs/README.md b/docs/README.md index a4df023a6ad..d71e92f20d1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -9,7 +9,7 @@ Many developers can say that the code is the best docs by itself, and they are r If you want to help ClickHouse with documentation you can face, for example, the following questions: - "I don't know how to write." - + We have prepared some [recommendations](#what-to-write) for you. - "I know what I want to write, but I don't know how to contribute to docs." @@ -71,17 +71,17 @@ Contribute all new information in English language. Other languages are translat ``` - Bold text: `**asterisks**` or `__underlines__`. -- Links: `[link text](uri)`. Examples: +- Links: `[link text](uri)`. Examples: - External link: `[ClickHouse repo](https://github.com/ClickHouse/ClickHouse)` - Cross link: `[How to build docs](tools/README.md)` - Images: `![Exclamation sign](uri)`. You can refer to local images as well as remote in internet. - Lists: Lists can be of two types: - + - `- unordered`: Each item starts from the `-`. - `1. ordered`: Each item starts from the number. - + A list must be separated from the text by an empty line. Nested lists must be indented with 4 spaces. - Inline code: `` `in backticks` ``. @@ -107,7 +107,7 @@ Contribute all new information in English language. Other languages are translat - Text hidden behind a cut (single sting that opens on click): ```text -
Visible text +
Visible text Hidden content.
`. ``` diff --git a/docs/_description_templates/template-data-type.md b/docs/_description_templates/template-data-type.md index 5e560b9325d..d39be305838 100644 --- a/docs/_description_templates/template-data-type.md +++ b/docs/_description_templates/template-data-type.md @@ -1,6 +1,6 @@ --- -toc_priority: -toc_title: +toc_priority: +toc_title: --- # data_type_name {#data_type-name} diff --git a/docs/_description_templates/template-engine.md b/docs/_description_templates/template-engine.md index 490f490fc4e..392bc59ed33 100644 --- a/docs/_description_templates/template-engine.md +++ b/docs/_description_templates/template-engine.md @@ -58,6 +58,6 @@ Result: Follow up with any text to clarify the example. -**See Also** +**See Also** - [link](#) diff --git a/docs/_description_templates/template-function.md b/docs/_description_templates/template-function.md index 3d4d921898a..6bdc764c449 100644 --- a/docs/_description_templates/template-function.md +++ b/docs/_description_templates/template-function.md @@ -14,8 +14,8 @@ More text (Optional). **Arguments** (Optional) -- `x` — Description. Optional (only for optional arguments). Possible values: . Default value: . [Type name](relative/path/to/type/dscr.md#type). -- `y` — Description. Optional (only for optional arguments). Possible values: .Default value: . [Type name](relative/path/to/type/dscr.md#type). +- `x` — Description. Optional (only for optional arguments). Possible values: . Default value: . [Type name](relative/path/to/type/dscr.md#type). +- `y` — Description. Optional (only for optional arguments). Possible values: .Default value: . [Type name](relative/path/to/type/dscr.md#type). **Parameters** (Optional, only for parametric aggregate functions) @@ -23,7 +23,7 @@ More text (Optional). **Returned value(s)** -- Returned values list. +- Returned values list. Type: [Type name](relative/path/to/type/dscr.md#type). diff --git a/docs/_includes/cmake_in_clickhouse_footer.md b/docs/_includes/cmake_in_clickhouse_footer.md index ab884bd4dfe..bf8411ba815 100644 --- a/docs/_includes/cmake_in_clickhouse_footer.md +++ b/docs/_includes/cmake_in_clickhouse_footer.md @@ -16,8 +16,8 @@ Better: option(ENABLE_TESTS "Provide unit_test_dbms target with Google.test unit tests" OFF) ``` -If the option's purpose can't be guessed by its name, or the purpose guess may be misleading, or option has some -pre-conditions, leave a comment above the `option()` line and explain what it does. +If the option's purpose can't be guessed by its name, or the purpose guess may be misleading, or option has some +pre-conditions, leave a comment above the `option()` line and explain what it does. The best way would be linking the docs page (if it exists). The comment is parsed into a separate column (see below). @@ -33,7 +33,7 @@ option(ENABLE_TESTS "Provide unit_test_dbms target with Google.test unit tests" Suppose you have an option that may strip debug symbols from the ClickHouse's part. This can speed up the linking process, but produces a binary that cannot be debugged. -In that case, prefer explicitly raising a warning telling the developer that he may be doing something wrong. +In that case, prefer explicitly raising a warning telling the developer that he may be doing something wrong. Also, such options should be disabled if applies. Bad: diff --git a/docs/en/commercial/support.md b/docs/en/commercial/support.md index 1a3d1b71869..27f3f0c6a22 100644 --- a/docs/en/commercial/support.md +++ b/docs/en/commercial/support.md @@ -7,7 +7,7 @@ toc_title: Support !!! info "Info" If you have launched a ClickHouse commercial support service, feel free to [open a pull-request](https://github.com/ClickHouse/ClickHouse/edit/master/docs/en/commercial/support.md) adding it to the following list. - + ## Yandex.Cloud ClickHouse worldwide support from the authors of ClickHouse. Supports on-premise and cloud deployments. Ask details on clickhouse-support@yandex-team.com diff --git a/docs/en/development/adding_test_queries.md b/docs/en/development/adding_test_queries.md index 95dfd076a12..4da027b8fb1 100644 --- a/docs/en/development/adding_test_queries.md +++ b/docs/en/development/adding_test_queries.md @@ -4,11 +4,11 @@ ClickHouse has hundreds (or even thousands) of features. Every commit gets check The core functionality is very well tested, but some corner-cases and different combinations of features can be uncovered with ClickHouse CI. -Most of the bugs/regressions we see happen in that 'grey area' where test coverage is poor. +Most of the bugs/regressions we see happen in that 'grey area' where test coverage is poor. -And we are very interested in covering most of the possible scenarios and feature combinations used in real life by tests. +And we are very interested in covering most of the possible scenarios and feature combinations used in real life by tests. -## Why adding tests +## Why adding tests Why/when you should add a test case into ClickHouse code: 1) you use some complicated scenarios / feature combinations / you have some corner case which is probably not widely used @@ -17,18 +17,18 @@ Why/when you should add a test case into ClickHouse code: 4) once the test is added/accepted, you can be sure the corner case you check will never be accidentally broken. 5) you will be a part of great open-source community 6) your name will be visible in the `system.contributors` table! -7) you will make a world bit better :) +7) you will make a world bit better :) ### Steps to do -#### Prerequisite +#### Prerequisite -I assume you run some Linux machine (you can use docker / virtual machines on other OS) and any modern browser / internet connection, and you have some basic Linux & SQL skills. +I assume you run some Linux machine (you can use docker / virtual machines on other OS) and any modern browser / internet connection, and you have some basic Linux & SQL skills. Any highly specialized knowledge is not needed (so you don't need to know C++ or know something about how ClickHouse CI works). -#### Preparation +#### Preparation 1) [create GitHub account](https://github.com/join) (if you haven't one yet) 2) [setup git](https://docs.github.com/en/free-pro-team@latest/github/getting-started-with-github/set-up-git) @@ -54,17 +54,17 @@ git remote add upstream https://github.com/ClickHouse/ClickHouse #### New branch for the test -1) create a new branch from the latest clickhouse master +1) create a new branch from the latest clickhouse master ``` cd ~/workspace/ClickHouse git fetch upstream -git checkout -b name_for_a_branch_with_my_test upstream/master +git checkout -b name_for_a_branch_with_my_test upstream/master ``` -#### Install & run clickhouse +#### Install & run clickhouse 1) install `clickhouse-server` (follow [official docs](https://clickhouse.tech/docs/en/getting-started/install/)) -2) install test configurations (it will use Zookeeper mock implementation and adjust some settings) +2) install test configurations (it will use Zookeeper mock implementation and adjust some settings) ``` cd ~/workspace/ClickHouse/tests/config sudo ./install.sh @@ -74,7 +74,7 @@ sudo ./install.sh sudo systemctl restart clickhouse-server ``` -#### Creating the test file +#### Creating the test file 1) find the number for your test - find the file with the biggest number in `tests/queries/0_stateless/` @@ -86,7 +86,7 @@ tests/queries/0_stateless/01520_client_print_query_id.reference ``` Currently, the last number for the test is `01520`, so my test will have the number `01521` -2) create an SQL file with the next number and name of the feature you test +2) create an SQL file with the next number and name of the feature you test ```sh touch tests/queries/0_stateless/01521_dummy_test.sql @@ -105,30 +105,40 @@ clickhouse-client -nmT < tests/queries/0_stateless/01521_dummy_test.sql | tee te 5) ensure everything is correct, if the test output is incorrect (due to some bug for example), adjust the reference file using text editor. -#### How to create good test +#### How to create a good test -- test should be +- A test should be - minimal - create only tables related to tested functionality, remove unrelated columns and parts of query - - fast - should not take longer than few seconds (better subseconds) + - fast - should not take longer than a few seconds (better subseconds) - correct - fails then feature is not working - deterministic - - isolated / stateless + - isolated / stateless - don't rely on some environment things - - don't rely on timing when possible -- try to cover corner cases (zeros / Nulls / empty sets / throwing exceptions) + - don't rely on timing when possible +- try to cover corner cases (zeros / Nulls / empty sets / throwing exceptions) - to test that query return errors, you can put special comment after the query: `-- { serverError 60 }` or `-- { clientError 20 }` - don't switch databases (unless necessary) - you can create several table replicas on the same node if needed - you can use one of the test cluster definitions when needed (see system.clusters) - use `number` / `numbers_mt` / `zeros` / `zeros_mt` and similar for queries / to initialize data when applicable -- clean up the created objects after test and before the test (DROP IF EXISTS) - in case of some dirty state +- clean up the created objects after test and before the test (DROP IF EXISTS) - in case of some dirty state - prefer sync mode of operations (mutations, merges, etc.) - use other SQL files in the `0_stateless` folder as an example - ensure the feature / feature combination you want to test is not yet covered with existing tests +#### Test naming rules + +It's important to name tests correctly, so one could turn some tests subset off in clickhouse-test invocation. + +| Tester flag| What should be in test name | When flag should be added | +|---|---|---|---| +| `--[no-]zookeeper`| "zookeeper" or "replica" | Test uses tables from ReplicatedMergeTree family | +| `--[no-]shard` | "shard" or "distributed" or "global"| Test using connections to 127.0.0.2 or similar | +| `--[no-]long` | "long" or "deadlock" or "race" | Test runs longer than 60 seconds | + #### Commit / push / create PR. -1) commit & push your changes +1) commit & push your changes ```sh cd ~/workspace/ClickHouse git add tests/queries/0_stateless/01521_dummy_test.sql @@ -137,5 +147,5 @@ git commit # use some nice commit message when possible git push origin HEAD ``` 2) use a link which was shown during the push, to create a PR into the main repo -3) adjust the PR title and contents, in `Changelog category (leave one)` keep -`Build/Testing/Packaging Improvement`, fill the rest of the fields if you want. +3) adjust the PR title and contents, in `Changelog category (leave one)` keep +`Build/Testing/Packaging Improvement`, fill the rest of the fields if you want. diff --git a/docs/en/development/build.md b/docs/en/development/build.md index 8ef12221e8d..be45c1ed5f7 100644 --- a/docs/en/development/build.md +++ b/docs/en/development/build.md @@ -134,10 +134,10 @@ $ ./release ## Faster builds for development -Normally all tools of the ClickHouse bundle, such as `clickhouse-server`, `clickhouse-client` etc., are linked into a single static executable, `clickhouse`. This executable must be re-linked on every change, which might be slow. Two common ways to improve linking time are to use `lld` linker, and use the 'split' build configuration, which builds a separate binary for every tool, and further splits the code into several shared libraries. To enable these tweaks, pass the following flags to `cmake`: +Normally all tools of the ClickHouse bundle, such as `clickhouse-server`, `clickhouse-client` etc., are linked into a single static executable, `clickhouse`. This executable must be re-linked on every change, which might be slow. One common way to improve build time is to use the 'split' build configuration, which builds a separate binary for every tool, and further splits the code into several shared libraries. To enable this tweak, pass the following flags to `cmake`: ``` --DCMAKE_C_FLAGS="--ld-path=lld" -DCMAKE_CXX_FLAGS="--ld-path=lld" -DUSE_STATIC_LIBRARIES=0 -DSPLIT_SHARED_LIBRARIES=1 -DCLICKHOUSE_SPLIT_BINARY=1 +-DUSE_STATIC_LIBRARIES=0 -DSPLIT_SHARED_LIBRARIES=1 -DCLICKHOUSE_SPLIT_BINARY=1 ``` ## You Don’t Have to Build ClickHouse {#you-dont-have-to-build-clickhouse} @@ -155,6 +155,10 @@ Normally ClickHouse is statically linked into a single static `clickhouse` binar -DUSE_STATIC_LIBRARIES=0 -DSPLIT_SHARED_LIBRARIES=1 -DCLICKHOUSE_SPLIT_BINARY=1 ``` -Note that in this configuration there is no single `clickhouse` binary, and you have to run `clickhouse-server`, `clickhouse-client` etc. +Note that the split build has several drawbacks: +* There is no single `clickhouse` binary, and you have to run `clickhouse-server`, `clickhouse-client`, etc. +* Risk of segfault if you run any of the programs while rebuilding the project. +* You cannot run the integration tests since they only work a single complete binary. +* You can't easily copy the binaries elsewhere. Instead of moving a single binary you'll need to copy all binaries and libraries. [Original article](https://clickhouse.tech/docs/en/development/build/) diff --git a/docs/en/development/contrib.md b/docs/en/development/contrib.md index 64ca2387029..9daf6148324 100644 --- a/docs/en/development/contrib.md +++ b/docs/en/development/contrib.md @@ -7,13 +7,13 @@ toc_title: Third-Party Libraries Used The list of third-party libraries can be obtained by the following query: -``` -SELECT library_name, license_type, license_path FROM system.licenses ORDER BY library_name COLLATE 'en' +``` sql +SELECT library_name, license_type, license_path FROM system.licenses ORDER BY library_name COLLATE 'en'; ``` [Example](https://gh-api.clickhouse.tech/play?user=play#U0VMRUNUIGxpYnJhcnlfbmFtZSwgbGljZW5zZV90eXBlLCBsaWNlbnNlX3BhdGggRlJPTSBzeXN0ZW0ubGljZW5zZXMgT1JERVIgQlkgbGlicmFyeV9uYW1lIENPTExBVEUgJ2VuJw==) -| library_name | license_type | license_path | +| library_name | license_type | license_path | |:-|:-|:-| | abseil-cpp | Apache | /contrib/abseil-cpp/LICENSE | | AMQP-CPP | Apache | /contrib/AMQP-CPP/LICENSE | @@ -79,6 +79,7 @@ SELECT library_name, license_type, license_path FROM system.licenses ORDER BY li | re2 | BSD 3-clause | /contrib/re2/LICENSE | | replxx | BSD 3-clause | /contrib/replxx/LICENSE.md | | rocksdb | BSD 3-clause | /contrib/rocksdb/LICENSE.leveldb | +| s2geometry | Apache | /contrib/s2geometry/LICENSE | | sentry-native | MIT | /contrib/sentry-native/LICENSE | | simdjson | Apache | /contrib/simdjson/LICENSE | | snappy | Public Domain | /contrib/snappy/COPYING | @@ -89,3 +90,15 @@ SELECT library_name, license_type, license_path FROM system.licenses ORDER BY li | xz | Public Domain | /contrib/xz/COPYING | | zlib-ng | zLib | /contrib/zlib-ng/LICENSE.md | | zstd | BSD | /contrib/zstd/LICENSE | + +## Guidelines for adding new third-party libraries and maintaining custom changes in them {#adding-third-party-libraries} + +1. All external third-party code should reside in the dedicated directories under `contrib` directory of ClickHouse repo. Prefer Git submodules, when available. +2. Fork/mirror the official repo in [Clickhouse-extras](https://github.com/ClickHouse-Extras). Prefer official GitHub repos, when available. +3. Branch from the branch you want to integrate, e.g., `master` -> `clickhouse/master`, or `release/vX.Y.Z` -> `clickhouse/release/vX.Y.Z`. +4. All forks in [Clickhouse-extras](https://github.com/ClickHouse-Extras) can be automatically synchronized with upstreams. `clickhouse/...` branches will remain unaffected, since virtually nobody is going to use that naming pattern in their upstream repos. +5. Add submodules under `contrib` of ClickHouse repo that refer the above forks/mirrors. Set the submodules to track the corresponding `clickhouse/...` branches. +6. Every time the custom changes have to be made in the library code, a dedicated branch should be created, like `clickhouse/my-fix`. Then this branch should be merged into the branch, that is tracked by the submodule, e.g., `clickhouse/master` or `clickhouse/release/vX.Y.Z`. +7. No code should be pushed in any branch of the forks in [Clickhouse-extras](https://github.com/ClickHouse-Extras), whose names do not follow `clickhouse/...` pattern. +8. Always write the custom changes with the official repo in mind. Once the PR is merged from (a feature/fix branch in) your personal fork into the fork in [Clickhouse-extras](https://github.com/ClickHouse-Extras), and the submodule is bumped in ClickHouse repo, consider opening another PR from (a feature/fix branch in) the fork in [Clickhouse-extras](https://github.com/ClickHouse-Extras) to the official repo of the library. This will make sure, that 1) the contribution has more than a single use case and importance, 2) others will also benefit from it, 3) the change will not remain a maintenance burden solely on ClickHouse developers. +9. When a submodule needs to start using a newer code from the original branch (e.g., `master`), and since the custom changes might be merged in the branch it is tracking (e.g., `clickhouse/master`) and so it may diverge from its original counterpart (i.e., `master`), a careful merge should be carried out first, i.e., `master` -> `clickhouse/master`, and only then the submodule can be bumped in ClickHouse. diff --git a/docs/en/development/developer-instruction.md b/docs/en/development/developer-instruction.md index ac6d4a2b563..537ed6a9c4f 100644 --- a/docs/en/development/developer-instruction.md +++ b/docs/en/development/developer-instruction.md @@ -123,7 +123,7 @@ For installing CMake and Ninja on Mac OS X first install Homebrew and then insta /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" brew install cmake ninja -Next, check the version of CMake: `cmake --version`. If it is below 3.3, you should install a newer version from the website: https://cmake.org/download/. +Next, check the version of CMake: `cmake --version`. If it is below 3.12, you should install a newer version from the website: https://cmake.org/download/. ## Optional External Libraries {#optional-external-libraries} @@ -237,6 +237,8 @@ The description of ClickHouse architecture can be found here: https://clickhouse The Code Style Guide: https://clickhouse.tech/docs/en/development/style/ +Adding third-party libraries: https://clickhouse.tech/docs/en/development/contrib/#adding-third-party-libraries + Writing tests: https://clickhouse.tech/docs/en/development/tests/ List of tasks: https://github.com/ClickHouse/ClickHouse/issues?q=is%3Aopen+is%3Aissue+label%3A%22easy+task%22 diff --git a/docs/en/development/style.md b/docs/en/development/style.md index 2151735c2f4..987df275c1d 100644 --- a/docs/en/development/style.md +++ b/docs/en/development/style.md @@ -628,7 +628,7 @@ If the class is not intended for polymorphic use, you do not need to make functi **18.** Encodings. -Use UTF-8 everywhere. Use `std::string`and`char *`. Do not use `std::wstring`and`wchar_t`. +Use UTF-8 everywhere. Use `std::string` and `char *`. Do not use `std::wstring` and `wchar_t`. **19.** Logging. @@ -749,17 +749,9 @@ If your code in the `master` branch is not buildable yet, exclude it from the bu **1.** The C++20 standard library is used (experimental extensions are allowed), as well as `boost` and `Poco` frameworks. -**2.** If necessary, you can use any well-known libraries available in the OS package. +**2.** It is not allowed to use libraries from OS packages. It is also not allowed to use pre-installed libraries. All libraries should be placed in form of source code in `contrib` directory and built with ClickHouse. See [Guidelines for adding new third-party libraries](contrib.md#adding-third-party-libraries) for details. -If there is a good solution already available, then use it, even if it means you have to install another library. - -(But be prepared to remove bad libraries from code.) - -**3.** You can install a library that isn’t in the packages, if the packages do not have what you need or have an outdated version or the wrong type of compilation. - -**4.** If the library is small and does not have its own complex build system, put the source files in the `contrib` folder. - -**5.** Preference is always given to libraries that are already in use. +**3.** Preference is always given to libraries that are already in use. ## General Recommendations {#general-recommendations-1} diff --git a/docs/en/development/tests.md b/docs/en/development/tests.md index 4231bda6c35..c7c0ec88be4 100644 --- a/docs/en/development/tests.md +++ b/docs/en/development/tests.md @@ -70,7 +70,13 @@ Note that integration of ClickHouse with third-party drivers is not tested. Also Unit tests are useful when you want to test not the ClickHouse as a whole, but a single isolated library or class. You can enable or disable build of tests with `ENABLE_TESTS` CMake option. Unit tests (and other test programs) are located in `tests` subdirectories across the code. To run unit tests, type `ninja test`. Some tests use `gtest`, but some are just programs that return non-zero exit code on test failure. -It’s not necessarily to have unit tests if the code is already covered by functional tests (and functional tests are usually much more simple to use). +It’s not necessary to have unit tests if the code is already covered by functional tests (and functional tests are usually much more simple to use). + +You can run individual gtest checks by calling the executable directly, for example: + +```bash +$ ./src/unit_tests_dbms --gtest_filter=LocalAddress* +``` ## Performance Tests {#performance-tests} diff --git a/docs/en/engines/database-engines/atomic.md b/docs/en/engines/database-engines/atomic.md index 4f5f69a5ab7..1e555a0a502 100644 --- a/docs/en/engines/database-engines/atomic.md +++ b/docs/en/engines/database-engines/atomic.md @@ -5,19 +5,19 @@ toc_title: Atomic # Atomic {#atomic} -It supports non-blocking [DROP TABLE](#drop-detach-table) and [RENAME TABLE](#rename-table) queries and atomic [EXCHANGE TABLES t1 AND t2](#exchange-tables) queries. `Atomic` database engine is used by default. +It supports non-blocking [DROP TABLE](#drop-detach-table) and [RENAME TABLE](#rename-table) queries and atomic [EXCHANGE TABLES](#exchange-tables) queries. `Atomic` database engine is used by default. ## Creating a Database {#creating-a-database} ``` sql - CREATE DATABASE test[ ENGINE = Atomic]; +CREATE DATABASE test [ENGINE = Atomic]; ``` ## Specifics and recommendations {#specifics-and-recommendations} ### Table UUID {#table-uuid} -All tables in database `Atomic` have persistent [UUID](../../sql-reference/data-types/uuid.md) and store data in directory `/clickhouse_path/store/xxx/xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy/`, where `xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy` is UUID of the table. +All tables in database `Atomic` have persistent [UUID](../../sql-reference/data-types/uuid.md) and store data in directory `/clickhouse_path/store/xxx/xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy/`, where `xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy` is UUID of the table. Usually, the UUID is generated automatically, but the user can also explicitly specify the UUID in the same way when creating the table (this is not recommended). To display the `SHOW CREATE` query with the UUID you can use setting [show_table_uuid_in_table_create_query_if_not_nil](../../operations/settings/settings.md#show_table_uuid_in_table_create_query_if_not_nil). For example: ```sql @@ -25,16 +25,16 @@ CREATE TABLE name UUID '28f1c61c-2970-457a-bffe-454156ddcfef' (n UInt64) ENGINE ``` ### RENAME TABLE {#rename-table} -`RENAME` queries are performed without changing UUID and moving table data. These queries do not wait for the completion of queries using the table and will be executed instantly. +[RENAME](../../sql-reference/statements/rename.md) queries are performed without changing UUID and moving table data. These queries do not wait for the completion of queries using the table and are executed instantly. ### DROP/DETACH TABLE {#drop-detach-table} -On `DROP TABLE` no data is removed, database `Atomic` just marks table as dropped by moving metadata to `/clickhouse_path/metadata_dropped/` and notifies background thread. Delay before final table data deletion is specify by [database_atomic_delay_before_drop_table_sec](../../operations/server-configuration-parameters/settings.md#database_atomic_delay_before_drop_table_sec) setting. +On `DROP TABLE` no data is removed, database `Atomic` just marks table as dropped by moving metadata to `/clickhouse_path/metadata_dropped/` and notifies background thread. Delay before final table data deletion is specified by the [database_atomic_delay_before_drop_table_sec](../../operations/server-configuration-parameters/settings.md#database_atomic_delay_before_drop_table_sec) setting. You can specify synchronous mode using `SYNC` modifier. Use the [database_atomic_wait_for_drop_and_detach_synchronously](../../operations/settings/settings.md#database_atomic_wait_for_drop_and_detach_synchronously) setting to do this. In this case `DROP` waits for running `SELECT`, `INSERT` and other queries which are using the table to finish. Table will be actually removed when it's not in use. -### EXCHANGE TABLES {#exchange-tables} +### EXCHANGE TABLES/DICTIONARIES {#exchange-tables} -`EXCHANGE` query swaps tables atomically. So instead of this non-atomic operation: +[EXCHANGE](../../sql-reference/statements/exchange.md) query swaps tables or dictionaries atomically. For instance, instead of this non-atomic operation: ```sql RENAME TABLE new_table TO tmp, old_table TO new_table, tmp TO old_table; @@ -47,7 +47,7 @@ EXCHANGE TABLES new_table AND old_table; ### ReplicatedMergeTree in Atomic Database {#replicatedmergetree-in-atomic-database} -For [ReplicatedMergeTree](../table-engines/mergetree-family/replication.md#table_engines-replication) tables, it is recommended to not specify engine parameters - path in ZooKeeper and replica name. In this case, configuration parameters will be used [default_replica_path](../../operations/server-configuration-parameters/settings.md#default_replica_path) and [default_replica_name](../../operations/server-configuration-parameters/settings.md#default_replica_name). If you want to specify engine parameters explicitly, it is recommended to use {uuid} macros. This is useful so that unique paths are automatically generated for each table in ZooKeeper. +For [ReplicatedMergeTree](../table-engines/mergetree-family/replication.md#table_engines-replication) tables, it is recommended not to specify engine parameters - path in ZooKeeper and replica name. In this case, configuration parameters [default_replica_path](../../operations/server-configuration-parameters/settings.md#default_replica_path) and [default_replica_name](../../operations/server-configuration-parameters/settings.md#default_replica_name) will be used. If you want to specify engine parameters explicitly, it is recommended to use `{uuid}` macros. This is useful so that unique paths are automatically generated for each table in ZooKeeper. ## See Also diff --git a/docs/en/engines/database-engines/index.md b/docs/en/engines/database-engines/index.md index b6892099378..1d1028cbeb5 100644 --- a/docs/en/engines/database-engines/index.md +++ b/docs/en/engines/database-engines/index.md @@ -8,13 +8,13 @@ toc_title: Introduction Database engines allow you to work with tables. -By default, ClickHouse uses database engine [Atomic](../../engines/database-engines/atomic.md). It is provides configurable [table engines](../../engines/table-engines/index.md) and an [SQL dialect](../../sql-reference/syntax.md). +By default, ClickHouse uses database engine [Atomic](../../engines/database-engines/atomic.md). It provides configurable [table engines](../../engines/table-engines/index.md) and an [SQL dialect](../../sql-reference/syntax.md). You can also use the following database engines: - [MySQL](../../engines/database-engines/mysql.md) -- [MaterializeMySQL](../../engines/database-engines/materialize-mysql.md) +- [MaterializedMySQL](../../engines/database-engines/materialized-mysql.md) - [Lazy](../../engines/database-engines/lazy.md) @@ -22,4 +22,4 @@ You can also use the following database engines: - [PostgreSQL](../../engines/database-engines/postgresql.md) -[Original article](https://clickhouse.tech/docs/en/database_engines/) +- [Replicated](../../engines/database-engines/replicated.md) diff --git a/docs/en/engines/database-engines/materialize-mysql.md b/docs/en/engines/database-engines/materialized-mysql.md similarity index 55% rename from docs/en/engines/database-engines/materialize-mysql.md rename to docs/en/engines/database-engines/materialized-mysql.md index 93e4aedfd5a..d329dff32c5 100644 --- a/docs/en/engines/database-engines/materialize-mysql.md +++ b/docs/en/engines/database-engines/materialized-mysql.md @@ -1,21 +1,22 @@ --- toc_priority: 29 -toc_title: MaterializeMySQL +toc_title: "[experimental] MaterializedMySQL" --- -# MaterializeMySQL {#materialize-mysql} +# [experimental] MaterializedMySQL {#materialized-mysql} + +!!! warning "Warning" + This is an experimental feature that should not be used in production. Creates ClickHouse database with all the tables existing in MySQL, and all the data in those tables. ClickHouse server works as MySQL replica. It reads binlog and performs DDL and DML queries. -This feature is experimental. - ## Creating a Database {#creating-a-database} ``` sql CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] -ENGINE = MaterializeMySQL('host:port', ['database' | database], 'user', 'password') [SETTINGS ...] +ENGINE = MaterializedMySQL('host:port', ['database' | database], 'user', 'password') [SETTINGS ...] ``` **Engine Parameters** @@ -25,13 +26,40 @@ ENGINE = MaterializeMySQL('host:port', ['database' | database], 'user', 'passwor - `user` — MySQL user. - `password` — User password. -## Virtual columns {#virtual-columns} +**Engine Settings** + +- `max_rows_in_buffer` — Maximum number of rows that data is allowed to cache in memory (for single table and the cache data unable to query). When this number is exceeded, the data will be materialized. Default: `65 505`. +- `max_bytes_in_buffer` — Maximum number of bytes that data is allowed to cache in memory (for single table and the cache data unable to query). When this number is exceeded, the data will be materialized. Default: `1 048 576`. +- `max_rows_in_buffers` — Maximum number of rows that data is allowed to cache in memory (for database and the cache data unable to query). When this number is exceeded, the data will be materialized. Default: `65 505`. +- `max_bytes_in_buffers` — Maximum number of bytes that data is allowed to cache in memory (for database and the cache data unable to query). When this number is exceeded, the data will be materialized. Default: `1 048 576`. +- `max_flush_data_time` — Maximum number of milliseconds that data is allowed to cache in memory (for database and the cache data unable to query). When this time is exceeded, the data will be materialized. Default: `1000`. +- `max_wait_time_when_mysql_unavailable` — Retry interval when MySQL is not available (milliseconds). Negative value disables retry. Default: `1000`. +- `allows_query_when_mysql_lost` — Allows to query a materialized table when MySQL is lost. Default: `0` (`false`). + +```sql +CREATE DATABASE mysql ENGINE = MaterializedMySQL('localhost:3306', 'db', 'user', '***') + SETTINGS + allows_query_when_mysql_lost=true, + max_wait_time_when_mysql_unavailable=10000; +``` + +**Settings on MySQL-server Side** + +For the correct work of `MaterializedMySQL`, there are few mandatory `MySQL`-side configuration settings that must be set: + +- `default_authentication_plugin = mysql_native_password` since `MaterializedMySQL` can only authorize with this method. +- `gtid_mode = on` since GTID based logging is a mandatory for providing correct `MaterializedMySQL` replication. + +!!! attention "Attention" + While turning on `gtid_mode` you should also specify `enforce_gtid_consistency = on`. + +## Virtual Columns {#virtual-columns} + +When working with the `MaterializedMySQL` database engine, [ReplacingMergeTree](../../engines/table-engines/mergetree-family/replacingmergetree.md) tables are used with virtual `_sign` and `_version` columns. -When working with the `MaterializeMySQL` database engine, [ReplacingMergeTree](../../engines/table-engines/mergetree-family/replacingmergetree.md) tables are used with virtual `_sign` and `_version` columns. - - `_version` — Transaction counter. Type [UInt64](../../sql-reference/data-types/int-uint.md). - `_sign` — Deletion mark. Type [Int8](../../sql-reference/data-types/int-uint.md). Possible values: - - `1` — Row is not deleted, + - `1` — Row is not deleted, - `-1` — Row is deleted. ## Data Types Support {#data_types-support} @@ -53,35 +81,46 @@ When working with the `MaterializeMySQL` database engine, [ReplacingMergeTree](. | STRING | [String](../../sql-reference/data-types/string.md) | | VARCHAR, VAR_STRING | [String](../../sql-reference/data-types/string.md) | | BLOB | [String](../../sql-reference/data-types/string.md) | - -Other types are not supported. If MySQL table contains a column of such type, ClickHouse throws exception "Unhandled data type" and stops replication. +| BINARY | [FixedString](../../sql-reference/data-types/fixedstring.md) | [Nullable](../../sql-reference/data-types/nullable.md) is supported. +Other types are not supported. If MySQL table contains a column of such type, ClickHouse throws exception "Unhandled data type" and stops replication. + ## Specifics and Recommendations {#specifics-and-recommendations} +### Compatibility Restrictions {#compatibility-restrictions} + +Apart of the data types limitations there are few restrictions comparing to `MySQL` databases, that should be resolved before replication will be possible: + +- Each table in `MySQL` should contain `PRIMARY KEY`. + +- Replication for tables, those are containing rows with `ENUM` field values out of range (specified in `ENUM` signature) will not work. + ### DDL Queries {#ddl-queries} MySQL DDL queries are converted into the corresponding ClickHouse DDL queries ([ALTER](../../sql-reference/statements/alter/index.md), [CREATE](../../sql-reference/statements/create/index.md), [DROP](../../sql-reference/statements/drop.md), [RENAME](../../sql-reference/statements/rename.md)). If ClickHouse cannot parse some DDL query, the query is ignored. ### Data Replication {#data-replication} -`MaterializeMySQL` does not support direct `INSERT`, `DELETE` and `UPDATE` queries. However, they are supported in terms of data replication: +`MaterializedMySQL` does not support direct `INSERT`, `DELETE` and `UPDATE` queries. However, they are supported in terms of data replication: - MySQL `INSERT` query is converted into `INSERT` with `_sign=1`. -- MySQL `DELETE` query is converted into `INSERT` with `_sign=-1`. +- MySQL `DELETE` query is converted into `INSERT` with `_sign=-1`. - MySQL `UPDATE` query is converted into `INSERT` with `_sign=-1` and `INSERT` with `_sign=1`. -### Selecting from MaterializeMySQL Tables {#select} +### Selecting from MaterializedMySQL Tables {#select} -`SELECT` query from `MaterializeMySQL` tables has some specifics: +`SELECT` query from `MaterializedMySQL` tables has some specifics: - If `_version` is not specified in the `SELECT` query, [FINAL](../../sql-reference/statements/select/from.md#select-from-final) modifier is used. So only rows with `MAX(_version)` are selected. - If `_sign` is not specified in the `SELECT` query, `WHERE _sign=1` is used by default. So the deleted rows are not included into the result set. +- The result includes columns comments in case they exist in MySQL database tables. + ### Index Conversion {#index-conversion} MySQL `PRIMARY KEY` and `INDEX` clauses are converted into `ORDER BY` tuples in ClickHouse tables. @@ -91,10 +130,10 @@ ClickHouse has only one physical order, which is determined by `ORDER BY` clause **Notes** - Rows with `_sign=-1` are not deleted physically from the tables. -- Cascade `UPDATE/DELETE` queries are not supported by the `MaterializeMySQL` engine. +- Cascade `UPDATE/DELETE` queries are not supported by the `MaterializedMySQL` engine. - Replication can be easily broken. - Manual operations on database and tables are forbidden. -- `MaterializeMySQL` is influenced by [optimize_on_insert](../../operations/settings/settings.md#optimize-on-insert) setting. The data is merged in the corresponding table in the `MaterializeMySQL` database when a table in the MySQL server changes. +- `MaterializedMySQL` is influenced by [optimize_on_insert](../../operations/settings/settings.md#optimize-on-insert) setting. The data is merged in the corresponding table in the `MaterializedMySQL` database when a table in the MySQL server changes. ## Examples of Use {#examples-of-use} @@ -111,9 +150,9 @@ mysql> SELECT * FROM test; ``` ```text -+---+------+------+ ++---+------+------+ | a | b | c | -+---+------+------+ ++---+------+------+ | 2 | 222 | Wow! | +---+------+------+ ``` @@ -123,7 +162,7 @@ Database in ClickHouse, exchanging data with the MySQL server: The database and the table created: ``` sql -CREATE DATABASE mysql ENGINE = MaterializeMySQL('localhost:3306', 'db', 'user', '***'); +CREATE DATABASE mysql ENGINE = MaterializedMySQL('localhost:3306', 'db', 'user', '***'); SHOW TABLES FROM mysql; ``` @@ -140,9 +179,9 @@ SELECT * FROM mysql.test; ``` ``` text -┌─a─┬──b─┐ -│ 1 │ 11 │ -│ 2 │ 22 │ +┌─a─┬──b─┐ +│ 1 │ 11 │ +│ 2 │ 22 │ └───┴────┘ ``` @@ -153,9 +192,9 @@ SELECT * FROM mysql.test; ``` ``` text -┌─a─┬───b─┬─c────┐ -│ 2 │ 222 │ Wow! │ +┌─a─┬───b─┬─c────┐ +│ 2 │ 222 │ Wow! │ └───┴─────┴──────┘ ``` -[Original article](https://clickhouse.tech/docs/en/engines/database-engines/materialize-mysql/) +[Original article](https://clickhouse.tech/docs/en/engines/database-engines/materialized-mysql/) diff --git a/docs/en/engines/database-engines/materialized-postgresql.md b/docs/en/engines/database-engines/materialized-postgresql.md index 6b8c6e86952..89c7c803bb3 100644 --- a/docs/en/engines/database-engines/materialized-postgresql.md +++ b/docs/en/engines/database-engines/materialized-postgresql.md @@ -3,45 +3,52 @@ toc_priority: 30 toc_title: MaterializedPostgreSQL --- -# MaterializedPostgreSQL {#materialize-postgresql} +# [experimental] MaterializedPostgreSQL {#materialize-postgresql} + +Creates ClickHouse database with an initial data dump of PostgreSQL database tables and starts replication process, i.e. executes background job to apply new changes as they happen on PostgreSQL database tables in the remote PostgreSQL database. + +ClickHouse server works as PostgreSQL replica. It reads WAL and performs DML queries. DDL is not replicated, but can be handled (described below). ## Creating a Database {#creating-a-database} ``` sql -CREATE DATABASE test_database -ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgres_user', 'postgres_password' - -SELECT * FROM test_database.postgres_table; +CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] +ENGINE = MaterializedPostgreSQL('host:port', ['database' | database], 'user', 'password') [SETTINGS ...] ``` +**Engine Parameters** + +- `host:port` — PostgreSQL server endpoint. +- `database` — PostgreSQL database name. +- `user` — PostgreSQL user. +- `password` — User password. ## Settings {#settings} -1. `materialized_postgresql_max_block_size` - Number of rows collected before flushing data into table. Default: `65536`. +- [materialized_postgresql_max_block_size](../../operations/settings/settings.md#materialized-postgresql-max-block-size) -2. `materialized_postgresql_tables_list` - List of tables for MaterializedPostgreSQL database engine. Default: `whole database`. +- [materialized_postgresql_tables_list](../../operations/settings/settings.md#materialized-postgresql-tables-list) -3. `materialized_postgresql_allow_automatic_update` - Allow to reload table in the background, when schema changes are detected. Default: `0` (`false`). +- [materialized_postgresql_allow_automatic_update](../../operations/settings/settings.md#materialized-postgresql-allow-automatic-update) ``` sql -CREATE DATABASE test_database -ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgres_user', 'postgres_password' +CREATE DATABASE database1 +ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgres_user', 'postgres_password') SETTINGS materialized_postgresql_max_block_size = 65536, materialized_postgresql_tables_list = 'table1,table2,table3'; -SELECT * FROM test_database.table1; +SELECT * FROM database1.table1; ``` - ## Requirements {#requirements} -- Setting `wal_level`to `logical` and `max_replication_slots` to at least `2` in the postgresql config file. +1. The [wal_level](https://www.postgresql.org/docs/current/runtime-config-wal.html) setting must have a value `logical` and `max_replication_slots` parameter must have a value at least `2` in the PostgreSQL config file. -- Each replicated table must have one of the following **replica identity**: +2. Each replicated table must have one of the following [replica identity](https://www.postgresql.org/docs/10/sql-altertable.html#SQL-CREATETABLE-REPLICA-IDENTITY): -1. **default** (primary key) +- primary key (by default) -2. **index** +- index ``` bash postgres# CREATE TABLE postgres_table (a Integer NOT NULL, b Integer, c Integer NOT NULL, d Integer, e Integer NOT NULL); @@ -49,9 +56,8 @@ postgres# CREATE unique INDEX postgres_table_index on postgres_table(a, c, e); postgres# ALTER TABLE postgres_table REPLICA IDENTITY USING INDEX postgres_table_index; ``` - -Primary key is always checked first. If it is absent, then index, defined as replica identity index, is checked. -If index is used as replica identity, there has to be only one such index in a table. +The primary key is always checked first. If it is absent, then the index, defined as replica identity index, is checked. +If the index is used as a replica identity, there has to be only one such index in a table. You can check what type is used for a specific table with the following command: ``` bash @@ -65,7 +71,14 @@ FROM pg_class WHERE oid = 'postgres_table'::regclass; ``` +!!! warning "Warning" + Replication of [**TOAST**](https://www.postgresql.org/docs/9.5/storage-toast.html) values is not supported. The default value for the data type will be used. + +## Example of Use {#example-of-use} -## Warning {#warning} +``` sql +CREATE DATABASE postgresql_db +ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgres_user', 'postgres_password'); -1. **TOAST** values convertion is not supported. Default value for the data type will be used. +SELECT * FROM postgresql_db.postgres_table; +``` diff --git a/docs/en/engines/database-engines/mysql.md b/docs/en/engines/database-engines/mysql.md index 2de07d1fe4b..0507be6bd46 100644 --- a/docs/en/engines/database-engines/mysql.md +++ b/docs/en/engines/database-engines/mysql.md @@ -53,7 +53,7 @@ All other MySQL data types are converted into [String](../../sql-reference/data- ## Global Variables Support {#global-variables-support} -For better compatibility you may address global variables in MySQL style, as `@@identifier`. +For better compatibility you may address global variables in MySQL style, as `@@identifier`. These variables are supported: - `version` diff --git a/docs/en/engines/database-engines/postgresql.md b/docs/en/engines/database-engines/postgresql.md index 1fa86b7ac21..9e339f9d6f4 100644 --- a/docs/en/engines/database-engines/postgresql.md +++ b/docs/en/engines/database-engines/postgresql.md @@ -14,8 +14,8 @@ Supports table structure modifications (`ALTER TABLE ... ADD|DROP COLUMN`). If ` ## Creating a Database {#creating-a-database} ``` sql -CREATE DATABASE test_database -ENGINE = PostgreSQL('host:port', 'database', 'user', 'password'[, `use_table_cache`]); +CREATE DATABASE test_database +ENGINE = PostgreSQL('host:port', 'database', 'user', 'password'[, `schema`, `use_table_cache`]); ``` **Engine Parameters** @@ -24,6 +24,7 @@ ENGINE = PostgreSQL('host:port', 'database', 'user', 'password'[, `use_table_cac - `database` — Remote database name. - `user` — PostgreSQL user. - `password` — User password. +- `schema` — PostgreSQL schema. - `use_table_cache` — Defines if the database table structure is cached or not. Optional. Default value: `0`. ## Data Types Support {#data_types-support} @@ -43,14 +44,14 @@ ENGINE = PostgreSQL('host:port', 'database', 'user', 'password'[, `use_table_cac | TEXT, CHAR | [String](../../sql-reference/data-types/string.md) | | INTEGER | Nullable([Int32](../../sql-reference/data-types/int-uint.md))| | ARRAY | [Array](../../sql-reference/data-types/array.md) | - + ## Examples of Use {#examples-of-use} Database in ClickHouse, exchanging data with the PostgreSQL server: ``` sql -CREATE DATABASE test_database +CREATE DATABASE test_database ENGINE = PostgreSQL('postgres1:5432', 'test_database', 'postgres', 'mysecretpassword', 1); ``` @@ -102,7 +103,7 @@ SELECT * FROM test_database.test_table; └────────┴───────┘ ``` -Consider the table structure was modified in PostgreSQL: +Consider the table structure was modified in PostgreSQL: ``` sql postgre> ALTER TABLE test_table ADD COLUMN data Text diff --git a/docs/en/engines/database-engines/replicated.md b/docs/en/engines/database-engines/replicated.md new file mode 100644 index 00000000000..5ce73604207 --- /dev/null +++ b/docs/en/engines/database-engines/replicated.md @@ -0,0 +1,120 @@ +--- +toc_priority: 36 +toc_title: Replicated +--- + +# [experimental] Replicated {#replicated} + +The engine is based on the [Atomic](../../engines/database-engines/atomic.md) engine. It supports replication of metadata via DDL log being written to ZooKeeper and executed on all of the replicas for a given database. + +One ClickHouse server can have multiple replicated databases running and updating at the same time. But there can't be multiple replicas of the same replicated database. + +## Creating a Database {#creating-a-database} +``` sql + CREATE DATABASE testdb ENGINE = Replicated('zoo_path', 'shard_name', 'replica_name') [SETTINGS ...] +``` + +**Engine Parameters** + +- `zoo_path` — ZooKeeper path. The same ZooKeeper path corresponds to the same database. +- `shard_name` — Shard name. Database replicas are grouped into shards by `shard_name`. +- `replica_name` — Replica name. Replica names must be different for all replicas of the same shard. + +!!! note "Warning" + For [ReplicatedMergeTree](../table-engines/mergetree-family/replication.md#table_engines-replication) tables if no arguments provided, then default arguments are used: `/clickhouse/tables/{uuid}/{shard}` and `{replica}`. These can be changed in the server settings [default_replica_path](../../operations/server-configuration-parameters/settings.md#default_replica_path) and [default_replica_name](../../operations/server-configuration-parameters/settings.md#default_replica_name). Macro `{uuid}` is unfolded to table's uuid, `{shard}` and `{replica}` are unfolded to values from server config, not from database engine arguments. But in the future, it will be possible to use `shard_name` and `replica_name` of Replicated database. + +## Specifics and Recommendations {#specifics-and-recommendations} + +DDL queries with `Replicated` database work in a similar way to [ON CLUSTER](../../sql-reference/distributed-ddl.md) queries, but with minor differences. + +First, the DDL request tries to execute on the initiator (the host that originally received the request from the user). If the request is not fulfilled, then the user immediately receives an error, other hosts do not try to fulfill it. If the request has been successfully completed on the initiator, then all other hosts will automatically retry until they complete it. The initiator will try to wait for the query to be completed on other hosts (no longer than [distributed_ddl_task_timeout](../../operations/settings/settings.md#distributed_ddl_task_timeout)) and will return a table with the query execution statuses on each host. + +The behavior in case of errors is regulated by the [distributed_ddl_output_mode](../../operations/settings/settings.md#distributed_ddl_output_mode) setting, for a `Replicated` database it is better to set it to `null_status_on_timeout` — i.e. if some hosts did not have time to execute the request for [distributed_ddl_task_timeout](../../operations/settings/settings.md#distributed_ddl_task_timeout), then do not throw an exception, but show the `NULL` status for them in the table. + +The [system.clusters](../../operations/system-tables/clusters.md) system table contains a cluster named like the replicated database, which consists of all replicas of the database. This cluster is updated automatically when creating/deleting replicas, and it can be used for [Distributed](../../engines/table-engines/special/distributed.md#distributed) tables. + +When creating a new replica of the database, this replica creates tables by itself. If the replica has been unavailable for a long time and has lagged behind the replication log — it checks its local metadata with the current metadata in ZooKeeper, moves the extra tables with data to a separate non-replicated database (so as not to accidentally delete anything superfluous), creates the missing tables, updates the table names if they have been renamed. The data is replicated at the `ReplicatedMergeTree` level, i.e. if the table is not replicated, the data will not be replicated (the database is responsible only for metadata). + +## Usage Example {#usage-example} + +Creating a cluster with three hosts: + +``` sql +node1 :) CREATE DATABASE r ENGINE=Replicated('some/path/r','shard1','replica1'); +node2 :) CREATE DATABASE r ENGINE=Replicated('some/path/r','shard1','other_replica'); +node3 :) CREATE DATABASE r ENGINE=Replicated('some/path/r','other_shard','{replica}'); +``` + +Running the DDL-query: + +``` sql +CREATE TABLE r.rmt (n UInt64) ENGINE=ReplicatedMergeTree ORDER BY n; +``` + +``` text +┌─────hosts────────────┬──status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ +│ shard1|replica1 │ 0 │ │ 2 │ 0 │ +│ shard1|other_replica │ 0 │ │ 1 │ 0 │ +│ other_shard|r1 │ 0 │ │ 0 │ 0 │ +└──────────────────────┴─────────┴───────┴─────────────────────┴──────────────────┘ +``` + +Showing the system table: + +``` sql +SELECT cluster, shard_num, replica_num, host_name, host_address, port, is_local +FROM system.clusters WHERE cluster='r'; +``` + +``` text +┌─cluster─┬─shard_num─┬─replica_num─┬─host_name─┬─host_address─┬─port─┬─is_local─┐ +│ r │ 1 │ 1 │ node3 │ 127.0.0.1 │ 9002 │ 0 │ +│ r │ 2 │ 1 │ node2 │ 127.0.0.1 │ 9001 │ 0 │ +│ r │ 2 │ 2 │ node1 │ 127.0.0.1 │ 9000 │ 1 │ +└─────────┴───────────┴─────────────┴───────────┴──────────────┴──────┴──────────┘ +``` + +Creating a distributed table and inserting the data: + +``` sql +node2 :) CREATE TABLE r.d (n UInt64) ENGINE=Distributed('r','r','rmt', n % 2); +node3 :) INSERT INTO r SELECT * FROM numbers(10); +node1 :) SELECT materialize(hostName()) AS host, groupArray(n) FROM r.d GROUP BY host; +``` + +``` text +┌─hosts─┬─groupArray(n)─┐ +│ node1 │ [1,3,5,7,9] │ +│ node2 │ [0,2,4,6,8] │ +└───────┴───────────────┘ +``` + +Adding replica on the one more host: + +``` sql +node4 :) CREATE DATABASE r ENGINE=Replicated('some/path/r','other_shard','r2'); +``` + +The cluster configuration will look like this: + +``` text +┌─cluster─┬─shard_num─┬─replica_num─┬─host_name─┬─host_address─┬─port─┬─is_local─┐ +│ r │ 1 │ 1 │ node3 │ 127.0.0.1 │ 9002 │ 0 │ +│ r │ 1 │ 2 │ node4 │ 127.0.0.1 │ 9003 │ 0 │ +│ r │ 2 │ 1 │ node2 │ 127.0.0.1 │ 9001 │ 0 │ +│ r │ 2 │ 2 │ node1 │ 127.0.0.1 │ 9000 │ 1 │ +└─────────┴───────────┴─────────────┴───────────┴──────────────┴──────┴──────────┘ +``` + +The distributed table also will get data from the new host: + +```sql +node2 :) SELECT materialize(hostName()) AS host, groupArray(n) FROM r.d GROUP BY host; +``` + +```text +┌─hosts─┬─groupArray(n)─┐ +│ node2 │ [1,3,5,7,9] │ +│ node4 │ [0,2,4,6,8] │ +└───────┴───────────────┘ +``` \ No newline at end of file diff --git a/docs/en/engines/table-engines/integrations/ExternalDistributed.md b/docs/en/engines/table-engines/integrations/ExternalDistributed.md index 819abdbf9d7..0ecbc5383e1 100644 --- a/docs/en/engines/table-engines/integrations/ExternalDistributed.md +++ b/docs/en/engines/table-engines/integrations/ExternalDistributed.md @@ -35,7 +35,7 @@ The table structure can differ from the original table structure: - `password` — User password. ## Implementation Details {#implementation-details} - + Supports multiple replicas that must be listed by `|` and shards must be listed by `,`. For example: ```sql diff --git a/docs/en/engines/table-engines/integrations/embedded-rocksdb.md b/docs/en/engines/table-engines/integrations/embedded-rocksdb.md index 88c8973eeab..b55f1b68aea 100644 --- a/docs/en/engines/table-engines/integrations/embedded-rocksdb.md +++ b/docs/en/engines/table-engines/integrations/embedded-rocksdb.md @@ -20,7 +20,7 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] Required parameters: -- `primary_key_name` – any column name in the column list. +- `primary_key_name` – any column name in the column list. - `primary key` must be specified, it supports only one column in the primary key. The primary key will be serialized in binary as a `rocksdb key`. - columns other than the primary key will be serialized in binary as `rocksdb` value in corresponding order. - queries with key `equals` or `in` filtering will be optimized to multi keys lookup from `rocksdb`. @@ -39,4 +39,46 @@ ENGINE = EmbeddedRocksDB PRIMARY KEY key ``` +## Metrics + +There is also `system.rocksdb` table, that expose rocksdb statistics: + +```sql +SELECT + name, + value +FROM system.rocksdb + +┌─name──────────────────────┬─value─┐ +│ no.file.opens │ 1 │ +│ number.block.decompressed │ 1 │ +└───────────────────────────┴───────┘ +``` + +## Configuration + +You can also change any [rocksdb options](https://github.com/facebook/rocksdb/wiki/Option-String-and-Option-Map) using config: + +```xml + + + 8 + + + 2 + + + + TABLE + + 8 + + + 2 + +
+
+
+``` + [Original article](https://clickhouse.tech/docs/en/engines/table-engines/integrations/embedded-rocksdb/) diff --git a/docs/en/engines/table-engines/integrations/hdfs.md b/docs/en/engines/table-engines/integrations/hdfs.md index cf4bb5ecbf7..677354b4f97 100644 --- a/docs/en/engines/table-engines/integrations/hdfs.md +++ b/docs/en/engines/table-engines/integrations/hdfs.md @@ -50,11 +50,11 @@ SELECT * FROM hdfs_engine_table LIMIT 2 ## Implementation Details {#implementation-details} -- Reads and writes can be parallel +- Reads and writes can be parallel. +- [Zero-copy](../../../operations/storing-data.md#zero-copy) replication is supported. - Not supported: - `ALTER` and `SELECT...SAMPLE` operations. - Indexes. - - Replication. **Globs in path** @@ -71,12 +71,12 @@ Constructions with `{}` are similar to the [remote](../../../sql-reference/table 1. Suppose we have several files in TSV format with the following URIs on HDFS: -- ‘hdfs://hdfs1:9000/some_dir/some_file_1’ -- ‘hdfs://hdfs1:9000/some_dir/some_file_2’ -- ‘hdfs://hdfs1:9000/some_dir/some_file_3’ -- ‘hdfs://hdfs1:9000/another_dir/some_file_1’ -- ‘hdfs://hdfs1:9000/another_dir/some_file_2’ -- ‘hdfs://hdfs1:9000/another_dir/some_file_3’ +- 'hdfs://hdfs1:9000/some_dir/some_file_1' +- 'hdfs://hdfs1:9000/some_dir/some_file_2' +- 'hdfs://hdfs1:9000/some_dir/some_file_3' +- 'hdfs://hdfs1:9000/another_dir/some_file_1' +- 'hdfs://hdfs1:9000/another_dir/some_file_2' +- 'hdfs://hdfs1:9000/another_dir/some_file_3' 1. There are several ways to make a table consisting of all six files: @@ -126,8 +126,9 @@ Similar to GraphiteMergeTree, the HDFS engine supports extended configuration us ``` -### List of possible configuration options with default values -#### Supported by libhdfs3 +### Configuration Options {#configuration-options} + +#### Supported by libhdfs3 {#supported-by-libhdfs3} | **parameter** | **default value** | @@ -184,7 +185,7 @@ Similar to GraphiteMergeTree, the HDFS engine supports extended configuration us |hadoop\_kerberos\_principal | "" | |hadoop\_kerberos\_kinit\_command | kinit | -#### Limitations {#limitations} +### Limitations {#limitations} * hadoop\_security\_kerberos\_ticket\_cache\_path can be global only, not user specific ## Kerberos support {#kerberos-support} diff --git a/docs/en/engines/table-engines/integrations/materialized-postgresql.md b/docs/en/engines/table-engines/integrations/materialized-postgresql.md index 70f61c5b550..d02a11257c2 100644 --- a/docs/en/engines/table-engines/integrations/materialized-postgresql.md +++ b/docs/en/engines/table-engines/integrations/materialized-postgresql.md @@ -1,46 +1,56 @@ --- toc_priority: 12 -toc_title: MateriaziePostgreSQL +toc_title: MaterializedPostgreSQL --- # MaterializedPostgreSQL {#materialize-postgresql} +Creates ClickHouse table with an initial data dump of PostgreSQL table and starts replication process, i.e. executes background job to apply new changes as they happen on PostgreSQL table in the remote PostgreSQL database. + +If more than one table is required, it is highly recommended to use the [MaterializedPostgreSQL](../../../engines/database-engines/materialized-postgresql.md) database engine instead of the table engine and use the [materialized_postgresql_tables_list](../../../operations/settings/settings.md#materialized-postgresql-tables-list) setting, which specifies the tables to be replicated. It will be much better in terms of CPU, fewer connections and fewer replication slots inside the remote PostgreSQL database. + ## Creating a Table {#creating-a-table} ``` sql -CREATE TABLE test.postgresql_replica (key UInt64, value UInt64) +CREATE TABLE postgresql_db.postgresql_replica (key UInt64, value UInt64) ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgresql_replica', 'postgres_user', 'postgres_password') PRIMARY KEY key; ``` +**Engine Parameters** + +- `host:port` — PostgreSQL server address. +- `database` — Remote database name. +- `table` — Remote table name. +- `user` — PostgreSQL user. +- `password` — User password. ## Requirements {#requirements} -- Setting `wal_level`to `logical` and `max_replication_slots` to at least `2` in the postgresql config file. +1. The [wal_level](https://www.postgresql.org/docs/current/runtime-config-wal.html) setting must have a value `logical` and `max_replication_slots` parameter must have a value at least `2` in the PostgreSQL config file. -- A table with engine `MaterializedPostgreSQL` must have a primary key - the same as a replica identity index (default: primary key) of a postgres table (See [details on replica identity index](../../database-engines/materialized-postgresql.md#requirements)). +2. A table with `MaterializedPostgreSQL` engine must have a primary key — the same as a replica identity index (by default: primary key) of a PostgreSQL table (see [details on replica identity index](../../../engines/database-engines/materialized-postgresql.md#requirements)). -- Only database `Atomic` is allowed. +3. Only database [Atomic](https://en.wikipedia.org/wiki/Atomicity_(database_systems)) is allowed. +## Virtual columns {#virtual-columns} -## Virtual columns {#creating-a-table} +- `_version` — Transaction counter. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). -- `_version` (`UInt64`) +- `_sign` — Deletion mark. Type: [Int8](../../../sql-reference/data-types/int-uint.md). Possible values: + - `1` — Row is not deleted, + - `-1` — Row is deleted. -- `_sign` (`Int8`) - -These columns do not need to be added, when table is created. They are always accessible in `SELECT` query. +These columns do not need to be added when a table is created. They are always accessible in `SELECT` query. `_version` column equals `LSN` position in `WAL`, so it might be used to check how up-to-date replication is. ``` sql -CREATE TABLE test.postgresql_replica (key UInt64, value UInt64) +CREATE TABLE postgresql_db.postgresql_replica (key UInt64, value UInt64) ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgresql_replica', 'postgres_user', 'postgres_password') PRIMARY KEY key; -SELECT key, value, _version FROM test.postgresql_replica; +SELECT key, value, _version FROM postgresql_db.postgresql_replica; ``` - -## Warning {#warning} - -1. **TOAST** values convertion is not supported. Default value for the data type will be used. +!!! warning "Warning" + Replication of [**TOAST**](https://www.postgresql.org/docs/9.5/storage-toast.html) values is not supported. The default value for the data type will be used. diff --git a/docs/en/engines/table-engines/integrations/mongodb.md b/docs/en/engines/table-engines/integrations/mongodb.md index a378ab03f55..9839893d4e8 100644 --- a/docs/en/engines/table-engines/integrations/mongodb.md +++ b/docs/en/engines/table-engines/integrations/mongodb.md @@ -15,7 +15,7 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name name1 [type1], name2 [type2], ... -) ENGINE = MongoDB(host:port, database, collection, user, password); +) ENGINE = MongoDB(host:port, database, collection, user, password [, options]); ``` **Engine Parameters** @@ -30,18 +30,30 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name - `password` — User password. +- `options` — MongoDB connection string options (optional parameter). + ## Usage Example {#usage-example} -Table in ClickHouse which allows to read data from MongoDB collection: +Create a table in ClickHouse which allows to read data from MongoDB collection: ``` text CREATE TABLE mongo_table ( - key UInt64, + key UInt64, data String ) ENGINE = MongoDB('mongo1:27017', 'test', 'simple_table', 'testuser', 'clickhouse'); ``` +To read from an SSL secured MongoDB server: + +``` text +CREATE TABLE mongo_table_ssl +( + key UInt64, + data String +) ENGINE = MongoDB('mongo2:27017', 'test', 'simple_table', 'testuser', 'clickhouse', 'ssl=true'); +``` + Query: ``` sql diff --git a/docs/en/engines/table-engines/integrations/postgresql.md b/docs/en/engines/table-engines/integrations/postgresql.md index 1a8f2c4b758..4c763153a36 100644 --- a/docs/en/engines/table-engines/integrations/postgresql.md +++ b/docs/en/engines/table-engines/integrations/postgresql.md @@ -49,14 +49,14 @@ PostgreSQL `Array` types are converted into ClickHouse arrays. !!! info "Note" Be careful - in PostgreSQL an array data, created like a `type_name[]`, may contain multi-dimensional arrays of different dimensions in different table rows in same column. But in ClickHouse it is only allowed to have multidimensional arrays of the same count of dimensions in all table rows in same column. - + Supports multiple replicas that must be listed by `|`. For example: ```sql CREATE TABLE test_replicas (id UInt32, name String) ENGINE = PostgreSQL(`postgres{2|3|4}:5432`, 'clickhouse', 'test_replicas', 'postgres', 'mysecretpassword'); ``` -Replicas priority for PostgreSQL dictionary source is supported. The bigger the number in map, the less the priority. The highest priority is `0`. +Replicas priority for PostgreSQL dictionary source is supported. The bigger the number in map, the less the priority. The highest priority is `0`. In the example below replica `example01-1` has the highest priority: diff --git a/docs/en/engines/table-engines/integrations/s3.md b/docs/en/engines/table-engines/integrations/s3.md index e763d940752..7249e24aff9 100644 --- a/docs/en/engines/table-engines/integrations/s3.md +++ b/docs/en/engines/table-engines/integrations/s3.md @@ -57,10 +57,10 @@ For more information about virtual columns see [here](../../../engines/table-eng ## Implementation Details {#implementation-details} - Reads and writes can be parallel +- [Zero-copy](../../../operations/storing-data.md#zero-copy) replication is supported. - Not supported: - `ALTER` and `SELECT...SAMPLE` operations. - Indexes. - - Replication. ## Wildcards In Path {#wildcards-in-path} @@ -77,12 +77,12 @@ Constructions with `{}` are similar to the [remote](../../../sql-reference/table 1. Suppose we have several files in CSV format with the following URIs on S3: -- ‘https://storage.yandexcloud.net/my-test-bucket-768/some_prefix/some_file_1.csv’ -- ‘https://storage.yandexcloud.net/my-test-bucket-768/some_prefix/some_file_2.csv’ -- ‘https://storage.yandexcloud.net/my-test-bucket-768/some_prefix/some_file_3.csv’ -- ‘https://storage.yandexcloud.net/my-test-bucket-768/another_prefix/some_file_1.csv’ -- ‘https://storage.yandexcloud.net/my-test-bucket-768/another_prefix/some_file_2.csv’ -- ‘https://storage.yandexcloud.net/my-test-bucket-768/another_prefix/some_file_3.csv’ +- 'https://storage.yandexcloud.net/my-test-bucket-768/some_prefix/some_file_1.csv' +- 'https://storage.yandexcloud.net/my-test-bucket-768/some_prefix/some_file_2.csv' +- 'https://storage.yandexcloud.net/my-test-bucket-768/some_prefix/some_file_3.csv' +- 'https://storage.yandexcloud.net/my-test-bucket-768/another_prefix/some_file_1.csv' +- 'https://storage.yandexcloud.net/my-test-bucket-768/another_prefix/some_file_2.csv' +- 'https://storage.yandexcloud.net/my-test-bucket-768/another_prefix/some_file_3.csv' There are several ways to make a table consisting of all six files: diff --git a/docs/en/engines/table-engines/log-family/index.md b/docs/en/engines/table-engines/log-family/index.md index 8cdde239f44..b505fe1c474 100644 --- a/docs/en/engines/table-engines/log-family/index.md +++ b/docs/en/engines/table-engines/log-family/index.md @@ -14,6 +14,8 @@ Engines of the family: - [Log](../../../engines/table-engines/log-family/log.md) - [TinyLog](../../../engines/table-engines/log-family/tinylog.md) +`Log` family table engines can store data to [HDFS](../../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-hdfs) or [S3](../../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-s3) distributed file systems. + ## Common Properties {#common-properties} Engines: diff --git a/docs/en/engines/table-engines/log-family/log.md b/docs/en/engines/table-engines/log-family/log.md index 87cdb890e9f..2aeef171128 100644 --- a/docs/en/engines/table-engines/log-family/log.md +++ b/docs/en/engines/table-engines/log-family/log.md @@ -5,10 +5,8 @@ toc_title: Log # Log {#log} -Engine belongs to the family of log engines. See the common properties of log engines and their differences in the [Log Engine Family](../../../engines/table-engines/log-family/index.md) article. +The engine belongs to the family of `Log` engines. See the common properties of `Log` engines and their differences in the [Log Engine Family](../../../engines/table-engines/log-family/index.md) article. -Log differs from [TinyLog](../../../engines/table-engines/log-family/tinylog.md) in that a small file of “marks” resides with the column files. These marks are written on every data block and contain offsets that indicate where to start reading the file in order to skip the specified number of rows. This makes it possible to read table data in multiple threads. +`Log` differs from [TinyLog](../../../engines/table-engines/log-family/tinylog.md) in that a small file of "marks" resides with the column files. These marks are written on every data block and contain offsets that indicate where to start reading the file in order to skip the specified number of rows. This makes it possible to read table data in multiple threads. For concurrent data access, the read operations can be performed simultaneously, while write operations block reads and each other. -The Log engine does not support indexes. Similarly, if writing to a table failed, the table is broken, and reading from it returns an error. The Log engine is appropriate for temporary data, write-once tables, and for testing or demonstration purposes. - -[Original article](https://clickhouse.tech/docs/en/operations/table_engines/log/) +The `Log` engine does not support indexes. Similarly, if writing to a table failed, the table is broken, and reading from it returns an error. The `Log` engine is appropriate for temporary data, write-once tables, and for testing or demonstration purposes. diff --git a/docs/en/engines/table-engines/mergetree-family/graphitemergetree.md b/docs/en/engines/table-engines/mergetree-family/graphitemergetree.md index 3ead798503d..33707709fdf 100644 --- a/docs/en/engines/table-engines/mergetree-family/graphitemergetree.md +++ b/docs/en/engines/table-engines/mergetree-family/graphitemergetree.md @@ -38,9 +38,7 @@ A table for the Graphite data should have the following columns for the followin - Value of the metric. Data type: any numeric. -- Version of the metric. Data type: any numeric. - - ClickHouse saves the rows with the highest version or the last written if versions are the same. Other rows are deleted during the merge of data parts. +- Version of the metric. Data type: any numeric (ClickHouse saves the rows with the highest version or the last written if versions are the same. Other rows are deleted during the merge of data parts). The names of these columns should be set in the rollup configuration. @@ -132,7 +130,7 @@ Fields for `pattern` and `default` sections: - `regexp`– A pattern for the metric name. - `age` – The minimum age of the data in seconds. - `precision`– How precisely to define the age of the data in seconds. Should be a divisor for 86400 (seconds in a day). -- `function` – The name of the aggregating function to apply to data whose age falls within the range `[age, age + precision]`. +- `function` – The name of the aggregating function to apply to data whose age falls within the range `[age, age + precision]`. Accepted functions: min / max / any / avg. The average is calculated imprecisely, like the average of the averages. ### Configuration Example {#configuration-example} @@ -169,4 +167,7 @@ Fields for `pattern` and `default` sections: ``` +!!! warning "Warning" + Data rollup is performed during merges. Usually, for old partitions, merges are not started, so for rollup it is necessary to trigger an unscheduled merge using [optimize](../../../sql-reference/statements/optimize.md). Or use additional tools, for example [graphite-ch-optimizer](https://github.com/innogames/graphite-ch-optimizer). + [Original article](https://clickhouse.tech/docs/en/operations/table_engines/graphitemergetree/) diff --git a/docs/en/engines/table-engines/mergetree-family/mergetree.md b/docs/en/engines/table-engines/mergetree-family/mergetree.md index 9d259456ea5..1ca7725b35c 100644 --- a/docs/en/engines/table-engines/mergetree-family/mergetree.md +++ b/docs/en/engines/table-engines/mergetree-family/mergetree.md @@ -39,7 +39,10 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2], ... INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1, - INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2 + INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2, + ... + PROJECTION projection_name_1 (SELECT [GROUP BY] [ORDER BY]), + PROJECTION projection_name_2 (SELECT [GROUP BY] [ORDER BY]) ) ENGINE = MergeTree() ORDER BY expr [PARTITION BY expr] @@ -76,7 +79,7 @@ For a description of parameters, see the [CREATE query description](../../../sql - `SAMPLE BY` — An expression for sampling. Optional. - If a sampling expression is used, the primary key must contain it. Example: `SAMPLE BY intHash32(UserID) ORDER BY (CounterID, EventDate, intHash32(UserID))`. + If a sampling expression is used, the primary key must contain it. The result of a sampling expression must be an unsigned integer. Example: `SAMPLE BY intHash32(UserID) ORDER BY (CounterID, EventDate, intHash32(UserID))`. - `TTL` — A list of rules specifying storage duration of rows and defining logic of automatic parts movement [between disks and volumes](#table_engine-mergetree-multiple-volumes). Optional. @@ -385,6 +388,24 @@ Functions with a constant argument that is less than ngram size can’t be used - `s != 1` - `NOT startsWith(s, 'test')` +### Projections {#projections} +Projections are like materialized views but defined in part-level. It provides consistency guarantees along with automatic usage in queries. + +#### Query {#projection-query} +A projection query is what defines a projection. It has the following grammar: + +`SELECT [GROUP BY] [ORDER BY]` + +It implicitly selects data from the parent table. + +#### Storage {#projection-storage} +Projections are stored inside the part directory. It's similar to an index but contains a subdirectory that stores an anonymous MergeTree table's part. The table is induced by the definition query of the projection. If there is a GROUP BY clause, the underlying storage engine becomes AggregatedMergeTree, and all aggregate functions are converted to AggregateFunction. If there is an ORDER BY clause, the MergeTree table will use it as its primary key expression. During the merge process, the projection part will be merged via its storage's merge routine. The checksum of the parent table's part will combine the projection's part. Other maintenance jobs are similar to skip indices. + +#### Query Analysis {#projection-query-analysis} +1. Check if the projection can be used to answer the given query, that is, it generates the same answer as querying the base table. +2. Select the best feasible match, which contains the least granules to read. +3. The query pipeline which uses projections will be different from the one that uses the original parts. If the projection is absent in some parts, we can add the pipeline to "project" it on the fly. + ## Concurrent Data Access {#concurrent-data-access} For concurrent table access, we use multi-versioning. In other words, when a table is simultaneously read and updated, data is read from a set of parts that is current at the time of the query. There are no lengthy locks. Inserts do not get in the way of read operations. @@ -728,7 +749,9 @@ During this time, they are not moved to other volumes or disks. Therefore, until ## Using S3 for Data Storage {#table_engine-mergetree-s3} -`MergeTree` family table engines is able to store data to [S3](https://aws.amazon.com/s3/) using a disk with type `s3`. +`MergeTree` family table engines can store data to [S3](https://aws.amazon.com/s3/) using a disk with type `s3`. + +This feature is under development and not ready for production. There are known drawbacks such as very low performance. Configuration markup: ``` xml @@ -762,11 +785,13 @@ Configuration markup: ``` Required parameters: -- `endpoint` — S3 endpoint url in `path` or `virtual hosted` [styles](https://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html). Endpoint url should contain bucket and root path to store data. + +- `endpoint` — S3 endpoint URL in `path` or `virtual hosted` [styles](https://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html). Endpoint URL should contain a bucket and root path to store data. - `access_key_id` — S3 access key id. - `secret_access_key` — S3 secret access key. Optional parameters: + - `region` — S3 region name. - `use_environment_credentials` — Reads AWS credentials from the Environment variables AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY and AWS_SESSION_TOKEN if they exist. Default value is `false`. - `use_insecure_imds_request` — If set to `true`, S3 client will use insecure IMDS request while obtaining credentials from Amazon EC2 metadata. Default value is `false`. @@ -782,7 +807,6 @@ Optional parameters: - `skip_access_check` — If true, disk access checks will not be performed on disk start-up. Default value is `false`. - `server_side_encryption_customer_key_base64` — If specified, required headers for accessing S3 objects with SSE-C encryption will be set. - S3 disk can be configured as `main` or `cold` storage: ``` xml @@ -820,5 +844,3 @@ S3 disk can be configured as `main` or `cold` storage: ``` In case of `cold` option a data can be moved to S3 if local disk free size will be smaller than `move_factor * disk_size` or by TTL move rule. - -[Original article](https://clickhouse.tech/docs/ru/operations/table_engines/mergetree/) diff --git a/docs/en/engines/table-engines/mergetree-family/replication.md b/docs/en/engines/table-engines/mergetree-family/replication.md index 2db6686beb7..4fc30355927 100644 --- a/docs/en/engines/table-engines/mergetree-family/replication.md +++ b/docs/en/engines/table-engines/mergetree-family/replication.md @@ -101,7 +101,7 @@ For very large clusters, you can use different ZooKeeper clusters for different Replication is asynchronous and multi-master. `INSERT` queries (as well as `ALTER`) can be sent to any available server. Data is inserted on the server where the query is run, and then it is copied to the other servers. Because it is asynchronous, recently inserted data appears on the other replicas with some latency. If part of the replicas are not available, the data is written when they become available. If a replica is available, the latency is the amount of time it takes to transfer the block of compressed data over the network. The number of threads performing background tasks for replicated tables can be set by [background_schedule_pool_size](../../../operations/settings/settings.md#background_schedule_pool_size) setting. -`ReplicatedMergeTree` engine uses a separate thread pool for replicated fetches. Size of the pool is limited by the [background_fetches_pool_size](../../../operations/settings/settings.md#background_fetches_pool_size) setting which can be tuned with a server restart. +`ReplicatedMergeTree` engine uses a separate thread pool for replicated fetches. Size of the pool is limited by the [background_fetches_pool_size](../../../operations/settings/settings.md#background_fetches_pool_size) setting which can be tuned with a server restart. By default, an INSERT query waits for confirmation of writing the data from only one replica. If the data was successfully written to only one replica and the server with this replica ceases to exist, the stored data will be lost. To enable getting confirmation of data writes from multiple replicas, use the `insert_quorum` option. @@ -155,7 +155,7 @@ CREATE TABLE table_name
-As the example shows, these parameters can contain substitutions in curly brackets. The substituted values are taken from the «[macros](../../../operations/server-configuration-parameters/settings/#macros) section of the configuration file. +As the example shows, these parameters can contain substitutions in curly brackets. The substituted values are taken from the «[macros](../../../operations/server-configuration-parameters/settings/#macros) section of the configuration file. Example: @@ -198,7 +198,7 @@ In this case, you can omit arguments when creating tables: ``` sql CREATE TABLE table_name ( x UInt32 -) ENGINE = ReplicatedMergeTree +) ENGINE = ReplicatedMergeTree ORDER BY x; ``` @@ -207,7 +207,7 @@ It is equivalent to: ``` sql CREATE TABLE table_name ( x UInt32 -) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/{database}/table_name', '{replica}') +) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/{database}/table_name', '{replica}') ORDER BY x; ``` diff --git a/docs/en/engines/table-engines/special/distributed.md b/docs/en/engines/table-engines/special/distributed.md index 6de6602a216..5c911c6cc0a 100644 --- a/docs/en/engines/table-engines/special/distributed.md +++ b/docs/en/engines/table-engines/special/distributed.md @@ -37,6 +37,14 @@ Also, it accepts the following settings: - `max_delay_to_insert` - max delay of inserting data into Distributed table in seconds, if there are a lot of pending bytes for async send. Default 60. +- `monitor_batch_inserts` - same as [distributed_directory_monitor_batch_inserts](../../../operations/settings/settings.md#distributed_directory_monitor_batch_inserts) + +- `monitor_split_batch_on_failure` - same as [distributed_directory_monitor_split_batch_on_failure](../../../operations/settings/settings.md#distributed_directory_monitor_split_batch_on_failure) + +- `monitor_sleep_time_ms` - same as [distributed_directory_monitor_sleep_time_ms](../../../operations/settings/settings.md#distributed_directory_monitor_sleep_time_ms) + +- `monitor_max_sleep_time_ms` - same as [distributed_directory_monitor_max_sleep_time_ms](../../../operations/settings/settings.md#distributed_directory_monitor_max_sleep_time_ms) + !!! note "Note" **Durability settings** (`fsync_...`): diff --git a/docs/en/engines/table-engines/special/join.md b/docs/en/engines/table-engines/special/join.md index 4cd1c741352..4e4a5e9fc03 100644 --- a/docs/en/engines/table-engines/special/join.md +++ b/docs/en/engines/table-engines/special/join.md @@ -30,65 +30,27 @@ See the detailed description of the [CREATE TABLE](../../../sql-reference/statem Enter `join_strictness` and `join_type` parameters without quotes, for example, `Join(ANY, LEFT, col1)`. They must match the `JOIN` operation that the table will be used for. If the parameters do not match, ClickHouse does not throw an exception and may return incorrect data. -## Table Usage {#table-usage} +## Specifics and Recommendations {#specifics-and-recommendations} -### Example {#example} +### Data Storage {#data-storage} -Creating the left-side table: +`Join` table data is always located in the RAM. When inserting rows into a table, ClickHouse writes data blocks to the directory on the disk so that they can be restored when the server restarts. -``` sql -CREATE TABLE id_val(`id` UInt32, `val` UInt32) ENGINE = TinyLog -``` - -``` sql -INSERT INTO id_val VALUES (1,11)(2,12)(3,13) -``` - -Creating the right-side `Join` table: - -``` sql -CREATE TABLE id_val_join(`id` UInt32, `val` UInt8) ENGINE = Join(ANY, LEFT, id) -``` - -``` sql -INSERT INTO id_val_join VALUES (1,21)(1,22)(3,23) -``` - -Joining the tables: - -``` sql -SELECT * FROM id_val ANY LEFT JOIN id_val_join USING (id) SETTINGS join_use_nulls = 1 -``` - -``` text -┌─id─┬─val─┬─id_val_join.val─┐ -│ 1 │ 11 │ 21 │ -│ 2 │ 12 │ ᴺᵁᴸᴸ │ -│ 3 │ 13 │ 23 │ -└────┴─────┴─────────────────┘ -``` - -As an alternative, you can retrieve data from the `Join` table, specifying the join key value: - -``` sql -SELECT joinGet('id_val_join', 'val', toUInt32(1)) -``` - -``` text -┌─joinGet('id_val_join', 'val', toUInt32(1))─┐ -│ 21 │ -└────────────────────────────────────────────┘ -``` +If the server restarts incorrectly, the data block on the disk might get lost or damaged. In this case, you may need to manually delete the file with damaged data. ### Selecting and Inserting Data {#selecting-and-inserting-data} You can use `INSERT` queries to add data to the `Join`-engine tables. If the table was created with the `ANY` strictness, data for duplicate keys are ignored. With the `ALL` strictness, all rows are added. -You cannot perform a `SELECT` query directly from the table. Instead, use one of the following methods: +Main use-cases for `Join`-engine tables are following: - Place the table to the right side in a `JOIN` clause. - Call the [joinGet](../../../sql-reference/functions/other-functions.md#joinget) function, which lets you extract data from the table the same way as from a dictionary. +### Deleting Data {#deleting-data} + +`ALTER DELETE` queries for `Join`-engine tables are implemented as [mutations](../../../sql-reference/statements/alter/index.md#mutations). `DELETE` mutation reads filtered data and overwrites data of memory and disk. + ### Limitations and Settings {#join-limitations-and-settings} When creating a table, the following settings are applied: @@ -102,12 +64,64 @@ When creating a table, the following settings are applied: The `Join`-engine tables can’t be used in `GLOBAL JOIN` operations. -The `Join`-engine allows use [join_use_nulls](../../../operations/settings/settings.md#join_use_nulls) setting in the `CREATE TABLE` statement. And [SELECT](../../../sql-reference/statements/select/index.md) query allows use `join_use_nulls` too. If you have different `join_use_nulls` settings, you can get an error joining table. It depends on kind of JOIN. When you use [joinGet](../../../sql-reference/functions/other-functions.md#joinget) function, you have to use the same `join_use_nulls` setting in `CRATE TABLE` and `SELECT` statements. +The `Join`-engine allows to specify [join_use_nulls](../../../operations/settings/settings.md#join_use_nulls) setting in the `CREATE TABLE` statement. [SELECT](../../../sql-reference/statements/select/index.md) query should have the same `join_use_nulls` value. -## Data Storage {#data-storage} +## Usage Examples {#example} -`Join` table data is always located in the RAM. When inserting rows into a table, ClickHouse writes data blocks to the directory on the disk so that they can be restored when the server restarts. +Creating the left-side table: -If the server restarts incorrectly, the data block on the disk might get lost or damaged. In this case, you may need to manually delete the file with damaged data. +``` sql +CREATE TABLE id_val(`id` UInt32, `val` UInt32) ENGINE = TinyLog; +``` -[Original article](https://clickhouse.tech/docs/en/operations/table_engines/join/) +``` sql +INSERT INTO id_val VALUES (1,11)(2,12)(3,13); +``` + +Creating the right-side `Join` table: + +``` sql +CREATE TABLE id_val_join(`id` UInt32, `val` UInt8) ENGINE = Join(ANY, LEFT, id); +``` + +``` sql +INSERT INTO id_val_join VALUES (1,21)(1,22)(3,23); +``` + +Joining the tables: + +``` sql +SELECT * FROM id_val ANY LEFT JOIN id_val_join USING (id); +``` + +``` text +┌─id─┬─val─┬─id_val_join.val─┐ +│ 1 │ 11 │ 21 │ +│ 2 │ 12 │ 0 │ +│ 3 │ 13 │ 23 │ +└────┴─────┴─────────────────┘ +``` + +As an alternative, you can retrieve data from the `Join` table, specifying the join key value: + +``` sql +SELECT joinGet('id_val_join', 'val', toUInt32(1)); +``` + +``` text +┌─joinGet('id_val_join', 'val', toUInt32(1))─┐ +│ 21 │ +└────────────────────────────────────────────┘ +``` + +Deleting a row from the `Join` table: + +```sql +ALTER TABLE id_val_join DELETE WHERE id = 3; +``` + +```text +┌─id─┬─val─┐ +│ 1 │ 21 │ +└────┴─────┘ +``` diff --git a/docs/en/getting-started/example-datasets/index.md b/docs/en/getting-started/example-datasets/index.md index 53007c33306..e61c76970a7 100644 --- a/docs/en/getting-started/example-datasets/index.md +++ b/docs/en/getting-started/example-datasets/index.md @@ -14,7 +14,10 @@ The list of documented datasets: - [Anonymized Yandex.Metrica Dataset](../../getting-started/example-datasets/metrica.md) - [Recipes](../../getting-started/example-datasets/recipes.md) - [OnTime](../../getting-started/example-datasets/ontime.md) +- [OpenSky](../../getting-started/example-datasets/opensky.md) - [New York Taxi Data](../../getting-started/example-datasets/nyc-taxi.md) +- [UK Property Price Paid](../../getting-started/example-datasets/uk-price-paid.md) +- [What's on the Menu?](../../getting-started/example-datasets/menus.md) - [Star Schema Benchmark](../../getting-started/example-datasets/star-schema.md) - [WikiStat](../../getting-started/example-datasets/wikistat.md) - [Terabyte of Click Logs from Criteo](../../getting-started/example-datasets/criteo.md) diff --git a/docs/en/getting-started/example-datasets/menus.md b/docs/en/getting-started/example-datasets/menus.md new file mode 100644 index 00000000000..87e4c75d0d4 --- /dev/null +++ b/docs/en/getting-started/example-datasets/menus.md @@ -0,0 +1,324 @@ +--- +toc_priority: 21 +toc_title: Menus +--- + +# New York Public Library "What's on the Menu?" Dataset + +The dataset is created by the New York Public Library. It contains historical data on the menus of hotels, restaurants and cafes with the dishes along with their prices. + +Source: http://menus.nypl.org/data +The data is in public domain. + +The data is from library's archive and it may be incomplete and difficult for statistical analysis. Nevertheless it is also very yummy. +The size is just 1.3 million records about dishes in the menus (a very small data volume for ClickHouse, but it's still a good example). + +## Download the Dataset + +``` +wget https://s3.amazonaws.com/menusdata.nypl.org/gzips/2021_08_01_07_01_17_data.tgz +``` + +Replace the link to the up to date link from http://menus.nypl.org/data if needed. +Download size is about 35 MB. + +## Unpack the Dataset + +``` +tar xvf 2021_08_01_07_01_17_data.tgz +``` + +Uncompressed size is about 150 MB. + +The data is normalized consisted of four tables: +- Menu: information about menus: the name of the restaurant, the date when menu was seen, etc; +- Dish: information about dishes: the name of the dish along with some characteristic; +- MenuPage: information about the pages in the menus; every page belongs to some menu; +- MenuItem: an item of the menu - a dish along with its price on some menu page: links to dish and menu page. + +## Create the Tables + +``` +CREATE TABLE dish +( + id UInt32, + name String, + description String, + menus_appeared UInt32, + times_appeared Int32, + first_appeared UInt16, + last_appeared UInt16, + lowest_price Decimal64(3), + highest_price Decimal64(3) +) ENGINE = MergeTree ORDER BY id; + +CREATE TABLE menu +( + id UInt32, + name String, + sponsor String, + event String, + venue String, + place String, + physical_description String, + occasion String, + notes String, + call_number String, + keywords String, + language String, + date String, + location String, + location_type String, + currency String, + currency_symbol String, + status String, + page_count UInt16, + dish_count UInt16 +) ENGINE = MergeTree ORDER BY id; + +CREATE TABLE menu_page +( + id UInt32, + menu_id UInt32, + page_number UInt16, + image_id String, + full_height UInt16, + full_width UInt16, + uuid UUID +) ENGINE = MergeTree ORDER BY id; + +CREATE TABLE menu_item +( + id UInt32, + menu_page_id UInt32, + price Decimal64(3), + high_price Decimal64(3), + dish_id UInt32, + created_at DateTime, + updated_at DateTime, + xpos Float64, + ypos Float64 +) ENGINE = MergeTree ORDER BY id; +``` + +We use `Decimal` data type to store prices. Everything else is quite straightforward. + +## Import Data + +Upload data into ClickHouse in parallel: + +``` +clickhouse-client --format_csv_allow_single_quotes 0 --input_format_null_as_default 0 --query "INSERT INTO dish FORMAT CSVWithNames" < Dish.csv +clickhouse-client --format_csv_allow_single_quotes 0 --input_format_null_as_default 0 --query "INSERT INTO menu FORMAT CSVWithNames" < Menu.csv +clickhouse-client --format_csv_allow_single_quotes 0 --input_format_null_as_default 0 --query "INSERT INTO menu_page FORMAT CSVWithNames" < MenuPage.csv +clickhouse-client --format_csv_allow_single_quotes 0 --input_format_null_as_default 0 --date_time_input_format best_effort --query "INSERT INTO menu_item FORMAT CSVWithNames" < MenuItem.csv +``` + +We use `CSVWithNames` format as the data is represented by CSV with header. + +We disable `format_csv_allow_single_quotes` as only double quotes are used for data fields and single quotes can be inside the values and should not confuse the CSV parser. + +We disable `input_format_null_as_default` as our data does not have NULLs. Otherwise ClickHouse will try to parse `\N` sequences and can be confused with `\` in data. + +The setting `--date_time_input_format best_effort` allows to parse `DateTime` fields in wide variety of formats. For example, ISO-8601 without seconds like '2000-01-01 01:02' will be recognized. Without this setting only fixed DateTime format is allowed. + +## Denormalize the Data + +Data is presented in multiple tables in normalized form. It means you have to perform JOINs if you want to query, e.g. dish names from menu items. +For typical analytical tasks it is way more efficient to deal with pre-JOINed data to avoid doing JOIN every time. It is called "denormalized" data. + +We will create a table that will contain all the data JOINed together: + +``` +CREATE TABLE menu_item_denorm +ENGINE = MergeTree ORDER BY (dish_name, created_at) +AS SELECT + price, + high_price, + created_at, + updated_at, + xpos, + ypos, + dish.id AS dish_id, + dish.name AS dish_name, + dish.description AS dish_description, + dish.menus_appeared AS dish_menus_appeared, + dish.times_appeared AS dish_times_appeared, + dish.first_appeared AS dish_first_appeared, + dish.last_appeared AS dish_last_appeared, + dish.lowest_price AS dish_lowest_price, + dish.highest_price AS dish_highest_price, + menu.id AS menu_id, + menu.name AS menu_name, + menu.sponsor AS menu_sponsor, + menu.event AS menu_event, + menu.venue AS menu_venue, + menu.place AS menu_place, + menu.physical_description AS menu_physical_description, + menu.occasion AS menu_occasion, + menu.notes AS menu_notes, + menu.call_number AS menu_call_number, + menu.keywords AS menu_keywords, + menu.language AS menu_language, + menu.date AS menu_date, + menu.location AS menu_location, + menu.location_type AS menu_location_type, + menu.currency AS menu_currency, + menu.currency_symbol AS menu_currency_symbol, + menu.status AS menu_status, + menu.page_count AS menu_page_count, + menu.dish_count AS menu_dish_count +FROM menu_item + JOIN dish ON menu_item.dish_id = dish.id + JOIN menu_page ON menu_item.menu_page_id = menu_page.id + JOIN menu ON menu_page.menu_id = menu.id +``` + +## Validate the Data + +``` +SELECT count() FROM menu_item_denorm +1329175 +``` + +## Run Some Queries + +Averaged historical prices of dishes: + +``` +SELECT + round(toUInt32OrZero(extract(menu_date, '^\\d{4}')), -1) AS d, + count(), + round(avg(price), 2), + bar(avg(price), 0, 100, 100) +FROM menu_item_denorm +WHERE (menu_currency = 'Dollars') AND (d > 0) AND (d < 2022) +GROUP BY d +ORDER BY d ASC + +┌────d─┬─count()─┬─round(avg(price), 2)─┬─bar(avg(price), 0, 100, 100)─┐ +│ 1850 │ 618 │ 1.5 │ █▍ │ +│ 1860 │ 1634 │ 1.29 │ █▎ │ +│ 1870 │ 2215 │ 1.36 │ █▎ │ +│ 1880 │ 3909 │ 1.01 │ █ │ +│ 1890 │ 8837 │ 1.4 │ █▍ │ +│ 1900 │ 176292 │ 0.68 │ ▋ │ +│ 1910 │ 212196 │ 0.88 │ ▊ │ +│ 1920 │ 179590 │ 0.74 │ ▋ │ +│ 1930 │ 73707 │ 0.6 │ ▌ │ +│ 1940 │ 58795 │ 0.57 │ ▌ │ +│ 1950 │ 41407 │ 0.95 │ ▊ │ +│ 1960 │ 51179 │ 1.32 │ █▎ │ +│ 1970 │ 12914 │ 1.86 │ █▋ │ +│ 1980 │ 7268 │ 4.35 │ ████▎ │ +│ 1990 │ 11055 │ 6.03 │ ██████ │ +│ 2000 │ 2467 │ 11.85 │ ███████████▋ │ +│ 2010 │ 597 │ 25.66 │ █████████████████████████▋ │ +└──────┴─────────┴──────────────────────┴──────────────────────────────┘ + +17 rows in set. Elapsed: 0.044 sec. Processed 1.33 million rows, 54.62 MB (30.00 million rows/s., 1.23 GB/s.) +``` + +Take it with a grain of salt. + +### Burger Prices: + +``` +SELECT + round(toUInt32OrZero(extract(menu_date, '^\\d{4}')), -1) AS d, + count(), + round(avg(price), 2), + bar(avg(price), 0, 50, 100) +FROM menu_item_denorm +WHERE (menu_currency = 'Dollars') AND (d > 0) AND (d < 2022) AND (dish_name ILIKE '%burger%') +GROUP BY d +ORDER BY d ASC + +┌────d─┬─count()─┬─round(avg(price), 2)─┬─bar(avg(price), 0, 50, 100)───────────┐ +│ 1880 │ 2 │ 0.42 │ ▋ │ +│ 1890 │ 7 │ 0.85 │ █▋ │ +│ 1900 │ 399 │ 0.49 │ ▊ │ +│ 1910 │ 589 │ 0.68 │ █▎ │ +│ 1920 │ 280 │ 0.56 │ █ │ +│ 1930 │ 74 │ 0.42 │ ▋ │ +│ 1940 │ 119 │ 0.59 │ █▏ │ +│ 1950 │ 134 │ 1.09 │ ██▏ │ +│ 1960 │ 272 │ 0.92 │ █▋ │ +│ 1970 │ 108 │ 1.18 │ ██▎ │ +│ 1980 │ 88 │ 2.82 │ █████▋ │ +│ 1990 │ 184 │ 3.68 │ ███████▎ │ +│ 2000 │ 21 │ 7.14 │ ██████████████▎ │ +│ 2010 │ 6 │ 18.42 │ ████████████████████████████████████▋ │ +└──────┴─────────┴──────────────────────┴───────────────────────────────────────┘ + +14 rows in set. Elapsed: 0.052 sec. Processed 1.33 million rows, 94.15 MB (25.48 million rows/s., 1.80 GB/s.) +``` + +### Vodka: + +``` +SELECT + round(toUInt32OrZero(extract(menu_date, '^\\d{4}')), -1) AS d, + count(), + round(avg(price), 2), + bar(avg(price), 0, 50, 100) +FROM menu_item_denorm +WHERE (menu_currency IN ('Dollars', '')) AND (d > 0) AND (d < 2022) AND (dish_name ILIKE '%vodka%') +GROUP BY d +ORDER BY d ASC + +┌────d─┬─count()─┬─round(avg(price), 2)─┬─bar(avg(price), 0, 50, 100)─┐ +│ 1910 │ 2 │ 0 │ │ +│ 1920 │ 1 │ 0.3 │ ▌ │ +│ 1940 │ 21 │ 0.42 │ ▋ │ +│ 1950 │ 14 │ 0.59 │ █▏ │ +│ 1960 │ 113 │ 2.17 │ ████▎ │ +│ 1970 │ 37 │ 0.68 │ █▎ │ +│ 1980 │ 19 │ 2.55 │ █████ │ +│ 1990 │ 86 │ 3.6 │ ███████▏ │ +│ 2000 │ 2 │ 3.98 │ ███████▊ │ +└──────┴─────────┴──────────────────────┴─────────────────────────────┘ +``` + +To get vodka we have to write `ILIKE '%vodka%'` and this definitely makes a statement. + +### Caviar: + +Let's print caviar prices. Also let's print a name of any dish with caviar. + +``` +SELECT + round(toUInt32OrZero(extract(menu_date, '^\\d{4}')), -1) AS d, + count(), + round(avg(price), 2), + bar(avg(price), 0, 50, 100), + any(dish_name) +FROM menu_item_denorm +WHERE (menu_currency IN ('Dollars', '')) AND (d > 0) AND (d < 2022) AND (dish_name ILIKE '%caviar%') +GROUP BY d +ORDER BY d ASC + +┌────d─┬─count()─┬─round(avg(price), 2)─┬─bar(avg(price), 0, 50, 100)──────┬─any(dish_name)──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ 1090 │ 1 │ 0 │ │ Caviar │ +│ 1880 │ 3 │ 0 │ │ Caviar │ +│ 1890 │ 39 │ 0.59 │ █▏ │ Butter and caviar │ +│ 1900 │ 1014 │ 0.34 │ ▋ │ Anchovy Caviar on Toast │ +│ 1910 │ 1588 │ 1.35 │ ██▋ │ 1/1 Brötchen Caviar │ +│ 1920 │ 927 │ 1.37 │ ██▋ │ ASTRAKAN CAVIAR │ +│ 1930 │ 289 │ 1.91 │ ███▋ │ Astrachan caviar │ +│ 1940 │ 201 │ 0.83 │ █▋ │ (SPECIAL) Domestic Caviar Sandwich │ +│ 1950 │ 81 │ 2.27 │ ████▌ │ Beluga Caviar │ +│ 1960 │ 126 │ 2.21 │ ████▍ │ Beluga Caviar │ +│ 1970 │ 105 │ 0.95 │ █▊ │ BELUGA MALOSSOL CAVIAR AMERICAN DRESSING │ +│ 1980 │ 12 │ 7.22 │ ██████████████▍ │ Authentic Iranian Beluga Caviar the world's finest black caviar presented in ice garni and a sampling of chilled 100° Russian vodka │ +│ 1990 │ 74 │ 14.42 │ ████████████████████████████▋ │ Avocado Salad, Fresh cut avocado with caviare │ +│ 2000 │ 3 │ 7.82 │ ███████████████▋ │ Aufgeschlagenes Kartoffelsueppchen mit Forellencaviar │ +│ 2010 │ 6 │ 15.58 │ ███████████████████████████████▏ │ "OYSTERS AND PEARLS" "Sabayon" of Pearl Tapioca with Island Creek Oysters and Russian Sevruga Caviar │ +└──────┴─────────┴──────────────────────┴──────────────────────────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +At least they have caviar with vodka. Very nice. + +### Test it in Playground + +The data is uploaded to ClickHouse Playground, [example](https://gh-api.clickhouse.tech/play?user=play#U0VMRUNUCiAgICByb3VuZCh0b1VJbnQzMk9yWmVybyhleHRyYWN0KG1lbnVfZGF0ZSwgJ15cXGR7NH0nKSksIC0xKSBBUyBkLAogICAgY291bnQoKSwKICAgIHJvdW5kKGF2ZyhwcmljZSksIDIpLAogICAgYmFyKGF2ZyhwcmljZSksIDAsIDUwLCAxMDApLAogICAgYW55KGRpc2hfbmFtZSkKRlJPTSBtZW51X2l0ZW1fZGVub3JtCldIRVJFIChtZW51X2N1cnJlbmN5IElOICgnRG9sbGFycycsICcnKSkgQU5EIChkID4gMCkgQU5EIChkIDwgMjAyMikgQU5EIChkaXNoX25hbWUgSUxJS0UgJyVjYXZpYXIlJykKR1JPVVAgQlkgZApPUkRFUiBCWSBkIEFTQw==). diff --git a/docs/en/getting-started/example-datasets/opensky.md b/docs/en/getting-started/example-datasets/opensky.md new file mode 100644 index 00000000000..c9f6729cdd7 --- /dev/null +++ b/docs/en/getting-started/example-datasets/opensky.md @@ -0,0 +1,384 @@ +--- +toc_priority: 20 +toc_title: OpenSky +--- + +# Crowdsourced air traffic data from The OpenSky Network 2020 + +"The data in this dataset is derived and cleaned from the full OpenSky dataset to illustrate the development of air traffic during the COVID-19 pandemic. It spans all flights seen by the network's more than 2500 members since 1 January 2019. More data will be periodically included in the dataset until the end of the COVID-19 pandemic". + +Source: https://zenodo.org/record/5092942#.YRBCyTpRXYd + +Martin Strohmeier, Xavier Olive, Jannis Lübbe, Matthias Schäfer, and Vincent Lenders +"Crowdsourced air traffic data from the OpenSky Network 2019–2020" +Earth System Science Data 13(2), 2021 +https://doi.org/10.5194/essd-13-357-2021 + +## Download the Dataset + +``` +wget -O- https://zenodo.org/record/5092942 | grep -oP 'https://zenodo.org/record/5092942/files/flightlist_\d+_\d+\.csv\.gz' | xargs wget +``` + +Download will take about 2 minutes with good internet connection. There are 30 files with total size of 4.3 GB. + +## Create the Table + +``` +CREATE TABLE opensky +( + callsign String, + number String, + icao24 String, + registration String, + typecode String, + origin String, + destination String, + firstseen DateTime, + lastseen DateTime, + day DateTime, + latitude_1 Float64, + longitude_1 Float64, + altitude_1 Float64, + latitude_2 Float64, + longitude_2 Float64, + altitude_2 Float64 +) ENGINE = MergeTree ORDER BY (origin, destination, callsign); +``` + +## Import Data + +Upload data into ClickHouse in parallel: + +``` +ls -1 flightlist_*.csv.gz | xargs -P100 -I{} bash -c ' + gzip -c -d "{}" | clickhouse-client --date_time_input_format best_effort --query "INSERT INTO opensky FORMAT CSVWithNames"' +``` + +Here we pass the list of files (`ls -1 flightlist_*.csv.gz`) to `xargs` for parallel processing. +`xargs -P100` specifies to use up to 100 parallel workers but as we only have 30 files, the number of workers will be only 30. + +For every file, `xargs` will run a script with `bash -c`. The script has substitution in form of `{}` and the `xargs` command will substitute the filename to it (we have asked it for xargs with `-I{}`). + +The script will decompress the file (`gzip -c -d "{}"`) to standard output (`-c` parameter) and the output is redirected to `clickhouse-client`. + +Finally, `clickhouse-client` will do insertion. It will read input data in `CSVWithNames` format. We also asked to parse DateTime fields with extended parser (`--date_time_input_format best_effort`) to recognize ISO-8601 format with timezone offsets. + +Parallel upload takes 24 seconds. + +If you don't like parallel upload, here is sequential variant: +``` +for file in flightlist_*.csv.gz; do gzip -c -d "$file" | clickhouse-client --date_time_input_format best_effort --query "INSERT INTO opensky FORMAT CSVWithNames"; done +``` + +## Validate the Data + +``` +SELECT count() FROM opensky +66010819 +``` + +The size of dataset in ClickHouse is just 2.64 GiB: + +``` +SELECT formatReadableSize(total_bytes) FROM system.tables WHERE name = 'opensky' +2.64 GiB +``` + +## Run Some Queries + +Total distance travelled is 68 billion kilometers: + +``` +SELECT formatReadableQuantity(sum(geoDistance(longitude_1, latitude_1, longitude_2, latitude_2)) / 1000) FROM opensky + +┌─formatReadableQuantity(divide(sum(geoDistance(longitude_1, latitude_1, longitude_2, latitude_2)), 1000))─┐ +│ 68.72 billion │ +└──────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +Average flight distance is around 1000 km. +``` +SELECT avg(geoDistance(longitude_1, latitude_1, longitude_2, latitude_2)) FROM opensky + +┌─avg(geoDistance(longitude_1, latitude_1, longitude_2, latitude_2))─┐ +│ 1041090.6465708319 │ +└────────────────────────────────────────────────────────────────────┘ +``` + +### Most busy origin airports and the average distance seen: + +``` +SELECT + origin, + count(), + round(avg(geoDistance(longitude_1, latitude_1, longitude_2, latitude_2))) AS distance, + bar(distance, 0, 10000000, 100) AS bar +FROM opensky +WHERE origin != '' +GROUP BY origin +ORDER BY count() DESC +LIMIT 100 + +Query id: f9010ea5-97d0-45a3-a5bd-9657906cd105 + + ┌─origin─┬─count()─┬─distance─┬─bar────────────────────────────────────┐ + 1. │ KORD │ 745007 │ 1546108 │ ███████████████▍ │ + 2. │ KDFW │ 696702 │ 1358721 │ █████████████▌ │ + 3. │ KATL │ 667286 │ 1169661 │ ███████████▋ │ + 4. │ KDEN │ 582709 │ 1287742 │ ████████████▊ │ + 5. │ KLAX │ 581952 │ 2628393 │ ██████████████████████████▎ │ + 6. │ KLAS │ 447789 │ 1336967 │ █████████████▎ │ + 7. │ KPHX │ 428558 │ 1345635 │ █████████████▍ │ + 8. │ KSEA │ 412592 │ 1757317 │ █████████████████▌ │ + 9. │ KCLT │ 404612 │ 880355 │ ████████▋ │ + 10. │ VIDP │ 363074 │ 1445052 │ ██████████████▍ │ + 11. │ EDDF │ 362643 │ 2263960 │ ██████████████████████▋ │ + 12. │ KSFO │ 361869 │ 2445732 │ ████████████████████████▍ │ + 13. │ KJFK │ 349232 │ 2996550 │ █████████████████████████████▊ │ + 14. │ KMSP │ 346010 │ 1287328 │ ████████████▋ │ + 15. │ LFPG │ 344748 │ 2206203 │ ██████████████████████ │ + 16. │ EGLL │ 341370 │ 3216593 │ ████████████████████████████████▏ │ + 17. │ EHAM │ 340272 │ 2116425 │ █████████████████████▏ │ + 18. │ KEWR │ 337696 │ 1826545 │ ██████████████████▎ │ + 19. │ KPHL │ 320762 │ 1291761 │ ████████████▊ │ + 20. │ OMDB │ 308855 │ 2855706 │ ████████████████████████████▌ │ + 21. │ UUEE │ 307098 │ 1555122 │ ███████████████▌ │ + 22. │ KBOS │ 304416 │ 1621675 │ ████████████████▏ │ + 23. │ LEMD │ 291787 │ 1695097 │ ████████████████▊ │ + 24. │ YSSY │ 272979 │ 1875298 │ ██████████████████▋ │ + 25. │ KMIA │ 265121 │ 1923542 │ ███████████████████▏ │ + 26. │ ZGSZ │ 263497 │ 745086 │ ███████▍ │ + 27. │ EDDM │ 256691 │ 1361453 │ █████████████▌ │ + 28. │ WMKK │ 254264 │ 1626688 │ ████████████████▎ │ + 29. │ CYYZ │ 251192 │ 2175026 │ █████████████████████▋ │ + 30. │ KLGA │ 248699 │ 1106935 │ ███████████ │ + 31. │ VHHH │ 248473 │ 3457658 │ ██████████████████████████████████▌ │ + 32. │ RJTT │ 243477 │ 1272744 │ ████████████▋ │ + 33. │ KBWI │ 241440 │ 1187060 │ ███████████▋ │ + 34. │ KIAD │ 239558 │ 1683485 │ ████████████████▋ │ + 35. │ KIAH │ 234202 │ 1538335 │ ███████████████▍ │ + 36. │ KFLL │ 223447 │ 1464410 │ ██████████████▋ │ + 37. │ KDAL │ 212055 │ 1082339 │ ██████████▋ │ + 38. │ KDCA │ 207883 │ 1013359 │ ██████████▏ │ + 39. │ LIRF │ 207047 │ 1427965 │ ██████████████▎ │ + 40. │ PANC │ 206007 │ 2525359 │ █████████████████████████▎ │ + 41. │ LTFJ │ 205415 │ 860470 │ ████████▌ │ + 42. │ KDTW │ 204020 │ 1106716 │ ███████████ │ + 43. │ VABB │ 201679 │ 1300865 │ █████████████ │ + 44. │ OTHH │ 200797 │ 3759544 │ █████████████████████████████████████▌ │ + 45. │ KMDW │ 200796 │ 1232551 │ ████████████▎ │ + 46. │ KSAN │ 198003 │ 1495195 │ ██████████████▊ │ + 47. │ KPDX │ 197760 │ 1269230 │ ████████████▋ │ + 48. │ SBGR │ 197624 │ 2041697 │ ████████████████████▍ │ + 49. │ VOBL │ 189011 │ 1040180 │ ██████████▍ │ + 50. │ LEBL │ 188956 │ 1283190 │ ████████████▋ │ + 51. │ YBBN │ 188011 │ 1253405 │ ████████████▌ │ + 52. │ LSZH │ 187934 │ 1572029 │ ███████████████▋ │ + 53. │ YMML │ 187643 │ 1870076 │ ██████████████████▋ │ + 54. │ RCTP │ 184466 │ 2773976 │ ███████████████████████████▋ │ + 55. │ KSNA │ 180045 │ 778484 │ ███████▋ │ + 56. │ EGKK │ 176420 │ 1694770 │ ████████████████▊ │ + 57. │ LOWW │ 176191 │ 1274833 │ ████████████▋ │ + 58. │ UUDD │ 176099 │ 1368226 │ █████████████▋ │ + 59. │ RKSI │ 173466 │ 3079026 │ ██████████████████████████████▋ │ + 60. │ EKCH │ 172128 │ 1229895 │ ████████████▎ │ + 61. │ KOAK │ 171119 │ 1114447 │ ███████████▏ │ + 62. │ RPLL │ 170122 │ 1440735 │ ██████████████▍ │ + 63. │ KRDU │ 167001 │ 830521 │ ████████▎ │ + 64. │ KAUS │ 164524 │ 1256198 │ ████████████▌ │ + 65. │ KBNA │ 163242 │ 1022726 │ ██████████▏ │ + 66. │ KSDF │ 162655 │ 1380867 │ █████████████▋ │ + 67. │ ENGM │ 160732 │ 910108 │ █████████ │ + 68. │ LIMC │ 160696 │ 1564620 │ ███████████████▋ │ + 69. │ KSJC │ 159278 │ 1081125 │ ██████████▋ │ + 70. │ KSTL │ 157984 │ 1026699 │ ██████████▎ │ + 71. │ UUWW │ 156811 │ 1261155 │ ████████████▌ │ + 72. │ KIND │ 153929 │ 987944 │ █████████▊ │ + 73. │ ESSA │ 153390 │ 1203439 │ ████████████ │ + 74. │ KMCO │ 153351 │ 1508657 │ ███████████████ │ + 75. │ KDVT │ 152895 │ 74048 │ ▋ │ + 76. │ VTBS │ 152645 │ 2255591 │ ██████████████████████▌ │ + 77. │ CYVR │ 149574 │ 2027413 │ ████████████████████▎ │ + 78. │ EIDW │ 148723 │ 1503985 │ ███████████████ │ + 79. │ LFPO │ 143277 │ 1152964 │ ███████████▌ │ + 80. │ EGSS │ 140830 │ 1348183 │ █████████████▍ │ + 81. │ KAPA │ 140776 │ 420441 │ ████▏ │ + 82. │ KHOU │ 138985 │ 1068806 │ ██████████▋ │ + 83. │ KTPA │ 138033 │ 1338223 │ █████████████▍ │ + 84. │ KFFZ │ 137333 │ 55397 │ ▌ │ + 85. │ NZAA │ 136092 │ 1581264 │ ███████████████▋ │ + 86. │ YPPH │ 133916 │ 1271550 │ ████████████▋ │ + 87. │ RJBB │ 133522 │ 1805623 │ ██████████████████ │ + 88. │ EDDL │ 133018 │ 1265919 │ ████████████▋ │ + 89. │ ULLI │ 130501 │ 1197108 │ ███████████▊ │ + 90. │ KIWA │ 127195 │ 250876 │ ██▌ │ + 91. │ KTEB │ 126969 │ 1189414 │ ███████████▊ │ + 92. │ VOMM │ 125616 │ 1127757 │ ███████████▎ │ + 93. │ LSGG │ 123998 │ 1049101 │ ██████████▍ │ + 94. │ LPPT │ 122733 │ 1779187 │ █████████████████▋ │ + 95. │ WSSS │ 120493 │ 3264122 │ ████████████████████████████████▋ │ + 96. │ EBBR │ 118539 │ 1579939 │ ███████████████▋ │ + 97. │ VTBD │ 118107 │ 661627 │ ██████▌ │ + 98. │ KVNY │ 116326 │ 692960 │ ██████▊ │ + 99. │ EDDT │ 115122 │ 941740 │ █████████▍ │ +100. │ EFHK │ 114860 │ 1629143 │ ████████████████▎ │ + └────────┴─────────┴──────────┴────────────────────────────────────────┘ + +100 rows in set. Elapsed: 0.186 sec. Processed 48.31 million rows, 2.17 GB (259.27 million rows/s., 11.67 GB/s.) +``` + +### Number of flights from three major Moscow airports, weekly: + +``` +SELECT + toMonday(day) AS k, + count() AS c, + bar(c, 0, 10000, 100) AS bar +FROM opensky +WHERE origin IN ('UUEE', 'UUDD', 'UUWW') +GROUP BY k +ORDER BY k ASC + +Query id: 1b446157-9519-4cc4-a1cb-178dfcc15a8e + + ┌──────────k─┬────c─┬─bar──────────────────────────────────────────────────────────────────────────┐ + 1. │ 2018-12-31 │ 5248 │ ████████████████████████████████████████████████████▍ │ + 2. │ 2019-01-07 │ 6302 │ ███████████████████████████████████████████████████████████████ │ + 3. │ 2019-01-14 │ 5701 │ █████████████████████████████████████████████████████████ │ + 4. │ 2019-01-21 │ 5638 │ ████████████████████████████████████████████████████████▍ │ + 5. │ 2019-01-28 │ 5731 │ █████████████████████████████████████████████████████████▎ │ + 6. │ 2019-02-04 │ 5683 │ ████████████████████████████████████████████████████████▋ │ + 7. │ 2019-02-11 │ 5759 │ █████████████████████████████████████████████████████████▌ │ + 8. │ 2019-02-18 │ 5736 │ █████████████████████████████████████████████████████████▎ │ + 9. │ 2019-02-25 │ 5873 │ ██████████████████████████████████████████████████████████▋ │ + 10. │ 2019-03-04 │ 5965 │ ███████████████████████████████████████████████████████████▋ │ + 11. │ 2019-03-11 │ 5900 │ ███████████████████████████████████████████████████████████ │ + 12. │ 2019-03-18 │ 5823 │ ██████████████████████████████████████████████████████████▏ │ + 13. │ 2019-03-25 │ 5899 │ ██████████████████████████████████████████████████████████▊ │ + 14. │ 2019-04-01 │ 6043 │ ████████████████████████████████████████████████████████████▍ │ + 15. │ 2019-04-08 │ 6098 │ ████████████████████████████████████████████████████████████▊ │ + 16. │ 2019-04-15 │ 6196 │ █████████████████████████████████████████████████████████████▊ │ + 17. │ 2019-04-22 │ 6486 │ ████████████████████████████████████████████████████████████████▋ │ + 18. │ 2019-04-29 │ 6682 │ ██████████████████████████████████████████████████████████████████▋ │ + 19. │ 2019-05-06 │ 6739 │ ███████████████████████████████████████████████████████████████████▍ │ + 20. │ 2019-05-13 │ 6600 │ ██████████████████████████████████████████████████████████████████ │ + 21. │ 2019-05-20 │ 6575 │ █████████████████████████████████████████████████████████████████▋ │ + 22. │ 2019-05-27 │ 6786 │ ███████████████████████████████████████████████████████████████████▋ │ + 23. │ 2019-06-03 │ 6872 │ ████████████████████████████████████████████████████████████████████▋ │ + 24. │ 2019-06-10 │ 7045 │ ██████████████████████████████████████████████████████████████████████▍ │ + 25. │ 2019-06-17 │ 7045 │ ██████████████████████████████████████████████████████████████████████▍ │ + 26. │ 2019-06-24 │ 6852 │ ████████████████████████████████████████████████████████████████████▌ │ + 27. │ 2019-07-01 │ 7248 │ ████████████████████████████████████████████████████████████████████████▍ │ + 28. │ 2019-07-08 │ 7284 │ ████████████████████████████████████████████████████████████████████████▋ │ + 29. │ 2019-07-15 │ 7142 │ ███████████████████████████████████████████████████████████████████████▍ │ + 30. │ 2019-07-22 │ 7108 │ ███████████████████████████████████████████████████████████████████████ │ + 31. │ 2019-07-29 │ 7251 │ ████████████████████████████████████████████████████████████████████████▌ │ + 32. │ 2019-08-05 │ 7403 │ ██████████████████████████████████████████████████████████████████████████ │ + 33. │ 2019-08-12 │ 7457 │ ██████████████████████████████████████████████████████████████████████████▌ │ + 34. │ 2019-08-19 │ 7502 │ ███████████████████████████████████████████████████████████████████████████ │ + 35. │ 2019-08-26 │ 7540 │ ███████████████████████████████████████████████████████████████████████████▍ │ + 36. │ 2019-09-02 │ 7237 │ ████████████████████████████████████████████████████████████████████████▎ │ + 37. │ 2019-09-09 │ 7328 │ █████████████████████████████████████████████████████████████████████████▎ │ + 38. │ 2019-09-16 │ 5566 │ ███████████████████████████████████████████████████████▋ │ + 39. │ 2019-09-23 │ 7049 │ ██████████████████████████████████████████████████████████████████████▍ │ + 40. │ 2019-09-30 │ 6880 │ ████████████████████████████████████████████████████████████████████▋ │ + 41. │ 2019-10-07 │ 6518 │ █████████████████████████████████████████████████████████████████▏ │ + 42. │ 2019-10-14 │ 6688 │ ██████████████████████████████████████████████████████████████████▊ │ + 43. │ 2019-10-21 │ 6667 │ ██████████████████████████████████████████████████████████████████▋ │ + 44. │ 2019-10-28 │ 6303 │ ███████████████████████████████████████████████████████████████ │ + 45. │ 2019-11-04 │ 6298 │ ██████████████████████████████████████████████████████████████▊ │ + 46. │ 2019-11-11 │ 6137 │ █████████████████████████████████████████████████████████████▎ │ + 47. │ 2019-11-18 │ 6051 │ ████████████████████████████████████████████████████████████▌ │ + 48. │ 2019-11-25 │ 5820 │ ██████████████████████████████████████████████████████████▏ │ + 49. │ 2019-12-02 │ 5942 │ ███████████████████████████████████████████████████████████▍ │ + 50. │ 2019-12-09 │ 4891 │ ████████████████████████████████████████████████▊ │ + 51. │ 2019-12-16 │ 5682 │ ████████████████████████████████████████████████████████▋ │ + 52. │ 2019-12-23 │ 6111 │ █████████████████████████████████████████████████████████████ │ + 53. │ 2019-12-30 │ 5870 │ ██████████████████████████████████████████████████████████▋ │ + 54. │ 2020-01-06 │ 5953 │ ███████████████████████████████████████████████████████████▌ │ + 55. │ 2020-01-13 │ 5698 │ ████████████████████████████████████████████████████████▊ │ + 56. │ 2020-01-20 │ 5339 │ █████████████████████████████████████████████████████▍ │ + 57. │ 2020-01-27 │ 5566 │ ███████████████████████████████████████████████████████▋ │ + 58. │ 2020-02-03 │ 5801 │ ██████████████████████████████████████████████████████████ │ + 59. │ 2020-02-10 │ 5692 │ ████████████████████████████████████████████████████████▊ │ + 60. │ 2020-02-17 │ 5912 │ ███████████████████████████████████████████████████████████ │ + 61. │ 2020-02-24 │ 6031 │ ████████████████████████████████████████████████████████████▎ │ + 62. │ 2020-03-02 │ 6105 │ █████████████████████████████████████████████████████████████ │ + 63. │ 2020-03-09 │ 5823 │ ██████████████████████████████████████████████████████████▏ │ + 64. │ 2020-03-16 │ 4659 │ ██████████████████████████████████████████████▌ │ + 65. │ 2020-03-23 │ 3720 │ █████████████████████████████████████▏ │ + 66. │ 2020-03-30 │ 1720 │ █████████████████▏ │ + 67. │ 2020-04-06 │ 849 │ ████████▍ │ + 68. │ 2020-04-13 │ 710 │ ███████ │ + 69. │ 2020-04-20 │ 725 │ ███████▏ │ + 70. │ 2020-04-27 │ 920 │ █████████▏ │ + 71. │ 2020-05-04 │ 859 │ ████████▌ │ + 72. │ 2020-05-11 │ 1047 │ ██████████▍ │ + 73. │ 2020-05-18 │ 1135 │ ███████████▎ │ + 74. │ 2020-05-25 │ 1266 │ ████████████▋ │ + 75. │ 2020-06-01 │ 1793 │ █████████████████▊ │ + 76. │ 2020-06-08 │ 1979 │ ███████████████████▋ │ + 77. │ 2020-06-15 │ 2297 │ ██████████████████████▊ │ + 78. │ 2020-06-22 │ 2788 │ ███████████████████████████▊ │ + 79. │ 2020-06-29 │ 3389 │ █████████████████████████████████▊ │ + 80. │ 2020-07-06 │ 3545 │ ███████████████████████████████████▍ │ + 81. │ 2020-07-13 │ 3569 │ ███████████████████████████████████▋ │ + 82. │ 2020-07-20 │ 3784 │ █████████████████████████████████████▋ │ + 83. │ 2020-07-27 │ 3960 │ ███████████████████████████████████████▌ │ + 84. │ 2020-08-03 │ 4323 │ ███████████████████████████████████████████▏ │ + 85. │ 2020-08-10 │ 4581 │ █████████████████████████████████████████████▋ │ + 86. │ 2020-08-17 │ 4791 │ ███████████████████████████████████████████████▊ │ + 87. │ 2020-08-24 │ 4928 │ █████████████████████████████████████████████████▎ │ + 88. │ 2020-08-31 │ 4687 │ ██████████████████████████████████████████████▋ │ + 89. │ 2020-09-07 │ 4643 │ ██████████████████████████████████████████████▍ │ + 90. │ 2020-09-14 │ 4594 │ █████████████████████████████████████████████▊ │ + 91. │ 2020-09-21 │ 4478 │ ████████████████████████████████████████████▋ │ + 92. │ 2020-09-28 │ 4382 │ ███████████████████████████████████████████▋ │ + 93. │ 2020-10-05 │ 4261 │ ██████████████████████████████████████████▌ │ + 94. │ 2020-10-12 │ 4243 │ ██████████████████████████████████████████▍ │ + 95. │ 2020-10-19 │ 3941 │ ███████████████████████████████████████▍ │ + 96. │ 2020-10-26 │ 3616 │ ████████████████████████████████████▏ │ + 97. │ 2020-11-02 │ 3586 │ ███████████████████████████████████▋ │ + 98. │ 2020-11-09 │ 3403 │ ██████████████████████████████████ │ + 99. │ 2020-11-16 │ 3336 │ █████████████████████████████████▎ │ +100. │ 2020-11-23 │ 3230 │ ████████████████████████████████▎ │ +101. │ 2020-11-30 │ 3183 │ ███████████████████████████████▋ │ +102. │ 2020-12-07 │ 3285 │ ████████████████████████████████▋ │ +103. │ 2020-12-14 │ 3367 │ █████████████████████████████████▋ │ +104. │ 2020-12-21 │ 3748 │ █████████████████████████████████████▍ │ +105. │ 2020-12-28 │ 3986 │ ███████████████████████████████████████▋ │ +106. │ 2021-01-04 │ 3906 │ ███████████████████████████████████████ │ +107. │ 2021-01-11 │ 3425 │ ██████████████████████████████████▎ │ +108. │ 2021-01-18 │ 3144 │ ███████████████████████████████▍ │ +109. │ 2021-01-25 │ 3115 │ ███████████████████████████████▏ │ +110. │ 2021-02-01 │ 3285 │ ████████████████████████████████▋ │ +111. │ 2021-02-08 │ 3321 │ █████████████████████████████████▏ │ +112. │ 2021-02-15 │ 3475 │ ██████████████████████████████████▋ │ +113. │ 2021-02-22 │ 3549 │ ███████████████████████████████████▍ │ +114. │ 2021-03-01 │ 3755 │ █████████████████████████████████████▌ │ +115. │ 2021-03-08 │ 3080 │ ██████████████████████████████▋ │ +116. │ 2021-03-15 │ 3789 │ █████████████████████████████████████▊ │ +117. │ 2021-03-22 │ 3804 │ ██████████████████████████████████████ │ +118. │ 2021-03-29 │ 4238 │ ██████████████████████████████████████████▍ │ +119. │ 2021-04-05 │ 4307 │ ███████████████████████████████████████████ │ +120. │ 2021-04-12 │ 4225 │ ██████████████████████████████████████████▎ │ +121. │ 2021-04-19 │ 4391 │ ███████████████████████████████████████████▊ │ +122. │ 2021-04-26 │ 4868 │ ████████████████████████████████████████████████▋ │ +123. │ 2021-05-03 │ 4977 │ █████████████████████████████████████████████████▋ │ +124. │ 2021-05-10 │ 5164 │ ███████████████████████████████████████████████████▋ │ +125. │ 2021-05-17 │ 4986 │ █████████████████████████████████████████████████▋ │ +126. │ 2021-05-24 │ 5024 │ ██████████████████████████████████████████████████▏ │ +127. │ 2021-05-31 │ 4824 │ ████████████████████████████████████████████████▏ │ +128. │ 2021-06-07 │ 5652 │ ████████████████████████████████████████████████████████▌ │ +129. │ 2021-06-14 │ 5613 │ ████████████████████████████████████████████████████████▏ │ +130. │ 2021-06-21 │ 6061 │ ████████████████████████████████████████████████████████████▌ │ +131. │ 2021-06-28 │ 2554 │ █████████████████████████▌ │ + └────────────┴──────┴──────────────────────────────────────────────────────────────────────────────┘ + +131 rows in set. Elapsed: 0.014 sec. Processed 655.36 thousand rows, 11.14 MB (47.56 million rows/s., 808.48 MB/s.) +``` + +### Test it in Playground + +The data is uploaded to ClickHouse Playground, [example](https://gh-api.clickhouse.tech/play?user=play#U0VMRUNUCiAgICBvcmlnaW4sCiAgICBjb3VudCgpLAogICAgcm91bmQoYXZnKGdlb0Rpc3RhbmNlKGxvbmdpdHVkZV8xLCBsYXRpdHVkZV8xLCBsb25naXR1ZGVfMiwgbGF0aXR1ZGVfMikpKSBBUyBkaXN0YW5jZSwKICAgIGJhcihkaXN0YW5jZSwgMCwgMTAwMDAwMDAsIDEwMCkgQVMgYmFyCkZST00gb3BlbnNreQpXSEVSRSBvcmlnaW4gIT0gJycKR1JPVVAgQlkgb3JpZ2luCk9SREVSIEJZIGNvdW50KCkgREVTQwpMSU1JVCAxMDA=). diff --git a/docs/en/getting-started/example-datasets/uk-price-paid.md b/docs/en/getting-started/example-datasets/uk-price-paid.md new file mode 100644 index 00000000000..948ebd35b21 --- /dev/null +++ b/docs/en/getting-started/example-datasets/uk-price-paid.md @@ -0,0 +1,581 @@ +--- +toc_priority: 20 +toc_title: UK Property Price Paid +--- + +# UK Property Price Paid + +The dataset contains data about prices paid for real-estate property in England and Wales. The data is available since year 1995. +The size of the dataset in uncompressed form is about 4 GiB and it will take about 226 MiB in ClickHouse. + +Source: https://www.gov.uk/government/statistical-data-sets/price-paid-data-downloads +Description of the fields: https://www.gov.uk/guidance/about-the-price-paid-data + +Contains HM Land Registry data © Crown copyright and database right 2021. This data is licensed under the Open Government Licence v3.0. + +## Download the Dataset + +``` +wget http://prod.publicdata.landregistry.gov.uk.s3-website-eu-west-1.amazonaws.com/pp-complete.csv +``` + +Download will take about 2 minutes with good internet connection. + +## Create the Table + +``` +CREATE TABLE uk_price_paid +( + price UInt32, + date Date, + postcode1 LowCardinality(String), + postcode2 LowCardinality(String), + type Enum8('terraced' = 1, 'semi-detached' = 2, 'detached' = 3, 'flat' = 4, 'other' = 0), + is_new UInt8, + duration Enum8('freehold' = 1, 'leasehold' = 2, 'unknown' = 0), + addr1 String, + addr2 String, + street LowCardinality(String), + locality LowCardinality(String), + town LowCardinality(String), + district LowCardinality(String), + county LowCardinality(String), + category UInt8 +) ENGINE = MergeTree ORDER BY (postcode1, postcode2, addr1, addr2); +``` + +## Preprocess and Import Data + +We will use `clickhouse-local` tool for data preprocessing and `clickhouse-client` to upload it. + +In this example, we define the structure of source data from the CSV file and specify a query to preprocess the data with `clickhouse-local`. + +The preprocessing is: +- splitting the postcode to two different columns `postcode1` and `postcode2` that is better for storage and queries; +- coverting the `time` field to date as it only contains 00:00 time; +- ignoring the `uuid` field because we don't need it for analysis; +- transforming `type` and `duration` to more readable Enum fields with function `transform`; +- transforming `is_new` and `category` fields from single-character string (`Y`/`N` and `A`/`B`) to UInt8 field with 0 and 1. + +Preprocessed data is piped directly to `clickhouse-client` to be inserted into ClickHouse table in streaming fashion. + +``` +clickhouse-local --input-format CSV --structure ' + uuid String, + price UInt32, + time DateTime, + postcode String, + a String, + b String, + c String, + addr1 String, + addr2 String, + street String, + locality String, + town String, + district String, + county String, + d String, + e String +' --query " + WITH splitByChar(' ', postcode) AS p + SELECT + price, + toDate(time) AS date, + p[1] AS postcode1, + p[2] AS postcode2, + transform(a, ['T', 'S', 'D', 'F', 'O'], ['terraced', 'semi-detached', 'detached', 'flat', 'other']) AS type, + b = 'Y' AS is_new, + transform(c, ['F', 'L', 'U'], ['freehold', 'leasehold', 'unknown']) AS duration, + addr1, + addr2, + street, + locality, + town, + district, + county, + d = 'B' AS category + FROM table" --date_time_input_format best_effort < pp-complete.csv | clickhouse-client --query "INSERT INTO uk_price_paid FORMAT TSV" +``` + +It will take about 40 seconds. + +## Validate the Data + +``` +SELECT count() FROM uk_price_paid +26248711 +``` + +The size of dataset in ClickHouse is just 226 MiB: + +``` +SELECT formatReadableSize(total_bytes) FROM system.tables WHERE name = 'uk_price_paid' +226.40 MiB +``` + +## Run Some Queries + +### Average price per year: + +``` +SELECT toYear(date) AS year, round(avg(price)) AS price, bar(price, 0, 1000000, 80) FROM uk_price_paid GROUP BY year ORDER BY year + +┌─year─┬──price─┬─bar(round(avg(price)), 0, 1000000, 80)─┐ +│ 1995 │ 67932 │ █████▍ │ +│ 1996 │ 71505 │ █████▋ │ +│ 1997 │ 78532 │ ██████▎ │ +│ 1998 │ 85435 │ ██████▋ │ +│ 1999 │ 96036 │ ███████▋ │ +│ 2000 │ 107478 │ ████████▌ │ +│ 2001 │ 118886 │ █████████▌ │ +│ 2002 │ 137940 │ ███████████ │ +│ 2003 │ 155888 │ ████████████▍ │ +│ 2004 │ 178885 │ ██████████████▎ │ +│ 2005 │ 189350 │ ███████████████▏ │ +│ 2006 │ 203528 │ ████████████████▎ │ +│ 2007 │ 219377 │ █████████████████▌ │ +│ 2008 │ 217056 │ █████████████████▎ │ +│ 2009 │ 213419 │ █████████████████ │ +│ 2010 │ 236110 │ ██████████████████▊ │ +│ 2011 │ 232804 │ ██████████████████▌ │ +│ 2012 │ 238366 │ ███████████████████ │ +│ 2013 │ 256931 │ ████████████████████▌ │ +│ 2014 │ 279917 │ ██████████████████████▍ │ +│ 2015 │ 297264 │ ███████████████████████▋ │ +│ 2016 │ 313197 │ █████████████████████████ │ +│ 2017 │ 346070 │ ███████████████████████████▋ │ +│ 2018 │ 350117 │ ████████████████████████████ │ +│ 2019 │ 351010 │ ████████████████████████████ │ +│ 2020 │ 368974 │ █████████████████████████████▌ │ +│ 2021 │ 384351 │ ██████████████████████████████▋ │ +└──────┴────────┴────────────────────────────────────────┘ + +27 rows in set. Elapsed: 0.027 sec. Processed 26.25 million rows, 157.49 MB (955.96 million rows/s., 5.74 GB/s.) +``` + +### Average price per year in London: + +``` +SELECT toYear(date) AS year, round(avg(price)) AS price, bar(price, 0, 2000000, 100) FROM uk_price_paid WHERE town = 'LONDON' GROUP BY year ORDER BY year + +┌─year─┬───price─┬─bar(round(avg(price)), 0, 2000000, 100)───────────────┐ +│ 1995 │ 109112 │ █████▍ │ +│ 1996 │ 118667 │ █████▊ │ +│ 1997 │ 136518 │ ██████▋ │ +│ 1998 │ 152983 │ ███████▋ │ +│ 1999 │ 180633 │ █████████ │ +│ 2000 │ 215830 │ ██████████▋ │ +│ 2001 │ 232996 │ ███████████▋ │ +│ 2002 │ 263672 │ █████████████▏ │ +│ 2003 │ 278394 │ █████████████▊ │ +│ 2004 │ 304665 │ ███████████████▏ │ +│ 2005 │ 322875 │ ████████████████▏ │ +│ 2006 │ 356192 │ █████████████████▋ │ +│ 2007 │ 404055 │ ████████████████████▏ │ +│ 2008 │ 420741 │ █████████████████████ │ +│ 2009 │ 427754 │ █████████████████████▍ │ +│ 2010 │ 480306 │ ████████████████████████ │ +│ 2011 │ 496274 │ ████████████████████████▋ │ +│ 2012 │ 519441 │ █████████████████████████▊ │ +│ 2013 │ 616209 │ ██████████████████████████████▋ │ +│ 2014 │ 724144 │ ████████████████████████████████████▏ │ +│ 2015 │ 792112 │ ███████████████████████████████████████▌ │ +│ 2016 │ 843568 │ ██████████████████████████████████████████▏ │ +│ 2017 │ 982566 │ █████████████████████████████████████████████████▏ │ +│ 2018 │ 1016845 │ ██████████████████████████████████████████████████▋ │ +│ 2019 │ 1043277 │ ████████████████████████████████████████████████████▏ │ +│ 2020 │ 1003963 │ ██████████████████████████████████████████████████▏ │ +│ 2021 │ 940794 │ ███████████████████████████████████████████████ │ +└──────┴─────────┴───────────────────────────────────────────────────────┘ + +27 rows in set. Elapsed: 0.024 sec. Processed 26.25 million rows, 76.88 MB (1.08 billion rows/s., 3.15 GB/s.) +``` + +Something happened in 2013. I don't have a clue. Maybe you have a clue what happened in 2020? + +### The most expensive neighborhoods: + +``` +SELECT + town, + district, + count() AS c, + round(avg(price)) AS price, + bar(price, 0, 5000000, 100) +FROM uk_price_paid +WHERE date >= '2020-01-01' +GROUP BY + town, + district +HAVING c >= 100 +ORDER BY price DESC +LIMIT 100 + +┌─town─────────────────┬─district───────────────┬────c─┬───price─┬─bar(round(avg(price)), 0, 5000000, 100)────────────────────────────┐ +│ LONDON │ CITY OF WESTMINSTER │ 3372 │ 3305225 │ ██████████████████████████████████████████████████████████████████ │ +│ LONDON │ CITY OF LONDON │ 257 │ 3294478 │ █████████████████████████████████████████████████████████████████▊ │ +│ LONDON │ KENSINGTON AND CHELSEA │ 2367 │ 2342422 │ ██████████████████████████████████████████████▋ │ +│ LEATHERHEAD │ ELMBRIDGE │ 108 │ 1927143 │ ██████████████████████████████████████▌ │ +│ VIRGINIA WATER │ RUNNYMEDE │ 142 │ 1868819 │ █████████████████████████████████████▍ │ +│ LONDON │ CAMDEN │ 2815 │ 1736788 │ ██████████████████████████████████▋ │ +│ THORNTON HEATH │ CROYDON │ 521 │ 1733051 │ ██████████████████████████████████▋ │ +│ WINDLESHAM │ SURREY HEATH │ 103 │ 1717255 │ ██████████████████████████████████▎ │ +│ BARNET │ ENFIELD │ 115 │ 1503458 │ ██████████████████████████████ │ +│ OXFORD │ SOUTH OXFORDSHIRE │ 298 │ 1275200 │ █████████████████████████▌ │ +│ LONDON │ ISLINGTON │ 2458 │ 1274308 │ █████████████████████████▍ │ +│ COBHAM │ ELMBRIDGE │ 364 │ 1260005 │ █████████████████████████▏ │ +│ LONDON │ HOUNSLOW │ 618 │ 1215682 │ ████████████████████████▎ │ +│ ASCOT │ WINDSOR AND MAIDENHEAD │ 379 │ 1215146 │ ████████████████████████▎ │ +│ LONDON │ RICHMOND UPON THAMES │ 654 │ 1207551 │ ████████████████████████▏ │ +│ BEACONSFIELD │ BUCKINGHAMSHIRE │ 307 │ 1186220 │ ███████████████████████▋ │ +│ RICHMOND │ RICHMOND UPON THAMES │ 805 │ 1100420 │ ██████████████████████ │ +│ LONDON │ HAMMERSMITH AND FULHAM │ 2888 │ 1062959 │ █████████████████████▎ │ +│ WEYBRIDGE │ ELMBRIDGE │ 607 │ 1027161 │ ████████████████████▌ │ +│ RADLETT │ HERTSMERE │ 265 │ 1015896 │ ████████████████████▎ │ +│ SALCOMBE │ SOUTH HAMS │ 124 │ 1014393 │ ████████████████████▎ │ +│ BURFORD │ WEST OXFORDSHIRE │ 102 │ 993100 │ ███████████████████▋ │ +│ ESHER │ ELMBRIDGE │ 454 │ 969770 │ ███████████████████▍ │ +│ HINDHEAD │ WAVERLEY │ 128 │ 967786 │ ███████████████████▎ │ +│ BROCKENHURST │ NEW FOREST │ 121 │ 967046 │ ███████████████████▎ │ +│ LEATHERHEAD │ GUILDFORD │ 191 │ 964489 │ ███████████████████▎ │ +│ GERRARDS CROSS │ BUCKINGHAMSHIRE │ 376 │ 958555 │ ███████████████████▏ │ +│ EAST MOLESEY │ ELMBRIDGE │ 181 │ 943457 │ ██████████████████▋ │ +│ OLNEY │ MILTON KEYNES │ 220 │ 942892 │ ██████████████████▋ │ +│ CHALFONT ST GILES │ BUCKINGHAMSHIRE │ 135 │ 926950 │ ██████████████████▌ │ +│ HENLEY-ON-THAMES │ SOUTH OXFORDSHIRE │ 509 │ 905732 │ ██████████████████ │ +│ KINGSTON UPON THAMES │ KINGSTON UPON THAMES │ 889 │ 899689 │ █████████████████▊ │ +│ BELVEDERE │ BEXLEY │ 313 │ 895336 │ █████████████████▊ │ +│ CRANBROOK │ TUNBRIDGE WELLS │ 404 │ 888190 │ █████████████████▋ │ +│ LONDON │ EALING │ 2460 │ 865893 │ █████████████████▎ │ +│ MAIDENHEAD │ BUCKINGHAMSHIRE │ 114 │ 863814 │ █████████████████▎ │ +│ LONDON │ MERTON │ 1958 │ 857192 │ █████████████████▏ │ +│ GUILDFORD │ WAVERLEY │ 131 │ 854447 │ █████████████████ │ +│ LONDON │ HACKNEY │ 3088 │ 846571 │ ████████████████▊ │ +│ LYMM │ WARRINGTON │ 285 │ 839920 │ ████████████████▋ │ +│ HARPENDEN │ ST ALBANS │ 606 │ 836994 │ ████████████████▋ │ +│ LONDON │ WANDSWORTH │ 6113 │ 832292 │ ████████████████▋ │ +│ LONDON │ SOUTHWARK │ 3612 │ 831319 │ ████████████████▋ │ +│ BERKHAMSTED │ DACORUM │ 502 │ 830356 │ ████████████████▌ │ +│ KINGS LANGLEY │ DACORUM │ 137 │ 821358 │ ████████████████▍ │ +│ TONBRIDGE │ TUNBRIDGE WELLS │ 339 │ 806736 │ ████████████████▏ │ +│ EPSOM │ REIGATE AND BANSTEAD │ 157 │ 805903 │ ████████████████ │ +│ WOKING │ GUILDFORD │ 161 │ 803283 │ ████████████████ │ +│ STOCKBRIDGE │ TEST VALLEY │ 168 │ 801973 │ ████████████████ │ +│ TEDDINGTON │ RICHMOND UPON THAMES │ 539 │ 798591 │ ███████████████▊ │ +│ OXFORD │ VALE OF WHITE HORSE │ 329 │ 792907 │ ███████████████▋ │ +│ LONDON │ BARNET │ 3624 │ 789583 │ ███████████████▋ │ +│ TWICKENHAM │ RICHMOND UPON THAMES │ 1090 │ 787760 │ ███████████████▋ │ +│ LUTON │ CENTRAL BEDFORDSHIRE │ 196 │ 786051 │ ███████████████▋ │ +│ TONBRIDGE │ MAIDSTONE │ 277 │ 785746 │ ███████████████▋ │ +│ TOWCESTER │ WEST NORTHAMPTONSHIRE │ 186 │ 783532 │ ███████████████▋ │ +│ LONDON │ LAMBETH │ 4832 │ 783422 │ ███████████████▋ │ +│ LUTTERWORTH │ HARBOROUGH │ 515 │ 781775 │ ███████████████▋ │ +│ WOODSTOCK │ WEST OXFORDSHIRE │ 135 │ 777499 │ ███████████████▌ │ +│ ALRESFORD │ WINCHESTER │ 196 │ 775577 │ ███████████████▌ │ +│ LONDON │ NEWHAM │ 2942 │ 768551 │ ███████████████▎ │ +│ ALDERLEY EDGE │ CHESHIRE EAST │ 168 │ 768280 │ ███████████████▎ │ +│ MARLOW │ BUCKINGHAMSHIRE │ 301 │ 762784 │ ███████████████▎ │ +│ BILLINGSHURST │ CHICHESTER │ 134 │ 760920 │ ███████████████▏ │ +│ LONDON │ TOWER HAMLETS │ 4183 │ 759635 │ ███████████████▏ │ +│ MIDHURST │ CHICHESTER │ 245 │ 759101 │ ███████████████▏ │ +│ THAMES DITTON │ ELMBRIDGE │ 227 │ 753347 │ ███████████████ │ +│ POTTERS BAR │ WELWYN HATFIELD │ 163 │ 752926 │ ███████████████ │ +│ REIGATE │ REIGATE AND BANSTEAD │ 555 │ 740961 │ ██████████████▋ │ +│ TADWORTH │ REIGATE AND BANSTEAD │ 477 │ 738997 │ ██████████████▋ │ +│ SEVENOAKS │ SEVENOAKS │ 1074 │ 734658 │ ██████████████▋ │ +│ PETWORTH │ CHICHESTER │ 138 │ 732432 │ ██████████████▋ │ +│ BOURNE END │ BUCKINGHAMSHIRE │ 127 │ 730742 │ ██████████████▌ │ +│ PURLEY │ CROYDON │ 540 │ 727721 │ ██████████████▌ │ +│ OXTED │ TANDRIDGE │ 320 │ 726078 │ ██████████████▌ │ +│ LONDON │ HARINGEY │ 2988 │ 724573 │ ██████████████▍ │ +│ BANSTEAD │ REIGATE AND BANSTEAD │ 373 │ 713834 │ ██████████████▎ │ +│ PINNER │ HARROW │ 480 │ 712166 │ ██████████████▏ │ +│ MALMESBURY │ WILTSHIRE │ 293 │ 707747 │ ██████████████▏ │ +│ RICKMANSWORTH │ THREE RIVERS │ 732 │ 705400 │ ██████████████ │ +│ SLOUGH │ BUCKINGHAMSHIRE │ 359 │ 705002 │ ██████████████ │ +│ GREAT MISSENDEN │ BUCKINGHAMSHIRE │ 214 │ 704904 │ ██████████████ │ +│ READING │ SOUTH OXFORDSHIRE │ 295 │ 701697 │ ██████████████ │ +│ HYTHE │ FOLKESTONE AND HYTHE │ 457 │ 700334 │ ██████████████ │ +│ WELWYN │ WELWYN HATFIELD │ 217 │ 699649 │ █████████████▊ │ +│ CHIGWELL │ EPPING FOREST │ 242 │ 697869 │ █████████████▊ │ +│ BARNET │ BARNET │ 906 │ 695680 │ █████████████▊ │ +│ HASLEMERE │ CHICHESTER │ 120 │ 694028 │ █████████████▊ │ +│ LEATHERHEAD │ MOLE VALLEY │ 748 │ 692026 │ █████████████▋ │ +│ LONDON │ BRENT │ 1945 │ 690799 │ █████████████▋ │ +│ HASLEMERE │ WAVERLEY │ 258 │ 690765 │ █████████████▋ │ +│ NORTHWOOD │ HILLINGDON │ 252 │ 690753 │ █████████████▋ │ +│ WALTON-ON-THAMES │ ELMBRIDGE │ 871 │ 689431 │ █████████████▋ │ +│ INGATESTONE │ BRENTWOOD │ 150 │ 688345 │ █████████████▋ │ +│ OXFORD │ OXFORD │ 1761 │ 686114 │ █████████████▋ │ +│ CHISLEHURST │ BROMLEY │ 410 │ 682892 │ █████████████▋ │ +│ KINGS LANGLEY │ THREE RIVERS │ 109 │ 682320 │ █████████████▋ │ +│ ASHTEAD │ MOLE VALLEY │ 280 │ 680483 │ █████████████▌ │ +│ WOKING │ SURREY HEATH │ 269 │ 679035 │ █████████████▌ │ +│ ASCOT │ BRACKNELL FOREST │ 160 │ 678632 │ █████████████▌ │ +└──────────────────────┴────────────────────────┴──────┴─────────┴────────────────────────────────────────────────────────────────────┘ + +100 rows in set. Elapsed: 0.039 sec. Processed 26.25 million rows, 278.03 MB (674.32 million rows/s., 7.14 GB/s.) +``` + +### Test it in Playground + +The data is uploaded to ClickHouse Playground, [example](https://gh-api.clickhouse.tech/play?user=play#U0VMRUNUIHRvd24sIGRpc3RyaWN0LCBjb3VudCgpIEFTIGMsIHJvdW5kKGF2ZyhwcmljZSkpIEFTIHByaWNlLCBiYXIocHJpY2UsIDAsIDUwMDAwMDAsIDEwMCkgRlJPTSB1a19wcmljZV9wYWlkIFdIRVJFIGRhdGUgPj0gJzIwMjAtMDEtMDEnIEdST1VQIEJZIHRvd24sIGRpc3RyaWN0IEhBVklORyBjID49IDEwMCBPUkRFUiBCWSBwcmljZSBERVNDIExJTUlUIDEwMA==). + +## Let's speed up queries using projections + +[Projections](https://../../sql-reference/statements/alter/projection/) allow to improve queries speed by storing pre-aggregated data. + +### Build a projection + +``` +-- create an aggregate projection by dimensions (toYear(date), district, town) + +ALTER TABLE uk_price_paid + ADD PROJECTION projection_by_year_district_town + ( + SELECT + toYear(date), + district, + town, + avg(price), + sum(price), + count() + GROUP BY + toYear(date), + district, + town + ); + +-- populate the projection for existing data (without it projection will be +-- created for only newly inserted data) + +ALTER TABLE uk_price_paid + MATERIALIZE PROJECTION projection_by_year_district_town +SETTINGS mutations_sync = 1; +``` + +## Test performance + +Let's run the same 3 queries. + +``` +-- enable projections for selects +set allow_experimental_projection_optimization=1; + +-- Q1) Average price per year: + +SELECT + toYear(date) AS year, + round(avg(price)) AS price, + bar(price, 0, 1000000, 80) +FROM uk_price_paid +GROUP BY year +ORDER BY year ASC; + +┌─year─┬──price─┬─bar(round(avg(price)), 0, 1000000, 80)─┐ +│ 1995 │ 67932 │ █████▍ │ +│ 1996 │ 71505 │ █████▋ │ +│ 1997 │ 78532 │ ██████▎ │ +│ 1998 │ 85435 │ ██████▋ │ +│ 1999 │ 96036 │ ███████▋ │ +│ 2000 │ 107478 │ ████████▌ │ +│ 2001 │ 118886 │ █████████▌ │ +│ 2002 │ 137940 │ ███████████ │ +│ 2003 │ 155888 │ ████████████▍ │ +│ 2004 │ 178885 │ ██████████████▎ │ +│ 2005 │ 189350 │ ███████████████▏ │ +│ 2006 │ 203528 │ ████████████████▎ │ +│ 2007 │ 219377 │ █████████████████▌ │ +│ 2008 │ 217056 │ █████████████████▎ │ +│ 2009 │ 213419 │ █████████████████ │ +│ 2010 │ 236110 │ ██████████████████▊ │ +│ 2011 │ 232804 │ ██████████████████▌ │ +│ 2012 │ 238366 │ ███████████████████ │ +│ 2013 │ 256931 │ ████████████████████▌ │ +│ 2014 │ 279917 │ ██████████████████████▍ │ +│ 2015 │ 297264 │ ███████████████████████▋ │ +│ 2016 │ 313197 │ █████████████████████████ │ +│ 2017 │ 346070 │ ███████████████████████████▋ │ +│ 2018 │ 350117 │ ████████████████████████████ │ +│ 2019 │ 351010 │ ████████████████████████████ │ +│ 2020 │ 368974 │ █████████████████████████████▌ │ +│ 2021 │ 384351 │ ██████████████████████████████▋ │ +└──────┴────────┴────────────────────────────────────────┘ + +27 rows in set. Elapsed: 0.003 sec. Processed 106.87 thousand rows, 3.21 MB (31.92 million rows/s., 959.03 MB/s.) + +-- Q2) Average price per year in London: + +SELECT + toYear(date) AS year, + round(avg(price)) AS price, + bar(price, 0, 2000000, 100) +FROM uk_price_paid +WHERE town = 'LONDON' +GROUP BY year +ORDER BY year ASC; + +┌─year─┬───price─┬─bar(round(avg(price)), 0, 2000000, 100)───────────────┐ +│ 1995 │ 109112 │ █████▍ │ +│ 1996 │ 118667 │ █████▊ │ +│ 1997 │ 136518 │ ██████▋ │ +│ 1998 │ 152983 │ ███████▋ │ +│ 1999 │ 180633 │ █████████ │ +│ 2000 │ 215830 │ ██████████▋ │ +│ 2001 │ 232996 │ ███████████▋ │ +│ 2002 │ 263672 │ █████████████▏ │ +│ 2003 │ 278394 │ █████████████▊ │ +│ 2004 │ 304665 │ ███████████████▏ │ +│ 2005 │ 322875 │ ████████████████▏ │ +│ 2006 │ 356192 │ █████████████████▋ │ +│ 2007 │ 404055 │ ████████████████████▏ │ +│ 2008 │ 420741 │ █████████████████████ │ +│ 2009 │ 427754 │ █████████████████████▍ │ +│ 2010 │ 480306 │ ████████████████████████ │ +│ 2011 │ 496274 │ ████████████████████████▋ │ +│ 2012 │ 519441 │ █████████████████████████▊ │ +│ 2013 │ 616209 │ ██████████████████████████████▋ │ +│ 2014 │ 724144 │ ████████████████████████████████████▏ │ +│ 2015 │ 792112 │ ███████████████████████████████████████▌ │ +│ 2016 │ 843568 │ ██████████████████████████████████████████▏ │ +│ 2017 │ 982566 │ █████████████████████████████████████████████████▏ │ +│ 2018 │ 1016845 │ ██████████████████████████████████████████████████▋ │ +│ 2019 │ 1043277 │ ████████████████████████████████████████████████████▏ │ +│ 2020 │ 1003963 │ ██████████████████████████████████████████████████▏ │ +│ 2021 │ 940794 │ ███████████████████████████████████████████████ │ +└──────┴─────────┴───────────────────────────────────────────────────────┘ + +27 rows in set. Elapsed: 0.005 sec. Processed 106.87 thousand rows, 3.53 MB (23.49 million rows/s., 775.95 MB/s.) + +-- Q3) The most expensive neighborhoods: +-- the condition (date >= '2020-01-01') needs to be modified to match projection dimension (toYear(date) >= 2020) + +SELECT + town, + district, + count() AS c, + round(avg(price)) AS price, + bar(price, 0, 5000000, 100) +FROM uk_price_paid +WHERE toYear(date) >= 2020 +GROUP BY + town, + district +HAVING c >= 100 +ORDER BY price DESC +LIMIT 100 + +┌─town─────────────────┬─district───────────────┬────c─┬───price─┬─bar(round(avg(price)), 0, 5000000, 100)────────────────────────────┐ +│ LONDON │ CITY OF WESTMINSTER │ 3372 │ 3305225 │ ██████████████████████████████████████████████████████████████████ │ +│ LONDON │ CITY OF LONDON │ 257 │ 3294478 │ █████████████████████████████████████████████████████████████████▊ │ +│ LONDON │ KENSINGTON AND CHELSEA │ 2367 │ 2342422 │ ██████████████████████████████████████████████▋ │ +│ LEATHERHEAD │ ELMBRIDGE │ 108 │ 1927143 │ ██████████████████████████████████████▌ │ +│ VIRGINIA WATER │ RUNNYMEDE │ 142 │ 1868819 │ █████████████████████████████████████▍ │ +│ LONDON │ CAMDEN │ 2815 │ 1736788 │ ██████████████████████████████████▋ │ +│ THORNTON HEATH │ CROYDON │ 521 │ 1733051 │ ██████████████████████████████████▋ │ +│ WINDLESHAM │ SURREY HEATH │ 103 │ 1717255 │ ██████████████████████████████████▎ │ +│ BARNET │ ENFIELD │ 115 │ 1503458 │ ██████████████████████████████ │ +│ OXFORD │ SOUTH OXFORDSHIRE │ 298 │ 1275200 │ █████████████████████████▌ │ +│ LONDON │ ISLINGTON │ 2458 │ 1274308 │ █████████████████████████▍ │ +│ COBHAM │ ELMBRIDGE │ 364 │ 1260005 │ █████████████████████████▏ │ +│ LONDON │ HOUNSLOW │ 618 │ 1215682 │ ████████████████████████▎ │ +│ ASCOT │ WINDSOR AND MAIDENHEAD │ 379 │ 1215146 │ ████████████████████████▎ │ +│ LONDON │ RICHMOND UPON THAMES │ 654 │ 1207551 │ ████████████████████████▏ │ +│ BEACONSFIELD │ BUCKINGHAMSHIRE │ 307 │ 1186220 │ ███████████████████████▋ │ +│ RICHMOND │ RICHMOND UPON THAMES │ 805 │ 1100420 │ ██████████████████████ │ +│ LONDON │ HAMMERSMITH AND FULHAM │ 2888 │ 1062959 │ █████████████████████▎ │ +│ WEYBRIDGE │ ELMBRIDGE │ 607 │ 1027161 │ ████████████████████▌ │ +│ RADLETT │ HERTSMERE │ 265 │ 1015896 │ ████████████████████▎ │ +│ SALCOMBE │ SOUTH HAMS │ 124 │ 1014393 │ ████████████████████▎ │ +│ BURFORD │ WEST OXFORDSHIRE │ 102 │ 993100 │ ███████████████████▋ │ +│ ESHER │ ELMBRIDGE │ 454 │ 969770 │ ███████████████████▍ │ +│ HINDHEAD │ WAVERLEY │ 128 │ 967786 │ ███████████████████▎ │ +│ BROCKENHURST │ NEW FOREST │ 121 │ 967046 │ ███████████████████▎ │ +│ LEATHERHEAD │ GUILDFORD │ 191 │ 964489 │ ███████████████████▎ │ +│ GERRARDS CROSS │ BUCKINGHAMSHIRE │ 376 │ 958555 │ ███████████████████▏ │ +│ EAST MOLESEY │ ELMBRIDGE │ 181 │ 943457 │ ██████████████████▋ │ +│ OLNEY │ MILTON KEYNES │ 220 │ 942892 │ ██████████████████▋ │ +│ CHALFONT ST GILES │ BUCKINGHAMSHIRE │ 135 │ 926950 │ ██████████████████▌ │ +│ HENLEY-ON-THAMES │ SOUTH OXFORDSHIRE │ 509 │ 905732 │ ██████████████████ │ +│ KINGSTON UPON THAMES │ KINGSTON UPON THAMES │ 889 │ 899689 │ █████████████████▊ │ +│ BELVEDERE │ BEXLEY │ 313 │ 895336 │ █████████████████▊ │ +│ CRANBROOK │ TUNBRIDGE WELLS │ 404 │ 888190 │ █████████████████▋ │ +│ LONDON │ EALING │ 2460 │ 865893 │ █████████████████▎ │ +│ MAIDENHEAD │ BUCKINGHAMSHIRE │ 114 │ 863814 │ █████████████████▎ │ +│ LONDON │ MERTON │ 1958 │ 857192 │ █████████████████▏ │ +│ GUILDFORD │ WAVERLEY │ 131 │ 854447 │ █████████████████ │ +│ LONDON │ HACKNEY │ 3088 │ 846571 │ ████████████████▊ │ +│ LYMM │ WARRINGTON │ 285 │ 839920 │ ████████████████▋ │ +│ HARPENDEN │ ST ALBANS │ 606 │ 836994 │ ████████████████▋ │ +│ LONDON │ WANDSWORTH │ 6113 │ 832292 │ ████████████████▋ │ +│ LONDON │ SOUTHWARK │ 3612 │ 831319 │ ████████████████▋ │ +│ BERKHAMSTED │ DACORUM │ 502 │ 830356 │ ████████████████▌ │ +│ KINGS LANGLEY │ DACORUM │ 137 │ 821358 │ ████████████████▍ │ +│ TONBRIDGE │ TUNBRIDGE WELLS │ 339 │ 806736 │ ████████████████▏ │ +│ EPSOM │ REIGATE AND BANSTEAD │ 157 │ 805903 │ ████████████████ │ +│ WOKING │ GUILDFORD │ 161 │ 803283 │ ████████████████ │ +│ STOCKBRIDGE │ TEST VALLEY │ 168 │ 801973 │ ████████████████ │ +│ TEDDINGTON │ RICHMOND UPON THAMES │ 539 │ 798591 │ ███████████████▊ │ +│ OXFORD │ VALE OF WHITE HORSE │ 329 │ 792907 │ ███████████████▋ │ +│ LONDON │ BARNET │ 3624 │ 789583 │ ███████████████▋ │ +│ TWICKENHAM │ RICHMOND UPON THAMES │ 1090 │ 787760 │ ███████████████▋ │ +│ LUTON │ CENTRAL BEDFORDSHIRE │ 196 │ 786051 │ ███████████████▋ │ +│ TONBRIDGE │ MAIDSTONE │ 277 │ 785746 │ ███████████████▋ │ +│ TOWCESTER │ WEST NORTHAMPTONSHIRE │ 186 │ 783532 │ ███████████████▋ │ +│ LONDON │ LAMBETH │ 4832 │ 783422 │ ███████████████▋ │ +│ LUTTERWORTH │ HARBOROUGH │ 515 │ 781775 │ ███████████████▋ │ +│ WOODSTOCK │ WEST OXFORDSHIRE │ 135 │ 777499 │ ███████████████▌ │ +│ ALRESFORD │ WINCHESTER │ 196 │ 775577 │ ███████████████▌ │ +│ LONDON │ NEWHAM │ 2942 │ 768551 │ ███████████████▎ │ +│ ALDERLEY EDGE │ CHESHIRE EAST │ 168 │ 768280 │ ███████████████▎ │ +│ MARLOW │ BUCKINGHAMSHIRE │ 301 │ 762784 │ ███████████████▎ │ +│ BILLINGSHURST │ CHICHESTER │ 134 │ 760920 │ ███████████████▏ │ +│ LONDON │ TOWER HAMLETS │ 4183 │ 759635 │ ███████████████▏ │ +│ MIDHURST │ CHICHESTER │ 245 │ 759101 │ ███████████████▏ │ +│ THAMES DITTON │ ELMBRIDGE │ 227 │ 753347 │ ███████████████ │ +│ POTTERS BAR │ WELWYN HATFIELD │ 163 │ 752926 │ ███████████████ │ +│ REIGATE │ REIGATE AND BANSTEAD │ 555 │ 740961 │ ██████████████▋ │ +│ TADWORTH │ REIGATE AND BANSTEAD │ 477 │ 738997 │ ██████████████▋ │ +│ SEVENOAKS │ SEVENOAKS │ 1074 │ 734658 │ ██████████████▋ │ +│ PETWORTH │ CHICHESTER │ 138 │ 732432 │ ██████████████▋ │ +│ BOURNE END │ BUCKINGHAMSHIRE │ 127 │ 730742 │ ██████████████▌ │ +│ PURLEY │ CROYDON │ 540 │ 727721 │ ██████████████▌ │ +│ OXTED │ TANDRIDGE │ 320 │ 726078 │ ██████████████▌ │ +│ LONDON │ HARINGEY │ 2988 │ 724573 │ ██████████████▍ │ +│ BANSTEAD │ REIGATE AND BANSTEAD │ 373 │ 713834 │ ██████████████▎ │ +│ PINNER │ HARROW │ 480 │ 712166 │ ██████████████▏ │ +│ MALMESBURY │ WILTSHIRE │ 293 │ 707747 │ ██████████████▏ │ +│ RICKMANSWORTH │ THREE RIVERS │ 732 │ 705400 │ ██████████████ │ +│ SLOUGH │ BUCKINGHAMSHIRE │ 359 │ 705002 │ ██████████████ │ +│ GREAT MISSENDEN │ BUCKINGHAMSHIRE │ 214 │ 704904 │ ██████████████ │ +│ READING │ SOUTH OXFORDSHIRE │ 295 │ 701697 │ ██████████████ │ +│ HYTHE │ FOLKESTONE AND HYTHE │ 457 │ 700334 │ ██████████████ │ +│ WELWYN │ WELWYN HATFIELD │ 217 │ 699649 │ █████████████▊ │ +│ CHIGWELL │ EPPING FOREST │ 242 │ 697869 │ █████████████▊ │ +│ BARNET │ BARNET │ 906 │ 695680 │ █████████████▊ │ +│ HASLEMERE │ CHICHESTER │ 120 │ 694028 │ █████████████▊ │ +│ LEATHERHEAD │ MOLE VALLEY │ 748 │ 692026 │ █████████████▋ │ +│ LONDON │ BRENT │ 1945 │ 690799 │ █████████████▋ │ +│ HASLEMERE │ WAVERLEY │ 258 │ 690765 │ █████████████▋ │ +│ NORTHWOOD │ HILLINGDON │ 252 │ 690753 │ █████████████▋ │ +│ WALTON-ON-THAMES │ ELMBRIDGE │ 871 │ 689431 │ █████████████▋ │ +│ INGATESTONE │ BRENTWOOD │ 150 │ 688345 │ █████████████▋ │ +│ OXFORD │ OXFORD │ 1761 │ 686114 │ █████████████▋ │ +│ CHISLEHURST │ BROMLEY │ 410 │ 682892 │ █████████████▋ │ +│ KINGS LANGLEY │ THREE RIVERS │ 109 │ 682320 │ █████████████▋ │ +│ ASHTEAD │ MOLE VALLEY │ 280 │ 680483 │ █████████████▌ │ +│ WOKING │ SURREY HEATH │ 269 │ 679035 │ █████████████▌ │ +│ ASCOT │ BRACKNELL FOREST │ 160 │ 678632 │ █████████████▌ │ +└──────────────────────┴────────────────────────┴──────┴─────────┴────────────────────────────────────────────────────────────────────┘ + +100 rows in set. Elapsed: 0.005 sec. Processed 12.85 thousand rows, 813.40 KB (2.73 million rows/s., 172.95 MB/s.) +``` + +All 3 queries work much faster and read fewer rows. + +``` +Q1) +no projection: 27 rows in set. Elapsed: 0.027 sec. Processed 26.25 million rows, 157.49 MB (955.96 million rows/s., 5.74 GB/s.) + projection: 27 rows in set. Elapsed: 0.003 sec. Processed 106.87 thousand rows, 3.21 MB (31.92 million rows/s., 959.03 MB/s.) +``` diff --git a/docs/en/images/play.png b/docs/en/images/play.png new file mode 100644 index 00000000000..b75aebe4089 Binary files /dev/null and b/docs/en/images/play.png differ diff --git a/docs/en/interfaces/formats.md b/docs/en/interfaces/formats.md index eb288721231..015afd1cd24 100644 --- a/docs/en/interfaces/formats.md +++ b/docs/en/interfaces/formats.md @@ -1130,17 +1130,18 @@ The table below shows supported data types and how they match ClickHouse [data t | `boolean`, `int`, `long`, `float`, `double` | [Int64](../sql-reference/data-types/int-uint.md), [UInt64](../sql-reference/data-types/int-uint.md) | `long` | | `boolean`, `int`, `long`, `float`, `double` | [Float32](../sql-reference/data-types/float.md) | `float` | | `boolean`, `int`, `long`, `float`, `double` | [Float64](../sql-reference/data-types/float.md) | `double` | -| `bytes`, `string`, `fixed`, `enum` | [String](../sql-reference/data-types/string.md) | `bytes` | +| `bytes`, `string`, `fixed`, `enum` | [String](../sql-reference/data-types/string.md) | `bytes` or `string` \* | | `bytes`, `string`, `fixed` | [FixedString(N)](../sql-reference/data-types/fixedstring.md) | `fixed(N)` | | `enum` | [Enum(8\|16)](../sql-reference/data-types/enum.md) | `enum` | | `array(T)` | [Array(T)](../sql-reference/data-types/array.md) | `array(T)` | | `union(null, T)`, `union(T, null)` | [Nullable(T)](../sql-reference/data-types/date.md) | `union(null, T)` | | `null` | [Nullable(Nothing)](../sql-reference/data-types/special-data-types/nothing.md) | `null` | -| `int (date)` \* | [Date](../sql-reference/data-types/date.md) | `int (date)` \* | -| `long (timestamp-millis)` \* | [DateTime64(3)](../sql-reference/data-types/datetime.md) | `long (timestamp-millis)` \* | -| `long (timestamp-micros)` \* | [DateTime64(6)](../sql-reference/data-types/datetime.md) | `long (timestamp-micros)` \* | +| `int (date)` \** | [Date](../sql-reference/data-types/date.md) | `int (date)` \** | +| `long (timestamp-millis)` \** | [DateTime64(3)](../sql-reference/data-types/datetime.md) | `long (timestamp-millis)` \* | +| `long (timestamp-micros)` \** | [DateTime64(6)](../sql-reference/data-types/datetime.md) | `long (timestamp-micros)` \* | -\* [Avro logical types](https://avro.apache.org/docs/current/spec.html#Logical+Types) +\* `bytes` is default, controlled by [output_format_avro_string_column_pattern](../operations/settings/settings.md#settings-output_format_avro_string_column_pattern) +\** [Avro logical types](https://avro.apache.org/docs/current/spec.html#Logical+Types) Unsupported Avro data types: `record` (non-root), `map` @@ -1246,12 +1247,14 @@ The table below shows supported data types and how they match ClickHouse [data t | `DOUBLE` | [Float64](../sql-reference/data-types/float.md) | `DOUBLE` | | `DATE32` | [Date](../sql-reference/data-types/date.md) | `UINT16` | | `DATE64`, `TIMESTAMP` | [DateTime](../sql-reference/data-types/datetime.md) | `UINT32` | -| `STRING`, `BINARY` | [String](../sql-reference/data-types/string.md) | `STRING` | -| — | [FixedString](../sql-reference/data-types/fixedstring.md) | `STRING` | +| `STRING`, `BINARY` | [String](../sql-reference/data-types/string.md) | `BINARY` | +| — | [FixedString](../sql-reference/data-types/fixedstring.md) | `BINARY` | | `DECIMAL` | [Decimal](../sql-reference/data-types/decimal.md) | `DECIMAL` | | `LIST` | [Array](../sql-reference/data-types/array.md) | `LIST` | +| `STRUCT` | [Tuple](../sql-reference/data-types/tuple.md) | `STRUCT` | +| `MAP` | [Map](../sql-reference/data-types/map.md) | `MAP` | -Arrays can be nested and can have a value of the `Nullable` type as an argument. +Arrays can be nested and can have a value of the `Nullable` type as an argument. `Tuple` and `Map` types also can be nested. ClickHouse supports configurable precision of `Decimal` type. The `INSERT` query treats the Parquet `DECIMAL` type as the ClickHouse `Decimal128` type. @@ -1299,13 +1302,17 @@ The table below shows supported data types and how they match ClickHouse [data t | `DOUBLE` | [Float64](../sql-reference/data-types/float.md) | `FLOAT64` | | `DATE32` | [Date](../sql-reference/data-types/date.md) | `UINT16` | | `DATE64`, `TIMESTAMP` | [DateTime](../sql-reference/data-types/datetime.md) | `UINT32` | -| `STRING`, `BINARY` | [String](../sql-reference/data-types/string.md) | `UTF8` | -| `STRING`, `BINARY` | [FixedString](../sql-reference/data-types/fixedstring.md) | `UTF8` | +| `STRING`, `BINARY` | [String](../sql-reference/data-types/string.md) | `BINARY` | +| `STRING`, `BINARY` | [FixedString](../sql-reference/data-types/fixedstring.md) | `BINARY` | | `DECIMAL` | [Decimal](../sql-reference/data-types/decimal.md) | `DECIMAL` | | `DECIMAL256` | [Decimal256](../sql-reference/data-types/decimal.md)| `DECIMAL256` | | `LIST` | [Array](../sql-reference/data-types/array.md) | `LIST` | +| `STRUCT` | [Tuple](../sql-reference/data-types/tuple.md) | `STRUCT` | +| `MAP` | [Map](../sql-reference/data-types/map.md) | `MAP` | -Arrays can be nested and can have a value of the `Nullable` type as an argument. +Arrays can be nested and can have a value of the `Nullable` type as an argument. `Tuple` and `Map` types also can be nested. + +The `DICTIONARY` type is supported for `INSERT` queries, and for `SELECT` queries there is an [output_format_arrow_low_cardinality_as_dictionary](../operations/settings/settings.md#output-format-arrow-low-cardinality-as-dictionary) setting that allows to output [LowCardinality](../sql-reference/data-types/lowcardinality.md) type as a `DICTIONARY` type. ClickHouse supports configurable precision of the `Decimal` type. The `INSERT` query treats the Arrow `DECIMAL` type as the ClickHouse `Decimal128` type. @@ -1358,8 +1365,10 @@ The table below shows supported data types and how they match ClickHouse [data t | `STRING`, `BINARY` | [String](../sql-reference/data-types/string.md) | `BINARY` | | `DECIMAL` | [Decimal](../sql-reference/data-types/decimal.md) | `DECIMAL` | | `LIST` | [Array](../sql-reference/data-types/array.md) | `LIST` | +| `STRUCT` | [Tuple](../sql-reference/data-types/tuple.md) | `STRUCT` | +| `MAP` | [Map](../sql-reference/data-types/map.md) | `MAP` | -Arrays can be nested and can have a value of the `Nullable` type as an argument. +Arrays can be nested and can have a value of the `Nullable` type as an argument. `Tuple` and `Map` types also can be nested. ClickHouse supports configurable precision of the `Decimal` type. The `INSERT` query treats the ORC `DECIMAL` type as the ClickHouse `Decimal128` type. diff --git a/docs/en/interfaces/http.md b/docs/en/interfaces/http.md index f1ed69304a6..6454262122f 100644 --- a/docs/en/interfaces/http.md +++ b/docs/en/interfaces/http.md @@ -7,16 +7,21 @@ toc_title: HTTP Interface The HTTP interface lets you use ClickHouse on any platform from any programming language. We use it for working from Java and Perl, as well as shell scripts. In other departments, the HTTP interface is used from Perl, Python, and Go. The HTTP interface is more limited than the native interface, but it has better compatibility. -By default, clickhouse-server listens for HTTP on port 8123 (this can be changed in the config). +By default, `clickhouse-server` listens for HTTP on port 8123 (this can be changed in the config). -If you make a GET / request without parameters, it returns 200 response code and the string which defined in [http_server_default_response](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-http_server_default_response) default value “Ok.” (with a line feed at the end) +If you make a `GET /` request without parameters, it returns 200 response code and the string which defined in [http_server_default_response](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-http_server_default_response) default value “Ok.” (with a line feed at the end) ``` bash $ curl 'http://localhost:8123/' Ok. ``` -Use GET /ping request in health-check scripts. This handler always returns “Ok.” (with a line feed at the end). Available from version 18.12.13. +Web UI can be accessed here: `http://localhost:8123/play`. + +![Web UI](../images/play.png) + + +In health-check scripts use `GET /ping` request. This handler always returns “Ok.” (with a line feed at the end). Available from version 18.12.13. ``` bash $ curl 'http://localhost:8123/ping' @@ -51,8 +56,8 @@ X-ClickHouse-Summary: {"read_rows":"0","read_bytes":"0","written_rows":"0","writ 1 ``` -As you can see, curl is somewhat inconvenient in that spaces must be URL escaped. -Although wget escapes everything itself, we do not recommend using it because it does not work well over HTTP 1.1 when using keep-alive and Transfer-Encoding: chunked. +As you can see, `curl` is somewhat inconvenient in that spaces must be URL escaped. +Although `wget` escapes everything itself, we do not recommend using it because it does not work well over HTTP 1.1 when using keep-alive and Transfer-Encoding: chunked. ``` bash $ echo 'SELECT 1' | curl 'http://localhost:8123/' --data-binary @- @@ -75,7 +80,7 @@ ECT 1 , expected One of: SHOW TABLES, SHOW DATABASES, SELECT, INSERT, CREATE, ATTACH, RENAME, DROP, DETACH, USE, SET, OPTIMIZE., e.what() = DB::Exception ``` -By default, data is returned in TabSeparated format (for more information, see the “Formats” section). +By default, data is returned in [TabSeparated](formats.md#tabseparated) format. You use the FORMAT clause of the query to request any other format. @@ -90,9 +95,11 @@ $ echo 'SELECT 1 FORMAT Pretty' | curl 'http://localhost:8123/?' --data-binary @ └───┘ ``` -The POST method of transmitting data is necessary for INSERT queries. In this case, you can write the beginning of the query in the URL parameter, and use POST to pass the data to insert. The data to insert could be, for example, a tab-separated dump from MySQL. In this way, the INSERT query replaces LOAD DATA LOCAL INFILE from MySQL. +The POST method of transmitting data is necessary for `INSERT` queries. In this case, you can write the beginning of the query in the URL parameter, and use POST to pass the data to insert. The data to insert could be, for example, a tab-separated dump from MySQL. In this way, the `INSERT` query replaces `LOAD DATA LOCAL INFILE` from MySQL. -Examples: Creating a table: +**Examples** + +Creating a table: ``` bash $ echo 'CREATE TABLE t (a UInt8) ENGINE = Memory' | curl 'http://localhost:8123/' --data-binary @- @@ -632,6 +639,4 @@ $ curl -vv -H 'XXX:xxx' 'http://localhost:8123/get_relative_path_static_handler' < Relative Path File * Connection #0 to host localhost left intact -``` - -[Original article](https://clickhouse.tech/docs/en/interfaces/http_interface/) +``` \ No newline at end of file diff --git a/docs/en/interfaces/third-party/gui.md b/docs/en/interfaces/third-party/gui.md index fffe0c87a53..2d7f3a24011 100644 --- a/docs/en/interfaces/third-party/gui.md +++ b/docs/en/interfaces/third-party/gui.md @@ -84,6 +84,8 @@ Features: - Table data preview. - Full-text search. +By default, DBeaver does not connect using a session (the CLI for example does). If you require session support (for example to set settings for your session), edit the driver connection properties and set session_id to a random string (it uses the http connection under the hood). Then you can use any setting from the query window + ### clickhouse-cli {#clickhouse-cli} [clickhouse-cli](https://github.com/hatarist/clickhouse-cli) is an alternative command-line client for ClickHouse, written in Python 3. diff --git a/docs/en/interfaces/third-party/integrations.md b/docs/en/interfaces/third-party/integrations.md index f28a870e206..48782268940 100644 --- a/docs/en/interfaces/third-party/integrations.md +++ b/docs/en/interfaces/third-party/integrations.md @@ -43,7 +43,7 @@ toc_title: Integrations - Monitoring - [Graphite](https://graphiteapp.org) - [graphouse](https://github.com/yandex/graphouse) - - [carbon-clickhouse](https://github.com/lomik/carbon-clickhouse) + + - [carbon-clickhouse](https://github.com/lomik/carbon-clickhouse) - [graphite-clickhouse](https://github.com/lomik/graphite-clickhouse) - [graphite-ch-optimizer](https://github.com/innogames/graphite-ch-optimizer) - optimizes staled partitions in [\*GraphiteMergeTree](../../engines/table-engines/mergetree-family/graphitemergetree.md#graphitemergetree) if rules from [rollup configuration](../../engines/table-engines/mergetree-family/graphitemergetree.md#rollup-configuration) could be applied - [Grafana](https://grafana.com/) diff --git a/docs/en/introduction/adopters.md b/docs/en/introduction/adopters.md index 47927cd306a..d408a3d6849 100644 --- a/docs/en/introduction/adopters.md +++ b/docs/en/introduction/adopters.md @@ -59,6 +59,7 @@ toc_title: Adopters | HUYA | Video Streaming | Analytics | — | — | [Slides in Chinese, October 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/7.%20ClickHouse万亿数据分析实践%20李本旺(sundy-li)%20虎牙.pdf) | | ICA | FinTech | Risk Management | — | — | [Blog Post in English, Sep 2020](https://altinity.com/blog/clickhouse-vs-redshift-performance-for-fintech-risk-management?utm_campaign=ClickHouse%20vs%20RedShift&utm_content=143520807&utm_medium=social&utm_source=twitter&hss_channel=tw-3894792263) | | Idealista | Real Estate | Analytics | — | — | [Blog Post in English, April 2019](https://clickhouse.tech/blog/en/clickhouse-meetup-in-madrid-on-april-2-2019) | +| Infobaleen | AI markting tool | Analytics | — | — | [Official site](https://infobaleen.com) | | Infovista | Networks | Analytics | — | — | [Slides in English, October 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup30/infovista.pdf) | | InnoGames | Games | Metrics, Logging | — | — | [Slides in Russian, September 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup28/graphite_and_clickHouse.pdf) | | Instabug | APM Platform | Main product | — | — | [A quote from Co-Founder](https://altinity.com/) | @@ -114,6 +115,7 @@ toc_title: Adopters | Sina | News | — | — | — | [Slides in Chinese, October 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/6.%20ClickHouse最佳实践%20高鹏_新浪.pdf) | | SMI2 | News | Analytics | — | — | [Blog Post in Russian, November 2017](https://habr.com/ru/company/smi2/blog/314558/) | | Spark New Zealand | Telecommunications | Security Operations | — | — | [Blog Post, Feb 2020](https://blog.n0p.me/2020/02/2020-02-05-dnsmonster/) | +| Splitbee | Analytics | Main Product | — | — | [Blog Post, Mai 2021](https://splitbee.io/blog/new-pricing) | | Splunk | Business Analytics | Main product | — | — | [Slides in English, January 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup12/splunk.pdf) | | Spotify | Music | Experimentation | — | — | [Slides, July 2018](https://www.slideshare.net/glebus/using-clickhouse-for-experimentation-104247173) | | Staffcop | Information Security | Main Product | — | — | [Official website, Documentation](https://www.staffcop.ru/sce43) | @@ -156,5 +158,6 @@ toc_title: Adopters | SigNoz | Observability Platform | Main Product | — | — | [Source code](https://github.com/SigNoz/signoz) | | ChelPipe Group | Analytics | — | — | — | [Blog post, June 2021](https://vc.ru/trade/253172-tyazhelomu-proizvodstvu-user-friendly-sayt-internet-magazin-trub-dlya-chtpz) | | Zagrava Trading | — | — | — | — | [Job offer, May 2021](https://twitter.com/datastackjobs/status/1394707267082063874) | +| Beeline | Telecom | Data Platform | — | — | [Blog post, July 2021](https://habr.com/en/company/beeline/blog/567508/) | [Original article](https://clickhouse.tech/docs/en/introduction/adopters/) diff --git a/docs/en/operations/clickhouse-keeper.md b/docs/en/operations/clickhouse-keeper.md new file mode 100644 index 00000000000..5fc1baa003c --- /dev/null +++ b/docs/en/operations/clickhouse-keeper.md @@ -0,0 +1,118 @@ +--- +toc_priority: 66 +toc_title: ClickHouse Keeper +--- + +# [pre-production] clickhouse-keeper + +ClickHouse server use [ZooKeeper](https://zookeeper.apache.org/) coordination system for data [replication](../engines/table-engines/mergetree-family/replication.md) and [distributed DDL](../sql-reference/distributed-ddl.md) queries execution. ClickHouse Keeper is an alternative coordination system compatible with ZooKeeper. + +!!! warning "Warning" + This feature currently in pre-production stage. We test it in our CI and on small internal installations. + +## Implementation details + +ZooKeeper is one of the first well-known open-source coordination systems. It's implemented in Java, has quite a simple and powerful data model. ZooKeeper's coordination algorithm called ZAB (ZooKeeper Atomic Broadcast) doesn't provide linearizability guarantees for reads, because each ZooKeeper node serves reads locally. Unlike ZooKeeper `clickhouse-keeper` written in C++ and use [RAFT algorithm](https://raft.github.io/) [implementation](https://github.com/eBay/NuRaft). This algorithm allows to have linearizability for reads and writes, has several open-source implementations in different languages. + +By default, `clickhouse-keeper` provides the same guarantees as ZooKeeper (linearizable writes, non-linearizable reads). It has a compatible client-server protocol, so any standard ZooKeeper client can be used to interact with `clickhouse-keeper`. Snapshots and logs have an incompatible format with ZooKeeper, but `clickhouse-keeper-converter` tool allows to convert ZooKeeper data to `clickhouse-keeper` snapshot. Interserver protocol in `clickhouse-keeper` also incompatible with ZooKeeper so mixed ZooKeeper/clickhouse-keeper cluster is impossible. + +## Configuration + +`clickhouse-keeper` can be used as a standalone replacement for ZooKeeper or as an internal part of the `clickhouse-server`, but in both cases configuration is almost the same `.xml` file. The main `clickhouse-keeper` configuration tag is ``. Keeper configuration has the following parameters: + +- `tcp_port` — the port for a client to connect (default for ZooKeeper is `2181`) +- `tcp_port_secure` — the secure port for a client to connect +- `server_id` — unique server id, each participant of the clickhouse-keeper cluster must have a unique number (1, 2, 3, and so on) +- `log_storage_path` — path to coordination logs, better to store logs on the non-busy device (same for ZooKeeper) +- `snapshot_storage_path` — path to coordination snapshots + +Other common parameters are inherited from clickhouse-server config (`listen_host`, `logger` and so on). + +Internal coordination settings are located in `.` section: + +- `operation_timeout_ms` — timeout for a single client operation (default: 10000) +- `session_timeout_ms` — timeout for client session (default: 30000) +- `dead_session_check_period_ms` — how often clickhouse-keeper check dead sessions and remove them (default: 500) +- `heart_beat_interval_ms` — how often a clickhouse-keeper leader will send heartbeats to followers (default: 500) +- `election_timeout_lower_bound_ms` — if follower didn't receive heartbeats from the leader in this interval, then it can initiate leader election (default: 1000) +- `election_timeout_upper_bound_ms` — if follower didn't receive heartbeats from the leader in this interval, then it must initiate leader election (default: 2000) +- `rotate_log_storage_interval` — how many log records to store in a single file (default: 100000) +- `reserved_log_items` — how many coordination log records to store before compaction (default: 100000) +- `snapshot_distance` — how often clickhouse-keeper will create new snapshots (in the number of records in logs) (default: 100000) +- `snapshots_to_keep` — how many snapshots to keep (default: 3) +- `stale_log_gap` — the threshold when leader consider follower as stale and send snapshot to it instead of logs (default: 10000) +- `fresh_log_gap` - when node became fresh (default: 200) +- `max_requests_batch_size` - max size of batch in requests count before it will be sent to RAFT (default: 100) +- `force_sync` — call `fsync` on each write to coordination log (default: true) +- `quorum_reads` - execute read requests as writes through whole RAFT consesus with similar speed (default: false) +- `raft_logs_level` — text logging level about coordination (trace, debug, and so on) (default: system default) +- `auto_forwarding` - allow to forward write requests from followers to leader (default: true) +- `shutdown_timeout` — wait to finish internal connections and shutdown (ms) (default: 5000) +- `startup_timeout` — if the server doesn't connect to other quorum participants in the specified timeout it will terminate (ms) (default: 30000) + +Quorum configuration is located in `.` section and contain servers description. The only parameter for the whole quorum is `secure`, which enables encrypted connection for communication between quorum participants. The main parameters for each `` are: + +- `id` — server_id in quorum +- `hostname` — hostname where this server placed +- `port` — port where this server listen for connections + + +Examples of configuration for quorum with three nodes can be found in [integration tests](https://github.com/ClickHouse/ClickHouse/tree/master/tests/integration) with `test_keeper_` prefix. Example configuration for server #1: + +```xml + + 2181 + 1 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + + 10000 + 30000 + trace + + + + + 1 + zoo1 + 9444 + + + 2 + zoo2 + 9444 + + + 3 + zoo3 + 9444 + + + +``` + +## How to run + +`clickhouse-keeper` is bundled into `clickhouse-server` package, just add configuration of `` and start clickhouse-server as always. If you want to run standalone `clickhouse-keeper` you can start it in a similar way with: + +```bash +clickhouse-keeper --config /etc/your_path_to_config/config.xml --daemon +``` + +## [experimental] Migration from ZooKeeper + +Seamlessly migration from ZooKeeper to `clickhouse-keeper` is impossible you have to stop your ZooKeeper cluster, convert data and start `clickhouse-keeper`. `clickhouse-keeper-converter` tool allows to convert ZooKeeper logs and snapshots to `clickhouse-keeper` snapshot. It works only with ZooKeeper > 3.4. Steps for migration: + +1. Stop all ZooKeeper nodes. + +2. [optional, but recommended] Found ZooKeeper leader node, start and stop it again. It will force ZooKeeper to create consistent snapshot. + +3. Run `clickhouse-keeper-converter` on leader, example + +```bash +clickhouse-keeper-converter --zookeeper-logs-dir /var/lib/zookeeper/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/version-2 --output-dir /path/to/clickhouse/keeper/snapshots +``` + +4. Copy snapshot to `clickhouse-server` nodes with configured `keeper` or start `clickhouse-keeper` instead of ZooKeeper. Snapshot must persist only on leader node, leader will sync it automatically to other nodes. + diff --git a/docs/en/operations/configuration-files.md b/docs/en/operations/configuration-files.md index 96009c75af1..5c942efc77f 100644 --- a/docs/en/operations/configuration-files.md +++ b/docs/en/operations/configuration-files.md @@ -22,6 +22,23 @@ Some settings specified in the main configuration file can be overridden in othe The config can also define “substitutions”. If an element has the `incl` attribute, the corresponding substitution from the file will be used as the value. By default, the path to the file with substitutions is `/etc/metrika.xml`. This can be changed in the [include_from](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-include_from) element in the server config. The substitution values are specified in `/yandex/substitution_name` elements in this file. If a substitution specified in `incl` does not exist, it is recorded in the log. To prevent ClickHouse from logging missing substitutions, specify the `optional="true"` attribute (for example, settings for [macros](../operations/server-configuration-parameters/settings.md)). +If you want to replace an entire element with a substitution use `include` as element name. + +XML substitution example: + +```xml + + + + + + + + + + +``` + Substitutions can also be performed from ZooKeeper. To do this, specify the attribute `from_zk = "/path/to/node"`. The element value is replaced with the contents of the node at `/path/to/node` in ZooKeeper. You can also put an entire XML subtree on the ZooKeeper node and it will be fully inserted into the source element. ## User Settings {#user-settings} @@ -32,6 +49,8 @@ Users configuration can be splitted into separate files similar to `config.xml` Directory name is defined as `users_config` setting without `.xml` postfix concatenated with `.d`. Directory `users.d` is used by default, as `users_config` defaults to `users.xml`. +Note that configuration files are first merged taking into account [Override](#override) settings and includes are processed after that. + ## XML example {#example} For example, you can have separate config file for each user like this: diff --git a/docs/en/operations/performance-test.md b/docs/en/operations/performance-test.md index a808ffd0a85..d6d9cdb55cc 100644 --- a/docs/en/operations/performance-test.md +++ b/docs/en/operations/performance-test.md @@ -5,50 +5,67 @@ toc_title: Testing Hardware # How to Test Your Hardware with ClickHouse {#how-to-test-your-hardware-with-clickhouse} -With this instruction you can run basic ClickHouse performance test on any server without installation of ClickHouse packages. +You can run basic ClickHouse performance test on any server without installation of ClickHouse packages. -1. Go to “commits” page: https://github.com/ClickHouse/ClickHouse/commits/master -2. Click on the first green check mark or red cross with green “ClickHouse Build Check” and click on the “Details” link near “ClickHouse Build Check”. There is no such link in some commits, for example commits with documentation. In this case, choose the nearest commit having this link. -3. Copy the link to `clickhouse` binary for amd64 or aarch64. -4. ssh to the server and download it with wget: + +## Automated Run + +You can run benchmark with a single script. + +1. Download the script. +``` +wget https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/benchmark/hardware.sh +``` + +2. Run the script. +``` +chmod a+x ./hardware.sh +./hardware.sh +``` + +3. Copy the output and send it to clickhouse-feedback@yandex-team.com + +All the results are published here: https://clickhouse.tech/benchmark/hardware/ + + +## Manual Run + +Alternatively you can perform benchmark in the following steps. + +1. ssh to the server and download the binary with wget: ```bash -# These links are outdated, please obtain the fresh link from the "commits" page. # For amd64: -wget https://clickhouse-builds.s3.yandex.net/0/e29c4c3cc47ab2a6c4516486c1b77d57e7d42643/clickhouse_build_check/gcc-10_relwithdebuginfo_none_bundled_unsplitted_disable_False_binary/clickhouse +wget https://builds.clickhouse.tech/master/amd64/clickhouse # For aarch64: -wget https://clickhouse-builds.s3.yandex.net/0/e29c4c3cc47ab2a6c4516486c1b77d57e7d42643/clickhouse_special_build_check/clang-10-aarch64_relwithdebuginfo_none_bundled_unsplitted_disable_False_binary/clickhouse +wget https://builds.clickhouse.tech/master/aarch64/clickhouse # Then do: chmod a+x clickhouse ``` -5. Download benchmark files: +2. Download benchmark files: ```bash wget https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/benchmark/clickhouse/benchmark-new.sh chmod a+x benchmark-new.sh wget https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/benchmark/clickhouse/queries.sql ``` -6. Download test data according to the [Yandex.Metrica dataset](../getting-started/example-datasets/metrica.md) instruction (“hits” table containing 100 million rows). +3. Download test data according to the [Yandex.Metrica dataset](../getting-started/example-datasets/metrica.md) instruction (“hits” table containing 100 million rows). ```bash wget https://datasets.clickhouse.tech/hits/partitions/hits_100m_obfuscated_v1.tar.xz tar xvf hits_100m_obfuscated_v1.tar.xz -C . mv hits_100m_obfuscated_v1/* . ``` -7. Run the server: +4. Run the server: ```bash ./clickhouse server ``` -8. Check the data: ssh to the server in another terminal +5. Check the data: ssh to the server in another terminal ```bash ./clickhouse client --query "SELECT count() FROM hits_100m_obfuscated" 100000000 ``` -9. Edit the benchmark-new.sh, change `clickhouse-client` to `./clickhouse client` and add `--max_memory_usage 100000000000` parameter. -```bash -mcedit benchmark-new.sh -``` -10. Run the benchmark: +6. Run the benchmark: ```bash ./benchmark-new.sh hits_100m_obfuscated ``` -11. Send the numbers and the info about your hardware configuration to clickhouse-feedback@yandex-team.com +7. Send the numbers and the info about your hardware configuration to clickhouse-feedback@yandex-team.com All the results are published here: https://clickhouse.tech/benchmark/hardware/ diff --git a/docs/en/operations/server-configuration-parameters/settings.md b/docs/en/operations/server-configuration-parameters/settings.md index 801a1d27add..a620565b71a 100644 --- a/docs/en/operations/server-configuration-parameters/settings.md +++ b/docs/en/operations/server-configuration-parameters/settings.md @@ -34,6 +34,7 @@ Configuration template: ... ... ... + ... ... @@ -43,7 +44,8 @@ Configuration template: - `min_part_size` – The minimum size of a data part. - `min_part_size_ratio` – The ratio of the data part size to the table size. -- `method` – Compression method. Acceptable values: `lz4` or `zstd`. +- `method` – Compression method. Acceptable values: `lz4`, `lz4hc`, `zstd`. +- `level` – Compression level. See [Codecs](../../sql-reference/statements/create/table/#create-query-general-purpose-codecs). You can configure multiple `` sections. @@ -62,10 +64,34 @@ If no conditions met for a data part, ClickHouse uses the `lz4` compression. 10000000000 0.01 zstd + 1 ``` + ## custom_settings_prefixes {#custom_settings_prefixes} List of prefixes for [custom settings](../../operations/settings/index.md#custom_settings). The prefixes must be separated with commas. @@ -98,7 +124,7 @@ Default value: `1073741824` (1 GB). ```xml 1073741824 - + ``` ## database_atomic_delay_before_drop_table_sec {#database_atomic_delay_before_drop_table_sec} @@ -439,8 +465,8 @@ The server will need access to the public Internet via IPv4 (at the time of writ Keys: -- `enabled` – Boolean flag to enable the feature, `false` by default. Set to `true` to allow sending crash reports. -- `endpoint` – You can override the Sentry endpoint URL for sending crash reports. It can be either a separate Sentry account or your self-hosted Sentry instance. Use the [Sentry DSN](https://docs.sentry.io/error-reporting/quickstart/?platform=native#configure-the-sdk) syntax. +- `enabled` – Boolean flag to enable the feature, `false` by default. Set to `true` to allow sending crash reports. +- `endpoint` – You can override the Sentry endpoint URL for sending crash reports. It can be either a separate Sentry account or your self-hosted Sentry instance. Use the [Sentry DSN](https://docs.sentry.io/error-reporting/quickstart/?platform=native#configure-the-sdk) syntax. - `anonymize` - Avoid attaching the server hostname to the crash report. - `http_proxy` - Configure HTTP proxy for sending crash reports. - `debug` - Sets the Sentry client into debug mode. @@ -502,7 +528,7 @@ The default `max_server_memory_usage` value is calculated as `memory_amount * ma ## max_server_memory_usage_to_ram_ratio {#max_server_memory_usage_to_ram_ratio} -Defines the fraction of total physical RAM amount, available to the ClickHouse server. If the server tries to utilize more, the memory is cut down to the appropriate amount. +Defines the fraction of total physical RAM amount, available to the ClickHouse server. If the server tries to utilize more, the memory is cut down to the appropriate amount. Possible values: @@ -713,7 +739,7 @@ Keys for server/client settings: - extendedVerification – Automatically extended verification of certificates after the session ends. Acceptable values: `true`, `false`. - requireTLSv1 – Require a TLSv1 connection. Acceptable values: `true`, `false`. - requireTLSv1_1 – Require a TLSv1.1 connection. Acceptable values: `true`, `false`. -- requireTLSv1 – Require a TLSv1.2 connection. Acceptable values: `true`, `false`. +- requireTLSv1_2 – Require a TLSv1.2 connection. Acceptable values: `true`, `false`. - fips – Activates OpenSSL FIPS mode. Supported if the library’s OpenSSL version supports FIPS. - privateKeyPassphraseHandler – Class (PrivateKeyPassphraseHandler subclass) that requests the passphrase for accessing the private key. For example: ``, `KeyFileHandler`, `test`, ``. - invalidCertificateHandler – Class (a subclass of CertificateHandler) for verifying invalid certificates. For example: ` ConsoleCertificateHandler ` . @@ -866,6 +892,33 @@ If the table does not exist, ClickHouse will create it. If the structure of the ``` +## query_views_log {#server_configuration_parameters-query_views_log} + +Setting for logging views dependant of queries received with the [log_query_views=1](../../operations/settings/settings.md#settings-log-query-views) setting. + +Queries are logged in the [system.query_views_log](../../operations/system-tables/query_thread_log.md#system_tables-query_views_log) table, not in a separate file. You can change the name of the table in the `table` parameter (see below). + +Use the following parameters to configure logging: + +- `database` – Name of the database. +- `table` – Name of the system table the queries will be logged in. +- `partition_by` — [Custom partitioning key](../../engines/table-engines/mergetree-family/custom-partitioning-key.md) for a system table. Can't be used if `engine` defined. +- `engine` - [MergeTree Engine Definition](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table) for a system table. Can't be used if `partition_by` defined. +- `flush_interval_milliseconds` – Interval for flushing data from the buffer in memory to the table. + +If the table does not exist, ClickHouse will create it. If the structure of the query views log changed when the ClickHouse server was updated, the table with the old structure is renamed, and a new table is created automatically. + +**Example** + +``` xml + + system + query_views_log
+ toYYYYMM(event_date) + 7500 +
+``` + ## text_log {#server_configuration_parameters-text_log} Settings for the [text_log](../../operations/system-tables/text_log.md#system_tables-text_log) system table for logging text messages. @@ -880,7 +933,7 @@ Parameters: - `flush_interval_milliseconds` — Interval for flushing data from the buffer in memory to the table. **Example** -```xml +```xml notice diff --git a/docs/en/operations/settings/index.md b/docs/en/operations/settings/index.md index d38c98f51cb..b5dcef932e8 100644 --- a/docs/en/operations/settings/index.md +++ b/docs/en/operations/settings/index.md @@ -31,7 +31,7 @@ Settings that can only be made in the server config file are not covered in this ## Custom Settings {#custom_settings} -In addition to the common [settings](../../operations/settings/settings.md), users can define custom settings. +In addition to the common [settings](../../operations/settings/settings.md), users can define custom settings. A custom setting name must begin with one of predefined prefixes. The list of these prefixes must be declared in the [custom_settings_prefixes](../../operations/server-configuration-parameters/settings.md#custom_settings_prefixes) parameter in the server configuration file. @@ -48,7 +48,7 @@ SET custom_a = 123; To get the current value of a custom setting use `getSetting()` function: ```sql -SELECT getSetting('custom_a'); +SELECT getSetting('custom_a'); ``` **See Also** diff --git a/docs/en/operations/settings/merge-tree-settings.md b/docs/en/operations/settings/merge-tree-settings.md index 791ac344bcf..65d63438aea 100644 --- a/docs/en/operations/settings/merge-tree-settings.md +++ b/docs/en/operations/settings/merge-tree-settings.md @@ -278,4 +278,15 @@ Possible values: Default value: `0`. -[Original article](https://clickhouse.tech/docs/en/operations/settings/merge_tree_settings/) +## check_sample_column_is_correct {#check_sample_column_is_correct} + +Enables the check at table creation, that the data type of a column for sampling or sampling expression is correct. The data type must be one of unsigned [integer types](../../sql-reference/data-types/int-uint.md): `UInt8`, `UInt16`, `UInt32`, `UInt64`. + +Possible values: + +- true — The check is enabled. +- false — The check is disabled at table creation. + +Default value: `true`. + +By default, the ClickHouse server checks at table creation the data type of a column for sampling or sampling expression. If you already have tables with incorrect sampling expression and do not want the server to raise an exception during startup, set `check_sample_column_is_correct` to `false`. diff --git a/docs/en/operations/settings/query-complexity.md b/docs/en/operations/settings/query-complexity.md index d60aa170907..236359bfe55 100644 --- a/docs/en/operations/settings/query-complexity.md +++ b/docs/en/operations/settings/query-complexity.md @@ -65,20 +65,20 @@ What to do when the volume of data read exceeds one of the limits: ‘throw’ o The following restrictions can be checked on each block (instead of on each row). That is, the restrictions can be broken a little. A maximum number of rows that can be read from a local table on a leaf node when running a distributed query. While -distributed queries can issue a multiple sub-queries to each shard (leaf) - this limit will be checked only on the read -stage on the leaf nodes and ignored on results merging stage on the root node. For example, cluster consists of 2 shards -and each shard contains a table with 100 rows. Then distributed query which suppose to read all the data from both -tables with setting `max_rows_to_read=150` will fail as in total it will be 200 rows. While query +distributed queries can issue a multiple sub-queries to each shard (leaf) - this limit will be checked only on the read +stage on the leaf nodes and ignored on results merging stage on the root node. For example, cluster consists of 2 shards +and each shard contains a table with 100 rows. Then distributed query which suppose to read all the data from both +tables with setting `max_rows_to_read=150` will fail as in total it will be 200 rows. While query with `max_rows_to_read_leaf=150` will succeed since leaf nodes will read 100 rows at max. ## max_bytes_to_read_leaf {#max-bytes-to-read-leaf} -A maximum number of bytes (uncompressed data) that can be read from a local table on a leaf node when running -a distributed query. While distributed queries can issue a multiple sub-queries to each shard (leaf) - this limit will -be checked only on the read stage on the leaf nodes and ignored on results merging stage on the root node. -For example, cluster consists of 2 shards and each shard contains a table with 100 bytes of data. -Then distributed query which suppose to read all the data from both tables with setting `max_bytes_to_read=150` will fail -as in total it will be 200 bytes. While query with `max_bytes_to_read_leaf=150` will succeed since leaf nodes will read +A maximum number of bytes (uncompressed data) that can be read from a local table on a leaf node when running +a distributed query. While distributed queries can issue a multiple sub-queries to each shard (leaf) - this limit will +be checked only on the read stage on the leaf nodes and ignored on results merging stage on the root node. +For example, cluster consists of 2 shards and each shard contains a table with 100 bytes of data. +Then distributed query which suppose to read all the data from both tables with setting `max_bytes_to_read=150` will fail +as in total it will be 200 bytes. While query with `max_bytes_to_read_leaf=150` will succeed since leaf nodes will read 100 bytes at max. ## read_overflow_mode_leaf {#read-overflow-mode-leaf} diff --git a/docs/en/operations/settings/settings-users.md b/docs/en/operations/settings/settings-users.md index ee834dca98a..2c8315ad069 100644 --- a/docs/en/operations/settings/settings-users.md +++ b/docs/en/operations/settings/settings-users.md @@ -28,7 +28,7 @@ Structure of the `users` section: profile_name default - + default diff --git a/docs/en/operations/settings/settings.md b/docs/en/operations/settings/settings.md index fc5a911cd7a..07bfe158a0a 100644 --- a/docs/en/operations/settings/settings.md +++ b/docs/en/operations/settings/settings.md @@ -20,6 +20,29 @@ Possible values: - `global` — Replaces the `IN`/`JOIN` query with `GLOBAL IN`/`GLOBAL JOIN.` - `allow` — Allows the use of these types of subqueries. +## prefer_global_in_and_join {#prefer-global-in-and-join} + +Enables the replacement of `IN`/`JOIN` operators with `GLOBAL IN`/`GLOBAL JOIN`. + +Possible values: + +- 0 — Disabled. `IN`/`JOIN` operators are not replaced with `GLOBAL IN`/`GLOBAL JOIN`. +- 1 — Enabled. `IN`/`JOIN` operators are replaced with `GLOBAL IN`/`GLOBAL JOIN`. + +Default value: `0`. + +**Usage** + +Although `SET distributed_product_mode=global` can change the queries behavior for the distributed tables, it's not suitable for local tables or tables from external resources. Here is when the `prefer_global_in_and_join` setting comes into play. + +For example, we have query serving nodes that contain local tables, which are not suitable for distribution. We need to scatter their data on the fly during distributed processing with the `GLOBAL` keyword — `GLOBAL IN`/`GLOBAL JOIN`. + +Another use case of `prefer_global_in_and_join` is accessing tables created by external engines. This setting helps to reduce the number of calls to external sources while joining such tables: only one call per query. + +**See also:** + +- [Distributed subqueries](../../sql-reference/operators/in.md#select-distributed-subqueries) for more information on how to use `GLOBAL IN`/`GLOBAL JOIN` + ## enable_optimize_predicate_expression {#enable-optimize-predicate-expression} Turns on predicate pushdown in `SELECT` queries. @@ -109,6 +132,21 @@ Enables or disables [fsync](http://pubs.opengroup.org/onlinepubs/9699919799/func It makes sense to disable it if the server has millions of tiny tables that are constantly being created and destroyed. +## function_range_max_elements_in_block {#settings-function_range_max_elements_in_block} + +Sets the safety threshold for data volume generated by function [range](../../sql-reference/functions/array-functions.md#range). Defines the maximum number of values generated by function per block of data (sum of array sizes for every row in a block). + +Possible values: + +- Positive integer. + +Default value: `500,000,000`. + +**See Also** + +- [max_block_size](#setting-max_block_size) +- [min_insert_block_size_rows](#min-insert-block-size-rows) + ## enable_http_compression {#settings-enable_http_compression} Enables or disables data compression in the response to an HTTP request. @@ -153,6 +191,26 @@ Possible values: Default value: 1048576. +## table_function_remote_max_addresses {#table_function_remote_max_addresses} + +Sets the maximum number of addresses generated from patterns for the [remote](../../sql-reference/table-functions/remote.md) function. + +Possible values: + +- Positive integer. + +Default value: `1000`. + +## glob_expansion_max_elements {#glob_expansion_max_elements } + +Sets the maximum number of addresses generated from patterns for external storages and table functions (like [url](../../sql-reference/table-functions/url.md)) except the `remote` function. + +Possible values: + +- Positive integer. + +Default value: `1000`. + ## send_progress_in_http_headers {#settings-send_progress_in_http_headers} Enables or disables `X-ClickHouse-Progress` HTTP response headers in `clickhouse-server` responses. @@ -509,6 +567,23 @@ Possible values: Default value: `ALL`. +## join_algorithm {#settings-join_algorithm} + +Specifies [JOIN](../../sql-reference/statements/select/join.md) algorithm. + +Possible values: + +- `hash` — [Hash join algorithm](https://en.wikipedia.org/wiki/Hash_join) is used. +- `partial_merge` — [Sort-merge algorithm](https://en.wikipedia.org/wiki/Sort-merge_join) is used. +- `prefer_partial_merge` — ClickHouse always tries to use `merge` join if possible. +- `auto` — ClickHouse tries to change `hash` join to `merge` join on the fly to avoid out of memory. + +Default value: `hash`. + +When using `hash` algorithm the right part of `JOIN` is uploaded into RAM. + +When using `partial_merge` algorithm ClickHouse sorts the data and dumps it to the disk. The `merge` algorithm in ClickHouse differs a bit from the classic realization. First ClickHouse sorts the right table by [join key](../../sql-reference/statements/select/join.md#select-join) in blocks and creates min-max index for sorted blocks. Then it sorts parts of left table by `join key` and joins them over right table. The min-max index is also used to skip unneeded right table blocks. + ## join_any_take_last_row {#settings-join_any_take_last_row} Changes behaviour of join operations with `ANY` strictness. @@ -708,6 +783,26 @@ Possible value: Default value: 2013265920. +## merge_tree_clear_old_temporary_directories_interval_seconds {#setting-merge-tree-clear-old-temporary-directories-interval-seconds} + +The interval in seconds for ClickHouse to execute the cleanup old temporary directories. + +Possible value: + +- Any positive integer. + +Default value: 60. + +## merge_tree_clear_old_parts_interval_seconds {#setting-merge-tree-clear-old-parts-interval-seconds} + +The interval in seconds for ClickHouse to execute the cleanup old parts, WALs, and mutations. + +Possible value: + +- Any positive integer. + +Default value: 1. + ## min_bytes_to_use_direct_io {#settings-min-bytes-to-use-direct-io} The minimum data volume required for using direct I/O access to the storage disk. @@ -795,7 +890,7 @@ log_queries_min_type='EXCEPTION_WHILE_PROCESSING' Setting up query threads logging. -Queries’ threads runned by ClickHouse with this setup are logged according to the rules in the [query_thread_log](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-query_thread_log) server configuration parameter. +Queries’ threads run by ClickHouse with this setup are logged according to the rules in the [query_thread_log](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-query_thread_log) server configuration parameter. Example: @@ -803,6 +898,19 @@ Example: log_query_threads=1 ``` +## log_query_views {#settings-log-query-views} + +Setting up query views logging. + +When a query run by ClickHouse with this setup on has associated views (materialized or live views), they are logged in the [query_views_log](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-query_views_log) server configuration parameter. + +Example: + +``` text +log_query_views=1 +``` + + ## log_comment {#settings-log-comment} Specifies the value for the `log_comment` field of the [system.query_log](../system-tables/query_log.md) table and comment text for the server log. @@ -1213,7 +1321,15 @@ Default value: `3`. ## output_format_json_quote_64bit_integers {#session_settings-output_format_json_quote_64bit_integers} -If the value is true, integers appear in quotes when using JSON\* Int64 and UInt64 formats (for compatibility with most JavaScript implementations); otherwise, integers are output without the quotes. +Controls quoting of 64-bit or bigger [integers](../../sql-reference/data-types/int-uint.md) (like `UInt64` or `Int128`) when they are output in a [JSON](../../interfaces/formats.md#json) format. +Such integers are enclosed in quotes by default. This behavior is compatible with most JavaScript implementations. + +Possible values: + +- 0 — Integers are output without quotes. +- 1 — Integers are enclosed in quotes. + +Default value: 1. ## output_format_json_quote_denormals {#settings-output_format_json_quote_denormals} @@ -1730,7 +1846,7 @@ Default value: 0. ## optimize_functions_to_subcolumns {#optimize-functions-to-subcolumns} -Enables or disables optimization by transforming some functions to reading subcolumns. This reduces the amount of data to read. +Enables or disables optimization by transforming some functions to reading subcolumns. This reduces the amount of data to read. These functions can be transformed: @@ -1961,6 +2077,13 @@ Possible values: 32 (32 bytes) - 1073741824 (1 GiB) Default value: 32768 (32 KiB) +## output_format_avro_string_column_pattern {#output_format_avro_string_column_pattern} + +Regexp of column names of type String to output as Avro `string` (default is `bytes`). +RE2 syntax is supported. + +Type: string + ## format_avro_schema_registry_url {#format_avro_schema_registry_url} Sets [Confluent Schema Registry](https://docs.confluent.io/current/schema-registry/index.html) URL to use with [AvroConfluent](../../interfaces/formats.md#data-format-avro-confluent) format. @@ -1990,6 +2113,16 @@ Possible values: Default value: 16. +## merge_selecting_sleep_ms {#merge_selecting_sleep_ms} + +Sleep time for merge selecting when no part is selected. A lower setting triggers selecting tasks in `background_schedule_pool` frequently, which results in a large number of requests to Zookeeper in large-scale clusters. + +Possible values: + +- Any positive integer. + +Default value: `5000`. + ## parallel_distributed_insert_select {#parallel_distributed_insert_select} Enables parallel distributed `INSERT ... SELECT` query. @@ -2865,7 +2998,7 @@ Result: └─────────────┘ ``` -Note that this setting influences [Materialized view](../../sql-reference/statements/create/view.md#materialized) and [MaterializeMySQL](../../engines/database-engines/materialize-mysql.md) behaviour. +Note that this setting influences [Materialized view](../../sql-reference/statements/create/view.md#materialized) and [MaterializedMySQL](../../engines/database-engines/materialized-mysql.md) behaviour. ## engine_file_empty_if_not_exists {#engine-file-empty_if-not-exists} @@ -3123,6 +3256,53 @@ SELECT FROM fuse_tbl ``` +## allow_experimental_database_replicated {#allow_experimental_database_replicated} + +Enables to create databases with [Replicated](../../engines/database-engines/replicated.md) engine. + +Possible values: + +- 0 — Disabled. +- 1 — Enabled. + +Default value: `0`. + +## database_replicated_initial_query_timeout_sec {#database_replicated_initial_query_timeout_sec} + +Sets how long initial DDL query should wait for Replicated database to precess previous DDL queue entries in seconds. + +Possible values: + +- Positive integer. +- 0 — Unlimited. + +Default value: `300`. + +## distributed_ddl_task_timeout {#distributed_ddl_task_timeout} + +Sets timeout for DDL query responses from all hosts in cluster. If a DDL request has not been performed on all hosts, a response will contain a timeout error and a request will be executed in an async mode. Negative value means infinite. + +Possible values: + +- Positive integer. +- 0 — Async mode. +- Negative integer — infinite timeout. + +Default value: `180`. + +## distributed_ddl_output_mode {#distributed_ddl_output_mode} + +Sets format of distributed DDL query result. + +Possible values: + +- `throw` — Returns result set with query execution status for all hosts where query is finished. If query has failed on some hosts, then it will rethrow the first exception. If query is not finished yet on some hosts and [distributed_ddl_task_timeout](#distributed_ddl_task_timeout) exceeded, then it throws `TIMEOUT_EXCEEDED` exception. +- `none` — Is similar to throw, but distributed DDL query returns no result set. +- `null_status_on_timeout` — Returns `NULL` as execution status in some rows of result set instead of throwing `TIMEOUT_EXCEEDED` if query is not finished on the corresponding hosts. +- `never_throw` — Do not throw `TIMEOUT_EXCEEDED` and do not rethrow exceptions if query has failed on some hosts. + +Default value: `throw`. + ## flatten_nested {#flatten-nested} Sets the data format of a [nested](../../sql-reference/data-types/nested-data-structures/nested.md) columns. @@ -3202,3 +3382,41 @@ Default value: `1`. **Usage** If the setting is set to `0`, the table function does not make Nullable columns and inserts default values instead of NULL. This is also applicable for NULL values inside arrays. + +## output_format_arrow_low_cardinality_as_dictionary {#output-format-arrow-low-cardinality-as-dictionary} + +Allows to convert the [LowCardinality](../../sql-reference/data-types/lowcardinality.md) type to the `DICTIONARY` type of the [Arrow](../../interfaces/formats.md#data-format-arrow) format for `SELECT` queries. + +Possible values: + +- 0 — The `LowCardinality` type is not converted to the `DICTIONARY` type. +- 1 — The `LowCardinality` type is converted to the `DICTIONARY` type. + +Default value: `0`. + +## materialized_postgresql_max_block_size {#materialized-postgresql-max-block-size} + +Sets the number of rows collected in memory before flushing data into PostgreSQL database table. + +Possible values: + +- Positive integer. + +Default value: `65536`. + +## materialized_postgresql_tables_list {#materialized-postgresql-tables-list} + +Sets a comma-separated list of PostgreSQL database tables, which will be replicated via [MaterializedPostgreSQL](../../engines/database-engines/materialized-postgresql.md) database engine. + +Default value: empty list — means whole PostgreSQL database will be replicated. + +## materialized_postgresql_allow_automatic_update {#materialized-postgresql-allow-automatic-update} + +Allow reloading table in the background, when schema changes are detected. DDL queries on the PostgreSQL side are not replicated via ClickHouse [MaterializedPostgreSQL](../../engines/database-engines/materialized-postgresql.md) engine, because it is not allowed with PostgreSQL logical replication protocol, but the fact of DDL changes is detected transactionally. In this case, the default behaviour is to stop replicating those tables once DDL is detected. However, if this setting is enabled, then, instead of stopping the replication of those tables, they will be reloaded in the background via database snapshot without data losses and replication will continue for them. + +Possible values: + +- 0 — The table is not automatically updated in the background, when schema changes are detected. +- 1 — The table is automatically updated in the background, when schema changes are detected. + +Default value: `0`. diff --git a/docs/en/operations/storing-data.md b/docs/en/operations/storing-data.md new file mode 100644 index 00000000000..f283a2939d8 --- /dev/null +++ b/docs/en/operations/storing-data.md @@ -0,0 +1,115 @@ +--- +toc_priority: 68 +toc_title: External Disks for Storing Data +--- + +# External Disks for Storing Data {#external-disks} + +Data, processed in ClickHouse, is usually stored in the local file system — on the same machine with the ClickHouse server. That requires large-capacity disks, which can be expensive enough. To avoid that you can store the data remotely — on [Amazon S3](https://aws.amazon.com/s3/) disks or in the Hadoop Distributed File System ([HDFS](https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html)). + +To work with data stored on `Amazon S3` disks use [S3](../engines/table-engines/integrations/s3.md) table engine, and to work with data in the Hadoop Distributed File System — [HDFS](../engines/table-engines/integrations/hdfs.md) table engine. + +## Zero-copy Replication {#zero-copy} + +ClickHouse supports zero-copy replication for `S3` and `HDFS` disks, which means that if the data is stored remotely on several machines and needs to be synchronized, then only the metadata is replicated (paths to the data parts), but not the data itself. + +## Configuring HDFS {#configuring-hdfs} + +[MergeTree](../engines/table-engines/mergetree-family/mergetree.md) and [Log](../engines/table-engines/log-family/log.md) family table engines can store data to HDFS using a disk with type `HDFS`. + +Configuration markup: + +``` xml + + + + + hdfs + hdfs://hdfs1:9000/clickhouse/ + + + + + +
+ hdfs +
+
+
+
+
+ + + 0 + +
+``` + +Required parameters: + +- `endpoint` — HDFS endpoint URL in `path` format. Endpoint URL should contain a root path to store data. + +Optional parameters: + +- `min_bytes_for_seek` — The minimal number of bytes to use seek operation instead of sequential read. Default value: `1 Mb`. + +## Using Virtual File System for Data Encryption {#encrypted-virtual-file-system} + +You can encrypt the data stored on [S3](../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-s3), or [HDFS](#configuring-hdfs) external disks, or on a local disk. To turn on the encryption mode, in the configuration file you must define a disk with the type `encrypted` and choose a disk on which the data will be saved. An `encrypted` disk ciphers all written files on the fly, and when you read files from an `encrypted` disk it deciphers them automatically. So you can work with an `encrypted` disk like with a normal one. + +Example of disk configuration: + +``` xml + + + local + /path1/ + + + encrypted + disk1 + path2/ + _16_ascii_chars_ + + +``` + +For example, when ClickHouse writes data from some table to a file `store/all_1_1_0/data.bin` to `disk1`, then in fact this file will be written to the physical disk along the path `/path1/store/all_1_1_0/data.bin`. + +When writing the same file to `disk2`, it will actually be written to the physical disk at the path `/path1/path2/store/all_1_1_0/data.bin` in encrypted mode. + +Required parameters: + +- `type` — `encrypted`. Otherwise the encrypted disk is not created. +- `disk` — Type of disk for data storage. +- `key` — The key for encryption and decryption. Type: [Uint64](../sql-reference/data-types/int-uint.md). You can use `key_hex` parameter to encrypt in hexadecimal form. + You can specify multiple keys using the `id` attribute (see example above). + +Optional parameters: + +- `path` — Path to the location on the disk where the data will be saved. If not specified, the data will be saved in the root directory. +- `current_key_id` — The key used for encryption. All the specified keys can be used for decryption, and you can always switch to another key while maintaining access to previously encrypted data. +- `algorithm` — [Algorithm](../sql-reference/statements/create/table.md#create-query-encryption-codecs) for encryption. Possible values: `AES_128_CTR`, `AES_192_CTR` or `AES_256_CTR`. Default value: `AES_128_CTR`. The key length depends on the algorithm: `AES_128_CTR` — 16 bytes, `AES_192_CTR` — 24 bytes, `AES_256_CTR` — 32 bytes. + +Example of disk configuration: + +``` xml + + + + + s3 + ... + + + encrypted + disk_s3 + AES_128_CTR + 00112233445566778899aabbccddeeff + ffeeddccbbaa99887766554433221100 + 1 + + + + +``` diff --git a/docs/en/operations/system-tables/asynchronous_metric_log.md b/docs/en/operations/system-tables/asynchronous_metric_log.md index b0480dc256a..de2e8faab10 100644 --- a/docs/en/operations/system-tables/asynchronous_metric_log.md +++ b/docs/en/operations/system-tables/asynchronous_metric_log.md @@ -33,7 +33,7 @@ SELECT * FROM system.asynchronous_metric_log LIMIT 10 **See Also** -- [system.asynchronous_metrics](../system-tables/asynchronous_metrics.md) — Contains metrics, calculated periodically in the background. +- [system.asynchronous_metrics](../system-tables/asynchronous_metrics.md) — Contains metrics, calculated periodically in the background. - [system.metric_log](../system-tables/metric_log.md) — Contains history of metrics values from tables `system.metrics` and `system.events`, periodically flushed to disk. [Original article](https://clickhouse.tech/docs/en/operations/system-tables/asynchronous_metric_log) diff --git a/docs/en/operations/system-tables/columns.md b/docs/en/operations/system-tables/columns.md index 2a8009dddee..da4bcec48ed 100644 --- a/docs/en/operations/system-tables/columns.md +++ b/docs/en/operations/system-tables/columns.md @@ -4,7 +4,7 @@ Contains information about columns in all the tables. You can use this table to get information similar to the [DESCRIBE TABLE](../../sql-reference/statements/misc.md#misc-describe-table) query, but for multiple tables at once. -Columns from [temporary tables](../../sql-reference/statements/create/table.md#temporary-tables) are visible in the `system.columns` only in those session where they have been created. They are shown with the empty `database` field. +Columns from [temporary tables](../../sql-reference/statements/create/table.md#temporary-tables) are visible in the `system.columns` only in those session where they have been created. They are shown with the empty `database` field. Columns: @@ -38,17 +38,17 @@ database: system table: aggregate_function_combinators name: name type: String -default_kind: -default_expression: +default_kind: +default_expression: data_compressed_bytes: 0 data_uncompressed_bytes: 0 marks_bytes: 0 -comment: +comment: is_in_partition_key: 0 is_in_sorting_key: 0 is_in_primary_key: 0 is_in_sampling_key: 0 -compression_codec: +compression_codec: Row 2: ────── @@ -56,17 +56,17 @@ database: system table: aggregate_function_combinators name: is_internal type: UInt8 -default_kind: -default_expression: +default_kind: +default_expression: data_compressed_bytes: 0 data_uncompressed_bytes: 0 marks_bytes: 0 -comment: +comment: is_in_partition_key: 0 is_in_sorting_key: 0 is_in_primary_key: 0 is_in_sampling_key: 0 -compression_codec: +compression_codec: ``` The `system.columns` table contains the following columns (the column type is shown in brackets): diff --git a/docs/en/operations/system-tables/data_skipping_indices.md b/docs/en/operations/system-tables/data_skipping_indices.md index 515f704797a..683666e1f77 100644 --- a/docs/en/operations/system-tables/data_skipping_indices.md +++ b/docs/en/operations/system-tables/data_skipping_indices.md @@ -8,12 +8,11 @@ Columns: - `table` ([String](../../sql-reference/data-types/string.md)) — Table name. - `name` ([String](../../sql-reference/data-types/string.md)) — Index name. - `type` ([String](../../sql-reference/data-types/string.md)) — Index type. -- `expr` ([String](../../sql-reference/data-types/string.md)) — Expression used to calculate the index. -- `granularity` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Number of granules in the block. +- `expr` ([String](../../sql-reference/data-types/string.md)) — Expression for the index calculation. +- `granularity` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of granules in the block. **Example** - ```sql SELECT * FROM system.data_skipping_indices LIMIT 2 FORMAT Vertical; ``` diff --git a/docs/en/operations/system-tables/disks.md b/docs/en/operations/system-tables/disks.md index 833a0b3b16b..027e722dc55 100644 --- a/docs/en/operations/system-tables/disks.md +++ b/docs/en/operations/system-tables/disks.md @@ -21,7 +21,7 @@ Columns: │ default │ /var/lib/clickhouse/ │ 276392587264 │ 490652508160 │ 0 │ └─────────┴──────────────────────┴──────────────┴──────────────┴─────────────────┘ -1 rows in set. Elapsed: 0.001 sec. +1 rows in set. Elapsed: 0.001 sec. ``` [Original article](https://clickhouse.tech/docs/en/operations/system-tables/disks) diff --git a/docs/en/operations/system-tables/distributed_ddl_queue.md b/docs/en/operations/system-tables/distributed_ddl_queue.md index fa871d215b5..07f72d76324 100644 --- a/docs/en/operations/system-tables/distributed_ddl_queue.md +++ b/docs/en/operations/system-tables/distributed_ddl_queue.md @@ -62,4 +62,3 @@ exception_code: ZOK ``` [Original article](https://clickhouse.tech/docs/en/operations/system_tables/distributed_ddl_queuedistributed_ddl_queue.md) - \ No newline at end of file diff --git a/docs/en/operations/system-tables/distribution_queue.md b/docs/en/operations/system-tables/distribution_queue.md index 3b09c20874c..a7037a23312 100644 --- a/docs/en/operations/system-tables/distribution_queue.md +++ b/docs/en/operations/system-tables/distribution_queue.md @@ -40,7 +40,7 @@ is_blocked: 1 error_count: 0 data_files: 1 data_compressed_bytes: 499 -last_exception: +last_exception: ``` **See Also** diff --git a/docs/en/operations/system-tables/enabled-roles.md b/docs/en/operations/system-tables/enabled-roles.md index c03129b32dd..ecfb889b6ef 100644 --- a/docs/en/operations/system-tables/enabled-roles.md +++ b/docs/en/operations/system-tables/enabled-roles.md @@ -1,6 +1,6 @@ # system.enabled_roles {#system_tables-enabled_roles} -Contains all active roles at the moment, including current role of the current user and granted roles for current role. +Contains all active roles at the moment, including current role of the current user and granted roles for current role. Columns: diff --git a/docs/en/operations/system-tables/functions.md b/docs/en/operations/system-tables/functions.md index 888e768fc93..38aa62c9c09 100644 --- a/docs/en/operations/system-tables/functions.md +++ b/docs/en/operations/system-tables/functions.md @@ -27,7 +27,7 @@ Columns: │ JSONExtractInt │ 0 │ 0 │ │ └──────────────────────────┴──────────────┴──────────────────┴──────────┘ -10 rows in set. Elapsed: 0.002 sec. +10 rows in set. Elapsed: 0.002 sec. ``` [Original article](https://clickhouse.tech/docs/en/operations/system-tables/functions) diff --git a/docs/en/operations/system-tables/licenses.md b/docs/en/operations/system-tables/licenses.md index a9cada507c6..d1c3e1cc5de 100644 --- a/docs/en/operations/system-tables/licenses.md +++ b/docs/en/operations/system-tables/licenses.md @@ -1,11 +1,11 @@ # system.licenses {#system-tables_system.licenses} -Сontains licenses of third-party libraries that are located in the [contrib](https://github.com/ClickHouse/ClickHouse/tree/master/contrib) directory of ClickHouse sources. +Сontains licenses of third-party libraries that are located in the [contrib](https://github.com/ClickHouse/ClickHouse/tree/master/contrib) directory of ClickHouse sources. Columns: - `library_name` ([String](../../sql-reference/data-types/string.md)) — Name of the library, which is license connected with. -- `license_type` ([String](../../sql-reference/data-types/string.md)) — License type — e.g. Apache, MIT. +- `license_type` ([String](../../sql-reference/data-types/string.md)) — License type — e.g. Apache, MIT. - `license_path` ([String](../../sql-reference/data-types/string.md)) — Path to the file with the license text. - `license_text` ([String](../../sql-reference/data-types/string.md)) — License text. diff --git a/docs/en/operations/system-tables/merge_tree_settings.md b/docs/en/operations/system-tables/merge_tree_settings.md index 309c1cbc9d1..ce82cd09b8a 100644 --- a/docs/en/operations/system-tables/merge_tree_settings.md +++ b/docs/en/operations/system-tables/merge_tree_settings.md @@ -48,7 +48,7 @@ changed: 0 description: How many rows in blocks should be formed for merge operations. type: SettingUInt64 -4 rows in set. Elapsed: 0.001 sec. +4 rows in set. Elapsed: 0.001 sec. ``` [Original article](https://clickhouse.tech/docs/en/operations/system-tables/merge_tree_settings) diff --git a/docs/en/operations/system-tables/mutations.md b/docs/en/operations/system-tables/mutations.md index 24fa559197c..e7d3e90b806 100644 --- a/docs/en/operations/system-tables/mutations.md +++ b/docs/en/operations/system-tables/mutations.md @@ -1,6 +1,6 @@ # system.mutations {#system_tables-mutations} -The table contains information about [mutations](../../sql-reference/statements/alter/index.md#mutations) of [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) tables and their progress. Each mutation command is represented by a single row. +The table contains information about [mutations](../../sql-reference/statements/alter/index.md#mutations) of [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) tables and their progress. Each mutation command is represented by a single row. Columns: @@ -16,17 +16,17 @@ Columns: - `block_numbers.partition_id` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — For mutations of replicated tables, the array contains the partitions' IDs (one record for each partition). For mutations of non-replicated tables the array is empty. -- `block_numbers.number` ([Array](../../sql-reference/data-types/array.md)([Int64](../../sql-reference/data-types/int-uint.md))) — For mutations of replicated tables, the array contains one record for each partition, with the block number that was acquired by the mutation. Only parts that contain blocks with numbers less than this number will be mutated in the partition. - +- `block_numbers.number` ([Array](../../sql-reference/data-types/array.md)([Int64](../../sql-reference/data-types/int-uint.md))) — For mutations of replicated tables, the array contains one record for each partition, with the block number that was acquired by the mutation. Only parts that contain blocks with numbers less than this number will be mutated in the partition. + In non-replicated tables, block numbers in all partitions form a single sequence. This means that for mutations of non-replicated tables, the column will contain one record with a single block number acquired by the mutation. - `parts_to_do_names` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — An array of names of data parts that need to be mutated for the mutation to complete. - `parts_to_do` ([Int64](../../sql-reference/data-types/int-uint.md)) — The number of data parts that need to be mutated for the mutation to complete. -- `is_done` ([UInt8](../../sql-reference/data-types/int-uint.md)) — The flag whether the mutation is done or not. Possible values: +- `is_done` ([UInt8](../../sql-reference/data-types/int-uint.md)) — The flag whether the mutation is done or not. Possible values: - `1` if the mutation is completed, - - `0` if the mutation is still in process. + - `0` if the mutation is still in process. !!! info "Note" Even if `parts_to_do = 0` it is possible that a mutation of a replicated table is not completed yet because of a long-running `INSERT` query, that will create a new data part needed to be mutated. diff --git a/docs/en/operations/system-tables/numbers.md b/docs/en/operations/system-tables/numbers.md index bf948d9dd5b..e9d64483525 100644 --- a/docs/en/operations/system-tables/numbers.md +++ b/docs/en/operations/system-tables/numbers.md @@ -26,7 +26,7 @@ Reads from this table are not parallelized. │ 9 │ └────────┘ -10 rows in set. Elapsed: 0.001 sec. +10 rows in set. Elapsed: 0.001 sec. ``` [Original article](https://clickhouse.tech/docs/en/operations/system-tables/numbers) diff --git a/docs/en/operations/system-tables/numbers_mt.md b/docs/en/operations/system-tables/numbers_mt.md index d7df1bc1e0e..e11515d4c06 100644 --- a/docs/en/operations/system-tables/numbers_mt.md +++ b/docs/en/operations/system-tables/numbers_mt.md @@ -24,7 +24,7 @@ Used for tests. │ 9 │ └────────┘ -10 rows in set. Elapsed: 0.001 sec. +10 rows in set. Elapsed: 0.001 sec. ``` [Original article](https://clickhouse.tech/docs/en/operations/system-tables/numbers_mt) diff --git a/docs/en/operations/system-tables/one.md b/docs/en/operations/system-tables/one.md index 10b2a1757d0..4a00e118b05 100644 --- a/docs/en/operations/system-tables/one.md +++ b/docs/en/operations/system-tables/one.md @@ -17,7 +17,7 @@ This is similar to the `DUAL` table found in other DBMSs. │ 0 │ └───────┘ -1 rows in set. Elapsed: 0.001 sec. +1 rows in set. Elapsed: 0.001 sec. ``` [Original article](https://clickhouse.tech/docs/en/operations/system-tables/one) diff --git a/docs/en/operations/system-tables/part_log.md b/docs/en/operations/system-tables/part_log.md index b815d2366bb..ce983282880 100644 --- a/docs/en/operations/system-tables/part_log.md +++ b/docs/en/operations/system-tables/part_log.md @@ -63,7 +63,7 @@ read_rows: 0 read_bytes: 0 peak_memory_usage: 0 error: 0 -exception: +exception: ``` [Original article](https://clickhouse.tech/docs/en/operations/system-tables/part_log) diff --git a/docs/en/operations/system-tables/parts.md b/docs/en/operations/system-tables/parts.md index b9b5aa09b64..cd5b3fc799a 100644 --- a/docs/en/operations/system-tables/parts.md +++ b/docs/en/operations/system-tables/parts.md @@ -19,10 +19,10 @@ Columns: Possible Values: - - `Wide` — Each column is stored in a separate file in a filesystem. - - `Compact` — All columns are stored in one file in a filesystem. + - `Wide` — Each column is stored in a separate file in a filesystem. + - `Compact` — All columns are stored in one file in a filesystem. - Data storing format is controlled by the `min_bytes_for_wide_part` and `min_rows_for_wide_part` settings of the [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) table. + Data storing format is controlled by the `min_bytes_for_wide_part` and `min_rows_for_wide_part` settings of the [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) table. - `active` ([UInt8](../../sql-reference/data-types/int-uint.md)) – Flag that indicates whether the data part is active. If a data part is active, it’s used in a table. Otherwise, it’s deleted. Inactive data parts remain after merging. @@ -88,7 +88,7 @@ Columns: - `delete_ttl_info_max` ([DateTime](../../sql-reference/data-types/datetime.md)) — The maximum value of the date and time key for [TTL DELETE rule](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-ttl). -- `move_ttl_info.expression` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Array of expressions. Each expression defines a [TTL MOVE rule](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-ttl). +- `move_ttl_info.expression` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Array of expressions. Each expression defines a [TTL MOVE rule](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-ttl). !!! note "Warning" The `move_ttl_info.expression` array is kept mostly for backward compatibility, now the simpliest way to check `TTL MOVE` rule is to use the `move_ttl_info.min` and `move_ttl_info.max` fields. diff --git a/docs/en/operations/system-tables/parts_columns.md b/docs/en/operations/system-tables/parts_columns.md index 293abb18a50..81529544a8b 100644 --- a/docs/en/operations/system-tables/parts_columns.md +++ b/docs/en/operations/system-tables/parts_columns.md @@ -19,10 +19,10 @@ Columns: Possible values: - - `Wide` — Each column is stored in a separate file in a filesystem. - - `Compact` — All columns are stored in one file in a filesystem. + - `Wide` — Each column is stored in a separate file in a filesystem. + - `Compact` — All columns are stored in one file in a filesystem. - Data storing format is controlled by the `min_bytes_for_wide_part` and `min_rows_for_wide_part` settings of the [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) table. + Data storing format is controlled by the `min_bytes_for_wide_part` and `min_rows_for_wide_part` settings of the [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) table. - `active` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Flag that indicates whether the data part is active. If a data part is active, it’s used in a table. Otherwise, it’s deleted. Inactive data parts remain after merging. diff --git a/docs/en/operations/system-tables/query_log.md b/docs/en/operations/system-tables/query_log.md index d58e549616f..548e454cf58 100644 --- a/docs/en/operations/system-tables/query_log.md +++ b/docs/en/operations/system-tables/query_log.md @@ -50,7 +50,9 @@ Columns: - `query_kind` ([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md)) — Type of the query. - `databases` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — Names of the databases present in the query. - `tables` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — Names of the tables present in the query. +- `views` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — Names of the (materialized or live) views present in the query. - `columns` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — Names of the columns present in the query. +- `projections` ([String](../../sql-reference/data-types/string.md)) — Names of the projections used during the query execution. - `exception_code` ([Int32](../../sql-reference/data-types/int-uint.md)) — Code of an exception. - `exception` ([String](../../sql-reference/data-types/string.md)) — Exception message. - `stack_trace` ([String](../../sql-reference/data-types/string.md)) — [Stack trace](https://en.wikipedia.org/wiki/Stack_trace). An empty string, if the query was completed successfully. @@ -65,6 +67,8 @@ Columns: - `initial_query_id` ([String](../../sql-reference/data-types/string.md)) — ID of the initial query (for distributed query execution). - `initial_address` ([IPv6](../../sql-reference/data-types/domains/ipv6.md)) — IP address that the parent query was launched from. - `initial_port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — The client port that was used to make the parent query. +- `initial_query_start_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Initial query starting time (for distributed query execution). +- `initial_query_start_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — Initial query starting time with microseconds precision (for distributed query execution). - `interface` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Interface that the query was initiated from. Possible values: - 1 — TCP. - 2 — HTTP. @@ -101,59 +105,82 @@ Columns: **Example** ``` sql -SELECT * FROM system.query_log WHERE type = 'QueryFinish' AND (query LIKE '%toDate(\'2000-12-05\')%') ORDER BY query_start_time DESC LIMIT 1 FORMAT Vertical; +SELECT * FROM system.query_log WHERE type = 'QueryFinish' ORDER BY query_start_time DESC LIMIT 1 FORMAT Vertical; ``` ``` text Row 1: ────── -type: QueryStart -event_date: 2020-09-11 -event_time: 2020-09-11 10:08:17 -event_time_microseconds: 2020-09-11 10:08:17.063321 -query_start_time: 2020-09-11 10:08:17 -query_start_time_microseconds: 2020-09-11 10:08:17.063321 -query_duration_ms: 0 -read_rows: 0 -read_bytes: 0 -written_rows: 0 -written_bytes: 0 -result_rows: 0 -result_bytes: 0 -memory_usage: 0 -current_database: default -query: INSERT INTO test1 VALUES -exception_code: 0 +type: QueryFinish +event_date: 2021-07-28 +event_time: 2021-07-28 13:46:56 +event_time_microseconds: 2021-07-28 13:46:56.719791 +query_start_time: 2021-07-28 13:46:56 +query_start_time_microseconds: 2021-07-28 13:46:56.704542 +query_duration_ms: 14 +read_rows: 8393 +read_bytes: 374325 +written_rows: 0 +written_bytes: 0 +result_rows: 4201 +result_bytes: 153024 +memory_usage: 4714038 +current_database: default +query: SELECT DISTINCT arrayJoin(extractAll(name, '[\\w_]{2,}')) AS res FROM (SELECT name FROM system.functions UNION ALL SELECT name FROM system.table_engines UNION ALL SELECT name FROM system.formats UNION ALL SELECT name FROM system.table_functions UNION ALL SELECT name FROM system.data_type_families UNION ALL SELECT name FROM system.merge_tree_settings UNION ALL SELECT name FROM system.settings UNION ALL SELECT cluster FROM system.clusters UNION ALL SELECT macro FROM system.macros UNION ALL SELECT policy_name FROM system.storage_policies UNION ALL SELECT concat(func.name, comb.name) FROM system.functions AS func CROSS JOIN system.aggregate_function_combinators AS comb WHERE is_aggregate UNION ALL SELECT name FROM system.databases LIMIT 10000 UNION ALL SELECT DISTINCT name FROM system.tables LIMIT 10000 UNION ALL SELECT DISTINCT name FROM system.dictionaries LIMIT 10000 UNION ALL SELECT DISTINCT name FROM system.columns LIMIT 10000) WHERE notEmpty(res) +normalized_query_hash: 6666026786019643712 +query_kind: Select +databases: ['system'] +tables: ['system.aggregate_function_combinators','system.clusters','system.columns','system.data_type_families','system.databases','system.dictionaries','system.formats','system.functions','system.macros','system.merge_tree_settings','system.settings','system.storage_policies','system.table_engines','system.table_functions','system.tables'] +columns: ['system.aggregate_function_combinators.name','system.clusters.cluster','system.columns.name','system.data_type_families.name','system.databases.name','system.dictionaries.name','system.formats.name','system.functions.is_aggregate','system.functions.name','system.macros.macro','system.merge_tree_settings.name','system.settings.name','system.storage_policies.policy_name','system.table_engines.name','system.table_functions.name','system.tables.name'] +projections: [] +exception_code: 0 exception: stack_trace: -is_initial_query: 1 -user: default -query_id: 50a320fd-85a8-49b8-8761-98a86bcbacef -address: ::ffff:127.0.0.1 -port: 33452 -initial_user: default -initial_query_id: 50a320fd-85a8-49b8-8761-98a86bcbacef -initial_address: ::ffff:127.0.0.1 -initial_port: 33452 -interface: 1 -os_user: bharatnc -client_hostname: tower -client_name: ClickHouse -client_revision: 54437 -client_version_major: 20 -client_version_minor: 7 -client_version_patch: 2 -http_method: 0 +is_initial_query: 1 +user: default +query_id: a3361f6e-a1fd-4d54-9f6f-f93a08bab0bf +address: ::ffff:127.0.0.1 +port: 51006 +initial_user: default +initial_query_id: a3361f6e-a1fd-4d54-9f6f-f93a08bab0bf +initial_address: ::ffff:127.0.0.1 +initial_port: 51006 +initial_query_start_time: 2021-07-28 13:46:56 +initial_query_start_time_microseconds: 2021-07-28 13:46:56.704542 +interface: 1 +os_user: +client_hostname: +client_name: ClickHouse client +client_revision: 54449 +client_version_major: 21 +client_version_minor: 8 +client_version_patch: 0 +http_method: 0 http_user_agent: +http_referer: +forwarded_for: quota_key: -revision: 54440 -thread_ids: [] -ProfileEvents: {'Query':1,'SelectQuery':1,'ReadCompressedBytes':36,'CompressedReadBufferBlocks':1,'CompressedReadBufferBytes':10,'IOBufferAllocs':1,'IOBufferAllocBytes':89,'ContextLock':15,'RWLockAcquiredReadLocks':1} -Settings: {'background_pool_size':'32','load_balancing':'random','allow_suspicious_low_cardinality_types':'1','distributed_aggregation_memory_efficient':'1','skip_unavailable_shards':'1','log_queries':'1','max_bytes_before_external_group_by':'20000000000','max_bytes_before_external_sort':'20000000000','allow_introspection_functions':'1'} +revision: 54453 +log_comment: +thread_ids: [5058,22097,22110,22094] +ProfileEvents.Names: ['Query','SelectQuery','ArenaAllocChunks','ArenaAllocBytes','FunctionExecute','NetworkSendElapsedMicroseconds','SelectedRows','SelectedBytes','ContextLock','RWLockAcquiredReadLocks','RealTimeMicroseconds','UserTimeMicroseconds','SystemTimeMicroseconds','SoftPageFaults','OSCPUWaitMicroseconds','OSCPUVirtualTimeMicroseconds','OSWriteBytes','OSWriteChars'] +ProfileEvents.Values: [1,1,39,352256,64,360,8393,374325,412,440,34480,13108,4723,671,19,17828,8192,10240] +Settings.Names: ['load_balancing','max_memory_usage'] +Settings.Values: ['random','10000000000'] +used_aggregate_functions: [] +used_aggregate_function_combinators: [] +used_database_engines: [] +used_data_type_families: ['UInt64','UInt8','Nullable','String','date'] +used_dictionaries: [] +used_formats: [] +used_functions: ['concat','notEmpty','extractAll'] +used_storages: [] +used_table_functions: [] ``` **See Also** - [system.query_thread_log](../../operations/system-tables/query_thread_log.md#system_tables-query_thread_log) — This table contains information about each query execution thread. +- [system.query_views_log](../../operations/system-tables/query_views_log.md#system_tables-query_views_log) — This table contains information about each view executed during a query. [Original article](https://clickhouse.tech/docs/en/operations/system-tables/query_log) diff --git a/docs/en/operations/system-tables/query_thread_log.md b/docs/en/operations/system-tables/query_thread_log.md index 7ecea2971b4..152a10504bb 100644 --- a/docs/en/operations/system-tables/query_thread_log.md +++ b/docs/en/operations/system-tables/query_thread_log.md @@ -112,5 +112,6 @@ ProfileEvents: {'Query':1,'SelectQuery':1,'ReadCompressedBytes':36,'Compr **See Also** - [system.query_log](../../operations/system-tables/query_log.md#system_tables-query_log) — Description of the `query_log` system table which contains common information about queries execution. +- [system.query_views_log](../../operations/system-tables/query_views_log.md#system_tables-query_views_log) — This table contains information about each view executed during a query. [Original article](https://clickhouse.tech/docs/en/operations/system-tables/query_thread_log) diff --git a/docs/en/operations/system-tables/query_views_log.md b/docs/en/operations/system-tables/query_views_log.md new file mode 100644 index 00000000000..48d36a6a118 --- /dev/null +++ b/docs/en/operations/system-tables/query_views_log.md @@ -0,0 +1,81 @@ +# system.query_views_log {#system_tables-query_views_log} + +Contains information about the dependent views executed when running a query, for example, the view type or the execution time. + +To start logging: + +1. Configure parameters in the [query_views_log](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-query_views_log) section. +2. Set [log_query_views](../../operations/settings/settings.md#settings-log-query-views) to 1. + +The flushing period of data is set in `flush_interval_milliseconds` parameter of the [query_views_log](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-query_views_log) server settings section. To force flushing, use the [SYSTEM FLUSH LOGS](../../sql-reference/statements/system.md#query_language-system-flush_logs) query. + +ClickHouse does not delete data from the table automatically. See [Introduction](../../operations/system-tables/index.md#system-tables-introduction) for more details. + +Columns: + +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — The date when the last event of the view happened. +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — The date and time when the view finished execution. +- `event_time_microseconds` ([DateTime](../../sql-reference/data-types/datetime.md)) — The date and time when the view finished execution with microseconds precision. +- `view_duration_ms` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Duration of view execution (sum of its stages) in milliseconds. +- `initial_query_id` ([String](../../sql-reference/data-types/string.md)) — ID of the initial query (for distributed query execution). +- `view_name` ([String](../../sql-reference/data-types/string.md)) — Name of the view. +- `view_uuid` ([UUID](../../sql-reference/data-types/uuid.md)) — UUID of the view. +- `view_type` ([Enum8](../../sql-reference/data-types/enum.md)) — Type of the view. Values: + - `'Default' = 1` — [Default views](../../sql-reference/statements/create/view.md#normal). Should not appear in this log. + - `'Materialized' = 2` — [Materialized views](../../sql-reference/statements/create/view.md#materialized). + - `'Live' = 3` — [Live views](../../sql-reference/statements/create/view.md#live-view). +- `view_query` ([String](../../sql-reference/data-types/string.md)) — The query executed by the view. +- `view_target` ([String](../../sql-reference/data-types/string.md)) — The name of the view target table. +- `read_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of read rows. +- `read_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of read bytes. +- `written_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of written rows. +- `written_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of written bytes. +- `peak_memory_usage` ([Int64](../../sql-reference/data-types/int-uint.md)) — The maximum difference between the amount of allocated and freed memory in context of this view. +- `ProfileEvents` ([Map(String, UInt64)](../../sql-reference/data-types/array.md)) — ProfileEvents that measure different metrics. The description of them could be found in the table [system.events](../../operations/system-tables/events.md#system_tables-events). +- `status` ([Enum8](../../sql-reference/data-types/enum.md)) — Status of the view. Values: + - `'QueryStart' = 1` — Successful start the view execution. Should not appear. + - `'QueryFinish' = 2` — Successful end of the view execution. + - `'ExceptionBeforeStart' = 3` — Exception before the start of the view execution. + - `'ExceptionWhileProcessing' = 4` — Exception during the view execution. +- `exception_code` ([Int32](../../sql-reference/data-types/int-uint.md)) — Code of an exception. +- `exception` ([String](../../sql-reference/data-types/string.md)) — Exception message. +- `stack_trace` ([String](../../sql-reference/data-types/string.md)) — [Stack trace](https://en.wikipedia.org/wiki/Stack_trace). An empty string, if the query was completed successfully. + +**Example** + +``` sql + SELECT * FROM system.query_views_log LIMIT 1 \G +``` + +``` text +Row 1: +────── +event_date: 2021-06-22 +event_time: 2021-06-22 13:23:07 +event_time_microseconds: 2021-06-22 13:23:07.738221 +view_duration_ms: 0 +initial_query_id: c3a1ac02-9cad-479b-af54-9e9c0a7afd70 +view_name: default.matview_inner +view_uuid: 00000000-0000-0000-0000-000000000000 +view_type: Materialized +view_query: SELECT * FROM default.table_b +view_target: default.`.inner.matview_inner` +read_rows: 4 +read_bytes: 64 +written_rows: 2 +written_bytes: 32 +peak_memory_usage: 4196188 +ProfileEvents: {'FileOpen':2,'WriteBufferFromFileDescriptorWrite':2,'WriteBufferFromFileDescriptorWriteBytes':187,'IOBufferAllocs':3,'IOBufferAllocBytes':3145773,'FunctionExecute':3,'DiskWriteElapsedMicroseconds':13,'InsertedRows':2,'InsertedBytes':16,'SelectedRows':4,'SelectedBytes':48,'ContextLock':16,'RWLockAcquiredReadLocks':1,'RealTimeMicroseconds':698,'SoftPageFaults':4,'OSReadChars':463} +status: QueryFinish +exception_code: 0 +exception: +stack_trace: +``` + +**See Also** + +- [system.query_log](../../operations/system-tables/query_log.md#system_tables-query_log) — Description of the `query_log` system table which contains common information about queries execution. +- [system.query_thread_log](../../operations/system-tables/query_thread_log.md#system_tables-query_thread_log) — This table contains information about each query execution thread. + + +[Original article](https://clickhouse.tech/docs/en/operations/system_tables/query_thread_log) diff --git a/docs/en/operations/system-tables/replicas.md b/docs/en/operations/system-tables/replicas.md index 5a6ec54723b..e2cc607f6d8 100644 --- a/docs/en/operations/system-tables/replicas.md +++ b/docs/en/operations/system-tables/replicas.md @@ -82,6 +82,7 @@ The next 4 columns have a non-zero value only where there is an active session w - `absolute_delay` (`UInt64`) - How big lag in seconds the current replica has. - `total_replicas` (`UInt8`) - The total number of known replicas of this table. - `active_replicas` (`UInt8`) - The number of replicas of this table that have a session in ZooKeeper (i.e., the number of functioning replicas). +- `replica_is_active` ([Map(String, UInt8)](../../sql-reference/data-types/map.md)) — Map between replica name and is replica active. If you request all the columns, the table may work a bit slowly, since several reads from ZooKeeper are made for each row. If you do not request the last 4 columns (log_max_index, log_pointer, total_replicas, active_replicas), the table works quickly. diff --git a/docs/en/operations/system-tables/role-grants.md b/docs/en/operations/system-tables/role-grants.md index d90bc1f77be..d754c6d7fb5 100644 --- a/docs/en/operations/system-tables/role-grants.md +++ b/docs/en/operations/system-tables/role-grants.md @@ -13,9 +13,9 @@ Columns: - `granted_role_is_default` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Flag that shows whether `granted_role` is a default role. Possible values: - 1 — `granted_role` is a default role. - 0 — `granted_role` is not a default role. - + - `with_admin_option` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Flag that shows whether `granted_role` is a role with [ADMIN OPTION](../../sql-reference/statements/grant.md#admin-option-privilege) privilege. Possible values: - 1 — The role has `ADMIN OPTION` privilege. - - 0 — The role without `ADMIN OPTION` privilege. + - 0 — The role without `ADMIN OPTION` privilege. [Original article](https://clickhouse.tech/docs/en/operations/system-tables/role-grants) diff --git a/docs/en/operations/system-tables/row_policies.md b/docs/en/operations/system-tables/row_policies.md index 767270d64ae..157ec75f05e 100644 --- a/docs/en/operations/system-tables/row_policies.md +++ b/docs/en/operations/system-tables/row_policies.md @@ -13,7 +13,7 @@ Columns: - `id` ([UUID](../../sql-reference/data-types/uuid.md)) — Row policy ID. -- `storage` ([String](../../sql-reference/data-types/string.md)) — Name of the directory where the row policy is stored. +- `storage` ([String](../../sql-reference/data-types/string.md)) — Name of the directory where the row policy is stored. - `select_filter` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Condition which is used to filter rows. diff --git a/docs/en/operations/system-tables/settings_profiles.md b/docs/en/operations/system-tables/settings_profiles.md index 80dc5172f4e..7339c5c2ef6 100644 --- a/docs/en/operations/system-tables/settings_profiles.md +++ b/docs/en/operations/system-tables/settings_profiles.md @@ -7,7 +7,7 @@ Columns: - `id` ([UUID](../../sql-reference/data-types/uuid.md)) — Setting profile ID. -- `storage` ([String](../../sql-reference/data-types/string.md)) — Path to the storage of setting profiles. Configured in the `access_control_path` parameter. +- `storage` ([String](../../sql-reference/data-types/string.md)) — Path to the storage of setting profiles. Configured in the `access_control_path` parameter. - `num_elements` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Number of elements for this profile in the `system.settings_profile_elements` table. diff --git a/docs/en/operations/system-tables/tables.md b/docs/en/operations/system-tables/tables.md index 4d7b20be311..f37da02cf5b 100644 --- a/docs/en/operations/system-tables/tables.md +++ b/docs/en/operations/system-tables/tables.md @@ -1,24 +1,24 @@ # system.tables {#system-tables} -Contains metadata of each table that the server knows about. +Contains metadata of each table that the server knows about. [Detached](../../sql-reference/statements/detach.md) tables are not shown in `system.tables`. -[Temporary tables](../../sql-reference/statements/create/table.md#temporary-tables) are visible in the `system.tables` only in those session where they have been created. They are shown with the empty `database` field and with the `is_temporary` flag switched on. +[Temporary tables](../../sql-reference/statements/create/table.md#temporary-tables) are visible in the `system.tables` only in those session where they have been created. They are shown with the empty `database` field and with the `is_temporary` flag switched on. Columns: -- `database` ([String](../../sql-reference/data-types/string.md)) — The name of the database the table is in. +- `database` ([String](../../sql-reference/data-types/string.md)) — The name of the database the table is in. -- `name` ([String](../../sql-reference/data-types/string.md)) — Table name. +- `name` ([String](../../sql-reference/data-types/string.md)) — Table name. -- `engine` ([String](../../sql-reference/data-types/string.md)) — Table engine name (without parameters). +- `engine` ([String](../../sql-reference/data-types/string.md)) — Table engine name (without parameters). -- `is_temporary` ([UInt8](../../sql-reference/data-types/int-uint.md)) - Flag that indicates whether the table is temporary. +- `is_temporary` ([UInt8](../../sql-reference/data-types/int-uint.md)) - Flag that indicates whether the table is temporary. -- `data_path` ([String](../../sql-reference/data-types/string.md)) - Path to the table data in the file system. +- `data_path` ([String](../../sql-reference/data-types/string.md)) - Path to the table data in the file system. -- `metadata_path` ([String](../../sql-reference/data-types/string.md)) - Path to the table metadata in the file system. +- `metadata_path` ([String](../../sql-reference/data-types/string.md)) - Path to the table metadata in the file system. - `metadata_modification_time` ([DateTime](../../sql-reference/data-types/datetime.md)) - Time of latest modification of the table metadata. @@ -28,33 +28,33 @@ Columns: - `create_table_query` ([String](../../sql-reference/data-types/string.md)) - The query that was used to create the table. -- `engine_full` ([String](../../sql-reference/data-types/string.md)) - Parameters of the table engine. +- `engine_full` ([String](../../sql-reference/data-types/string.md)) - Parameters of the table engine. -- `partition_key` ([String](../../sql-reference/data-types/string.md)) - The partition key expression specified in the table. +- `partition_key` ([String](../../sql-reference/data-types/string.md)) - The partition key expression specified in the table. -- `sorting_key` ([String](../../sql-reference/data-types/string.md)) - The sorting key expression specified in the table. +- `sorting_key` ([String](../../sql-reference/data-types/string.md)) - The sorting key expression specified in the table. -- `primary_key` ([String](../../sql-reference/data-types/string.md)) - The primary key expression specified in the table. +- `primary_key` ([String](../../sql-reference/data-types/string.md)) - The primary key expression specified in the table. -- `sampling_key` ([String](../../sql-reference/data-types/string.md)) - The sampling key expression specified in the table. +- `sampling_key` ([String](../../sql-reference/data-types/string.md)) - The sampling key expression specified in the table. - `storage_policy` ([String](../../sql-reference/data-types/string.md)) - The storage policy: - [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-multiple-volumes) - [Distributed](../../engines/table-engines/special/distributed.md#distributed) -- `total_rows` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) - Total number of rows, if it is possible to quickly determine exact number of rows in the table, otherwise `NULL` (including underying `Buffer` table). +- `total_rows` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) - Total number of rows, if it is possible to quickly determine exact number of rows in the table, otherwise `NULL` (including underying `Buffer` table). -- `total_bytes` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) - Total number of bytes, if it is possible to quickly determine exact number of bytes for the table on storage, otherwise `NULL` (does not includes any underlying storage). +- `total_bytes` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) - Total number of bytes, if it is possible to quickly determine exact number of bytes for the table on storage, otherwise `NULL` (does not includes any underlying storage). - If the table stores data on disk, returns used space on disk (i.e. compressed). - If the table stores data in memory, returns approximated number of used bytes in memory. -- `lifetime_rows` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) - Total number of rows INSERTed since server start (only for `Buffer` tables). +- `lifetime_rows` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) - Total number of rows INSERTed since server start (only for `Buffer` tables). -- `lifetime_bytes` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) - Total number of bytes INSERTed since server start (only for `Buffer` tables). +- `lifetime_bytes` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) - Total number of bytes INSERTed since server start (only for `Buffer` tables). -- `comment` ([String](../../sql-reference/data-types/string.md)) - The comment for the table. +- `comment` ([String](../../sql-reference/data-types/string.md)) - The comment for the table. The `system.tables` table is used in `SHOW TABLES` query implementation. diff --git a/docs/en/operations/system-tables/text_log.md b/docs/en/operations/system-tables/text_log.md index ad95e91f0d2..e97af34beec 100644 --- a/docs/en/operations/system-tables/text_log.md +++ b/docs/en/operations/system-tables/text_log.md @@ -42,12 +42,12 @@ microseconds: 871397 thread_name: clickhouse-serv thread_id: 564917 level: Information -query_id: +query_id: logger_name: DNSCacheUpdater message: Update period 15 seconds revision: 54440 source_file: /ClickHouse/src/Interpreters/DNSCacheUpdater.cpp; void DB::DNSCacheUpdater::start() source_line: 45 ``` - + [Original article](https://clickhouse.tech/docs/en/operations/system-tables/text_log) diff --git a/docs/en/operations/system-tables/trace_log.md b/docs/en/operations/system-tables/trace_log.md index 5de597a0a51..cc70b2d8236 100644 --- a/docs/en/operations/system-tables/trace_log.md +++ b/docs/en/operations/system-tables/trace_log.md @@ -49,7 +49,7 @@ timestamp_ns: 1599762189872924510 revision: 54440 trace_type: Memory thread_id: 564963 -query_id: +query_id: trace: [371912858,371912789,371798468,371799717,371801313,371790250,624462773,566365041,566440261,566445834,566460071,566459914,566459842,566459580,566459469,566459389,566459341,566455774,371993941,371988245,372158848,372187428,372187309,372187093,372185478,140222123165193,140222122205443] size: 5244400 ``` diff --git a/docs/en/operations/system-tables/users.md b/docs/en/operations/system-tables/users.md index 11fdeb1e9ae..0170c85a6d5 100644 --- a/docs/en/operations/system-tables/users.md +++ b/docs/en/operations/system-tables/users.md @@ -7,7 +7,7 @@ Columns: - `id` ([UUID](../../sql-reference/data-types/uuid.md)) — User ID. -- `storage` ([String](../../sql-reference/data-types/string.md)) — Path to the storage of users. Configured in the `access_control_path` parameter. +- `storage` ([String](../../sql-reference/data-types/string.md)) — Path to the storage of users. Configured in the `access_control_path` parameter. - `auth_type` ([Enum8](../../sql-reference/data-types/enum.md)('no_password' = 0,'plaintext_password' = 1, 'sha256_password' = 2, 'double_sha1_password' = 3)) — Shows the authentication type. There are multiple ways of user identification: with no password, with plain text password, with [SHA256](https://ru.wikipedia.org/wiki/SHA-2)-encoded password or with [double SHA-1](https://ru.wikipedia.org/wiki/SHA-1)-encoded password. diff --git a/docs/en/operations/update.md b/docs/en/operations/update.md index dbcf9ae2b3e..ffb646ffce2 100644 --- a/docs/en/operations/update.md +++ b/docs/en/operations/update.md @@ -16,12 +16,12 @@ $ sudo service clickhouse-server restart If you installed ClickHouse using something other than the recommended `deb` packages, use the appropriate update method. !!! note "Note" - You can update multiple servers at once as soon as there is no moment when all replicas of one shard are offline. + You can update multiple servers at once as soon as there is no moment when all replicas of one shard are offline. The upgrade of older version of ClickHouse to specific version: As an example: - + `xx.yy.a.b` is a current stable version. The latest stable version could be found [here](https://github.com/ClickHouse/ClickHouse/releases) ```bash diff --git a/docs/en/operations/utilities/clickhouse-benchmark.md b/docs/en/operations/utilities/clickhouse-benchmark.md index 92a96f8cd6e..5971fc0f9b3 100644 --- a/docs/en/operations/utilities/clickhouse-benchmark.md +++ b/docs/en/operations/utilities/clickhouse-benchmark.md @@ -40,7 +40,7 @@ clickhouse-benchmark [keys] < queries_file; ## Keys {#clickhouse-benchmark-keys} -- `--query=QUERY` — Query to execute. If this parameter is not passed, `clickhouse-benchmark` will read queries from standard input. +- `--query=QUERY` — Query to execute. If this parameter is not passed, `clickhouse-benchmark` will read queries from standard input. - `-c N`, `--concurrency=N` — Number of queries that `clickhouse-benchmark` sends simultaneously. Default value: 1. - `-d N`, `--delay=N` — Interval in seconds between intermediate reports (to disable reports set 0). Default value: 1. - `-h HOST`, `--host=HOST` — Server host. Default value: `localhost`. For the [comparison mode](#clickhouse-benchmark-comparison-mode) you can use multiple `-h` keys. diff --git a/docs/en/operations/utilities/clickhouse-copier.md b/docs/en/operations/utilities/clickhouse-copier.md index 056b06271ef..d9c209f2101 100644 --- a/docs/en/operations/utilities/clickhouse-copier.md +++ b/docs/en/operations/utilities/clickhouse-copier.md @@ -74,7 +74,7 @@ Parameters: source cluster & destination clusters accept exactly the same parameters as parameters for the usual Distributed table see https://clickhouse.tech/docs/en/engines/table-engines/special/distributed/ - --> + --> false diff --git a/docs/en/operations/utilities/clickhouse-format.md b/docs/en/operations/utilities/clickhouse-format.md index 17948dce82d..edba55689e7 100644 --- a/docs/en/operations/utilities/clickhouse-format.md +++ b/docs/en/operations/utilities/clickhouse-format.md @@ -18,7 +18,7 @@ Keys: - `--seed ` — Seed arbitrary string that determines the result of obfuscation. - `--backslash` — Add a backslash at the end of each line of the formatted query. Can be useful when you copy a query from web or somewhere else with multiple lines, and want to execute it in command line. -## Examples {#examples} +## Examples {#examples} 1. Highlighting and single line: @@ -32,12 +32,12 @@ Result: SELECT sum(number) FROM numbers(5) ``` -2. Multiqueries: +2. Multiqueries: ```bash $ clickhouse-format -n <<< "SELECT * FROM (SELECT 1 AS x UNION ALL SELECT 1 UNION DISTINCT SELECT 3);" ``` - + Result: ```text @@ -58,13 +58,13 @@ FROM ```bash $ clickhouse-format --seed Hello --obfuscate <<< "SELECT cost_first_screen BETWEEN a AND b, CASE WHEN x >= 123 THEN y ELSE NULL END;" ``` - + Result: ```text SELECT treasury_mammoth_hazelnut BETWEEN nutmeg AND span, CASE WHEN chive >= 116 THEN switching ELSE ANYTHING END; ``` - + Same query and another seed string: ```bash @@ -95,4 +95,4 @@ FROM \ UNION DISTINCT \ SELECT 3 \ ) -``` +``` diff --git a/docs/en/operations/utilities/clickhouse-local.md b/docs/en/operations/utilities/clickhouse-local.md index cfabf42bff1..b166e2f1b3c 100644 --- a/docs/en/operations/utilities/clickhouse-local.md +++ b/docs/en/operations/utilities/clickhouse-local.md @@ -38,7 +38,7 @@ Arguments: - `-of`, `--format`, `--output-format` — output format, `TSV` by default. - `-d`, `--database` — default database, `_local` by default. - `--stacktrace` — whether to dump debug output in case of exception. -- `--echo` — print query before execution. +- `--echo` — print query before execution. - `--verbose` — more details on query execution. - `--logger.console` — Log to console. - `--logger.log` — Log file name. diff --git a/docs/en/sql-reference/aggregate-functions/parametric-functions.md b/docs/en/sql-reference/aggregate-functions/parametric-functions.md index c77dfd6fa90..bdf115acb34 100644 --- a/docs/en/sql-reference/aggregate-functions/parametric-functions.md +++ b/docs/en/sql-reference/aggregate-functions/parametric-functions.md @@ -255,7 +255,7 @@ windowFunnel(window, [mode, [mode, ... ]])(timestamp, cond1, cond2, ..., condN) - `window` — Length of the sliding window, it is the time interval between the first and the last condition. The unit of `window` depends on the `timestamp` itself and varies. Determined using the expression `timestamp of cond1 <= timestamp of cond2 <= ... <= timestamp of condN <= timestamp of cond1 + window`. - `mode` — It is an optional argument. One or more modes can be set. - - `'strict'` — If same condition holds for sequence of events then such non-unique events would be skipped. + - `'strict'` — If same condition holds for sequence of events then such non-unique events would be skipped. - `'strict_order'` — Don't allow interventions of other events. E.g. in the case of `A->B->D->C`, it stops finding `A->B->C` at the `D` and the max event level is 2. - `'strict_increase'` — Apply conditions only to events with strictly increasing timestamps. @@ -530,7 +530,7 @@ sequenceNextNode(direction, base)(timestamp, event_column, base_condition, event - tail — Set the base point to the last event. - first_match — Set the base point to the first matched `event1`. - last_match — Set the base point to the last matched `event1`. - + **Arguments** - `timestamp` — Name of the column containing the timestamp. Data types supported: [Date](../../sql-reference/data-types/date.md), [DateTime](../../sql-reference/data-types/datetime.md#data_type-datetime) and other unsigned integer types. @@ -553,11 +553,11 @@ The query statement searching the event following A->B: ``` sql CREATE TABLE test_flow ( - dt DateTime, - id int, + dt DateTime, + id int, page String) -ENGINE = MergeTree() -PARTITION BY toYYYYMMDD(dt) +ENGINE = MergeTree() +PARTITION BY toYYYYMMDD(dt) ORDER BY id; INSERT INTO test_flow VALUES (1, 1, 'A') (2, 1, 'B') (3, 1, 'C') (4, 1, 'D') (5, 1, 'E'); @@ -585,21 +585,21 @@ INSERT INTO test_flow VALUES (1, 3, 'Gift') (2, 3, 'Home') (3, 3, 'Gift') (4, 3, ``` sql SELECT id, sequenceNextNode('forward', 'head')(dt, page, page = 'Home', page = 'Home', page = 'Gift') FROM test_flow GROUP BY id; - + dt id page 1970-01-01 09:00:01 1 Home // Base point, Matched with Home 1970-01-01 09:00:02 1 Gift // Matched with Gift - 1970-01-01 09:00:03 1 Exit // The result + 1970-01-01 09:00:03 1 Exit // The result 1970-01-01 09:00:01 2 Home // Base point, Matched with Home 1970-01-01 09:00:02 2 Home // Unmatched with Gift 1970-01-01 09:00:03 2 Gift - 1970-01-01 09:00:04 2 Basket - + 1970-01-01 09:00:04 2 Basket + 1970-01-01 09:00:01 3 Gift // Base point, Unmatched with Home - 1970-01-01 09:00:02 3 Home - 1970-01-01 09:00:03 3 Gift - 1970-01-01 09:00:04 3 Basket + 1970-01-01 09:00:02 3 Home + 1970-01-01 09:00:03 3 Gift + 1970-01-01 09:00:04 3 Basket ``` **Behavior for `backward` and `tail`** @@ -611,14 +611,14 @@ SELECT id, sequenceNextNode('backward', 'tail')(dt, page, page = 'Basket', page 1970-01-01 09:00:01 1 Home 1970-01-01 09:00:02 1 Gift 1970-01-01 09:00:03 1 Exit // Base point, Unmatched with Basket - -1970-01-01 09:00:01 2 Home -1970-01-01 09:00:02 2 Home // The result + +1970-01-01 09:00:01 2 Home +1970-01-01 09:00:02 2 Home // The result 1970-01-01 09:00:03 2 Gift // Matched with Gift 1970-01-01 09:00:04 2 Basket // Base point, Matched with Basket - + 1970-01-01 09:00:01 3 Gift -1970-01-01 09:00:02 3 Home // The result +1970-01-01 09:00:02 3 Home // The result 1970-01-01 09:00:03 3 Gift // Base point, Matched with Gift 1970-01-01 09:00:04 3 Basket // Base point, Matched with Basket ``` @@ -633,16 +633,16 @@ SELECT id, sequenceNextNode('forward', 'first_match')(dt, page, page = 'Gift', p 1970-01-01 09:00:01 1 Home 1970-01-01 09:00:02 1 Gift // Base point 1970-01-01 09:00:03 1 Exit // The result - -1970-01-01 09:00:01 2 Home -1970-01-01 09:00:02 2 Home + +1970-01-01 09:00:01 2 Home +1970-01-01 09:00:02 2 Home 1970-01-01 09:00:03 2 Gift // Base point 1970-01-01 09:00:04 2 Basket The result - + 1970-01-01 09:00:01 3 Gift // Base point 1970-01-01 09:00:02 3 Home // The result -1970-01-01 09:00:03 3 Gift -1970-01-01 09:00:04 3 Basket +1970-01-01 09:00:03 3 Gift +1970-01-01 09:00:04 3 Basket ``` ``` sql @@ -652,16 +652,16 @@ SELECT id, sequenceNextNode('forward', 'first_match')(dt, page, page = 'Gift', p 1970-01-01 09:00:01 1 Home 1970-01-01 09:00:02 1 Gift // Base point 1970-01-01 09:00:03 1 Exit // Unmatched with Home - -1970-01-01 09:00:01 2 Home -1970-01-01 09:00:02 2 Home + +1970-01-01 09:00:01 2 Home +1970-01-01 09:00:02 2 Home 1970-01-01 09:00:03 2 Gift // Base point 1970-01-01 09:00:04 2 Basket // Unmatched with Home - + 1970-01-01 09:00:01 3 Gift // Base point 1970-01-01 09:00:02 3 Home // Matched with Home 1970-01-01 09:00:03 3 Gift // The result -1970-01-01 09:00:04 3 Basket +1970-01-01 09:00:04 3 Basket ``` @@ -673,17 +673,17 @@ SELECT id, sequenceNextNode('backward', 'last_match')(dt, page, page = 'Gift', p dt id page 1970-01-01 09:00:01 1 Home // The result 1970-01-01 09:00:02 1 Gift // Base point -1970-01-01 09:00:03 1 Exit - -1970-01-01 09:00:01 2 Home +1970-01-01 09:00:03 1 Exit + +1970-01-01 09:00:01 2 Home 1970-01-01 09:00:02 2 Home // The result 1970-01-01 09:00:03 2 Gift // Base point -1970-01-01 09:00:04 2 Basket - -1970-01-01 09:00:01 3 Gift +1970-01-01 09:00:04 2 Basket + +1970-01-01 09:00:01 3 Gift 1970-01-01 09:00:02 3 Home // The result -1970-01-01 09:00:03 3 Gift // Base point -1970-01-01 09:00:04 3 Basket +1970-01-01 09:00:03 3 Gift // Base point +1970-01-01 09:00:04 3 Basket ``` ``` sql @@ -692,17 +692,17 @@ SELECT id, sequenceNextNode('backward', 'last_match')(dt, page, page = 'Gift', p dt id page 1970-01-01 09:00:01 1 Home // Matched with Home, the result is null 1970-01-01 09:00:02 1 Gift // Base point -1970-01-01 09:00:03 1 Exit - +1970-01-01 09:00:03 1 Exit + 1970-01-01 09:00:01 2 Home // The result 1970-01-01 09:00:02 2 Home // Matched with Home 1970-01-01 09:00:03 2 Gift // Base point -1970-01-01 09:00:04 2 Basket - +1970-01-01 09:00:04 2 Basket + 1970-01-01 09:00:01 3 Gift // The result 1970-01-01 09:00:02 3 Home // Matched with Home -1970-01-01 09:00:03 3 Gift // Base point -1970-01-01 09:00:04 3 Basket +1970-01-01 09:00:03 3 Gift // Base point +1970-01-01 09:00:04 3 Basket ``` @@ -726,39 +726,39 @@ INSERT INTO test_flow_basecond VALUES (1, 1, 'A', 'ref4') (2, 1, 'A', 'ref3') (3 ``` sql SELECT id, sequenceNextNode('forward', 'head')(dt, page, ref = 'ref1', page = 'A') FROM test_flow_basecond GROUP BY id; - dt id page ref + dt id page ref 1970-01-01 09:00:01 1 A ref4 // The head can not be base point because the ref column of the head unmatched with 'ref1'. - 1970-01-01 09:00:02 1 A ref3 - 1970-01-01 09:00:03 1 B ref2 - 1970-01-01 09:00:04 1 B ref1 + 1970-01-01 09:00:02 1 A ref3 + 1970-01-01 09:00:03 1 B ref2 + 1970-01-01 09:00:04 1 B ref1 ``` ``` sql SELECT id, sequenceNextNode('backward', 'tail')(dt, page, ref = 'ref4', page = 'B') FROM test_flow_basecond GROUP BY id; - dt id page ref + dt id page ref 1970-01-01 09:00:01 1 A ref4 - 1970-01-01 09:00:02 1 A ref3 - 1970-01-01 09:00:03 1 B ref2 + 1970-01-01 09:00:02 1 A ref3 + 1970-01-01 09:00:03 1 B ref2 1970-01-01 09:00:04 1 B ref1 // The tail can not be base point because the ref column of the tail unmatched with 'ref4'. ``` ``` sql SELECT id, sequenceNextNode('forward', 'first_match')(dt, page, ref = 'ref3', page = 'A') FROM test_flow_basecond GROUP BY id; - dt id page ref + dt id page ref 1970-01-01 09:00:01 1 A ref4 // This row can not be base point because the ref column unmatched with 'ref3'. 1970-01-01 09:00:02 1 A ref3 // Base point 1970-01-01 09:00:03 1 B ref2 // The result - 1970-01-01 09:00:04 1 B ref1 + 1970-01-01 09:00:04 1 B ref1 ``` ``` sql SELECT id, sequenceNextNode('backward', 'last_match')(dt, page, ref = 'ref2', page = 'B') FROM test_flow_basecond GROUP BY id; - dt id page ref + dt id page ref 1970-01-01 09:00:01 1 A ref4 1970-01-01 09:00:02 1 A ref3 // The result 1970-01-01 09:00:03 1 B ref2 // Base point - 1970-01-01 09:00:04 1 B ref1 // This row can not be base point because the ref column unmatched with 'ref2'. + 1970-01-01 09:00:04 1 B ref1 // This row can not be base point because the ref column unmatched with 'ref2'. ``` diff --git a/docs/en/sql-reference/aggregate-functions/reference/avg.md b/docs/en/sql-reference/aggregate-functions/reference/avg.md index cbd409ccab6..14a4a4c5ad5 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/avg.md +++ b/docs/en/sql-reference/aggregate-functions/reference/avg.md @@ -47,7 +47,7 @@ Query: CREATE table test (t UInt8) ENGINE = Memory; ``` -Get the arithmetic mean: +Get the arithmetic mean: Query: diff --git a/docs/en/sql-reference/aggregate-functions/reference/avgweighted.md b/docs/en/sql-reference/aggregate-functions/reference/avgweighted.md index 2df09e560b4..5f4d846e81b 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/avgweighted.md +++ b/docs/en/sql-reference/aggregate-functions/reference/avgweighted.md @@ -19,7 +19,7 @@ avgWeighted(x, weight) `x` and `weight` must both be [Integer](../../../sql-reference/data-types/int-uint.md), -[floating-point](../../../sql-reference/data-types/float.md), or +[floating-point](../../../sql-reference/data-types/float.md), or [Decimal](../../../sql-reference/data-types/decimal.md), but may have different types. diff --git a/docs/en/sql-reference/aggregate-functions/reference/deltasumtimestamp.md b/docs/en/sql-reference/aggregate-functions/reference/deltasumtimestamp.md index 241010c4761..7238f73bc0d 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/deltasumtimestamp.md +++ b/docs/en/sql-reference/aggregate-functions/reference/deltasumtimestamp.md @@ -32,7 +32,7 @@ Type: [Integer](../../data-types/int-uint.md) or [Float](../../data-types/float. Query: ```sql -SELECT deltaSumTimestamp(value, timestamp) +SELECT deltaSumTimestamp(value, timestamp) FROM (SELECT number AS timestamp, [0, 4, 8, 3, 0, 0, 0, 1, 3, 5][number] AS value FROM numbers(1, 10)); ``` diff --git a/docs/en/sql-reference/aggregate-functions/reference/grouparraysample.md b/docs/en/sql-reference/aggregate-functions/reference/grouparraysample.md index df0b8120eef..bd170ead577 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/grouparraysample.md +++ b/docs/en/sql-reference/aggregate-functions/reference/grouparraysample.md @@ -4,7 +4,7 @@ toc_priority: 114 # groupArraySample {#grouparraysample} -Creates an array of sample argument values. The size of the resulting array is limited to `max_size` elements. Argument values are selected and added to the array randomly. +Creates an array of sample argument values. The size of the resulting array is limited to `max_size` elements. Argument values are selected and added to the array randomly. **Syntax** diff --git a/docs/en/sql-reference/aggregate-functions/reference/mannwhitneyutest.md b/docs/en/sql-reference/aggregate-functions/reference/mannwhitneyutest.md index 34e8188299c..8c57a3eb896 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/mannwhitneyutest.md +++ b/docs/en/sql-reference/aggregate-functions/reference/mannwhitneyutest.md @@ -13,7 +13,7 @@ Applies the Mann-Whitney rank test to samples from two populations. mannWhitneyUTest[(alternative[, continuity_correction])](sample_data, sample_index) ``` -Values of both samples are in the `sample_data` column. If `sample_index` equals to 0 then the value in that row belongs to the sample from the first population. Otherwise it belongs to the sample from the second population. +Values of both samples are in the `sample_data` column. If `sample_index` equals to 0 then the value in that row belongs to the sample from the first population. Otherwise it belongs to the sample from the second population. The null hypothesis is that two populations are stochastically equal. Also one-sided hypothesises can be tested. This test does not assume that data have normal distribution. **Arguments** diff --git a/docs/en/sql-reference/aggregate-functions/reference/median.md b/docs/en/sql-reference/aggregate-functions/reference/median.md index 8ab2273b32e..619e9a5093e 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/median.md +++ b/docs/en/sql-reference/aggregate-functions/reference/median.md @@ -1,3 +1,7 @@ +--- +toc_priority: 212 +--- + # median {#median} The `median*` functions are the aliases for the corresponding `quantile*` functions. They calculate median of a numeric data sample. @@ -12,6 +16,7 @@ Functions: - `medianTimingWeighted` — Alias for [quantileTimingWeighted](../../../sql-reference/aggregate-functions/reference/quantiletimingweighted.md#quantiletimingweighted). - `medianTDigest` — Alias for [quantileTDigest](../../../sql-reference/aggregate-functions/reference/quantiletdigest.md#quantiletdigest). - `medianTDigestWeighted` — Alias for [quantileTDigestWeighted](../../../sql-reference/aggregate-functions/reference/quantiletdigestweighted.md#quantiletdigestweighted). +- `medianBFloat16` — Alias for [quantileBFloat16](../../../sql-reference/aggregate-functions/reference/quantilebfloat16.md#quantilebfloat16). **Example** @@ -29,7 +34,7 @@ Input table: Query: ``` sql -SELECT medianDeterministic(val, 1) FROM t +SELECT medianDeterministic(val, 1) FROM t; ``` Result: diff --git a/docs/en/sql-reference/aggregate-functions/reference/quantilebfloat16.md b/docs/en/sql-reference/aggregate-functions/reference/quantilebfloat16.md new file mode 100644 index 00000000000..25c7233aa56 --- /dev/null +++ b/docs/en/sql-reference/aggregate-functions/reference/quantilebfloat16.md @@ -0,0 +1,64 @@ +--- +toc_priority: 209 +--- + +# quantileBFloat16 {#quantilebfloat16} + +Computes an approximate [quantile](https://en.wikipedia.org/wiki/Quantile) of a sample consisting of [bfloat16](https://en.wikipedia.org/wiki/Bfloat16_floating-point_format) numbers. `bfloat16` is a floating-point data type with 1 sign bit, 8 exponent bits and 7 fraction bits. +The function converts input values to 32-bit floats and takes the most significant 16 bits. Then it calculates `bfloat16` quantile value and converts the result to a 64-bit float by appending zero bits. +The function is a fast quantile estimator with a relative error no more than 0.390625%. + +**Syntax** + +``` sql +quantileBFloat16[(level)](expr) +``` + +Alias: `medianBFloat16` + +**Arguments** + +- `expr` — Column with numeric data. [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md). + +**Parameters** + +- `level` — Level of quantile. Optional. Possible values are in the range from 0 to 1. Default value: 0.5. [Float](../../../sql-reference/data-types/float.md). + +**Returned value** + +- Approximate quantile of the specified level. + +Type: [Float64](../../../sql-reference/data-types/float.md#float32-float64). + +**Example** + +Input table has an integer and a float columns: + +``` text +┌─a─┬─────b─┐ +│ 1 │ 1.001 │ +│ 2 │ 1.002 │ +│ 3 │ 1.003 │ +│ 4 │ 1.004 │ +└───┴───────┘ +``` + +Query to calculate 0.75-quantile (third quartile): + +``` sql +SELECT quantileBFloat16(0.75)(a), quantileBFloat16(0.75)(b) FROM example_table; +``` + +Result: + +``` text +┌─quantileBFloat16(0.75)(a)─┬─quantileBFloat16(0.75)(b)─┐ +│ 3 │ 1 │ +└───────────────────────────┴───────────────────────────┘ +``` +Note that all floating point values in the example are truncated to 1.0 when converting to `bfloat16`. + +**See Also** + +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/en/sql-reference/aggregate-functions/reference/quantileexact.md b/docs/en/sql-reference/aggregate-functions/reference/quantileexact.md index 47164cec86d..bfd9d1e5a55 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/quantileexact.md +++ b/docs/en/sql-reference/aggregate-functions/reference/quantileexact.md @@ -74,7 +74,7 @@ When using multiple `quantile*` functions with different levels in a query, the **Syntax** ``` sql -quantileExact(level)(expr) +quantileExactLow(level)(expr) ``` Alias: `medianExactLow`. @@ -115,7 +115,7 @@ Similar to `quantileExact`, this computes the exact [quantile](https://en.wikipe All the passed values are combined into an array, which is then fully sorted, to get the exact value. The sorting [algorithm's](https://en.cppreference.com/w/cpp/algorithm/sort) complexity is `O(N·log(N))`, where `N = std::distance(first, last)` comparisons. -The return value depends on the quantile level and the number of elements in the selection, i.e. if the level is 0.5, then the function returns the higher median value for an even number of elements and the middle median value for an odd number of elements. Median is calculated similarly to the [median_high](https://docs.python.org/3/library/statistics.html#statistics.median_high) implementation which is used in python. For all other levels, the element at the index corresponding to the value of `level * size_of_array` is returned. +The return value depends on the quantile level and the number of elements in the selection, i.e. if the level is 0.5, then the function returns the higher median value for an even number of elements and the middle median value for an odd number of elements. Median is calculated similarly to the [median_high](https://docs.python.org/3/library/statistics.html#statistics.median_high) implementation which is used in python. For all other levels, the element at the index corresponding to the value of `level * size_of_array` is returned. This implementation behaves exactly similar to the current `quantileExact` implementation. @@ -214,7 +214,7 @@ Result: ## quantileExactInclusive {#quantileexactinclusive} -Exactly computes the [quantile](https://en.wikipedia.org/wiki/Quantile) of a numeric data sequence. +Exactly computes the [quantile](https://en.wikipedia.org/wiki/Quantile) of a numeric data sequence. To get exact value, all the passed values ​​are combined into an array, which is then partially sorted. Therefore, the function consumes `O(n)` memory, where `n` is a number of values that were passed. However, for a small number of values, the function is very effective. diff --git a/docs/en/sql-reference/aggregate-functions/reference/quantiles.md b/docs/en/sql-reference/aggregate-functions/reference/quantiles.md index 73939f16db3..9777570be83 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/quantiles.md +++ b/docs/en/sql-reference/aggregate-functions/reference/quantiles.md @@ -8,7 +8,7 @@ toc_priority: 201 Syntax: `quantiles(level1, level2, …)(x)` -All the quantile functions also have corresponding quantiles functions: `quantiles`, `quantilesDeterministic`, `quantilesTiming`, `quantilesTimingWeighted`, `quantilesExact`, `quantilesExactWeighted`, `quantilesTDigest`. These functions calculate all the quantiles of the listed levels in one pass, and return an array of the resulting values. +All the quantile functions also have corresponding quantiles functions: `quantiles`, `quantilesDeterministic`, `quantilesTiming`, `quantilesTimingWeighted`, `quantilesExact`, `quantilesExactWeighted`, `quantilesTDigest`, `quantilesBFloat16`. These functions calculate all the quantiles of the listed levels in one pass, and return an array of the resulting values. ## quantilesExactExclusive {#quantilesexactexclusive} @@ -16,9 +16,9 @@ Exactly computes the [quantiles](https://en.wikipedia.org/wiki/Quantile) of a nu To get exact value, all the passed values ​​are combined into an array, which is then partially sorted. Therefore, the function consumes `O(n)` memory, where `n` is a number of values that were passed. However, for a small number of values, the function is very effective. -This function is equivalent to [PERCENTILE.EXC](https://support.microsoft.com/en-us/office/percentile-exc-function-bbaa7204-e9e1-4010-85bf-c31dc5dce4ba) Excel function, ([type R6](https://en.wikipedia.org/wiki/Quantile#Estimating_quantiles_from_a_sample)). +This function is equivalent to [PERCENTILE.EXC](https://support.microsoft.com/en-us/office/percentile-exc-function-bbaa7204-e9e1-4010-85bf-c31dc5dce4ba) Excel function, ([type R6](https://en.wikipedia.org/wiki/Quantile#Estimating_quantiles_from_a_sample)). -Works more efficiently with sets of levels than [quantilesExactExclusive](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexactexclusive). +Works more efficiently with sets of levels than [quantileExactExclusive](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexactexclusive). **Syntax** @@ -70,7 +70,7 @@ To get exact value, all the passed values ​​are combined into an array, whic This function is equivalent to [PERCENTILE.INC](https://support.microsoft.com/en-us/office/percentile-inc-function-680f9539-45eb-410b-9a5e-c1355e5fe2ed) Excel function, ([type R7](https://en.wikipedia.org/wiki/Quantile#Estimating_quantiles_from_a_sample)). -Works more efficiently with sets of levels than [quantilesExactInclusive](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantilesexactinclusive). +Works more efficiently with sets of levels than [quantileExactInclusive](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexactinclusive). **Syntax** diff --git a/docs/en/sql-reference/aggregate-functions/reference/studentttest.md b/docs/en/sql-reference/aggregate-functions/reference/studentttest.md index 3398fc1ca8c..36f80ae6cd7 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/studentttest.md +++ b/docs/en/sql-reference/aggregate-functions/reference/studentttest.md @@ -5,7 +5,7 @@ toc_title: studentTTest # studentTTest {#studentttest} -Applies Student's t-test to samples from two populations. +Applies Student's t-test to samples from two populations. **Syntax** diff --git a/docs/en/sql-reference/aggregate-functions/reference/sumcount.md b/docs/en/sql-reference/aggregate-functions/reference/sumcount.md index b2cb2cfdc09..2986511e01a 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/sumcount.md +++ b/docs/en/sql-reference/aggregate-functions/reference/sumcount.md @@ -12,7 +12,7 @@ Calculates the sum of the numbers and counts the number of rows at the same time sumCount(x) ``` -**Arguments** +**Arguments** - `x` — Input value, must be [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md), or [Decimal](../../../sql-reference/data-types/decimal.md). diff --git a/docs/en/sql-reference/aggregate-functions/reference/sumkahan.md b/docs/en/sql-reference/aggregate-functions/reference/sumkahan.md index 1f2b07f692b..d4d47fde1fa 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/sumkahan.md +++ b/docs/en/sql-reference/aggregate-functions/reference/sumkahan.md @@ -15,13 +15,13 @@ The compensation works only for [Float](../../../sql-reference/data-types/float. sumKahan(x) ``` -**Arguments** +**Arguments** - `x` — Input value, must be [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md), or [Decimal](../../../sql-reference/data-types/decimal.md). **Returned value** -- the sum of numbers, with type [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md), or [Decimal](../../../sql-reference/data-types/decimal.md) depends on type of input arguments +- the sum of numbers, with type [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md), or [Decimal](../../../sql-reference/data-types/decimal.md) depends on type of input arguments **Example** diff --git a/docs/en/sql-reference/aggregate-functions/reference/welchttest.md b/docs/en/sql-reference/aggregate-functions/reference/welchttest.md index 02238de42ef..2c1a043aed6 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/welchttest.md +++ b/docs/en/sql-reference/aggregate-functions/reference/welchttest.md @@ -5,7 +5,7 @@ toc_title: welchTTest # welchTTest {#welchttest} -Applies Welch's t-test to samples from two populations. +Applies Welch's t-test to samples from two populations. **Syntax** diff --git a/docs/en/sql-reference/data-types/array.md b/docs/en/sql-reference/data-types/array.md index 0a92a634b6b..4e7e7390e41 100644 --- a/docs/en/sql-reference/data-types/array.md +++ b/docs/en/sql-reference/data-types/array.md @@ -45,7 +45,7 @@ SELECT [1, 2] AS x, toTypeName(x) ## Working with Data Types {#working-with-data-types} -The maximum size of an array is limited to one million elements. +The maximum size of an array is limited to one million elements. When creating an array on the fly, ClickHouse automatically defines the argument type as the narrowest data type that can store all the listed arguments. If there are any [Nullable](../../sql-reference/data-types/nullable.md#data_type-nullable) or literal [NULL](../../sql-reference/syntax.md#null-literal) values, the type of an array element also becomes [Nullable](../../sql-reference/data-types/nullable.md). diff --git a/docs/en/sql-reference/data-types/geo.md b/docs/en/sql-reference/data-types/geo.md index 50093053686..d44f86a4262 100644 --- a/docs/en/sql-reference/data-types/geo.md +++ b/docs/en/sql-reference/data-types/geo.md @@ -5,7 +5,7 @@ toc_title: Geo # Geo Data Types {#geo-data-types} -ClickHouse supports data types for representing geographical objects — locations, lands, etc. +ClickHouse supports data types for representing geographical objects — locations, lands, etc. !!! warning "Warning" Currently geo data types are an experimental feature. To work with them you must set `allow_experimental_geo_types = 1`. @@ -28,7 +28,7 @@ CREATE TABLE geo_point (p Point) ENGINE = Memory(); INSERT INTO geo_point VALUES((10, 10)); SELECT p, toTypeName(p) FROM geo_point; ``` -Result: +Result: ``` text ┌─p─────┬─toTypeName(p)─┐ @@ -50,7 +50,7 @@ CREATE TABLE geo_ring (r Ring) ENGINE = Memory(); INSERT INTO geo_ring VALUES([(0, 0), (10, 0), (10, 10), (0, 10)]); SELECT r, toTypeName(r) FROM geo_ring; ``` -Result: +Result: ``` text ┌─r─────────────────────────────┬─toTypeName(r)─┐ @@ -73,7 +73,7 @@ INSERT INTO geo_polygon VALUES([[(20, 20), (50, 20), (50, 50), (20, 50)], [(30, SELECT pg, toTypeName(pg) FROM geo_polygon; ``` -Result: +Result: ``` text ┌─pg────────────────────────────────────────────────────────────┬─toTypeName(pg)─┐ @@ -83,7 +83,7 @@ Result: ## MultiPolygon {#multipolygon-data-type} -`MultiPolygon` consists of multiple polygons and is stored as an array of polygons: [Array](array.md)([Polygon](#polygon-data-type)). +`MultiPolygon` consists of multiple polygons and is stored as an array of polygons: [Array](array.md)([Polygon](#polygon-data-type)). **Example** @@ -95,7 +95,7 @@ CREATE TABLE geo_multipolygon (mpg MultiPolygon) ENGINE = Memory(); INSERT INTO geo_multipolygon VALUES([[[(0, 0), (10, 0), (10, 10), (0, 10)]], [[(20, 20), (50, 20), (50, 50), (20, 50)],[(30, 30), (50, 50), (50, 30)]]]); SELECT mpg, toTypeName(mpg) FROM geo_multipolygon; ``` -Result: +Result: ``` text ┌─mpg─────────────────────────────────────────────────────────────────────────────────────────────┬─toTypeName(mpg)─┐ diff --git a/docs/en/sql-reference/data-types/int-uint.md b/docs/en/sql-reference/data-types/int-uint.md index f0a706b0a37..95d1120ed3d 100644 --- a/docs/en/sql-reference/data-types/int-uint.md +++ b/docs/en/sql-reference/data-types/int-uint.md @@ -7,7 +7,7 @@ toc_title: UInt8, UInt16, UInt32, UInt64, UInt256, Int8, Int16, Int32, Int64, In Fixed-length integers, with or without a sign. -When creating tables, numeric parameters for integer numbers can be set (e.g. `TINYINT(8)`, `SMALLINT(16)`, `INT(32)`, `BIGINT(64)`), but ClickHouse ignores them. +When creating tables, numeric parameters for integer numbers can be set (e.g. `TINYINT(8)`, `SMALLINT(16)`, `INT(32)`, `BIGINT(64)`), but ClickHouse ignores them. ## Int Ranges {#int-ranges} diff --git a/docs/en/sql-reference/data-types/lowcardinality.md b/docs/en/sql-reference/data-types/lowcardinality.md index 5f0f400ce43..b3ff26a943d 100644 --- a/docs/en/sql-reference/data-types/lowcardinality.md +++ b/docs/en/sql-reference/data-types/lowcardinality.md @@ -47,6 +47,7 @@ Settings: - [low_cardinality_use_single_dictionary_for_part](../../operations/settings/settings.md#low_cardinality_use_single_dictionary_for_part) - [low_cardinality_allow_in_native_format](../../operations/settings/settings.md#low_cardinality_allow_in_native_format) - [allow_suspicious_low_cardinality_types](../../operations/settings/settings.md#allow_suspicious_low_cardinality_types) +- [output_format_arrow_low_cardinality_as_dictionary](../../operations/settings/settings.md#output-format-arrow-low-cardinality-as-dictionary) Functions: @@ -57,5 +58,3 @@ Functions: - [A Magical Mystery Tour of the LowCardinality Data Type](https://www.altinity.com/blog/2019/3/27/low-cardinality). - [Reducing ClickHouse Storage Cost with the Low Cardinality Type – Lessons from an Instana Engineer](https://www.instana.com/blog/reducing-clickhouse-storage-cost-with-the-low-cardinality-type-lessons-from-an-instana-engineer/). - [String Optimization (video presentation in Russian)](https://youtu.be/rqf-ILRgBdY?list=PL0Z2YDlm0b3iwXCpEFiOOYmwXzVmjJfEt). [Slides in English](https://github.com/yandex/clickhouse-presentations/raw/master/meetup19/string_optimization.pdf). - -[Original article](https://clickhouse.tech/docs/en/sql-reference/data-types/lowcardinality/) diff --git a/docs/en/sql-reference/data-types/map.md b/docs/en/sql-reference/data-types/map.md index 86ea55004fd..bfad4375f28 100644 --- a/docs/en/sql-reference/data-types/map.md +++ b/docs/en/sql-reference/data-types/map.md @@ -5,15 +5,12 @@ toc_title: Map(key, value) # Map(key, value) {#data_type-map} -`Map(key, value)` data type stores `key:value` pairs. +`Map(key, value)` data type stores `key:value` pairs. -**Parameters** +**Parameters** -- `key` — The key part of the pair. [String](../../sql-reference/data-types/string.md) or [Integer](../../sql-reference/data-types/int-uint.md). -- `value` — The value part of the pair. [String](../../sql-reference/data-types/string.md), [Integer](../../sql-reference/data-types/int-uint.md) or [Array](../../sql-reference/data-types/array.md). - -!!! warning "Warning" - Currently `Map` data type is an experimental feature. To work with it you must set `allow_experimental_map_type = 1`. +- `key` — The key part of the pair. [String](../../sql-reference/data-types/string.md), [Integer](../../sql-reference/data-types/int-uint.md), [LowCardinality](../../sql-reference/data-types/lowcardinality.md), or [FixedString](../../sql-reference/data-types/fixedstring.md). +- `value` — The value part of the pair. [String](../../sql-reference/data-types/string.md), [Integer](../../sql-reference/data-types/int-uint.md), [Array](../../sql-reference/data-types/array.md), [LowCardinality](../../sql-reference/data-types/lowcardinality.md), or [FixedString](../../sql-reference/data-types/fixedstring.md). To get the value from an `a Map('key', 'value')` column, use `a['key']` syntax. This lookup works now with a linear complexity. @@ -26,7 +23,7 @@ CREATE TABLE table_map (a Map(String, UInt64)) ENGINE=Memory; INSERT INTO table_map VALUES ({'key1':1, 'key2':10}), ({'key1':2,'key2':20}), ({'key1':3,'key2':30}); ``` -Select all `key2` values: +Select all `key2` values: ```sql SELECT a['key2'] FROM table_map; @@ -41,7 +38,7 @@ Result: └─────────────────────────┘ ``` -If there's no such `key` in the `Map()` column, the query returns zeros for numerical values, empty strings or empty arrays. +If there's no such `key` in the `Map()` column, the query returns zeros for numerical values, empty strings or empty arrays. ```sql INSERT INTO table_map VALUES ({'key3':100}), ({}); diff --git a/docs/en/sql-reference/data-types/simpleaggregatefunction.md b/docs/en/sql-reference/data-types/simpleaggregatefunction.md index 8138d4a4103..e0d8001dcbb 100644 --- a/docs/en/sql-reference/data-types/simpleaggregatefunction.md +++ b/docs/en/sql-reference/data-types/simpleaggregatefunction.md @@ -24,7 +24,7 @@ The following aggregate functions are supported: !!! note "Note" Values of the `SimpleAggregateFunction(func, Type)` look and stored the same way as `Type`, so you do not need to apply functions with `-Merge`/`-State` suffixes. - + `SimpleAggregateFunction` has better performance than `AggregateFunction` with same aggregation function. **Parameters** diff --git a/docs/en/sql-reference/data-types/string.md b/docs/en/sql-reference/data-types/string.md index e72ce8f0b5a..2cf11ac85a3 100644 --- a/docs/en/sql-reference/data-types/string.md +++ b/docs/en/sql-reference/data-types/string.md @@ -8,13 +8,13 @@ toc_title: String Strings of an arbitrary length. The length is not limited. The value can contain an arbitrary set of bytes, including null bytes. The String type replaces the types VARCHAR, BLOB, CLOB, and others from other DBMSs. -When creating tables, numeric parameters for string fields can be set (e.g. `VARCHAR(255)`), but ClickHouse ignores them. +When creating tables, numeric parameters for string fields can be set (e.g. `VARCHAR(255)`), but ClickHouse ignores them. ## Encodings {#encodings} ClickHouse does not have the concept of encodings. Strings can contain an arbitrary set of bytes, which are stored and output as-is. If you need to store texts, we recommend using UTF-8 encoding. At the very least, if your terminal uses UTF-8 (as recommended), you can read and write your values without making conversions. Similarly, certain functions for working with strings have separate variations that work under the assumption that the string contains a set of bytes representing a UTF-8 encoded text. -For example, the ‘length’ function calculates the string length in bytes, while the ‘lengthUTF8’ function calculates the string length in Unicode code points, assuming that the value is UTF-8 encoded. +For example, the [length](../functions/string-functions.md#length) function calculates the string length in bytes, while the [lengthUTF8](../functions/string-functions.md#lengthutf8) function calculates the string length in Unicode code points, assuming that the value is UTF-8 encoded. [Original article](https://clickhouse.tech/docs/en/data_types/string/) diff --git a/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-layout.md b/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-layout.md index c69dc4224e6..ffa0fd6f29e 100644 --- a/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-layout.md +++ b/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-layout.md @@ -275,9 +275,13 @@ The dictionary is stored in a cache that has a fixed number of cells. These cell When searching for a dictionary, the cache is searched first. For each block of data, all keys that are not found in the cache or are outdated are requested from the source using `SELECT attrs... FROM db.table WHERE id IN (k1, k2, ...)`. The received data is then written to the cache. -For cache dictionaries, the expiration [lifetime](../../../sql-reference/dictionaries/external-dictionaries/external-dicts-dict-lifetime.md) of data in the cache can be set. If more time than `lifetime` has passed since loading the data in a cell, the cell’s value is not used, and it is re-requested the next time it needs to be used. +If keys are not found in dictionary, then update cache task is created and added into update queue. Update queue properties can be controlled with settings `max_update_queue_size`, `update_queue_push_timeout_milliseconds`, `query_wait_timeout_milliseconds`, `max_threads_for_updates`. + +For cache dictionaries, the expiration [lifetime](../../../sql-reference/dictionaries/external-dictionaries/external-dicts-dict-lifetime.md) of data in the cache can be set. If more time than `lifetime` has passed since loading the data in a cell, the cell’s value is not used and key becomes expired, and it is re-requested the next time it needs to be used this behaviour can be configured with setting `allow_read_expired_keys`. This is the least effective of all the ways to store dictionaries. The speed of the cache depends strongly on correct settings and the usage scenario. A cache type dictionary performs well only when the hit rates are high enough (recommended 99% and higher). You can view the average hit rate in the `system.dictionaries` table. +If setting `allow_read_expired_keys` is set to 1, by default 0. Then dictionary can support asynchronous updates. If a client requests keys and all of them are in cache, but some of them are expired, then dictionary will return expired keys for a client and request them asynchronously from the source. + To improve cache performance, use a subquery with `LIMIT`, and call the function with the dictionary externally. Supported [sources](../../../sql-reference/dictionaries/external-dictionaries/external-dicts-dict-sources.md): MySQL, ClickHouse, executable, HTTP. @@ -289,6 +293,16 @@ Example of settings: 1000000000 + + 0 + + 100000 + + 10 + + 60000 + + 4 ``` @@ -315,7 +329,7 @@ This type of storage is for use with composite [keys](../../../sql-reference/dic ### ssd_cache {#ssd-cache} -Similar to `cache`, but stores data on SSD and index in RAM. +Similar to `cache`, but stores data on SSD and index in RAM. All cache dictionary settings related to update queue can also be applied to SSD cache dictionaries. ``` xml diff --git a/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-polygon.md b/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-polygon.md index 93b9b340e89..d2a5011df98 100644 --- a/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-polygon.md +++ b/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-polygon.md @@ -1,6 +1,6 @@ --- toc_priority: 46 -toc_title: Polygon Dictionaries With Grids +toc_title: Polygon Dictionaries With Grids --- diff --git a/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-sources.md b/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-sources.md index a841bf3bc80..a1d787a37ea 100644 --- a/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-sources.md +++ b/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-sources.md @@ -129,7 +129,7 @@ That dictionary source can be configured only via XML configuration. Creating di ## Executable Pool {#dicts-external_dicts_dict_sources-executable_pool} -Executable pool allows loading data from pool of processes. This source does not work with dictionary layouts that need to load all data from source. Executable pool works if the dictionary [is stored](external-dicts-dict-layout.md#ways-to-store-dictionaries-in-memory) using `cache`, `complex_key_cache`, `ssd_cache`, `complex_key_ssd_cache`, `direct`, `complex_key_direct` layouts. +Executable pool allows loading data from pool of processes. This source does not work with dictionary layouts that need to load all data from source. Executable pool works if the dictionary [is stored](external-dicts-dict-layout.md#ways-to-store-dictionaries-in-memory) using `cache`, `complex_key_cache`, `ssd_cache`, `complex_key_ssd_cache`, `direct`, `complex_key_direct` layouts. Executable pool will spawn pool of processes with specified command and keep them running until they exit. The program should read data from STDIN while it is available and output result to STDOUT, and it can wait for next block of data on STDIN. ClickHouse will not close STDIN after processing a block of data but will pipe another chunk of data when needed. The executable script should be ready for this way of data processing — it should poll STDIN and flush data to STDOUT early. @@ -581,6 +581,7 @@ Example of settings: default ids
id=10 + 1 ``` @@ -596,7 +597,8 @@ SOURCE(CLICKHOUSE( db 'default' table 'ids' where 'id=10' -)) + secure 1 +)); ``` Setting fields: @@ -609,6 +611,7 @@ Setting fields: - `table` – Name of the table. - `where` – The selection criteria. May be omitted. - `invalidate_query` – Query for checking the dictionary status. Optional parameter. Read more in the section [Updating dictionaries](../../../sql-reference/dictionaries/external-dictionaries/external-dicts-dict-lifetime.md). +- `secure` - Use ssl for connection. ### Mongodb {#dicts-external_dicts_dict_sources-mongodb} diff --git a/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-structure.md b/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-structure.md index a7ab23da7cb..bee77a382d7 100644 --- a/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-structure.md +++ b/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-structure.md @@ -159,7 +159,7 @@ Configuration fields: | Tag | Description | Required | |------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------| | `name` | Column name. | Yes | -| `type` | ClickHouse data type: [UInt8](../../../sql-reference/data-types/int-uint.md), [UInt16](../../../sql-reference/data-types/int-uint.md), [UInt32](../../../sql-reference/data-types/int-uint.md), [UInt64](../../../sql-reference/data-types/int-uint.md), [Int8](../../../sql-reference/data-types/int-uint.md), [Int16](../../../sql-reference/data-types/int-uint.md), [Int32](../../../sql-reference/data-types/int-uint.md), [Int64](../../../sql-reference/data-types/int-uint.md), [Float32](../../../sql-reference/data-types/float.md), [Float64](../../../sql-reference/data-types/float.md), [UUID](../../../sql-reference/data-types/uuid.md), [Decimal32](../../../sql-reference/data-types/decimal.md), [Decimal64](../../../sql-reference/data-types/decimal.md), [Decimal128](../../../sql-reference/data-types/decimal.md), [Decimal256](../../../sql-reference/data-types/decimal.md), [String](../../../sql-reference/data-types/string.md).
ClickHouse tries to cast value from dictionary to the specified data type. For example, for MySQL, the field might be `TEXT`, `VARCHAR`, or `BLOB` in the MySQL source table, but it can be uploaded as `String` in ClickHouse.
[Nullable](../../../sql-reference/data-types/nullable.md) is currently supported for [Flat](external-dicts-dict-layout.md#flat), [Hashed](external-dicts-dict-layout.md#dicts-external_dicts_dict_layout-hashed), [ComplexKeyHashed](external-dicts-dict-layout.md#complex-key-hashed), [Direct](external-dicts-dict-layout.md#direct), [ComplexKeyDirect](external-dicts-dict-layout.md#complex-key-direct), [RangeHashed](external-dicts-dict-layout.md#range-hashed), [Polygon](external-dicts-dict-polygon.md), [Cache](external-dicts-dict-layout.md#cache), [ComplexKeyCache](external-dicts-dict-layout.md#complex-key-cache), [SSDCache](external-dicts-dict-layout.md#ssd-cache), [SSDComplexKeyCache](external-dicts-dict-layout.md#complex-key-ssd-cache) dictionaries. In [IPTrie](external-dicts-dict-layout.md#ip-trie) dictionaries `Nullable` types are not supported. | Yes | +| `type` | ClickHouse data type: [UInt8](../../../sql-reference/data-types/int-uint.md), [UInt16](../../../sql-reference/data-types/int-uint.md), [UInt32](../../../sql-reference/data-types/int-uint.md), [UInt64](../../../sql-reference/data-types/int-uint.md), [Int8](../../../sql-reference/data-types/int-uint.md), [Int16](../../../sql-reference/data-types/int-uint.md), [Int32](../../../sql-reference/data-types/int-uint.md), [Int64](../../../sql-reference/data-types/int-uint.md), [Float32](../../../sql-reference/data-types/float.md), [Float64](../../../sql-reference/data-types/float.md), [UUID](../../../sql-reference/data-types/uuid.md), [Decimal32](../../../sql-reference/data-types/decimal.md), [Decimal64](../../../sql-reference/data-types/decimal.md), [Decimal128](../../../sql-reference/data-types/decimal.md), [Decimal256](../../../sql-reference/data-types/decimal.md), [String](../../../sql-reference/data-types/string.md), [Array](../../../sql-reference/data-types/array.md).
ClickHouse tries to cast value from dictionary to the specified data type. For example, for MySQL, the field might be `TEXT`, `VARCHAR`, or `BLOB` in the MySQL source table, but it can be uploaded as `String` in ClickHouse.
[Nullable](../../../sql-reference/data-types/nullable.md) is currently supported for [Flat](external-dicts-dict-layout.md#flat), [Hashed](external-dicts-dict-layout.md#dicts-external_dicts_dict_layout-hashed), [ComplexKeyHashed](external-dicts-dict-layout.md#complex-key-hashed), [Direct](external-dicts-dict-layout.md#direct), [ComplexKeyDirect](external-dicts-dict-layout.md#complex-key-direct), [RangeHashed](external-dicts-dict-layout.md#range-hashed), [Polygon](external-dicts-dict-polygon.md), [Cache](external-dicts-dict-layout.md#cache), [ComplexKeyCache](external-dicts-dict-layout.md#complex-key-cache), [SSDCache](external-dicts-dict-layout.md#ssd-cache), [SSDComplexKeyCache](external-dicts-dict-layout.md#complex-key-ssd-cache) dictionaries. In [IPTrie](external-dicts-dict-layout.md#ip-trie) dictionaries `Nullable` types are not supported. | Yes | | `null_value` | Default value for a non-existing element.
In the example, it is an empty string. [NULL](../../syntax.md#null-literal) value can be used only for the `Nullable` types (see the previous line with types description). | Yes | | `expression` | [Expression](../../../sql-reference/syntax.md#syntax-expressions) that ClickHouse executes on the value.
The expression can be a column name in the remote SQL database. Thus, you can use it to create an alias for the remote column.

Default value: no expression. | No | | `hierarchical` | If `true`, the attribute contains the value of a parent key for the current key. See [Hierarchical Dictionaries](../../../sql-reference/dictionaries/external-dictionaries/external-dicts-dict-hierarchical.md).

Default value: `false`. | No | diff --git a/docs/en/sql-reference/functions/array-functions.md b/docs/en/sql-reference/functions/array-functions.md index b56d403edf6..1148edc6a58 100644 --- a/docs/en/sql-reference/functions/array-functions.md +++ b/docs/en/sql-reference/functions/array-functions.md @@ -7,19 +7,89 @@ toc_title: Arrays ## empty {#function-empty} -Returns 1 for an empty array, or 0 for a non-empty array. -The result type is UInt8. -The function also works for strings. +Checks whether the input array is empty. -Can be optimized by enabling the [optimize_functions_to_subcolumns](../../operations/settings/settings.md#optimize-functions-to-subcolumns) setting. With `optimize_functions_to_subcolumns = 1` the function reads only [size0](../../sql-reference/data-types/array.md#array-size) subcolumn instead of reading and processing the whole array column. The query `SELECT empty(arr) FROM table` transforms to `SELECT arr.size0 = 0 FROM TABLE`. +**Syntax** + +``` sql +empty([x]) +``` + +An array is considered empty if it does not contain any elements. + +!!! note "Note" + Can be optimized by enabling the [optimize_functions_to_subcolumns](../../operations/settings/settings.md#optimize-functions-to-subcolumns) setting. With `optimize_functions_to_subcolumns = 1` the function reads only [size0](../../sql-reference/data-types/array.md#array-size) subcolumn instead of reading and processing the whole array column. The query `SELECT empty(arr) FROM TABLE;` transforms to `SELECT arr.size0 = 0 FROM TABLE;`. + +The function also works for [strings](string-functions.md#empty) or [UUID](uuid-functions.md#empty). + +**Arguments** + +- `[x]` — Input array. [Array](../data-types/array.md). + +**Returned value** + +- Returns `1` for an empty array or `0` for a non-empty array. + +Type: [UInt8](../data-types/int-uint.md). + +**Example** + +Query: + +```sql +SELECT empty([]); +``` + +Result: + +```text +┌─empty(array())─┐ +│ 1 │ +└────────────────┘ +``` ## notEmpty {#function-notempty} -Returns 0 for an empty array, or 1 for a non-empty array. -The result type is UInt8. -The function also works for strings. +Checks whether the input array is non-empty. -Can be optimized by enabling the [optimize_functions_to_subcolumns](../../operations/settings/settings.md#optimize-functions-to-subcolumns) setting. With `optimize_functions_to_subcolumns = 1` the function reads only [size0](../../sql-reference/data-types/array.md#array-size) subcolumn instead of reading and processing the whole array column. The query `SELECT notEmpty(arr) FROM table` transforms to `SELECT arr.size0 != 0 FROM TABLE`. +**Syntax** + +``` sql +notEmpty([x]) +``` + +An array is considered non-empty if it contains at least one element. + +!!! note "Note" + Can be optimized by enabling the [optimize_functions_to_subcolumns](../../operations/settings/settings.md#optimize-functions-to-subcolumns) setting. With `optimize_functions_to_subcolumns = 1` the function reads only [size0](../../sql-reference/data-types/array.md#array-size) subcolumn instead of reading and processing the whole array column. The query `SELECT notEmpty(arr) FROM table` transforms to `SELECT arr.size0 != 0 FROM TABLE`. + +The function also works for [strings](string-functions.md#notempty) or [UUID](uuid-functions.md#notempty). + +**Arguments** + +- `[x]` — Input array. [Array](../data-types/array.md). + +**Returned value** + +- Returns `1` for a non-empty array or `0` for an empty array. + +Type: [UInt8](../data-types/int-uint.md). + +**Example** + +Query: + +```sql +SELECT notEmpty([1,2]); +``` + +Result: + +```text +┌─notEmpty([1, 2])─┐ +│ 1 │ +└──────────────────┘ +``` ## length {#array_functions-length} @@ -68,7 +138,7 @@ range([start, ] end [, step]) **Implementation details** - All arguments must be positive values: `start`, `end`, `step` are `UInt` data types, as well as elements of the returned array. -- An exception is thrown if query results in arrays with a total length of more than 100,000,000 elements. +- An exception is thrown if query results in arrays with a total length of more than number of elements specified by the [function_range_max_elements_in_block](../../operations/settings/settings.md#settings-function_range_max_elements_in_block) setting. **Examples** @@ -882,7 +952,7 @@ SELECT arrayEnumerateDense([10, 20, 10, 30]) ## arrayIntersect(arr) {#array-functions-arrayintersect} -Takes multiple arrays, returns an array with elements that are present in all source arrays. Elements order in the resulting array is the same as in the first array. +Takes multiple arrays, returns an array with elements that are present in all source arrays. Example: diff --git a/docs/en/sql-reference/functions/bit-functions.md b/docs/en/sql-reference/functions/bit-functions.md index 57e55a7da56..5af04f75e66 100644 --- a/docs/en/sql-reference/functions/bit-functions.md +++ b/docs/en/sql-reference/functions/bit-functions.md @@ -267,7 +267,7 @@ bitHammingDistance(int1, int2) **Returned value** -- The Hamming distance. +- The Hamming distance. Type: [UInt8](../../sql-reference/data-types/int-uint.md). diff --git a/docs/en/sql-reference/functions/bitmap-functions.md b/docs/en/sql-reference/functions/bitmap-functions.md index c695c894784..f8d1fdc69fa 100644 --- a/docs/en/sql-reference/functions/bitmap-functions.md +++ b/docs/en/sql-reference/functions/bitmap-functions.md @@ -125,6 +125,44 @@ Result: └───────────────────────────┘ ``` +## subBitmap {#subBitmap} + +Creates a subset of bitmap limit the results to `cardinality_limit` with offset of `offset`. + +**Syntax** + +``` sql +subBitmap(bitmap, offset, cardinality_limit) +``` + +**Arguments** + +- `bitmap` – [Bitmap object](#bitmap_functions-bitmapbuild). +- `offset` – the number of offsets. Type: [UInt32](../../sql-reference/data-types/int-uint.md). +- `cardinality_limit` – The subset cardinality upper limit. Type: [UInt32](../../sql-reference/data-types/int-uint.md). + +**Returned value** + +The subset. + +Type: `Bitmap object`. + +**Example** + +Query: + +``` sql +SELECT bitmapToArray(subBitmap(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,100,200,500]), toUInt32(10), toUInt32(10))) AS res; +``` + +Result: + +``` text +┌─res─────────────────────────────┐ +│ [10,11,12,13,14,15,16,17,18,19] │ +└─────────────────────────────────┘ +``` + ## bitmapContains {#bitmap_functions-bitmapcontains} Checks whether the bitmap contains an element. diff --git a/docs/en/sql-reference/functions/date-time-functions.md b/docs/en/sql-reference/functions/date-time-functions.md index 5d72bb099fe..db36a5b5637 100644 --- a/docs/en/sql-reference/functions/date-time-functions.md +++ b/docs/en/sql-reference/functions/date-time-functions.md @@ -80,6 +80,7 @@ SELECT toDateTime('2019-01-01 00:00:00', 'UTC') AS time_utc, toInt32(time_samoa) AS int32samoa FORMAT Vertical; ``` + Result: ```text @@ -1014,7 +1015,7 @@ Result: ## dateName {#dataname} -Returns part of date with specified date part. +Returns specified part of date. **Syntax** @@ -1024,13 +1025,13 @@ dateName(date_part, date) **Arguments** -- `date_part` - Date part. Possible values . -- `date` — Date [Date](../../sql-reference/data-types/date.md) or DateTime [DateTime](../../sql-reference/data-types/datetime.md), [DateTime64](../../sql-reference/data-types/datetime64.md). - +- `date_part` — Date part. Possible values: 'year', 'quarter', 'month', 'week', 'dayofyear', 'day', 'weekday', 'hour', 'minute', 'second'. [String](../../sql-reference/data-types/string.md). +- `date` — Date. [Date](../../sql-reference/data-types/date.md), [DateTime](../../sql-reference/data-types/datetime.md) or [DateTime64](../../sql-reference/data-types/datetime64.md). +- `timezone` — Timezone. Optional. [String](../../sql-reference/data-types/string.md). **Returned value** -- Specified date part of date. +- The specified part of date. Type: [String](../../sql-reference/data-types/string.md#string) diff --git a/docs/en/sql-reference/functions/encoding-functions.md b/docs/en/sql-reference/functions/encoding-functions.md index b464e070acc..c22f041e0c3 100644 --- a/docs/en/sql-reference/functions/encoding-functions.md +++ b/docs/en/sql-reference/functions/encoding-functions.md @@ -85,7 +85,7 @@ hex(arg) The function is using uppercase letters `A-F` and not using any prefixes (like `0x`) or suffixes (like `h`). -For integer arguments, it prints hex digits (“nibbles”) from the most significant to least significant (big endian or “human readable” order). It starts with the most significant non-zero byte (leading zero bytes are omitted) but always prints both digits of every byte even if leading digit is zero. +For integer arguments, it prints hex digits (“nibbles”) from the most significant to least significant (big-endian or “human-readable” order). It starts with the most significant non-zero byte (leading zero bytes are omitted) but always prints both digits of every byte even if the leading digit is zero. **Example** @@ -105,7 +105,7 @@ Values of type `Date` and `DateTime` are formatted as corresponding integers (th For `String` and `FixedString`, all bytes are simply encoded as two hexadecimal numbers. Zero bytes are not omitted. -Values of floating point and Decimal types are encoded as their representation in memory. As we support little endian architecture, they are encoded in little endian. Zero leading/trailing bytes are not omitted. +Values of floating point and Decimal types are encoded as their representation in memory. As we support little-endian architecture, they are encoded in little-endian. Zero leading/trailing bytes are not omitted. **Arguments** @@ -206,6 +206,141 @@ Result: └──────┘ ``` +## bin {#bin} + +Returns a string containing the argument’s binary representation. + +Alias: `BIN`. + +**Syntax** + +``` sql +bin(arg) +``` + +For integer arguments, it prints bin digits from the most significant to least significant (big-endian or “human-readable” order). It starts with the most significant non-zero byte (leading zero bytes are omitted) but always prints eight digits of every byte if the leading digit is zero. + +**Example** + +Query: + +``` sql +SELECT bin(1); +``` + +Result: + +``` text +00000001 +``` + +Values of type `Date` and `DateTime` are formatted as corresponding integers (the number of days since Epoch for Date and the value of Unix Timestamp for DateTime). + +For `String` and `FixedString`, all bytes are simply encoded as eight binary numbers. Zero bytes are not omitted. + +Values of floating-point and Decimal types are encoded as their representation in memory. As we support little-endian architecture, they are encoded in little-endian. Zero leading/trailing bytes are not omitted. + +**Arguments** + +- `arg` — A value to convert to binary. Types: [String](../../sql-reference/data-types/string.md), [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md), [Decimal](../../sql-reference/data-types/decimal.md), [Date](../../sql-reference/data-types/date.md) or [DateTime](../../sql-reference/data-types/datetime.md). + +**Returned value** + +- A string with the binary representation of the argument. + +Type: `String`. + +**Example** + +Query: + +``` sql +SELECT bin(toFloat32(number)) as bin_presentation FROM numbers(15, 2); +``` + +Result: + +``` text +┌─bin_presentation─────────────────┐ +│ 00000000000000000111000001000001 │ +│ 00000000000000001000000001000001 │ +└──────────────────────────────────┘ +``` + +Query: + +``` sql +SELECT bin(toFloat64(number)) as bin_presentation FROM numbers(15, 2); +``` + +Result: + +``` text +┌─bin_presentation─────────────────────────────────────────────────┐ +│ 0000000000000000000000000000000000000000000000000010111001000000 │ +│ 0000000000000000000000000000000000000000000000000011000001000000 │ +└──────────────────────────────────────────────────────────────────┘ +``` + +## unbin {#unbinstr} + +Performs the opposite operation of [bin](#bin). It interprets each pair of binary digits (in the argument) as a number and converts it to the byte represented by the number. The return value is a binary string (BLOB). + +If you want to convert the result to a number, you can use the [reverse](../../sql-reference/functions/string-functions.md#reverse) and [reinterpretAs](../../sql-reference/functions/type-conversion-functions.md#type-conversion-functions) functions. + +!!! note "Note" + If `unbin` is invoked from within the `clickhouse-client`, binary strings display using UTF-8. + +Alias: `UNBIN`. + +**Syntax** + +``` sql +unbin(arg) +``` + +**Arguments** + +- `arg` — A string containing any number of binary digits. Type: [String](../../sql-reference/data-types/string.md). + +Supports binary digits `0-1`. The number of binary digits does not have to be multiples of eight. If the argument string contains anything other than binary digits, some implementation-defined result is returned (an exception isn’t thrown). For a numeric argument the inverse of bin(N) is not performed by unbin(). + +**Returned value** + +- A binary string (BLOB). + +Type: [String](../../sql-reference/data-types/string.md). + +**Example** + +Query: + +``` sql +SELECT UNBIN('001100000011000100110010'), UNBIN('0100110101111001010100110101000101001100'); +``` + +Result: + +``` text +┌─unbin('001100000011000100110010')─┬─unbin('0100110101111001010100110101000101001100')─┐ +│ 012 │ MySQL │ +└───────────────────────────────────┴───────────────────────────────────────────────────┘ +``` + +Query: + +``` sql +SELECT reinterpretAsUInt64(reverse(unbin('1010'))) AS num; +``` + +Result: + +``` text +┌─num─┐ +│ 10 │ +└─────┘ +``` + ## UUIDStringToNum(str) {#uuidstringtonumstr} Accepts a string containing 36 characters in the format `123e4567-e89b-12d3-a456-426655440000`, and returns it as a set of bytes in a FixedString(16). @@ -224,7 +359,7 @@ Accepts an integer. Returns an array of UInt64 numbers containing the list of po ## bitPositionsToArray(num) {#bitpositionstoarraynum} -Accepts an integer, argument will be converted to unsigned integer type. Returns an array of UInt64 numbers containing the list of positions of bits that equals 1. Numbers in the array are in ascending order. +Accepts an integer and converts it to an unsigned integer. Returns an array of `UInt64` numbers containing the list of positions of bits of `arg` that equal `1`, in ascending order. **Syntax** @@ -234,11 +369,13 @@ bitPositionsToArray(arg) **Arguments** -- `arg` — Integer value.Types: [Int/UInt](../../sql-reference/data-types/int-uint.md) +- `arg` — Integer value. [Int/UInt](../../sql-reference/data-types/int-uint.md). **Returned value** -An array of UInt64 numbers containing the list of positions of bits that equals 1. Numbers in the array are in ascending order. +- An array containing a list of positions of bits that equal `1`, in ascending order. + +Type: [Array](../../sql-reference/data-types/array.md)([UInt64](../../sql-reference/data-types/int-uint.md)). **Example** diff --git a/docs/en/sql-reference/functions/encryption-functions.md b/docs/en/sql-reference/functions/encryption-functions.md index df27685dcb3..8dc59c65904 100644 --- a/docs/en/sql-reference/functions/encryption-functions.md +++ b/docs/en/sql-reference/functions/encryption-functions.md @@ -9,7 +9,7 @@ These functions implement encryption and decryption of data with AES (Advanced Key length depends on encryption mode. It is 16, 24, and 32 bytes long for `-128-`, `-196-`, and `-256-` modes respectively. -Initialization vector length is always 16 bytes (bytes in excess of 16 are ignored). +Initialization vector length is always 16 bytes (bytes in excess of 16 are ignored). Note that these functions work slowly until ClickHouse 21.1. @@ -168,7 +168,7 @@ Result: ``` text Received exception from server (version 21.1.2): -Code: 36. DB::Exception: Received from localhost:9000. DB::Exception: Invalid key size: 33 expected 32: While processing encrypt('aes-256-cfb128', 'Secret', '123456789101213141516171819202122', 'iviviviviviviviv123'). +Code: 36. DB::Exception: Received from localhost:9000. DB::Exception: Invalid key size: 33 expected 32: While processing encrypt('aes-256-cfb128', 'Secret', '123456789101213141516171819202122', 'iviviviviviviviv123'). ``` While `aes_encrypt_mysql` produces MySQL-compatitalbe output: diff --git a/docs/en/sql-reference/functions/ext-dict-functions.md b/docs/en/sql-reference/functions/ext-dict-functions.md index 7c0fe11ae64..54b72e77f01 100644 --- a/docs/en/sql-reference/functions/ext-dict-functions.md +++ b/docs/en/sql-reference/functions/ext-dict-functions.md @@ -12,7 +12,7 @@ For information on connecting and configuring external dictionaries, see [Extern ## dictGet, dictGetOrDefault, dictGetOrNull {#dictget} -Retrieves values from an external dictionary. +Retrieves values from an external dictionary. ``` sql dictGet('dict_name', attr_names, id_expr) @@ -24,7 +24,7 @@ dictGetOrNull('dict_name', attr_name, id_expr) - `dict_name` — Name of the dictionary. [String literal](../../sql-reference/syntax.md#syntax-string-literal). - `attr_names` — Name of the column of the dictionary, [String literal](../../sql-reference/syntax.md#syntax-string-literal), or tuple of column names, [Tuple](../../sql-reference/data-types/tuple.md)([String literal](../../sql-reference/syntax.md#syntax-string-literal)). -- `id_expr` — Key value. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning a [UInt64](../../sql-reference/data-types/int-uint.md) or [Tuple](../../sql-reference/data-types/tuple.md)-type value depending on the dictionary configuration. +- `id_expr` — Key value. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning dictionary key-type value or [Tuple](../../sql-reference/data-types/tuple.md)-type value depending on the dictionary configuration. - `default_value_expr` — Values returned if the dictionary does not contain a row with the `id_expr` key. [Expression](../../sql-reference/syntax.md#syntax-expressions) or [Tuple](../../sql-reference/data-types/tuple.md)([Expression](../../sql-reference/syntax.md#syntax-expressions)), returning the value (or values) in the data types configured for the `attr_names` attribute. **Returned value** @@ -87,7 +87,7 @@ SELECT dictGetOrDefault('ext-dict-test', 'c1', number + 1, toUInt32(number * 10)) AS val, toTypeName(val) AS type FROM system.numbers -LIMIT 3 +LIMIT 3; ``` ``` text @@ -138,7 +138,7 @@ Configure the external dictionary: c2 String - + 0 @@ -237,7 +237,7 @@ dictHas('dict_name', id_expr) **Arguments** - `dict_name` — Name of the dictionary. [String literal](../../sql-reference/syntax.md#syntax-string-literal). -- `id_expr` — Key value. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning a [UInt64](../../sql-reference/data-types/int-uint.md) or [Tuple](../../sql-reference/data-types/tuple.md)-type value depending on the dictionary configuration. +- `id_expr` — Key value. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning dictionary key-type value or [Tuple](../../sql-reference/data-types/tuple.md)-type value depending on the dictionary configuration. **Returned value** @@ -292,16 +292,16 @@ Type: `UInt8`. Returns first-level children as an array of indexes. It is the inverse transformation for [dictGetHierarchy](#dictgethierarchy). -**Syntax** +**Syntax** ``` sql dictGetChildren(dict_name, key) ``` -**Arguments** +**Arguments** -- `dict_name` — Name of the dictionary. [String literal](../../sql-reference/syntax.md#syntax-string-literal). -- `key` — Key value. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning a [UInt64](../../sql-reference/data-types/int-uint.md)-type value. +- `dict_name` — Name of the dictionary. [String literal](../../sql-reference/syntax.md#syntax-string-literal). +- `key` — Key value. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning a [UInt64](../../sql-reference/data-types/int-uint.md)-type value. **Returned values** @@ -339,7 +339,7 @@ SELECT dictGetChildren('hierarchy_flat_dictionary', number) FROM system.numbers ## dictGetDescendant {#dictgetdescendant} -Returns all descendants as if [dictGetChildren](#dictgetchildren) function was applied `level` times recursively. +Returns all descendants as if [dictGetChildren](#dictgetchildren) function was applied `level` times recursively. **Syntax** @@ -347,9 +347,9 @@ Returns all descendants as if [dictGetChildren](#dictgetchildren) function was a dictGetDescendants(dict_name, key, level) ``` -**Arguments** +**Arguments** -- `dict_name` — Name of the dictionary. [String literal](../../sql-reference/syntax.md#syntax-string-literal). +- `dict_name` — Name of the dictionary. [String literal](../../sql-reference/syntax.md#syntax-string-literal). - `key` — Key value. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning a [UInt64](../../sql-reference/data-types/int-uint.md)-type value. - `level` — Hierarchy level. If `level = 0` returns all descendants to the end. [UInt8](../../sql-reference/data-types/int-uint.md). diff --git a/docs/en/sql-reference/functions/functions-for-nulls.md b/docs/en/sql-reference/functions/functions-for-nulls.md index c06711b3cd2..29de9ee4b70 100644 --- a/docs/en/sql-reference/functions/functions-for-nulls.md +++ b/docs/en/sql-reference/functions/functions-for-nulls.md @@ -211,7 +211,7 @@ SELECT nullIf(1, 2); ## assumeNotNull {#assumenotnull} -Results in a value of type [Nullable](../../sql-reference/data-types/nullable.md) for a non- `Nullable`, if the value is not `NULL`. +Results in an equivalent non-`Nullable` value for a [Nullable](../../sql-reference/data-types/nullable.md) type. In case the original value is `NULL` the result is undetermined. See also `ifNull` and `coalesce` functions. ``` sql assumeNotNull(x) diff --git a/docs/en/sql-reference/functions/geo/coordinates.md b/docs/en/sql-reference/functions/geo/coordinates.md index fd1d46e48ff..2d9bb41fc27 100644 --- a/docs/en/sql-reference/functions/geo/coordinates.md +++ b/docs/en/sql-reference/functions/geo/coordinates.md @@ -41,6 +41,13 @@ SELECT greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673) └───────────────────────────────────────────────────────────────────┘ ``` +## geoDistance + +Similar to `greatCircleDistance` but calculates the distance on WGS-84 ellipsoid instead of sphere. This is more precise approximation of the Earth Geoid. +The performance is the same as for `greatCircleDistance` (no performance drawback). It is recommended to use `geoDistance` to calculate the distances on Earth. + +Technical note: for close enough points we calculate the distance using planar approximation with the metric on the tangent plane at the midpoint of the coordinates. + ## greatCircleAngle {#greatcircleangle} Calculates the central angle between two points on the Earth’s surface using [the great-circle formula](https://en.wikipedia.org/wiki/Great-circle_distance). diff --git a/docs/en/sql-reference/functions/geo/geohash.md b/docs/en/sql-reference/functions/geo/geohash.md index cfe35746809..5fbd286eba6 100644 --- a/docs/en/sql-reference/functions/geo/geohash.md +++ b/docs/en/sql-reference/functions/geo/geohash.md @@ -4,7 +4,7 @@ toc_title: Geohash # Functions for Working with Geohash {#geohash} -[Geohash](https://en.wikipedia.org/wiki/Geohash) is the geocode system, which subdivides Earth’s surface into buckets of grid shape and encodes each cell into a short string of letters and digits. It is a hierarchical data structure, so the longer is the geohash string, the more precise is the geographic location. +[Geohash](https://en.wikipedia.org/wiki/Geohash) is the geocode system, which subdivides Earth’s surface into buckets of grid shape and encodes each cell into a short string of letters and digits. It is a hierarchical data structure, so the longer is the geohash string, the more precise is the geographic location. If you need to manually convert geographic coordinates to geohash strings, you can use [geohash.org](http://geohash.org/). diff --git a/docs/en/sql-reference/functions/geo/h3.md b/docs/en/sql-reference/functions/geo/h3.md index 20dc7b29902..e178603dc45 100644 --- a/docs/en/sql-reference/functions/geo/h3.md +++ b/docs/en/sql-reference/functions/geo/h3.md @@ -4,15 +4,15 @@ toc_title: H3 Indexes # Functions for Working with H3 Indexes {#h3index} -[H3](https://eng.uber.com/h3/) is a geographical indexing system where Earth’s surface divided into a grid of even hexagonal cells. This system is hierarchical, i. e. each hexagon on the top level ("parent") can be splitted into seven even but smaller ones ("children"), and so on. +[H3](https://eng.uber.com/h3/) is a geographical indexing system where Earth’s surface divided into a grid of even hexagonal cells. This system is hierarchical, i. e. each hexagon on the top level ("parent") can be splitted into seven even but smaller ones ("children"), and so on. -The level of the hierarchy is called `resolution` and can receive a value from `0` till `15`, where `0` is the `base` level with the largest and coarsest cells. +The level of the hierarchy is called `resolution` and can receive a value from `0` till `15`, where `0` is the `base` level with the largest and coarsest cells. A latitude and longitude pair can be transformed to a 64-bit H3 index, identifying a grid cell. The H3 index is used primarily for bucketing locations and other geospatial manipulations. -The full description of the H3 system is available at [the Uber Engeneering site](https://eng.uber.com/h3/). +The full description of the H3 system is available at [the Uber Engeneering site](https://eng.uber.com/h3/). ## h3IsValid {#h3isvalid} @@ -142,7 +142,7 @@ h3EdgeLengthM(resolution) **Example** -Query: +Query: ``` sql SELECT h3EdgeLengthM(15) as edgeLengthM; @@ -195,6 +195,41 @@ Result: └────────────────────┘ ``` +## h3ToGeo {#h3togeo} + +Returns `(lon, lat)` that corresponds to the provided H3 index. + +**Syntax** + +``` sql +h3ToGeo(h3Index) +``` + +**Arguments** + +- `h3Index` — H3 Index. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). + +**Returned values** + +- `lon` — Longitude. Type: [Float64](../../../sql-reference/data-types/float.md). +- `lat` — Latitude. Type: [Float64](../../../sql-reference/data-types/float.md). + + +**Example** + +Query: + +``` sql +SELECT h3ToGeo(644325524701193974) coordinates; +``` + +Result: + +``` text +┌─coordinates───────────────────────────┐ +│ (37.79506616830252,55.71290243145668) │ +└───────────────────────────────────────┘ +``` ## h3kRing {#h3kring} Lists all the [H3](#h3index) hexagons in the raduis of `k` from the given hexagon in random order. diff --git a/docs/en/sql-reference/functions/index.md b/docs/en/sql-reference/functions/index.md index 58e0994a11d..54afd461e1d 100644 --- a/docs/en/sql-reference/functions/index.md +++ b/docs/en/sql-reference/functions/index.md @@ -48,7 +48,7 @@ Functions can’t change the values of their arguments – any changes are retur Higher-order functions can only accept lambda functions as their functional argument. To pass a lambda function to a higher-order function use `->` operator. The left side of the arrow has a formal parameter, which is any ID, or multiple formal parameters – any IDs in a tuple. The right side of the arrow has an expression that can use these formal parameters, as well as any table columns. -Examples: +Examples: ``` x -> 2 * x diff --git a/docs/en/sql-reference/functions/ip-address-functions.md b/docs/en/sql-reference/functions/ip-address-functions.md index 137ebc2407d..469a66d460f 100644 --- a/docs/en/sql-reference/functions/ip-address-functions.md +++ b/docs/en/sql-reference/functions/ip-address-functions.md @@ -53,7 +53,7 @@ Since using ‘xxx’ is highly unusual, this may be changed in the future. We r ### IPv6NumToString(x) {#ipv6numtostringx} Accepts a FixedString(16) value containing the IPv6 address in binary format. Returns a string containing this address in text format. -IPv6-mapped IPv4 addresses are output in the format ::ffff:111.222.33.44. +IPv6-mapped IPv4 addresses are output in the format ::ffff:111.222.33.44. Alias: `INET6_NTOA`. @@ -123,7 +123,7 @@ LIMIT 10 ## IPv6StringToNum {#ipv6stringtonums} -The reverse function of [IPv6NumToString](#ipv6numtostringx). If the IPv6 address has an invalid format, it returns a string of null bytes. +The reverse function of [IPv6NumToString](#ipv6numtostringx). If the IPv6 address has an invalid format, it returns a string of null bytes. If the input string contains a valid IPv4 address, returns its IPv6 equivalent. HEX can be uppercase or lowercase. @@ -136,13 +136,13 @@ Alias: `INET6_ATON`. IPv6StringToNum(string) ``` -**Argument** +**Argument** - `string` — IP address. [String](../../sql-reference/data-types/string.md). **Returned value** -- IPv6 address in binary format. +- IPv6 address in binary format. Type: [FixedString(16)](../../sql-reference/data-types/fixedstring.md). @@ -280,7 +280,7 @@ toIPv6(string) **Returned value** -- IP address. +- IP address. Type: [IPv6](../../sql-reference/data-types/domains/ipv6.md). diff --git a/docs/en/sql-reference/functions/json-functions.md b/docs/en/sql-reference/functions/json-functions.md index e731180c393..fc49d3a810d 100644 --- a/docs/en/sql-reference/functions/json-functions.md +++ b/docs/en/sql-reference/functions/json-functions.md @@ -306,3 +306,49 @@ Result: └───────────────────────────────────────────────────────────────────────────────────────────────────────┘ ``` +## toJSONString {#tojsonstring} + +Serializes a value to its JSON representation. Various data types and nested structures are supported. +64-bit [integers](../../sql-reference/data-types/int-uint.md) or bigger (like `UInt64` or `Int128`) are enclosed in quotes by default. [output_format_json_quote_64bit_integers](../../operations/settings/settings.md#session_settings-output_format_json_quote_64bit_integers) controls this behavior. +Special values `NaN` and `inf` are replaced with `null`. Enable [output_format_json_quote_denormals](../../operations/settings/settings.md#settings-output_format_json_quote_denormals) setting to show them. +When serializing an [Enum](../../sql-reference/data-types/enum.md) value, the function outputs its name. + +**Syntax** + +``` sql +toJSONString(value) +``` + +**Arguments** + +- `value` — Value to serialize. Value may be of any data type. + +**Returned value** + +- JSON representation of the value. + +Type: [String](../../sql-reference/data-types/string.md). + +**Example** + +The first example shows serialization of a [Map](../../sql-reference/data-types/map.md). +The second example shows some special values wrapped into a [Tuple](../../sql-reference/data-types/tuple.md). + +Query: + +``` sql +SELECT toJSONString(map('key1', 1, 'key2', 2)); +SELECT toJSONString(tuple(1.25, NULL, NaN, +inf, -inf, [])) SETTINGS output_format_json_quote_denormals = 1; +``` + +Result: + +``` text +{"key1":1,"key2":2} +[1.25,null,"nan","inf","-inf",[]] +``` + +**See Also** + +- [output_format_json_quote_64bit_integers](../../operations/settings/settings.md#session_settings-output_format_json_quote_64bit_integers) +- [output_format_json_quote_denormals](../../operations/settings/settings.md#settings-output_format_json_quote_denormals) diff --git a/docs/en/sql-reference/functions/logical-functions.md b/docs/en/sql-reference/functions/logical-functions.md index 6cce0e4fff5..965ed97f20c 100644 --- a/docs/en/sql-reference/functions/logical-functions.md +++ b/docs/en/sql-reference/functions/logical-functions.md @@ -5,15 +5,186 @@ toc_title: Logical # Logical Functions {#logical-functions} -Logical functions accept any numeric types, but return a UInt8 number equal to 0 or 1. +Performs logical operations on arguments of any numeric types, but returns a [UInt8](../../sql-reference/data-types/int-uint.md) number equal to 0, 1 or `NULL` in some cases. -Zero as an argument is considered “false,” while any non-zero value is considered “true”. +Zero as an argument is considered `false`, while any non-zero value is considered `true`. -## and, AND operator {#and-and-operator} +## and {#logical-and-function} -## or, OR operator {#or-or-operator} +Calculates the result of the logical conjunction between two or more values. Corresponds to [Logical AND Operator](../../sql-reference/operators/index.md#logical-and-operator). -## not, NOT operator {#not-not-operator} +**Syntax** -## xor {#xor} +``` sql +and(val1, val2...) +``` +**Arguments** + +- `val1, val2, ...` — List of at least two values. [Int](../../sql-reference/data-types/int-uint.md), [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) or [Nullable](../../sql-reference/data-types/nullable.md). + +**Returned value** + +- `0`, if there is at least one zero value argument. +- `NULL`, if there are no zero values arguments and there is at least one `NULL` argument. +- `1`, otherwise. + +Type: [UInt8](../../sql-reference/data-types/int-uint.md) or [Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md)). + +**Example** + +Query: + +``` sql +SELECT and(0, 1, -2); +``` + +Result: + +``` text +┌─and(0, 1, -2)─┐ +│ 0 │ +└───────────────┘ +``` + +With `NULL`: + +``` sql +SELECT and(NULL, 1, 10, -2); +``` + +Result: + +``` text +┌─and(NULL, 1, 10, -2)─┐ +│ ᴺᵁᴸᴸ │ +└──────────────────────┘ +``` + +## or {#logical-or-function} + +Calculates the result of the logical disjunction between two or more values. Corresponds to [Logical OR Operator](../../sql-reference/operators/index.md#logical-or-operator). + +**Syntax** + +``` sql +and(val1, val2...) +``` + +**Arguments** + +- `val1, val2, ...` — List of at least two values. [Int](../../sql-reference/data-types/int-uint.md), [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) or [Nullable](../../sql-reference/data-types/nullable.md). + +**Returned value** + +- `1`, if there is at least one non-zero value. +- `0`, if there are only zero values. +- `NULL`, if there are only zero values and `NULL`. + +Type: [UInt8](../../sql-reference/data-types/int-uint.md) or [Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md)). + +**Example** + +Query: + +``` sql +SELECT or(1, 0, 0, 2, NULL); +``` + +Result: + +``` text +┌─or(1, 0, 0, 2, NULL)─┐ +│ 1 │ +└──────────────────────┘ +``` + +With `NULL`: + +``` sql +SELECT or(0, NULL); +``` + +Result: + +``` text +┌─or(0, NULL)─┐ +│ ᴺᵁᴸᴸ │ +└─────────────┘ +``` + +## not {#logical-not-function} + +Calculates the result of the logical negation of the value. Corresponds to [Logical Negation Operator](../../sql-reference/operators/index.md#logical-negation-operator). + +**Syntax** + +``` sql +not(val); +``` + +**Arguments** + +- `val` — The value. [Int](../../sql-reference/data-types/int-uint.md), [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) or [Nullable](../../sql-reference/data-types/nullable.md). + +**Returned value** + +- `1`, if the `val` is `0`. +- `0`, if the `val` is a non-zero value. +- `NULL`, if the `val` is a `NULL` value. + +Type: [UInt8](../../sql-reference/data-types/int-uint.md) or [Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md)). + +**Example** + +Query: + +``` sql +SELECT NOT(1); +``` + +Result: + +``` test +┌─not(1)─┐ +│ 0 │ +└────────┘ +``` + +## xor {#logical-xor-function} + +Calculates the result of the logical exclusive disjunction between two or more values. For more than two values the function works as if it calculates `XOR` of the first two values and then uses the result with the next value to calculate `XOR` and so on. + +**Syntax** + +``` sql +xor(val1, val2...) +``` + +**Arguments** + +- `val1, val2, ...` — List of at least two values. [Int](../../sql-reference/data-types/int-uint.md), [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) or [Nullable](../../sql-reference/data-types/nullable.md). + +**Returned value** + +- `1`, for two values: if one of the values is zero and other is not. +- `0`, for two values: if both values are zero or non-zero at the same time. +- `NULL`, if there is at least one `NULL` value. + +Type: [UInt8](../../sql-reference/data-types/int-uint.md) or [Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md)). + +**Example** + +Query: + +``` sql +SELECT xor(0, 1, 1); +``` + +Result: + +``` text +┌─xor(0, 1, 1)─┐ +│ 0 │ +└──────────────┘ +``` diff --git a/docs/en/sql-reference/functions/machine-learning-functions.md b/docs/en/sql-reference/functions/machine-learning-functions.md index 60dabd73781..4d9322526df 100644 --- a/docs/en/sql-reference/functions/machine-learning-functions.md +++ b/docs/en/sql-reference/functions/machine-learning-functions.md @@ -21,13 +21,13 @@ The [stochasticLogisticRegression](../../sql-reference/aggregate-functions/refer Compares test groups (variants) and calculates for each group the probability to be the best one. The first group is used as a control group. -**Syntax** +**Syntax** ``` sql bayesAB(distribution_name, higher_is_better, variant_names, x, y) ``` -**Arguments** +**Arguments** - `distribution_name` — Name of the probability distribution. [String](../../sql-reference/data-types/string.md). Possible values: diff --git a/docs/en/sql-reference/functions/nlp-functions.md b/docs/en/sql-reference/functions/nlp-functions.md new file mode 100644 index 00000000000..1654771574b --- /dev/null +++ b/docs/en/sql-reference/functions/nlp-functions.md @@ -0,0 +1,132 @@ +--- +toc_priority: 67 +toc_title: NLP +--- + +# [experimental] Natural Language Processing functions {#nlp-functions} + +!!! warning "Warning" + This is an experimental feature that is currently in development and is not ready for general use. It will change in unpredictable backwards-incompatible ways in future releases. Set `allow_experimental_nlp_functions = 1` to enable it. + +## stem {#stem} + +Performs stemming on a given word. + +**Syntax** + +``` sql +stem('language', word) +``` + +**Arguments** + +- `language` — Language which rules will be applied. Must be in lowercase. [String](../../sql-reference/data-types/string.md#string). +- `word` — word that needs to be stemmed. Must be in lowercase. [String](../../sql-reference/data-types/string.md#string). + +**Examples** + +Query: + +``` sql +SELECT SELECT arrayMap(x -> stem('en', x), ['I', 'think', 'it', 'is', 'a', 'blessing', 'in', 'disguise']) as res; +``` + +Result: + +``` text +┌─res────────────────────────────────────────────────┐ +│ ['I','think','it','is','a','bless','in','disguis'] │ +└────────────────────────────────────────────────────┘ +``` + +## lemmatize {#lemmatize} + +Performs lemmatization on a given word. Needs dictionaries to operate, which can be obtained [here](https://github.com/vpodpecan/lemmagen3/tree/master/src/lemmagen3/models). + +**Syntax** + +``` sql +lemmatize('language', word) +``` + +**Arguments** + +- `language` — Language which rules will be applied. [String](../../sql-reference/data-types/string.md#string). +- `word` — Word that needs to be lemmatized. Must be lowercase. [String](../../sql-reference/data-types/string.md#string). + +**Examples** + +Query: + +``` sql +SELECT lemmatize('en', 'wolves'); +``` + +Result: + +``` text +┌─lemmatize("wolves")─┐ +│ "wolf" │ +└─────────────────────┘ +``` + +Configuration: +``` xml + + + en + en.bin + + +``` + +## synonyms {#synonyms} + +Finds synonyms to a given word. There are two types of synonym extensions: `plain` and `wordnet`. + +With the `plain` extension type we need to provide a path to a simple text file, where each line corresponds to a certain synonym set. Words in this line must be separated with space or tab characters. + +With the `wordnet` extension type we need to provide a path to a directory with WordNet thesaurus in it. Thesaurus must contain a WordNet sense index. + +**Syntax** + +``` sql +synonyms('extension_name', word) +``` + +**Arguments** + +- `extension_name` — Name of the extension in which search will be performed. [String](../../sql-reference/data-types/string.md#string). +- `word` — Word that will be searched in extension. [String](../../sql-reference/data-types/string.md#string). + +**Examples** + +Query: + +``` sql +SELECT synonyms('list', 'important'); +``` + +Result: + +``` text +┌─synonyms('list', 'important')────────────┐ +│ ['important','big','critical','crucial'] │ +└──────────────────────────────────────────┘ +``` + +Configuration: +``` xml + + + en + plain + en.txt + + + en + wordnet + en/ + + +``` diff --git a/docs/en/sql-reference/functions/other-functions.md b/docs/en/sql-reference/functions/other-functions.md index 30e2e427158..577fdd668a2 100644 --- a/docs/en/sql-reference/functions/other-functions.md +++ b/docs/en/sql-reference/functions/other-functions.md @@ -2138,3 +2138,101 @@ Result: - [tcp_port](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-tcp_port) +## currentProfiles {#current-profiles} + +Returns a list of the current [settings profiles](../../operations/access-rights.md#settings-profiles-management) for the current user. + +The command [SET PROFILE](../../sql-reference/statements/set.md#query-set) could be used to change the current setting profile. If the command `SET PROFILE` was not used the function returns the profiles specified at the current user's definition (see [CREATE USER](../../sql-reference/statements/create/user.md#create-user-statement)). + +**Syntax** + +``` sql +currentProfiles() +``` + +**Returned value** + +- List of the current user settings profiles. + +Type: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). + +## enabledProfiles {#enabled-profiles} + + Returns settings profiles, assigned to the current user both explicitly and implicitly. Explicitly assigned profiles are the same as returned by the [currentProfiles](#current-profiles) function. Implicitly assigned profiles include parent profiles of other assigned profiles, profiles assigned via granted roles, profiles assigned via their own settings, and the main default profile (see the `default_profile` section in the main server configuration file). + +**Syntax** + +``` sql +enabledProfiles() +``` + +**Returned value** + +- List of the enabled settings profiles. + +Type: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). + +## defaultProfiles {#default-profiles} + +Returns all the profiles specified at the current user's definition (see [CREATE USER](../../sql-reference/statements/create/user.md#create-user-statement) statement). + +**Syntax** + +``` sql +defaultProfiles() +``` + +**Returned value** + +- List of the default settings profiles. + +Type: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). + +## currentRoles {#current-roles} + +Returns the names of the roles which are current for the current user. The current roles can be changed by the [SET ROLE](../../sql-reference/statements/set-role.md#set-role-statement) statement. If the `SET ROLE` statement was not used, the function `currentRoles` returns the same as `defaultRoles`. + +**Syntax** + +``` sql +currentRoles() +``` + +**Returned value** + +- List of the current roles for the current user. + +Type: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). + +## enabledRoles {#enabled-roles} + +Returns the names of the current roles and the roles, granted to some of the current roles. + +**Syntax** + +``` sql +enabledRoles() +``` + +**Returned value** + +- List of the enabled roles for the current user. + +Type: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). + +## defaultRoles {#default-roles} + +Returns the names of the roles which are enabled by default for the current user when he logins. Initially these are all roles granted to the current user (see [GRANT](../../sql-reference/statements/grant/#grant-select)), but that can be changed with the [SET DEFAULT ROLE](../../sql-reference/statements/set-role.md#set-default-role-statement) statement. + +**Syntax** + +``` sql +defaultRoles() +``` + +**Returned value** + +- List of the default roles for the current user. + +Type: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). + diff --git a/docs/en/sql-reference/functions/splitting-merging-functions.md b/docs/en/sql-reference/functions/splitting-merging-functions.md index 2d384f1aa3c..718d5a977b9 100644 --- a/docs/en/sql-reference/functions/splitting-merging-functions.md +++ b/docs/en/sql-reference/functions/splitting-merging-functions.md @@ -145,6 +145,72 @@ Result: └────────────────────────────┘ ``` +## splitByWhitespace(s) {#splitbywhitespaceseparator-s} + +Splits a string into substrings separated by whitespace characters. +Returns an array of selected substrings. + +**Syntax** + +``` sql +splitByWhitespace(s) +``` + +**Arguments** + +- `s` — The string to split. [String](../../sql-reference/data-types/string.md). + +**Returned value(s)** + +Returns an array of selected substrings. + +Type: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). + +**Example** + +``` sql +SELECT splitByWhitespace(' 1! a, b. '); +``` + +``` text +┌─splitByWhitespace(' 1! a, b. ')─┐ +│ ['1!','a,','b.'] │ +└─────────────────────────────────────┘ +``` + +## splitByNonAlpha(s) {#splitbynonalphaseparator-s} + +Splits a string into substrings separated by whitespace and punctuation characters. +Returns an array of selected substrings. + +**Syntax** + +``` sql +splitByNonAlpha(s) +``` + +**Arguments** + +- `s` — The string to split. [String](../../sql-reference/data-types/string.md). + +**Returned value(s)** + +Returns an array of selected substrings. + +Type: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). + +**Example** + +``` sql +SELECT splitByNonAlpha(' 1! a, b. '); +``` + +``` text +┌─splitByNonAlpha(' 1! a, b. ')─┐ +│ ['1','a','b'] │ +└───────────────────────────────────┘ +``` + ## arrayStringConcat(arr\[, separator\]) {#arraystringconcatarr-separator} Concatenates the strings listed in the array with the separator.’separator’ is an optional parameter: a constant string, set to an empty string by default. @@ -170,13 +236,13 @@ SELECT alphaTokens('abca1abc'); Extracts all groups from non-overlapping substrings matched by a regular expression. -**Syntax** +**Syntax** ``` sql -extractAllGroups(text, regexp) +extractAllGroups(text, regexp) ``` -**Arguments** +**Arguments** - `text` — [String](../data-types/string.md) or [FixedString](../data-types/fixedstring.md). - `regexp` — Regular expression. Constant. [String](../data-types/string.md) or [FixedString](../data-types/fixedstring.md). diff --git a/docs/en/sql-reference/functions/string-functions.md b/docs/en/sql-reference/functions/string-functions.md index 5074f478bc0..c7c84c5aca6 100644 --- a/docs/en/sql-reference/functions/string-functions.md +++ b/docs/en/sql-reference/functions/string-functions.md @@ -10,16 +10,83 @@ toc_title: Strings ## empty {#empty} -Returns 1 for an empty string or 0 for a non-empty string. -The result type is UInt8. +Checks whether the input string is empty. + +**Syntax** + +``` sql +empty(x) +``` + A string is considered non-empty if it contains at least one byte, even if this is a space or a null byte. -The function also works for arrays. + +The function also works for [arrays](array-functions.md#function-empty) or [UUID](uuid-functions.md#empty). + +**Arguments** + +- `x` — Input value. [String](../data-types/string.md). + +**Returned value** + +- Returns `1` for an empty string or `0` for a non-empty string. + +Type: [UInt8](../data-types/int-uint.md). + +**Example** + +Query: + +```sql +SELECT empty(''); +``` + +Result: + +```text +┌─empty('')─┐ +│ 1 │ +└───────────┘ +``` ## notEmpty {#notempty} -Returns 0 for an empty string or 1 for a non-empty string. -The result type is UInt8. -The function also works for arrays. +Checks whether the input string is non-empty. + +**Syntax** + +``` sql +notEmpty(x) +``` + +A string is considered non-empty if it contains at least one byte, even if this is a space or a null byte. + +The function also works for [arrays](array-functions.md#function-notempty) or [UUID](uuid-functions.md#notempty). + +**Arguments** + +- `x` — Input value. [String](../data-types/string.md). + +**Returned value** + +- Returns `1` for a non-empty string or `0` for an empty string string. + +Type: [UInt8](../data-types/int-uint.md). + +**Example** + +Query: + +```sql +SELECT notEmpty('text'); +``` + +Result: + +```text +┌─notEmpty('text')─┐ +│ 1 │ +└──────────────────┘ +``` ## length {#length} @@ -42,6 +109,158 @@ The result type is UInt64. Returns the length of a string in Unicode code points (not in characters), assuming that the string contains a set of bytes that make up UTF-8 encoded text. If this assumption is not met, it returns some result (it does not throw an exception). The result type is UInt64. +## leftPad {#leftpad} + +Pads the current string from the left with spaces or a specified string (multiple times, if needed) until the resulting string reaches the given length. Similarly to the MySQL `LPAD` function. + +**Syntax** + +``` sql +leftPad('string', 'length'[, 'pad_string']) +``` + +**Arguments** + +- `string` — Input string that needs to be padded. [String](../data-types/string.md). +- `length` — The length of the resulting string. [UInt](../data-types/int-uint.md). If the value is less than the input string length, then the input string is returned as-is. +- `pad_string` — The string to pad the input string with. [String](../data-types/string.md). Optional. If not specified, then the input string is padded with spaces. + +**Returned value** + +- The resulting string of the given length. + +Type: [String](../data-types/string.md). + +**Example** + +Query: + +``` sql +SELECT leftPad('abc', 7, '*'), leftPad('def', 7); +``` + +Result: + +``` text +┌─leftPad('abc', 7, '*')─┬─leftPad('def', 7)─┐ +│ ****abc │ def │ +└────────────────────────┴───────────────────┘ +``` + +## leftPadUTF8 {#leftpadutf8} + +Pads the current string from the left with spaces or a specified string (multiple times, if needed) until the resulting string reaches the given length. Similarly to the MySQL `LPAD` function. While in the [leftPad](#leftpad) function the length is measured in bytes, here in the `leftPadUTF8` function it is measured in code points. + +**Syntax** + +``` sql +leftPadUTF8('string','length'[, 'pad_string']) +``` + +**Arguments** + +- `string` — Input string that needs to be padded. [String](../data-types/string.md). +- `length` — The length of the resulting string. [UInt](../data-types/int-uint.md). If the value is less than the input string length, then the input string is returned as-is. +- `pad_string` — The string to pad the input string with. [String](../data-types/string.md). Optional. If not specified, then the input string is padded with spaces. + +**Returned value** + +- The resulting string of the given length. + +Type: [String](../data-types/string.md). + +**Example** + +Query: + +``` sql +SELECT leftPadUTF8('абвг', 7, '*'), leftPadUTF8('дежз', 7); +``` + +Result: + +``` text +┌─leftPadUTF8('абвг', 7, '*')─┬─leftPadUTF8('дежз', 7)─┐ +│ ***абвг │ дежз │ +└─────────────────────────────┴────────────────────────┘ +``` + +## rightPad {#rightpad} + +Pads the current string from the right with spaces or a specified string (multiple times, if needed) until the resulting string reaches the given length. Similarly to the MySQL `RPAD` function. + +**Syntax** + +``` sql +rightPad('string', 'length'[, 'pad_string']) +``` + +**Arguments** + +- `string` — Input string that needs to be padded. [String](../data-types/string.md). +- `length` — The length of the resulting string. [UInt](../data-types/int-uint.md). If the value is less than the input string length, then the input string is returned as-is. +- `pad_string` — The string to pad the input string with. [String](../data-types/string.md). Optional. If not specified, then the input string is padded with spaces. + +**Returned value** + +- The resulting string of the given length. + +Type: [String](../data-types/string.md). + +**Example** + +Query: + +``` sql +SELECT rightPad('abc', 7, '*'), rightPad('abc', 7); +``` + +Result: + +``` text +┌─rightPad('abc', 7, '*')─┬─rightPad('abc', 7)─┐ +│ abc**** │ abc │ +└─────────────────────────┴────────────────────┘ +``` + +## rightPadUTF8 {#rightpadutf8} + +Pads the current string from the right with spaces or a specified string (multiple times, if needed) until the resulting string reaches the given length. Similarly to the MySQL `RPAD` function. While in the [rightPad](#rightpad) function the length is measured in bytes, here in the `rightPadUTF8` function it is measured in code points. + +**Syntax** + +``` sql +rightPadUTF8('string','length'[, 'pad_string']) +``` + +**Arguments** + +- `string` — Input string that needs to be padded. [String](../data-types/string.md). +- `length` — The length of the resulting string. [UInt](../data-types/int-uint.md). If the value is less than the input string length, then the input string is returned as-is. +- `pad_string` — The string to pad the input string with. [String](../data-types/string.md). Optional. If not specified, then the input string is padded with spaces. + +**Returned value** + +- The resulting string of the given length. + +Type: [String](../data-types/string.md). + +**Example** + +Query: + +``` sql +SELECT rightPadUTF8('абвг', 7, '*'), rightPadUTF8('абвг', 7); +``` + +Result: + +``` text +┌─rightPadUTF8('абвг', 7, '*')─┬─rightPadUTF8('абвг', 7)─┐ +│ абвг*** │ абвг │ +└──────────────────────────────┴─────────────────────────┘ +``` + ## lower, lcase {#lower} Converts ASCII Latin symbols in a string to lowercase. @@ -503,7 +722,7 @@ Replaces literals, sequences of literals and complex aliases with placeholders. normalizeQuery(x) ``` -**Arguments** +**Arguments** - `x` — Sequence of characters. [String](../../sql-reference/data-types/string.md). @@ -533,13 +752,13 @@ Result: Returns identical 64bit hash values without the values of literals for similar queries. It helps to analyze query log. -**Syntax** +**Syntax** ``` sql normalizedQueryHash(x) ``` -**Arguments** +**Arguments** - `x` — Sequence of characters. [String](../../sql-reference/data-types/string.md). @@ -571,13 +790,13 @@ Escapes characters to place string into XML text node or attribute. The following five XML predefined entities will be replaced: `<`, `&`, `>`, `"`, `'`. -**Syntax** +**Syntax** ``` sql encodeXMLComponent(x) ``` -**Arguments** +**Arguments** - `x` — The sequence of characters. [String](../../sql-reference/data-types/string.md). @@ -640,7 +859,7 @@ SELECT decodeXMLComponent('< Σ >'); Result: ``` text -'foo' +'foo' < Σ > ``` @@ -682,7 +901,7 @@ extractTextFromHTML(x) **Arguments** -- `x` — input text. [String](../../sql-reference/data-types/string.md). +- `x` — input text. [String](../../sql-reference/data-types/string.md). **Returned value** diff --git a/docs/en/sql-reference/functions/string-search-functions.md b/docs/en/sql-reference/functions/string-search-functions.md index 551c4aee8f0..d3b4fc908cc 100644 --- a/docs/en/sql-reference/functions/string-search-functions.md +++ b/docs/en/sql-reference/functions/string-search-functions.md @@ -14,7 +14,7 @@ The search is case-sensitive by default in all these functions. There are separa Searches for the substring `needle` in the string `haystack`. -Returns the position (in bytes) of the found substring in the string, starting from 1. +Returns the position (in bytes) of the found substring in the string, starting from 1. For a case-insensitive search, use the function [positionCaseInsensitive](#positioncaseinsensitive). @@ -22,11 +22,11 @@ For a case-insensitive search, use the function [positionCaseInsensitive](#posit ``` sql position(haystack, needle[, start_pos]) -``` +``` ``` sql position(needle IN haystack) -``` +``` Alias: `locate(haystack, needle[, start_pos])`. @@ -399,27 +399,27 @@ Extracts all the fragments of a string using a regular expression. If ‘haystac ## extractAllGroupsHorizontal {#extractallgroups-horizontal} -Matches all groups of the `haystack` string using the `pattern` regular expression. Returns an array of arrays, where the first array includes all fragments matching the first group, the second array - matching the second group, etc. +Matches all groups of the `haystack` string using the `pattern` regular expression. Returns an array of arrays, where the first array includes all fragments matching the first group, the second array - matching the second group, etc. !!! note "Note" `extractAllGroupsHorizontal` function is slower than [extractAllGroupsVertical](#extractallgroups-vertical). -**Syntax** +**Syntax** ``` sql extractAllGroupsHorizontal(haystack, pattern) ``` -**Arguments** +**Arguments** - `haystack` — Input string. Type: [String](../../sql-reference/data-types/string.md). -- `pattern` — Regular expression with [re2 syntax](https://github.com/google/re2/wiki/Syntax). Must contain groups, each group enclosed in parentheses. If `pattern` contains no groups, an exception is thrown. Type: [String](../../sql-reference/data-types/string.md). +- `pattern` — Regular expression with [re2 syntax](https://github.com/google/re2/wiki/Syntax). Must contain groups, each group enclosed in parentheses. If `pattern` contains no groups, an exception is thrown. Type: [String](../../sql-reference/data-types/string.md). **Returned value** - Type: [Array](../../sql-reference/data-types/array.md). -If `haystack` does not match the `pattern` regex, an array of empty arrays is returned. +If `haystack` does not match the `pattern` regex, an array of empty arrays is returned. **Example** @@ -445,13 +445,13 @@ Result: Matches all groups of the `haystack` string using the `pattern` regular expression. Returns an array of arrays, where each array includes matching fragments from every group. Fragments are grouped in order of appearance in the `haystack`. -**Syntax** +**Syntax** ``` sql extractAllGroupsVertical(haystack, pattern) ``` -**Arguments** +**Arguments** - `haystack` — Input string. Type: [String](../../sql-reference/data-types/string.md). - `pattern` — Regular expression with [re2 syntax](https://github.com/google/re2/wiki/Syntax). Must contain groups, each group enclosed in parentheses. If `pattern` contains no groups, an exception is thrown. Type: [String](../../sql-reference/data-types/string.md). @@ -460,7 +460,7 @@ extractAllGroupsVertical(haystack, pattern) - Type: [Array](../../sql-reference/data-types/array.md). -If `haystack` does not match the `pattern` regex, an empty array is returned. +If `haystack` does not match the `pattern` regex, an empty array is returned. **Example** @@ -731,7 +731,7 @@ SELECT countSubstringsCaseInsensitiveUTF8(haystack, needle[, start_pos]) Type: [UInt64](../../sql-reference/data-types/int-uint.md). -**Examples** +**Examples** Query: diff --git a/docs/en/sql-reference/functions/tuple-functions.md b/docs/en/sql-reference/functions/tuple-functions.md index 4189d0feeb5..39e59ae2ba9 100644 --- a/docs/en/sql-reference/functions/tuple-functions.md +++ b/docs/en/sql-reference/functions/tuple-functions.md @@ -87,6 +87,8 @@ Result: └───────┴───────┘ ``` +Note: the names are implementation specific and are subject to change. You should not assume specific names of the columns after application of the `untuple`. + Example of using an `EXCEPT` expression: Query: diff --git a/docs/en/sql-reference/functions/tuple-map-functions.md b/docs/en/sql-reference/functions/tuple-map-functions.md index dcfa18e04bf..ef5f5814017 100644 --- a/docs/en/sql-reference/functions/tuple-map-functions.md +++ b/docs/en/sql-reference/functions/tuple-map-functions.md @@ -9,13 +9,13 @@ toc_title: Working with maps Arranges `key:value` pairs into [Map(key, value)](../../sql-reference/data-types/map.md) data type. -**Syntax** +**Syntax** -``` sql +```sql map(key1, value1[, key2, value2, ...]) ``` -**Arguments** +**Arguments** - `key` — The key part of the pair. [String](../../sql-reference/data-types/string.md) or [Integer](../../sql-reference/data-types/int-uint.md). - `value` — The value part of the pair. [String](../../sql-reference/data-types/string.md), [Integer](../../sql-reference/data-types/int-uint.md) or [Array](../../sql-reference/data-types/array.md). @@ -30,7 +30,7 @@ Type: [Map(key, value)](../../sql-reference/data-types/map.md). Query: -``` sql +```sql SELECT map('key1', number, 'key2', number * 2) FROM numbers(3); ``` @@ -46,7 +46,7 @@ Result: Query: -``` sql +```sql CREATE TABLE table_map (a Map(String, UInt64)) ENGINE = MergeTree() ORDER BY a; INSERT INTO table_map SELECT map('key1', number, 'key2', number * 2) FROM numbers(3); SELECT a['key2'] FROM table_map; @@ -54,7 +54,7 @@ SELECT a['key2'] FROM table_map; Result: -``` text +```text ┌─arrayElement(a, 'key2')─┐ │ 0 │ │ 2 │ @@ -62,7 +62,7 @@ Result: └─────────────────────────┘ ``` -**See Also** +**See Also** - [Map(key, value)](../../sql-reference/data-types/map.md) data type @@ -72,7 +72,7 @@ Collect all the keys and sum corresponding values. **Syntax** -``` sql +```sql mapAdd(arg1, arg2 [, ...]) ``` @@ -88,13 +88,13 @@ Arguments are [maps](../../sql-reference/data-types/map.md) or [tuples](../../sq Query with a tuple map: -``` sql +```sql SELECT mapAdd(([toUInt8(1), 2], [1, 1]), ([toUInt8(1), 2], [1, 1])) as res, toTypeName(res) as type; ``` Result: -``` text +```text ┌─res───────────┬─type───────────────────────────────┐ │ ([1,2],[2,2]) │ Tuple(Array(UInt8), Array(UInt64)) │ └───────────────┴────────────────────────────────────┘ @@ -102,30 +102,39 @@ Result: Query with `Map` type: -``` sql +```sql +SELECT mapAdd(map(1,1), map(1,1)); +``` + +Result: + +```text +┌─mapAdd(map(1, 1), map(1, 1))─┐ +│ {1:2} │ +└──────────────────────────────┘ ``` ## mapSubtract {#function-mapsubtract} Collect all the keys and subtract corresponding values. -**Syntax** +**Syntax** -``` sql +```sql mapSubtract(Tuple(Array, Array), Tuple(Array, Array) [, ...]) ``` -**Arguments** +**Arguments** -Arguments are [tuples](../../sql-reference/data-types/tuple.md#tuplet1-t2) of two [arrays](../../sql-reference/data-types/array.md#data-type-array), where items in the first array represent keys, and the second array contains values for the each key. All key arrays should have same type, and all value arrays should contain items which are promote to the one type ([Int64](../../sql-reference/data-types/int-uint.md#int-ranges), [UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges) or [Float64](../../sql-reference/data-types/float.md#float32-float64)). The common promoted type is used as a type for the result array. +Arguments are [maps](../../sql-reference/data-types/map.md) or [tuples](../../sql-reference/data-types/tuple.md#tuplet1-t2) of two [arrays](../../sql-reference/data-types/array.md#data-type-array), where items in the first array represent keys, and the second array contains values for the each key. All key arrays should have same type, and all value arrays should contain items which are promote to the one type ([Int64](../../sql-reference/data-types/int-uint.md#int-ranges), [UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges) or [Float64](../../sql-reference/data-types/float.md#float32-float64)). The common promoted type is used as a type for the result array. **Returned value** -- Returns one [tuple](../../sql-reference/data-types/tuple.md#tuplet1-t2), where the first array contains the sorted keys and the second array contains values. +- Depending on the arguments returns one [map](../../sql-reference/data-types/map.md) or [tuple](../../sql-reference/data-types/tuple.md#tuplet1-t2), where the first array contains the sorted keys and the second array contains values. **Example** -Query: +Query with a tuple map: ```sql SELECT mapSubtract(([toUInt8(1), 2], [toInt32(1), 1]), ([toUInt8(1), 2], [toInt32(2), 1])) as res, toTypeName(res) as type; @@ -139,32 +148,54 @@ Result: └────────────────┴───────────────────────────────────┘ ``` +Query with `Map` type: + +```sql +SELECT mapSubtract(map(1,1), map(1,1)); +``` + +Result: + +```text +┌─mapSubtract(map(1, 1), map(1, 1))─┐ +│ {1:0} │ +└───────────────────────────────────┘ +``` + ## mapPopulateSeries {#function-mappopulateseries} Fills missing keys in the maps (key and value array pair), where keys are integers. Also, it supports specifying the max key, which is used to extend the keys array. +Arguments are [maps](../../sql-reference/data-types/map.md) or two [arrays](../../sql-reference/data-types/array.md#data-type-array), where the first array represent keys, and the second array contains values for the each key. -**Syntax** +For array arguments the number of elements in `keys` and `values` must be the same for each row. -``` sql +**Syntax** + +```sql mapPopulateSeries(keys, values[, max]) +mapPopulateSeries(map[, max]) ``` -Generates a map, where keys are a series of numbers, from minimum to maximum keys (or `max` argument if it specified) taken from `keys` array with a step size of one, and corresponding values taken from `values` array. If the value is not specified for the key, then it uses the default value in the resulting map. For repeated keys, only the first value (in order of appearing) gets associated with the key. - -The number of elements in `keys` and `values` must be the same for each row. +Generates a map (a tuple with two arrays or a value of `Map` type, depending on the arguments), where keys are a series of numbers, from minimum to maximum keys (or `max` argument if it specified) taken from the map with a step size of one, and corresponding values. If the value is not specified for the key, then it uses the default value in the resulting map. For repeated keys, only the first value (in order of appearing) gets associated with the key. **Arguments** +Mapped arrays: + - `keys` — Array of keys. [Array](../../sql-reference/data-types/array.md#data-type-array)([Int](../../sql-reference/data-types/int-uint.md#uint-ranges)). - `values` — Array of values. [Array](../../sql-reference/data-types/array.md#data-type-array)([Int](../../sql-reference/data-types/int-uint.md#uint-ranges)). +or + +- `map` — Map with integer keys. [Map](../../sql-reference/data-types/map.md). + **Returned value** -- Returns a [tuple](../../sql-reference/data-types/tuple.md#tuplet1-t2) of two [arrays](../../sql-reference/data-types/array.md#data-type-array): keys in sorted order, and values the corresponding keys. +- Depending on the arguments returns a [map](../../sql-reference/data-types/map.md) or a [tuple](../../sql-reference/data-types/tuple.md#tuplet1-t2) of two [arrays](../../sql-reference/data-types/array.md#data-type-array): keys in sorted order, and values the corresponding keys. **Example** -Query: +Query with mapped arrays: ```sql select mapPopulateSeries([1,2,4], [11,22,44], 5) as res, toTypeName(res) as type; @@ -178,17 +209,31 @@ Result: └──────────────────────────────┴───────────────────────────────────┘ ``` +Query with `Map` type: + +```sql +SELECT mapPopulateSeries(map(1, 10, 5, 20), 6); +``` + +Result: + +```text +┌─mapPopulateSeries(map(1, 10, 5, 20), 6)─┐ +│ {1:10,2:0,3:0,4:0,5:20,6:0} │ +└─────────────────────────────────────────┘ +``` + ## mapContains {#mapcontains} Determines whether the `map` contains the `key` parameter. **Syntax** -``` sql +```sql mapContains(map, key) ``` -**Parameters** +**Parameters** - `map` — Map. [Map](../../sql-reference/data-types/map.md). - `key` — Key. Type matches the type of keys of `map` parameter. diff --git a/docs/en/sql-reference/functions/type-conversion-functions.md b/docs/en/sql-reference/functions/type-conversion-functions.md index 661469e6901..efd28def688 100644 --- a/docs/en/sql-reference/functions/type-conversion-functions.md +++ b/docs/en/sql-reference/functions/type-conversion-functions.md @@ -373,7 +373,7 @@ This function accepts a number or date or date with time, and returns a FixedStr ## reinterpretAsUUID {#reinterpretasuuid} -Accepts 16 bytes string and returns UUID containing bytes representing the corresponding value in network byte order (big-endian). If the string isn't long enough, the function works as if the string is padded with the necessary number of null bytes to the end. If the string longer than 16 bytes, the extra bytes at the end are ignored. +Accepts 16 bytes string and returns UUID containing bytes representing the corresponding value in network byte order (big-endian). If the string isn't long enough, the function works as if the string is padded with the necessary number of null bytes to the end. If the string longer than 16 bytes, the extra bytes at the end are ignored. **Syntax** @@ -439,8 +439,8 @@ reinterpret(x, type) **Arguments** -- `x` — Any type. -- `type` — Destination type. [String](../../sql-reference/data-types/string.md). +- `x` — Any type. +- `type` — Destination type. [String](../../sql-reference/data-types/string.md). **Returned value** @@ -465,27 +465,29 @@ Result: ## CAST(x, T) {#type_conversion_function-cast} -Converts input value `x` to the `T` data type. Unlike to `reinterpret` function, type conversion is performed in a natural way. - -The syntax `CAST(x AS t)` is also supported. - -!!! note "Note" - If value `x` does not fit the bounds of type `T`, the function overflows. For example, `CAST(-1, 'UInt8')` returns `255`. +Converts an input value to the specified data type. Unlike the [reinterpret](#type_conversion_function-reinterpret) function, `CAST` tries to present the same value using the new data type. If the conversion can not be done then an exception is raised. +Several syntax variants are supported. **Syntax** ``` sql CAST(x, T) +CAST(x AS t) +x::t ``` **Arguments** -- `x` — Any type. -- `T` — Destination type. [String](../../sql-reference/data-types/string.md). +- `x` — A value to convert. May be of any type. +- `T` — The name of the target data type. [String](../../sql-reference/data-types/string.md). +- `t` — The target data type. **Returned value** -- Destination type value. +- Converted value. + +!!! note "Note" + If the input value does not fit the bounds of the target type, the result overflows. For example, `CAST(-1, 'UInt8')` returns `255`. **Examples** @@ -494,16 +496,16 @@ Query: ```sql SELECT CAST(toInt8(-1), 'UInt8') AS cast_int_to_uint, - CAST(toInt8(1), 'Float32') AS cast_int_to_float, - CAST('1', 'UInt32') AS cast_string_to_int; + CAST(1.5 AS Decimal(3,2)) AS cast_float_to_decimal, + '1'::Int32 AS cast_string_to_int; ``` Result: ``` -┌─cast_int_to_uint─┬─cast_int_to_float─┬─cast_string_to_int─┐ -│ 255 │ 1 │ 1 │ -└──────────────────┴───────────────────┴────────────────────┘ +┌─cast_int_to_uint─┬─cast_float_to_decimal─┬─cast_string_to_int─┐ +│ 255 │ 1.50 │ 1 │ +└──────────────────┴───────────────────────┴────────────────────┘ ``` Query: @@ -527,7 +529,7 @@ Result: Conversion to FixedString(N) only works for arguments of type [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). -Type conversion to [Nullable](../../sql-reference/data-types/nullable.md) and back is supported. +Type conversion to [Nullable](../../sql-reference/data-types/nullable.md) and back is supported. **Example** @@ -567,7 +569,7 @@ Result: ## accurateCast(x, T) {#type_conversion_function-accurate-cast} -Converts `x` to the `T` data type. +Converts `x` to the `T` data type. The difference from [cast(x, T)](#type_conversion_function-cast) is that `accurateCast` does not allow overflow of numeric types during cast if type value `x` does not fit the bounds of type `T`. For example, `accurateCast(-1, 'UInt8')` throws an exception. @@ -1168,7 +1170,7 @@ Result: ## toUnixTimestamp64Nano {#tounixtimestamp64nano} -Converts a `DateTime64` to a `Int64` value with fixed sub-second precision. Input value is scaled up or down appropriately depending on it precision. +Converts a `DateTime64` to a `Int64` value with fixed sub-second precision. Input value is scaled up or down appropriately depending on it precision. !!! info "Note" The output value is a timestamp in UTC, not in the timezone of `DateTime64`. @@ -1204,7 +1206,7 @@ Result: └──────────────────────────────┘ ``` -Query: +Query: ``` sql WITH toDateTime64('2019-09-16 19:20:12.345678910', 6) AS dt64 diff --git a/docs/en/sql-reference/functions/url-functions.md b/docs/en/sql-reference/functions/url-functions.md index 397ae45ec71..ae2113a2b64 100644 --- a/docs/en/sql-reference/functions/url-functions.md +++ b/docs/en/sql-reference/functions/url-functions.md @@ -283,7 +283,7 @@ SELECT firstSignificantSubdomainCustom('bar.foo.there-is-no-such-domain', 'publi Result: -```text +```text ┌─firstSignificantSubdomainCustom('bar.foo.there-is-no-such-domain', 'public_suffix_list')─┐ │ foo │ └──────────────────────────────────────────────────────────────────────────────────────────┘ diff --git a/docs/en/sql-reference/functions/uuid-functions.md b/docs/en/sql-reference/functions/uuid-functions.md index e7e55c699cd..e5ab45bda40 100644 --- a/docs/en/sql-reference/functions/uuid-functions.md +++ b/docs/en/sql-reference/functions/uuid-functions.md @@ -9,7 +9,7 @@ The functions for working with UUID are listed below. ## generateUUIDv4 {#uuid-function-generate} -Generates the [UUID](../../sql-reference/data-types/uuid.md) of [version 4](https://tools.ietf.org/html/rfc4122#section-4.4). +Generates the [UUID](../data-types/uuid.md) of [version 4](https://tools.ietf.org/html/rfc4122#section-4.4). ``` sql generateUUIDv4() @@ -37,6 +37,90 @@ SELECT * FROM t_uuid └──────────────────────────────────────┘ ``` +## empty {#empty} + +Checks whether the input UUID is empty. + +**Syntax** + +```sql +empty(UUID) +``` + +The UUID is considered empty if it contains all zeros (zero UUID). + +The function also works for [arrays](array-functions.md#function-empty) or [strings](string-functions.md#empty). + +**Arguments** + +- `x` — Input UUID. [UUID](../data-types/uuid.md). + +**Returned value** + +- Returns `1` for an empty UUID or `0` for a non-empty UUID. + +Type: [UInt8](../data-types/int-uint.md). + +**Example** + +To generate the UUID value, ClickHouse provides the [generateUUIDv4](#uuid-function-generate) function. + +Query: + +```sql +SELECT empty(generateUUIDv4()); +``` + +Result: + +```text +┌─empty(generateUUIDv4())─┐ +│ 0 │ +└─────────────────────────┘ +``` + +## notEmpty {#notempty} + +Checks whether the input UUID is non-empty. + +**Syntax** + +```sql +notEmpty(UUID) +``` + +The UUID is considered empty if it contains all zeros (zero UUID). + +The function also works for [arrays](array-functions.md#function-notempty) or [strings](string-functions.md#notempty). + +**Arguments** + +- `x` — Input UUID. [UUID](../data-types/uuid.md). + +**Returned value** + +- Returns `1` for a non-empty UUID or `0` for an empty UUID. + +Type: [UInt8](../data-types/int-uint.md). + +**Example** + +To generate the UUID value, ClickHouse provides the [generateUUIDv4](#uuid-function-generate) function. + +Query: + +```sql +SELECT notEmpty(generateUUIDv4()); +``` + +Result: + +```text +┌─notEmpty(generateUUIDv4())─┐ +│ 1 │ +└────────────────────────────┘ +``` + ## toUUID (x) {#touuid-x} Converts String type value to UUID type. diff --git a/docs/en/sql-reference/operators/index.md b/docs/en/sql-reference/operators/index.md index f5158cf9ffb..dbda5f5dd69 100644 --- a/docs/en/sql-reference/operators/index.md +++ b/docs/en/sql-reference/operators/index.md @@ -211,17 +211,17 @@ SELECT toDateTime('2014-10-26 00:00:00', 'Europe/Moscow') AS time, time + 60 * 6 - [Interval](../../sql-reference/data-types/special-data-types/interval.md) data type - [toInterval](../../sql-reference/functions/type-conversion-functions.md#function-tointerval) type conversion functions -## Logical Negation Operator {#logical-negation-operator} - -`NOT a` – The `not(a)` function. - ## Logical AND Operator {#logical-and-operator} -`a AND b` – The`and(a, b)` function. +Syntax `SELECT a AND b` — calculates logical conjunction of `a` and `b` with the function [and](../../sql-reference/functions/logical-functions.md#logical-and-function). ## Logical OR Operator {#logical-or-operator} -`a OR b` – The `or(a, b)` function. +Syntax `SELECT a OR b` — calculates logical disjunction of `a` and `b` with the function [or](../../sql-reference/functions/logical-functions.md#logical-or-function). + +## Logical Negation Operator {#logical-negation-operator} + +Syntax `SELECT NOT a` — calculates logical negation of `a` with the function [not](../../sql-reference/functions/logical-functions.md#logical-not-function). ## Conditional Operator {#conditional-operator} diff --git a/docs/en/sql-reference/statements/alter/column.md b/docs/en/sql-reference/statements/alter/column.md index 2e7cd1be952..801690afbb2 100644 --- a/docs/en/sql-reference/statements/alter/column.md +++ b/docs/en/sql-reference/statements/alter/column.md @@ -20,12 +20,11 @@ The following actions are supported: - [ADD COLUMN](#alter_add-column) — Adds a new column to the table. - [DROP COLUMN](#alter_drop-column) — Deletes the column. -- [RENAME COLUMN](#alter_rename-column) — Renames the column. +- [RENAME COLUMN](#alter_rename-column) — Renames an existing column. - [CLEAR COLUMN](#alter_clear-column) — Resets column values. - [COMMENT COLUMN](#alter_comment-column) — Adds a text comment to the column. - [MODIFY COLUMN](#alter_modify-column) — Changes column’s type, default expression and TTL. - [MODIFY COLUMN REMOVE](#modify-remove) — Removes one of the column properties. -- [RENAME COLUMN](#alter_rename-column) — Renames an existing column. These actions are described in detail below. @@ -35,7 +34,7 @@ These actions are described in detail below. ADD COLUMN [IF NOT EXISTS] name [type] [default_expr] [codec] [AFTER name_after | FIRST] ``` -Adds a new column to the table with the specified `name`, `type`, [`codec`](../../../sql-reference/statements/create/table.md#codecs) and `default_expr` (see the section [Default expressions](../../../sql-reference/statements/create/table.md#create-default-values)). +Adds a new column to the table with the specified `name`, `type`, [`codec`](../create/table.md#codecs) and `default_expr` (see the section [Default expressions](../../../sql-reference/statements/create/table.md#create-default-values)). If the `IF NOT EXISTS` clause is included, the query won’t return an error if the column already exists. If you specify `AFTER name_after` (the name of another column), the column is added after the specified one in the list of table columns. If you want to add a column to the beginning of the table use the `FIRST` clause. Otherwise, the column is added to the end of the table. For a chain of actions, `name_after` can be the name of a column that is added in one of the previous actions. @@ -64,6 +63,7 @@ Added2 UInt32 ToDrop UInt32 Added3 UInt32 ``` + ## DROP COLUMN {#alter_drop-column} ``` sql @@ -91,7 +91,7 @@ RENAME COLUMN [IF EXISTS] name to new_name Renames the column `name` to `new_name`. If the `IF EXISTS` clause is specified, the query won’t return an error if the column does not exist. Since renaming does not involve the underlying data, the query is completed almost instantly. -**NOTE**: Columns specified in the key expression of the table (either with `ORDER BY` or `PRIMARY KEY`) cannot be renamed. Trying to change these columns will produce `SQL Error [524]`. +**NOTE**: Columns specified in the key expression of the table (either with `ORDER BY` or `PRIMARY KEY`) cannot be renamed. Trying to change these columns will produce `SQL Error [524]`. Example: @@ -118,7 +118,7 @@ ALTER TABLE visits CLEAR COLUMN browser IN PARTITION tuple() ## COMMENT COLUMN {#alter_comment-column} ``` sql -COMMENT COLUMN [IF EXISTS] name 'comment' +COMMENT COLUMN [IF EXISTS] name 'Text comment' ``` Adds a comment to the column. If the `IF EXISTS` clause is specified, the query won’t return an error if the column does not exist. @@ -136,7 +136,7 @@ ALTER TABLE visits COMMENT COLUMN browser 'The table shows the browser used for ## MODIFY COLUMN {#alter_modify-column} ``` sql -MODIFY COLUMN [IF EXISTS] name [type] [default_expr] [TTL] [AFTER name_after | FIRST] +MODIFY COLUMN [IF EXISTS] name [type] [default_expr] [codec] [TTL] [AFTER name_after | FIRST] ``` This query changes the `name` column properties: @@ -145,8 +145,12 @@ This query changes the `name` column properties: - Default expression +- Compression Codec + - TTL +For examples of columns compression CODECS modifying, see [Column Compression Codecs](../create/table.md#codecs). + For examples of columns TTL modifying, see [Column TTL](../../../engines/table-engines/mergetree-family/mergetree.md#mergetree-column-ttl). If the `IF EXISTS` clause is specified, the query won’t return an error if the column does not exist. @@ -179,6 +183,8 @@ ALTER TABLE table_name MODIFY column_name REMOVE property; **Example** +Remove TTL: + ```sql ALTER TABLE table_with_ttl MODIFY COLUMN column_ttl REMOVE TTL; ``` @@ -187,22 +193,6 @@ ALTER TABLE table_with_ttl MODIFY COLUMN column_ttl REMOVE TTL; - [REMOVE TTL](ttl.md). -## RENAME COLUMN {#alter_rename-column} - -Renames an existing column. - -Syntax: - -```sql -ALTER TABLE table_name RENAME COLUMN column_name TO new_column_name -``` - -**Example** - -```sql -ALTER TABLE table_with_ttl RENAME COLUMN column_ttl TO column_ttl_new; -``` - ## Limitations {#alter-query-limitations} The `ALTER` query lets you create and delete separate elements (columns) in nested data structures, but not whole nested data structures. To add a nested data structure, you can add columns with a name like `name.nested_name` and the type `Array(T)`. A nested data structure is equivalent to multiple array columns with a name that has the same prefix before the dot. @@ -213,4 +203,4 @@ If the `ALTER` query is not sufficient to make the table changes you need, you c The `ALTER` query blocks all reads and writes for the table. In other words, if a long `SELECT` is running at the time of the `ALTER` query, the `ALTER` query will wait for it to complete. At the same time, all new queries to the same table will wait while this `ALTER` is running. -For tables that do not store data themselves (such as `Merge` and `Distributed`), `ALTER` just changes the table structure, and does not change the structure of subordinate tables. For example, when running ALTER for a `Distributed` table, you will also need to run `ALTER` for the tables on all remote servers. +For tables that do not store data themselves (such as [Merge](../../../sql-reference/statements/alter/index.md) and [Distributed](../../../sql-reference/statements/alter/index.md)), `ALTER` just changes the table structure, and does not change the structure of subordinate tables. For example, when running ALTER for a `Distributed` table, you will also need to run `ALTER` for the tables on all remote servers. diff --git a/docs/en/sql-reference/statements/alter/partition.md b/docs/en/sql-reference/statements/alter/partition.md index 090cbe93c54..e1a76d2c0ae 100644 --- a/docs/en/sql-reference/statements/alter/partition.md +++ b/docs/en/sql-reference/statements/alter/partition.md @@ -88,7 +88,7 @@ ALTER TABLE visits ATTACH PART 201901_2_2_0; Read more about setting the partition expression in a section [How to specify the partition expression](#alter-how-to-specify-part-expr). -This query is replicated. The replica-initiator checks whether there is data in the `detached` directory. +This query is replicated. The replica-initiator checks whether there is data in the `detached` directory. If data exists, the query checks its integrity. If everything is correct, the query adds the data to the table. If the non-initiator replica, receiving the attach command, finds the part with the correct checksums in its own `detached` folder, it attaches the data without fetching it from other replicas. diff --git a/docs/en/sql-reference/statements/alter/projection.md b/docs/en/sql-reference/statements/alter/projection.md new file mode 100644 index 00000000000..07a13fc23c4 --- /dev/null +++ b/docs/en/sql-reference/statements/alter/projection.md @@ -0,0 +1,23 @@ +--- +toc_priority: 49 +toc_title: PROJECTION +--- + +# Manipulating Projections {#manipulations-with-projections} + +The following operations are available: + +- `ALTER TABLE [db].name ADD PROJECTION name AS SELECT [GROUP BY] [ORDER BY]` - Adds projection description to tables metadata. + +- `ALTER TABLE [db].name DROP PROJECTION name` - Removes projection description from tables metadata and deletes projection files from disk. + +- `ALTER TABLE [db.]table MATERIALIZE PROJECTION name IN PARTITION partition_name` - The query rebuilds the projection `name` in the partition `partition_name`. Implemented as a [mutation](../../../sql-reference/statements/alter/index.md#mutations). + +- `ALTER TABLE [db.]table CLEAR PROJECTION name IN PARTITION partition_name` - Deletes projection files from disk without removing description. + +The commands ADD, DROP and CLEAR are lightweight in a sense that they only change metadata or remove files. + +Also, they are replicated, syncing projections metadata via ZooKeeper. + +!!! note "Note" + Projection manipulation is supported only for tables with [`*MergeTree`](../../../engines/table-engines/mergetree-family/mergetree.md) engine (including [replicated](../../../engines/table-engines/mergetree-family/replication.md) variants). diff --git a/docs/en/sql-reference/statements/alter/role.md b/docs/en/sql-reference/statements/alter/role.md index 1253b72542d..ea6d3c61820 100644 --- a/docs/en/sql-reference/statements/alter/role.md +++ b/docs/en/sql-reference/statements/alter/role.md @@ -10,7 +10,7 @@ Changes roles. Syntax: ``` sql -ALTER ROLE [IF EXISTS] name1 [ON CLUSTER cluster_name1] [RENAME TO new_name1] +ALTER ROLE [IF EXISTS] name1 [ON CLUSTER cluster_name1] [RENAME TO new_name1] [, name2 [ON CLUSTER cluster_name2] [RENAME TO new_name2] ...] [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | PROFILE 'profile_name'] [,...] ``` diff --git a/docs/en/sql-reference/statements/alter/row-policy.md b/docs/en/sql-reference/statements/alter/row-policy.md index 56967f11605..bbf9f317737 100644 --- a/docs/en/sql-reference/statements/alter/row-policy.md +++ b/docs/en/sql-reference/statements/alter/row-policy.md @@ -10,7 +10,7 @@ Changes row policy. Syntax: ``` sql -ALTER [ROW] POLICY [IF EXISTS] name1 [ON CLUSTER cluster_name1] ON [database1.]table1 [RENAME TO new_name1] +ALTER [ROW] POLICY [IF EXISTS] name1 [ON CLUSTER cluster_name1] ON [database1.]table1 [RENAME TO new_name1] [, name2 [ON CLUSTER cluster_name2] ON [database2.]table2 [RENAME TO new_name2] ...] [AS {PERMISSIVE | RESTRICTIVE}] [FOR SELECT] diff --git a/docs/en/sql-reference/statements/alter/setting.md b/docs/en/sql-reference/statements/alter/setting.md new file mode 100644 index 00000000000..90747bc1919 --- /dev/null +++ b/docs/en/sql-reference/statements/alter/setting.md @@ -0,0 +1,60 @@ +--- +toc_priority: 38 +toc_title: SETTING +--- + +# Table Settings Manipulations {#table_settings_manipulations} + +There is a set of queries to change table settings. You can modify settings or reset them to default values. A single query can change several settings at once. +If a setting with the specified name does not exist, then the query raises an exception. + +**Syntax** + +``` sql +ALTER TABLE [db].name [ON CLUSTER cluster] MODIFY|RESET SETTING ... +``` + +!!! note "Note" + These queries can be applied to [MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md) tables only. + + +## MODIFY SETTING {#alter_modify_setting} + +Changes table settings. + +**Syntax** + +```sql +MODIFY SETTING setting_name=value [, ...] +``` + +**Example** + +```sql +CREATE TABLE example_table (id UInt32, data String) ENGINE=MergeTree() ORDER BY id; + +ALTER TABLE example_table MODIFY SETTING max_part_loading_threads=8, max_parts_in_total=50000; +``` + +## RESET SETTING {#alter_reset_setting} + +Resets table settings to their default values. If a setting is in a default state, then no action is taken. + +**Syntax** + +```sql +RESET SETTING setting_name [, ...] +``` + +**Example** + +```sql +CREATE TABLE example_table (id UInt32, data String) ENGINE=MergeTree() ORDER BY id + SETTINGS max_part_loading_threads=8; + +ALTER TABLE example_table RESET SETTING max_part_loading_threads; +``` + +**See Also** + +- [MergeTree settings](../../../operations/settings/merge-tree-settings.md) diff --git a/docs/en/sql-reference/statements/alter/user.md b/docs/en/sql-reference/statements/alter/user.md index 73081bc8619..4873982e2a1 100644 --- a/docs/en/sql-reference/statements/alter/user.md +++ b/docs/en/sql-reference/statements/alter/user.md @@ -10,7 +10,7 @@ Changes ClickHouse user accounts. Syntax: ``` sql -ALTER USER [IF EXISTS] name1 [ON CLUSTER cluster_name1] [RENAME TO new_name1] +ALTER USER [IF EXISTS] name1 [ON CLUSTER cluster_name1] [RENAME TO new_name1] [, name2 [ON CLUSTER cluster_name2] [RENAME TO new_name2] ...] [NOT IDENTIFIED | IDENTIFIED {[WITH {no_password | plaintext_password | sha256_password | sha256_hash | double_sha1_password | double_sha1_hash}] BY {'password' | 'hash'}} | {WITH ldap SERVER 'server_name'} | {WITH kerberos [REALM 'realm']}] [[ADD | DROP] HOST {LOCAL | NAME 'name' | REGEXP 'name_regexp' | IP 'address' | LIKE 'pattern'} [,...] | ANY | NONE] diff --git a/docs/en/sql-reference/statements/attach.md b/docs/en/sql-reference/statements/attach.md index bebba01980e..2949ac6db38 100644 --- a/docs/en/sql-reference/statements/attach.md +++ b/docs/en/sql-reference/statements/attach.md @@ -5,14 +5,21 @@ toc_title: ATTACH # ATTACH Statement {#attach} -Attaches the table, for example, when moving a database to another server. +Attaches a table or a dictionary, for example, when moving a database to another server. -The query does not create data on the disk, but assumes that data is already in the appropriate places, and just adds information about the table to the server. After executing an `ATTACH` query, the server will know about the existence of the table. +**Syntax** -If the table was previously detached ([DETACH](../../sql-reference/statements/detach.md)) query, meaning that its structure is known, you can use shorthand without defining the structure. +``` sql +ATTACH TABLE|DICTIONARY [IF NOT EXISTS] [db.]name [ON CLUSTER cluster] ... +``` -## Syntax Forms {#syntax-forms} -### Attach Existing Table {#attach-existing-table} +The query does not create data on the disk, but assumes that data is already in the appropriate places, and just adds information about the table or the dictionary to the server. After executing the `ATTACH` query, the server will know about the existence of the table or the dictionary. + +If a table was previously detached ([DETACH](../../sql-reference/statements/detach.md) query), meaning that its structure is known, you can use shorthand without defining the structure. + +## Attach Existing Table {#attach-existing-table} + +**Syntax** ``` sql ATTACH TABLE [IF NOT EXISTS] [db.]name [ON CLUSTER cluster] @@ -22,16 +29,18 @@ This query is used when starting the server. The server stores table metadata as If the table was detached permanently, it won't be reattached at the server start, so you need to use `ATTACH` query explicitly. -### Сreate New Table And Attach Data {#create-new-table-and-attach-data} +## Create New Table And Attach Data {#create-new-table-and-attach-data} -**With specify path to table data** +### With Specified Path to Table Data {#attach-with-specified-path} + +The query creates a new table with provided structure and attaches table data from the provided directory in `user_files`. + +**Syntax** ```sql ATTACH TABLE name FROM 'path/to/data/' (col1 Type1, ...) ``` -It creates new table with provided structure and attaches table data from provided directory in `user_files`. - **Example** Query: @@ -50,10 +59,23 @@ Result: └──────┴────┘ ``` -**With specify table UUID** (Only for `Atomic` database) +### With Specified Table UUID {#attach-with-specified-uuid} + +This query creates a new table with provided structure and attaches data from the table with the specified UUID. +It is supported by the [Atomic](../../engines/database-engines/atomic.md) database engine. + +**Syntax** ```sql ATTACH TABLE name UUID '' (col1 Type1, ...) ``` -It creates new table with provided structure and attaches data from table with the specified UUID. +## Attach Existing Dictionary {#attach-existing-dictionary} + +Attaches a previously detached dictionary. + +**Syntax** + +``` sql +ATTACH DICTIONARY [IF NOT EXISTS] [db.]name [ON CLUSTER cluster] +``` diff --git a/docs/en/sql-reference/statements/check-table.md b/docs/en/sql-reference/statements/check-table.md index d40fe263b1a..bc89b11ae4d 100644 --- a/docs/en/sql-reference/statements/check-table.md +++ b/docs/en/sql-reference/statements/check-table.md @@ -32,7 +32,7 @@ Engines from the `*Log` family do not provide automatic data recovery on failure ## Checking the MergeTree Family Tables {#checking-mergetree-tables} -For `MergeTree` family engines, if [check_query_single_value_result](../../operations/settings/settings.md#check_query_single_value_result) = 0, the `CHECK TABLE` query shows a check status for every individual data part of a table on the local server. +For `MergeTree` family engines, if [check_query_single_value_result](../../operations/settings/settings.md#check_query_single_value_result) = 0, the `CHECK TABLE` query shows a check status for every individual data part of a table on the local server. ```sql SET check_query_single_value_result = 0; diff --git a/docs/en/sql-reference/statements/create/quota.md b/docs/en/sql-reference/statements/create/quota.md index 0698d9bede5..767846ead52 100644 --- a/docs/en/sql-reference/statements/create/quota.md +++ b/docs/en/sql-reference/statements/create/quota.md @@ -24,7 +24,7 @@ Parameters `queries`, `query_selects`, `query_inserts`, `errors`, `result_rows`, `ON CLUSTER` clause allows creating quotas on a cluster, see [Distributed DDL](../../../sql-reference/distributed-ddl.md). -**Examples** +**Examples** Limit the maximum number of queries for the current user with 123 queries in 15 months constraint: diff --git a/docs/en/sql-reference/statements/create/row-policy.md b/docs/en/sql-reference/statements/create/row-policy.md index 1df7cc36995..3f88d794619 100644 --- a/docs/en/sql-reference/statements/create/row-policy.md +++ b/docs/en/sql-reference/statements/create/row-policy.md @@ -13,8 +13,8 @@ Creates a [row policy](../../../operations/access-rights.md#row-policy-managemen Syntax: ``` sql -CREATE [ROW] POLICY [IF NOT EXISTS | OR REPLACE] policy_name1 [ON CLUSTER cluster_name1] ON [db1.]table1 - [, policy_name2 [ON CLUSTER cluster_name2] ON [db2.]table2 ...] +CREATE [ROW] POLICY [IF NOT EXISTS | OR REPLACE] policy_name1 [ON CLUSTER cluster_name1] ON [db1.]table1 + [, policy_name2 [ON CLUSTER cluster_name2] ON [db2.]table2 ...] [FOR SELECT] USING condition [AS {PERMISSIVE | RESTRICTIVE}] [TO {role1 [, role2 ...] | ALL | ALL EXCEPT role1 [, role2 ...]}] @@ -32,11 +32,11 @@ Keyword `ALL` means all the ClickHouse users including current user. Keyword `AL !!! note "Note" If there are no row policies defined for a table then any user can `SELECT` all the row from the table. Defining one or more row policies for the table makes the access to the table depending on the row policies no matter if those row policies are defined for the current user or not. For example, the following policy - + `CREATE ROW POLICY pol1 ON mydb.table1 USING b=1 TO mira, peter` forbids the users `mira` and `peter` to see the rows with `b != 1`, and any non-mentioned user (e.g., the user `paul`) will see no rows from `mydb.table1` at all. - + If that's not desirable it can't be fixed by adding one more row policy, like the following: `CREATE ROW POLICY pol2 ON mydb.table1 USING 1 TO ALL EXCEPT mira, peter` diff --git a/docs/en/sql-reference/statements/create/settings-profile.md b/docs/en/sql-reference/statements/create/settings-profile.md index 0dab6a8512c..07bb54c9da3 100644 --- a/docs/en/sql-reference/statements/create/settings-profile.md +++ b/docs/en/sql-reference/statements/create/settings-profile.md @@ -10,7 +10,7 @@ Creates [settings profiles](../../../operations/access-rights.md#settings-profil Syntax: ``` sql -CREATE SETTINGS PROFILE [IF NOT EXISTS | OR REPLACE] TO name1 [ON CLUSTER cluster_name1] +CREATE SETTINGS PROFILE [IF NOT EXISTS | OR REPLACE] TO name1 [ON CLUSTER cluster_name1] [, name2 [ON CLUSTER cluster_name2] ...] [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | INHERIT 'profile_name'] [,...] ``` diff --git a/docs/en/sql-reference/statements/create/table.md b/docs/en/sql-reference/statements/create/table.md index 70ac9acd186..d09ff24efcd 100644 --- a/docs/en/sql-reference/statements/create/table.md +++ b/docs/en/sql-reference/statements/create/table.md @@ -189,7 +189,7 @@ CREATE TABLE codec_example dt Date CODEC(ZSTD), ts DateTime CODEC(LZ4HC), float_value Float32 CODEC(NONE), - double_value Float64 CODEC(LZ4HC(9)) + double_value Float64 CODEC(LZ4HC(9)), value Float32 CODEC(Delta, ZSTD) ) ENGINE = @@ -254,6 +254,21 @@ CREATE TABLE codec_example ENGINE = MergeTree() ``` + ## Temporary Tables {#temporary-tables} ClickHouse supports temporary tables which have the following characteristics: @@ -361,7 +376,7 @@ You can add a comment to the table when you creating it. !!!note "Note" The comment is supported for all table engines except [Kafka](../../../engines/table-engines/integrations/kafka.md), [RabbitMQ](../../../engines/table-engines/integrations/rabbitmq.md) and [EmbeddedRocksDB](../../../engines/table-engines/integrations/embedded-rocksdb.md). - + **Syntax** @@ -373,7 +388,7 @@ CREATE TABLE db.table_name ENGINE = engine COMMENT 'Comment' ``` - + **Example** Query: diff --git a/docs/en/sql-reference/statements/create/user.md b/docs/en/sql-reference/statements/create/user.md index ad9f203b768..dfa065f5d0a 100644 --- a/docs/en/sql-reference/statements/create/user.md +++ b/docs/en/sql-reference/statements/create/user.md @@ -10,11 +10,12 @@ Creates [user accounts](../../../operations/access-rights.md#user-account-manage Syntax: ``` sql -CREATE USER [IF NOT EXISTS | OR REPLACE] name1 [ON CLUSTER cluster_name1] +CREATE USER [IF NOT EXISTS | OR REPLACE] name1 [ON CLUSTER cluster_name1] [, name2 [ON CLUSTER cluster_name2] ...] [NOT IDENTIFIED | IDENTIFIED {[WITH {no_password | plaintext_password | sha256_password | sha256_hash | double_sha1_password | double_sha1_hash}] BY {'password' | 'hash'}} | {WITH ldap SERVER 'server_name'} | {WITH kerberos [REALM 'realm']}] [HOST {LOCAL | NAME 'name' | REGEXP 'name_regexp' | IP 'address' | LIKE 'pattern'} [,...] | ANY | NONE] [DEFAULT ROLE role [,...]] + [DEFAULT DATABASE database | NONE] [GRANTEES {user | role | ANY | NONE} [,...] [EXCEPT {user | role} [,...]]] [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY | WRITABLE] | PROFILE 'profile_name'] [,...] ``` @@ -54,7 +55,7 @@ Another way of specifying host is to use `@` syntax following the username. Exam !!! info "Warning" ClickHouse treats `user_name@'address'` as a username as a whole. Thus, technically you can create multiple users with the same `user_name` and different constructions after `@`. However, we do not recommend to do so. - + ## GRANTEES Clause {#grantees} Specifies users or roles which are allowed to receive [privileges](../../../sql-reference/statements/grant.md#grant-privileges) from this user on the condition this user has also all required access granted with [GRANT OPTION](../../../sql-reference/statements/grant.md#grant-privigele-syntax). Options of the `GRANTEES` clause: diff --git a/docs/en/sql-reference/statements/create/view.md b/docs/en/sql-reference/statements/create/view.md index 4b51bb8b067..9693f584761 100644 --- a/docs/en/sql-reference/statements/create/view.md +++ b/docs/en/sql-reference/statements/create/view.md @@ -77,7 +77,7 @@ CREATE LIVE VIEW [IF NOT EXISTS] [db.]table_name [WITH [TIMEOUT [value_in_sec] [ Live views store result of the corresponding [SELECT](../../../sql-reference/statements/select/index.md) query and are updated any time the result of the query changes. Query result as well as partial result needed to combine with new data are stored in memory providing increased performance for repeated queries. Live views can provide push notifications when query result changes using the [WATCH](../../../sql-reference/statements/watch.md) query. -Live views are triggered by insert into the innermost table specified in the query. +Live views are triggered by insert into the innermost table specified in the query. Live views work similarly to how a query in a distributed table works. But instead of combining partial results from different servers they combine partial result from current data with partial result from the new data. When a live view query includes a subquery then the cached partial result is only stored for the innermost subquery. @@ -166,7 +166,7 @@ You can force live view refresh using the `ALTER LIVE VIEW [db.]table_name REFRE ### WITH TIMEOUT Clause {#live-view-with-timeout} -When a live view is created with a `WITH TIMEOUT` clause then the live view will be dropped automatically after the specified number of seconds elapse since the end of the last [WATCH](../../../sql-reference/statements/watch.md) query that was watching the live view. +When a live view is created with a `WITH TIMEOUT` clause then the live view will be dropped automatically after the specified number of seconds elapse since the end of the last [WATCH](../../../sql-reference/statements/watch.md) query that was watching the live view. ```sql CREATE LIVE VIEW [db.]table_name WITH TIMEOUT [value_in_sec] AS SELECT ... @@ -210,7 +210,7 @@ WATCH lv └─────────────────────┴──────────┘ ``` -You can combine `WITH TIMEOUT` and `WITH REFRESH` clauses using an `AND` clause. +You can combine `WITH TIMEOUT` and `WITH REFRESH` clauses using an `AND` clause. ```sql CREATE LIVE VIEW [db.]table_name WITH TIMEOUT [value_in_sec] AND REFRESH [value_in_sec] AS SELECT ... @@ -229,7 +229,7 @@ WATCH lv ``` ``` -Code: 60. DB::Exception: Received from localhost:9000. DB::Exception: Table default.lv does not exist.. +Code: 60. DB::Exception: Received from localhost:9000. DB::Exception: Table default.lv does not exist.. ``` ### Usage {#live-view-usage} diff --git a/docs/en/sql-reference/statements/detach.md b/docs/en/sql-reference/statements/detach.md index a181dd8deee..b77bcbc00fb 100644 --- a/docs/en/sql-reference/statements/detach.md +++ b/docs/en/sql-reference/statements/detach.md @@ -5,21 +5,22 @@ toc_title: DETACH # DETACH Statement {#detach} -Makes the server "forget" about the existence of the table or materialized view. +Makes the server "forget" about the existence of a table, a materialized view, or a dictionary. -Syntax: +**Syntax** ``` sql -DETACH TABLE|VIEW [IF EXISTS] [db.]name [ON CLUSTER cluster] [PERMANENTLY] +DETACH TABLE|VIEW|DICTIONARY [IF EXISTS] [db.]name [ON CLUSTER cluster] [PERMANENTLY] ``` -Detaching does not delete the data or metadata for the table or materialized view. If the table or view was not detached `PERMANENTLY`, on the next server launch the server will read the metadata and recall the table/view again. If the table or view was detached `PERMANENTLY`, there will be no automatic recall. +Detaching does not delete the data or metadata of a table, a materialized view or a dictionary. If an entity was not detached `PERMANENTLY`, on the next server launch the server will read the metadata and recall the table/view/dictionary again. If an entity was detached `PERMANENTLY`, there will be no automatic recall. -Whether the table was detached permanently or not, in both cases you can reattach it using the [ATTACH](../../sql-reference/statements/attach.md). System log tables can be also attached back (e.g. `query_log`, `text_log`, etc). Other system tables can't be reattached. On the next server launch the server will recall those tables again. +Whether a table or a dictionary was detached permanently or not, in both cases you can reattach them using the [ATTACH](../../sql-reference/statements/attach.md) query. +System log tables can be also attached back (e.g. `query_log`, `text_log`, etc). Other system tables can't be reattached. On the next server launch the server will recall those tables again. `ATTACH MATERIALIZED VIEW` does not work with short syntax (without `SELECT`), but you can attach it using the `ATTACH TABLE` query. -Note that you can not detach permanently the table which is already detached (temporary). But you can attach it back and then detach permanently again. +Note that you can not detach permanently the table which is already detached (temporary). But you can attach it back and then detach permanently again. Also you can not [DROP](../../sql-reference/statements/drop.md#drop-table) the detached table, or [CREATE TABLE](../../sql-reference/statements/create/table.md) with the same name as detached permanently, or replace it with the other table with [RENAME TABLE](../../sql-reference/statements/rename.md) query. @@ -67,4 +68,7 @@ Received exception from server (version 21.4.1): Code: 60. DB::Exception: Received from localhost:9000. DB::Exception: Table default.test does not exist. ``` -[Original article](https://clickhouse.tech/docs/en/sql-reference/statements/detach/) +**See Also** + +- [Materialized View](../../sql-reference/statements/create/view.md#materialized) +- [Dictionaries](../../sql-reference/dictionaries/index.md) diff --git a/docs/en/sql-reference/statements/exchange.md b/docs/en/sql-reference/statements/exchange.md new file mode 100644 index 00000000000..91b0c48ddcf --- /dev/null +++ b/docs/en/sql-reference/statements/exchange.md @@ -0,0 +1,42 @@ +--- +toc_priority: 49 +toc_title: EXCHANGE +--- + +# EXCHANGE Statement {#exchange} + +Exchanges the names of two tables or dictionaries atomically. +This task can also be accomplished with a [RENAME](./rename.md) query using a temporary name, but the operation is not atomic in that case. + +!!! note "Note" + The `EXCHANGE` query is supported by the [Atomic](../../engines/database-engines/atomic.md) database engine only. + +**Syntax** + +```sql +EXCHANGE TABLES|DICTIONARIES [db0.]name_A AND [db1.]name_B +``` + +## EXCHANGE TABLES {#exchange_tables} + +Exchanges the names of two tables. + +**Syntax** + +```sql +EXCHANGE TABLES [db0.]table_A AND [db1.]table_B +``` + +## EXCHANGE DICTIONARIES {#exchange_dictionaries} + +Exchanges the names of two dictionaries. + +**Syntax** + +```sql +EXCHANGE DICTIONARIES [db0.]dict_A AND [db1.]dict_B +``` + +**See Also** + +- [Dictionaries](../../sql-reference/dictionaries/index.md) diff --git a/docs/en/sql-reference/statements/explain.md b/docs/en/sql-reference/statements/explain.md index f22f92c625a..9afea708d16 100644 --- a/docs/en/sql-reference/statements/explain.md +++ b/docs/en/sql-reference/statements/explain.md @@ -240,7 +240,7 @@ EXPLAIN json = 1, description = 0, header = 1 SELECT 1, 2 + dummy; } ] ``` - + With `indexes` = 1, the `Indexes` key is added. It contains an array of used indexes. Each index is described as JSON with `Type` key (a string `MinMax`, `Partition`, `PrimaryKey` or `Skip`) and optional keys: - `Name` — An index name (for now, is used only for `Skip` index). @@ -384,5 +384,32 @@ ExpressionTransform (ReadFromStorage) NumbersMt × 2 0 → 1 ``` +### EXPLAIN ESTIMATE {#explain-estimate} + +Shows the estimated number of rows, marks and parts to be read from the tables while processing the query. Works with tables in the [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md#table_engines-mergetree) family. + +**Example** + +Creating a table: + +```sql +CREATE TABLE ttt (i Int64) ENGINE = MergeTree() ORDER BY i SETTINGS index_granularity = 16, write_final_mark = 0; +INSERT INTO ttt SELECT number FROM numbers(128); +OPTIMIZE TABLE ttt; +``` + +Query: + +```sql +EXPLAIN ESTIMATE SELECT * FROM ttt; +``` + +Result: + +```text +┌─database─┬─table─┬─parts─┬─rows─┬─marks─┐ +│ default │ ttt │ 1 │ 128 │ 8 │ +└──────────┴───────┴───────┴──────┴───────┘ +``` [Оriginal article](https://clickhouse.tech/docs/en/sql-reference/statements/explain/) diff --git a/docs/en/sql-reference/statements/grant.md b/docs/en/sql-reference/statements/grant.md index 8ca2b25ce66..25dffc36954 100644 --- a/docs/en/sql-reference/statements/grant.md +++ b/docs/en/sql-reference/statements/grant.md @@ -13,7 +13,7 @@ To revoke privileges, use the [REVOKE](../../sql-reference/statements/revoke.md) ## Granting Privilege Syntax {#grant-privigele-syntax} ``` sql -GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION] +GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION] [WITH REPLACE OPTION] ``` - `privilege` — Type of privilege. @@ -21,17 +21,19 @@ GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.ta - `user` — ClickHouse user account. The `WITH GRANT OPTION` clause grants `user` or `role` with permission to execute the `GRANT` query. Users can grant privileges of the same scope they have and less. +The `WITH REPLACE OPTION` clause replace old privileges by new privileges for the `user` or `role`, if not specified it is append privileges. ## Assigning Role Syntax {#assign-role-syntax} ``` sql -GRANT [ON CLUSTER cluster_name] role [,...] TO {user | another_role | CURRENT_USER} [,...] [WITH ADMIN OPTION] +GRANT [ON CLUSTER cluster_name] role [,...] TO {user | another_role | CURRENT_USER} [,...] [WITH ADMIN OPTION] [WITH REPLACE OPTION] ``` - `role` — ClickHouse user role. - `user` — ClickHouse user account. The `WITH ADMIN OPTION` clause grants [ADMIN OPTION](#admin-option-privilege) privilege to `user` or `role`. +The `WITH REPLACE OPTION` clause replace old roles by new role for the `user` or `role`, if not specified it is append roles. ## Usage {#grant-usage} diff --git a/docs/en/sql-reference/statements/insert-into.md b/docs/en/sql-reference/statements/insert-into.md index db10ddd47c6..31b4d30835f 100644 --- a/docs/en/sql-reference/statements/insert-into.md +++ b/docs/en/sql-reference/statements/insert-into.md @@ -105,7 +105,7 @@ However, you can delete old data using `ALTER TABLE ... DROP PARTITION`. `FORMAT` clause must be specified in the end of query if `SELECT` clause contains table function [input()](../../sql-reference/table-functions/input.md). -To insert a default value instead of `NULL` into a column with not nullable data type, enable [insert_null_as_default](../../operations/settings/settings.md#insert_null_as_default) setting. +To insert a default value instead of `NULL` into a column with not nullable data type, enable [insert_null_as_default](../../operations/settings/settings.md#insert_null_as_default) setting. ### Performance Considerations {#performance-considerations} diff --git a/docs/en/sql-reference/statements/optimize.md b/docs/en/sql-reference/statements/optimize.md index 5eaf0558d7b..864509cec94 100644 --- a/docs/en/sql-reference/statements/optimize.md +++ b/docs/en/sql-reference/statements/optimize.md @@ -37,7 +37,7 @@ If you want to perform deduplication on custom set of columns rather than on all **Syntax** ``` sql -OPTIMIZE TABLE table DEDUPLICATE; -- all columns +OPTIMIZE TABLE table DEDUPLICATE; -- all columns OPTIMIZE TABLE table DEDUPLICATE BY *; -- excludes MATERIALIZED and ALIAS columns OPTIMIZE TABLE table DEDUPLICATE BY colX,colY,colZ; OPTIMIZE TABLE table DEDUPLICATE BY * EXCEPT colX; @@ -65,7 +65,7 @@ PARTITION BY partition_key ORDER BY (primary_key, secondary_key); ``` ``` sql -INSERT INTO example (primary_key, secondary_key, value, partition_key) +INSERT INTO example (primary_key, secondary_key, value, partition_key) VALUES (0, 0, 0, 0), (0, 0, 0, 0), (1, 1, 2, 2), (1, 1, 2, 3), (1, 1, 3, 3); ``` ``` sql diff --git a/docs/en/sql-reference/statements/rename.md b/docs/en/sql-reference/statements/rename.md index 3591c187e93..c2192f1a6e1 100644 --- a/docs/en/sql-reference/statements/rename.md +++ b/docs/en/sql-reference/statements/rename.md @@ -5,18 +5,57 @@ toc_title: RENAME # RENAME Statement {#misc_operations-rename} -## RENAME DATABASE {#misc_operations-rename_database} -Renames database, it is supported only for Atomic database engine. +Renames databases, tables, or dictionaries. Several entities can be renamed in a single query. +Note that the `RENAME` query with several entities is non-atomic operation. To swap entities names atomically, use the [EXCHANGE](./exchange.md) statement. +!!! note "Note" + The `RENAME` query is supported by the [Atomic](../../engines/database-engines/atomic.md) database engine only. + +**Syntax** + +```sql +RENAME DATABASE|TABLE|DICTIONARY name TO new_name [,...] [ON CLUSTER cluster] ``` -RENAME DATABASE atomic_database1 TO atomic_database2 [ON CLUSTER cluster] + +## RENAME DATABASE {#misc_operations-rename_database} + +Renames databases. + +**Syntax** + +```sql +RENAME DATABASE atomic_database1 TO atomic_database2 [,...] [ON CLUSTER cluster] ``` ## RENAME TABLE {#misc_operations-rename_table} + Renames one or more tables. +Renaming tables is a light operation. If you pass a different database after `TO`, the table will be moved to this database. However, the directories with databases must reside in the same file system. Otherwise, an error is returned. +If you rename multiple tables in one query, the operation is not atomic. It may be partially executed, and queries in other sessions may get `Table ... does not exist ...` error. + +**Syntax** + ``` sql -RENAME TABLE [db11.]name11 TO [db12.]name12, [db21.]name21 TO [db22.]name22, ... [ON CLUSTER cluster] +RENAME TABLE [db1.]name1 TO [db2.]name2 [,...] [ON CLUSTER cluster] ``` -Renaming tables is a light operation. If you indicated another database after `TO`, the table will be moved to this database. However, the directories with databases must reside in the same file system (otherwise, an error is returned). If you rename multiple tables in one query, this is a non-atomic operation, it may be partially executed, queries in other sessions may receive the error `Table ... does not exist ..`. +**Example** + +```sql +RENAME TABLE table_A TO table_A_bak, table_B TO table_B_bak; +``` + +## RENAME DICTIONARY {#rename_dictionary} + +Renames one or several dictionaries. This query can be used to move dictionaries between databases. + +**Syntax** + +```sql +RENAME DICTIONARY [db0.]dict_A TO [db1.]dict_B [,...] [ON CLUSTER cluster] +``` + +**See Also** + +- [Dictionaries](../../sql-reference/dictionaries/index.md) diff --git a/docs/en/sql-reference/statements/select/distinct.md b/docs/en/sql-reference/statements/select/distinct.md index 87154cba05a..390afa46248 100644 --- a/docs/en/sql-reference/statements/select/distinct.md +++ b/docs/en/sql-reference/statements/select/distinct.md @@ -6,23 +6,55 @@ toc_title: DISTINCT If `SELECT DISTINCT` is specified, only unique rows will remain in a query result. Thus only a single row will remain out of all the sets of fully matching rows in the result. -## Null Processing {#null-processing} +You can specify the list of columns that must have unique values: `SELECT DISTINCT ON (column1, column2,...)`. If the columns are not specified, all of them are taken into consideration. -`DISTINCT` works with [NULL](../../../sql-reference/syntax.md#null-literal) as if `NULL` were a specific value, and `NULL==NULL`. In other words, in the `DISTINCT` results, different combinations with `NULL` occur only once. It differs from `NULL` processing in most other contexts. +Consider the table: -## Alternatives {#alternatives} +```text +┌─a─┬─b─┬─c─┐ +│ 1 │ 1 │ 1 │ +│ 1 │ 1 │ 1 │ +│ 2 │ 2 │ 2 │ +│ 2 │ 2 │ 2 │ +│ 1 │ 1 │ 2 │ +│ 1 │ 2 │ 2 │ +└───┴───┴───┘ +``` -It is possible to obtain the same result by applying [GROUP BY](../../../sql-reference/statements/select/group-by.md) across the same set of values as specified as `SELECT` clause, without using any aggregate functions. But there are few differences from `GROUP BY` approach: +Using `DISTINCT` without specifying columns: -- `DISTINCT` can be applied together with `GROUP BY`. -- When [ORDER BY](../../../sql-reference/statements/select/order-by.md) is omitted and [LIMIT](../../../sql-reference/statements/select/limit.md) is defined, the query stops running immediately after the required number of different rows has been read. -- Data blocks are output as they are processed, without waiting for the entire query to finish running. +```sql +SELECT DISTINCT * FROM t1; +``` -## Examples {#examples} +```text +┌─a─┬─b─┬─c─┐ +│ 1 │ 1 │ 1 │ +│ 2 │ 2 │ 2 │ +│ 1 │ 1 │ 2 │ +│ 1 │ 2 │ 2 │ +└───┴───┴───┘ +``` + +Using `DISTINCT` with specified columns: + +```sql +SELECT DISTINCT ON (a,b) * FROM t1; +``` + +```text +┌─a─┬─b─┬─c─┐ +│ 1 │ 1 │ 1 │ +│ 2 │ 2 │ 2 │ +│ 1 │ 2 │ 2 │ +└───┴───┴───┘ +``` + +## DISTINCT and ORDER BY {#distinct-orderby} ClickHouse supports using the `DISTINCT` and `ORDER BY` clauses for different columns in one query. The `DISTINCT` clause is executed before the `ORDER BY` clause. -Example table: +Consider the table: ``` text ┌─a─┬─b─┐ @@ -33,7 +65,11 @@ Example table: └───┴───┘ ``` -When selecting data with the `SELECT DISTINCT a FROM t1 ORDER BY b ASC` query, we get the following result: +Selecting data: + +```sql +SELECT DISTINCT a FROM t1 ORDER BY b ASC; +``` ``` text ┌─a─┐ @@ -42,8 +78,11 @@ When selecting data with the `SELECT DISTINCT a FROM t1 ORDER BY b ASC` query, w │ 3 │ └───┘ ``` +Selecting data with the different sorting direction: -If we change the sorting direction `SELECT DISTINCT a FROM t1 ORDER BY b DESC`, we get the following result: +```sql +SELECT DISTINCT a FROM t1 ORDER BY b DESC; +``` ``` text ┌─a─┐ @@ -56,3 +95,15 @@ If we change the sorting direction `SELECT DISTINCT a FROM t1 ORDER BY b DESC`, Row `2, 4` was cut before sorting. Take this implementation specificity into account when programming queries. + +## Null Processing {#null-processing} + +`DISTINCT` works with [NULL](../../../sql-reference/syntax.md#null-literal) as if `NULL` were a specific value, and `NULL==NULL`. In other words, in the `DISTINCT` results, different combinations with `NULL` occur only once. It differs from `NULL` processing in most other contexts. + +## Alternatives {#alternatives} + +It is possible to obtain the same result by applying [GROUP BY](../../../sql-reference/statements/select/group-by.md) across the same set of values as specified as `SELECT` clause, without using any aggregate functions. But there are few differences from `GROUP BY` approach: + +- `DISTINCT` can be applied together with `GROUP BY`. +- When [ORDER BY](../../../sql-reference/statements/select/order-by.md) is omitted and [LIMIT](../../../sql-reference/statements/select/limit.md) is defined, the query stops running immediately after the required number of different rows has been read. +- Data blocks are output as they are processed, without waiting for the entire query to finish running. diff --git a/docs/en/sql-reference/statements/select/group-by.md b/docs/en/sql-reference/statements/select/group-by.md index e6affc07b78..7c2d3a20f43 100644 --- a/docs/en/sql-reference/statements/select/group-by.md +++ b/docs/en/sql-reference/statements/select/group-by.md @@ -49,14 +49,14 @@ If you pass several keys to `GROUP BY`, the result will give you all the combina `WITH ROLLUP` modifier is used to calculate subtotals for the key expressions, based on their order in the `GROUP BY` list. The subtotals rows are added after the result table. -The subtotals are calculated in the reverse order: at first subtotals are calculated for the last key expression in the list, then for the previous one, and so on up to the first key expression. +The subtotals are calculated in the reverse order: at first subtotals are calculated for the last key expression in the list, then for the previous one, and so on up to the first key expression. In the subtotals rows the values of already "grouped" key expressions are set to `0` or empty line. !!! note "Note" Mind that [HAVING](../../../sql-reference/statements/select/having.md) clause can affect the subtotals results. -**Example** +**Example** Consider the table t: @@ -115,7 +115,7 @@ In the subtotals rows the values of all "grouped" key expressions are set to `0` !!! note "Note" Mind that [HAVING](../../../sql-reference/statements/select/having.md) clause can affect the subtotals results. -**Example** +**Example** Consider the table t: @@ -138,13 +138,13 @@ SELECT year, month, day, count(*) FROM t GROUP BY year, month, day WITH CUBE; As `GROUP BY` section has three key expressions, the result contains eight tables with subtotals for all key expression combinations: -- `GROUP BY year, month, day` -- `GROUP BY year, month` +- `GROUP BY year, month, day` +- `GROUP BY year, month` - `GROUP BY year, day` -- `GROUP BY year` -- `GROUP BY month, day` -- `GROUP BY month` -- `GROUP BY day` +- `GROUP BY year` +- `GROUP BY month, day` +- `GROUP BY month` +- `GROUP BY day` - and totals. Columns, excluded from `GROUP BY`, are filled with zeros. @@ -257,7 +257,7 @@ Aggregation is one of the most important features of a column-oriented DBMS, and ### GROUP BY Optimization Depending on Table Sorting Key {#aggregation-in-order} -The aggregation can be performed more effectively, if a table is sorted by some key, and `GROUP BY` expression contains at least prefix of sorting key or injective functions. In this case when a new key is read from table, the in-between result of aggregation can be finalized and sent to client. This behaviour is switched on by the [optimize_aggregation_in_order](../../../operations/settings/settings.md#optimize_aggregation_in_order) setting. Such optimization reduces memory usage during aggregation, but in some cases may slow down the query execution. +The aggregation can be performed more effectively, if a table is sorted by some key, and `GROUP BY` expression contains at least prefix of sorting key or injective functions. In this case when a new key is read from table, the in-between result of aggregation can be finalized and sent to client. This behaviour is switched on by the [optimize_aggregation_in_order](../../../operations/settings/settings.md#optimize_aggregation_in_order) setting. Such optimization reduces memory usage during aggregation, but in some cases may slow down the query execution. ### GROUP BY in External Memory {#select-group-by-in-external-memory} diff --git a/docs/en/sql-reference/statements/select/index.md b/docs/en/sql-reference/statements/select/index.md index 2f2ce943225..4e96bae8493 100644 --- a/docs/en/sql-reference/statements/select/index.md +++ b/docs/en/sql-reference/statements/select/index.md @@ -13,7 +13,7 @@ toc_title: Overview ``` sql [WITH expr_list|(subquery)] -SELECT [DISTINCT] expr_list +SELECT [DISTINCT [ON (column1, column2, ...)]] expr_list [FROM [db.]table | (subquery) | table_function] [FINAL] [SAMPLE sample_coeff] [ARRAY JOIN ...] @@ -36,6 +36,8 @@ All clauses are optional, except for the required list of expressions immediatel Specifics of each optional clause are covered in separate sections, which are listed in the same order as they are executed: - [WITH clause](../../../sql-reference/statements/select/with.md) +- [SELECT clause](#select-clause) +- [DISTINCT clause](../../../sql-reference/statements/select/distinct.md) - [FROM clause](../../../sql-reference/statements/select/from.md) - [SAMPLE clause](../../../sql-reference/statements/select/sample.md) - [JOIN clause](../../../sql-reference/statements/select/join.md) @@ -44,8 +46,6 @@ Specifics of each optional clause are covered in separate sections, which are li - [GROUP BY clause](../../../sql-reference/statements/select/group-by.md) - [LIMIT BY clause](../../../sql-reference/statements/select/limit-by.md) - [HAVING clause](../../../sql-reference/statements/select/having.md) -- [SELECT clause](#select-clause) -- [DISTINCT clause](../../../sql-reference/statements/select/distinct.md) - [LIMIT clause](../../../sql-reference/statements/select/limit.md) - [OFFSET clause](../../../sql-reference/statements/select/offset.md) - [UNION clause](../../../sql-reference/statements/select/union.md) @@ -170,7 +170,7 @@ You can use the following modifiers in `SELECT` queries. ### APPLY {#apply-modifier} -Allows you to invoke some function for each row returned by an outer table expression of a query. +Allows you to invoke some function for each row returned by an outer table expression of a query. **Syntax:** @@ -178,7 +178,7 @@ Allows you to invoke some function for each row returned by an outer table expre SELECT APPLY( ) FROM [db.]table_name ``` -**Example:** +**Example:** ``` sql CREATE TABLE columns_transformers (i Int64, j Int16, k Int64) ENGINE = MergeTree ORDER by (i); @@ -272,9 +272,9 @@ SELECT * REPLACE(i + 1 AS i) EXCEPT (j) APPLY(sum) from columns_transformers; ## SETTINGS in SELECT Query {#settings-in-select} -You can specify the necessary settings right in the `SELECT` query. The setting value is applied only to this query and is reset to default or previous value after the query is executed. +You can specify the necessary settings right in the `SELECT` query. The setting value is applied only to this query and is reset to default or previous value after the query is executed. -Other ways to make settings see [here](../../../operations/settings/index.md). +Other ways to make settings see [here](../../../operations/settings/index.md). **Example** diff --git a/docs/en/sql-reference/statements/select/join.md b/docs/en/sql-reference/statements/select/join.md index c90b4bf0eaa..0002e6db313 100644 --- a/docs/en/sql-reference/statements/select/join.md +++ b/docs/en/sql-reference/statements/select/join.md @@ -36,14 +36,23 @@ Additional join types available in ClickHouse: - `LEFT ANY JOIN`, `RIGHT ANY JOIN` and `INNER ANY JOIN`, partially (for opposite side of `LEFT` and `RIGHT`) or completely (for `INNER` and `FULL`) disables the cartesian product for standard `JOIN` types. - `ASOF JOIN` and `LEFT ASOF JOIN`, joining sequences with a non-exact match. `ASOF JOIN` usage is described below. -## Setting {#join-settings} +## Settings {#join-settings} -!!! note "Note" - The default join type can be overriden using [join_default_strictness](../../../operations/settings/settings.md#settings-join_default_strictness) setting. +The default join type can be overriden using [join_default_strictness](../../../operations/settings/settings.md#settings-join_default_strictness) setting. - Also the behavior of ClickHouse server for `ANY JOIN` operations depends on the [any_join_distinct_right_table_keys](../../../operations/settings/settings.md#any_join_distinct_right_table_keys) setting. +The behavior of ClickHouse server for `ANY JOIN` operations depends on the [any_join_distinct_right_table_keys](../../../operations/settings/settings.md#any_join_distinct_right_table_keys) setting. -### ASOF JOIN Usage {#asof-join-usage} +**See also** + +- [join_algorithm](../../../operations/settings/settings.md#settings-join_algorithm) +- [join_any_take_last_row](../../../operations/settings/settings.md#settings-join_any_take_last_row) +- [join_use_nulls](../../../operations/settings/settings.md#join_use_nulls) +- [partial_merge_join_optimizations](../../../operations/settings/settings.md#partial_merge_join_optimizations) +- [partial_merge_join_rows_in_right_blocks](../../../operations/settings/settings.md#partial_merge_join_rows_in_right_blocks) +- [join_on_disk_max_files_to_merge](../../../operations/settings/settings.md#join_on_disk_max_files_to_merge) +- [any_join_distinct_right_table_keys](../../../operations/settings/settings.md#any_join_distinct_right_table_keys) + +## ASOF JOIN Usage {#asof-join-usage} `ASOF JOIN` is useful when you need to join records that have no exact match. @@ -93,7 +102,7 @@ For example, consider the following tables: !!! note "Note" `ASOF` join is **not** supported in the [Join](../../../engines/table-engines/special/join.md) table engine. -## Distributed Join {#global-join} +## Distributed JOIN {#global-join} There are two ways to execute join involving distributed tables: @@ -102,6 +111,42 @@ There are two ways to execute join involving distributed tables: Be careful when using `GLOBAL`. For more information, see the [Distributed subqueries](../../../sql-reference/operators/in.md#select-distributed-subqueries) section. +## Implicit Type Conversion {#implicit-type-conversion} + +`INNER JOIN`, `LEFT JOIN`, `RIGHT JOIN`, and `FULL JOIN` queries support the implicit type conversion for "join keys". However the query can not be executed, if join keys from the left and the right tables cannot be converted to a single type (for example, there is no data type that can hold all values from both `UInt64` and `Int64`, or `String` and `Int32`). + +**Example** + +Consider the table `t_1`: +```text +┌─a─┬─b─┬─toTypeName(a)─┬─toTypeName(b)─┐ +│ 1 │ 1 │ UInt16 │ UInt8 │ +│ 2 │ 2 │ UInt16 │ UInt8 │ +└───┴───┴───────────────┴───────────────┘ +``` +and the table `t_2`: +```text +┌──a─┬────b─┬─toTypeName(a)─┬─toTypeName(b)───┐ +│ -1 │ 1 │ Int16 │ Nullable(Int64) │ +│ 1 │ -1 │ Int16 │ Nullable(Int64) │ +│ 1 │ 1 │ Int16 │ Nullable(Int64) │ +└────┴──────┴───────────────┴─────────────────┘ +``` + +The query +```sql +SELECT a, b, toTypeName(a), toTypeName(b) FROM t_1 FULL JOIN t_2 USING (a, b); +``` +returns the set: +```text +┌──a─┬────b─┬─toTypeName(a)─┬─toTypeName(b)───┐ +│ 1 │ 1 │ Int32 │ Nullable(Int64) │ +│ 2 │ 2 │ Int32 │ Nullable(Int64) │ +│ -1 │ 1 │ Int32 │ Nullable(Int64) │ +│ 1 │ -1 │ Int32 │ Nullable(Int64) │ +└────┴──────┴───────────────┴─────────────────┘ +``` + ## Usage Recommendations {#usage-recommendations} ### Processing of Empty or NULL Cells {#processing-of-empty-or-null-cells} @@ -139,9 +184,9 @@ If you need a `JOIN` for joining with dimension tables (these are relatively sma ### Memory Limitations {#memory-limitations} -By default, ClickHouse uses the [hash join](https://en.wikipedia.org/wiki/Hash_join) algorithm. ClickHouse takes the `` and creates a hash table for it in RAM. After some threshold of memory consumption, ClickHouse falls back to merge join algorithm. +By default, ClickHouse uses the [hash join](https://en.wikipedia.org/wiki/Hash_join) algorithm. ClickHouse takes the right_table and creates a hash table for it in RAM. If `join_algorithm = 'auto'` is enabled, then after some threshold of memory consumption, ClickHouse falls back to [merge](https://en.wikipedia.org/wiki/Sort-merge_join) join algorithm. For `JOIN` algorithms description see the [join_algorithm](../../../operations/settings/settings.md#settings-join_algorithm) setting. -If you need to restrict join operation memory consumption use the following settings: +If you need to restrict `JOIN` operation memory consumption use the following settings: - [max_rows_in_join](../../../operations/settings/query-complexity.md#settings-max_rows_in_join) — Limits number of rows in the hash table. - [max_bytes_in_join](../../../operations/settings/query-complexity.md#settings-max_bytes_in_join) — Limits size of the hash table. diff --git a/docs/en/sql-reference/statements/select/offset.md b/docs/en/sql-reference/statements/select/offset.md index 3efd916bcb8..20ebd972a24 100644 --- a/docs/en/sql-reference/statements/select/offset.md +++ b/docs/en/sql-reference/statements/select/offset.md @@ -32,10 +32,10 @@ The `WITH TIES` option is used to return any additional rows that tie for the la !!! note "Note" According to the standard, the `OFFSET` clause must come before the `FETCH` clause if both are present. - + !!! note "Note" The real offset can also depend on the [offset](../../../operations/settings/settings.md#offset) setting. - + ## Examples {#examples} Input table: diff --git a/docs/en/sql-reference/statements/select/order-by.md b/docs/en/sql-reference/statements/select/order-by.md index a8fec5cfa26..156f68935b5 100644 --- a/docs/en/sql-reference/statements/select/order-by.md +++ b/docs/en/sql-reference/statements/select/order-by.md @@ -250,8 +250,8 @@ External sorting works much less effectively than sorting in RAM. ## Optimization of Data Reading {#optimize_read_in_order} - If `ORDER BY` expression has a prefix that coincides with the table sorting key, you can optimize the query by using the [optimize_read_in_order](../../../operations/settings/settings.md#optimize_read_in_order) setting. - + If `ORDER BY` expression has a prefix that coincides with the table sorting key, you can optimize the query by using the [optimize_read_in_order](../../../operations/settings/settings.md#optimize_read_in_order) setting. + When the `optimize_read_in_order` setting is enabled, the ClickHouse server uses the table index and reads the data in order of the `ORDER BY` key. This allows to avoid reading all data in case of specified [LIMIT](../../../sql-reference/statements/select/limit.md). So queries on big data with small limit are processed faster. Optimization works with both `ASC` and `DESC` and does not work together with [GROUP BY](../../../sql-reference/statements/select/group-by.md) clause and [FINAL](../../../sql-reference/statements/select/from.md#select-from-final) modifier. @@ -274,28 +274,28 @@ This modifier also can be combined with [LIMIT … WITH TIES modifier](../../../ `WITH FILL` modifier can be set after `ORDER BY expr` with optional `FROM expr`, `TO expr` and `STEP expr` parameters. All missed values of `expr` column will be filled sequentially and other columns will be filled as defaults. -Use following syntax for filling multiple columns add `WITH FILL` modifier with optional parameters after each field name in `ORDER BY` section. +To fill multiple columns, add `WITH FILL` modifier with optional parameters after each field name in `ORDER BY` section. ``` sql ORDER BY expr [WITH FILL] [FROM const_expr] [TO const_expr] [STEP const_numeric_expr], ... exprN [WITH FILL] [FROM expr] [TO expr] [STEP numeric_expr] ``` -`WITH FILL` can be applied only for fields with Numeric (all kind of float, decimal, int) or Date/DateTime types. +`WITH FILL` can be applied for fields with Numeric (all kinds of float, decimal, int) or Date/DateTime types. When applied for `String` fields, missed values are filled with empty strings. When `FROM const_expr` not defined sequence of filling use minimal `expr` field value from `ORDER BY`. When `TO const_expr` not defined sequence of filling use maximum `expr` field value from `ORDER BY`. When `STEP const_numeric_expr` defined then `const_numeric_expr` interprets `as is` for numeric types as `days` for Date type and as `seconds` for DateTime type. When `STEP const_numeric_expr` omitted then sequence of filling use `1.0` for numeric type, `1 day` for Date type and `1 second` for DateTime type. -For example, the following query +Example of a query without `WITH FILL`: ``` sql SELECT n, source FROM ( SELECT toFloat32(number % 10) AS n, 'original' AS source FROM numbers(10) WHERE number % 3 = 1 -) ORDER BY n +) ORDER BY n; ``` -returns +Result: ``` text ┌─n─┬─source───┐ @@ -305,16 +305,16 @@ returns └───┴──────────┘ ``` -but after apply `WITH FILL` modifier +Same query after applying `WITH FILL` modifier: ``` sql SELECT n, source FROM ( SELECT toFloat32(number % 10) AS n, 'original' AS source FROM numbers(10) WHERE number % 3 = 1 -) ORDER BY n WITH FILL FROM 0 TO 5.51 STEP 0.5 +) ORDER BY n WITH FILL FROM 0 TO 5.51 STEP 0.5; ``` -returns +Result: ``` text ┌───n─┬─source───┐ @@ -334,7 +334,7 @@ returns └─────┴──────────┘ ``` -For the case when we have multiple fields `ORDER BY field2 WITH FILL, field1 WITH FILL` order of filling will follow the order of fields in `ORDER BY` clause. +For the case with multiple fields `ORDER BY field2 WITH FILL, field1 WITH FILL` order of filling will follow the order of fields in the `ORDER BY` clause. Example: @@ -350,7 +350,7 @@ ORDER BY d1 WITH FILL STEP 5; ``` -returns +Result: ``` text ┌───d1───────┬───d2───────┬─source───┐ @@ -364,9 +364,9 @@ returns └────────────┴────────────┴──────────┘ ``` -Field `d1` does not fill and use default value cause we do not have repeated values for `d2` value, and sequence for `d1` can’t be properly calculated. +Field `d1` does not fill in and use the default value cause we do not have repeated values for `d2` value, and the sequence for `d1` can’t be properly calculated. -The following query with a changed field in `ORDER BY` +The following query with the changed field in `ORDER BY`: ``` sql SELECT @@ -380,7 +380,7 @@ ORDER BY d2 WITH FILL; ``` -returns +Result: ``` text ┌───d1───────┬───d2───────┬─source───┐ diff --git a/docs/en/sql-reference/statements/select/prewhere.md b/docs/en/sql-reference/statements/select/prewhere.md index 663b84f2d48..ada8fff7012 100644 --- a/docs/en/sql-reference/statements/select/prewhere.md +++ b/docs/en/sql-reference/statements/select/prewhere.md @@ -17,8 +17,8 @@ A query may simultaneously specify `PREWHERE` and `WHERE`. In this case, `PREWHE If the `optimize_move_to_prewhere` setting is set to 0, heuristics to automatically move parts of expressions from `WHERE` to `PREWHERE` are disabled. !!! note "Attention" - The `PREWHERE` section is executed before` FINAL`, so the results of `FROM FINAL` queries may be skewed when using` PREWHERE` with fields not in the `ORDER BY` section of a table. - + The `PREWHERE` section is executed before` FINAL`, so the results of `FROM FINAL` queries may be skewed when using` PREWHERE` with fields not in the `ORDER BY` section of a table. + ## Limitations {#limitations} `PREWHERE` is only supported by tables from the `*MergeTree` family. diff --git a/docs/en/sql-reference/statements/select/with.md b/docs/en/sql-reference/statements/select/with.md index 0958f651847..2dca9650340 100644 --- a/docs/en/sql-reference/statements/select/with.md +++ b/docs/en/sql-reference/statements/select/with.md @@ -63,7 +63,7 @@ LIMIT 10; **Example 4:** Reusing expression in a subquery ``` sql -WITH test1 AS (SELECT i + 1, j + 1 FROM test1) +WITH test1 AS (SELECT i + 1, j + 1 FROM test1) SELECT * FROM test1; ``` diff --git a/docs/en/sql-reference/statements/set.md b/docs/en/sql-reference/statements/set.md index c6c8d28257d..e5de5c41284 100644 --- a/docs/en/sql-reference/statements/set.md +++ b/docs/en/sql-reference/statements/set.md @@ -1,5 +1,5 @@ --- -toc_priority: 49 +toc_priority: 50 toc_title: SET --- diff --git a/docs/en/sql-reference/statements/show.md b/docs/en/sql-reference/statements/show.md index eaded449a33..b5df38642ad 100644 --- a/docs/en/sql-reference/statements/show.md +++ b/docs/en/sql-reference/statements/show.md @@ -297,7 +297,7 @@ Returns a list of [user account](../../operations/access-rights.md#user-account- ``` sql SHOW USERS ``` - + ## SHOW ROLES {#show-roles-statement} Returns a list of [roles](../../operations/access-rights.md#role-management). To view another parameters, see system tables [system.roles](../../operations/system-tables/roles.md#system_tables-roles) and [system.role-grants](../../operations/system-tables/role-grants.md#system_tables-role_grants). @@ -335,8 +335,8 @@ Returns a list of [quotas](../../operations/access-rights.md#quotas-management). ``` sql SHOW QUOTAS -``` - +``` + ## SHOW QUOTA {#show-quota-statement} Returns a [quota](../../operations/quotas.md) consumption for all users or for current user. To view another parameters, see system tables [system.quotas_usage](../../operations/system-tables/quotas_usage.md#system_tables-quotas_usage) and [system.quota_usage](../../operations/system-tables/quota_usage.md#system_tables-quota_usage). diff --git a/docs/en/sql-reference/table-functions/dictionary.md b/docs/en/sql-reference/table-functions/dictionary.md index 675fcb5bfdd..ad30cb30adf 100644 --- a/docs/en/sql-reference/table-functions/dictionary.md +++ b/docs/en/sql-reference/table-functions/dictionary.md @@ -13,7 +13,7 @@ Displays the [dictionary](../../sql-reference/dictionaries/external-dictionaries dictionary('dict') ``` -**Arguments** +**Arguments** - `dict` — A dictionary name. [String](../../sql-reference/data-types/string.md). diff --git a/docs/en/sql-reference/table-functions/jdbc.md b/docs/en/sql-reference/table-functions/jdbc.md index 333700358de..4943e0291df 100644 --- a/docs/en/sql-reference/table-functions/jdbc.md +++ b/docs/en/sql-reference/table-functions/jdbc.md @@ -25,7 +25,7 @@ SELECT * FROM jdbc('mysql-dev?p1=233', 'num Int32', 'select toInt32OrZero(''{{p1 ``` ``` sql -SELECT * +SELECT * FROM jdbc('mysql-dev?p1=233', 'num Int32', 'select toInt32OrZero(''{{p1}}'') as num') ``` diff --git a/docs/en/sql-reference/table-functions/mysql.md b/docs/en/sql-reference/table-functions/mysql.md index a174786d4b7..627b81a3ddb 100644 --- a/docs/en/sql-reference/table-functions/mysql.md +++ b/docs/en/sql-reference/table-functions/mysql.md @@ -56,7 +56,7 @@ SELECT name FROM mysql(`mysql1:3306|mysql2:3306|mysql3:3306`, 'mysql_database', 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** diff --git a/docs/en/sql-reference/table-functions/null.md b/docs/en/sql-reference/table-functions/null.md index 355a45a83e1..273091f8fd1 100644 --- a/docs/en/sql-reference/table-functions/null.md +++ b/docs/en/sql-reference/table-functions/null.md @@ -7,13 +7,13 @@ toc_title: null function Creates a temporary table of the specified structure with the [Null](../../engines/table-engines/special/null.md) table engine. According to the `Null`-engine properties, the table data is ignored and the table itself is immediately droped right after the query execution. The function is used for the convenience of test writing and demonstrations. -**Syntax** +**Syntax** ``` sql null('structure') ``` -**Parameter** +**Parameter** - `structure` — A list of columns and column types. [String](../../sql-reference/data-types/string.md). @@ -36,7 +36,7 @@ INSERT INTO t SELECT * FROM numbers_mt(1000000000); DROP TABLE IF EXISTS t; ``` -See also: +See also: - [Null table engine](../../engines/table-engines/special/null.md) diff --git a/docs/en/sql-reference/table-functions/postgresql.md b/docs/en/sql-reference/table-functions/postgresql.md index 7ef664de269..85c9366daf9 100644 --- a/docs/en/sql-reference/table-functions/postgresql.md +++ b/docs/en/sql-reference/table-functions/postgresql.md @@ -43,7 +43,7 @@ PostgreSQL Array types converts into ClickHouse arrays. !!! info "Note" Be careful, in PostgreSQL an array data type column like Integer[] may contain arrays of different dimensions in different rows, but in ClickHouse it is only allowed to have multidimensional arrays of the same dimension in all rows. - + Supports multiple replicas that must be listed by `|`. For example: ```sql diff --git a/docs/en/sql-reference/table-functions/remote.md b/docs/en/sql-reference/table-functions/remote.md index ae399c7e612..9effbb03553 100644 --- a/docs/en/sql-reference/table-functions/remote.md +++ b/docs/en/sql-reference/table-functions/remote.md @@ -20,10 +20,10 @@ remoteSecure('addresses_expr', db.table[, 'user'[, 'password'], sharding_key]) **Parameters** -- `addresses_expr` — An expression that generates addresses of remote servers. This may be just one server address. The server address is `host:port`, or just `host`. - - The host can be specified as the server name, or as the IPv4 or IPv6 address. An IPv6 address is specified in square brackets. - +- `addresses_expr` — An expression that generates addresses of remote servers. This may be just one server address. The server address is `host:port`, or just `host`. + + The host can be specified as the server name, or as the IPv4 or IPv6 address. An IPv6 address is specified in square brackets. + The port is the TCP port on the remote server. If the port is omitted, it uses [tcp_port](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-tcp_port) from the server’s config file in `remote` (by default, 9000) and [tcp_port_secure](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-tcp_port_secure) in `remoteSecure` (by default, 9440). The port is required for an IPv6 address. @@ -68,28 +68,6 @@ Multiple addresses can be comma-separated. In this case, ClickHouse will use dis example01-01-1,example01-02-1 ``` -Part of the expression can be specified in curly brackets. The previous example can be written as follows: - -``` text -example01-0{1,2}-1 -``` - -Curly brackets can contain a range of numbers separated by two dots (non-negative integers). In this case, the range is expanded to a set of values that generate shard addresses. If the first number starts with zero, the values are formed with the same zero alignment. The previous example can be written as follows: - -``` text -example01-{01..02}-1 -``` - -If you have multiple pairs of curly brackets, it generates the direct product of the corresponding sets. - -Addresses and parts of addresses in curly brackets can be separated by the pipe symbol (\|). In this case, the corresponding sets of addresses are interpreted as replicas, and the query will be sent to the first healthy replica. However, the replicas are iterated in the order currently set in the [load_balancing](../../operations/settings/settings.md#settings-load_balancing) setting. This example specifies two shards that each have two replicas: - -``` text -example01-{01..02}-{1|2} -``` - -The number of addresses generated is limited by a constant. Right now this is 1000 addresses. - **Examples** Selecting data from a remote server: @@ -106,4 +84,15 @@ INSERT INTO FUNCTION remote('127.0.0.1', currentDatabase(), 'remote_table') VALU SELECT * FROM remote_table; ``` -[Original article](https://clickhouse.tech/docs/en/sql-reference/table-functions/remote/) +## Globs in Addresses {globs-in-addresses} + +Patterns in curly brackets `{ }` are used to generate a set of shards and to specify replicas. If there are multiple pairs of curly brackets, then the direct product of the corresponding sets is generated. +The following pattern types are supported. + +- {*a*,*b*} - Any number of variants separated by a comma. The pattern is replaced with *a* in the first shard address and it is replaced with *b* in the second shard address and so on. For instance, `example0{1,2}-1` generates addresses `example01-1` and `example02-1`. +- {*n*..*m*} - A range of numbers. This pattern generates shard addresses with incrementing indices from *n* to *m*. `example0{1..2}-1` generates `example01-1` and `example02-1`. +- {*0n*..*0m*} - A range of numbers with leading zeroes. This modification preserves leading zeroes in indices. The pattern `example{01..03}-1` generates `example01-1`, `example02-1` and `example03-1`. +- {*a*|*b*} - Any number of variants separated by a `|`. The pattern specifies replicas. For instance, `example01-{1|2}` generates replicas `example01-1` and `example01-2`. + +The query will be sent to the first healthy replica. However, for `remote` the replicas are iterated in the order currently set in the [load_balancing](../../operations/settings/settings.md#settings-load_balancing) setting. +The number of generated addresses is limited by [table_function_remote_max_addresses](../../operations/settings/settings.md#table_function_remote_max_addresses) setting. diff --git a/docs/en/sql-reference/table-functions/url.md b/docs/en/sql-reference/table-functions/url.md index 2192b69d006..bfad7a67e0d 100644 --- a/docs/en/sql-reference/table-functions/url.md +++ b/docs/en/sql-reference/table-functions/url.md @@ -41,4 +41,7 @@ INSERT INTO FUNCTION url('http://127.0.0.1:8123/?query=INSERT+INTO+test_table+FO SELECT * FROM test_table; ``` -[Original article](https://clickhouse.tech/docs/en/sql-reference/table-functions/url/) +## Globs in URL {globs-in-url} + +Patterns in curly brackets `{ }` are used to generate a set of shards or to specify failover addresses. Supported pattern types and examples see in the description of the [remote](remote.md#globs-in-addresses) function. +Character `|` inside patterns is used to specify failover addresses. They are iterated in the same order as listed in the pattern. The number of generated addresses is limited by [glob_expansion_max_elements](../../operations/settings/settings.md#glob_expansion_max_elements) setting. diff --git a/docs/en/sql-reference/window-functions/index.md b/docs/en/sql-reference/window-functions/index.md index dcab019c9d5..e62808a46bd 100644 --- a/docs/en/sql-reference/window-functions/index.md +++ b/docs/en/sql-reference/window-functions/index.md @@ -5,9 +5,6 @@ toc_title: Window Functions # [experimental] Window Functions -!!! warning "Warning" - This is an experimental feature that is currently in development and is not ready for general use. It will change in unpredictable backwards-incompatible ways in the future releases. Set `allow_experimental_window_functions = 1` to enable it. - ClickHouse supports the standard grammar for defining windows and window functions. The following features are currently supported: | Feature | Support or workaround | diff --git a/docs/en/whats-new/changelog/2020.md b/docs/en/whats-new/changelog/2020.md index 7fb1f5d9377..b54fbacd2b0 100644 --- a/docs/en/whats-new/changelog/2020.md +++ b/docs/en/whats-new/changelog/2020.md @@ -398,18 +398,18 @@ toc_title: '2020' ## ClickHouse release 20.10 ### ClickHouse release v20.10.7.4-stable, 2020-12-24 - -#### Bug Fix - -* Fixed issue when `clickhouse-odbc-bridge` process is unreachable by server on machines with dual `IPv4/IPv6` stack and fixed issue when ODBC dictionary updates are performed using malformed queries and/or cause crashes. This possibly closes [#14489](https://github.com/ClickHouse/ClickHouse/issues/14489). [#18278](https://github.com/ClickHouse/ClickHouse/pull/18278) ([Denis Glazachev](https://github.com/traceon)). -* Fix key comparison between Enum and Int types. This fixes [#17989](https://github.com/ClickHouse/ClickHouse/issues/17989). [#18214](https://github.com/ClickHouse/ClickHouse/pull/18214) ([Amos Bird](https://github.com/amosbird)). + +#### Bug Fix + +* Fixed issue when `clickhouse-odbc-bridge` process is unreachable by server on machines with dual `IPv4/IPv6` stack and fixed issue when ODBC dictionary updates are performed using malformed queries and/or cause crashes. This possibly closes [#14489](https://github.com/ClickHouse/ClickHouse/issues/14489). [#18278](https://github.com/ClickHouse/ClickHouse/pull/18278) ([Denis Glazachev](https://github.com/traceon)). +* Fix key comparison between Enum and Int types. This fixes [#17989](https://github.com/ClickHouse/ClickHouse/issues/17989). [#18214](https://github.com/ClickHouse/ClickHouse/pull/18214) ([Amos Bird](https://github.com/amosbird)). * Fixed unique key convert crash in `MaterializeMySQL` database engine. This fixes [#18186](https://github.com/ClickHouse/ClickHouse/issues/18186) and fixes [#16372](https://github.com/ClickHouse/ClickHouse/issues/16372) [#18211](https://github.com/ClickHouse/ClickHouse/pull/18211) ([Winter Zhang](https://github.com/zhang2014)). * Fixed `std::out_of_range: basic_string` in S3 URL parsing. [#18059](https://github.com/ClickHouse/ClickHouse/pull/18059) ([Vladimir Chebotarev](https://github.com/excitoon)). -* Fixed the issue when some tables not synchronized to ClickHouse from MySQL caused by the fact that convertion MySQL prefix index wasn't supported for MaterializeMySQL. This fixes [#15187](https://github.com/ClickHouse/ClickHouse/issues/15187) and fixes [#17912](https://github.com/ClickHouse/ClickHouse/issues/17912) [#17944](https://github.com/ClickHouse/ClickHouse/pull/17944) ([Winter Zhang](https://github.com/zhang2014)). -* Fix possible segfault in `topK` aggregate function. This closes [#17404](https://github.com/ClickHouse/ClickHouse/issues/17404). [#17845](https://github.com/ClickHouse/ClickHouse/pull/17845) ([Maksim Kita](https://github.com/kitaisreal)). -* Do not restore parts from `WAL` if `in_memory_parts_enable_wal` is disabled. [#17802](https://github.com/ClickHouse/ClickHouse/pull/17802) ([detailyang](https://github.com/detailyang)). -* Fixed problem when ClickHouse fails to resume connection to MySQL servers. [#17681](https://github.com/ClickHouse/ClickHouse/pull/17681) ([Alexander Kazakov](https://github.com/Akazz)). -* Fixed empty `system.stack_trace` table when server is running in daemon mode. [#17630](https://github.com/ClickHouse/ClickHouse/pull/17630) ([Amos Bird](https://github.com/amosbird)). +* Fixed the issue when some tables not synchronized to ClickHouse from MySQL caused by the fact that convertion MySQL prefix index wasn't supported for MaterializeMySQL. This fixes [#15187](https://github.com/ClickHouse/ClickHouse/issues/15187) and fixes [#17912](https://github.com/ClickHouse/ClickHouse/issues/17912) [#17944](https://github.com/ClickHouse/ClickHouse/pull/17944) ([Winter Zhang](https://github.com/zhang2014)). +* Fix possible segfault in `topK` aggregate function. This closes [#17404](https://github.com/ClickHouse/ClickHouse/issues/17404). [#17845](https://github.com/ClickHouse/ClickHouse/pull/17845) ([Maksim Kita](https://github.com/kitaisreal)). +* Do not restore parts from `WAL` if `in_memory_parts_enable_wal` is disabled. [#17802](https://github.com/ClickHouse/ClickHouse/pull/17802) ([detailyang](https://github.com/detailyang)). +* Fixed problem when ClickHouse fails to resume connection to MySQL servers. [#17681](https://github.com/ClickHouse/ClickHouse/pull/17681) ([Alexander Kazakov](https://github.com/Akazz)). +* Fixed empty `system.stack_trace` table when server is running in daemon mode. [#17630](https://github.com/ClickHouse/ClickHouse/pull/17630) ([Amos Bird](https://github.com/amosbird)). * Fixed the behaviour when `clickhouse-client` is used in interactive mode with multiline queries and single line comment was erronously extended till the end of query. This fixes [#13654](https://github.com/ClickHouse/ClickHouse/issues/13654). [#17565](https://github.com/ClickHouse/ClickHouse/pull/17565) ([alexey-milovidov](https://github.com/alexey-milovidov)). * Fixed the issue when server can stop accepting connections in very rare cases. [#17542](https://github.com/ClickHouse/ClickHouse/pull/17542) ([alexey-milovidov](https://github.com/alexey-milovidov)). * Fixed `ALTER` query hang when the corresponding mutation was killed on the different replica. This fixes [#16953](https://github.com/ClickHouse/ClickHouse/issues/16953). [#17499](https://github.com/ClickHouse/ClickHouse/pull/17499) ([alesapin](https://github.com/alesapin)). diff --git a/docs/en/whats-new/security-changelog.md b/docs/en/whats-new/security-changelog.md index bebc9a6035f..97cad9965fd 100644 --- a/docs/en/whats-new/security-changelog.md +++ b/docs/en/whats-new/security-changelog.md @@ -3,6 +3,16 @@ toc_priority: 76 toc_title: Security Changelog --- +## Fixed in ClickHouse 21.4.3.21, 2021-04-12 {#fixed-in-clickhouse-release-21-4-3-21-2021-04-12} + +### CVE-2021-25263 {#cve-2021-25263} + +An attacker that has CREATE DICTIONARY privilege, can read arbitary file outside permitted directory. + +Fix has been pushed to versions 20.8.18.32-lts, 21.1.9.41-stable, 21.2.9.41-stable, 21.3.6.55-lts, 21.4.3.21-stable and later. + +Credits: [Vyacheslav Egoshin](https://twitter.com/vegoshin) + ## Fixed in ClickHouse Release 19.14.3.3, 2019-09-10 {#fixed-in-clickhouse-release-19-14-3-3-2019-09-10} ### CVE-2019-15024 {#cve-2019-15024} diff --git a/docs/ja/development/style.md b/docs/ja/development/style.md index f4b3f9c77dd..596e29f4414 100644 --- a/docs/ja/development/style.md +++ b/docs/ja/development/style.md @@ -749,19 +749,11 @@ CPU命令セットは、サーバー間でサポートされる最小のセッ ## 図書館 {#libraries} -**1.** C++20標準ライブラリが使用されています(実験的な拡張が許可されています)。 `boost` と `Poco` フレームワーク +**1.** The C++20 standard library is used (experimental extensions are allowed), as well as `boost` and `Poco` frameworks. -**2.** 必要に応じて、OSパッケージで利用可能な既知のライブラリを使用できます。 +**2.** It is not allowed to use libraries from OS packages. It is also not allowed to use pre-installed libraries. All libraries should be placed in form of source code in `contrib` directory and built with ClickHouse. -すでに利用可能な良い解決策がある場合は、別のライブラリをインストールする必要がある場合でも、それを使用してください。 - -(が準備をしておいてくださ去の悪い図書館からのコードです。) - -**3.** パッケージに必要なものがない場合や、古いバージョンや間違った種類のコンパイルがある場合は、パッケージにないライブラリをインストールできます。 - -**4.** ライブラリが小さく、独自の複雑なビルドシステムがない場合は、ソースファイルを `contrib` フォルダ。 - -**5.** すでに使用されているライブラリが優先されます。 +**3.** Preference is always given to libraries that are already in use. ## 一般的な推奨事項 {#general-recommendations-1} diff --git a/docs/ja/interfaces/third-party/integrations.md b/docs/ja/interfaces/third-party/integrations.md index 851eeec665f..1cf996a3011 100644 --- a/docs/ja/interfaces/third-party/integrations.md +++ b/docs/ja/interfaces/third-party/integrations.md @@ -45,7 +45,7 @@ toc_title: "\u7D71\u5408" - 監視 - [黒鉛](https://graphiteapp.org) - [グラファウス](https://github.com/yandex/graphouse) - - [カーボンクリックハウス](https://github.com/lomik/carbon-clickhouse) + + - [カーボンクリックハウス](https://github.com/lomik/carbon-clickhouse) - [グラファイト-クリック](https://github.com/lomik/graphite-clickhouse) - [黒鉛-ch-オプティマイザー](https://github.com/innogames/graphite-ch-optimizer) -staled仕切りを最大限に活用する [\*GraphiteMergeTree](../../engines/table-engines/mergetree-family/graphitemergetree.md#graphitemergetree) からのルールの場合 [ロールアップ構成](../../engines/table-engines/mergetree-family/graphitemergetree.md#rollup-configuration) 応用できます - [グラファナ](https://grafana.com/) @@ -103,7 +103,7 @@ toc_title: "\u7D71\u5408" - Ruby - [Ruby on rails](https://rubyonrails.org/) - [activecube](https://github.com/bitquery/activecube) - - [ActiveRecord](https://github.com/PNixx/clickhouse-activerecord) + - [ActiveRecord](https://github.com/PNixx/clickhouse-activerecord) - [GraphQL](https://github.com/graphql) - [activecube-graphql](https://github.com/bitquery/activecube-graphql) diff --git a/docs/ja/operations/server-configuration-parameters/settings.md b/docs/ja/operations/server-configuration-parameters/settings.md index 0ec71b2af69..f544a92e377 100644 --- a/docs/ja/operations/server-configuration-parameters/settings.md +++ b/docs/ja/operations/server-configuration-parameters/settings.md @@ -464,7 +464,7 @@ SSLのサポートは以下によって提供されます `libpoco` 図書館 - extendedVerification – Automatically extended verification of certificates after the session ends. Acceptable values: `true`, `false`. - requireTLSv1 – Require a TLSv1 connection. Acceptable values: `true`, `false`. - requireTLSv1_1 – Require a TLSv1.1 connection. Acceptable values: `true`, `false`. -- requireTLSv1 – Require a TLSv1.2 connection. Acceptable values: `true`, `false`. +- requireTLSv1_2 – Require a TLSv1.2 connection. Acceptable values: `true`, `false`. - fips – Activates OpenSSL FIPS mode. Supported if the library's OpenSSL version supports FIPS. - privateKeyPassphraseHandler – Class (PrivateKeyPassphraseHandler subclass) that requests the passphrase for accessing the private key. For example: ``, `KeyFileHandler`, `test`, ``. - invalidCertificateHandler – Class (a subclass of CertificateHandler) for verifying invalid certificates. For example: ` ConsoleCertificateHandler ` . diff --git a/docs/ja/sql-reference/statements/grant.md b/docs/ja/sql-reference/statements/grant.md index 63ac7f3aafa..4a088e0e78b 100644 --- a/docs/ja/sql-reference/statements/grant.md +++ b/docs/ja/sql-reference/statements/grant.md @@ -15,7 +15,7 @@ toc_title: GRANT ## 権限構文の付与 {#grant-privigele-syntax} ``` sql -GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION] +GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION] [WITH REPLACE OPTION] ``` - `privilege` — Type of privilege. @@ -23,17 +23,19 @@ GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.ta - `user` — ClickHouse user account. この `WITH GRANT OPTION` 句の付与 `user` または `role` 実行する許可を得て `GRANT` クエリ。 ユーザーは、持っているスコープとそれ以下の権限を付与できます。 +この `WITH REPLACE OPTION` 句は `user`または` role`の新しい特権で古い特権を置き換えます, 指定しない場合は、古い特権を古いものに追加してください ## ロール構文の割り当て {#assign-role-syntax} ``` sql -GRANT [ON CLUSTER cluster_name] role [,...] TO {user | another_role | CURRENT_USER} [,...] [WITH ADMIN OPTION] +GRANT [ON CLUSTER cluster_name] role [,...] TO {user | another_role | CURRENT_USER} [,...] [WITH ADMIN OPTION] [WITH REPLACE OPTION] ``` - `role` — ClickHouse user role. - `user` — ClickHouse user account. この `WITH ADMIN OPTION` 句の付与 [ADMIN OPTION](#admin-option-privilege) への特権 `user` または `role`. +この `WITH REPLACE OPTION` 句は`user`または` role`の新しい役割によって古い役割を置き換えます, 指定しない場合は、古い特権を古いものに追加してください ## 使用法 {#grant-usage} diff --git a/docs/ja/sql-reference/statements/select/index.md b/docs/ja/sql-reference/statements/select/index.md index b1a97ba1b28..de337cab8df 100644 --- a/docs/ja/sql-reference/statements/select/index.md +++ b/docs/ja/sql-reference/statements/select/index.md @@ -170,7 +170,7 @@ You can use the following modifiers in `SELECT` queries. ### APPLY {#apply-modifier} -Allows you to invoke some function for each row returned by an outer table expression of a query. +Allows you to invoke some function for each row returned by an outer table expression of a query. **Syntax:** @@ -178,7 +178,7 @@ Allows you to invoke some function for each row returned by an outer table expre SELECT APPLY( ) FROM [db.]table_name ``` -**Example:** +**Example:** ``` sql CREATE TABLE columns_transformers (i Int64, j Int16, k Int64) ENGINE = MergeTree ORDER by (i); @@ -272,9 +272,9 @@ SELECT * REPLACE(i + 1 AS i) EXCEPT (j) APPLY(sum) from columns_transformers; ## SETTINGS in SELECT Query {#settings-in-select} -You can specify the necessary settings right in the `SELECT` query. The setting value is applied only to this query and is reset to default or previous value after the query is executed. +You can specify the necessary settings right in the `SELECT` query. The setting value is applied only to this query and is reset to default or previous value after the query is executed. -Other ways to make settings see [here](../../../operations/settings/index.md). +Other ways to make settings see [here](../../../operations/settings/index.md). **Example** diff --git a/docs/ja/sql-reference/statements/select/offset.md b/docs/ja/sql-reference/statements/select/offset.md index 3efd916bcb8..20ebd972a24 100644 --- a/docs/ja/sql-reference/statements/select/offset.md +++ b/docs/ja/sql-reference/statements/select/offset.md @@ -32,10 +32,10 @@ The `WITH TIES` option is used to return any additional rows that tie for the la !!! note "Note" According to the standard, the `OFFSET` clause must come before the `FETCH` clause if both are present. - + !!! note "Note" The real offset can also depend on the [offset](../../../operations/settings/settings.md#offset) setting. - + ## Examples {#examples} Input table: diff --git a/docs/ja/sql-reference/table-functions/jdbc.md b/docs/ja/sql-reference/table-functions/jdbc.md index 29ecbe25a95..313aefdf581 100644 --- a/docs/ja/sql-reference/table-functions/jdbc.md +++ b/docs/ja/sql-reference/table-functions/jdbc.md @@ -27,7 +27,7 @@ SELECT * FROM jdbc('mysql-dev?p1=233', 'num Int32', 'select toInt32OrZero(''{{p1 ``` ``` sql -SELECT * +SELECT * FROM jdbc('mysql-dev?p1=233', 'num Int32', 'select toInt32OrZero(''{{p1}}'') as num') ``` diff --git a/docs/ru/development/build-osx.md b/docs/ru/development/build-osx.md deleted file mode 120000 index 8e172b919d8..00000000000 --- a/docs/ru/development/build-osx.md +++ /dev/null @@ -1 +0,0 @@ -../../en/development/build-osx.md \ No newline at end of file diff --git a/docs/ru/development/build-osx.md b/docs/ru/development/build-osx.md new file mode 100644 index 00000000000..8d5d06a544c --- /dev/null +++ b/docs/ru/development/build-osx.md @@ -0,0 +1,125 @@ +--- +toc_priority: 65 +toc_title: Сборка на Mac OS X +--- +# Как собрать ClickHouse на Mac OS X {#how-to-build-clickhouse-on-mac-os-x} + +Сборка должна запускаться с x86_64 (Intel) на macOS версии 10.15 (Catalina) и выше в последней версии компилятора Xcode's native AppleClang, Homebrew's vanilla Clang или в GCC-компиляторах. + +## Установка Homebrew {#install-homebrew} + +``` bash +$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" +``` + +## Установка Xcode и инструментов командной строки {#install-xcode-and-command-line-tools} + + 1. Установите из App Store последнюю версию [Xcode](https://apps.apple.com/am/app/xcode/id497799835?mt=12). + + 2. Запустите ее, чтобы принять лицензионное соглашение. Необходимые компоненты установятся автоматически. + + 3. Затем убедитесь, что в системе выбрана последняя версия инструментов командной строки: + + ``` bash + $ sudo rm -rf /Library/Developer/CommandLineTools + $ sudo xcode-select --install + ``` + + 4. Перезагрузитесь. + +## Установка компиляторов, инструментов и библиотек {#install-required-compilers-tools-and-libraries} + + ``` bash + $ brew update + $ brew install cmake ninja libtool gettext llvm gcc + ``` + +## Просмотр исходников ClickHouse {#checkout-clickhouse-sources} + + ``` bash + $ git clone --recursive git@github.com:ClickHouse/ClickHouse.git # or https://github.com/ClickHouse/ClickHouse.git + ``` + +## Сборка ClickHouse {#build-clickhouse} + + Чтобы запустить сборку в компиляторе Xcode's native AppleClang: + + ``` bash + $ cd ClickHouse + $ rm -rf build + $ mkdir build + $ cd build + $ cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DENABLE_JEMALLOC=OFF .. + $ cmake --build . --config RelWithDebInfo + $ cd .. + ``` + +Чтобы запустить сборку в компиляторе Homebrew's vanilla Clang: + + ``` bash + $ cd ClickHouse + $ rm -rf build + $ mkdir build + $ cd build + $ cmake -DCMAKE_C_COMPILER=$(brew --prefix llvm)/bin/clang -DCMAKE_CXX_COMPILER==$(brew --prefix llvm)/bin/clang++ -DCMAKE_BUILD_TYPE=RelWithDebInfo -DENABLE_JEMALLOC=OFF .. + $ cmake -DCMAKE_C_COMPILER=$(brew --prefix llvm)/bin/clang -DCMAKE_CXX_COMPILER=$(brew --prefix llvm)/bin/clang++ -DCMAKE_BUILD_TYPE=RelWithDebInfo -DENABLE_JEMALLOC=OFF .. + $ cmake --build . --config RelWithDebInfo + $ cd .. + ``` + +Чтобы собрать с помощью компилятора Homebrew's vanilla GCC: + + ``` bash + $ cd ClickHouse + $ rm -rf build + $ mkdir build + $ cd build + $ cmake -DCMAKE_C_COMPILER=$(brew --prefix gcc)/bin/gcc-10 -DCMAKE_CXX_COMPILER=$(brew --prefix gcc)/bin/g++-10 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DENABLE_JEMALLOC=OFF .. + $ cmake --build . --config RelWithDebInfo + $ cd .. + ``` + +## Предупреждения {#caveats} + +Если будете запускать `clickhouse-server`, убедитесь, что увеличили системную переменную `maxfiles`. + +!!! info "Note" + Вам понадобится команда `sudo`. + +1. Создайте файл `/Library/LaunchDaemons/limit.maxfiles.plist` и поместите в него следующее: + + ``` xml + + + + + Label + limit.maxfiles + ProgramArguments + + launchctl + limit + maxfiles + 524288 + 524288 + + RunAtLoad + + ServiceIPC + + + + ``` + +2. Выполните команду: + + ``` bash + $ sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist + ``` + +3. Перезагрузитесь. + +4. Чтобы проверить, как это работает, выполните команду `ulimit -n`. + +[Original article](https://clickhouse.tech/docs/en/development/build_osx/) diff --git a/docs/ru/development/contrib.md b/docs/ru/development/contrib.md index f3310836ba9..33a533d7f75 100644 --- a/docs/ru/development/contrib.md +++ b/docs/ru/development/contrib.md @@ -38,3 +38,15 @@ toc_title: "Используемые сторонние библиотеки" | UnixODBC | [LGPL v2.1](https://github.com/ClickHouse-Extras/UnixODBC/tree/b0ad30f7f6289c12b76f04bfb9d466374bb32168) | | zlib-ng | [Zlib License](https://github.com/ClickHouse-Extras/zlib-ng/blob/develop/LICENSE.md) | | zstd | [BSD 3-Clause License](https://github.com/facebook/zstd/blob/dev/LICENSE) | + +## Рекомендации по добавлению сторонних библиотек и поддержанию в них пользовательских изменений {#adding-third-party-libraries} + +1. Весь внешний сторонний код должен находиться в отдельных папках внутри папки `contrib` репозитория ClickHouse. По возможности, используйте сабмодули Git. +2. Клонируйте официальный репозиторий [Clickhouse-extras](https://github.com/ClickHouse-Extras). Используйте официальные репозитории GitHub, если они доступны. +3. Создавайте новую ветку на основе той ветки, которую вы хотите интегрировать: например, `master` -> `clickhouse/master` или `release/vX.Y.Z` -> `clickhouse/release/vX.Y.Z`. +4. Все копии [Clickhouse-extras](https://github.com/ClickHouse-Extras) можно автоматически синхронизировать с удаленными репозиториями. Ветки `clickhouse/...` останутся незатронутыми, поскольку скорее всего никто не будет использовать этот шаблон именования в своих репозиториях. +5. Добавьте сабмодули в папку `contrib` репозитория ClickHouse, на который ссылаются клонированные репозитории. Настройте сабмодули для отслеживания изменений в соответствующих ветках `clickhouse/...`. +6. Каждый раз, когда необходимо внести изменения в код библиотеки, следует создавать отдельную ветку, например `clickhouse/my-fix`. Затем эта ветка должна быть слита (`merge`) в ветку, отслеживаемую сабмодулем, например, в `clickhouse/master` или `clickhouse/release/vX.Y.Z`. +7. Не добавляйте код в клоны репозитория [Clickhouse-extras](https://github.com/ClickHouse-Extras), если имя ветки не соответствует шаблону `clickhouse/...`. +8. Всегда вносите изменения с учетом того, что они попадут в официальный репозиторий. После того как PR будет влит из (ветки разработки/исправлений) вашего личного клона репозитория в [Clickhouse-extras](https://github.com/ClickHouse-Extras), и сабмодуль будет добавлен в репозиторий ClickHouse, рекомендуется сделать еще один PR из (ветки разработки/исправлений) репозитория [Clickhouse-extras](https://github.com/ClickHouse-Extras) в официальный репозиторий библиотеки. Таким образом будут решены следующие задачи: 1) публикуемый код может быть использован многократно и будет иметь более высокую ценность; 2) другие пользователи также смогут использовать его в своих целях; 3) поддержкой кода будут заниматься не только разработчики ClickHouse. +9. Чтобы сабмодуль начал использовать новый код из исходной ветки (например, `master`), сначала следует аккуратно выполнить слияние (`master` -> `clickhouse/master`), и только после этого изменения могут быть добавлены в основной репозиторий ClickHouse. Это связано с тем, что в отслеживаемую ветку (например, `clickhouse/master`) могут быть внесены изменения, и поэтому ветка может отличаться от первоисточника (`master`). diff --git a/docs/ru/development/developer-instruction.md b/docs/ru/development/developer-instruction.md index 463d38a44fb..c568db4731f 100644 --- a/docs/ru/development/developer-instruction.md +++ b/docs/ru/development/developer-instruction.md @@ -43,7 +43,7 @@ ClickHouse не работает и не собирается на 32-битны git clone --recursive git@github.com:ClickHouse/ClickHouse.git cd ClickHouse -Замените *yandex* на имя вашего аккаунта на GitHub. +Замените первое вхождение слова `ClickHouse` в команде для git на имя вашего аккаунта на GitHub. Эта команда создаст директорию ClickHouse, содержащую рабочую копию проекта. @@ -92,7 +92,6 @@ ClickHouse не работает и не собирается на 32-битны # Две последние команды могут быть объединены вместе: git submodule update --init -The next commands would help you to reset all submodules to the initial state (!WARING! - any chenges inside will be deleted): Следующие команды помогут сбросить все сабмодули в изначальное состояние (!ВНИМАНИЕ! - все изменения в сабмодулях будут утеряны): # Synchronizes submodules' remote URL with .gitmodules @@ -128,7 +127,7 @@ Ninja - система запуска сборочных задач. /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" brew install cmake ninja -Проверьте версию CMake: `cmake --version`. Если версия меньше 3.3, то установите новую версию с сайта https://cmake.org/download/ +Проверьте версию CMake: `cmake --version`. Если версия меньше 3.12, то установите новую версию с сайта https://cmake.org/download/ ## Необязательные внешние библиотеки {#neobiazatelnye-vneshnie-biblioteki} @@ -140,7 +139,7 @@ ClickHouse использует для сборки некоторое коли Впрочем, наша среда continuous integration проверяет около десятка вариантов сборки, включая gcc, но сборка с помощью gcc непригодна для использования в продакшене. -On Ubuntu/Debian you can use the automatic installation script (check [official webpage](https://apt.llvm.org/)) +На Ubuntu и Debian вы можете использовать скрипт для автоматической установки (см. [официальный сайт](https://apt.llvm.org/)) ```bash sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" @@ -163,13 +162,19 @@ sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" export CC=clang CXX=clang++ cmake .. -Переменная CC отвечает за компилятор C (сокращение от слов C Compiler), переменная CXX отвечает за выбор компилятора C++ (символ X - это как плюс, но положенный набок, ради того, чтобы превратить его в букву). +Переменная CC отвечает за компилятор C (сокращение от слов C Compiler), переменная CXX отвечает за выбор компилятора C++ (символ X - это как плюс, но положенный набок, ради того, чтобы превратить его в букву). При получении ошибки типа `Could not find compiler set in environment variable CC: clang` необходимо указать в значениях для переменных CC и CXX явную версию компилятора, например, `clang-12` и `clang++-12`. Для более быстрой сборки, можно использовать debug вариант - сборку без оптимизаций. Для этого, укажите параметр `-D CMAKE_BUILD_TYPE=Debug`: cmake -D CMAKE_BUILD_TYPE=Debug .. -Вы можете изменить вариант сборки, выполнив эту команду в директории build. +В случае использования на разработческой машине старого HDD или SSD, а также при желании использовать меньше места для артефактов сборки можно использовать следующую команду: +```bash +cmake -DUSE_DEBUG_HELPERS=1 -DUSE_STATIC_LIBRARIES=0 -DSPLIT_SHARED_LIBRARIES=1 -DCLICKHOUSE_SPLIT_BINARY=1 .. +``` +При этом надо учесть, что получаемые в результате сборки исполнимые файлы будут динамически слинкованы с библиотеками, и поэтому фактически станут непереносимыми на другие компьютеры (либо для этого нужно будет предпринять значительно больше усилий по сравнению со статической сборкой). Плюсом же в данном случае является значительно меньшее время сборки (это проявляется не на первой сборке, а на последующих, после внесения изменений в исходный код - тратится меньшее время на линковку по сравнению со статической сборкой) и значительно меньшее использование места на жёстком диске (экономия более, чем в 3 раза по сравнению со статической сборкой). Для целей разработки, когда планируются только отладочные запуски на том же компьютере, где осуществлялась сборка, это может быть наиболее удобным вариантом. + +Вы можете изменить вариант сборки, выполнив новую команду в директории build. Запустите ninja для сборки: @@ -195,6 +200,14 @@ sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" В процессе сборки могут появится сообщения `libprotobuf WARNING` про protobuf файлы в библиотеке libhdfs2. Это не имеет значения. +В случае получения ошибок вида `error: variable 'y' set but not used [-Werror,-Wunused-but-set-variable]` ножно попробовать использовать другую версию компилятора сlang. Например, на момент написания данного текста описанная выше команда по установке clang для Ubuntu 20.04 по-умолчанию устанавливает clang-13, с которым возникает эта ошибка. Для решения проблемы можно установить clang-12 с помощью команд: +```bash +wget https://apt.llvm.org/llvm.sh +chmod +x llvm.sh +sudo ./llvm.sh 12 +``` +И далее использовать именно его, указав соответствующую версию при установке переменных окружения CC и CXX перед вызовом cmake. + При успешной сборке, вы получите готовый исполняемый файл `ClickHouse/build/programs/clickhouse`: ls -l programs/clickhouse @@ -234,7 +247,7 @@ sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" В качестве простых редакторов кода можно использовать Sublime Text или Visual Studio Code или Kate (все варианты доступны под Linux). -На всякий случай заметим, что CLion самостоятельно создаёт свою build директорию, самостоятельно выбирает тип сборки debug по-умолчанию, для конфигурации использует встроенную в CLion версию CMake вместо установленного вами, а для запуска задач использует make вместо ninja. Это нормально, просто имейте это ввиду, чтобы не возникало путаницы. +На всякий случай заметим, что CLion самостоятельно создаёт свою build директорию, самостоятельно выбирает тип сборки debug по-умолчанию, для конфигурации использует встроенную в CLion версию CMake вместо установленного вами, а для запуска задач использует make вместо ninja (но при желании начиная с версии CLion 2019.3 EAP можно настроить использование ninja, см. подробнее [тут](https://blog.jetbrains.com/clion/2019/10/clion-2019-3-eap-ninja-cmake-generators/)). Это нормально, просто имейте это ввиду, чтобы не возникало путаницы. ## Написание кода {#napisanie-koda} @@ -242,6 +255,8 @@ sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" Стиль кода: https://clickhouse.tech/docs/ru/development/style/ +Рекомендации по добавлению сторонних библиотек и поддержанию в них пользовательских изменений: https://clickhouse.tech/docs/ru/development/contrib/#adding-third-party-libraries + Разработка тестов: https://clickhouse.tech/docs/ru/development/tests/ Список задач: https://github.com/ClickHouse/ClickHouse/issues?q=is%3Aopen+is%3Aissue+label%3A%22easy+task%22 diff --git a/docs/ru/development/style.md b/docs/ru/development/style.md index de29e629ceb..c73eb138c9c 100644 --- a/docs/ru/development/style.md +++ b/docs/ru/development/style.md @@ -820,21 +820,13 @@ The dictionary is configured incorrectly. **10.** Ненужный код удаляется из исходников. -## Библиотеки {#biblioteki} +## Библиотеки {#libraries} -**1.** Используются стандартная библиотека C++20 (допустимо использовать экспериментальные расширения) а также фреймворки `boost`, `Poco`. +**1.** Используются стандартные библиотеки C++20 (допустимо использовать экспериментальные расширения), а также фреймворки `boost`, `Poco`. -**2.** При необходимости, можно использовать любые известные библиотеки, доступные в ОС из пакетов. +**2.** Библиотеки должны быть расположены в виде исходников в директории `contrib` и собираться вместе с ClickHouse. Не разрешено использовать библиотеки, доступные в пакетах ОС, или любые другие способы установки библиотек в систему. Подробнее смотрите раздел [Рекомендации по добавлению сторонних библиотек и поддержанию в них пользовательских изменений](contrib.md#adding-third-party-libraries). -Если есть хорошее готовое решение, то оно используется, даже если для этого придётся установить ещё одну библиотеку. - -(Но будьте готовы к тому, что иногда вам придётся выкидывать плохие библиотеки из кода.) - -**3.** Если в пакетах нет нужной библиотеки, или её версия достаточно старая, или если она собрана не так, как нужно, то можно использовать библиотеку, устанавливаемую не из пакетов. - -**4.** Если библиотека достаточно маленькая и у неё нет своей системы сборки, то следует включить её файлы в проект, в директорию `contrib`. - -**5.** Предпочтение всегда отдаётся уже использующимся библиотекам. +**3.** Предпочтение отдаётся уже использующимся библиотекам. ## Общее {#obshchee-1} @@ -910,4 +902,3 @@ function( const & RangesInDataParts ranges, size_t limit) ``` - diff --git a/docs/ru/engines/database-engines/atomic.md b/docs/ru/engines/database-engines/atomic.md index 8c75be3d93b..8ccb3b968cf 100644 --- a/docs/ru/engines/database-engines/atomic.md +++ b/docs/ru/engines/database-engines/atomic.md @@ -5,12 +5,12 @@ toc_title: Atomic # Atomic {#atomic} -Поддерживает неблокирующие запросы [DROP TABLE](#drop-detach-table) и [RENAME TABLE](#rename-table) и атомарные запросы [EXCHANGE TABLES t1 AND t](#exchange-tables). Движок `Atomic` используется по умолчанию. +Поддерживает неблокирующие запросы [DROP TABLE](#drop-detach-table) и [RENAME TABLE](#rename-table) и атомарные запросы [EXCHANGE TABLES](#exchange-tables). Движок `Atomic` используется по умолчанию. ## Создание БД {#creating-a-database} ``` sql - CREATE DATABASE test[ ENGINE = Atomic]; +CREATE DATABASE test [ENGINE = Atomic]; ``` ## Особенности и рекомендации {#specifics-and-recommendations} @@ -25,16 +25,16 @@ CREATE TABLE name UUID '28f1c61c-2970-457a-bffe-454156ddcfef' (n UInt64) ENGINE ``` ### RENAME TABLE {#rename-table} -Запросы `RENAME` выполняются без изменения UUID и перемещения табличных данных. Эти запросы не ожидают завершения использующих таблицу запросов и будут выполнены мгновенно. +Запросы [RENAME](../../sql-reference/statements/rename.md) выполняются без изменения UUID и перемещения табличных данных. Эти запросы не ожидают завершения использующих таблицу запросов и выполняются мгновенно. ### DROP/DETACH TABLE {#drop-detach-table} При выполнении запроса `DROP TABLE` никакие данные не удаляются. Таблица помечается как удаленная, метаданные перемещаются в папку `/clickhouse_path/metadata_dropped/` и база данных уведомляет фоновый поток. Задержка перед окончательным удалением данных задается настройкой [database_atomic_delay_before_drop_table_sec](../../operations/server-configuration-parameters/settings.md#database_atomic_delay_before_drop_table_sec). Вы можете задать синхронный режим, определяя модификатор `SYNC`. Используйте для этого настройку [database_atomic_wait_for_drop_and_detach_synchronously](../../operations/settings/settings.md#database_atomic_wait_for_drop_and_detach_synchronously). В этом случае запрос `DROP` ждет завершения `SELECT`, `INSERT` и других запросов, которые используют таблицу. Таблица будет фактически удалена, когда она не будет использоваться. -### EXCHANGE TABLES {#exchange-tables} +### EXCHANGE TABLES/DICTIONARIES {#exchange-tables} -Запрос `EXCHANGE` меняет местами две таблицы атомарно. Вместо неатомарной операции: +Запрос [EXCHANGE](../../sql-reference/statements/exchange.md) атомарно меняет местами две таблицы или два словаря. Например, вместо неатомарной операции: ```sql RENAME TABLE new_table TO tmp, old_table TO new_table, tmp TO old_table; @@ -47,7 +47,7 @@ EXCHANGE TABLES new_table AND old_table; ### ReplicatedMergeTree in Atomic Database {#replicatedmergetree-in-atomic-database} -Для таблиц [ReplicatedMergeTree](../table-engines/mergetree-family/replication.md#table_engines-replication) рекомендуется не указывать параметры движка - путь в ZooKeeper и имя реплики. В этом случае будут использоваться параметры конфигурации: [default_replica_path](../../operations/server-configuration-parameters/settings.md#default_replica_path) и [default_replica_name](../../operations/server-configuration-parameters/settings.md#default_replica_name). Если вы хотите определить параметры движка явно, рекомендуется использовать макрос {uuid}. Это удобно, так как автоматически генерируются уникальные пути для каждой таблицы в ZooKeeper. +Для таблиц [ReplicatedMergeTree](../table-engines/mergetree-family/replication.md#table_engines-replication) рекомендуется не указывать параметры движка - путь в ZooKeeper и имя реплики. В этом случае будут использоваться параметры конфигурации: [default_replica_path](../../operations/server-configuration-parameters/settings.md#default_replica_path) и [default_replica_name](../../operations/server-configuration-parameters/settings.md#default_replica_name). Если вы хотите определить параметры движка явно, рекомендуется использовать макрос `{uuid}`. Это удобно, так как автоматически генерируются уникальные пути для каждой таблицы в ZooKeeper. ## Смотрите также diff --git a/docs/ru/engines/database-engines/index.md b/docs/ru/engines/database-engines/index.md index d4fad8f43a9..704d8ce9df2 100644 --- a/docs/ru/engines/database-engines/index.md +++ b/docs/ru/engines/database-engines/index.md @@ -14,9 +14,11 @@ toc_title: "Введение" - [MySQL](../../engines/database-engines/mysql.md) -- [MaterializeMySQL](../../engines/database-engines/materialize-mysql.md) +- [MaterializedMySQL](../../engines/database-engines/materialized-mysql.md) - [Lazy](../../engines/database-engines/lazy.md) - [PostgreSQL](../../engines/database-engines/postgresql.md) +- [Replicated](../../engines/database-engines/replicated.md) + diff --git a/docs/ru/engines/database-engines/materialize-mysql.md b/docs/ru/engines/database-engines/materialized-mysql.md similarity index 50% rename from docs/ru/engines/database-engines/materialize-mysql.md rename to docs/ru/engines/database-engines/materialized-mysql.md index 2067dfecca0..1cd864c01e9 100644 --- a/docs/ru/engines/database-engines/materialize-mysql.md +++ b/docs/ru/engines/database-engines/materialized-mysql.md @@ -1,21 +1,21 @@ --- toc_priority: 29 -toc_title: MaterializeMySQL +toc_title: "[experimental] MaterializedMySQL" --- -# MaterializeMySQL {#materialize-mysql} +# [экспериментальный] MaterializedMySQL {#materialized-mysql} + +**Это экспериментальный движок, который не следует использовать в продакшене.** Создает базу данных ClickHouse со всеми таблицами, существующими в MySQL, и всеми данными в этих таблицах. Сервер ClickHouse работает как реплика MySQL. Он читает файл binlog и выполняет DDL and DML-запросы. -`MaterializeMySQL` — экспериментальный движок баз данных. - ## Создание базы данных {#creating-a-database} ``` sql CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] -ENGINE = MaterializeMySQL('host:port', ['database' | database], 'user', 'password') [SETTINGS ...] +ENGINE = MaterializedMySQL('host:port', ['database' | database], 'user', 'password') [SETTINGS ...] ``` **Параметры движка** @@ -25,13 +25,39 @@ ENGINE = MaterializeMySQL('host:port', ['database' | database], 'user', 'passwor - `user` — пользователь MySQL. - `password` — пароль пользователя. +**Настройки движка** + +- `max_rows_in_buffer` — максимальное количество строк, содержимое которых может кешироваться в памяти (для одной таблицы и данных кеша, которые невозможно запросить). При превышении количества строк, данные будут материализованы. Значение по умолчанию: `65 505`. +- `max_bytes_in_buffer` — максимальное количество байтов, которое разрешено кешировать в памяти (для одной таблицы и данных кеша, которые невозможно запросить). При превышении количества строк, данные будут материализованы. Значение по умолчанию: `1 048 576`. +- `max_rows_in_buffers` — максимальное количество строк, содержимое которых может кешироваться в памяти (для базы данных и данных кеша, которые невозможно запросить). При превышении количества строк, данные будут материализованы. Значение по умолчанию: `65 505`. +- `max_bytes_in_buffers` — максимальное количество байтов, которое разрешено кешировать данным в памяти (для базы данных и данных кеша, которые невозможно запросить). При превышении количества строк, данные будут материализованы. Значение по умолчанию: `1 048 576`. +- `max_flush_data_time` — максимальное время в миллисекундах, в течение которого разрешено кешировать данные в памяти (для базы данных и данных кеша, которые невозможно запросить). При превышении количества указанного периода, данные будут материализованы. Значение по умолчанию: `1000`. +- `max_wait_time_when_mysql_unavailable` — интервал между повторными попытками, если MySQL недоступен. Указывается в миллисекундах. Отрицательное значение отключает повторные попытки. Значение по умолчанию: `1000`. +- `allows_query_when_mysql_lost` — признак, разрешен ли запрос к материализованной таблице при потере соединения с MySQL. Значение по умолчанию: `0` (`false`). + +```sql +CREATE DATABASE mysql ENGINE = MaterializedMySQL('localhost:3306', 'db', 'user', '***') + SETTINGS + allows_query_when_mysql_lost=true, + max_wait_time_when_mysql_unavailable=10000; +``` + +**Настройки на стороне MySQL-сервера** + +Для правильной работы `MaterializedMySQL` следует обязательно указать на сервере MySQL следующие параметры конфигурации: +- `default_authentication_plugin = mysql_native_password` — `MaterializedMySQL` может авторизоваться только с помощью этого метода. +- `gtid_mode = on` — ведение журнала на основе GTID является обязательным для обеспечения правильной репликации. + +!!! attention "Внимание" + При включении `gtid_mode` вы также должны указать `enforce_gtid_consistency = on`. + ## Виртуальные столбцы {#virtual-columns} -При работе с движком баз данных `MaterializeMySQL` используются таблицы семейства [ReplacingMergeTree](../../engines/table-engines/mergetree-family/replacingmergetree.md) с виртуальными столбцами `_sign` и `_version`. +При работе с движком баз данных `MaterializedMySQL` используются таблицы семейства [ReplacingMergeTree](../../engines/table-engines/mergetree-family/replacingmergetree.md) с виртуальными столбцами `_sign` и `_version`. - `_version` — счетчик транзакций. Тип [UInt64](../../sql-reference/data-types/int-uint.md). - `_sign` — метка удаления. Тип [Int8](../../sql-reference/data-types/int-uint.md). Возможные значения: - - `1` — строка не удалена, + - `1` — строка не удалена, - `-1` — строка удалена. ## Поддержка типов данных {#data_types-support} @@ -49,16 +75,25 @@ ENGINE = MaterializeMySQL('host:port', ['database' | database], 'user', 'passwor | DATE, NEWDATE | [Date](../../sql-reference/data-types/date.md) | | DATETIME, TIMESTAMP | [DateTime](../../sql-reference/data-types/datetime.md) | | DATETIME2, TIMESTAMP2 | [DateTime64](../../sql-reference/data-types/datetime64.md) | +| ENUM | [Enum](../../sql-reference/data-types/enum.md) | | STRING | [String](../../sql-reference/data-types/string.md) | | VARCHAR, VAR_STRING | [String](../../sql-reference/data-types/string.md) | | BLOB | [String](../../sql-reference/data-types/string.md) | - -Другие типы не поддерживаются. Если таблица MySQL содержит столбец другого типа, ClickHouse выдаст исключение "Неподдерживаемый тип данных" ("Unhandled data type") и остановит репликацию. +| BINARY | [FixedString](../../sql-reference/data-types/fixedstring.md) | Тип [Nullable](../../sql-reference/data-types/nullable.md) поддерживается. +Другие типы не поддерживаются. Если таблица MySQL содержит столбец другого типа, ClickHouse выдаст исключение "Неподдерживаемый тип данных" ("Unhandled data type") и остановит репликацию. + ## Особенности и рекомендации {#specifics-and-recommendations} +### Ограничения совместимости {#compatibility-restrictions} + +Кроме ограничений на типы данных, существует несколько ограничений по сравнению с базами данных MySQL, которые следует решить до того, как станет возможной репликация: + +- Каждая таблица в MySQL должна содержать `PRIMARY KEY`. +- Репликация для таблиц, содержащих строки со значениями полей `ENUM` вне диапазона значений (определяется размерностью `ENUM`), не будет работать. + ### DDL-запросы {#ddl-queries} DDL-запросы в MySQL конвертируются в соответствующие DDL-запросы в ClickHouse ([ALTER](../../sql-reference/statements/alter/index.md), [CREATE](../../sql-reference/statements/create/index.md), [DROP](../../sql-reference/statements/drop.md), [RENAME](../../sql-reference/statements/rename.md)). Если ClickHouse не может конвертировать какой-либо DDL-запрос, он его игнорирует. @@ -73,13 +108,15 @@ DDL-запросы в MySQL конвертируются в соответств - Запрос `UPDATE` конвертируется в ClickHouse в `INSERT` с `_sign=-1` и `INSERT` с `_sign=1`. -### Выборка из таблиц движка MaterializeMySQL {#select} +### Выборка из таблиц движка MaterializedMySQL {#select} -Запрос `SELECT` из таблиц движка `MaterializeMySQL` имеет некоторую специфику: +Запрос `SELECT` из таблиц движка `MaterializedMySQL` имеет некоторую специфику: - Если в запросе `SELECT` напрямую не указан столбец `_version`, то используется модификатор [FINAL](../../sql-reference/statements/select/from.md#select-from-final). Таким образом, выбираются только строки с `MAX(_version)`. -- Если в запросе `SELECT` напрямую не указан столбец `_sign`, то по умолчанию используется `WHERE _sign=1`. Таким образом, удаленные строки не включаются в результирующий набор. +- Если в запросе `SELECT` напрямую не указан столбец `_sign`, то по умолчанию используется `WHERE _sign=1`. Таким образом, удаленные строки не включаются в результирующий набор. + +- Результат включает комментарии к столбцам, если они существуют в таблицах базы данных MySQL. ### Конвертация индексов {#index-conversion} @@ -90,10 +127,10 @@ DDL-запросы в MySQL конвертируются в соответств **Примечание** - Строки с `_sign=-1` физически не удаляются из таблиц. -- Каскадные запросы `UPDATE/DELETE` не поддерживаются движком `MaterializeMySQL`. +- Каскадные запросы `UPDATE/DELETE` не поддерживаются движком `MaterializedMySQL`. - Репликация может быть легко нарушена. -- Прямые операции изменения данных в таблицах и базах данных `MaterializeMySQL` запрещены. -- На работу `MaterializeMySQL` влияет настройка [optimize_on_insert](../../operations/settings/settings.md#optimize-on-insert). Когда таблица на MySQL сервере меняется, происходит слияние данных в соответсвующей таблице в базе данных `MaterializeMySQL`. +- Прямые операции изменения данных в таблицах и базах данных `MaterializedMySQL` запрещены. +- На работу `MaterializedMySQL` влияет настройка [optimize_on_insert](../../operations/settings/settings.md#optimize-on-insert). Когда таблица на MySQL сервере меняется, происходит слияние данных в соответсвующей таблице в базе данных `MaterializedMySQL`. ## Примеры использования {#examples-of-use} @@ -110,9 +147,9 @@ mysql> SELECT * FROM test; ``` ```text -+---+------+------+ ++---+------+------+ | a | b | c | -+---+------+------+ ++---+------+------+ | 2 | 222 | Wow! | +---+------+------+ ``` @@ -122,7 +159,7 @@ mysql> SELECT * FROM test; База данных и созданная таблица: ``` sql -CREATE DATABASE mysql ENGINE = MaterializeMySQL('localhost:3306', 'db', 'user', '***'); +CREATE DATABASE mysql ENGINE = MaterializedMySQL('localhost:3306', 'db', 'user', '***'); SHOW TABLES FROM mysql; ``` @@ -139,9 +176,9 @@ SELECT * FROM mysql.test; ``` ``` text -┌─a─┬──b─┐ -│ 1 │ 11 │ -│ 2 │ 22 │ +┌─a─┬──b─┐ +│ 1 │ 11 │ +│ 2 │ 22 │ └───┴────┘ ``` @@ -152,8 +189,9 @@ SELECT * FROM mysql.test; ``` ``` text -┌─a─┬───b─┬─c────┐ -│ 2 │ 222 │ Wow! │ +┌─a─┬───b─┬─c────┐ +│ 2 │ 222 │ Wow! │ └───┴─────┴──────┘ ``` +[Оригинальная статья](https://clickhouse.tech/docs/ru/engines/database-engines/materialized-mysql/) diff --git a/docs/ru/engines/database-engines/materialized-postgresql.md b/docs/ru/engines/database-engines/materialized-postgresql.md new file mode 100644 index 00000000000..7c3ba234fd6 --- /dev/null +++ b/docs/ru/engines/database-engines/materialized-postgresql.md @@ -0,0 +1,84 @@ +--- +toc_priority: 30 +toc_title: MaterializedPostgreSQL +--- + +# [экспериментальный] MaterializedPostgreSQL {#materialize-postgresql} + +Создает базу данных ClickHouse с исходным дампом данных таблиц PostgreSQL и запускает процесс репликации, т.е. выполняется применение новых изменений в фоне, как эти изменения происходят в таблице PostgreSQL в удаленной базе данных PostgreSQL. + +Сервер ClickHouse работает как реплика PostgreSQL. Он читает WAL и выполняет DML запросы. Данные, полученные в результате DDL запросов, не реплицируются, но сами запросы могут быть обработаны (описано ниже). + +## Создание базы данных {#creating-a-database} + +``` sql +CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] +ENGINE = MaterializedPostgreSQL('host:port', ['database' | database], 'user', 'password') [SETTINGS ...] +``` + +**Параметры движка** + +- `host:port` — адрес сервера PostgreSQL. +- `database` — имя базы данных на удалённом сервере. +- `user` — пользователь PostgreSQL. +- `password` — пароль пользователя. + +## Настройки {#settings} + +- [materialized_postgresql_max_block_size](../../operations/settings/settings.md#materialized-postgresql-max-block-size) + +- [materialized_postgresql_tables_list](../../operations/settings/settings.md#materialized-postgresql-tables-list) + +- [materialized_postgresql_allow_automatic_update](../../operations/settings/settings.md#materialized-postgresql-allow-automatic-update) + +``` sql +CREATE DATABASE database1 +ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgres_user', 'postgres_password') +SETTINGS materialized_postgresql_max_block_size = 65536, + materialized_postgresql_tables_list = 'table1,table2,table3'; + +SELECT * FROM database1.table1; +``` + +## Требования {#requirements} + +1. Настройка [wal_level](https://postgrespro.ru/docs/postgrespro/10/runtime-config-wal) должна иметь значение `logical`, параметр `max_replication_slots` должен быть равен по меньшей мере `2` в конфигурационном файле в PostgreSQL. + +2. Каждая реплицируемая таблица должна иметь один из следующих [репликационных идентификаторов](https://postgrespro.ru/docs/postgresql/10/sql-altertable#SQL-CREATETABLE-REPLICA-IDENTITY): + +- первичный ключ (по умолчанию) + +- индекс + +``` bash +postgres# CREATE TABLE postgres_table (a Integer NOT NULL, b Integer, c Integer NOT NULL, d Integer, e Integer NOT NULL); +postgres# CREATE unique INDEX postgres_table_index on postgres_table(a, c, e); +postgres# ALTER TABLE postgres_table REPLICA IDENTITY USING INDEX postgres_table_index; +``` + +Первичный ключ всегда проверяется первым. Если он отсутствует, то проверяется индекс, определенный как replica identity index (репликационный идентификатор). +Если индекс используется в качестве репликационного идентификатора, то в таблице должен быть только один такой индекс. +Вы можете проверить, какой тип используется для указанной таблицы, выполнив следующую команду: + +``` bash +postgres# SELECT CASE relreplident + WHEN 'd' THEN 'default' + WHEN 'n' THEN 'nothing' + WHEN 'f' THEN 'full' + WHEN 'i' THEN 'index' + END AS replica_identity +FROM pg_class +WHERE oid = 'postgres_table'::regclass; +``` + +!!! warning "Предупреждение" + Репликация **TOAST**-значений не поддерживается. Для типа данных будет использоваться значение по умолчанию. + +## Пример использования {#example-of-use} + +``` sql +CREATE DATABASE postgresql_db +ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgres_user', 'postgres_password'); + +SELECT * FROM postgresql_db.postgres_table; +``` diff --git a/docs/ru/engines/database-engines/mysql.md b/docs/ru/engines/database-engines/mysql.md index 8d9354a7d7a..ae7cb6dfdb1 100644 --- a/docs/ru/engines/database-engines/mysql.md +++ b/docs/ru/engines/database-engines/mysql.md @@ -53,7 +53,7 @@ ENGINE = MySQL('host:port', ['database' | database], 'user', 'password') ## Использование глобальных переменных {#global-variables-support} -Для лучшей совместимости к глобальным переменным можно обращаться в формате MySQL, как `@@identifier`. +Для лучшей совместимости к глобальным переменным можно обращаться в формате MySQL, как `@@identifier`. Поддерживаются следующие переменные: - `version` diff --git a/docs/ru/engines/database-engines/postgresql.md b/docs/ru/engines/database-engines/postgresql.md index c11dab6f1aa..06e2b35b002 100644 --- a/docs/ru/engines/database-engines/postgresql.md +++ b/docs/ru/engines/database-engines/postgresql.md @@ -14,7 +14,7 @@ toc_title: PostgreSQL ## Создание БД {#creating-a-database} ``` sql -CREATE DATABASE test_database +CREATE DATABASE test_database ENGINE = PostgreSQL('host:port', 'database', 'user', 'password'[, `use_table_cache`]); ``` @@ -43,14 +43,14 @@ ENGINE = PostgreSQL('host:port', 'database', 'user', 'password'[, `use_table_cac | TEXT, CHAR | [String](../../sql-reference/data-types/string.md) | | INTEGER | Nullable([Int32](../../sql-reference/data-types/int-uint.md))| | ARRAY | [Array](../../sql-reference/data-types/array.md) | - + ## Примеры использования {#examples-of-use} Обмен данными между БД ClickHouse и сервером PostgreSQL: ``` sql -CREATE DATABASE test_database +CREATE DATABASE test_database ENGINE = PostgreSQL('postgres1:5432', 'test_database', 'postgres', 'mysecretpassword', 1); ``` @@ -102,7 +102,7 @@ SELECT * FROM test_database.test_table; └────────┴───────┘ ``` -Пусть структура таблицы была изменена в PostgreSQL: +Пусть структура таблицы была изменена в PostgreSQL: ``` sql postgre> ALTER TABLE test_table ADD COLUMN data Text diff --git a/docs/ru/engines/database-engines/replicated.md b/docs/ru/engines/database-engines/replicated.md new file mode 100644 index 00000000000..b4850a8dafd --- /dev/null +++ b/docs/ru/engines/database-engines/replicated.md @@ -0,0 +1,123 @@ +--- +toc_priority: 36 +toc_title: Replicated +--- + +# [экспериментальный] Replicated {#replicated} + +Движок основан на движке [Atomic](../../engines/database-engines/atomic.md). Он поддерживает репликацию метаданных через журнал DDL, записываемый в ZooKeeper и выполняемый на всех репликах для данной базы данных. + +На одном сервере ClickHouse может одновременно работать и обновляться несколько реплицированных баз данных. Но не может существовать нескольких реплик одной и той же реплицированной базы данных. + +## Создание базы данных {#creating-a-database} +``` sql + CREATE DATABASE testdb ENGINE = Replicated('zoo_path', 'shard_name', 'replica_name') [SETTINGS ...] +``` + +**Параметры движка** + +- `zoo_path` — путь в ZooKeeper. Один и тот же путь ZooKeeper соответствует одной и той же базе данных. +- `shard_name` — Имя шарда. Реплики базы данных группируются в шарды по имени. +- `replica_name` — Имя реплики. Имена реплик должны быть разными для всех реплик одного и того же шарда. + +!!! note "Предупреждение" + Для таблиц [ReplicatedMergeTree](../table-engines/mergetree-family/replication.md#table_engines-replication) если аргументы не заданы, то используются аргументы по умолчанию: `/clickhouse/tables/{uuid}/{shard}` и `{replica}`. Они могут быть изменены в серверных настройках: [default_replica_path](../../operations/server-configuration-parameters/settings.md#default_replica_path) и [default_replica_name](../../operations/server-configuration-parameters/settings.md#default_replica_name). Макрос `{uuid}` раскрывается в `UUID` таблицы, `{shard}` и `{replica}` — в значения из конфига сервера. В будущем появится возможность использовать значения `shard_name` и `replica_name` аргументов движка базы данных `Replicated`. + +## Особенности и рекомендации {#specifics-and-recommendations} + +DDL-запросы с базой данных `Replicated` работают похожим образом на [ON CLUSTER](../../sql-reference/distributed-ddl.md) запросы, но с небольшими отличиями. + +Сначала DDL-запрос пытается выполниться на инициаторе (том хосте, который изначально получил запрос от пользователя). Если запрос не выполнился, то пользователь сразу получает ошибку, другие хосты не пытаются его выполнить. Если запрос успешно выполнился на инициаторе, то все остальные хосты будут автоматически делать попытки выполнить его. +Инициатор попытается дождаться выполнения запроса на других хостах (не дольше [distributed_ddl_task_timeout](../../operations/settings/settings.md#distributed_ddl_task_timeout)) и вернёт таблицу со статусами выполнения запроса на каждом хосте. + +Поведение в случае ошибок регулируется настройкой [distributed_ddl_output_mode](../../operations/settings/settings.md#distributed_ddl_output_mode), для `Replicated` лучше выставлять её в `null_status_on_timeout` — т.е. если какие-то хосты не успели выполнить запрос за [distributed_ddl_task_timeout](../../operations/settings/settings.md#distributed_ddl_task_timeout), то вместо исключения для них будет показан статус `NULL` в таблице. + +В системной таблице [system.clusters](../../operations/system-tables/clusters.md) есть кластер с именем, как у реплицируемой базы, который состоит из всех реплик базы. Этот кластер обновляется автоматически при создании/удалении реплик, и его можно использовать для [Distributed](../../engines/table-engines/special/distributed.md#distributed) таблиц. + + При создании новой реплики базы, эта реплика сама создаёт таблицы. Если реплика долго была недоступна и отстала от лога репликации — она сверяет свои локальные метаданные с актуальными метаданными в ZooKeeper, перекладывает лишние таблицы с данными в отдельную нереплицируемую базу (чтобы случайно не удалить что-нибудь лишнее), создаёт недостающие таблицы, обновляет имена таблиц, если были переименования. Данные реплицируются на уровне `ReplicatedMergeTree`, т.е. если таблица не реплицируемая, то данные реплицироваться не будут (база отвечает только за метаданные). + +## Примеры использования {#usage-example} + +Создадим реплицируемую базу на трех хостах: + +``` sql +node1 :) CREATE DATABASE r ENGINE=Replicated('some/path/r','shard1','replica1'); +node2 :) CREATE DATABASE r ENGINE=Replicated('some/path/r','shard1','other_replica'); +node3 :) CREATE DATABASE r ENGINE=Replicated('some/path/r','other_shard','{replica}'); +``` + +Выполним DDL-запрос на одном из хостов: + +``` sql +CREATE TABLE r.rmt (n UInt64) ENGINE=ReplicatedMergeTree ORDER BY n; +``` + +Запрос выполнится на всех остальных хостах: + +``` text +┌─────hosts────────────┬──status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ +│ shard1|replica1 │ 0 │ │ 2 │ 0 │ +│ shard1|other_replica │ 0 │ │ 1 │ 0 │ +│ other_shard|r1 │ 0 │ │ 0 │ 0 │ +└──────────────────────┴─────────┴───────┴─────────────────────┴──────────────────┘ +``` + +Кластер в системной таблице `system.clusters`: + +``` sql +SELECT cluster, shard_num, replica_num, host_name, host_address, port, is_local +FROM system.clusters WHERE cluster='r'; +``` + +``` text +┌─cluster─┬─shard_num─┬─replica_num─┬─host_name─┬─host_address─┬─port─┬─is_local─┐ +│ r │ 1 │ 1 │ node3 │ 127.0.0.1 │ 9002 │ 0 │ +│ r │ 2 │ 1 │ node2 │ 127.0.0.1 │ 9001 │ 0 │ +│ r │ 2 │ 2 │ node1 │ 127.0.0.1 │ 9000 │ 1 │ +└─────────┴───────────┴─────────────┴───────────┴──────────────┴──────┴──────────┘ +``` + +Создадим распределенную таблицу и вставим в нее данные: + +``` sql +node2 :) CREATE TABLE r.d (n UInt64) ENGINE=Distributed('r','r','rmt', n % 2); +node3 :) INSERT INTO r SELECT * FROM numbers(10); +node1 :) SELECT materialize(hostName()) AS host, groupArray(n) FROM r.d GROUP BY host; +``` + +``` text +┌─hosts─┬─groupArray(n)─┐ +│ node1 │ [1,3,5,7,9] │ +│ node2 │ [0,2,4,6,8] │ +└───────┴───────────────┘ +``` + +Добавление реплики: + +``` sql +node4 :) CREATE DATABASE r ENGINE=Replicated('some/path/r','other_shard','r2'); +``` + +Новая реплика автоматически создаст все таблицы, которые есть в базе, а старые реплики перезагрузят из ZooKeeper-а конфигурацию кластера: + +``` text +┌─cluster─┬─shard_num─┬─replica_num─┬─host_name─┬─host_address─┬─port─┬─is_local─┐ +│ r │ 1 │ 1 │ node3 │ 127.0.0.1 │ 9002 │ 0 │ +│ r │ 1 │ 2 │ node4 │ 127.0.0.1 │ 9003 │ 0 │ +│ r │ 2 │ 1 │ node2 │ 127.0.0.1 │ 9001 │ 0 │ +│ r │ 2 │ 2 │ node1 │ 127.0.0.1 │ 9000 │ 1 │ +└─────────┴───────────┴─────────────┴───────────┴──────────────┴──────┴──────────┘ +``` + +Распределенная таблица также получит данные от нового хоста: + +```sql +node2 :) SELECT materialize(hostName()) AS host, groupArray(n) FROM r.d GROUP BY host; +``` + +```text +┌─hosts─┬─groupArray(n)─┐ +│ node2 │ [1,3,5,7,9] │ +│ node4 │ [0,2,4,6,8] │ +└───────┴───────────────┘ +``` \ No newline at end of file diff --git a/docs/ru/engines/table-engines/index.md b/docs/ru/engines/table-engines/index.md index b17b2124250..1636efc5112 100644 --- a/docs/ru/engines/table-engines/index.md +++ b/docs/ru/engines/table-engines/index.md @@ -87,7 +87,7 @@ toc_title: "Введение" Виртуальный столбец — это неотъемлемый атрибут движка таблиц, определенный в исходном коде движка. -Виртуальные столбцы не надо указывать в запросе `CREATE TABLE` и их не отображаются в результатах запросов `SHOW CREATE TABLE` и `DESCRIBE TABLE`. Также виртуальные столбцы доступны только для чтения, поэтому вы не можете вставлять в них данные. +Виртуальные столбцы не надо указывать в запросе `CREATE TABLE` и они не отображаются в результатах запросов `SHOW CREATE TABLE` и `DESCRIBE TABLE`. Также виртуальные столбцы доступны только для чтения, поэтому вы не можете вставлять в них данные. Чтобы получить данные из виртуального столбца, необходимо указать его название в запросе `SELECT`. `SELECT *` не отображает данные из виртуальных столбцов. diff --git a/docs/ru/engines/table-engines/integrations/ExternalDistributed.md b/docs/ru/engines/table-engines/integrations/ExternalDistributed.md index 5b4386ff8b9..d5dd0782fb2 100644 --- a/docs/ru/engines/table-engines/integrations/ExternalDistributed.md +++ b/docs/ru/engines/table-engines/integrations/ExternalDistributed.md @@ -35,7 +35,7 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] - `password` — пароль пользователя. ## Особенности реализации {#implementation-details} - + Поддерживает несколько реплик, которые должны быть перечислены через `|`, а шарды — через `,`. Например: ```sql diff --git a/docs/ru/engines/table-engines/integrations/embedded-rocksdb.md b/docs/ru/engines/table-engines/integrations/embedded-rocksdb.md index 5a7909f63b2..617fd953406 100644 --- a/docs/ru/engines/table-engines/integrations/embedded-rocksdb.md +++ b/docs/ru/engines/table-engines/integrations/embedded-rocksdb.md @@ -15,16 +15,16 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], ... -) ENGINE = EmbeddedRocksDB +) ENGINE = EmbeddedRocksDB PRIMARY KEY(primary_key_name); ``` Обязательные параметры: - `primary_key_name` может быть любое имя столбца из списка столбцов. -- Указание первичного ключа `primary key` является обязательным. Он будет сериализован в двоичном формате как ключ `rocksdb`. +- Указание первичного ключа `primary key` является обязательным. Он будет сериализован в двоичном формате как ключ `rocksdb`. - Поддерживается только один столбец в первичном ключе. -- Столбцы, которые отличаются от первичного ключа, будут сериализованы в двоичном формате как значение `rockdb` в соответствующем порядке. +- Столбцы, которые отличаются от первичного ключа, будут сериализованы в двоичном формате как значение `rockdb` в соответствующем порядке. - Запросы с фильтрацией по ключу `equals` или `in` оптимизируются для поиска по нескольким ключам из `rocksdb`. Пример: diff --git a/docs/ru/engines/table-engines/integrations/hdfs.md b/docs/ru/engines/table-engines/integrations/hdfs.md index c96ac12cd2a..5949cc8a0d7 100644 --- a/docs/ru/engines/table-engines/integrations/hdfs.md +++ b/docs/ru/engines/table-engines/integrations/hdfs.md @@ -7,7 +7,7 @@ toc_title: HDFS Управляет данными в HDFS. Данный движок похож на движки [File](../special/file.md#table_engines-file) и [URL](../special/url.md#table_engines-url). -## Использование движка {#ispolzovanie-dvizhka} +## Использование движка {#usage} ``` sql ENGINE = HDFS(URI, format) @@ -44,13 +44,13 @@ SELECT * FROM hdfs_engine_table LIMIT 2 └──────┴───────┘ ``` -## Детали реализации {#detali-realizatsii} +## Детали реализации {#implementation-details} - Поддерживается многопоточное чтение и запись. +- Поддерживается репликация без копирования данных ([zero-copy](../../../operations/storing-data.md#zero-copy)). - Не поддерживается: - использование операций `ALTER` и `SELECT...SAMPLE`; - - индексы; - - репликация. + - индексы. **Шаблоны в пути** @@ -67,12 +67,12 @@ SELECT * FROM hdfs_engine_table LIMIT 2 1. Предположим, у нас есть несколько файлов со следующими URI в HDFS: -- ‘hdfs://hdfs1:9000/some_dir/some_file_1’ -- ‘hdfs://hdfs1:9000/some_dir/some_file_2’ -- ‘hdfs://hdfs1:9000/some_dir/some_file_3’ -- ‘hdfs://hdfs1:9000/another_dir/some_file_1’ -- ‘hdfs://hdfs1:9000/another_dir/some_file_2’ -- ‘hdfs://hdfs1:9000/another_dir/some_file_3’ +- 'hdfs://hdfs1:9000/some_dir/some_file_1' +- 'hdfs://hdfs1:9000/some_dir/some_file_2' +- 'hdfs://hdfs1:9000/some_dir/some_file_3' +- 'hdfs://hdfs1:9000/another_dir/some_file_1' +- 'hdfs://hdfs1:9000/another_dir/some_file_2' +- 'hdfs://hdfs1:9000/another_dir/some_file_3' 1. Есть несколько возможностей создать таблицу, состояющую из этих шести файлов: @@ -122,8 +122,9 @@ CREATE TABLE big_table (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9 ``` -### Список возможных опций конфигурации со значениями по умолчанию -#### Поддерживаемые из libhdfs3 +### Параметры конфигурации {#configuration-options} + +#### Поддерживаемые из libhdfs3 {#supported-by-libhdfs3} | **параметр** | **по умолчанию** | @@ -180,7 +181,7 @@ CREATE TABLE big_table (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9 |hadoop\_kerberos\_principal | "" | |hadoop\_kerberos\_kinit\_command | kinit | -#### Ограничения {#limitations} +### Ограничения {#limitations} * hadoop\_security\_kerberos\_ticket\_cache\_path могут быть определены только на глобальном уровне ## Поддержка Kerberos {#kerberos-support} @@ -193,7 +194,7 @@ CREATE TABLE big_table (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9 Если hadoop\_kerberos\_keytab, hadoop\_kerberos\_principal или hadoop\_kerberos\_kinit\_command указаны в настройках, kinit будет вызван. hadoop\_kerberos\_keytab и hadoop\_kerberos\_principal обязательны в этом случае. Необходимо также будет установить kinit и файлы конфигурации krb5. -## Виртуальные столбцы {#virtualnye-stolbtsy} +## Виртуальные столбцы {#virtual-columns} - `_path` — Путь к файлу. - `_file` — Имя файла. @@ -201,4 +202,3 @@ CREATE TABLE big_table (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9 **См. также** - [Виртуальные колонки](../../../engines/table-engines/index.md#table_engines-virtual_columns) - diff --git a/docs/ru/engines/table-engines/integrations/materialized-postgresql.md b/docs/ru/engines/table-engines/integrations/materialized-postgresql.md new file mode 100644 index 00000000000..0f707749f07 --- /dev/null +++ b/docs/ru/engines/table-engines/integrations/materialized-postgresql.md @@ -0,0 +1,55 @@ +--- +toc_priority: 12 +toc_title: MaterializedPostgreSQL +--- + +# MaterializedPostgreSQL {#materialize-postgresql} + +Создает таблицу ClickHouse с исходным дампом данных таблицы PostgreSQL и запускает процесс репликации, т.е. выполняется применение новых изменений в фоне, как эти изменения происходят в таблице PostgreSQL в удаленной базе данных PostgreSQL. + +Если требуется более одной таблицы, вместо движка таблиц рекомендуется использовать движок баз данных [MaterializedPostgreSQL](../../../engines/database-engines/materialized-postgresql.md) и с помощью настройки [materialized_postgresql_tables_list](../../../operations/settings/settings.md#materialized-postgresql-tables-list) указывать таблицы, которые нужно реплицировать. Это будет намного лучше с точки зрения нагрузки на процессор, уменьшит количество подключений и количество слотов репликации внутри удаленной базы данных PostgreSQL. + +## Создание таблицы {#creating-a-table} + +``` sql +CREATE TABLE postgresql_db.postgresql_replica (key UInt64, value UInt64) +ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgresql_replica', 'postgres_user', 'postgres_password') +PRIMARY KEY key; +``` + +**Параметры движка** + +- `host:port` — адрес сервера PostgreSQL. +- `database` — имя базы данных на удалённом сервере. +- `table` — имя таблицы на удалённом сервере. +- `user` — пользователь PostgreSQL. +- `password` — пароль пользователя. + +## Требования {#requirements} + +1. Настройка [wal_level](https://postgrespro.ru/docs/postgrespro/10/runtime-config-wal) должна иметь значение `logical`, параметр `max_replication_slots` должен быть равен по меньшей мере `2` в конфигурационном файле в PostgreSQL. + +2. Таблица, созданная с помощью движка `MaterializedPostgreSQL`, должна иметь первичный ключ — такой же, как replica identity index (по умолчанию: первичный ключ) таблицы PostgreSQL (смотрите [replica identity index](../../../engines/database-engines/materialized-postgresql.md#requirements)). + +3. Допускается только база данных [Atomic](https://en.wikipedia.org/wiki/Atomicity_(database_systems)). + +## Виртуальные столбцы {#virtual-columns} + +- `_version` — счетчик транзакций. Тип: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `_sign` — метка удаления. Тип: [Int8](../../../sql-reference/data-types/int-uint.md). Возможные значения: + - `1` — строка не удалена, + - `-1` — строка удалена. + +Эти столбцы не нужно добавлять при создании таблицы. Они всегда доступны в `SELECT` запросе. +Столбец `_version` равен позиции `LSN` в `WAL`, поэтому его можно использовать для проверки актуальности репликации. + +``` sql +CREATE TABLE postgresql_db.postgresql_replica (key UInt64, value UInt64) +ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgresql_replica', 'postgres_user', 'postgres_password') +PRIMARY KEY key; + +SELECT key, value, _version FROM postgresql_db.postgresql_replica; +``` + +!!! warning "Предупреждение" + Репликация **TOAST**-значений не поддерживается. Для типа данных будет использоваться значение по умолчанию. diff --git a/docs/ru/engines/table-engines/integrations/mongodb.md b/docs/ru/engines/table-engines/integrations/mongodb.md index 97f903bdf89..05820d03fe6 100644 --- a/docs/ru/engines/table-engines/integrations/mongodb.md +++ b/docs/ru/engines/table-engines/integrations/mongodb.md @@ -37,7 +37,7 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name ``` text CREATE TABLE mongo_table ( - key UInt64, + key UInt64, data String ) ENGINE = MongoDB('mongo1:27017', 'test', 'simple_table', 'testuser', 'clickhouse'); ``` diff --git a/docs/ru/engines/table-engines/integrations/postgresql.md b/docs/ru/engines/table-engines/integrations/postgresql.md index caf3bb8c69a..b2b0db3067a 100644 --- a/docs/ru/engines/table-engines/integrations/postgresql.md +++ b/docs/ru/engines/table-engines/integrations/postgresql.md @@ -33,7 +33,7 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] - `table` — имя таблицы. - `user` — имя пользователя PostgreSQL. - `password` — пароль пользователя PostgreSQL. -- `schema` — имя схемы, если не используется схема по умолчанию. Необязательный аргумент. +- `schema` — имя схемы, если не используется схема по умолчанию. Необязательный аргумент. ## Особенности реализации {#implementation-details} @@ -49,14 +49,14 @@ PostgreSQL массивы конвертируются в массивы ClickHo !!! info "Внимание" Будьте внимательны, в PostgreSQL массивы, созданные как `type_name[]`, являются многомерными и могут содержать в себе разное количество измерений в разных строках одной таблицы. Внутри ClickHouse допустимы только многомерные массивы с одинаковым кол-вом измерений во всех строках таблицы. - + Поддерживает несколько реплик, которые должны быть перечислены через `|`. Например: ```sql CREATE TABLE test_replicas (id UInt32, name String) ENGINE = PostgreSQL(`postgres{2|3|4}:5432`, 'clickhouse', 'test_replicas', 'postgres', 'mysecretpassword'); ``` -При использовании словаря PostgreSQL поддерживается приоритет реплик. Чем больше номер реплики, тем ниже ее приоритет. Наивысший приоритет у реплики с номером `0`. +При использовании словаря PostgreSQL поддерживается приоритет реплик. Чем больше номер реплики, тем ниже ее приоритет. Наивысший приоритет у реплики с номером `0`. В примере ниже реплика `example01-1` имеет более высокий приоритет: @@ -119,7 +119,7 @@ ENGINE = PostgreSQL('localhost:5432', 'public', 'test', 'postges_user', 'postgre ``` ``` sql -SELECT * FROM postgresql_table WHERE str IN ('test'); +SELECT * FROM postgresql_table WHERE str IN ('test'); ``` ``` text @@ -143,7 +143,7 @@ CREATE TABLE pg_table_schema_with_dots (a UInt32) ENGINE PostgreSQL('localhost:5432', 'clickhouse', 'nice.table', 'postgrsql_user', 'password', 'nice.schema'); ``` -**См. также** +**См. также** - [Табличная функция `postgresql`](../../../sql-reference/table-functions/postgresql.md) - [Использование PostgreSQL в качестве источника для внешнего словаря](../../../sql-reference/dictionaries/external-dictionaries/external-dicts-dict-sources.md#dicts-external_dicts_dict_sources-postgresql) diff --git a/docs/ru/engines/table-engines/integrations/s3.md b/docs/ru/engines/table-engines/integrations/s3.md index 4c910db4b92..5895bd43d2f 100644 --- a/docs/ru/engines/table-engines/integrations/s3.md +++ b/docs/ru/engines/table-engines/integrations/s3.md @@ -47,10 +47,10 @@ SELECT * FROM s3_engine_table LIMIT 2; ## Детали реализации {#implementation-details} - Чтение и запись могут быть параллельными. +- Поддерживается репликация без копирования данных ([zero-copy](../../../operations/storing-data.md#zero-copy)). - Не поддерживаются: - запросы `ALTER` и `SELECT...SAMPLE`, - - индексы, - - репликация. + - индексы. ## Символы подстановки {#wildcards-in-path} @@ -72,7 +72,7 @@ SELECT * FROM s3_engine_table LIMIT 2; - `s3_max_redirects` — максимальное количество разрешенных переадресаций S3. Значение по умолчанию — `10`. - `s3_single_read_retries` — максимальное количество попыток запроса при единичном чтении. Значение по умолчанию — `4`. -Соображение безопасности: если злонамеренный пользователь попробует указать произвольные URL-адреса S3, параметр `s3_max_redirects` должен быть установлен в ноль, чтобы избежать атак [SSRF] (https://en.wikipedia.org/wiki/Server-side_request_forgery). Как альтернатива, в конфигурации сервера должен быть указан `remote_host_filter`. +Соображение безопасности: если злонамеренный пользователь попробует указать произвольные URL-адреса S3, параметр `s3_max_redirects` должен быть установлен в ноль, чтобы избежать атак [SSRF](https://en.wikipedia.org/wiki/Server-side_request_forgery). Как альтернатива, в конфигурации сервера должен быть указан `remote_host_filter`. ## Настройки точки приема запроса {#endpoint-settings} diff --git a/docs/ru/engines/table-engines/log-family/index.md b/docs/ru/engines/table-engines/log-family/index.md index 7737eac2f43..5eaf8dd0cfc 100644 --- a/docs/ru/engines/table-engines/log-family/index.md +++ b/docs/ru/engines/table-engines/log-family/index.md @@ -14,6 +14,8 @@ toc_priority: 29 - [Log](log.md) - [TinyLog](tinylog.md) +Табличные движки семейства `Log` могут хранить данные в распределенных файловых системах [HDFS](../../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-hdfs) или [S3](../../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-s3). + ## Общие свойства {#obshchie-svoistva} Движки: diff --git a/docs/ru/engines/table-engines/log-family/log.md b/docs/ru/engines/table-engines/log-family/log.md index 6c5bf2221f8..8ead518ebee 100644 --- a/docs/ru/engines/table-engines/log-family/log.md +++ b/docs/ru/engines/table-engines/log-family/log.md @@ -5,9 +5,8 @@ toc_title: Log # Log {#log} -Движок относится к семейству движков Log. Смотрите общие свойства и различия движков в статье [Семейство Log](index.md). - -Отличается от [TinyLog](tinylog.md) тем, что вместе с файлами столбцов лежит небольшой файл «засечек». Засечки пишутся на каждый блок данных и содержат смещение - с какого места нужно читать файл, чтобы пропустить заданное количество строк. Это позволяет читать данные из таблицы в несколько потоков. -При конкурентном доступе к данным, чтения могут выполняться одновременно, а записи блокируют чтения и друг друга. -Движок Log не поддерживает индексы. Также, если при записи в таблицу произошёл сбой, то таблица станет битой, и чтения из неё будут возвращать ошибку. Движок Log подходит для временных данных, write-once таблиц, а также для тестовых и демонстрационных целей. +Движок относится к семейству движков `Log`. Смотрите общие свойства и различия движков в статье [Семейство Log](../../../engines/table-engines/log-family/index.md). +Отличается от [TinyLog](../../../engines/table-engines/log-family/tinylog.md) тем, что вместе с файлами столбцов лежит небольшой файл "засечек". Засечки пишутся на каждый блок данных и содержат смещение: с какого места нужно читать файл, чтобы пропустить заданное количество строк. Это позволяет читать данные из таблицы в несколько потоков. +При конкурентном доступе к данным чтения могут выполняться одновременно, а записи блокируют чтения и друг друга. +Движок `Log` не поддерживает индексы. Также, если при записи в таблицу произошёл сбой, то таблица станет битой, и чтения из нее будут возвращать ошибку. Движок `Log` подходит для временных данных, write-once таблиц, а также для тестовых и демонстрационных целей. diff --git a/docs/ru/engines/table-engines/mergetree-family/collapsingmergetree.md b/docs/ru/engines/table-engines/mergetree-family/collapsingmergetree.md index 424fcbb5873..3e5acae2b1d 100644 --- a/docs/ru/engines/table-engines/mergetree-family/collapsingmergetree.md +++ b/docs/ru/engines/table-engines/mergetree-family/collapsingmergetree.md @@ -116,7 +116,7 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] Для каждого результирующего куска данных ClickHouse сохраняет: -1. Первую строку отмены состояния и последнюю строку состояния, если количество строк обоих видов совпадает и последняя строка — строка состояния. +1. Первую строку отмены состояния и последнюю строку состояния, если количество строк обоих видов совпадает и последняя строка — строка состояния. 2. Последнюю строку состояния, если строк состояния на одну больше, чем строк отмены состояния. 3. Первую строку отмены состояния, если их на одну больше, чем строк состояния. 4. Ни одну из строк во всех остальных случаях. diff --git a/docs/ru/engines/table-engines/mergetree-family/graphitemergetree.md b/docs/ru/engines/table-engines/mergetree-family/graphitemergetree.md index f3e915a413b..fab796b8413 100644 --- a/docs/ru/engines/table-engines/mergetree-family/graphitemergetree.md +++ b/docs/ru/engines/table-engines/mergetree-family/graphitemergetree.md @@ -38,9 +38,7 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] - Значение метрики. Тип данных: любой числовой. -- Версия метрики. Тип данных: любой числовой. - - ClickHouse сохраняет строки с последней версией или последнюю записанную строку, если версии совпадают. Другие строки удаляются при слиянии кусков данных. +- Версия метрики. Тип данных: любой числовой (ClickHouse сохраняет строки с последней версией или последнюю записанную строку, если версии совпадают. Другие строки удаляются при слиянии кусков данных). Имена этих столбцов должны быть заданы в конфигурации rollup. @@ -134,7 +132,7 @@ default - `regexp` – шаблон имени метрики. - `age` – минимальный возраст данных в секундах. - `precision` – точность определения возраста данных в секундах. Должен быть делителем для 86400 (количество секунд в сутках). -- `function` – имя агрегирующей функции, которую следует применить к данным, чей возраст оказался в интервале `[age, age + precision]`. +- `function` – имя агрегирующей функции, которую следует применить к данным, чей возраст оказался в интервале `[age, age + precision]`. Допустимые функции: min/max/any/avg. Avg вычисляется неточно, как среднее от средних. ### Пример конфигурации {#configuration-example} @@ -171,3 +169,6 @@ default ``` + +!!! warning "Внимание" + Прореживание данных производится во время слияний. Обычно для старых партций слияния не запускаются, поэтому для прореживания надо иницировать незапланированное слияние используя [optimize](../../../sql-reference/statements/optimize.md). Или использовать дополнительные инструменты, например [graphite-ch-optimizer](https://github.com/innogames/graphite-ch-optimizer). diff --git a/docs/ru/engines/table-engines/mergetree-family/mergetree.md b/docs/ru/engines/table-engines/mergetree-family/mergetree.md index e16f71b16cf..e688d726554 100644 --- a/docs/ru/engines/table-engines/mergetree-family/mergetree.md +++ b/docs/ru/engines/table-engines/mergetree-family/mergetree.md @@ -68,7 +68,7 @@ ORDER BY expr - `SAMPLE BY` — выражение для сэмплирования. Необязательный параметр. - Если используется выражение для сэмплирования, то первичный ключ должен содержать его. Пример: `SAMPLE BY intHash32(UserID) ORDER BY (CounterID, EventDate, intHash32(UserID))`. + Если используется выражение для сэмплирования, то первичный ключ должен содержать его. Результат выражения для сэмплирования должен быть беззнаковым целым числом. Пример: `SAMPLE BY intHash32(UserID) ORDER BY (CounterID, EventDate, intHash32(UserID))`. - `TTL` — список правил, определяющих длительности хранения строк, а также задающих правила перемещения частей на определённые тома или диски. Необязательный параметр. @@ -375,6 +375,24 @@ INDEX b (u64 * length(str), i32 + f64 * 100, date, str) TYPE set(100) GRANULARIT - `s != 1` - `NOT startsWith(s, 'test')` +### Проекции {#projections} +Проекции похожи на материализованные представления, но определяются на уровне партов. Это обеспечивает гарантии согласованности наряду с автоматическим использованием в запросах. + +#### Запрос {#projection-query} +Запрос проекции — это то, что определяет проекцию. Он имеет следующую грамматику: + +`SELECT [GROUP BY] [ORDER BY]` + +Он неявно выбирает данные из родительской таблицы. + +#### Хранение {#projection-storage} +Проекции хранятся в каталоге парта. Это похоже на хранение индексов, но используется подкаталог, в котором хранится анонимный парт таблицы MergeTree. Таблица создается запросом определения проекции. Если есть конструкция GROUP BY, то базовый механизм хранения становится AggregatedMergeTree, а все агрегатные функции преобразуются в AggregateFunction. Если есть конструкция ORDER BY, таблица MergeTree будет использовать его в качестве выражения первичного ключа. Во время процесса слияния парт проекции будет слит с помощью процедуры слияния ее хранилища. Контрольная сумма парта родительской таблицы будет включать парт проекции. Другие процедуры аналогичны индексам пропуска данных. + +#### Анализ запросов {#projection-query-analysis} +1. Проверить, можно ли использовать проекцию в данном запросе, то есть, что с ней выходит тот же результат, что и с запросом к базовой таблице. +2. Выбрать наиболее подходящее совпадение, содержащее наименьшее количество гранул для чтения. +3. План запроса, который использует проекции, будет отличаться от того, который использует исходные парты. При отсутствии проекции в некоторых партах можно расширить план, чтобы «проецировать» на лету. + ## Конкурентный доступ к данным {#concurrent-data-access} Для конкурентного доступа к таблице используется мультиверсионность. То есть, при одновременном чтении и обновлении таблицы, данные будут читаться из набора кусочков, актуального на момент запроса. Длинных блокировок нет. Вставки никак не мешают чтениям. @@ -771,7 +789,6 @@ SETTINGS storage_policy = 'moving_from_ssd_to_hdd' - `cache_path` — путь в локальной файловой системе, где будут храниться кэш засечек и файлы индекса. Значение по умолчанию: `/var/lib/clickhouse/disks//cache/`. - `skip_access_check` — признак, выполнять ли проверку доступов при запуске диска. Если установлено значение `true`, то проверка не выполняется. Значение по умолчанию: `false`. - Диск S3 может быть сконфигурирован как `main` или `cold`: ``` xml diff --git a/docs/ru/engines/table-engines/mergetree-family/replication.md b/docs/ru/engines/table-engines/mergetree-family/replication.md index cb92084695a..6a259ebd3b8 100644 --- a/docs/ru/engines/table-engines/mergetree-family/replication.md +++ b/docs/ru/engines/table-engines/mergetree-family/replication.md @@ -65,7 +65,7 @@ ClickHouse хранит метаинформацию о репликах в [Apa Репликация асинхронная, мульти-мастер. Запросы `INSERT` и `ALTER` можно направлять на любой доступный сервер. Данные вставятся на сервер, где выполнен запрос, а затем скопируются на остальные серверы. В связи с асинхронностью, только что вставленные данные появляются на остальных репликах с небольшой задержкой. Если часть реплик недоступна, данные на них запишутся тогда, когда они станут доступны. Если реплика доступна, то задержка составляет столько времени, сколько требуется для передачи блока сжатых данных по сети. Количество потоков для выполнения фоновых задач можно задать с помощью настройки [background_schedule_pool_size](../../../operations/settings/settings.md#background_schedule_pool_size). -Движок `ReplicatedMergeTree` использует отдельный пул потоков для скачивания кусков данных. Размер пула ограничен настройкой [background_fetches_pool_size](../../../operations/settings/settings.md#background_fetches_pool_size), которую можно указать при перезапуске сервера. +Движок `ReplicatedMergeTree` использует отдельный пул потоков для скачивания кусков данных. Размер пула ограничен настройкой [background_fetches_pool_size](../../../operations/settings/settings.md#background_fetches_pool_size), которую можно указать при перезапуске сервера. По умолчанию, запрос INSERT ждёт подтверждения записи только от одной реплики. Если данные были успешно записаны только на одну реплику, и сервер с этой репликой перестал существовать, то записанные данные будут потеряны. Вы можете включить подтверждение записи от нескольких реплик, используя настройку `insert_quorum`. @@ -120,7 +120,7 @@ CREATE TABLE table_name -Как видно в примере, эти параметры могут содержать подстановки в фигурных скобках. Подставляемые значения достаются из конфигурационного файла, из секции «[macros](../../../operations/server-configuration-parameters/settings/#macros)». +Как видно в примере, эти параметры могут содержать подстановки в фигурных скобках. Подставляемые значения достаются из конфигурационного файла, из секции «[macros](../../../operations/server-configuration-parameters/settings/#macros)». Пример: @@ -142,7 +142,7 @@ CREATE TABLE table_name `table_name` - имя узла для таблицы в ZooKeeper. Разумно делать его таким же, как имя таблицы. Оно указывается явно, так как, в отличие от имени таблицы, оно не меняется после запроса RENAME. *Подсказка*: можно также указать имя базы данных перед `table_name`, например `db_name.table_name` -Можно использовать две встроенных подстановки `{database}` и `{table}`, они раскрываются в имя таблицы и в имя базы данных соответственно (если эти подстановки не переопределены в секции `macros`). Т.о. Zookeeper путь можно задать как `'/clickhouse/tables/{layer}-{shard}/{database}/{table}'`. +Можно использовать две встроенных подстановки `{database}` и `{table}`, они раскрываются в имя таблицы и в имя базы данных соответственно (если эти подстановки не переопределены в секции `macros`). Т.о. Zookeeper путь можно задать как `'/clickhouse/tables/{layer}-{shard}/{database}/{table}'`. Будьте осторожны с переименованиями таблицы при использовании этих автоматических подстановок. Путь в Zookeeper-е нельзя изменить, а подстановка при переименовании таблицы раскроется в другой путь, таблица будет обращаться к несуществующему в Zookeeper-е пути и перейдет в режим только для чтения. Имя реплики — то, что идентифицирует разные реплики одной и той же таблицы. Можно использовать для него имя сервера, как показано в примере. Впрочем, достаточно, чтобы имя было уникально лишь в пределах каждого шарда. @@ -163,7 +163,7 @@ CREATE TABLE table_name ``` sql CREATE TABLE table_name ( x UInt32 -) ENGINE = ReplicatedMergeTree +) ENGINE = ReplicatedMergeTree ORDER BY x; ``` @@ -172,7 +172,7 @@ ORDER BY x; ``` sql CREATE TABLE table_name ( x UInt32 -) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/{database}/table_name', '{replica}') +) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/{database}/table_name', '{replica}') ORDER BY x; ``` diff --git a/docs/ru/engines/table-engines/special/distributed.md b/docs/ru/engines/table-engines/special/distributed.md index 86eef35ebbc..b1f6f56623d 100644 --- a/docs/ru/engines/table-engines/special/distributed.md +++ b/docs/ru/engines/table-engines/special/distributed.md @@ -7,7 +7,7 @@ toc_title: Distributed **Движок Distributed не хранит данные самостоятельно**, а позволяет обрабатывать запросы распределённо, на нескольких серверах. Чтение автоматически распараллеливается. При чтении будут использованы индексы таблиц на удалённых серверах, если есть. -Движок Distributed принимает параметры: +Движок Distributed принимает параметры: - имя кластера в конфигурационном файле сервера @@ -21,7 +21,7 @@ toc_title: Distributed Смотрите также: - - настройка `insert_distributed_sync` + - настройка `insert_distributed_sync` - [MergeTree](../mergetree-family/mergetree.md#table_engine-mergetree-multiple-volumes) для примера Пример: diff --git a/docs/ru/engines/table-engines/special/join.md b/docs/ru/engines/table-engines/special/join.md index ef27ac3f10f..28bbfe6dea4 100644 --- a/docs/ru/engines/table-engines/special/join.md +++ b/docs/ru/engines/table-engines/special/join.md @@ -27,68 +27,30 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] Вводите параметры `join_strictness` и `join_type` без кавычек, например, `Join(ANY, LEFT, col1)`. Они должны быть такими же как и в той операции `JOIN`, в которой таблица будет использоваться. Если параметры не совпадают, ClickHouse не генерирует исключение и может возвращать неверные данные. -## Использование таблицы {#ispolzovanie-tablitsy} +## Особенности и рекомендации {#specifics-and-recommendations} -### Пример {#primer} +### Хранение данных {#data-storage} -Создание левой таблицы: +Данные таблиц `Join` всегда находятся в оперативной памяти. При вставке строк в таблицу ClickHouse записывает блоки данных в каталог на диске, чтобы их можно было восстановить при перезапуске сервера. -``` sql -CREATE TABLE id_val(`id` UInt32, `val` UInt32) ENGINE = TinyLog -``` +При аварийном перезапуске сервера блок данных на диске может быть потерян или повреждён. В последнем случае может потребоваться вручную удалить файл с повреждёнными данными. -``` sql -INSERT INTO id_val VALUES (1,11)(2,12)(3,13) -``` - -Создание правой таблицы с движком `Join`: - -``` sql -CREATE TABLE id_val_join(`id` UInt32, `val` UInt8) ENGINE = Join(ANY, LEFT, id) -``` - -``` sql -INSERT INTO id_val_join VALUES (1,21)(1,22)(3,23) -``` - -Объединение таблиц: - -``` sql -SELECT * FROM id_val ANY LEFT JOIN id_val_join USING (id) SETTINGS join_use_nulls = 1 -``` - -``` text -┌─id─┬─val─┬─id_val_join.val─┐ -│ 1 │ 11 │ 21 │ -│ 2 │ 12 │ ᴺᵁᴸᴸ │ -│ 3 │ 13 │ 23 │ -└────┴─────┴─────────────────┘ -``` - -В качестве альтернативы, можно извлечь данные из таблицы `Join`, указав значение ключа объединения: - -``` sql -SELECT joinGet('id_val_join', 'val', toUInt32(1)) -``` - -``` text -┌─joinGet('id_val_join', 'val', toUInt32(1))─┐ -│ 21 │ -└────────────────────────────────────────────┘ -``` - -### Выборка и вставка данных {#vyborka-i-vstavka-dannykh} +### Выборка и добавление данных {#selecting-and-inserting-data} Для добавления данных в таблицы с движком `Join` используйте запрос `INSERT`. Если таблица создавалась со строгостью `ANY`, то данные с повторяющимися ключами игнорируются. Если задавалась строгость `ALL`, то добавляются все строки. -Из таблиц нельзя выбрать данные с помощью запроса `SELECT`. Вместо этого, используйте один из следующих методов: +Основные применения `Join` таблиц: -- Используйте таблицу как правую в секции `JOIN`. -- Используйте функцию [joinGet](../../../engines/table-engines/special/join.md#joinget), которая позволяет извлекать данные из таблицы таким же образом как из словаря. +- Использование в правой части секции `JOIN`. +- Извлечение данных из таблицы таким же образом как из словаря с помощью функции [joinGet](../../../engines/table-engines/special/join.md#joinget). + +### Удаление данных {#deleting-data} + +Запросы `ALTER DELETE` для таблиц с движком `Join` выполняются как [мутации](../../../sql-reference/statements/alter/index.md#mutations). При выполнении мутации `DELETE` считываются отфильтрованные данные и перезаписываются в оперативную память и на диск. ### Ограничения и настройки {#join-limitations-and-settings} -При создании таблицы, применяются следующие параметры : +При создании таблицы применяются следующие настройки: - [join_use_nulls](../../../operations/settings/settings.md#join_use_nulls) - [max_rows_in_join](../../../operations/settings/query-complexity.md#settings-max_rows_in_join) @@ -99,11 +61,64 @@ SELECT joinGet('id_val_join', 'val', toUInt32(1)) Таблицы с движком `Join` нельзя использовать в операциях `GLOBAL JOIN`. -Движок `Join` позволяет использовать параметр [join_use_nulls](../../../operations/settings/settings.md#join_use_nulls) в запросе `CREATE TABLE`, который также можно использовать в запросе [SELECT](../../../engines/table-engines/special/join.md). Если у вас разные настройки `join_use_nulls`, вы можете получить сообщение об ошибке при объединении таблиц. Это зависит от типа соединения. Когда вы используете функцию [joinGet](../../../engines/table-engines/special/join.md#joinget), вам необходимо использовать один и тот же параметр `join_use_nulls` в запросах `CRATE TABLE` и `SELECT`. +Движок `Join` позволяет использовать настройку [join_use_nulls](../../../operations/settings/settings.md#join_use_nulls) в запросе `CREATE TABLE`. Необходимо использовать одно и то же значение параметра `join_use_nulls` в запросах `CRATE TABLE` и `SELECT`. -## Хранение данных {#khranenie-dannykh} +## Примеры использования {#example} -Данные таблиц `Join` всегда находятся в RAM. При вставке строк в таблицу ClickHouse записывает блоки данных в каталог на диске, чтобы их можно было восстановить при перезапуске сервера. +Создание левой таблицы: -При аварийном перезапуске сервера блок данных на диске может быть потерян или повреждён. В последнем случае, может потребоваться вручную удалить файл с повреждёнными данными. +``` sql +CREATE TABLE id_val(`id` UInt32, `val` UInt32) ENGINE = TinyLog; +``` +``` sql +INSERT INTO id_val VALUES (1,11)(2,12)(3,13); +``` + +Создание правой таблицы с движком `Join`: + +``` sql +CREATE TABLE id_val_join(`id` UInt32, `val` UInt8) ENGINE = Join(ANY, LEFT, id); +``` + +``` sql +INSERT INTO id_val_join VALUES (1,21)(1,22)(3,23); +``` + +Объединение таблиц: + +``` sql +SELECT * FROM id_val ANY LEFT JOIN id_val_join USING (id); +``` + +``` text +┌─id─┬─val─┬─id_val_join.val─┐ +│ 1 │ 11 │ 21 │ +│ 2 │ 12 │ 0 │ +│ 3 │ 13 │ 23 │ +└────┴─────┴─────────────────┘ +``` + +В качестве альтернативы, можно извлечь данные из таблицы `Join`, указав значение ключа объединения: + +``` sql +SELECT joinGet('id_val_join', 'val', toUInt32(1)); +``` + +``` text +┌─joinGet('id_val_join', 'val', toUInt32(1))─┐ +│ 21 │ +└────────────────────────────────────────────┘ +``` + +Удаление данных из таблицы `Join`: + +```sql +ALTER TABLE id_val_join DELETE WHERE id = 3; +``` + +```text +┌─id─┬─val─┐ +│ 1 │ 21 │ +└────┴─────┘ +``` diff --git a/docs/ru/faq/general/columnar-database.md b/docs/ru/faq/general/columnar-database.md index f38e46cfe93..5ed6185736d 100644 --- a/docs/ru/faq/general/columnar-database.md +++ b/docs/ru/faq/general/columnar-database.md @@ -8,7 +8,7 @@ toc_priority: 101 В столбцовой БД данные каждого столбца хранятся отдельно (независимо) от других столбцов. Такой принцип хранения позволяет при выполнении запроса считывать с диска данные только тех столбцов, которые непосредственно участвуют в этом запросе. Обратная сторона такого принципа хранения заключается в том, что выполнение операций над строками становится более затратным. ClickHouse — типичный пример столбцовой СУБД. -Ключевые преимущества столбцовой СУБД: +Ключевые преимущества столбцовой СУБД: - выполнение запросов над отдельными столбцами таблицы, а не над всей таблицей сразу; - агрегация запросов на больших объемах данных; diff --git a/docs/ru/faq/general/mapreduce.md b/docs/ru/faq/general/mapreduce.md index 8a524c9f680..2e7520aef1a 100644 --- a/docs/ru/faq/general/mapreduce.md +++ b/docs/ru/faq/general/mapreduce.md @@ -6,7 +6,7 @@ toc_priority: 110 # Почему бы не использовать системы типа MapReduce? {#why-not-use-something-like-mapreduce} -Системами типа MapReduce будем называть системы распределённых вычислений, в которых операция свёртки реализована на основе распределённой сортировки. Наиболее распространённое решение с открытым кодом в данном классе — [Apache Hadoop](http://hadoop.apache.org). Яндекс пользуется собственным решением — YT. +Системами типа MapReduce будем называть системы распределённых вычислений, в которых операция свёртки реализована на основе распределённой сортировки. Наиболее распространённое решение с открытым кодом в данном классе — [Apache Hadoop](http://hadoop.apache.org). Яндекс пользуется собственным решением — YT. Такие системы не подходят для онлайн запросов в силу слишком большой задержки. То есть не могут быть использованы в качестве бэкенда для веб-интерфейса. Также эти системы не подходят для обновления данных в реальном времени. Распределённая сортировка является не оптимальным способом для выполнения операции свёртки в случае запросов, выполняющихся в режиме онлайн, потому что результат выполнения операции и все промежуточные результаты (если такие есть) помещаются в оперативную память на одном сервере. В таком случае оптимальным способом выполнения операции свёртки является хеш-таблица. Частым способом оптимизации "map-reduce" задач является предагрегация (частичная свёртка) с использованием хеш-таблицы в оперативной памяти. Пользователь делает эту оптимизацию в ручном режиме. Распределённая сортировка — основная причина тормозов при выполнении несложных задач типа "map-reduce". diff --git a/docs/ru/faq/general/ne-tormozit.md b/docs/ru/faq/general/ne-tormozit.md index 1230e34c475..c1cf87d5b0c 100644 --- a/docs/ru/faq/general/ne-tormozit.md +++ b/docs/ru/faq/general/ne-tormozit.md @@ -8,14 +8,14 @@ toc_priority: 11 Обычно этот вопрос возникает, когда люди видят официальные футболки ClickHouse. На них большими буквами написано **“ClickHouse не тормозит”**. -До того, как код ClickHouse стал открытым, его разрабатывали как собственную систему хранения данных в крупнейшей российской ИТ-компании [Яндекс](https://yandex.com/company/). Поэтому оригинальный слоган написан по-русски. После выхода версии с открытым исходным кодом мы впервые выпустили некоторое количество таких футболок для мероприятий в России, и просто оставили прежний слоган. +До того, как код ClickHouse стал открытым, его разрабатывали как собственную систему хранения данных в крупнейшей российской ИТ-компании [Яндекс](https://yandex.com/company/). Поэтому оригинальный слоган написан по-русски. После выхода версии с открытым исходным кодом мы впервые выпустили некоторое количество таких футболок для мероприятий в России, и просто оставили прежний слоган. Когда мы решили отправить партию этих футболок на мероприятия вне России, мы пробовали подобрать подходящий английский слоган. К сожалению, мы так и не смогли придумать достаточно точный и выразительный перевод, ведь на русском этот слоган звучит очень ёмко и при этом довольно элегантно. К тому же, существовало ограничение по количеству символов на футболках. В итоге мы решили оставить русский вариант даже для международных событий. И это стало прекрасным решением, потому что люди по всему миру приятно удивлялись, когда видели фразу и интересовались, что же там написано. -Итак, как же объяснить эту фразу на английском? Вот несколько вариантов: +Итак, как же объяснить эту фразу на английском? Вот несколько вариантов: - Если переводить буквально, то получится что-то подобное: *“ClickHouse doesn’t press the brake pedal”*. -- Если же вы хотите максимально сохранить том смысл, который вкладывает в эту фразу человек из ИТ-сферы, то будет примерно следующее: *“If your larger system lags, it’s not because it uses ClickHouse”*. +- Если же вы хотите максимально сохранить том смысл, который вкладывает в эту фразу человек из ИТ-сферы, то будет примерно следующее: *“If your larger system lags, it’s not because it uses ClickHouse”*. - Более короткие, но не такие точные версии: *“ClickHouse is not slow”*, *“ClickHouse doesn’t lag”* или просто *“ClickHouse is fast”*. Если вы не видели наших футболок, посмотрите видео о ClickHouse. Например, вот это: diff --git a/docs/ru/faq/general/olap.md b/docs/ru/faq/general/olap.md index 9dce0ffbdf7..42715a195ad 100644 --- a/docs/ru/faq/general/olap.md +++ b/docs/ru/faq/general/olap.md @@ -19,7 +19,7 @@ toc_priority: 100 ## OLAP с точки зрения бизнеса {#olap-from-the-business-perspective} -В последние годы бизнес-сообщество стало осознавать ценность данных. Компании, которые принимают решения вслепую, чаще всего отстают от конкурентов. Управление бизнесом на основе данных, которое применяется успешными компаниями, побуждает собирать все данные, которые могут быть полезны в будущем для принятия бизнес-решений, а также подбирать механизмы, чтобы своевременно эти данные анализировать. Именно для этого и нужны СУБД с OLAP. +В последние годы бизнес-сообщество стало осознавать ценность данных. Компании, которые принимают решения вслепую, чаще всего отстают от конкурентов. Управление бизнесом на основе данных, которое применяется успешными компаниями, побуждает собирать все данные, которые могут быть полезны в будущем для принятия бизнес-решений, а также подбирать механизмы, чтобы своевременно эти данные анализировать. Именно для этого и нужны СУБД с OLAP. С точки зрения бизнеса, OLAP позволяет компаниям постоянно планировать, анализировать и оценивать операционную деятельность, чтобы повышать её эффективность, уменьшать затраты и как следствие — увеличивать долю рынка. Это можно делать как в собственной системе, так и в облачной (SaaS), в веб или мобильных аналитических приложениях, CRM-системах и т.д. Технология OLAP используется во многих приложениях BI (Business Intelligence — бизнес-аналитика). diff --git a/docs/ru/faq/general/why-clickhouse-is-so-fast.md b/docs/ru/faq/general/why-clickhouse-is-so-fast.md index 694488b40a9..fa73586fbcf 100644 --- a/docs/ru/faq/general/why-clickhouse-is-so-fast.md +++ b/docs/ru/faq/general/why-clickhouse-is-so-fast.md @@ -6,9 +6,9 @@ toc_priority: 8 # Почему ClickHouse так быстро работает? {#why-clickhouse-is-so-fast} -Производительность изначально заложена в архитектуре ClickHouse. Высокая скорость выполнения запросов была и остается самым важным критерием, который учитывается при разработке. Но мы обращаем внимание и на другие характеристики, такие как удобство использования, масштабируемость, безопасность. Всё это делает ClickHouse настоящей промышленной разработкой. +Производительность изначально заложена в архитектуре ClickHouse. Высокая скорость выполнения запросов была и остается самым важным критерием, который учитывается при разработке. Но мы обращаем внимание и на другие характеристики, такие как удобство использования, масштабируемость, безопасность. Всё это делает ClickHouse настоящей промышленной разработкой. -Сначала ClickHouse создавался как прототип, который должен был отлично справляться с одной единственной задачей — отбирать и агрегировать данные с максимальной скоростью. Это необходимо, чтобы создать обычный аналитический отчет, и именно это делает стандартный запрос [GROUP BY](../../sql-reference/statements/select/group-by.md). Для решения такой задачи команда разработки ClickHouse приняла несколько архитектурных решений: +Сначала ClickHouse создавался как прототип, который должен был отлично справляться с одной единственной задачей — отбирать и агрегировать данные с максимальной скоростью. Это необходимо, чтобы создать обычный аналитический отчет, и именно это делает стандартный запрос [GROUP BY](../../sql-reference/statements/select/group-by.md). Для решения такой задачи команда разработки ClickHouse приняла несколько архитектурных решений: Столбцовое хранение данных : Исходные данные часто содержат сотни или даже тысячи столбцов, в то время как для конкретного отчета нужны только несколько из них. Система не должна читать ненужные столбцы, поскольку операции чтения данных с диска — самые дорогостоящие. @@ -17,7 +17,7 @@ toc_priority: 8 : ClickHouse хранит структуры данных в оперативной памяти, что позволяет считывать не только нужные столбцы, но и нужные диапазоны строк для этих столбцов. Сжатие данных -: Различные способы хранения смежных значений в столбце позволяют достигать более высокой степени сжатия данных (по сравнению с обычными строковыми СУБД), т.к. в смежных строках значения часто бывают одинаковыми или близкими. В дополнение к универсальному сжатию ClickHouse поддерживает [специализированные кодеки](../../sql-reference/statements/create/table.md#create-query-specialized-codecs), которые позволяют еще больше уменьшить объемы хранимых данных. +: Различные способы хранения смежных значений в столбце позволяют достигать более высокой степени сжатия данных (по сравнению с обычными строковыми СУБД), т.к. в смежных строках значения часто бывают одинаковыми или близкими. В дополнение к универсальному сжатию ClickHouse поддерживает [специализированные кодеки](../../sql-reference/statements/create/table.md#create-query-specialized-codecs), которые позволяют еще больше уменьшить объемы хранимых данных. Векторные запросы : ClickHouse не только хранит, но и обрабатывает данные в столбцах. Это приводит к лучшей утилизации кеша процессора и позволяет использовать инструкции [SIMD](https://en.wikipedia.org/wiki/SIMD). @@ -45,7 +45,7 @@ toc_priority: 8 - Как сравнивать данные? - Не являются ли данные частично отсортированными? -Алгоритмы, основанные на характеристиках рабочих данных, обычно дают лучшие результаты, чем их более универсальные аналоги. Если заранее неизвестно, с какими данными придется работать, ClickHouse будет в процессе выполнения пробовать различные реализации и в итоге выберет оптимальный вариант. Например, рекомендуем прочитать [статью о том, как в ClickHouse реализуется распаковка LZ4](https://habr.com/en/company/yandex/blog/457612/). +Алгоритмы, основанные на характеристиках рабочих данных, обычно дают лучшие результаты, чем их более универсальные аналоги. Если заранее неизвестно, с какими данными придется работать, ClickHouse будет в процессе выполнения пробовать различные реализации и в итоге выберет оптимальный вариант. Например, рекомендуем прочитать [статью о том, как в ClickHouse реализуется распаковка LZ4](https://habr.com/en/company/yandex/blog/457612/). Ну и последнее, но тем не менее важное условие: команда ClickHouse постоянно отслеживает в интернете сообщения пользователей о найденных ими удачных реализациях, алгоритмах или структурах данных, анализирует и пробует новые идеи. Иногда в этом потоке сообщений попадаются действительно ценные предложения. diff --git a/docs/ru/faq/index.md b/docs/ru/faq/index.md index 08deec5f7ce..90de6b0aa84 100644 --- a/docs/ru/faq/index.md +++ b/docs/ru/faq/index.md @@ -10,7 +10,7 @@ toc_priority: 76 Категории: -- **[Общие вопросы](general/index.md)** +- **[Общие вопросы](general/index.md)** - [Что такое ClickHouse?](../index.md#what-is-clickhouse) - [Почему ClickHouse такой быстрый?](general/why-clickhouse-is-so-fast.md) - [Кто пользуется ClickHouse?](general/who-is-using-clickhouse.md) @@ -22,7 +22,7 @@ toc_priority: 76 - **[Применение](use-cases/index.md)** - [Можно ли использовать ClickHouse как БД временных рядов?](use-cases/time-series.md) - [Можно ли использовать ClickHouse для хранения данных вида "ключ-значение"?](use-cases/key-value.md) -- **[Операции](operations/index.md)** +- **[Операции](operations/index.md)** - [Какую версию ClickHouse использовать?](operations/production.md) - [Возможно ли удалить старые записи из таблицы ClickHouse?](operations/delete-old-data.md) - **[Интеграция](integration/index.md)** diff --git a/docs/ru/faq/operations/production.md b/docs/ru/faq/operations/production.md index a82a7f5e888..3a2ef965958 100644 --- a/docs/ru/faq/operations/production.md +++ b/docs/ru/faq/operations/production.md @@ -8,14 +8,14 @@ toc_priority: 10 Во-первых, давайте обсудим, почему возникает этот вопрос. Есть две основные причины: -1. ClickHouse развивается достаточно быстро, и обычно мы выпускаем более 10 стабильных релизов в год. Так что есть из чего выбрать, а это не всегда просто. +1. ClickHouse развивается достаточно быстро, и обычно мы выпускаем более 10 стабильных релизов в год. Так что есть из чего выбрать, а это не всегда просто. 2. Некоторые пользователи не хотят тратить время на анализ того, какая версия лучше подходит для их задач, и просто хотят получить совет от эксперта. Вторая причина более весомая, так что начнем с нее, а затем рассмотрим, какие бывают релизы ClickHouse. ## Какую версию ClickHouse вы посоветуете? {#which-clickhouse-version-do-you-recommend} -Казалось бы, самый удобный вариант — нанять консультанта или довериться эксперту, и делегировать ему ответственность за вашу систему. Вы устанавливаете ту версию ClickHouse, которую вам рекомендовали, и теперь если что-то пойдет не так — это уже не ваша вина. На самом деле это не так. Никто не может знать лучше вас, что происходит в вашей системе. +Казалось бы, самый удобный вариант — нанять консультанта или довериться эксперту, и делегировать ему ответственность за вашу систему. Вы устанавливаете ту версию ClickHouse, которую вам рекомендовали, и теперь если что-то пойдет не так — это уже не ваша вина. На самом деле это не так. Никто не может знать лучше вас, что происходит в вашей системе. Как же правильно выбрать версию ClickHouse, на которую стоит обновиться? Или как выбрать версию, с которой следует начать, если вы только внедряете ClickHouse? Во-первых, мы рекомендуем позаботиться о создании **реалистичной тестовой среды** (pre-production). В идеальном мире это была бы полная копия рабочей среды, но чаще всего такое решение оказывается слишком дорогостоящим. @@ -25,8 +25,8 @@ toc_priority: 10 - Не используйте тестовую среду в режиме "только для чтения", работая с каким-то статичным набором данных. - Не используйте её в режиме "только для записи", проверяя лишь копирование данных, без построения типовых отчетов. - Не очищайте её, удаляя все данные подчистую вместо тестирования рабочих схем миграции. -- Выполняйте реальные запросы на выборке из реальных рабочих данных. Постарайтесь подготовить репрезентативную выборку, на которой запрос `SELECT` будет возвращать адекватные результаты. Если регламенты безопасности не позволяют использовать реальные данные за пределами защищенной рабочей среды, используйте обфускацию. -- Убедитесь, что тестовая среда находится под контролем тех же систем мониторинга и оповещения, что и рабочая. +- Выполняйте реальные запросы на выборке из реальных рабочих данных. Постарайтесь подготовить репрезентативную выборку, на которой запрос `SELECT` будет возвращать адекватные результаты. Если регламенты безопасности не позволяют использовать реальные данные за пределами защищенной рабочей среды, используйте обфускацию. +- Убедитесь, что тестовая среда находится под контролем тех же систем мониторинга и оповещения, что и рабочая. - Если ваша рабочая среда распределена между разными дата-центрами и регионами, тестовая среда должна быть такой же. - Если в рабочей среде используются сложные инструменты типа репликации, распределённых таблиц или каскадных материализованных представлений, тестовая среда должна быть сконфигурирована так же. - Обычно в тестовой среде стараются использовать то же количество серверов и виртуальных машин, что и в рабочей, но делают их меньшего объема. Либо наоборот, используют существенно меньшее число серверов и ВМ, но тех же объемов. Первый вариант скорее позволит обнаружить проблемы, связанные с работой сети, а второй вариант более прост в управлении. diff --git a/docs/ru/faq/use-cases/key-value.md b/docs/ru/faq/use-cases/key-value.md index 4daa9773f84..b751bb2ce75 100644 --- a/docs/ru/faq/use-cases/key-value.md +++ b/docs/ru/faq/use-cases/key-value.md @@ -8,7 +8,7 @@ toc_priority: 101 Если отвечать коротко, то **"нет"**. Операции над данными вида "ключ-значение" занимают одну из верхних позиций в списке ситуаций, когда категорически **не стоит**{.text-danger} использовать ClickHouse. Это [OLAP](../../faq/general/olap.md) СУБД, в то время как есть много специализированных СУБД для данных вида "ключ-значение". -Тем не менее, в некоторых ситуациях имеет смысл использовать ClickHouse для запросов над данными вида "ключ-значение". Чаще всего это относится к системам с относительно невысокой нагрузкой, в которых основной объем операций относится к аналитической обработке данных и отлично подходит для ClickHouse. Однако в них есть некий второстепенный процесс, в котором нужно обрабатывать данные вида "ключ-значение", при этом процесс не требует слишком высокой производительности и не имеет строгих ограничений по задержкам выполнения запросов. Если у вас нет ограничений по бюджету, вы можете использовать для таких операций вспомогательную базу данных "ключ-значение", но это увеличит расходы на обслуживание еще одной СУБД (мониторинг, бэкапы и т.д.). +Тем не менее, в некоторых ситуациях имеет смысл использовать ClickHouse для запросов над данными вида "ключ-значение". Чаще всего это относится к системам с относительно невысокой нагрузкой, в которых основной объем операций относится к аналитической обработке данных и отлично подходит для ClickHouse. Однако в них есть некий второстепенный процесс, в котором нужно обрабатывать данные вида "ключ-значение", при этом процесс не требует слишком высокой производительности и не имеет строгих ограничений по задержкам выполнения запросов. Если у вас нет ограничений по бюджету, вы можете использовать для таких операций вспомогательную базу данных "ключ-значение", но это увеличит расходы на обслуживание еще одной СУБД (мониторинг, бэкапы и т.д.). Если вы все же решите не следовать рекомендациям и использовать ClickHouse для работы с данными вида "ключ-значение", вот несколько советов: diff --git a/docs/ru/getting-started/install.md b/docs/ru/getting-started/install.md index 66a94bcfbca..1cbeb70ef96 100644 --- a/docs/ru/getting-started/install.md +++ b/docs/ru/getting-started/install.md @@ -100,11 +100,11 @@ sudo ./clickhouse install Для других операционных систем и архитектуры AArch64 сборки ClickHouse предоставляются в виде кросс-компилированного бинарного файла из последнего коммита ветки `master` (с задержкой в несколько часов). -- [macOS](https://builds.clickhouse.tech/master/macos/clickhouse) — `curl -O 'https://builds.clickhouse.tech/master/macos/clickhouse' && chmod a+x ./clickhouse` -- [AArch64](https://builds.clickhouse.tech/master/aarch64/clickhouse) — `curl -O 'https://builds.clickhouse.tech/master/aarch64/clickhouse' && chmod a+x ./clickhouse` -- [FreeBSD](https://builds.clickhouse.tech/master/freebsd/clickhouse) — `curl -O 'https://builds.clickhouse.tech/master/freebsd/clickhouse' && chmod a+x ./clickhouse` +- [macOS](https://builds.clickhouse.tech/master/macos/clickhouse) — `curl -O 'https://builds.clickhouse.tech/master/macos/clickhouse' && chmod a+x ./clickhouse` +- [FreeBSD](https://builds.clickhouse.tech/master/freebsd/clickhouse) — `curl -O 'https://builds.clickhouse.tech/master/freebsd/clickhouse' && chmod a+x ./clickhouse` +- [AArch64](https://builds.clickhouse.tech/master/aarch64/clickhouse) — `curl -O 'https://builds.clickhouse.tech/master/aarch64/clickhouse' && chmod a+x ./clickhouse` -После скачивания можно воспользоваться `clickhouse client` для подключения к серверу или `clickhouse local` для обработки локальных данных. +После скачивания можно воспользоваться `clickhouse client` для подключения к серверу или `clickhouse local` для обработки локальных данных. Чтобы установить ClickHouse в рамках всей системы (с необходимыми конфигурационными файлами, настройками пользователей и т.д.), выполните `sudo ./clickhouse install`. Затем выполните команды `clickhouse start` (чтобы запустить сервер) и `clickhouse-client` (чтобы подключиться к нему). diff --git a/docs/ru/getting-started/playground.md b/docs/ru/getting-started/playground.md index b51a9b2b436..d3101213b78 100644 --- a/docs/ru/getting-started/playground.md +++ b/docs/ru/getting-started/playground.md @@ -61,4 +61,4 @@ clickhouse client --secure -h play-api.clickhouse.tech --port 9440 -u playground Бэкэнд Playground - это кластер ClickHouse без дополнительных серверных приложений. Как упоминалось выше, способы подключения по HTTPS и TCP/TLS общедоступны как часть Playground. Они проксируются через [Cloudflare Spectrum](https://www.cloudflare.com/products/cloudflare-spectrum/) для добавления дополнительного уровня защиты и улучшенного глобального подключения. !!! warning "Предупреждение" -Открывать сервер ClickHouse для публичного доступа в любой другой ситуации **настоятельно не рекомендуется**. Убедитесь, что он настроен только на частную сеть и защищен брандмауэром. + Открывать сервер ClickHouse для публичного доступа в любой другой ситуации **настоятельно не рекомендуется**. Убедитесь, что он настроен только на частную сеть и защищен брандмауэром. diff --git a/docs/ru/guides/apply-catboost-model.md b/docs/ru/guides/apply-catboost-model.md index a9cba1d7f70..d864d6c75cc 100644 --- a/docs/ru/guides/apply-catboost-model.md +++ b/docs/ru/guides/apply-catboost-model.md @@ -162,7 +162,7 @@ FROM amazon_train ``` !!! note "Примечание" Вы можете позднее изменить путь к конфигурации модели CatBoost без перезагрузки сервера. - + ## 4. Запустите вывод модели из SQL {#run-model-inference} Для тестирования модели запустите клиент ClickHouse `$ clickhouse client`. diff --git a/docs/ru/images/play.png b/docs/ru/images/play.png new file mode 100644 index 00000000000..73a5da1b10f Binary files /dev/null and b/docs/ru/images/play.png differ diff --git a/docs/ru/interfaces/formats.md b/docs/ru/interfaces/formats.md index 7780a75a706..563a137ac17 100644 --- a/docs/ru/interfaces/formats.md +++ b/docs/ru/interfaces/formats.md @@ -1165,12 +1165,14 @@ SELECT * FROM topic1_stream; | `DOUBLE` | [Float64](../sql-reference/data-types/float.md) | `DOUBLE` | | `DATE32` | [Date](../sql-reference/data-types/date.md) | `UINT16` | | `DATE64`, `TIMESTAMP` | [DateTime](../sql-reference/data-types/datetime.md) | `UINT32` | -| `STRING`, `BINARY` | [String](../sql-reference/data-types/string.md) | `STRING` | -| — | [FixedString](../sql-reference/data-types/fixedstring.md) | `STRING` | +| `STRING`, `BINARY` | [String](../sql-reference/data-types/string.md) | `BINARY` | +| — | [FixedString](../sql-reference/data-types/fixedstring.md) | `BINARY` | | `DECIMAL` | [Decimal](../sql-reference/data-types/decimal.md) | `DECIMAL` | | `LIST` | [Array](../sql-reference/data-types/array.md) | `LIST` | +| `STRUCT` | [Tuple](../sql-reference/data-types/tuple.md) | `STRUCT` | +| `MAP` | [Map](../sql-reference/data-types/map.md) | `MAP` | -Массивы могут быть вложенными и иметь в качестве аргумента значение типа `Nullable`. +Массивы могут быть вложенными и иметь в качестве аргумента значение типа `Nullable`. Типы `Tuple` и `Map` также могут быть вложенными. ClickHouse поддерживает настраиваемую точность для формата `Decimal`. При выполнении запроса `INSERT` ClickHouse обрабатывает тип данных Parquet `DECIMAL` как `Decimal128`. @@ -1218,12 +1220,17 @@ $ clickhouse-client --query="SELECT * FROM {some_table} FORMAT Parquet" > {some_ | `DOUBLE` | [Float64](../sql-reference/data-types/float.md) | `FLOAT64` | | `DATE32` | [Date](../sql-reference/data-types/date.md) | `UINT16` | | `DATE64`, `TIMESTAMP` | [DateTime](../sql-reference/data-types/datetime.md) | `UINT32` | -| `STRING`, `BINARY` | [String](../sql-reference/data-types/string.md) | `UTF8` | -| `STRING`, `BINARY` | [FixedString](../sql-reference/data-types/fixedstring.md) | `UTF8` | +| `STRING`, `BINARY` | [String](../sql-reference/data-types/string.md) | `BINARY` | +| `STRING`, `BINARY` | [FixedString](../sql-reference/data-types/fixedstring.md) | `BINARY` | | `DECIMAL` | [Decimal](../sql-reference/data-types/decimal.md) | `DECIMAL` | +| `DECIMAL256` | [Decimal256](../sql-reference/data-types/decimal.md)| `DECIMAL256` | | `LIST` | [Array](../sql-reference/data-types/array.md) | `LIST` | +| `STRUCT` | [Tuple](../sql-reference/data-types/tuple.md) | `STRUCT` | +| `MAP` | [Map](../sql-reference/data-types/map.md) | `MAP` | -Массивы могут быть вложенными и иметь в качестве аргумента значение типа `Nullable`. +Массивы могут быть вложенными и иметь в качестве аргумента значение типа `Nullable`. Типы `Tuple` и `Map` также могут быть вложенными. + +Тип `DICTIONARY` поддерживается для запросов `INSERT`. Для запросов `SELECT` есть настройка [output_format_arrow_low_cardinality_as_dictionary](../operations/settings/settings.md#output-format-arrow-low-cardinality-as-dictionary), которая позволяет выводить тип [LowCardinality](../sql-reference/data-types/lowcardinality.md) как `DICTIONARY`. ClickHouse поддерживает настраиваемую точность для формата `Decimal`. При выполнении запроса `INSERT` ClickHouse обрабатывает тип данных Arrow `DECIMAL` как `Decimal128`. @@ -1276,8 +1283,10 @@ $ clickhouse-client --query="SELECT * FROM {some_table} FORMAT Arrow" > {filenam | `STRING`, `BINARY` | [String](../sql-reference/data-types/string.md) | `BINARY` | | `DECIMAL` | [Decimal](../sql-reference/data-types/decimal.md) | `DECIMAL` | | `LIST` | [Array](../sql-reference/data-types/array.md) | `LIST` | +| `STRUCT` | [Tuple](../sql-reference/data-types/tuple.md) | `STRUCT` | +| `MAP` | [Map](../sql-reference/data-types/map.md) | `MAP` | -Массивы могут быть вложенными и иметь в качестве аргумента значение типа `Nullable`. +Массивы могут быть вложенными и иметь в качестве аргумента значение типа `Nullable`. Типы `Tuple` и `Map` также могут быть вложенными. ClickHouse поддерживает настраиваемую точность для формата `Decimal`. При выполнении запроса `INSERT` ClickHouse обрабатывает тип данных ORC `DECIMAL` как `Decimal128`. diff --git a/docs/ru/interfaces/http.md b/docs/ru/interfaces/http.md index ee406fc3145..fca343e8529 100644 --- a/docs/ru/interfaces/http.md +++ b/docs/ru/interfaces/http.md @@ -5,30 +5,33 @@ toc_title: "HTTP-интерфейс" # HTTP-интерфейс {#http-interface} -HTTP интерфейс позволяет использовать ClickHouse на любой платформе, из любого языка программирования. У нас он используется для работы из Java и Perl, а также из shell-скриптов. В других отделах, HTTP интерфейс используется из Perl, Python и Go. HTTP интерфейс более ограничен по сравнению с родным интерфейсом, но является более совместимым. +HTTP интерфейс позволяет использовать ClickHouse на любой платформе, из любого языка программирования. У нас он используется для работы из Java и Perl, а также из shell-скриптов. В других отделах HTTP интерфейс используется из Perl, Python и Go. HTTP интерфейс более ограничен по сравнению с родным интерфейсом, но является более совместимым. -По умолчанию, clickhouse-server слушает HTTP на порту 8123 (это можно изменить в конфиге). -Если запросить GET / без параметров, то вернётся строка заданная с помощью настройки [http_server_default_response](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-http_server_default_response). Значение по умолчанию «Ok.» (с переводом строки на конце). +По умолчанию `clickhouse-server` слушает HTTP на порту 8123 (это можно изменить в конфиге). +Если запросить `GET /` без параметров, то вернётся строка заданная с помощью настройки [http_server_default_response](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-http_server_default_response). Значение по умолчанию «Ok.» (с переводом строки на конце). ``` bash $ curl 'http://localhost:8123/' Ok. ``` -В скриптах проверки доступности вы можете использовать GET /ping без параметров. Если сервер доступен всегда возвращается «Ok.» (с переводом строки на конце). +Веб-интерфейс доступен по адресу: `http://localhost:8123/play`. + +![Веб-интерфейс](../images/play.png) + +В скриптах проверки доступности вы можете использовать `GET /ping` без параметров. Если сервер доступен, всегда возвращается «Ok.» (с переводом строки на конце). ``` bash $ curl 'http://localhost:8123/ping' Ok. ``` -Запрос отправляется в виде URL параметра с именем query. Или как тело запроса при использовании метода POST. +Запрос отправляется в виде URL параметра с именем `query`. Или как тело запроса при использовании метода POST. Или начало запроса в URL параметре query, а продолжение POST-ом (зачем это нужно, будет объяснено ниже). Размер URL ограничен 16KB, это следует учитывать при отправке больших запросов. -В случае успеха, вам вернётся код ответа 200 и результат обработки запроса в теле ответа. -В случае ошибки, вам вернётся код ответа 500 и текст с описанием ошибки в теле ответа. +В случае успеха возвращается код ответа 200 и результат обработки запроса в теле ответа, в случае ошибки — код ответа 500 и текст с описанием ошибки в теле ответа. -При использовании метода GET, выставляется настройка readonly. То есть, для запросов, модифицирующие данные, можно использовать только метод POST. Сам запрос при этом можно отправлять как в теле POST-а, так и в параметре URL. +При использовании метода GET выставляется настройка readonly. То есть, для запросов, модифицирующих данные, можно использовать только метод POST. Сам запрос при этом можно отправлять как в теле POST запроса, так и в параметре URL. Примеры: @@ -51,8 +54,8 @@ X-ClickHouse-Summary: {"read_rows":"0","read_bytes":"0","written_rows":"0","writ 1 ``` -Как видно, curl немного неудобен тем, что надо URL-эскейпить пробелы. -Хотя wget сам всё эскейпит, но его не рекомендуется использовать, так как он плохо работает по HTTP 1.1 при использовании keep-alive и Transfer-Encoding: chunked. +Как видно, `curl` немного неудобен тем, что надо URL-эскейпить пробелы. +Хотя `wget` сам всё эскейпит, но его не рекомендуется использовать, так как он плохо работает по HTTP 1.1 при использовании `keep-alive` и `Transfer-Encoding: chunked`. ``` bash $ echo 'SELECT 1' | curl 'http://localhost:8123/' --data-binary @- @@ -65,7 +68,7 @@ $ echo '1' | curl 'http://localhost:8123/?query=SELECT' --data-binary @- 1 ``` -Если часть запроса отправляется в параметре, а часть POST-ом, то между этими двумя кусками данных ставится перевод строки. +Если часть запроса отправляется в параметре, а часть POST запросом, то между этими двумя кусками данных ставится перевод строки. Пример (так работать не будет): ``` bash @@ -75,9 +78,9 @@ ECT 1 , expected One of: SHOW TABLES, SHOW DATABASES, SELECT, INSERT, CREATE, ATTACH, RENAME, DROP, DETACH, USE, SET, OPTIMIZE., e.what() = DB::Exception ``` -По умолчанию, данные возвращаются в формате TabSeparated (подробнее смотри раздел «Форматы»). +По умолчанию данные возвращаются в формате [TabSeparated](formats.md#tabseparated). -Можно попросить любой другой формат - с помощью секции FORMAT запроса. +Можно указать любой другой формат с помощью секции FORMAT запроса. Кроме того, вы можете использовать параметр URL-адреса `default_format` или заголовок `X-ClickHouse-Format`, чтобы указать формат по умолчанию, отличный от `TabSeparated`. @@ -90,9 +93,10 @@ $ echo 'SELECT 1 FORMAT Pretty' | curl 'http://localhost:8123/?' --data-binary @ └───┘ ``` -Возможность передавать данные POST-ом нужна для INSERT-запросов. В этом случае вы можете написать начало запроса в параметре URL, а вставляемые данные передать POST-ом. Вставляемыми данными может быть, например, tab-separated дамп, полученный из MySQL. Таким образом, запрос INSERT заменяет LOAD DATA LOCAL INFILE из MySQL. +Возможность передавать данные с помощью POST нужна для запросов `INSERT`. В этом случае вы можете написать начало запроса в параметре URL, а вставляемые данные передать POST запросом. Вставляемыми данными может быть, например, tab-separated дамп, полученный из MySQL. Таким образом, запрос `INSERT` заменяет `LOAD DATA LOCAL INFILE` из MySQL. + +**Примеры** -Примеры: Создаём таблицу: ``` bash @@ -147,7 +151,7 @@ $ curl 'http://localhost:8123/?query=SELECT%20a%20FROM%20t' $ echo 'DROP TABLE t' | curl 'http://localhost:8123/' --data-binary @- ``` -Для запросов, которые не возвращают таблицу с данными, в случае успеха, выдаётся пустое тело ответа. +Для запросов, которые не возвращают таблицу с данными, в случае успеха выдаётся пустое тело ответа. ## Сжатие {#compression} @@ -158,14 +162,14 @@ $ echo 'DROP TABLE t' | curl 'http://localhost:8123/' --data-binary @- Если вы указали `compress=1` в URL, то сервер сжимает данные, которые он отправляет. Если вы указали `decompress=1` в URL, сервер распаковывает те данные, которые вы передаёте методом `POST`. -Также можно использовать [сжатие HTTP](https://en.wikipedia.org/wiki/HTTP_compression). ClickHouse поддерживает следующие [методы сжатия](https://en.wikipedia.org/wiki/HTTP_compression#Content-Encoding_tokens): +Также можно использовать [сжатие HTTP](https://en.wikipedia.org/wiki/HTTP_compression). ClickHouse поддерживает следующие [методы сжатия](https://en.wikipedia.org/wiki/HTTP_compression#Content-Encoding_tokens): - `gzip` - `br` - `deflate` - `xz` -Для отправки сжатого запроса `POST`, добавьте заголовок `Content-Encoding: compression_method`. +Для отправки сжатого запроса `POST` добавьте заголовок `Content-Encoding: compression_method`. Чтобы ClickHouse сжимал ответ, разрешите сжатие настройкой [enable_http_compression](../operations/settings/settings.md#settings-enable_http_compression) и добавьте заголовок `Accept-Encoding: compression_method`. Уровень сжатия данных для всех методов сжатия можно задать с помощью настройки [http_zlib_compression_level](../operations/settings/settings.md#settings-http_zlib_compression_level). !!! note "Примечание" @@ -281,13 +285,13 @@ X-ClickHouse-Progress: {"read_rows":"8783786","read_bytes":"819092887","total_ro HTTP интерфейс позволяет передать внешние данные (внешние временные таблицы) для использования запроса. Подробнее смотрите раздел «Внешние данные для обработки запроса» -## Буферизация ответа {#buferizatsiia-otveta} +## Буферизация ответа {#response-buffering} Существует возможность включить буферизацию ответа на стороне сервера. Для этого предусмотрены параметры URL `buffer_size` и `wait_end_of_query`. `buffer_size` определяет количество байт результата которые будут буферизованы в памяти сервера. Если тело результата больше этого порога, то буфер будет переписан в HTTP канал, а оставшиеся данные будут отправляться в HTTP-канал напрямую. -Чтобы гарантировать буферизацию всего ответа необходимо выставить `wait_end_of_query=1`. В этом случае данные, не поместившиеся в памяти, будут буферизованы во временном файле сервера. +Чтобы гарантировать буферизацию всего ответа, необходимо выставить `wait_end_of_query=1`. В этом случае данные, не поместившиеся в памяти, будут буферизованы во временном файле сервера. Пример: @@ -295,7 +299,7 @@ HTTP интерфейс позволяет передать внешние да $ curl -sS 'http://localhost:8123/?max_result_bytes=4000000&buffer_size=3000000&wait_end_of_query=1' -d 'SELECT toUInt8(number) FROM system.numbers LIMIT 9000000 FORMAT RowBinary' ``` -Буферизация позволяет избежать ситуации когда код ответа и HTTP-заголовки были отправлены клиенту, после чего возникла ошибка выполнения запроса. В такой ситуации сообщение об ошибке записывается в конце тела ответа, и на стороне клиента ошибка может быть обнаружена только на этапе парсинга. +Буферизация позволяет избежать ситуации, когда код ответа и HTTP-заголовки были отправлены клиенту, после чего возникла ошибка выполнения запроса. В такой ситуации сообщение об ошибке записывается в конце тела ответа, и на стороне клиента ошибка может быть обнаружена только на этапе парсинга. ### Запросы с параметрами {#cli-queries-with-parameters} @@ -399,13 +403,13 @@ $ curl -v 'http://localhost:8123/predefined_query' - `handler` содержит основную часть обработчика. Сейчас `handler` может настраивать `type`, `status`, `content_type`, `response_content`, `query`, `query_param_name`. `type` на данный момент поддерживает три типа: [predefined_query_handler](#predefined_query_handler), [dynamic_query_handler](#dynamic_query_handler), [static](#static). - + - `query` — используется с типом `predefined_query_handler`, выполняет запрос при вызове обработчика. - + - `query_param_name` — используется с типом `dynamic_query_handler`, извлекает и выполняет значение, соответствующее значению `query_param_name` в параметрах HTTP-запроса. - + - `status` — используется с типом `static`, возвращает код состояния ответа. - + - `content_type` — используется с типом `static`, возвращает [content-type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type). - `response_content` — используется с типом`static`, содержимое ответа, отправленное клиенту, при использовании префикса ‘file://’ or ‘config://’, находит содержимое из файла или конфигурации, отправленного клиенту. @@ -634,4 +638,3 @@ $ curl -vv -H 'XXX:xxx' 'http://localhost:8123/get_relative_path_static_handler' Relative Path File * Connection #0 to host localhost left intact ``` - diff --git a/docs/ru/interfaces/third-party/gui.md b/docs/ru/interfaces/third-party/gui.md index dc96c32e996..9cb28a2c9a2 100644 --- a/docs/ru/interfaces/third-party/gui.md +++ b/docs/ru/interfaces/third-party/gui.md @@ -111,7 +111,7 @@ toc_title: "Визуальные интерфейсы от сторонних р ### DataGrip {#datagrip} -[DataGrip](https://www.jetbrains.com/datagrip/) — это IDE для баз данных о JetBrains с выделенной поддержкой ClickHouse. Он также встроен в другие инструменты на основе IntelliJ: PyCharm, IntelliJ IDEA, GoLand, PhpStorm и другие. +[DataGrip](https://www.jetbrains.com/datagrip/) — это IDE для баз данных от JetBrains с выделенной поддержкой ClickHouse. Он также встроен в другие инструменты на основе IntelliJ: PyCharm, IntelliJ IDEA, GoLand, PhpStorm и другие. Основные возможности: diff --git a/docs/ru/interfaces/third-party/integrations.md b/docs/ru/interfaces/third-party/integrations.md index 198e9d6be76..70a4d233277 100644 --- a/docs/ru/interfaces/third-party/integrations.md +++ b/docs/ru/interfaces/third-party/integrations.md @@ -43,7 +43,7 @@ toc_title: "Библиотеки для интеграции от сторонн - Мониторинг - [Graphite](https://graphiteapp.org) - [graphouse](https://github.com/yandex/graphouse) - - [carbon-clickhouse](https://github.com/lomik/carbon-clickhouse) + + - [carbon-clickhouse](https://github.com/lomik/carbon-clickhouse) - [graphite-clickhouse](https://github.com/lomik/graphite-clickhouse) - [graphite-ch-optimizer](https://github.com/innogames/graphite-ch-optimizer) - оптимизирует партиции таблиц [\*GraphiteMergeTree](../../engines/table-engines/mergetree-family/graphitemergetree.md#graphitemergetree) согласно правилам в [конфигурации rollup](../../engines/table-engines/mergetree-family/graphitemergetree.md#rollup-configuration) - [Grafana](https://grafana.com/) @@ -104,7 +104,7 @@ toc_title: "Библиотеки для интеграции от сторонн - Ruby - [Ruby on Rails](https://rubyonrails.org/) - [activecube](https://github.com/bitquery/activecube) - - [ActiveRecord](https://github.com/PNixx/clickhouse-activerecord) + - [ActiveRecord](https://github.com/PNixx/clickhouse-activerecord) - [GraphQL](https://github.com/graphql) - [activecube-graphql](https://github.com/bitquery/activecube-graphql) - + diff --git a/docs/ru/operations/external-authenticators/kerberos.md b/docs/ru/operations/external-authenticators/kerberos.md index b90714d14fd..2d31e355bba 100644 --- a/docs/ru/operations/external-authenticators/kerberos.md +++ b/docs/ru/operations/external-authenticators/kerberos.md @@ -56,7 +56,7 @@ ClickHouse предоставляет возможность аутентифи В конфигурационном файле не могут быть указаны одновременно оба параметра. В противном случае, аутентификация с помощью Kerberos будет недоступна для всех пользователей. !!! Warning "Важно" - В конфигурационном файле может быть не более одной секции `kerberos`. В противном случае, аутентификация с помощью Kerberos будет отключена для всех пользователей. + В конфигурационном файле может быть не более одной секции `kerberos`. В противном случае, аутентификация с помощью Kerberos будет отключена для всех пользователей. ## Аутентификация пользователей с помощью Kerberos {#kerberos-as-an-external-authenticator-for-existing-users} diff --git a/docs/ru/operations/external-authenticators/ldap.md b/docs/ru/operations/external-authenticators/ldap.md index 8df59cdfdad..8f1328c9aa6 100644 --- a/docs/ru/operations/external-authenticators/ldap.md +++ b/docs/ru/operations/external-authenticators/ldap.md @@ -32,7 +32,7 @@ /path/to/tls_ca_cert_dir ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:AES256-GCM-SHA384 - + localhost @@ -66,7 +66,7 @@ - При формировании фильтра все подстроки `{user_name}`, `{bind_dn}`, `{user_dn}` и `{base_dn}` в шаблоне будут заменяться на фактическое имя пользователя, DN подключения, DN пользователя и базовый DN соответственно при каждом LDAP поиске. - Обратите внимание, что специальные символы должны быть правильно экранированы в XML. - `verification_cooldown` — промежуток времени (в секундах) после успешной попытки подключения, в течение которого пользователь будет считаться аутентифицированным и сможет выполнять запросы без повторного обращения к серверам LDAP. - - Чтобы отключить кеширование и заставить обращаться к серверу LDAP для каждого запроса аутентификации, укажите `0` (значение по умолчанию). + - Чтобы отключить кеширование и заставить обращаться к серверу LDAP для каждого запроса аутентификации, укажите `0` (значение по умолчанию). - `enable_tls` — флаг, включающий использование защищенного соединения с сервером LDAP. - Укажите `no` для использования текстового протокола `ldap://` (не рекомендовано). - Укажите `yes` для обращения к LDAP по протоколу SSL/TLS `ldaps://` (рекомендовано, используется по умолчанию). @@ -78,7 +78,7 @@ - `tls_cert_file` — путь к файлу сертификата. - `tls_key_file` — путь к файлу ключа сертификата. - `tls_ca_cert_file` — путь к файлу ЦС (certification authority) сертификата. -- `tls_ca_cert_dir` — путь к каталогу, содержащему сертификаты ЦС. +- `tls_ca_cert_dir` — путь к каталогу, содержащему сертификаты ЦС. - `tls_cipher_suite` — разрешенный набор шифров (в нотации OpenSSL). ## Внешний аутентификатор LDAP {#ldap-external-authenticator} @@ -143,7 +143,7 @@ CREATE USER my_user IDENTIFIED WITH ldap SERVER 'my_ldap_server'; clickhouse_ - + my_ad_server @@ -177,6 +177,6 @@ CREATE USER my_user IDENTIFIED WITH ldap SERVER 'my_ldap_server'; - При формировании фильтра все подстроки `{user_name}`, `{bind_dn}`, `{user_dn}` и `{base_dn}` в шаблоне будут заменяться на фактическое имя пользователя, DN подключения, DN пользователя и базовый DN соответственно при каждом LDAP поиске. - Обратите внимание, что специальные символы должны быть правильно экранированы в XML. - `attribute` — имя атрибута, значение которого будет возвращаться LDAP поиском. По умолчанию: `cn`. - - `prefix` — префикс, который, как предполагается, будет находиться перед началом каждой строки в исходном списке строк, возвращаемых LDAP поиском. Префикс будет удален из исходных строк, а сами они будут рассматриваться как имена локальных ролей. По умолчанию: пустая строка. + - `prefix` — префикс, который, как предполагается, будет находиться перед началом каждой строки в исходном списке строк, возвращаемых LDAP поиском. Префикс будет удален из исходных строк, а сами они будут рассматриваться как имена локальных ролей. По умолчанию: пустая строка. [Оригинальная статья](https://clickhouse.tech/docs/en/operations/external-authenticators/ldap) diff --git a/docs/ru/operations/opentelemetry.md b/docs/ru/operations/opentelemetry.md index 073e7c67e9c..4065f88350b 100644 --- a/docs/ru/operations/opentelemetry.md +++ b/docs/ru/operations/opentelemetry.md @@ -5,7 +5,7 @@ toc_title: Поддержка OpenTelemetry # [экспериментально] Поддержка OpenTelemetry -ClickHouse поддерживает [OpenTelemetry](https://opentelemetry.io/) — открытый стандарт для сбора трассировок и метрик из распределенного приложения. +ClickHouse поддерживает [OpenTelemetry](https://opentelemetry.io/) — открытый стандарт для сбора трассировок и метрик из распределенного приложения. !!! warning "Предупреждение" Поддержка стандарта экспериментальная и будет со временем меняться. diff --git a/docs/ru/operations/server-configuration-parameters/settings.md b/docs/ru/operations/server-configuration-parameters/settings.md index abaf2a8f2da..a8ae3f7eb3e 100644 --- a/docs/ru/operations/server-configuration-parameters/settings.md +++ b/docs/ru/operations/server-configuration-parameters/settings.md @@ -34,6 +34,7 @@ ClickHouse перезагружает встроенные словари с з ... ... ... + ... ... @@ -43,11 +44,12 @@ ClickHouse перезагружает встроенные словари с з - `min_part_size` - Минимальный размер части таблицы. - `min_part_size_ratio` - Отношение размера минимальной части таблицы к полному размеру таблицы. -- `method` - Метод сжатия. Возможные значения: `lz4`, `zstd`. +- `method` - Метод сжатия. Возможные значения: `lz4`, `lz4hc`, `zstd`. +- `level` – Уровень сжатия. См. [Кодеки](../../sql-reference/statements/create/table/#create-query-common-purpose-codecs). Можно сконфигурировать несколько разделов ``. -ClickHouse проверяет условия для `min_part_size` и `min_part_size_ratio` и выполнит те блоки `case`, для которых условия совпали. +ClickHouse проверяет условия для `min_part_size` и `min_part_size_ratio` и выполнит те блоки `case`, для которых условия совпали. - Если кусок данных совпадает с условиями, ClickHouse использует указанные метод сжатия. - Если кусок данных совпадает с несколькими блоками `case`, ClickHouse использует перый совпавший блок условий. @@ -62,6 +64,7 @@ ClickHouse проверяет условия для `min_part_size` и `min_part 10000000000 0.01 zstd + 1 ``` @@ -98,7 +101,7 @@ ClickHouse проверяет условия для `min_part_size` и `min_part ```xml 1073741824 - + ``` ## database_atomic_delay_before_drop_table_sec {#database_atomic_delay_before_drop_table_sec} @@ -131,6 +134,25 @@ ClickHouse проверяет условия для `min_part_size` и `min_part default ``` +## default_replica_path {#default_replica_path} + +Путь к таблице в ZooKeeper. + +**Пример** + +``` xml +/clickhouse/tables/{uuid}/{shard} +``` +## default_replica_name {#default_replica_name} + +Имя реплики в ZooKeeper. + +**Пример** + +``` xml +{replica} +``` + ## dictionaries_config {#server_configuration_parameters-dictionaries_config} Путь к конфигурации внешних словарей. @@ -154,7 +176,7 @@ ClickHouse проверяет условия для `min_part_size` и `min_part Если `true`, то каждый словарь создаётся при первом использовании. Если словарь не удалось создать, то вызов функции, использующей словарь, сгенерирует исключение. -Если `false`, то все словари создаются при старте сервера, если словарь или словари создаются слишком долго или создаются с ошибкой, то сервер загружается без +Если `false`, то все словари создаются при старте сервера, если словарь или словари создаются слишком долго или создаются с ошибкой, то сервер загружается без этих словарей и продолжает попытки создать эти словари. По умолчанию - `true`. @@ -424,7 +446,7 @@ ClickHouse проверяет условия для `min_part_size` и `min_part Ключи: -- `enabled` – Булевый флаг чтобы включить функциональность, по умолчанию `false`. Установите `true` чтобы разрешить отправку отчетов о сбоях. +- `enabled` – Булевый флаг чтобы включить функциональность, по умолчанию `false`. Установите `true` чтобы разрешить отправку отчетов о сбоях. - `endpoint` – Вы можете переопределить URL на который будут отсылаться отчеты об ошибках и использовать собственную инсталяцию Sentry. Используйте URL синтаксис [Sentry DSN](https://docs.sentry.io/error-reporting/quickstart/?platform=native#configure-the-sdk). - `anonymize` - Запретить отсылку имени хоста сервера в отчете о сбое. - `http_proxy` - Настройка HTTP proxy для отсылки отчетов о сбоях. @@ -487,7 +509,7 @@ ClickHouse проверяет условия для `min_part_size` и `min_part ## max_server_memory_usage_to_ram_ratio {#max_server_memory_usage_to_ram_ratio} -Определяет долю оперативной памяти, доступную для использования сервером Clickhouse. Если сервер попытается использовать больше, предоставляемый ему объём памяти будет ограничен до расчётного значения. +Определяет долю оперативной памяти, доступную для использования сервером Clickhouse. Если сервер попытается использовать больше, предоставляемый ему объём памяти будет ограничен до расчётного значения. Возможные значения: @@ -515,7 +537,7 @@ ClickHouse проверяет условия для `min_part_size` и `min_part Определяет максимальное количество одновременно обрабатываемых запросов, связанных с таблицей семейства `MergeTree`. Запросы также могут быть ограничены настройками: [max_concurrent_queries_for_all_users](#max-concurrent-queries-for-all-users), [min_marks_to_honor_max_concurrent_queries](#min-marks-to-honor-max-concurrent-queries). !!! info "Примечание" - Параметры этих настроек могут быть изменены во время выполнения запросов и вступят в силу немедленно. Запросы, которые уже запущены, выполнятся без изменений. + Параметры этих настроек могут быть изменены во время выполнения запросов и вступят в силу немедленно. Запросы, которые уже запущены, выполнятся без изменений. Возможные значения: @@ -864,8 +886,8 @@ ClickHouse проверяет условия для `min_part_size` и `min_part - `engine` - устанавливает [настройки MergeTree Engine](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table) для системной таблицы. Нельзя использовать если используется `partition_by`. - `flush_interval_milliseconds` — период сброса данных из буфера в памяти в таблицу. -**Пример** -```xml +**Пример** +```xml notice @@ -929,7 +951,7 @@ The default server configuration file `config.xml` contains the following settin `system.events` таблица содержит счетчик `QueryMaskingRulesMatch` который считает общее кол-во совпадений правил маскировки. -Для распределенных запросов каждый сервер должен быть сконфигурирован отдельно, иначе, подзапросы, +Для распределенных запросов каждый сервер должен быть сконфигурирован отдельно, иначе, подзапросы, переданные на другие узлы, будут сохраняться без маскировки. ## remote_servers {#server-settings-remote-servers} @@ -1177,7 +1199,7 @@ ClickHouse использует ZooKeeper для хранения метадан Секция конфигурационного файла,которая содержит настройки: - Путь к конфигурационному файлу с предустановленными пользователями. -- Путь к файлу, в котором содержатся пользователи, созданные при помощи SQL команд. +- Путь к файлу, в котором содержатся пользователи, созданные при помощи SQL команд. Если эта секция определена, путь из [users_config](../../operations/server-configuration-parameters/settings.md#users-config) и [access_control_path](../../operations/server-configuration-parameters/settings.md#access_control_path) не используется. diff --git a/docs/ru/operations/settings/index.md b/docs/ru/operations/settings/index.md index 050df975b47..926a1217ef6 100644 --- a/docs/ru/operations/settings/index.md +++ b/docs/ru/operations/settings/index.md @@ -24,13 +24,13 @@ toc_title: Introduction - При запуске консольного клиента ClickHouse в не интерактивном режиме установите параметр запуска `--setting=value`. - При использовании HTTP API передавайте cgi-параметры (`URL?setting_1=value&setting_2=value...`). - - Укажите необходимые настройки в секции [SETTINGS](../../sql-reference/statements/select/index.md#settings-in-select) запроса SELECT. Эти настройки действуют только в рамках данного запроса, а после его выполнения сбрасываются до предыдущего значения или значения по умолчанию. + - Укажите необходимые настройки в секции [SETTINGS](../../sql-reference/statements/select/index.md#settings-in-select) запроса SELECT. Эти настройки действуют только в рамках данного запроса, а после его выполнения сбрасываются до предыдущего значения или значения по умолчанию. Настройки, которые можно задать только в конфигурационном файле сервера, в разделе не рассматриваются. ## Пользовательские настройки {#custom_settings} -В дополнение к общим [настройкам](../../operations/settings/settings.md), пользователи могут определять собственные настройки. +В дополнение к общим [настройкам](../../operations/settings/settings.md), пользователи могут определять собственные настройки. Название пользовательской настройки должно начинаться с одного из предопределённых префиксов. Список этих префиксов должен быть задан в параметре [custom_settings_prefixes](../../operations/server-configuration-parameters/settings.md#custom_settings_prefixes) конфигурационнного файла сервера. @@ -47,7 +47,7 @@ SET custom_a = 123; Чтобы получить текущее значение пользовательской настройки, используйте функцию `getSetting()`: ```sql -SELECT getSetting('custom_a'); +SELECT getSetting('custom_a'); ``` **См. также** diff --git a/docs/ru/operations/settings/merge-tree-settings.md b/docs/ru/operations/settings/merge-tree-settings.md index 9ae247cf7a7..88c511d4d80 100644 --- a/docs/ru/operations/settings/merge-tree-settings.md +++ b/docs/ru/operations/settings/merge-tree-settings.md @@ -119,7 +119,7 @@ Eсли суммарное число активных кусков во все Значение по умолчанию: 100. Команда `Insert` создает один или несколько блоков (кусков). При вставке в Replicated таблицы ClickHouse для [дедупликации вставок](../../engines/table-engines/mergetree-family/replication.md) записывает в Zookeeper хеш-суммы созданных кусков. Но хранятся только последние `replicated_deduplication_window` хеш-сумм. Самые старые хеш-суммы удаляются из Zookeeper. -Большое значение `replicated_deduplication_window` замедляет `Insert`, так как приходится сравнивать большее количество хеш-сумм. +Большое значение `replicated_deduplication_window` замедляет `Insert`, так как приходится сравнивать большее количество хеш-сумм. Хеш-сумма рассчитывается по названиям и типам полей, а также по данным вставленного куска (потока байт). ## non_replicated_deduplication_window {#non-replicated-deduplication-window} @@ -162,8 +162,8 @@ Eсли суммарное число активных кусков во все При записи нового куска `fsync` не вызывается, поэтому неактивные куски удаляются позже. Это значит, что некоторое время новый кусок находится только в оперативной памяти сервера (кеш ОС). Если сервер перезагрузится спонтанно, новый слитый кусок может испортиться или потеряться. -Во время запуска сервер ClickHouse проверяет целостность кусков. -Если новый (слитый) кусок поврежден, ClickHouse возвращает неактивные куски в список активных и позже снова выполняет слияние. В этом случае испорченный кусок получает новое имя (добавляется префикс `broken_`) и попадает в каталог `detached`. +Во время запуска сервер ClickHouse проверяет целостность кусков. +Если новый (слитый) кусок поврежден, ClickHouse возвращает неактивные куски в список активных и позже снова выполняет слияние. В этом случае испорченный кусок получает новое имя (добавляется префикс `broken_`) и попадает в каталог `detached`. Если проверка целостности не выявляет проблем в слитом куске, то исходные неактивные куски переименовываются (добавляется префикс `ignored_`) и перемещаются в каталог `detached`. Стандартное для Linux значение `dirty_expire_centisecs` — 30 секунд. Это максимальное время, в течение которого записанные данные хранятся только в оперативной памяти. Если нагрузка на дисковую систему большая, то данные записываются намного позже. Значение 480 секунд подобрали экспериментальным путем — это время, за которое новый кусок гарантированно запишется на диск. @@ -277,4 +277,15 @@ Eсли суммарное число активных кусков во все Значение по умолчанию: `0`. -[Original article](https://clickhouse.tech/docs/ru/operations/settings/merge_tree_settings/) +## check_sample_column_is_correct {#check_sample_column_is_correct} + +Разрешает проверку того, что тип данных столбца для сэмплирования или выражения сэмплирования при создании таблицы верный. Тип данных должен соответствовать одному из беззнаковых [целочисленных типов](../../sql-reference/data-types/int-uint.md): `UInt8`, `UInt16`, `UInt32`, `UInt64`. + +Возможные значения: + +- true — проверка включена. +- false — проверка при создании таблицы не проводится. + +Значение по умолчанию: `true`. + +По умолчанию сервер ClickHouse при создании таблицы проверяет тип данных столбца для сэмплирования или выражения сэмплирования. Если уже существуют таблицы с некорректным выражением сэмплирования, то чтобы не возникало исключение при запуске сервера, установите `check_sample_column_is_correct` в значение `false`. diff --git a/docs/ru/operations/settings/query-complexity.md b/docs/ru/operations/settings/query-complexity.md index c2e00302d18..dcca2a254b8 100644 --- a/docs/ru/operations/settings/query-complexity.md +++ b/docs/ru/operations/settings/query-complexity.md @@ -66,21 +66,21 @@ toc_title: "Ограничения на сложность запроса" Следующие ограничения могут проверяться на каждый блок (а не на каждую строку). То есть, ограничения могут быть немного нарушены. Максимальное количество строчек, которое можно прочитать из таблицы на удалённом сервере при выполнении -распределенного запроса. Распределенные запросы могут создавать несколько подзапросов к каждому из шардов в кластере и -тогда этот лимит будет применен при выполнении чтения на удаленных серверах (включая и сервер-инициатор) и проигнорирован -на сервере-инициаторе запроса во время обьединения полученных результатов. Например, кластер состоит из 2 шард и каждый -из них хранит таблицу с 100 строк. Тогда распределнный запрос для получения всех данных из этих таблиц и установленной -настройкой `max_rows_to_read=150` выбросит исключение, т.к. в общем он прочитает 200 строк. Но запрос +распределенного запроса. Распределенные запросы могут создавать несколько подзапросов к каждому из шардов в кластере и +тогда этот лимит будет применен при выполнении чтения на удаленных серверах (включая и сервер-инициатор) и проигнорирован +на сервере-инициаторе запроса во время обьединения полученных результатов. Например, кластер состоит из 2 шард и каждый +из них хранит таблицу с 100 строк. Тогда распределнный запрос для получения всех данных из этих таблиц и установленной +настройкой `max_rows_to_read=150` выбросит исключение, т.к. в общем он прочитает 200 строк. Но запрос с настройкой `max_rows_to_read_leaf=150` завершится успешно, потому что каждый из шардов прочитает максимум 100 строк. ## max_bytes_to_read_leaf {#max-bytes-to-read-leaf} -Максимальное количество байт (несжатых данных), которое можно прочитать из таблицы на удалённом сервере при -выполнении распределенного запроса. Распределенные запросы могут создавать несколько подзапросов к каждому из шардов в -кластере и тогда этот лимит будет применен при выполнении чтения на удаленных серверах (включая и сервер-инициатор) -и проигнорирован на сервере-инициаторе запроса во время обьединения полученных результатов. Например, кластер состоит -из 2 шард и каждый из них хранит таблицу со 100 байтами. Тогда распределнный запрос для получения всех данных из этих таблиц -и установленной настройкой `max_bytes_to_read=150` выбросит исключение, т.к. в общем он прочитает 200 байт. Но запрос +Максимальное количество байт (несжатых данных), которое можно прочитать из таблицы на удалённом сервере при +выполнении распределенного запроса. Распределенные запросы могут создавать несколько подзапросов к каждому из шардов в +кластере и тогда этот лимит будет применен при выполнении чтения на удаленных серверах (включая и сервер-инициатор) +и проигнорирован на сервере-инициаторе запроса во время обьединения полученных результатов. Например, кластер состоит +из 2 шард и каждый из них хранит таблицу со 100 байтами. Тогда распределнный запрос для получения всех данных из этих таблиц +и установленной настройкой `max_bytes_to_read=150` выбросит исключение, т.к. в общем он прочитает 200 байт. Но запрос с настройкой `max_bytes_to_read_leaf=150` завершится успешно, потому что каждый из шардов прочитает максимум 100 байт. ## read_overflow_mode_leaf {#read-overflow-mode-leaf} diff --git a/docs/ru/operations/settings/settings-profiles.md b/docs/ru/operations/settings/settings-profiles.md index d3b3d29db94..fdf350cff41 100644 --- a/docs/ru/operations/settings/settings-profiles.md +++ b/docs/ru/operations/settings/settings-profiles.md @@ -71,9 +71,9 @@ SET profile = 'web' ``` -В примере задано два профиля: `default` и `web`. +В примере задано два профиля: `default` и `web`. -Профиль `default` имеет специальное значение — он обязателен и применяется при запуске сервера. Профиль `default` содержит настройки по умолчанию. +Профиль `default` имеет специальное значение — он обязателен и применяется при запуске сервера. Профиль `default` содержит настройки по умолчанию. Профиль `web` — обычный профиль, который может быть установлен с помощью запроса `SET` или параметра URL при запросе по HTTP. diff --git a/docs/ru/operations/settings/settings.md b/docs/ru/operations/settings/settings.md index 625453c94c6..209c2e2001d 100644 --- a/docs/ru/operations/settings/settings.md +++ b/docs/ru/operations/settings/settings.md @@ -25,6 +25,30 @@ ClickHouse применяет настройку в тех случаях, ко - `global` — заменяет запрос `IN`/`JOIN` на `GLOBAL IN`/`GLOBAL JOIN.` - `allow` — разрешает использование таких подзапросов. +## prefer_global_in_and_join {#prefer-global-in-and-join} + +Заменяет запрос `IN`/`JOIN` на `GLOBAL IN`/`GLOBAL JOIN`. + +Возможные значения: + +- 0 — выключена. Операторы `IN`/`JOIN` не заменяются на `GLOBAL IN`/`GLOBAL JOIN`. +- 1 — включена. Операторы `IN`/`JOIN` заменяются на `GLOBAL IN`/`GLOBAL JOIN`. + +Значение по умолчанию: `0`. + +**Использование** + +Настройка `SET distributed_product_mode=global` меняет поведение запросов для распределенных таблиц, но она не подходит для локальных таблиц или таблиц из внешних источников. В этих случаях удобно использовать настройку `prefer_global_in_and_join`. + +Например, если нужно объединить все данные из локальных таблиц, которые находятся на разных узлах — для распределенной обработки необходим `GLOBAL JOIN`. + +Другой вариант использования настройки `prefer_global_in_and_join` — регулирование обращений к таблицам из внешних источников. +Эта настройка помогает уменьшить количество обращений к внешним ресурсам при объединении внешних таблиц: только один вызов на весь распределенный запрос. + +**См. также:** + +- [Распределенные подзапросы](../../sql-reference/operators/in.md#select-distributed-subqueries) `GLOBAL IN`/`GLOBAL JOIN` + ## enable_optimize_predicate_expression {#enable-optimize-predicate-expression} Включает пробрасывание предикатов в подзапросы для запросов `SELECT`. @@ -85,6 +109,21 @@ ClickHouse применяет настройку в тех случаях, ко Имеет смысл выключать, если на сервере миллионы мелких таблиц-чанков, которые постоянно создаются и уничтожаются. +## function_range_max_elements_in_block {#settings-function_range_max_elements_in_block} + +Устанавливает порог безопасности для объема данных, создаваемого функцией [range](../../sql-reference/functions/array-functions.md#range). Задаёт максимальное количество значений, генерируемых функцией на блок данных (сумма размеров массивов для каждой строки в блоке). + +Возможные значения: + +- Положительное целое. + +Значение по умолчанию: `500 000 000`. + +**См. также** + +- [max_block_size](#setting-max_block_size) +- [min_insert_block_size_rows](#min-insert-block-size-rows) + ## enable_http_compression {#settings-enable_http_compression} Включает или отключает сжатие данных в ответе на HTTP-запрос. @@ -129,6 +168,26 @@ ClickHouse применяет настройку в тех случаях, ко Значение по умолчанию: 1048576. +## table_function_remote_max_addresses {#table_function_remote_max_addresses} + +Задает максимальное количество адресов, которые могут быть сгенерированы из шаблонов для функции [remote](../../sql-reference/table-functions/remote.md). + +Возможные значения: + +- Положительное целое. + +Значение по умолчанию: `1000`. + +## glob_expansion_max_elements {#glob_expansion_max_elements } + +Задает максимальное количество адресов, которые могут быть сгенерированы из шаблонов при использовании внешних хранилищ и при вызове табличных функциях (например, [url](../../sql-reference/table-functions/url.md)), кроме функции `remote`. + +Возможные значения: + +- Положительное целое. + +Значение по умолчанию: `1000`. + ## send_progress_in_http_headers {#settings-send_progress_in_http_headers} Включает или отключает HTTP-заголовки `X-ClickHouse-Progress` в ответах `clickhouse-server`. @@ -490,6 +549,23 @@ ClickHouse может парсить только базовый формат `Y Значение по умолчанию: `ALL`. +## join_algorithm {#settings-join_algorithm} + +Определяет алгоритм выполнения запроса [JOIN](../../sql-reference/statements/select/join.md). + +Возможные значения: + +- `hash` — используется [алгоритм соединения хешированием](https://ru.wikipedia.org/wiki/Алгоритм_соединения_хешированием). +- `partial_merge` — используется [алгоритм соединения слиянием сортированных списков](https://ru.wikipedia.org/wiki/Алгоритм_соединения_слиянием_сортированных_списков). +- `prefer_partial_merge` — используется алгоритм соединения слиянием сортированных списков, когда это возможно. +- `auto` — сервер ClickHouse пытается на лету заменить алгоритм `hash` на `merge`, чтобы избежать переполнения памяти. + +Значение по умолчанию: `hash`. + +При использовании алгоритма `hash` правая часть `JOIN` загружается в оперативную память. + +При использовании алгоритма `partial_merge` сервер сортирует данные и сбрасывает их на диск. Работа алгоритма `merge` в ClickHouse немного отличается от классической реализации. Сначала ClickHouse сортирует правую таблицу по блокам на основе [ключей соединения](../../sql-reference/statements/select/join.md#select-join) и для отсортированных блоков строит индексы min-max. Затем он сортирует куски левой таблицы на основе ключей соединения и объединяет их с правой таблицей операцией `JOIN`. Созданные min-max индексы используются для пропуска тех блоков из правой таблицы, которые не участвуют в данной операции `JOIN`. + ## join_any_take_last_row {#settings-join_any_take_last_row} Изменяет поведение операций, выполняемых со строгостью `ANY`. @@ -1204,8 +1280,15 @@ load_balancing = round_robin Работает для форматов JSONEachRow и TSKV. ## output_format_json_quote_64bit_integers {#session_settings-output_format_json_quote_64bit_integers} +Управляет кавычками при выводе 64-битных или более [целых чисел](../../sql-reference/data-types/int-uint.md) (например, `UInt64` или `Int128`) в формате [JSON](../../interfaces/formats.md#json). +По умолчанию такие числа заключаются в кавычки. Это поведение соответствует большинству реализаций JavaScript. -Если значение истинно, то при использовании JSON\* форматов UInt64 и Int64 числа выводятся в кавычках (из соображений совместимости с большинством реализаций JavaScript), иначе - без кавычек. +Возможные значения: + +- 0 — числа выводятся без кавычек. +- 1 — числа выводятся в кавычках. + +Значение по умолчанию: 1. ## output_format_json_quote_denormals {#settings-output_format_json_quote_denormals} @@ -1814,7 +1897,7 @@ ClickHouse генерирует исключение Тип: unsigned int -озможные значения: 32 (32 байта) - 1073741824 (1 GiB) +Возможные значения: 32 (32 байта) - 1073741824 (1 GiB) Значение по умолчанию: 32768 (32 KiB) @@ -1828,6 +1911,16 @@ ClickHouse генерирует исключение Значение по умолчанию: 16. +## merge_selecting_sleep_ms {#merge_selecting_sleep_ms} + +Время ожидания для слияния выборки, если ни один кусок не выбран. Снижение времени ожидания приводит к частому выбору задач в пуле `background_schedule_pool` и увеличению количества запросов к Zookeeper в крупных кластерах. + +Возможные значения: + +- Положительное целое число. + +Значение по умолчанию: `5000`. + ## parallel_distributed_insert_select {#parallel_distributed_insert_select} Включает параллельную обработку распределённых запросов `INSERT ... SELECT`. @@ -2723,7 +2816,7 @@ SELECT * FROM test2; └─────────────┘ ``` -Обратите внимание на то, что эта настройка влияет на поведение [материализованных представлений](../../sql-reference/statements/create/view.md#materialized) и БД [MaterializeMySQL](../../engines/database-engines/materialize-mysql.md). +Обратите внимание на то, что эта настройка влияет на поведение [материализованных представлений](../../sql-reference/statements/create/view.md#materialized) и БД [MaterializedMySQL](../../engines/database-engines/materialized-mysql.md). ## engine_file_empty_if_not_exists {#engine-file-empty_if-not-exists} @@ -2979,6 +3072,53 @@ SELECT FROM fuse_tbl ``` +## allow_experimental_database_replicated {#allow_experimental_database_replicated} + +Позволяет создавать базы данных с движком [Replicated](../../engines/database-engines/replicated.md). + +Возможные значения: + +- 0 — Disabled. +- 1 — Enabled. + +Значение по умолчанию: `0`. + +## database_replicated_initial_query_timeout_sec {#database_replicated_initial_query_timeout_sec} + +Устанавливает, как долго начальный DDL-запрос должен ждать, пока реплицированная база данных прецессирует предыдущие записи очереди DDL в секундах. + +Возможные значения: + +- Положительное целое число. +- 0 — Не ограничено. + +Значение по умолчанию: `300`. + +## distributed_ddl_task_timeout {#distributed_ddl_task_timeout} + +Устанавливает тайм-аут для ответов на DDL-запросы от всех хостов в кластере. Если DDL-запрос не был выполнен на всех хостах, ответ будет содержать ошибку тайм-аута, и запрос будет выполнен в асинхронном режиме. + +Возможные значения: + +- Положительное целое число. +- 0 — Асинхронный режим. +- Отрицательное число — бесконечный тайм-аут. + +Значение по умолчанию: `180`. + +## distributed_ddl_output_mode {#distributed_ddl_output_mode} + +Задает формат результата распределенного DDL-запроса. + +Возможные значения: + +- `throw` — возвращает набор результатов со статусом выполнения запросов для всех хостов, где завершен запрос. Если запрос не выполнился на некоторых хостах, то будет выброшено исключение. Если запрос еще не закончен на некоторых хостах и таймаут [distributed_ddl_task_timeout](#distributed_ddl_task_timeout) превышен, то выбрасывается исключение `TIMEOUT_EXCEEDED`. +- `none` — идентично `throw`, но распределенный DDL-запрос не возвращает набор результатов. +- `null_status_on_timeout` — возвращает `NULL` в качестве статуса выполнения в некоторых строках набора результатов вместо выбрасывания `TIMEOUT_EXCEEDED`, если запрос не закончен на соответствующих хостах. +- `never_throw` — не выбрасывает исключение и `TIMEOUT_EXCEEDED`, если запрос не удался на некоторых хостах. + +Значение по умолчанию: `throw`. + ## flatten_nested {#flatten-nested} Устанавливает формат данных у [вложенных](../../sql-reference/data-types/nested-data-structures/nested.md) столбцов. @@ -3059,3 +3199,41 @@ SETTINGS index_granularity = 8192 │ **Использование** Если установлено значение `0`, то табличная функция не делает Nullable столбцы, а вместо NULL выставляет значения по умолчанию для скалярного типа. Это также применимо для значений NULL внутри массивов. + +## output_format_arrow_low_cardinality_as_dictionary {#output-format-arrow-low-cardinality-as-dictionary} + +Позволяет конвертировать тип [LowCardinality](../../sql-reference/data-types/lowcardinality.md) в тип `DICTIONARY` формата [Arrow](../../interfaces/formats.md#data-format-arrow) для запросов `SELECT`. + +Возможные значения: + +- 0 — тип `LowCardinality` не конвертируется в тип `DICTIONARY`. +- 1 — тип `LowCardinality` конвертируется в тип `DICTIONARY`. + +Значение по умолчанию: `0`. + +## materialized_postgresql_max_block_size {#materialized-postgresql-max-block-size} + +Задает максимальное количество строк, собранных в памяти перед вставкой данных в таблицу базы данных PostgreSQL. + +Возможные значения: + +- Положительное целое число. + +Значение по умолчанию: `65536`. + +## materialized_postgresql_tables_list {#materialized-postgresql-tables-list} + +Задает список таблиц базы данных PostgreSQL, разделенных запятыми, которые будут реплицироваться с помощью движка базы данных [MaterializedPostgreSQL](../../engines/database-engines/materialized-postgresql.md). + +Значение по умолчанию: пустой список — база данных PostgreSQL будет полностью реплицирована. + +## materialized_postgresql_allow_automatic_update {#materialized-postgresql-allow-automatic-update} + +Позволяет автоматически обновить таблицу в фоновом режиме при обнаружении изменений схемы. DDL-запросы на стороне сервера PostgreSQL не реплицируются с помощью движка ClickHouse [MaterializedPostgreSQL](../../engines/database-engines/materialized-postgresql.md), поскольку это запрещено протоколом логической репликации PostgreSQL, но факт DDL-измененений обнаруживается транзакционно. После обнаружения DDL по умолчанию прекращается репликация этих таблиц. Однако, если эта настройка включена, то вместо остановки репликации, таблицы будут перезагружены в фоновом режиме с помощью снимка базы данных без потери информации, и репликация для них будет продолжена. + +Возможные значения: + +- 0 — таблица не обновляется автоматически в фоновом режиме при обнаружении изменений схемы. +- 1 — таблица обновляется автоматически в фоновом режиме при обнаружении изменений схемы. + +Значение по умолчанию: `0`. diff --git a/docs/ru/operations/storing-data.md b/docs/ru/operations/storing-data.md new file mode 100644 index 00000000000..45b77fdb5ec --- /dev/null +++ b/docs/ru/operations/storing-data.md @@ -0,0 +1,114 @@ +--- +toc_priority: 68 +toc_title: "Хранение данных на внешних дисках" +--- + +# Хранение данных на внешних дисках {#external-disks} + +Данные, которые обрабатываются в ClickHouse, обычно хранятся в файловой системе локально, где развернут сервер ClickHouse. При этом для хранения данных требуются диски большого объема, которые могут быть довольно дорогостоящими. Решением проблемы может стать хранение данных отдельно от сервера — в распределенных файловых системах — [Amazon S3](https://aws.amazon.com/s3/) или Hadoop ([HDFS](https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html)). + +Для работы с данными, хранящимися в файловой системе `Amazon S3`, используйте движок [S3](../engines/table-engines/integrations/s3.md), а для работы с данными в файловой системе Hadoop — движок [HDFS](../engines/table-engines/integrations/hdfs.md). + +## Репликация без копирования данных {#zero-copy} + +Для дисков `S3` и `HDFS` в ClickHouse поддерживается репликация без копирования данных (zero-copy): если данные хранятся на нескольких репликах, то при синхронизации пересылаются только метаданные (пути к кускам данных), а сами данные не копируются. + +## Использование сервиса HDFS для хранения данных {#table_engine-mergetree-hdfs} + +Таблицы семейств [MergeTree](../engines/table-engines/mergetree-family/mergetree.md) и [Log](../engines/table-engines/log-family/log.md) могут хранить данные в сервисе HDFS при использовании диска типа `HDFS`. + +Пример конфигурации: +``` xml + + + + + hdfs + hdfs://hdfs1:9000/clickhouse/ + + + + + +
+ hdfs +
+
+
+
+
+ + + 0 + +
+``` + +Обязательные параметры: + +- `endpoint` — URL точки приема запроса на стороне HDFS в формате `path`. URL точки должен содержать путь к корневой директории на сервере, где хранятся данные. + +Необязательные параметры: + +- `min_bytes_for_seek` — минимальное количество байтов, которые используются для операций поиска вместо последовательного чтения. Значение по умолчанию: `1 МБайт`. + +## Использование виртуальной файловой системы для шифрования данных {#encrypted-virtual-file-system} + +Вы можете зашифровать данные, сохраненные на внешних дисках [S3](../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-s3) или [HDFS](#table_engine-mergetree-hdfs) или на локальном диске. Чтобы включить режим шифрования, в конфигурационном файле вы должны указать диск с типом `encrypted` и тип диска, на котором будут сохранены данные. Диск типа `encrypted` шифрует данные "на лету", то есть при чтении файлов с этого диска расшифровка происходит автоматически. Таким образом, вы можете работать с диском типа `encrypted` как с обычным. + +Пример конфигурации: + +``` xml + + + local + /path1/ + + + encrypted + disk1 + path2/ + _16_ascii_chars_ + + +``` + +Например, когда ClickHouse записывает данные из какой-либо таблицы в файл `store/all_1_1_0/data.bin` на `disk1`, то на самом деле этот файл будет записан на физический диск по пути `/path1/store/all_1_1_0/data.bin`. + +При записи того же файла на диск `disk2` он будет записан на физический диск в зашифрованном виде по пути `/path1/path2/store/all_1_1_0/data.bin`. + +Обязательные параметры: + +- `type` — `encrypted`. Иначе зашифрованный диск создан не будет. +- `disk` — тип диска для хранения данных. +- `key` — ключ для шифрования и расшифровки. Тип: [Uint64](../sql-reference/data-types/int-uint.md). Вы можете использовать параметр `key_hex` для шифрования в шестнадцатеричной форме. + Вы можете указать несколько ключей, используя атрибут `id` (смотрите пример выше). + +Необязательные параметры: + +- `path` — путь к месту на диске, где будут сохранены данные. Если не указан, данные будут сохранены в корневом каталоге. +- `current_key_id` — ключ, используемый для шифрования. Все указанные ключи могут быть использованы для расшифровки, и вы всегда можете переключиться на другой ключ, сохраняя доступ к ранее зашифрованным данным. +- `algorithm` — [алгоритм](../sql-reference/statements/create/table.md#create-query-encryption-codecs) шифрования данных. Возможные значения: `AES_128_CTR`, `AES_192_CTR` или `AES_256_CTR`. Значение по умолчанию: `AES_128_CTR`. Длина ключа зависит от алгоритма: `AES_128_CTR` — 16 байт, `AES_192_CTR` — 24 байта, `AES_256_CTR` — 32 байта. + +Пример конфигурации: + +``` xml + + + + + s3 + ... + + + encrypted + disk_s3 + AES_128_CTR + 00112233445566778899aabbccddeeff + ffeeddccbbaa99887766554433221100 + 1 + + + + +``` diff --git a/docs/ru/operations/system-tables/asynchronous_metric_log.md b/docs/ru/operations/system-tables/asynchronous_metric_log.md index 979b63f0cc8..8bb371de230 100644 --- a/docs/ru/operations/system-tables/asynchronous_metric_log.md +++ b/docs/ru/operations/system-tables/asynchronous_metric_log.md @@ -31,6 +31,6 @@ SELECT * FROM system.asynchronous_metric_log LIMIT 10 ``` **Смотрите также** -- [system.asynchronous_metrics](#system_tables-asynchronous_metrics) — Содержит метрики, которые периодически вычисляются в фоновом режиме. +- [system.asynchronous_metrics](#system_tables-asynchronous_metrics) — Содержит метрики, которые периодически вычисляются в фоновом режиме. - [system.metric_log](#system_tables-metric_log) — таблица фиксирующая историю значений метрик из `system.metrics` и `system.events`. diff --git a/docs/ru/operations/system-tables/asynchronous_metrics.md b/docs/ru/operations/system-tables/asynchronous_metrics.md index 9d12a119c43..faefdf0eee5 100644 --- a/docs/ru/operations/system-tables/asynchronous_metrics.md +++ b/docs/ru/operations/system-tables/asynchronous_metrics.md @@ -35,4 +35,3 @@ SELECT * FROM system.asynchronous_metrics LIMIT 10 - [system.events](#system_tables-events) — таблица с количеством произошедших событий. - [system.metric_log](#system_tables-metric_log) — таблица фиксирующая историю значений метрик из `system.metrics` и `system.events`. - \ No newline at end of file diff --git a/docs/ru/operations/system-tables/columns.md b/docs/ru/operations/system-tables/columns.md index b8a0aef2299..a896360b3f9 100644 --- a/docs/ru/operations/system-tables/columns.md +++ b/docs/ru/operations/system-tables/columns.md @@ -4,7 +4,7 @@ С помощью этой таблицы можно получить информацию аналогично запросу [DESCRIBE TABLE](../../sql-reference/statements/misc.md#misc-describe-table), но для многих таблиц сразу. -Колонки [временных таблиц](../../sql-reference/statements/create/table.md#temporary-tables) содержатся в `system.columns` только в тех сессиях, в которых эти таблицы были созданы. Поле `database` у таких колонок пустое. +Колонки [временных таблиц](../../sql-reference/statements/create/table.md#temporary-tables) содержатся в `system.columns` только в тех сессиях, в которых эти таблицы были созданы. Поле `database` у таких колонок пустое. Cтолбцы: @@ -38,17 +38,17 @@ database: system table: aggregate_function_combinators name: name type: String -default_kind: -default_expression: +default_kind: +default_expression: data_compressed_bytes: 0 data_uncompressed_bytes: 0 marks_bytes: 0 -comment: +comment: is_in_partition_key: 0 is_in_sorting_key: 0 is_in_primary_key: 0 is_in_sampling_key: 0 -compression_codec: +compression_codec: Row 2: ────── @@ -56,15 +56,15 @@ database: system table: aggregate_function_combinators name: is_internal type: UInt8 -default_kind: -default_expression: +default_kind: +default_expression: data_compressed_bytes: 0 data_uncompressed_bytes: 0 marks_bytes: 0 -comment: +comment: is_in_partition_key: 0 is_in_sorting_key: 0 is_in_primary_key: 0 is_in_sampling_key: 0 -compression_codec: +compression_codec: ``` diff --git a/docs/ru/operations/system-tables/current-roles.md b/docs/ru/operations/system-tables/current-roles.md index 42ed4260fde..ee9cbb08b3d 100644 --- a/docs/ru/operations/system-tables/current-roles.md +++ b/docs/ru/operations/system-tables/current-roles.md @@ -6,5 +6,5 @@ - `role_name` ([String](../../sql-reference/data-types/string.md))) — Имя роли. - `with_admin_option` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Флаг, который показывает, обладает ли `current_role` роль привилегией `ADMIN OPTION`. - - `is_default` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Флаг, который показывает, является ли `current_role` ролью по умолчанию. + - `is_default` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Флаг, который показывает, является ли `current_role` ролью по умолчанию. diff --git a/docs/ru/operations/system-tables/data_skipping_indices.md b/docs/ru/operations/system-tables/data_skipping_indices.md new file mode 100644 index 00000000000..39e13ed1d5a --- /dev/null +++ b/docs/ru/operations/system-tables/data_skipping_indices.md @@ -0,0 +1,38 @@ +# system.data_skipping_indices {#system-data-skipping-indices} + +Содержит информацию о существующих индексах пропуска данных во всех таблицах. + +Столбцы: + +- `database` ([String](../../sql-reference/data-types/string.md)) — имя базы данных. +- `table` ([String](../../sql-reference/data-types/string.md)) — имя таблицы. +- `name` ([String](../../sql-reference/data-types/string.md)) — имя индекса. +- `type` ([String](../../sql-reference/data-types/string.md)) — тип индекса. +- `expr` ([String](../../sql-reference/data-types/string.md)) — выражение, используемое для вычисления индекса. +- `granularity` ([UInt64](../../sql-reference/data-types/int-uint.md)) — количество гранул в блоке данных. + +**Пример** + +```sql +SELECT * FROM system.data_skipping_indices LIMIT 2 FORMAT Vertical; +``` + +```text +Row 1: +────── +database: default +table: user_actions +name: clicks_idx +type: minmax +expr: clicks +granularity: 1 + +Row 2: +────── +database: default +table: users +name: contacts_null_idx +type: minmax +expr: assumeNotNull(contacts_null) +granularity: 1 +``` diff --git a/docs/ru/operations/system-tables/distributed_ddl_queue.md b/docs/ru/operations/system-tables/distributed_ddl_queue.md index 99d92574a0b..b384243834f 100644 --- a/docs/ru/operations/system-tables/distributed_ddl_queue.md +++ b/docs/ru/operations/system-tables/distributed_ddl_queue.md @@ -61,4 +61,3 @@ exception_code: ZOK 2 rows in set. Elapsed: 0.025 sec. ``` - \ No newline at end of file diff --git a/docs/ru/operations/system-tables/distribution_queue.md b/docs/ru/operations/system-tables/distribution_queue.md index 5b811ab2be8..08f99d77343 100644 --- a/docs/ru/operations/system-tables/distribution_queue.md +++ b/docs/ru/operations/system-tables/distribution_queue.md @@ -36,7 +36,7 @@ is_blocked: 1 error_count: 0 data_files: 1 data_compressed_bytes: 499 -last_exception: +last_exception: ``` **Смотрите также** diff --git a/docs/ru/operations/system-tables/enabled-roles.md b/docs/ru/operations/system-tables/enabled-roles.md index a3f5ba179b3..2208f96e812 100644 --- a/docs/ru/operations/system-tables/enabled-roles.md +++ b/docs/ru/operations/system-tables/enabled-roles.md @@ -5,7 +5,7 @@ Столбцы: - `role_name` ([String](../../sql-reference/data-types/string.md))) — Имя роли. -- `with_admin_option` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Флаг, который показывает, обладает ли `enabled_role` роль привилегией `ADMIN OPTION`. -- `is_current` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Флаг, который показывает, является ли `enabled_role` текущей ролью текущего пользователя. +- `with_admin_option` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Флаг, который показывает, обладает ли `enabled_role` роль привилегией `ADMIN OPTION`. +- `is_current` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Флаг, который показывает, является ли `enabled_role` текущей ролью текущего пользователя. - `is_default` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Флаг, который показывает, является ли `enabled_role` ролью по умолчанию. diff --git a/docs/ru/operations/system-tables/index.md b/docs/ru/operations/system-tables/index.md index fce93f33a27..73b839ddc1f 100644 --- a/docs/ru/operations/system-tables/index.md +++ b/docs/ru/operations/system-tables/index.md @@ -50,7 +50,7 @@ toc_title: "Системные таблицы" По умолчанию размер таблицы не ограничен. Управлять размером таблицы можно используя [TTL](../../sql-reference/statements/alter/ttl.md#manipuliatsii-s-ttl-tablitsy) для удаления устаревших записей журнала. Также вы можете использовать функцию партиционирования для таблиц `MergeTree`. -### Источники системных показателей +### Источники системных показателей Для сбора системных показателей сервер ClickHouse использует: diff --git a/docs/ru/operations/system-tables/licenses.md b/docs/ru/operations/system-tables/licenses.md index 598da1e72ee..b22dc73b666 100644 --- a/docs/ru/operations/system-tables/licenses.md +++ b/docs/ru/operations/system-tables/licenses.md @@ -5,7 +5,7 @@ Столбцы: - `library_name` ([String](../../sql-reference/data-types/string.md)) — Название библиотеки, к которой относится лицензия. -- `license_type` ([String](../../sql-reference/data-types/string.md)) — Тип лицензии, например, Apache, MIT. +- `license_type` ([String](../../sql-reference/data-types/string.md)) — Тип лицензии, например, Apache, MIT. - `license_path` ([String](../../sql-reference/data-types/string.md)) — Путь к файлу с текстом лицензии. - `license_text` ([String](../../sql-reference/data-types/string.md)) — Текст лицензии. diff --git a/docs/ru/operations/system-tables/mutations.md b/docs/ru/operations/system-tables/mutations.md index 4370ab593e7..bbd4d9fac13 100644 --- a/docs/ru/operations/system-tables/mutations.md +++ b/docs/ru/operations/system-tables/mutations.md @@ -1,6 +1,6 @@ # system.mutations {#system_tables-mutations} -Таблица содержит информацию о ходе выполнения [мутаций](../../sql-reference/statements/alter/index.md#mutations) таблиц семейства MergeTree. Каждой команде мутации соответствует одна строка таблицы. +Таблица содержит информацию о ходе выполнения [мутаций](../../sql-reference/statements/alter/index.md#mutations) таблиц семейства MergeTree. Каждой команде мутации соответствует одна строка таблицы. Столбцы: diff --git a/docs/ru/operations/system-tables/part_log.md b/docs/ru/operations/system-tables/part_log.md index a8d892f3b67..78e9a7c0fbe 100644 --- a/docs/ru/operations/system-tables/part_log.md +++ b/docs/ru/operations/system-tables/part_log.md @@ -63,6 +63,6 @@ read_rows: 0 read_bytes: 0 peak_memory_usage: 0 error: 0 -exception: +exception: ``` diff --git a/docs/ru/operations/system-tables/parts.md b/docs/ru/operations/system-tables/parts.md index 1c7f0ad2e9a..c73e1566a95 100644 --- a/docs/ru/operations/system-tables/parts.md +++ b/docs/ru/operations/system-tables/parts.md @@ -19,10 +19,10 @@ Возможные значения: - - `Wide` — каждая колонка хранится в отдельном файле. - - `Compact` — все колонки хранятся в одном файле. + - `Wide` — каждая колонка хранится в отдельном файле. + - `Compact` — все колонки хранятся в одном файле. - Формат хранения данных определяется настройками `min_bytes_for_wide_part` и `min_rows_for_wide_part` таблицы [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md). + Формат хранения данных определяется настройками `min_bytes_for_wide_part` и `min_rows_for_wide_part` таблицы [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md). - `active` ([UInt8](../../sql-reference/data-types/int-uint.md)) – признак активности. Если кусок активен, то он используется таблицей, в противном случает он будет удален. Неактивные куски остаются после слияний. @@ -88,7 +88,7 @@ - `delete_ttl_info_max` ([DateTime](../../sql-reference/data-types/datetime.md)) — Максимальное значение ключа даты и времени для правила [TTL DELETE](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-ttl). -- `move_ttl_info.expression` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Массив выражений. Каждое выражение задаёт правило [TTL MOVE](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-ttl). +- `move_ttl_info.expression` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Массив выражений. Каждое выражение задаёт правило [TTL MOVE](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-ttl). !!! note "Предупреждение" Массив выражений `move_ttl_info.expression` используется, в основном, для обратной совместимости. Для работы с правилами `TTL MOVE` лучше использовать поля `move_ttl_info.min` и `move_ttl_info.max`. diff --git a/docs/ru/operations/system-tables/parts_columns.md b/docs/ru/operations/system-tables/parts_columns.md index 5640929d810..04220ea480f 100644 --- a/docs/ru/operations/system-tables/parts_columns.md +++ b/docs/ru/operations/system-tables/parts_columns.md @@ -19,10 +19,10 @@ Возможные значения: - - `Wide` — каждая колонка хранится в отдельном файле. - - `Compact` — все колонки хранятся в одном файле. + - `Wide` — каждая колонка хранится в отдельном файле. + - `Compact` — все колонки хранятся в одном файле. - Формат хранения данных определяется настройками `min_bytes_for_wide_part` и `min_rows_for_wide_part` таблицы [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md). + Формат хранения данных определяется настройками `min_bytes_for_wide_part` и `min_rows_for_wide_part` таблицы [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md). - `active` ([UInt8](../../sql-reference/data-types/int-uint.md)) — признак активности. Если кусок данных активен, то он используется таблицей, в противном случае он будет удален. Неактивные куски остаются после слияний. diff --git a/docs/ru/operations/system-tables/query_log.md b/docs/ru/operations/system-tables/query_log.md index 8cdddba462c..7e98ddedcec 100644 --- a/docs/ru/operations/system-tables/query_log.md +++ b/docs/ru/operations/system-tables/query_log.md @@ -51,6 +51,7 @@ ClickHouse не удаляет данные из таблица автомати - `databases` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — имена баз данных, присутствующих в запросе. - `tables` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — имена таблиц, присутствующих в запросе. - `columns` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — имена столбцов, присутствующих в запросе. +- `projections` ([String](../../sql-reference/data-types/string.md)) — имена проекций, использованных при выполнении запроса. - `exception_code` ([Int32](../../sql-reference/data-types/int-uint.md)) — код исключения. - `exception` ([String](../../sql-reference/data-types/string.md)) — сообщение исключения, если запрос завершился по исключению. - `stack_trace` ([String](../../sql-reference/data-types/string.md)) — [stack trace](https://en.wikipedia.org/wiki/Stack_trace). Пустая строка, если запрос успешно завершен. @@ -65,6 +66,8 @@ ClickHouse не удаляет данные из таблица автомати - `initial_query_id` ([String](../../sql-reference/data-types/string.md)) — ID родительского запроса. - `initial_address` ([IPv6](../../sql-reference/data-types/domains/ipv6.md)) — IP адрес, с которого пришел родительский запрос. - `initial_port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — порт, с которого клиент сделал родительский запрос. +- `initial_query_start_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — время начала обработки запроса (для распределенных запросов). +- `initial_query_start_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — время начала обработки запроса с точностью до микросекунд (для распределенных запросов). - `interface` ([UInt8](../../sql-reference/data-types/int-uint.md)) — интерфейс, с которого ушёл запрос. Возможные значения: - 1 — TCP. - 2 — HTTP. @@ -101,55 +104,77 @@ ClickHouse не удаляет данные из таблица автомати **Пример** ``` sql -SELECT * FROM system.query_log WHERE type = 'QueryFinish' AND (query LIKE '%toDate(\'2000-12-05\')%') ORDER BY query_start_time DESC LIMIT 1 FORMAT Vertical; +SELECT * FROM system.query_log WHERE type = 'QueryFinish' ORDER BY query_start_time DESC LIMIT 1 FORMAT Vertical; ``` ``` text Row 1: ────── -type: QueryStart -event_date: 2020-09-11 -event_time: 2020-09-11 10:08:17 -event_time_microseconds: 2020-09-11 10:08:17.063321 -query_start_time: 2020-09-11 10:08:17 -query_start_time_microseconds: 2020-09-11 10:08:17.063321 -query_duration_ms: 0 -read_rows: 0 -read_bytes: 0 -written_rows: 0 -written_bytes: 0 -result_rows: 0 -result_bytes: 0 -memory_usage: 0 -current_database: default -query: INSERT INTO test1 VALUES -exception_code: 0 +type: QueryFinish +event_date: 2021-07-28 +event_time: 2021-07-28 13:46:56 +event_time_microseconds: 2021-07-28 13:46:56.719791 +query_start_time: 2021-07-28 13:46:56 +query_start_time_microseconds: 2021-07-28 13:46:56.704542 +query_duration_ms: 14 +read_rows: 8393 +read_bytes: 374325 +written_rows: 0 +written_bytes: 0 +result_rows: 4201 +result_bytes: 153024 +memory_usage: 4714038 +current_database: default +query: SELECT DISTINCT arrayJoin(extractAll(name, '[\\w_]{2,}')) AS res FROM (SELECT name FROM system.functions UNION ALL SELECT name FROM system.table_engines UNION ALL SELECT name FROM system.formats UNION ALL SELECT name FROM system.table_functions UNION ALL SELECT name FROM system.data_type_families UNION ALL SELECT name FROM system.merge_tree_settings UNION ALL SELECT name FROM system.settings UNION ALL SELECT cluster FROM system.clusters UNION ALL SELECT macro FROM system.macros UNION ALL SELECT policy_name FROM system.storage_policies UNION ALL SELECT concat(func.name, comb.name) FROM system.functions AS func CROSS JOIN system.aggregate_function_combinators AS comb WHERE is_aggregate UNION ALL SELECT name FROM system.databases LIMIT 10000 UNION ALL SELECT DISTINCT name FROM system.tables LIMIT 10000 UNION ALL SELECT DISTINCT name FROM system.dictionaries LIMIT 10000 UNION ALL SELECT DISTINCT name FROM system.columns LIMIT 10000) WHERE notEmpty(res) +normalized_query_hash: 6666026786019643712 +query_kind: Select +databases: ['system'] +tables: ['system.aggregate_function_combinators','system.clusters','system.columns','system.data_type_families','system.databases','system.dictionaries','system.formats','system.functions','system.macros','system.merge_tree_settings','system.settings','system.storage_policies','system.table_engines','system.table_functions','system.tables'] +columns: ['system.aggregate_function_combinators.name','system.clusters.cluster','system.columns.name','system.data_type_families.name','system.databases.name','system.dictionaries.name','system.formats.name','system.functions.is_aggregate','system.functions.name','system.macros.macro','system.merge_tree_settings.name','system.settings.name','system.storage_policies.policy_name','system.table_engines.name','system.table_functions.name','system.tables.name'] +projections: [] +exception_code: 0 exception: stack_trace: -is_initial_query: 1 -user: default -query_id: 50a320fd-85a8-49b8-8761-98a86bcbacef -address: ::ffff:127.0.0.1 -port: 33452 -initial_user: default -initial_query_id: 50a320fd-85a8-49b8-8761-98a86bcbacef -initial_address: ::ffff:127.0.0.1 -initial_port: 33452 -interface: 1 -os_user: bharatnc -client_hostname: tower -client_name: ClickHouse -client_revision: 54437 -client_version_major: 20 -client_version_minor: 7 -client_version_patch: 2 -http_method: 0 +is_initial_query: 1 +user: default +query_id: a3361f6e-a1fd-4d54-9f6f-f93a08bab0bf +address: ::ffff:127.0.0.1 +port: 51006 +initial_user: default +initial_query_id: a3361f6e-a1fd-4d54-9f6f-f93a08bab0bf +initial_address: ::ffff:127.0.0.1 +initial_port: 51006 +initial_query_start_time: 2021-07-28 13:46:56 +initial_query_start_time_microseconds: 2021-07-28 13:46:56.704542 +interface: 1 +os_user: +client_hostname: +client_name: ClickHouse client +client_revision: 54449 +client_version_major: 21 +client_version_minor: 8 +client_version_patch: 0 +http_method: 0 http_user_agent: +http_referer: +forwarded_for: quota_key: -revision: 54440 -thread_ids: [] -ProfileEvents: {'Query':1,'SelectQuery':1,'ReadCompressedBytes':36,'CompressedReadBufferBlocks':1,'CompressedReadBufferBytes':10,'IOBufferAllocs':1,'IOBufferAllocBytes':89,'ContextLock':15,'RWLockAcquiredReadLocks':1} -Settings: {'background_pool_size':'32','load_balancing':'random','allow_suspicious_low_cardinality_types':'1','distributed_aggregation_memory_efficient':'1','skip_unavailable_shards':'1','log_queries':'1','max_bytes_before_external_group_by':'20000000000','max_bytes_before_external_sort':'20000000000','allow_introspection_functions':'1'} +revision: 54453 +log_comment: +thread_ids: [5058,22097,22110,22094] +ProfileEvents.Names: ['Query','SelectQuery','ArenaAllocChunks','ArenaAllocBytes','FunctionExecute','NetworkSendElapsedMicroseconds','SelectedRows','SelectedBytes','ContextLock','RWLockAcquiredReadLocks','RealTimeMicroseconds','UserTimeMicroseconds','SystemTimeMicroseconds','SoftPageFaults','OSCPUWaitMicroseconds','OSCPUVirtualTimeMicroseconds','OSWriteBytes','OSWriteChars'] +ProfileEvents.Values: [1,1,39,352256,64,360,8393,374325,412,440,34480,13108,4723,671,19,17828,8192,10240] +Settings.Names: ['load_balancing','max_memory_usage'] +Settings.Values: ['random','10000000000'] +used_aggregate_functions: [] +used_aggregate_function_combinators: [] +used_database_engines: [] +used_data_type_families: ['UInt64','UInt8','Nullable','String','date'] +used_dictionaries: [] +used_formats: [] +used_functions: ['concat','notEmpty','extractAll'] +used_storages: [] +used_table_functions: [] ``` **Смотрите также** diff --git a/docs/ru/operations/system-tables/quota_limits.md b/docs/ru/operations/system-tables/quota_limits.md index 4103391cfd6..21505b7d2c5 100644 --- a/docs/ru/operations/system-tables/quota_limits.md +++ b/docs/ru/operations/system-tables/quota_limits.md @@ -5,7 +5,7 @@ Столбцы: - `quota_name` ([String](../../sql-reference/data-types/string.md)) — имя квоты. -- `duration` ([UInt32](../../sql-reference/data-types/int-uint.md)) — длина временного интервала для расчета потребления ресурсов, в секундах. +- `duration` ([UInt32](../../sql-reference/data-types/int-uint.md)) — длина временного интервала для расчета потребления ресурсов, в секундах. - `is_randomized_interval` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — логическое значение. Оно показывает, является ли интервал рандомизированным. Интервал всегда начинается в одно и то же время, если он не рандомизирован. Например, интервал в 1 минуту всегда начинается с целого числа минут (то есть он может начинаться в 11:20:00, но никогда не начинается в 11:20:01), интервал в один день всегда начинается в полночь UTC. Если интервал рандомизирован, то самый первый интервал начинается в произвольное время, а последующие интервалы начинаются один за другим. Значения: - `0` — интервал рандомизирован. - `1` — интервал не рандомизирован. diff --git a/docs/ru/operations/system-tables/quotas.md b/docs/ru/operations/system-tables/quotas.md index fe6b78cc44b..3715bc89596 100644 --- a/docs/ru/operations/system-tables/quotas.md +++ b/docs/ru/operations/system-tables/quotas.md @@ -7,14 +7,14 @@ - `name` ([String](../../sql-reference/data-types/string.md)) — Имя квоты. - `id` ([UUID](../../sql-reference/data-types/uuid.md)) — ID квоты. - `storage`([String](../../sql-reference/data-types/string.md)) — Хранилище квот. Возможные значения: "users.xml", если квота задана в файле users.xml, "disk" — если квота задана в SQL-запросе. -- `keys` ([Array](../../sql-reference/data-types/array.md)([Enum8](../../sql-reference/data-types/enum.md))) — Ключ определяет совместное использование квоты. Если два соединения используют одну и ту же квоту, они совместно используют один и тот же объем ресурсов. Значения: +- `keys` ([Array](../../sql-reference/data-types/array.md)([Enum8](../../sql-reference/data-types/enum.md))) — Ключ определяет совместное использование квоты. Если два соединения используют одну и ту же квоту, они совместно используют один и тот же объем ресурсов. Значения: - `[]` — Все пользователи используют одну и ту же квоту. - - `['user_name']` — Соединения с одинаковым именем пользователя используют одну и ту же квоту. - - `['ip_address']` — Соединения с одинаковым IP-адресом используют одну и ту же квоту. + - `['user_name']` — Соединения с одинаковым именем пользователя используют одну и ту же квоту. + - `['ip_address']` — Соединения с одинаковым IP-адресом используют одну и ту же квоту. - `['client_key']` — Соединения с одинаковым ключом используют одну и ту же квоту. Ключ может быть явно задан клиентом. При использовании [clickhouse-client](../../interfaces/cli.md), передайте ключевое значение в параметре `--quota-key`, или используйте параметр `quota_key` файле настроек клиента. В случае использования HTTP интерфейса, используйте заголовок `X-ClickHouse-Quota`. - `['user_name', 'client_key']` — Соединения с одинаковым ключом используют одну и ту же квоту. Если ключ не предоставлен клиентом, то квота отслеживается для `user_name`. - `['client_key', 'ip_address']` — Соединения с одинаковым ключом используют одну и ту же квоту. Если ключ не предоставлен клиентом, то квота отслеживается для `ip_address`. -- `durations` ([Array](../../sql-reference/data-types/array.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — Длины временных интервалов для расчета потребления ресурсов, в секундах. +- `durations` ([Array](../../sql-reference/data-types/array.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — Длины временных интервалов для расчета потребления ресурсов, в секундах. - `apply_to_all` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Логическое значение. Он показывает, к каким пользователям применяется квота. Значения: - `0` — Квота применяется к пользователям, перечисленным в списке `apply_to_list`. - `1` — Квота применяется к пользователям, за исключением тех, что перечислены в списке `apply_to_except`. diff --git a/docs/ru/operations/system-tables/replication_queue.md b/docs/ru/operations/system-tables/replication_queue.md index 2f9d80be16f..661962e83c4 100644 --- a/docs/ru/operations/system-tables/replication_queue.md +++ b/docs/ru/operations/system-tables/replication_queue.md @@ -21,7 +21,7 @@ - `MERGE_PARTS` — выполнить слияние кусков. - `DROP_RANGE` — удалить куски в партициях из указнного диапазона. - `CLEAR_COLUMN` — удалить указанный столбец из указанной партиции. Примечание: не используется с 20.4. - - `CLEAR_INDEX` — удалить указанный индекс из указанной партиции. Примечание: не используется с 20.4. + - `CLEAR_INDEX` — удалить указанный индекс из указанной партиции. Примечание: не используется с 20.4. - `REPLACE_RANGE` — удалить указанный диапазон кусков и заменить их на новые. - `MUTATE_PART` — применить одну или несколько мутаций к куску. - `ALTER_METADATA` — применить изменения структуры таблицы в результате запросов с выражением `ALTER`. diff --git a/docs/ru/operations/system-tables/role-grants.md b/docs/ru/operations/system-tables/role-grants.md index 2c80a597857..e392349af48 100644 --- a/docs/ru/operations/system-tables/role-grants.md +++ b/docs/ru/operations/system-tables/role-grants.md @@ -12,5 +12,5 @@ - 0 — `granted_role` не является ролью по умолчанию. - `with_admin_option` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Флаг, который показывает, обладает ли `granted_role` роль привилегией `ADMIN OPTION`. Возможные значения: - 1 — Роль обладает привилегией `ADMIN OPTION`. - - 0 — Роль не обладает привилегией `ADMIN OPTION`. + - 0 — Роль не обладает привилегией `ADMIN OPTION`. diff --git a/docs/ru/operations/system-tables/settings_profiles.md b/docs/ru/operations/system-tables/settings_profiles.md index f8101fb0cb7..8e0a8fde702 100644 --- a/docs/ru/operations/system-tables/settings_profiles.md +++ b/docs/ru/operations/system-tables/settings_profiles.md @@ -7,7 +7,7 @@ - `id` ([UUID](../../sql-reference/data-types/uuid.md)) — ID профиля настроек. -- `storage` ([String](../../sql-reference/data-types/string.md)) — Путь к хранилищу профилей настроек. Настраивается в параметре `access_control_path`. +- `storage` ([String](../../sql-reference/data-types/string.md)) — Путь к хранилищу профилей настроек. Настраивается в параметре `access_control_path`. - `num_elements` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Число элементов для этого профиля в таблице `system.settings_profile_elements`. diff --git a/docs/ru/operations/system-tables/tables.md b/docs/ru/operations/system-tables/tables.md index 3dec1e7d940..03ad174780f 100644 --- a/docs/ru/operations/system-tables/tables.md +++ b/docs/ru/operations/system-tables/tables.md @@ -1,10 +1,10 @@ # system.tables {#system-tables} -Содержит метаданные каждой таблицы, о которой знает сервер. +Содержит метаданные каждой таблицы, о которой знает сервер. Отсоединённые таблицы ([DETACH](../../sql-reference/statements/detach.md)) не отображаются в `system.tables`. -Информация о [временных таблицах](../../sql-reference/statements/create/table.md#temporary-tables) содержится в `system.tables` только в тех сессиях, в которых эти таблицы были созданы. Поле `database` у таких таблиц пустое, а флаг `is_temporary` включен. +Информация о [временных таблицах](../../sql-reference/statements/create/table.md#temporary-tables) содержится в `system.tables` только в тех сессиях, в которых эти таблицы были созданы. Поле `database` у таких таблиц пустое, а флаг `is_temporary` включен. Столбцы: diff --git a/docs/ru/operations/system-tables/text_log.md b/docs/ru/operations/system-tables/text_log.md index 97c6ef9e2cd..4936edc663b 100644 --- a/docs/ru/operations/system-tables/text_log.md +++ b/docs/ru/operations/system-tables/text_log.md @@ -42,7 +42,7 @@ microseconds: 871397 thread_name: clickhouse-serv thread_id: 564917 level: Information -query_id: +query_id: logger_name: DNSCacheUpdater message: Update period 15 seconds revision: 54440 diff --git a/docs/ru/operations/system-tables/trace_log.md b/docs/ru/operations/system-tables/trace_log.md index cc2eb4f9883..c43617ca7cf 100644 --- a/docs/ru/operations/system-tables/trace_log.md +++ b/docs/ru/operations/system-tables/trace_log.md @@ -47,7 +47,7 @@ timestamp_ns: 1599762189872924510 revision: 54440 trace_type: Memory thread_id: 564963 -query_id: +query_id: trace: [371912858,371912789,371798468,371799717,371801313,371790250,624462773,566365041,566440261,566445834,566460071,566459914,566459842,566459580,566459469,566459389,566459341,566455774,371993941,371988245,372158848,372187428,372187309,372187093,372185478,140222123165193,140222122205443] size: 5244400 ``` diff --git a/docs/ru/operations/system-tables/users.md b/docs/ru/operations/system-tables/users.md index 2a523ae4a9a..ba31382cc02 100644 --- a/docs/ru/operations/system-tables/users.md +++ b/docs/ru/operations/system-tables/users.md @@ -7,7 +7,7 @@ - `id` ([UUID](../../sql-reference/data-types/uuid.md)) — ID пользователя. -- `storage` ([String](../../sql-reference/data-types/string.md)) — Путь к хранилищу пользователей. Настраивается в параметре `access_control_path`. +- `storage` ([String](../../sql-reference/data-types/string.md)) — Путь к хранилищу пользователей. Настраивается в параметре `access_control_path`. - `auth_type` ([Enum8](../../sql-reference/data-types/enum.md)('no_password' = 0,'plaintext_password' = 1, 'sha256_password' = 2, 'double_sha1_password' = 3)) — Показывает тип аутентификации. Существует несколько способов идентификации пользователя: без пароля, с помощью обычного текстового пароля, с помощью шифрования [SHA256] (https://ru.wikipedia.org/wiki/SHA-2) или с помощью шифрования [double SHA-1] (https://ru.wikipedia.org/wiki/SHA-1). diff --git a/docs/ru/operations/utilities/clickhouse-benchmark.md b/docs/ru/operations/utilities/clickhouse-benchmark.md index b4769b17818..ee14395332c 100644 --- a/docs/ru/operations/utilities/clickhouse-benchmark.md +++ b/docs/ru/operations/utilities/clickhouse-benchmark.md @@ -40,23 +40,23 @@ clickhouse-benchmark [keys] < queries_file; ## Ключи {#clickhouse-benchmark-keys} -- `--query=QUERY` — исполняемый запрос. Если параметр не передан, `clickhouse-benchmark` будет считывать запросы из стандартного ввода. +- `--query=QUERY` — исполняемый запрос. Если параметр не передан, `clickhouse-benchmark` будет считывать запросы из стандартного ввода. - `-c N`, `--concurrency=N` — количество запросов, которые `clickhouse-benchmark` отправляет одновременно. Значение по умолчанию: 1. - `-d N`, `--delay=N` — интервал в секундах между промежуточными отчетами (чтобы отключить отчеты, установите 0). Значение по умолчанию: 1. -- `-h HOST`, `--host=HOST` — хост сервера. Значение по умолчанию: `localhost`. Для [режима сравнения](#clickhouse-benchmark-comparison-mode) можно использовать несколько `-h` ключей. -- `-p N`, `--port=N` — порт сервера. Значение по умолчанию: 9000. Для [режима сравнения](#clickhouse-benchmark-comparison-mode) можно использовать несколько `-p` ключей. +- `-h HOST`, `--host=HOST` — хост сервера. Значение по умолчанию: `localhost`. Для [режима сравнения](#clickhouse-benchmark-comparison-mode) можно использовать несколько `-h` ключей. +- `-p N`, `--port=N` — порт сервера. Значение по умолчанию: 9000. Для [режима сравнения](#clickhouse-benchmark-comparison-mode) можно использовать несколько `-p` ключей. - `-i N`, `--iterations=N` — общее число запросов. Значение по умолчанию: 0 (вечно будет повторяться). - `-r`, `--randomize` — использовать случайный порядок выполнения запросов при наличии более одного входного запроса. - `-s`, `--secure` — используется `TLS` соединение. - `-t N`, `--timelimit=N` — лимит по времени в секундах. `clickhouse-benchmark` перестает отправлять запросы при достижении лимита по времени. Значение по умолчанию: 0 (лимит отключен). - `--confidence=N` — уровень доверия для T-критерия. Возможные значения: 0 (80%), 1 (90%), 2 (95%), 3 (98%), 4 (99%), 5 (99.5%). Значение по умолчанию: 5. В [режиме сравнения](#clickhouse-benchmark-comparison-mode) `clickhouse-benchmark` проверяет [двухвыборочный t-критерий Стьюдента для независимых выборок](https://en.wikipedia.org/wiki/Student%27s_t-test#Independent_two-sample_t-test) чтобы определить, различны ли две выборки при выбранном уровне доверия. - `--cumulative` — выводить статистику за все время работы, а не за последний временной интервал. -- `--database=DATABASE_NAME` — имя базы данных ClickHouse. Значение по умолчанию: `default`. +- `--database=DATABASE_NAME` — имя базы данных ClickHouse. Значение по умолчанию: `default`. - `--json=FILEPATH` — дополнительный вывод в формате `JSON`. Когда этот ключ указан, `clickhouse-benchmark` выводит отчет в указанный JSON-файл. - `--user=USERNAME` — имя пользователя ClickHouse. Значение по умолчанию: `default`. - `--password=PSWD` — пароль пользователя ClickHouse. Значение по умолчанию: пустая строка. - `--stacktrace` — вывод трассировки стека исключений. Когда этот ключ указан, `clickhouse-bencmark` выводит трассировку стека исключений. -- `--stage=WORD` — стадия обработки запроса на сервере. ClickHouse останавливает обработку запроса и возвращает ответ `clickhouse-benchmark` на заданной стадии. Возможные значения: `complete`, `fetch_columns`, `with_mergeable_state`. Значение по умолчанию: `complete`. +- `--stage=WORD` — стадия обработки запроса на сервере. ClickHouse останавливает обработку запроса и возвращает ответ `clickhouse-benchmark` на заданной стадии. Возможные значения: `complete`, `fetch_columns`, `with_mergeable_state`. Значение по умолчанию: `complete`. - `--help` — показывает справку. Если нужно применить [настройки](../../operations/settings/index.md) для запросов, их можно передать как ключ `--= SETTING_VALUE`. Например, `--max_memory_usage=1048576`. @@ -65,7 +65,7 @@ clickhouse-benchmark [keys] < queries_file; По умолчанию, `clickhouse-benchmark` выводит сообщение для каждого `--delay` интервала. -Пример сообщения: +Пример сообщения: ``` text Queries executed: 10. diff --git a/docs/ru/operations/utilities/clickhouse-copier.md b/docs/ru/operations/utilities/clickhouse-copier.md index aa4fd68f8e8..f1bde2be23d 100644 --- a/docs/ru/operations/utilities/clickhouse-copier.md +++ b/docs/ru/operations/utilities/clickhouse-copier.md @@ -71,7 +71,7 @@ $ clickhouse-copier --daemon --config zookeeper.xml --task-path /task/path --bas source cluster & destination clusters accept exactly the same parameters as parameters for the usual Distributed table see https://clickhouse.tech/docs/ru/engines/table-engines/special/distributed/ - --> + --> false diff --git a/docs/ru/operations/utilities/clickhouse-format.md b/docs/ru/operations/utilities/clickhouse-format.md index 43043fcc1d5..876c741e0ac 100644 --- a/docs/ru/operations/utilities/clickhouse-format.md +++ b/docs/ru/operations/utilities/clickhouse-format.md @@ -18,7 +18,7 @@ toc_title: clickhouse-format - `--seed <строка>` — задает строку, которая определяет результат обфускации. - `--backslash` — добавляет обратный слеш в конце каждой строки отформатированного запроса. Удобно использовать если многострочный запрос скопирован из интернета или другого источника и его нужно выполнить из командной строки. -## Примеры {#examples} +## Примеры {#examples} 1. Подсветка синтаксиса и форматирование в одну строку: @@ -32,12 +32,12 @@ $ clickhouse-format --oneline --hilite <<< "SELECT sum(number) FROM numbers(5);" SELECT sum(number) FROM numbers(5) ``` -2. Несколько запросов в одной строке: +2. Несколько запросов в одной строке: ```bash $ clickhouse-format -n <<< "SELECT * FROM (SELECT 1 AS x UNION ALL SELECT 1 UNION DISTINCT SELECT 3);" ``` - + Результат: ```text @@ -64,13 +64,13 @@ $ clickhouse-format --seed Hello --obfuscate <<< "SELECT cost_first_screen BETWE ```text SELECT treasury_mammoth_hazelnut BETWEEN nutmeg AND span, CASE WHEN chive >= 116 THEN switching ELSE ANYTHING END; ``` - + Тот же запрос с другой инициализацией обфускатора: ```bash $ clickhouse-format --seed World --obfuscate <<< "SELECT cost_first_screen BETWEEN a AND b, CASE WHEN x >= 123 THEN y ELSE NULL END;" ``` - + Результат: ```text @@ -95,4 +95,4 @@ FROM \ UNION DISTINCT \ SELECT 3 \ ) -``` +``` diff --git a/docs/ru/operations/utilities/clickhouse-local.md b/docs/ru/operations/utilities/clickhouse-local.md index 682dc0b5ace..89ec424a9c2 100644 --- a/docs/ru/operations/utilities/clickhouse-local.md +++ b/docs/ru/operations/utilities/clickhouse-local.md @@ -14,7 +14,7 @@ toc_title: clickhouse-local !!! warning "Warning" Мы не рекомендуем подключать серверную конфигурацию к `clickhouse-local`, поскольку данные можно легко повредить неосторожными действиями. -Для временных данных по умолчанию создается специальный каталог. +Для временных данных по умолчанию создается специальный каталог. ## Вызов программы {#usage} @@ -36,7 +36,7 @@ $ clickhouse-local --structure "table_structure" --input-format "format_of_incom - `-of`, `--format`, `--output-format` — формат выходных данных. По умолчанию — `TSV`. - `-d`, `--database` — база данных по умолчанию. Если не указано, используется значение `_local`. - `--stacktrace` — вывод отладочной информации при исключениях. -- `--echo` — перед выполнением запрос выводится в консоль. +- `--echo` — перед выполнением запрос выводится в консоль. - `--verbose` — подробный вывод при выполнении запроса. - `--logger.console` — логирование действий в консоль. - `--logger.log` — логирование действий в файл с указанным именем. diff --git a/docs/ru/operations/utilities/clickhouse-obfuscator.md b/docs/ru/operations/utilities/clickhouse-obfuscator.md index a52d538965b..ff1fdc70288 100644 --- a/docs/ru/operations/utilities/clickhouse-obfuscator.md +++ b/docs/ru/operations/utilities/clickhouse-obfuscator.md @@ -1,43 +1,43 @@ -# Обфускатор ClickHouse - -Простой инструмент для обфускации табличных данных. - -Он считывает данные входной таблицы и создает выходную таблицу, которая сохраняет некоторые свойства входных данных, но при этом содержит другие данные. - -Это позволяет публиковать практически реальные данные и использовать их в тестах на производительность. - -Обфускатор предназначен для сохранения следующих свойств данных: -- кардинальность (количество уникальных данных) для каждого столбца и каждого кортежа столбцов; -- условная кардинальность: количество уникальных данных одного столбца в соответствии со значением другого столбца; -- вероятностные распределения абсолютного значения целых чисел; знак числа типа Int; показатель степени и знак для чисел с плавающей запятой; -- вероятностное распределение длины строк; -- вероятность нулевых значений чисел; пустые строки и массивы, `NULL`; -- степень сжатия данных алгоритмом LZ77 и семейством энтропийных кодеков; - -- непрерывность (величина разницы) значений времени в таблице; непрерывность значений с плавающей запятой; -- дату из значений `DateTime`; - -- кодировка UTF-8 значений строки; -- строковые значения выглядят естественным образом. - - -Большинство перечисленных выше свойств пригодны для тестирования производительности. Чтение данных, фильтрация, агрегирование и сортировка будут работать почти с той же скоростью, что и исходные данные, благодаря сохраненной кардинальности, величине, степени сжатия и т. д. - -Он работает детерминированно. Вы задаёте значение инициализатора, а преобразование полностью определяется входными данными и инициализатором. - -Некоторые преобразования выполняются один к одному, и их можно отменить. Поэтому нужно использовать большое значение инициализатора и хранить его в секрете. - - -Обфускатор использует некоторые криптографические примитивы для преобразования данных, но, с криптографической точки зрения, результат будет небезопасным. В нем могут сохраниться данные, которые не следует публиковать. - - -Он всегда оставляет без изменений числа 0, 1, -1, даты, длины массивов и нулевые флаги. -Например, если у вас есть столбец `IsMobile` в таблице со значениями 0 и 1, то в преобразованных данных он будет иметь то же значение. - -Таким образом, пользователь сможет посчитать точное соотношение мобильного трафика. - -Давайте рассмотрим случай, когда у вас есть какие-то личные данные в таблице (например, электронная почта пользователя), и вы не хотите их публиковать. -Если ваша таблица достаточно большая и содержит несколько разных электронных почтовых адресов, и ни один из них не встречается часто, то обфускатор полностью анонимизирует все данные. Но, если у вас есть небольшое количество разных значений в столбце, он может скопировать некоторые из них. -В этом случае вам следует посмотреть на алгоритм работы инструмента и настроить параметры командной строки. - -Обфускатор полезен в работе со средним объемом данных (не менее 1000 строк). +# Обфускатор ClickHouse + +Простой инструмент для обфускации табличных данных. + +Он считывает данные входной таблицы и создает выходную таблицу, которая сохраняет некоторые свойства входных данных, но при этом содержит другие данные. + +Это позволяет публиковать практически реальные данные и использовать их в тестах на производительность. + +Обфускатор предназначен для сохранения следующих свойств данных: +- кардинальность (количество уникальных данных) для каждого столбца и каждого кортежа столбцов; +- условная кардинальность: количество уникальных данных одного столбца в соответствии со значением другого столбца; +- вероятностные распределения абсолютного значения целых чисел; знак числа типа Int; показатель степени и знак для чисел с плавающей запятой; +- вероятностное распределение длины строк; +- вероятность нулевых значений чисел; пустые строки и массивы, `NULL`; +- степень сжатия данных алгоритмом LZ77 и семейством энтропийных кодеков; + +- непрерывность (величина разницы) значений времени в таблице; непрерывность значений с плавающей запятой; +- дату из значений `DateTime`; + +- кодировка UTF-8 значений строки; +- строковые значения выглядят естественным образом. + + +Большинство перечисленных выше свойств пригодны для тестирования производительности. Чтение данных, фильтрация, агрегирование и сортировка будут работать почти с той же скоростью, что и исходные данные, благодаря сохраненной кардинальности, величине, степени сжатия и т. д. + +Он работает детерминированно. Вы задаёте значение инициализатора, а преобразование полностью определяется входными данными и инициализатором. + +Некоторые преобразования выполняются один к одному, и их можно отменить. Поэтому нужно использовать большое значение инициализатора и хранить его в секрете. + + +Обфускатор использует некоторые криптографические примитивы для преобразования данных, но, с криптографической точки зрения, результат будет небезопасным. В нем могут сохраниться данные, которые не следует публиковать. + + +Он всегда оставляет без изменений числа 0, 1, -1, даты, длины массивов и нулевые флаги. +Например, если у вас есть столбец `IsMobile` в таблице со значениями 0 и 1, то в преобразованных данных он будет иметь то же значение. + +Таким образом, пользователь сможет посчитать точное соотношение мобильного трафика. + +Давайте рассмотрим случай, когда у вас есть какие-то личные данные в таблице (например, электронная почта пользователя), и вы не хотите их публиковать. +Если ваша таблица достаточно большая и содержит несколько разных электронных почтовых адресов, и ни один из них не встречается часто, то обфускатор полностью анонимизирует все данные. Но, если у вас есть небольшое количество разных значений в столбце, он может скопировать некоторые из них. +В этом случае вам следует посмотреть на алгоритм работы инструмента и настроить параметры командной строки. + +Обфускатор полезен в работе со средним объемом данных (не менее 1000 строк). diff --git a/docs/ru/sql-reference/aggregate-functions/parametric-functions.md b/docs/ru/sql-reference/aggregate-functions/parametric-functions.md index 8942bfa3444..b3bb611e28c 100644 --- a/docs/ru/sql-reference/aggregate-functions/parametric-functions.md +++ b/docs/ru/sql-reference/aggregate-functions/parametric-functions.md @@ -172,7 +172,7 @@ SELECT sequenceMatch('(?1)(?2)')(time, number = 1, number = 2, number = 4) FROM ## sequenceCount(pattern)(time, cond1, cond2, …) {#function-sequencecount} -Вычисляет количество цепочек событий, соответствующих шаблону. Функция обнаруживает только непересекающиеся цепочки событий. Она начитает искать следующую цепочку только после того, как полностью совпала текущая цепочка событий. +Вычисляет количество цепочек событий, соответствующих шаблону. Функция обнаруживает только непересекающиеся цепочки событий. Она начинает искать следующую цепочку только после того, как полностью совпала текущая цепочка событий. !!! warning "Предупреждение" События, произошедшие в одну и ту же секунду, располагаются в последовательности в неопределенном порядке, что может повлиять на результат работы функции. @@ -253,7 +253,7 @@ windowFunnel(window, [mode, [mode, ... ]])(timestamp, cond1, cond2, ..., condN) **Параметры** -- `window` — ширина скользящего окна по времени. Это время между первым и последним условием. Единица измерения зависит от `timestamp` и может варьироваться. Должно соблюдаться условие `timestamp события cond1 <= timestamp события cond2 <= ... <= timestamp события condN <= timestamp события cond1 + window`. +- `window` — ширина скользящего окна по времени. Это время между первым и последним условием. Единица измерения зависит от `timestamp` и может варьироваться. Должно соблюдаться условие `timestamp события cond1 <= timestamp события cond2 <= ... <= timestamp события condN <= timestamp события cond1 + window`. - `mode` — необязательный параметр. Может быть установленно несколько значений одновременно. - `'strict'` — не учитывать подряд идущие повторяющиеся события. - `'strict_order'` — запрещает посторонние события в искомой последовательности. Например, при поиске цепочки `A->B->C` в `A->B->D->C` поиск будет остановлен на `D` и функция вернет 2. @@ -519,7 +519,7 @@ sequenceNextNode(direction, base)(timestamp, event_column, base_condition, event - tail — установить начальную точку на последнее событие цепочки. - first_match — установить начальную точку на первое соответствующее событие `event1`. - last_match — установить начальную точку на последнее соответствующее событие `event1`. - + **Аргументы** - `timestamp` — название столбца, содержащего `timestamp`. Поддерживаемые типы данных: [Date](../../sql-reference/data-types/date.md), [DateTime](../../sql-reference/data-types/datetime.md#data_type-datetime) и другие беззнаковые целые типы. @@ -542,11 +542,11 @@ sequenceNextNode(direction, base)(timestamp, event_column, base_condition, event ``` sql CREATE TABLE test_flow ( - dt DateTime, - id int, + dt DateTime, + id int, page String) -ENGINE = MergeTree() -PARTITION BY toYYYYMMDD(dt) +ENGINE = MergeTree() +PARTITION BY toYYYYMMDD(dt) ORDER BY id; INSERT INTO test_flow VALUES (1, 1, 'A') (2, 1, 'B') (3, 1, 'C') (4, 1, 'D') (5, 1, 'E'); @@ -574,21 +574,21 @@ INSERT INTO test_flow VALUES (1, 3, 'Gift') (2, 3, 'Home') (3, 3, 'Gift') (4, 3, ``` sql SELECT id, sequenceNextNode('forward', 'head')(dt, page, page = 'Home', page = 'Home', page = 'Gift') FROM test_flow GROUP BY id; - + dt id page 1970-01-01 09:00:01 1 Home // Исходная точка, совпадение с Home 1970-01-01 09:00:02 1 Gift // Совпадение с Gift - 1970-01-01 09:00:03 1 Exit // Результат + 1970-01-01 09:00:03 1 Exit // Результат 1970-01-01 09:00:01 2 Home // Исходная точка, совпадение с Home 1970-01-01 09:00:02 2 Home // Несовпадение с Gift 1970-01-01 09:00:03 2 Gift - 1970-01-01 09:00:04 2 Basket - + 1970-01-01 09:00:04 2 Basket + 1970-01-01 09:00:01 3 Gift // Исходная точка, несовпадение с Home - 1970-01-01 09:00:02 3 Home - 1970-01-01 09:00:03 3 Gift - 1970-01-01 09:00:04 3 Basket + 1970-01-01 09:00:02 3 Home + 1970-01-01 09:00:03 3 Gift + 1970-01-01 09:00:04 3 Basket ``` **Поведение для `backward` и `tail`** @@ -600,12 +600,12 @@ SELECT id, sequenceNextNode('backward', 'tail')(dt, page, page = 'Basket', page 1970-01-01 09:00:01 1 Home 1970-01-01 09:00:02 1 Gift 1970-01-01 09:00:03 1 Exit // Исходная точка, несовпадение с Basket - -1970-01-01 09:00:01 2 Home + +1970-01-01 09:00:01 2 Home 1970-01-01 09:00:02 2 Home // Результат 1970-01-01 09:00:03 2 Gift // Совпадение с Gift 1970-01-01 09:00:04 2 Basket // Исходная точка, совпадение с Basket - + 1970-01-01 09:00:01 3 Gift 1970-01-01 09:00:02 3 Home // Результат 1970-01-01 09:00:03 3 Gift // Исходная точка, совпадение с Gift @@ -622,16 +622,16 @@ SELECT id, sequenceNextNode('forward', 'first_match')(dt, page, page = 'Gift', p 1970-01-01 09:00:01 1 Home 1970-01-01 09:00:02 1 Gift // Исходная точка 1970-01-01 09:00:03 1 Exit // Результат - -1970-01-01 09:00:01 2 Home -1970-01-01 09:00:02 2 Home + +1970-01-01 09:00:01 2 Home +1970-01-01 09:00:02 2 Home 1970-01-01 09:00:03 2 Gift // Исходная точка 1970-01-01 09:00:04 2 Basket Результат - + 1970-01-01 09:00:01 3 Gift // Исходная точка 1970-01-01 09:00:02 3 Home // Результат -1970-01-01 09:00:03 3 Gift -1970-01-01 09:00:04 3 Basket +1970-01-01 09:00:03 3 Gift +1970-01-01 09:00:04 3 Basket ``` ``` sql @@ -641,16 +641,16 @@ SELECT id, sequenceNextNode('forward', 'first_match')(dt, page, page = 'Gift', p 1970-01-01 09:00:01 1 Home 1970-01-01 09:00:02 1 Gift // Исходная точка 1970-01-01 09:00:03 1 Exit // Несовпадение с Home - -1970-01-01 09:00:01 2 Home -1970-01-01 09:00:02 2 Home + +1970-01-01 09:00:01 2 Home +1970-01-01 09:00:02 2 Home 1970-01-01 09:00:03 2 Gift // Исходная точка 1970-01-01 09:00:04 2 Basket // Несовпадение с Home - + 1970-01-01 09:00:01 3 Gift // Исходная точка 1970-01-01 09:00:02 3 Home // Совпадение с Home 1970-01-01 09:00:03 3 Gift // Результат -1970-01-01 09:00:04 3 Basket +1970-01-01 09:00:04 3 Basket ``` @@ -662,17 +662,17 @@ SELECT id, sequenceNextNode('backward', 'last_match')(dt, page, page = 'Gift', p dt id page 1970-01-01 09:00:01 1 Home // Результат 1970-01-01 09:00:02 1 Gift // Исходная точка -1970-01-01 09:00:03 1 Exit - -1970-01-01 09:00:01 2 Home +1970-01-01 09:00:03 1 Exit + +1970-01-01 09:00:01 2 Home 1970-01-01 09:00:02 2 Home // Результат 1970-01-01 09:00:03 2 Gift // Исходная точка -1970-01-01 09:00:04 2 Basket - -1970-01-01 09:00:01 3 Gift +1970-01-01 09:00:04 2 Basket + +1970-01-01 09:00:01 3 Gift 1970-01-01 09:00:02 3 Home // Результат 1970-01-01 09:00:03 3 Gift // Исходная точка -1970-01-01 09:00:04 3 Basket +1970-01-01 09:00:04 3 Basket ``` ``` sql @@ -681,17 +681,17 @@ SELECT id, sequenceNextNode('backward', 'last_match')(dt, page, page = 'Gift', p dt id page 1970-01-01 09:00:01 1 Home // Совпадение с Home, результат `Null` 1970-01-01 09:00:02 1 Gift // Исходная точка -1970-01-01 09:00:03 1 Exit - +1970-01-01 09:00:03 1 Exit + 1970-01-01 09:00:01 2 Home // Результат 1970-01-01 09:00:02 2 Home // Совпадение с Home 1970-01-01 09:00:03 2 Gift // Исходная точка -1970-01-01 09:00:04 2 Basket - +1970-01-01 09:00:04 2 Basket + 1970-01-01 09:00:01 3 Gift // Результат 1970-01-01 09:00:02 3 Home // Совпадение с Home -1970-01-01 09:00:03 3 Gift // Исходная точка -1970-01-01 09:00:04 3 Basket +1970-01-01 09:00:03 3 Gift // Исходная точка +1970-01-01 09:00:04 3 Basket ``` @@ -715,39 +715,39 @@ INSERT INTO test_flow_basecond VALUES (1, 1, 'A', 'ref4') (2, 1, 'A', 'ref3') (3 ``` sql SELECT id, sequenceNextNode('forward', 'head')(dt, page, ref = 'ref1', page = 'A') FROM test_flow_basecond GROUP BY id; - dt id page ref + dt id page ref 1970-01-01 09:00:01 1 A ref4 // Начало не может быть исходной точкой, поскольку столбец ref не соответствует 'ref1'. - 1970-01-01 09:00:02 1 A ref3 - 1970-01-01 09:00:03 1 B ref2 - 1970-01-01 09:00:04 1 B ref1 + 1970-01-01 09:00:02 1 A ref3 + 1970-01-01 09:00:03 1 B ref2 + 1970-01-01 09:00:04 1 B ref1 ``` ``` sql SELECT id, sequenceNextNode('backward', 'tail')(dt, page, ref = 'ref4', page = 'B') FROM test_flow_basecond GROUP BY id; - dt id page ref + dt id page ref 1970-01-01 09:00:01 1 A ref4 - 1970-01-01 09:00:02 1 A ref3 - 1970-01-01 09:00:03 1 B ref2 + 1970-01-01 09:00:02 1 A ref3 + 1970-01-01 09:00:03 1 B ref2 1970-01-01 09:00:04 1 B ref1 // Конец не может быть исходной точкой, поскольку столбец ref не соответствует 'ref4'. ``` ``` sql SELECT id, sequenceNextNode('forward', 'first_match')(dt, page, ref = 'ref3', page = 'A') FROM test_flow_basecond GROUP BY id; - dt id page ref + dt id page ref 1970-01-01 09:00:01 1 A ref4 // Эта строка не может быть исходной точкой, поскольку столбец ref не соответствует 'ref3'. 1970-01-01 09:00:02 1 A ref3 // Исходная точка 1970-01-01 09:00:03 1 B ref2 // Результат - 1970-01-01 09:00:04 1 B ref1 + 1970-01-01 09:00:04 1 B ref1 ``` ``` sql SELECT id, sequenceNextNode('backward', 'last_match')(dt, page, ref = 'ref2', page = 'B') FROM test_flow_basecond GROUP BY id; - dt id page ref + dt id page ref 1970-01-01 09:00:01 1 A ref4 1970-01-01 09:00:02 1 A ref3 // Результат 1970-01-01 09:00:03 1 B ref2 // Исходная точка - 1970-01-01 09:00:04 1 B ref1 // Эта строка не может быть исходной точкой, поскольку столбец ref не соответствует 'ref2'. + 1970-01-01 09:00:04 1 B ref1 // Эта строка не может быть исходной точкой, поскольку столбец ref не соответствует 'ref2'. ``` diff --git a/docs/ru/sql-reference/aggregate-functions/reference/argmax.md b/docs/ru/sql-reference/aggregate-functions/reference/argmax.md index edad26ee232..71289423035 100644 --- a/docs/ru/sql-reference/aggregate-functions/reference/argmax.md +++ b/docs/ru/sql-reference/aggregate-functions/reference/argmax.md @@ -29,7 +29,7 @@ argMax(tuple(arg, val)) - значение `arg`, соответствующее максимальному значению `val`. -Тип: соответствует типу `arg`. +Тип: соответствует типу `arg`. Если передан кортеж: diff --git a/docs/ru/sql-reference/aggregate-functions/reference/argmin.md b/docs/ru/sql-reference/aggregate-functions/reference/argmin.md index dc54c424fb3..4ee78a73a84 100644 --- a/docs/ru/sql-reference/aggregate-functions/reference/argmin.md +++ b/docs/ru/sql-reference/aggregate-functions/reference/argmin.md @@ -29,7 +29,7 @@ argMin(tuple(arg, val)) - Значение `arg`, соответствующее минимальному значению `val`. -Тип: соответствует типу `arg`. +Тип: соответствует типу `arg`. Если передан кортеж: diff --git a/docs/ru/sql-reference/aggregate-functions/reference/deltasumtimestamp.md b/docs/ru/sql-reference/aggregate-functions/reference/deltasumtimestamp.md index 10294eb9e6d..e0a4516c11c 100644 --- a/docs/ru/sql-reference/aggregate-functions/reference/deltasumtimestamp.md +++ b/docs/ru/sql-reference/aggregate-functions/reference/deltasumtimestamp.md @@ -4,7 +4,7 @@ toc_priority: 141 # deltaSumTimestamp {#agg_functions-deltasumtimestamp} -Суммирует разницу между последовательными строками. Если разница отрицательна — она будет проигнорирована. +Суммирует разницу между последовательными строками. Если разница отрицательна — она будет проигнорирована. Эта функция предназначена в первую очередь для [материализованных представлений](../../../sql-reference/statements/create/view.md#materialized), упорядоченных по некоторому временному бакету согласно timestamp, например, по бакету `toStartOfMinute`. Поскольку строки в таком материализованном представлении будут иметь одинаковый timestamp, невозможно объединить их в "правом" порядке. Функция отслеживает `timestamp` наблюдаемых значений, поэтому возможно правильно упорядочить состояния во время слияния. @@ -32,7 +32,7 @@ deltaSumTimestamp(value, timestamp) Запрос: ```sql -SELECT deltaSumTimestamp(value, timestamp) +SELECT deltaSumTimestamp(value, timestamp) FROM (SELECT number AS timestamp, [0, 4, 8, 3, 0, 0, 0, 1, 3, 5][number] AS value FROM numbers(1, 10)); ``` diff --git a/docs/ru/sql-reference/aggregate-functions/reference/index.md b/docs/ru/sql-reference/aggregate-functions/reference/index.md index 1af07623ade..b2172e1e70e 100644 --- a/docs/ru/sql-reference/aggregate-functions/reference/index.md +++ b/docs/ru/sql-reference/aggregate-functions/reference/index.md @@ -1,67 +1,67 @@ ---- -toc_folder_title: "Справочник" -toc_priority: 36 -toc_hidden: true ---- - -# Перечень агрегатных функций {#aggregate-functions-list} - -Стандартные агрегатные функции: - -- [count](../../../sql-reference/aggregate-functions/reference/count.md) -- [min](../../../sql-reference/aggregate-functions/reference/min.md) -- [max](../../../sql-reference/aggregate-functions/reference/max.md) -- [sum](../../../sql-reference/aggregate-functions/reference/sum.md) -- [avg](../../../sql-reference/aggregate-functions/reference/avg.md) -- [any](../../../sql-reference/aggregate-functions/reference/any.md) -- [stddevPop](../../../sql-reference/aggregate-functions/reference/stddevpop.md) -- [stddevSamp](../../../sql-reference/aggregate-functions/reference/stddevsamp.md) -- [varPop](../../../sql-reference/aggregate-functions/reference/varpop.md) -- [varSamp](../../../sql-reference/aggregate-functions/reference/varsamp.md) -- [covarPop](../../../sql-reference/aggregate-functions/reference/covarpop.md) -- [covarSamp](../../../sql-reference/aggregate-functions/reference/covarsamp.md) - -Агрегатные функции, специфичные для ClickHouse: - -- [anyHeavy](../../../sql-reference/aggregate-functions/reference/anyheavy.md) -- [anyLast](../../../sql-reference/aggregate-functions/reference/anylast.md) -- [argMin](../../../sql-reference/aggregate-functions/reference/argmin.md) -- [argMax](../../../sql-reference/aggregate-functions/reference/argmax.md) -- [avgWeighted](../../../sql-reference/aggregate-functions/reference/avgweighted.md) -- [topK](../../../sql-reference/aggregate-functions/reference/topk.md) -- [topKWeighted](../../../sql-reference/aggregate-functions/reference/topkweighted.md) -- [groupArray](../../../sql-reference/aggregate-functions/reference/grouparray.md) -- [groupUniqArray](../../../sql-reference/aggregate-functions/reference/groupuniqarray.md) -- [groupArrayInsertAt](../../../sql-reference/aggregate-functions/reference/grouparrayinsertat.md) -- [groupArrayMovingAvg](../../../sql-reference/aggregate-functions/reference/grouparraymovingavg.md) -- [groupArrayMovingSum](../../../sql-reference/aggregate-functions/reference/grouparraymovingsum.md) -- [groupBitAnd](../../../sql-reference/aggregate-functions/reference/groupbitand.md) -- [groupBitOr](../../../sql-reference/aggregate-functions/reference/groupbitor.md) -- [groupBitXor](../../../sql-reference/aggregate-functions/reference/groupbitxor.md) -- [groupBitmap](../../../sql-reference/aggregate-functions/reference/groupbitmap.md) -- [sumWithOverflow](../../../sql-reference/aggregate-functions/reference/sumwithoverflow.md) -- [sumMap](../../../sql-reference/aggregate-functions/reference/summap.md) -- [skewSamp](../../../sql-reference/aggregate-functions/reference/skewsamp.md) -- [skewPop](../../../sql-reference/aggregate-functions/reference/skewpop.md) -- [kurtSamp](../../../sql-reference/aggregate-functions/reference/kurtsamp.md) -- [kurtPop](../../../sql-reference/aggregate-functions/reference/kurtpop.md) -- [uniq](../../../sql-reference/aggregate-functions/reference/uniq.md) -- [uniqExact](../../../sql-reference/aggregate-functions/reference/uniqexact.md) -- [uniqCombined](../../../sql-reference/aggregate-functions/reference/uniqcombined.md) -- [uniqCombined64](../../../sql-reference/aggregate-functions/reference/uniqcombined64.md) -- [uniqHLL12](../../../sql-reference/aggregate-functions/reference/uniqhll12.md) -- [quantile](../../../sql-reference/aggregate-functions/reference/quantile.md) -- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md) -- [quantileExact](../../../sql-reference/aggregate-functions/reference/quantileexact.md) -- [quantileExactLow](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexactlow) -- [quantileExactHigh](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexacthigh) -- [quantileExactWeighted](../../../sql-reference/aggregate-functions/reference/quantileexactweighted.md) -- [quantileTiming](../../../sql-reference/aggregate-functions/reference/quantiletiming.md) -- [quantileTimingWeighted](../../../sql-reference/aggregate-functions/reference/quantiletimingweighted.md) -- [quantileDeterministic](../../../sql-reference/aggregate-functions/reference/quantiledeterministic.md) -- [quantileTDigest](../../../sql-reference/aggregate-functions/reference/quantiletdigest.md) -- [quantileTDigestWeighted](../../../sql-reference/aggregate-functions/reference/quantiletdigestweighted.md) -- [simpleLinearRegression](../../../sql-reference/aggregate-functions/reference/simplelinearregression.md) -- [stochasticLinearRegression](../../../sql-reference/aggregate-functions/reference/stochasticlinearregression.md) -- [stochasticLogisticRegression](../../../sql-reference/aggregate-functions/reference/stochasticlogisticregression.md) - +--- +toc_folder_title: "Справочник" +toc_priority: 36 +toc_hidden: true +--- + +# Перечень агрегатных функций {#aggregate-functions-list} + +Стандартные агрегатные функции: + +- [count](../../../sql-reference/aggregate-functions/reference/count.md) +- [min](../../../sql-reference/aggregate-functions/reference/min.md) +- [max](../../../sql-reference/aggregate-functions/reference/max.md) +- [sum](../../../sql-reference/aggregate-functions/reference/sum.md) +- [avg](../../../sql-reference/aggregate-functions/reference/avg.md) +- [any](../../../sql-reference/aggregate-functions/reference/any.md) +- [stddevPop](../../../sql-reference/aggregate-functions/reference/stddevpop.md) +- [stddevSamp](../../../sql-reference/aggregate-functions/reference/stddevsamp.md) +- [varPop](../../../sql-reference/aggregate-functions/reference/varpop.md) +- [varSamp](../../../sql-reference/aggregate-functions/reference/varsamp.md) +- [covarPop](../../../sql-reference/aggregate-functions/reference/covarpop.md) +- [covarSamp](../../../sql-reference/aggregate-functions/reference/covarsamp.md) + +Агрегатные функции, специфичные для ClickHouse: + +- [anyHeavy](../../../sql-reference/aggregate-functions/reference/anyheavy.md) +- [anyLast](../../../sql-reference/aggregate-functions/reference/anylast.md) +- [argMin](../../../sql-reference/aggregate-functions/reference/argmin.md) +- [argMax](../../../sql-reference/aggregate-functions/reference/argmax.md) +- [avgWeighted](../../../sql-reference/aggregate-functions/reference/avgweighted.md) +- [topK](../../../sql-reference/aggregate-functions/reference/topk.md) +- [topKWeighted](../../../sql-reference/aggregate-functions/reference/topkweighted.md) +- [groupArray](../../../sql-reference/aggregate-functions/reference/grouparray.md) +- [groupUniqArray](../../../sql-reference/aggregate-functions/reference/groupuniqarray.md) +- [groupArrayInsertAt](../../../sql-reference/aggregate-functions/reference/grouparrayinsertat.md) +- [groupArrayMovingAvg](../../../sql-reference/aggregate-functions/reference/grouparraymovingavg.md) +- [groupArrayMovingSum](../../../sql-reference/aggregate-functions/reference/grouparraymovingsum.md) +- [groupBitAnd](../../../sql-reference/aggregate-functions/reference/groupbitand.md) +- [groupBitOr](../../../sql-reference/aggregate-functions/reference/groupbitor.md) +- [groupBitXor](../../../sql-reference/aggregate-functions/reference/groupbitxor.md) +- [groupBitmap](../../../sql-reference/aggregate-functions/reference/groupbitmap.md) +- [sumWithOverflow](../../../sql-reference/aggregate-functions/reference/sumwithoverflow.md) +- [sumMap](../../../sql-reference/aggregate-functions/reference/summap.md) +- [skewSamp](../../../sql-reference/aggregate-functions/reference/skewsamp.md) +- [skewPop](../../../sql-reference/aggregate-functions/reference/skewpop.md) +- [kurtSamp](../../../sql-reference/aggregate-functions/reference/kurtsamp.md) +- [kurtPop](../../../sql-reference/aggregate-functions/reference/kurtpop.md) +- [uniq](../../../sql-reference/aggregate-functions/reference/uniq.md) +- [uniqExact](../../../sql-reference/aggregate-functions/reference/uniqexact.md) +- [uniqCombined](../../../sql-reference/aggregate-functions/reference/uniqcombined.md) +- [uniqCombined64](../../../sql-reference/aggregate-functions/reference/uniqcombined64.md) +- [uniqHLL12](../../../sql-reference/aggregate-functions/reference/uniqhll12.md) +- [quantile](../../../sql-reference/aggregate-functions/reference/quantile.md) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md) +- [quantileExact](../../../sql-reference/aggregate-functions/reference/quantileexact.md) +- [quantileExactLow](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexactlow) +- [quantileExactHigh](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexacthigh) +- [quantileExactWeighted](../../../sql-reference/aggregate-functions/reference/quantileexactweighted.md) +- [quantileTiming](../../../sql-reference/aggregate-functions/reference/quantiletiming.md) +- [quantileTimingWeighted](../../../sql-reference/aggregate-functions/reference/quantiletimingweighted.md) +- [quantileDeterministic](../../../sql-reference/aggregate-functions/reference/quantiledeterministic.md) +- [quantileTDigest](../../../sql-reference/aggregate-functions/reference/quantiletdigest.md) +- [quantileTDigestWeighted](../../../sql-reference/aggregate-functions/reference/quantiletdigestweighted.md) +- [simpleLinearRegression](../../../sql-reference/aggregate-functions/reference/simplelinearregression.md) +- [stochasticLinearRegression](../../../sql-reference/aggregate-functions/reference/stochasticlinearregression.md) +- [stochasticLogisticRegression](../../../sql-reference/aggregate-functions/reference/stochasticlogisticregression.md) + diff --git a/docs/ru/sql-reference/aggregate-functions/reference/median.md b/docs/ru/sql-reference/aggregate-functions/reference/median.md index a208c21dd21..0c4b0db12c5 100644 --- a/docs/ru/sql-reference/aggregate-functions/reference/median.md +++ b/docs/ru/sql-reference/aggregate-functions/reference/median.md @@ -1,17 +1,18 @@ # median {#median} -Функции `median*` — алиасы для соответствущих функций `quantile*`. Они вычисляют медиану числовой последовательности. +Функции `median*` — синонимы для соответствущих функций `quantile*`. Они вычисляют медиану числовой последовательности. -Functions: +Функции: -- `median` — алиас [quantile](#quantile). -- `medianDeterministic` — алиас [quantileDeterministic](#quantiledeterministic). -- `medianExact` — алиас [quantileExact](#quantileexact). -- `medianExactWeighted` — алиас [quantileExactWeighted](#quantileexactweighted). -- `medianTiming` — алиас [quantileTiming](#quantiletiming). -- `medianTimingWeighted` — алиас [quantileTimingWeighted](#quantiletimingweighted). -- `medianTDigest` — алиас [quantileTDigest](#quantiletdigest). -- `medianTDigestWeighted` — алиас [quantileTDigestWeighted](#quantiletdigestweighted). +- `median` — синоним для [quantile](../../../sql-reference/aggregate-functions/reference/quantile.md#quantile). +- `medianDeterministic` — синоним для [quantileDeterministic](../../../sql-reference/aggregate-functions/reference/quantiledeterministic.md#quantiledeterministic). +- `medianExact` — синоним для [quantileExact](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexact). +- `medianExactWeighted` — синоним для [quantileExactWeighted](../../../sql-reference/aggregate-functions/reference/quantileexactweighted.md#quantileexactweighted). +- `medianTiming` — синоним для [quantileTiming](../../../sql-reference/aggregate-functions/reference/quantiletiming.md#quantiletiming). +- `medianTimingWeighted` — синоним для [quantileTimingWeighted](../../../sql-reference/aggregate-functions/reference/quantiletimingweighted.md#quantiletimingweighted). +- `medianTDigest` — синоним для [quantileTDigest](../../../sql-reference/aggregate-functions/reference/quantiletdigest.md#quantiletdigest). +- `medianTDigestWeighted` — синоним для [quantileTDigestWeighted](../../../sql-reference/aggregate-functions/reference/quantiletdigestweighted.md#quantiletdigestweighted). +- `medianBFloat16` — синоним для [quantileBFloat16](../../../sql-reference/aggregate-functions/reference/quantilebfloat16.md#quantilebfloat16). **Пример** @@ -29,7 +30,7 @@ Functions: Запрос: ``` sql -SELECT medianDeterministic(val, 1) FROM t +SELECT medianDeterministic(val, 1) FROM t; ``` Результат: @@ -39,4 +40,3 @@ SELECT medianDeterministic(val, 1) FROM t │ 1.5 │ └─────────────────────────────┘ ``` - diff --git a/docs/ru/sql-reference/aggregate-functions/reference/quantilebfloat16.md b/docs/ru/sql-reference/aggregate-functions/reference/quantilebfloat16.md new file mode 100644 index 00000000000..f8622e3fd05 --- /dev/null +++ b/docs/ru/sql-reference/aggregate-functions/reference/quantilebfloat16.md @@ -0,0 +1,64 @@ +--- +toc_priority: 209 +--- + +# quantileBFloat16 {#quantilebfloat16} + +Приближенно вычисляет [квантиль](https://ru.wikipedia.org/wiki/Квантиль) выборки чисел в формате [bfloat16](https://en.wikipedia.org/wiki/Bfloat16_floating-point_format). `bfloat16` — это формат с плавающей точкой, в котором для представления числа используется 1 знаковый бит, 8 бит для порядка и 7 бит для мантиссы. +Функция преобразует входное число в 32-битное с плавающей точкой и обрабатывает его старшие 16 бит. Она вычисляет квантиль в формате `bfloat16` и преобразует его в 64-битное число с плавающей точкой, добавляя нулевые биты. +Эта функция выполняет быстрые приближенные вычисления с относительной ошибкой не более 0.390625%. + +**Синтаксис** + +``` sql +quantileBFloat16[(level)](expr) +``` + +Синоним: `medianBFloat16` + +**Аргументы** + +- `expr` — столбец с числовыми данными. [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md). + +**Параметры** + +- `level` — уровень квантиля. Необязательный параметр. Допустимый диапазон значений от 0 до 1. Значение по умолчанию: 0.5. [Float](../../../sql-reference/data-types/float.md). + +**Возвращаемое значение** + +- Приближенное значение квантиля. + +Тип: [Float64](../../../sql-reference/data-types/float.md#float32-float64). + +**Пример** + +В таблице есть столбцы с целыми числами и с числами с плавающей точкой: + +``` text +┌─a─┬─────b─┐ +│ 1 │ 1.001 │ +│ 2 │ 1.002 │ +│ 3 │ 1.003 │ +│ 4 │ 1.004 │ +└───┴───────┘ +``` + +Запрос для вычисления 0.75-квантиля (верхнего квартиля): + +``` sql +SELECT quantileBFloat16(0.75)(a), quantileBFloat16(0.75)(b) FROM example_table; +``` + +Результат: + +``` text +┌─quantileBFloat16(0.75)(a)─┬─quantileBFloat16(0.75)(b)─┐ +│ 3 │ 1 │ +└───────────────────────────┴───────────────────────────┘ +``` +Обратите внимание, что все числа с плавающей точкой в примере были округлены до 1.0 при преобразовании к `bfloat16`. + +**См. также** + +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/ru/sql-reference/aggregate-functions/reference/quantileexact.md b/docs/ru/sql-reference/aggregate-functions/reference/quantileexact.md index 2f1e879eaa1..bb8bddc7a0e 100644 --- a/docs/ru/sql-reference/aggregate-functions/reference/quantileexact.md +++ b/docs/ru/sql-reference/aggregate-functions/reference/quantileexact.md @@ -1,270 +1,270 @@ ---- -toc_priority: 202 ---- - -# Функции quantileExact {#quantileexact-functions} - -## quantileExact {#quantileexact} - -Точно вычисляет [квантиль](https://ru.wikipedia.org/wiki/Квантиль) числовой последовательности. - -Чтобы получить точный результат, все переданные значения собираются в массив, который затем частично сортируется. Таким образом, функция потребляет объем памяти `O(n)`, где `n` — количество переданных значений. Для небольшого числа значений эта функция эффективна. - -Внутренние состояния функций `quantile*` не объединяются, если они используются в одном запросе. Если вам необходимо вычислить квантили нескольких уровней, используйте функцию [quantiles](#quantiles), это повысит эффективность запроса. - -**Синтаксис** - -``` sql -quantileExact(level)(expr) -``` - -Алиас: `medianExact`. - -**Аргументы** - -- `level` — уровень квантили. Опционально. Константное значение с плавающей запятой от 0 до 1. Мы рекомендуем использовать значение `level` из диапазона `[0.01, 0.99]`. Значение по умолчанию: 0.5. При `level=0.5` функция вычисляет [медиану](https://ru.wikipedia.org/wiki/Медиана_(статистика)). -- `expr` — выражение, зависящее от значений столбцов, возвращающее данные [числовых типов](../../../sql-reference/data-types/index.md#data_types) или типов [Date](../../../sql-reference/data-types/date.md), [DateTime](../../../sql-reference/data-types/datetime.md). - -**Возвращаемое значение** - -- Квантиль заданного уровня. - -Тип: - -- [Float64](../../../sql-reference/data-types/float.md) для входных данных числового типа. -- [Date](../../../sql-reference/data-types/date.md), если входные значения имеют тип `Date`. -- [DateTime](../../../sql-reference/data-types/datetime.md), если входные значения имеют тип `DateTime`. - -**Пример** - -Запрос: - -``` sql -SELECT quantileExact(number) FROM numbers(10) -``` - -Результат: - -``` text -┌─quantileExact(number)─┐ -│ 5 │ -└───────────────────────┘ -``` - -## quantileExactLow {#quantileexactlow} - -Как и `quantileExact`, эта функция вычисляет точный [квантиль](https://en.wikipedia.org/wiki/Quantile) числовой последовательности данных. - -Чтобы получить точное значение, все переданные значения объединяются в массив, который затем полностью сортируется. Сложность [алгоритма сортировки](https://en.cppreference.com/w/cpp/algorithm/sort) равна `O(N·log(N))`, где `N = std::distance(first, last)`. - -Возвращаемое значение зависит от уровня квантили и количества элементов в выборке, то есть если уровень 0,5, то функция возвращает нижнюю медиану при чётном количестве элементов и медиану при нечётном. Медиана вычисляется аналогично реализации [median_low](https://docs.python.org/3/library/statistics.html#statistics.median_low), которая используется в python. - -Для всех остальных уровней возвращается элемент с индексом, соответствующим значению `level * size_of_array`. Например: - -``` sql -SELECT quantileExactLow(0.1)(number) FROM numbers(10) - -┌─quantileExactLow(0.1)(number)─┐ -│ 1 │ -└───────────────────────────────┘ -``` - -При использовании в запросе нескольких функций `quantile*` с разными уровнями, внутренние состояния не объединяются (то есть запрос работает менее эффективно). В этом случае используйте функцию [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles). - -**Синтаксис** - -``` sql -quantileExact(level)(expr) -``` - -Алиас: `medianExactLow`. - -**Аргументы** - -- `level` — уровень квантили. Опциональный параметр. Константное занчение с плавающей запятой от 0 до 1. Мы рекомендуем использовать значение `level` из диапазона `[0.01, 0.99]`. Значение по умолчанию: 0.5. При `level=0.5` функция вычисляет [медиану](https://en.wikipedia.org/wiki/Median). -- `expr` — выражение, зависящее от значений столбцов, возвращающее данные [числовых типов](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) или [DateTime](../../../sql-reference/data-types/datetime.md). - -**Возвращаемое значение** - -- Квантиль заданного уровня. - -Тип: - -- [Float64](../../../sql-reference/data-types/float.md) для входных данных числового типа. -- [Date](../../../sql-reference/data-types/date.md) если входные значения имеют тип `Date`. -- [DateTime](../../../sql-reference/data-types/datetime.md) если входные значения имеют тип `DateTime`. - -**Пример** - -Запрос: - -``` sql -SELECT quantileExactLow(number) FROM numbers(10) -``` - -Результат: - -``` text -┌─quantileExactLow(number)─┐ -│ 4 │ -└──────────────────────────┘ -``` -## quantileExactHigh {#quantileexacthigh} - -Как и `quantileExact`, эта функция вычисляет точный [квантиль](https://en.wikipedia.org/wiki/Quantile) числовой последовательности данных. - -Все переданные значения объединяются в массив, который затем сортируется, чтобы получить точное значение. Сложность [алгоритма сортировки](https://en.cppreference.com/w/cpp/algorithm/sort) равна `O(N·log(N))`, где `N = std::distance(first, last)`. - -Возвращаемое значение зависит от уровня квантили и количества элементов в выборке, то есть если уровень 0,5, то функция возвращает верхнюю медиану при чётном количестве элементов и медиану при нечётном. Медиана вычисляется аналогично реализации [median_high](https://docs.python.org/3/library/statistics.html#statistics.median_high), которая используется в python. Для всех остальных уровней возвращается элемент с индексом, соответствующим значению `level * size_of_array`. - -Эта реализация ведет себя точно так же, как `quantileExact`. - -При использовании в запросе нескольких функций `quantile*` с разными уровнями, внутренние состояния не объединяются (то есть запрос работает менее эффективно). В этом случае используйте функцию [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles). - -**Синтаксис** - -``` sql -quantileExactHigh(level)(expr) -``` - -Алиас: `medianExactHigh`. - -**Аргументы** - -- `level` — уровень квантили. Опциональный параметр. Константное занчение с плавающей запятой от 0 до 1. Мы рекомендуем использовать значение `level` из диапазона `[0.01, 0.99]`. Значение по умолчанию: 0.5. При `level=0.5` функция вычисляет [медиану](https://en.wikipedia.org/wiki/Median). -- `expr` — выражение, зависящее от значений столбцов, возвращающее данные [числовых типов](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) или [DateTime](../../../sql-reference/data-types/datetime.md). - -**Возвращаемое значение** - -- Квантиль заданного уровня. - -Тип: - -- [Float64](../../../sql-reference/data-types/float.md) для входных данных числового типа. -- [Date](../../../sql-reference/data-types/date.md) если входные значения имеют тип `Date`. -- [DateTime](../../../sql-reference/data-types/datetime.md) если входные значения имеют тип `DateTime`. - -**Пример** - -Запрос: - -``` sql -SELECT quantileExactHigh(number) FROM numbers(10) -``` - -Результат: - -``` text -┌─quantileExactHigh(number)─┐ -│ 5 │ -└───────────────────────────┘ -``` - -## quantileExactExclusive {#quantileexactexclusive} - -Точно вычисляет [квантиль](https://ru.wikipedia.org/wiki/Квантиль) числовой последовательности. - -Чтобы получить точный результат, все переданные значения собираются в массив, который затем частично сортируется. Таким образом, функция потребляет объем памяти `O(n)`, где `n` — количество переданных значений. Для небольшого числа значений эта функция эффективна. - -Эта функция эквивалентна Excel функции [PERCENTILE.EXC](https://support.microsoft.com/en-us/office/percentile-exc-function-bbaa7204-e9e1-4010-85bf-c31dc5dce4ba), [тип R6](https://en.wikipedia.org/wiki/Quantile#Estimating_quantiles_from_a_sample). - -Если в одном запросе вызывается несколько функций `quantileExactExclusive` с разными значениями `level`, эти функции вычисляются независимо друг от друга. В таких случаях используйте функцию [quantilesExactExclusive](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantilesexactexclusive), запрос будет выполняться эффективнее. - -**Синтаксис** - -``` sql -quantileExactExclusive(level)(expr) -``` - -**Аргументы** - -- `expr` — выражение, зависящее от значений столбцов. Возвращает данные [числовых типов](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) или [DateTime](../../../sql-reference/data-types/datetime.md). - -**Параметры** - -- `level` — уровень квантиля. Необязательный параметр. Возможные значения: (0, 1) — граничные значения не учитываются. Значение по умолчанию: 0.5. При `level=0.5` функция вычисляет [медиану](https://ru.wikipedia.org/wiki/Медиана_(статистика)). [Float](../../../sql-reference/data-types/float.md). - -**Возвращаемое значение** - -- Квантиль заданного уровня. - -Тип: - -- [Float64](../../../sql-reference/data-types/float.md) для входных данных числового типа. -- [Date](../../../sql-reference/data-types/date.md), если входные значения имеют тип `Date`. -- [DateTime](../../../sql-reference/data-types/datetime.md), если входные значения имеют тип `DateTime`. - -**Пример** - -Запрос: - -``` sql -CREATE TABLE num AS numbers(1000); - -SELECT quantileExactExclusive(0.6)(x) FROM (SELECT number AS x FROM num); -``` - -Результат: - -``` text -┌─quantileExactExclusive(0.6)(x)─┐ -│ 599.6 │ -└────────────────────────────────┘ -``` - -## quantileExactInclusive {#quantileexactinclusive} - -Точно вычисляет [квантиль](https://ru.wikipedia.org/wiki/Квантиль) числовой последовательности. - -Чтобы получить точный результат, все переданные значения собираются в массив, который затем частично сортируется. Таким образом, функция потребляет объем памяти `O(n)`, где `n` — количество переданных значений. Для небольшого числа значений эта функция эффективна. - -Эта функция эквивалентна Excel функции [PERCENTILE.INC](https://support.microsoft.com/en-us/office/percentile-inc-function-680f9539-45eb-410b-9a5e-c1355e5fe2ed), [тип R7](https://en.wikipedia.org/wiki/Quantile#Estimating_quantiles_from_a_sample). - -Если в одном запросе вызывается несколько функций `quantileExactInclusive` с разными значениями `level`, эти функции вычисляются независимо друг от друга. В таких случаях используйте функцию [quantilesExactInclusive](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantilesexactinclusive), запрос будет выполняться эффективнее. - -**Синтаксис** - -``` sql -quantileExactInclusive(level)(expr) -``` - -**Аргументы** - -- `expr` — выражение, зависящее от значений столбцов. Возвращает данные [числовых типов](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) или [DateTime](../../../sql-reference/data-types/datetime.md). - -**Параметры** - -- `level` — уровень квантиля. Необязательный параметр. Возможные значения: [0, 1] — граничные значения учитываются. Значение по умолчанию: 0.5. При `level=0.5` функция вычисляет [медиану](https://ru.wikipedia.org/wiki/Медиана_(статистика)). [Float](../../../sql-reference/data-types/float.md). - -**Возвращаемое значение** - -- Квантиль заданного уровня. - -Тип: - -- [Float64](../../../sql-reference/data-types/float.md) для входных данных числового типа. -- [Date](../../../sql-reference/data-types/date.md), если входные значения имеют тип `Date`. -- [DateTime](../../../sql-reference/data-types/datetime.md), если входные значения имеют тип `DateTime`. - -**Пример** - -Запрос: - -``` sql -CREATE TABLE num AS numbers(1000); - -SELECT quantileExactInclusive(0.6)(x) FROM (SELECT number AS x FROM num); -``` - -Результат: - -``` text -┌─quantileExactInclusive(0.6)(x)─┐ -│ 599.4 │ -└────────────────────────────────┘ -``` - -**Смотрите также** - -- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) -- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) +--- +toc_priority: 202 +--- + +# Функции quantileExact {#quantileexact-functions} + +## quantileExact {#quantileexact} + +Точно вычисляет [квантиль](https://ru.wikipedia.org/wiki/Квантиль) числовой последовательности. + +Чтобы получить точный результат, все переданные значения собираются в массив, который затем частично сортируется. Таким образом, функция потребляет объем памяти `O(n)`, где `n` — количество переданных значений. Для небольшого числа значений эта функция эффективна. + +Внутренние состояния функций `quantile*` не объединяются, если они используются в одном запросе. Если вам необходимо вычислить квантили нескольких уровней, используйте функцию [quantiles](#quantiles), это повысит эффективность запроса. + +**Синтаксис** + +``` sql +quantileExact(level)(expr) +``` + +Алиас: `medianExact`. + +**Аргументы** + +- `level` — уровень квантили. Опционально. Константное значение с плавающей запятой от 0 до 1. Мы рекомендуем использовать значение `level` из диапазона `[0.01, 0.99]`. Значение по умолчанию: 0.5. При `level=0.5` функция вычисляет [медиану](https://ru.wikipedia.org/wiki/Медиана_(статистика)). +- `expr` — выражение, зависящее от значений столбцов, возвращающее данные [числовых типов](../../../sql-reference/data-types/index.md#data_types) или типов [Date](../../../sql-reference/data-types/date.md), [DateTime](../../../sql-reference/data-types/datetime.md). + +**Возвращаемое значение** + +- Квантиль заданного уровня. + +Тип: + +- [Float64](../../../sql-reference/data-types/float.md) для входных данных числового типа. +- [Date](../../../sql-reference/data-types/date.md), если входные значения имеют тип `Date`. +- [DateTime](../../../sql-reference/data-types/datetime.md), если входные значения имеют тип `DateTime`. + +**Пример** + +Запрос: + +``` sql +SELECT quantileExact(number) FROM numbers(10) +``` + +Результат: + +``` text +┌─quantileExact(number)─┐ +│ 5 │ +└───────────────────────┘ +``` + +## quantileExactLow {#quantileexactlow} + +Как и `quantileExact`, эта функция вычисляет точный [квантиль](https://en.wikipedia.org/wiki/Quantile) числовой последовательности данных. + +Чтобы получить точное значение, все переданные значения объединяются в массив, который затем полностью сортируется. Сложность [алгоритма сортировки](https://en.cppreference.com/w/cpp/algorithm/sort) равна `O(N·log(N))`, где `N = std::distance(first, last)`. + +Возвращаемое значение зависит от уровня квантили и количества элементов в выборке, то есть если уровень 0,5, то функция возвращает нижнюю медиану при чётном количестве элементов и медиану при нечётном. Медиана вычисляется аналогично реализации [median_low](https://docs.python.org/3/library/statistics.html#statistics.median_low), которая используется в python. + +Для всех остальных уровней возвращается элемент с индексом, соответствующим значению `level * size_of_array`. Например: + +``` sql +SELECT quantileExactLow(0.1)(number) FROM numbers(10) + +┌─quantileExactLow(0.1)(number)─┐ +│ 1 │ +└───────────────────────────────┘ +``` + +При использовании в запросе нескольких функций `quantile*` с разными уровнями, внутренние состояния не объединяются (то есть запрос работает менее эффективно). В этом случае используйте функцию [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles). + +**Синтаксис** + +``` sql +quantileExact(level)(expr) +``` + +Алиас: `medianExactLow`. + +**Аргументы** + +- `level` — уровень квантили. Опциональный параметр. Константное занчение с плавающей запятой от 0 до 1. Мы рекомендуем использовать значение `level` из диапазона `[0.01, 0.99]`. Значение по умолчанию: 0.5. При `level=0.5` функция вычисляет [медиану](https://en.wikipedia.org/wiki/Median). +- `expr` — выражение, зависящее от значений столбцов, возвращающее данные [числовых типов](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) или [DateTime](../../../sql-reference/data-types/datetime.md). + +**Возвращаемое значение** + +- Квантиль заданного уровня. + +Тип: + +- [Float64](../../../sql-reference/data-types/float.md) для входных данных числового типа. +- [Date](../../../sql-reference/data-types/date.md) если входные значения имеют тип `Date`. +- [DateTime](../../../sql-reference/data-types/datetime.md) если входные значения имеют тип `DateTime`. + +**Пример** + +Запрос: + +``` sql +SELECT quantileExactLow(number) FROM numbers(10) +``` + +Результат: + +``` text +┌─quantileExactLow(number)─┐ +│ 4 │ +└──────────────────────────┘ +``` +## quantileExactHigh {#quantileexacthigh} + +Как и `quantileExact`, эта функция вычисляет точный [квантиль](https://en.wikipedia.org/wiki/Quantile) числовой последовательности данных. + +Все переданные значения объединяются в массив, который затем сортируется, чтобы получить точное значение. Сложность [алгоритма сортировки](https://en.cppreference.com/w/cpp/algorithm/sort) равна `O(N·log(N))`, где `N = std::distance(first, last)`. + +Возвращаемое значение зависит от уровня квантили и количества элементов в выборке, то есть если уровень 0,5, то функция возвращает верхнюю медиану при чётном количестве элементов и медиану при нечётном. Медиана вычисляется аналогично реализации [median_high](https://docs.python.org/3/library/statistics.html#statistics.median_high), которая используется в python. Для всех остальных уровней возвращается элемент с индексом, соответствующим значению `level * size_of_array`. + +Эта реализация ведет себя точно так же, как `quantileExact`. + +При использовании в запросе нескольких функций `quantile*` с разными уровнями, внутренние состояния не объединяются (то есть запрос работает менее эффективно). В этом случае используйте функцию [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles). + +**Синтаксис** + +``` sql +quantileExactHigh(level)(expr) +``` + +Алиас: `medianExactHigh`. + +**Аргументы** + +- `level` — уровень квантили. Опциональный параметр. Константное занчение с плавающей запятой от 0 до 1. Мы рекомендуем использовать значение `level` из диапазона `[0.01, 0.99]`. Значение по умолчанию: 0.5. При `level=0.5` функция вычисляет [медиану](https://en.wikipedia.org/wiki/Median). +- `expr` — выражение, зависящее от значений столбцов, возвращающее данные [числовых типов](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) или [DateTime](../../../sql-reference/data-types/datetime.md). + +**Возвращаемое значение** + +- Квантиль заданного уровня. + +Тип: + +- [Float64](../../../sql-reference/data-types/float.md) для входных данных числового типа. +- [Date](../../../sql-reference/data-types/date.md) если входные значения имеют тип `Date`. +- [DateTime](../../../sql-reference/data-types/datetime.md) если входные значения имеют тип `DateTime`. + +**Пример** + +Запрос: + +``` sql +SELECT quantileExactHigh(number) FROM numbers(10) +``` + +Результат: + +``` text +┌─quantileExactHigh(number)─┐ +│ 5 │ +└───────────────────────────┘ +``` + +## quantileExactExclusive {#quantileexactexclusive} + +Точно вычисляет [квантиль](https://ru.wikipedia.org/wiki/Квантиль) числовой последовательности. + +Чтобы получить точный результат, все переданные значения собираются в массив, который затем частично сортируется. Таким образом, функция потребляет объем памяти `O(n)`, где `n` — количество переданных значений. Для небольшого числа значений эта функция эффективна. + +Эта функция эквивалентна Excel функции [PERCENTILE.EXC](https://support.microsoft.com/en-us/office/percentile-exc-function-bbaa7204-e9e1-4010-85bf-c31dc5dce4ba), [тип R6](https://en.wikipedia.org/wiki/Quantile#Estimating_quantiles_from_a_sample). + +Если в одном запросе вызывается несколько функций `quantileExactExclusive` с разными значениями `level`, эти функции вычисляются независимо друг от друга. В таких случаях используйте функцию [quantilesExactExclusive](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantilesexactexclusive), запрос будет выполняться эффективнее. + +**Синтаксис** + +``` sql +quantileExactExclusive(level)(expr) +``` + +**Аргументы** + +- `expr` — выражение, зависящее от значений столбцов. Возвращает данные [числовых типов](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) или [DateTime](../../../sql-reference/data-types/datetime.md). + +**Параметры** + +- `level` — уровень квантиля. Необязательный параметр. Возможные значения: (0, 1) — граничные значения не учитываются. Значение по умолчанию: 0.5. При `level=0.5` функция вычисляет [медиану](https://ru.wikipedia.org/wiki/Медиана_(статистика)). [Float](../../../sql-reference/data-types/float.md). + +**Возвращаемое значение** + +- Квантиль заданного уровня. + +Тип: + +- [Float64](../../../sql-reference/data-types/float.md) для входных данных числового типа. +- [Date](../../../sql-reference/data-types/date.md), если входные значения имеют тип `Date`. +- [DateTime](../../../sql-reference/data-types/datetime.md), если входные значения имеют тип `DateTime`. + +**Пример** + +Запрос: + +``` sql +CREATE TABLE num AS numbers(1000); + +SELECT quantileExactExclusive(0.6)(x) FROM (SELECT number AS x FROM num); +``` + +Результат: + +``` text +┌─quantileExactExclusive(0.6)(x)─┐ +│ 599.6 │ +└────────────────────────────────┘ +``` + +## quantileExactInclusive {#quantileexactinclusive} + +Точно вычисляет [квантиль](https://ru.wikipedia.org/wiki/Квантиль) числовой последовательности. + +Чтобы получить точный результат, все переданные значения собираются в массив, который затем частично сортируется. Таким образом, функция потребляет объем памяти `O(n)`, где `n` — количество переданных значений. Для небольшого числа значений эта функция эффективна. + +Эта функция эквивалентна Excel функции [PERCENTILE.INC](https://support.microsoft.com/en-us/office/percentile-inc-function-680f9539-45eb-410b-9a5e-c1355e5fe2ed), [тип R7](https://en.wikipedia.org/wiki/Quantile#Estimating_quantiles_from_a_sample). + +Если в одном запросе вызывается несколько функций `quantileExactInclusive` с разными значениями `level`, эти функции вычисляются независимо друг от друга. В таких случаях используйте функцию [quantilesExactInclusive](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantilesexactinclusive), запрос будет выполняться эффективнее. + +**Синтаксис** + +``` sql +quantileExactInclusive(level)(expr) +``` + +**Аргументы** + +- `expr` — выражение, зависящее от значений столбцов. Возвращает данные [числовых типов](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) или [DateTime](../../../sql-reference/data-types/datetime.md). + +**Параметры** + +- `level` — уровень квантиля. Необязательный параметр. Возможные значения: [0, 1] — граничные значения учитываются. Значение по умолчанию: 0.5. При `level=0.5` функция вычисляет [медиану](https://ru.wikipedia.org/wiki/Медиана_(статистика)). [Float](../../../sql-reference/data-types/float.md). + +**Возвращаемое значение** + +- Квантиль заданного уровня. + +Тип: + +- [Float64](../../../sql-reference/data-types/float.md) для входных данных числового типа. +- [Date](../../../sql-reference/data-types/date.md), если входные значения имеют тип `Date`. +- [DateTime](../../../sql-reference/data-types/datetime.md), если входные значения имеют тип `DateTime`. + +**Пример** + +Запрос: + +``` sql +CREATE TABLE num AS numbers(1000); + +SELECT quantileExactInclusive(0.6)(x) FROM (SELECT number AS x FROM num); +``` + +Результат: + +``` text +┌─quantileExactInclusive(0.6)(x)─┐ +│ 599.4 │ +└────────────────────────────────┘ +``` + +**Смотрите также** + +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/ru/sql-reference/aggregate-functions/reference/quantiles.md b/docs/ru/sql-reference/aggregate-functions/reference/quantiles.md index d2e7003e4e7..2417d6de139 100644 --- a/docs/ru/sql-reference/aggregate-functions/reference/quantiles.md +++ b/docs/ru/sql-reference/aggregate-functions/reference/quantiles.md @@ -8,7 +8,7 @@ toc_priority: 201 Синтаксис: `quantiles(level1, level2, …)(x)` -Все функции для вычисления квантилей имеют соответствующие функции для вычисления нескольких квантилей: `quantiles`, `quantilesDeterministic`, `quantilesTiming`, `quantilesTimingWeighted`, `quantilesExact`, `quantilesExactWeighted`, `quantilesTDigest`. Эти функции вычисляют все квантили указанных уровней в один проход и возвращают массив с вычисленными значениями. +Все функции для вычисления квантилей имеют соответствующие функции для вычисления нескольких квантилей: `quantiles`, `quantilesDeterministic`, `quantilesTiming`, `quantilesTimingWeighted`, `quantilesExact`, `quantilesExactWeighted`, `quantilesTDigest`, `quantilesBFloat16`. Эти функции вычисляют все квантили указанных уровней в один проход и возвращают массив с вычисленными значениями. ## quantilesExactExclusive {#quantilesexactexclusive} @@ -18,7 +18,7 @@ toc_priority: 201 Эта функция эквивалентна Excel функции [PERCENTILE.EXC](https://support.microsoft.com/en-us/office/percentile-exc-function-bbaa7204-e9e1-4010-85bf-c31dc5dce4ba), [тип R6](https://en.wikipedia.org/wiki/Quantile#Estimating_quantiles_from_a_sample). -С наборами уровней работает эффективнее, чем [quantilesExactExclusive](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexactexclusive). +С наборами уровней работает эффективнее, чем [quantileExactExclusive](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexactexclusive). **Синтаксис** @@ -70,7 +70,7 @@ SELECT quantilesExactExclusive(0.25, 0.5, 0.75, 0.9, 0.95, 0.99, 0.999)(x) FROM Эта функция эквивалентна Excel функции [PERCENTILE.INC](https://support.microsoft.com/en-us/office/percentile-inc-function-680f9539-45eb-410b-9a5e-c1355e5fe2ed), [тип R7](https://en.wikipedia.org/wiki/Quantile#Estimating_quantiles_from_a_sample). -С наборами уровней работает эффективнее, чем [quantilesExactInclusive](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantilesexactinclusive). +С наборами уровней работает эффективнее, чем [quantileExactInclusive](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexactinclusive). **Синтаксис** diff --git a/docs/ru/sql-reference/aggregate-functions/reference/studentttest.md b/docs/ru/sql-reference/aggregate-functions/reference/studentttest.md index 16daddfbecf..a00a11301ac 100644 --- a/docs/ru/sql-reference/aggregate-functions/reference/studentttest.md +++ b/docs/ru/sql-reference/aggregate-functions/reference/studentttest.md @@ -5,7 +5,7 @@ toc_title: studentTTest # studentTTest {#studentttest} -Вычисляет t-критерий Стьюдента для выборок из двух генеральных совокупностей. +Вычисляет t-критерий Стьюдента для выборок из двух генеральных совокупностей. **Синтаксис** diff --git a/docs/ru/sql-reference/aggregate-functions/reference/sumcount.md b/docs/ru/sql-reference/aggregate-functions/reference/sumcount.md index 0606b06fba0..5a8f93209cf 100644 --- a/docs/ru/sql-reference/aggregate-functions/reference/sumcount.md +++ b/docs/ru/sql-reference/aggregate-functions/reference/sumcount.md @@ -12,7 +12,7 @@ toc_priority: 144 sumCount(x) ``` -**Аргументы** +**Аргументы** - `x` — Входное значение типа [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md), или [Decimal](../../../sql-reference/data-types/decimal.md). diff --git a/docs/ru/sql-reference/aggregate-functions/reference/sumkahan.md b/docs/ru/sql-reference/aggregate-functions/reference/sumkahan.md index cdc713d5726..6e9c76c9371 100644 --- a/docs/ru/sql-reference/aggregate-functions/reference/sumkahan.md +++ b/docs/ru/sql-reference/aggregate-functions/reference/sumkahan.md @@ -5,7 +5,7 @@ toc_priority: 145 # sumKahan {#agg_function-sumKahan} Вычисляет сумму с использованием [компенсационного суммирования по алгоритму Кэхэна](https://ru.wikipedia.org/wiki/Алгоритм_Кэхэна). -Работает медленнее функции [sum](./sum.md). +Работает медленнее функции [sum](./sum.md). Компенсация работает только для [Float](../../../sql-reference/data-types/float.md) типов. **Синтаксис** diff --git a/docs/ru/sql-reference/aggregate-functions/reference/topkweighted.md b/docs/ru/sql-reference/aggregate-functions/reference/topkweighted.md index d0fd3856b24..3c2c4ea0cba 100644 --- a/docs/ru/sql-reference/aggregate-functions/reference/topkweighted.md +++ b/docs/ru/sql-reference/aggregate-functions/reference/topkweighted.md @@ -4,7 +4,7 @@ toc_priority: 109 # topKWeighted {#topkweighted} -Возвращает массив наиболее часто встречающихся значений в указанном столбце. Результирующий массив упорядочен по убыванию частоты значения (не по самим значениям). Дополнительно учитывается вес значения. +Возвращает массив наиболее часто встречающихся значений в указанном столбце. Результирующий массив упорядочен по убыванию частоты значения (не по самим значениям). Дополнительно учитывается вес значения. **Синтаксис** diff --git a/docs/ru/sql-reference/aggregate-functions/reference/welchttest.md b/docs/ru/sql-reference/aggregate-functions/reference/welchttest.md index 594a609d89e..40588002917 100644 --- a/docs/ru/sql-reference/aggregate-functions/reference/welchttest.md +++ b/docs/ru/sql-reference/aggregate-functions/reference/welchttest.md @@ -5,7 +5,7 @@ toc_title: welchTTest # welchTTest {#welchttest} -Вычисляет t-критерий Уэлча для выборок из двух генеральных совокупностей. +Вычисляет t-критерий Уэлча для выборок из двух генеральных совокупностей. **Синтаксис** diff --git a/docs/ru/sql-reference/data-types/geo.md b/docs/ru/sql-reference/data-types/geo.md index 23b47f38d05..1b2e18d36c8 100644 --- a/docs/ru/sql-reference/data-types/geo.md +++ b/docs/ru/sql-reference/data-types/geo.md @@ -28,7 +28,7 @@ CREATE TABLE geo_point (p Point) ENGINE = Memory(); INSERT INTO geo_point VALUES((10, 10)); SELECT p, toTypeName(p) FROM geo_point; ``` -Результат: +Результат: ``` text ┌─p─────┬─toTypeName(p)─┐ @@ -50,7 +50,7 @@ CREATE TABLE geo_ring (r Ring) ENGINE = Memory(); INSERT INTO geo_ring VALUES([(0, 0), (10, 0), (10, 10), (0, 10)]); SELECT r, toTypeName(r) FROM geo_ring; ``` -Результат: +Результат: ``` text ┌─r─────────────────────────────┬─toTypeName(r)─┐ @@ -73,7 +73,7 @@ INSERT INTO geo_polygon VALUES([[(20, 20), (50, 20), (50, 50), (20, 50)], [(30, SELECT pg, toTypeName(pg) FROM geo_polygon; ``` -Результат: +Результат: ``` text ┌─pg────────────────────────────────────────────────────────────┬─toTypeName(pg)─┐ @@ -83,7 +83,7 @@ SELECT pg, toTypeName(pg) FROM geo_polygon; ## MultiPolygon {#multipolygon-data-type} -Тип `MultiPolygon` описывает элемент, состоящий из нескольких простых многоугольников (полигональную сетку). Он хранится в виде массива многоугольников: [Array](array.md)([Polygon](#polygon-data-type)). +Тип `MultiPolygon` описывает элемент, состоящий из нескольких простых многоугольников (полигональную сетку). Он хранится в виде массива многоугольников: [Array](array.md)([Polygon](#polygon-data-type)). **Пример** @@ -95,7 +95,7 @@ CREATE TABLE geo_multipolygon (mpg MultiPolygon) ENGINE = Memory(); INSERT INTO geo_multipolygon VALUES([[[(0, 0), (10, 0), (10, 10), (0, 10)]], [[(20, 20), (50, 20), (50, 50), (20, 50)],[(30, 30), (50, 50), (50, 30)]]]); SELECT mpg, toTypeName(mpg) FROM geo_multipolygon; ``` -Result: +Result: ``` text ┌─mpg─────────────────────────────────────────────────────────────────────────────────────────────┬─toTypeName(mpg)─┐ diff --git a/docs/ru/sql-reference/data-types/lowcardinality.md b/docs/ru/sql-reference/data-types/lowcardinality.md index fe9118b1e14..49ba5db0169 100644 --- a/docs/ru/sql-reference/data-types/lowcardinality.md +++ b/docs/ru/sql-reference/data-types/lowcardinality.md @@ -15,7 +15,7 @@ LowCardinality(data_type) **Параметры** -- `data_type` — [String](string.md), [FixedString](fixedstring.md), [Date](date.md), [DateTime](datetime.md) и числа за исключением типа [Decimal](decimal.md). `LowCardinality` неэффективен для некоторых типов данных, см. описание настройки [allow_suspicious_low_cardinality_types](../../operations/settings/settings.md#allow_suspicious_low_cardinality_types). +- `data_type` — [String](string.md), [FixedString](fixedstring.md), [Date](date.md), [DateTime](datetime.md) и числа за исключением типа [Decimal](decimal.md). `LowCardinality` неэффективен для некоторых типов данных, см. описание настройки [allow_suspicious_low_cardinality_types](../../operations/settings/settings.md#allow_suspicious_low_cardinality_types). ## Описание {#lowcardinality-dscr} @@ -23,16 +23,16 @@ LowCardinality(data_type) Эффективность использования типа данных `LowCarditality` зависит от разнообразия данных. Если словарь содержит менее 10 000 различных значений, ClickHouse в основном показывает более высокую эффективность чтения и хранения данных. Если же словарь содержит более 100 000 различных значений, ClickHouse может работать хуже, чем при использовании обычных типов данных. -При работе со строками, использование `LowCardinality` вместо [Enum](enum.md) обеспечивает большую гибкость в использовании и часто показывает такую же или более высокую эффективность. +При работе со строками использование `LowCardinality` вместо [Enum](enum.md) обеспечивает большую гибкость в использовании и часто показывает такую же или более высокую эффективность. ## Пример -Создать таблицу со столбцами типа `LowCardinality`: +Создание таблицы со столбцами типа `LowCardinality`: ```sql CREATE TABLE lc_t ( - `id` UInt16, + `id` UInt16, `strings` LowCardinality(String) ) ENGINE = MergeTree() @@ -43,18 +43,18 @@ ORDER BY id Настройки: -- [low_cardinality_max_dictionary_size](../../operations/settings/settings.md#low_cardinality_max_dictionary_size) -- [low_cardinality_use_single_dictionary_for_part](../../operations/settings/settings.md#low_cardinality_use_single_dictionary_for_part) -- [low_cardinality_allow_in_native_format](../../operations/settings/settings.md#low_cardinality_allow_in_native_format) -- [allow_suspicious_low_cardinality_types](../../operations/settings/settings.md#allow_suspicious_low_cardinality_types) +- [low_cardinality_max_dictionary_size](../../operations/settings/settings.md#low_cardinality_max_dictionary_size) +- [low_cardinality_use_single_dictionary_for_part](../../operations/settings/settings.md#low_cardinality_use_single_dictionary_for_part) +- [low_cardinality_allow_in_native_format](../../operations/settings/settings.md#low_cardinality_allow_in_native_format) +- [allow_suspicious_low_cardinality_types](../../operations/settings/settings.md#allow_suspicious_low_cardinality_types) +- [output_format_arrow_low_cardinality_as_dictionary](../../operations/settings/settings.md#output-format-arrow-low-cardinality-as-dictionary) Функции: -- [toLowCardinality](../functions/type-conversion-functions.md#tolowcardinality) +- [toLowCardinality](../functions/type-conversion-functions.md#tolowcardinality) ## Смотрите также -- [A Magical Mystery Tour of the LowCardinality Data Type](https://www.altinity.com/blog/2019/3/27/low-cardinality). -- [Reducing Clickhouse Storage Cost with the Low Cardinality Type – Lessons from an Instana Engineer](https://www.instana.com/blog/reducing-clickhouse-storage-cost-with-the-low-cardinality-type-lessons-from-an-instana-engineer/). -- [String Optimization (video presentation in Russian)](https://youtu.be/rqf-ILRgBdY?list=PL0Z2YDlm0b3iwXCpEFiOOYmwXzVmjJfEt). [Slides in English](https://github.com/yandex/clickhouse-presentations/raw/master/meetup19/string_optimization.pdf). - +- [A Magical Mystery Tour of the LowCardinality Data Type](https://www.altinity.com/blog/2019/3/27/low-cardinality). +- [Reducing Clickhouse Storage Cost with the Low Cardinality Type – Lessons from an Instana Engineer](https://www.instana.com/blog/reducing-clickhouse-storage-cost-with-the-low-cardinality-type-lessons-from-an-instana-engineer/). +- [String Optimization (video presentation in Russian)](https://youtu.be/rqf-ILRgBdY?list=PL0Z2YDlm0b3iwXCpEFiOOYmwXzVmjJfEt). [Slides in English](https://github.com/yandex/clickhouse-presentations/raw/master/meetup19/string_optimization.pdf). diff --git a/docs/ru/sql-reference/data-types/map.md b/docs/ru/sql-reference/data-types/map.md index a703eb1b0ac..32eb4a80b3e 100644 --- a/docs/ru/sql-reference/data-types/map.md +++ b/docs/ru/sql-reference/data-types/map.md @@ -5,15 +5,12 @@ toc_title: Map(key, value) # Map(key, value) {#data_type-map} -Тип данных `Map(key, value)` хранит пары `ключ:значение`. +Тип данных `Map(key, value)` хранит пары `ключ:значение`. -**Параметры** +**Параметры** -- `key` — ключ. [String](../../sql-reference/data-types/string.md) или [Integer](../../sql-reference/data-types/int-uint.md). -- `value` — значение. [String](../../sql-reference/data-types/string.md), [Integer](../../sql-reference/data-types/int-uint.md) или [Array](../../sql-reference/data-types/array.md). - -!!! warning "Предупреждение" - Сейчас использование типа данных `Map` является экспериментальной возможностью. Чтобы использовать этот тип данных, включите настройку `allow_experimental_map_type = 1`. +- `key` — ключ. [String](../../sql-reference/data-types/string.md), [Integer](../../sql-reference/data-types/int-uint.md), [LowCardinality](../../sql-reference/data-types/lowcardinality.md) или [FixedString](../../sql-reference/data-types/fixedstring.md). +- `value` — значение. [String](../../sql-reference/data-types/string.md), [Integer](../../sql-reference/data-types/int-uint.md), [Array](../../sql-reference/data-types/array.md), [LowCardinality](../../sql-reference/data-types/lowcardinality.md) или [FixedString](../../sql-reference/data-types/fixedstring.md). Чтобы получить значение из колонки `a Map('key', 'value')`, используйте синтаксис `a['key']`. В настоящее время такая подстановка работает по алгоритму с линейной сложностью. @@ -26,7 +23,7 @@ CREATE TABLE table_map (a Map(String, UInt64)) ENGINE=Memory; INSERT INTO table_map VALUES ({'key1':1, 'key2':10}), ({'key1':2,'key2':20}), ({'key1':3,'key2':30}); ``` -Выборка всех значений ключа `key2`: +Выборка всех значений ключа `key2`: ```sql SELECT a['key2'] FROM table_map; @@ -41,7 +38,7 @@ SELECT a['key2'] FROM table_map; └─────────────────────────┘ ``` -Если для какого-то ключа `key` в колонке с типом `Map()` нет значения, запрос возвращает нули для числовых колонок, пустые строки или пустые массивы. +Если для какого-то ключа `key` в колонке с типом `Map()` нет значения, запрос возвращает нули для числовых колонок, пустые строки или пустые массивы. ```sql INSERT INTO table_map VALUES ({'key3':100}), ({}); diff --git a/docs/ru/sql-reference/data-types/nullable.md b/docs/ru/sql-reference/data-types/nullable.md index 84a5d6a796c..ef5e486c128 100644 --- a/docs/ru/sql-reference/data-types/nullable.md +++ b/docs/ru/sql-reference/data-types/nullable.md @@ -33,7 +33,7 @@ toc_title: Nullable **Пример** -Запрос: +Запрос: ``` sql CREATE TABLE nullable (`n` Nullable(UInt32)) ENGINE = MergeTree ORDER BY tuple(); diff --git a/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-lifetime.md b/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-lifetime.md index ea1b62c6cef..c0c2b6ee43d 100644 --- a/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-lifetime.md +++ b/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-lifetime.md @@ -86,7 +86,7 @@ SOURCE(ODBC(... invalidate_query 'SELECT update_time FROM dictionary_source wher ... ``` -Для словарей `Cache`, `ComplexKeyCache`, `SSDCache` и `SSDComplexKeyCache` поддерживается как синхронное, так и асинхронное обновление. +Для словарей `Cache`, `ComplexKeyCache`, `SSDCache` и `SSDComplexKeyCache` поддерживается как синхронное, так и асинхронное обновление. Словари `Flat`, `Hashed` и `ComplexKeyHashed` могут запрашивать только те данные, которые были изменены после предыдущего обновления. Если `update_field` указано как часть конфигурации источника словаря, к запросу данных будет добавлено время предыдущего обновления в секундах. В зависимости от типа источника (Executable, HTTP, MySQL, PostgreSQL, ClickHouse, ODBC) к `update_field` будет применена соответствующая логика перед запросом данных из внешнего источника. diff --git a/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-sources.md b/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-sources.md index 58406e8ae14..d616960ce36 100644 --- a/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-sources.md +++ b/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-sources.md @@ -129,7 +129,7 @@ SOURCE(FILE(path './user_files/os.tsv' format 'TabSeparated')) ## Исполняемый пул {#dicts-external_dicts_dict_sources-executable_pool} -Исполняемый пул позволяет загружать данные из пула процессов. Этот источник не работает со словарями, которые требуют загрузки всех данных из источника. Исполняемый пул работает словарями, которые размещаются [следующими способами](external-dicts-dict-layout.md#ways-to-store-dictionaries-in-memory): `cache`, `complex_key_cache`, `ssd_cache`, `complex_key_ssd_cache`, `direct`, `complex_key_direct`. +Исполняемый пул позволяет загружать данные из пула процессов. Этот источник не работает со словарями, которые требуют загрузки всех данных из источника. Исполняемый пул работает словарями, которые размещаются [следующими способами](external-dicts-dict-layout.md#ways-to-store-dictionaries-in-memory): `cache`, `complex_key_cache`, `ssd_cache`, `complex_key_ssd_cache`, `direct`, `complex_key_direct`. Исполняемый пул генерирует пул процессов с помощью указанной команды и оставляет их активными, пока они не завершатся. Программа считывает данные из потока STDIN пока он доступен и выводит результат в поток STDOUT, а затем ожидает следующего блока данных из STDIN. ClickHouse не закрывает поток STDIN после обработки блока данных и отправляет в него следующую порцию данных, когда это требуется. Исполняемый скрипт должен быть готов к такому способу обработки данных — он должен заранее опрашивать STDIN и отправлять данные в STDOUT. @@ -581,6 +581,7 @@ SOURCE(MYSQL( default ids
id=10 + 1 ``` @@ -596,7 +597,8 @@ SOURCE(CLICKHOUSE( db 'default' table 'ids' where 'id=10' -)) + secure 1 +)); ``` Поля настройки: @@ -609,6 +611,7 @@ SOURCE(CLICKHOUSE( - `table` — имя таблицы. - `where` — условие выбора. Может отсутствовать. - `invalidate_query` — запрос для проверки статуса словаря. Необязательный параметр. Читайте подробнее в разделе [Обновление словарей](external-dicts-dict-lifetime.md). +- `secure` - флаг, разрешающий или не разрешающий защищённое SSL-соединение. ### MongoDB {#dicts-external_dicts_dict_sources-mongodb} @@ -769,4 +772,3 @@ Setting fields: - `table` – Имя таблицы. - `where` – Условие выборки. Синтаксис для условий такой же как для `WHERE` выражения в PostgreSQL, для примера, `id > 10 AND id < 20`. Необязательный параметр. - `invalidate_query` – Запрос для проверки условия загрузки словаря. Необязательный параметр. Читайте больше в разделе [Обновление словарей](../../../sql-reference/dictionaries/external-dictionaries/external-dicts-dict-lifetime.md). - diff --git a/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-structure.md b/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-structure.md index 2feb088b4d9..197fde71279 100644 --- a/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-structure.md +++ b/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-structure.md @@ -159,7 +159,7 @@ CREATE DICTIONARY somename ( | Тег | Описание | Обязательный | |------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------| | `name` | Имя столбца. | Да | -| `type` | Тип данных ClickHouse: [UInt8](../../../sql-reference/data-types/int-uint.md), [UInt16](../../../sql-reference/data-types/int-uint.md), [UInt32](../../../sql-reference/data-types/int-uint.md), [UInt64](../../../sql-reference/data-types/int-uint.md), [Int8](../../../sql-reference/data-types/int-uint.md), [Int16](../../../sql-reference/data-types/int-uint.md), [Int32](../../../sql-reference/data-types/int-uint.md), [Int64](../../../sql-reference/data-types/int-uint.md), [Float32](../../../sql-reference/data-types/float.md), [Float64](../../../sql-reference/data-types/float.md), [UUID](../../../sql-reference/data-types/uuid.md), [Decimal32](../../../sql-reference/data-types/decimal.md), [Decimal64](../../../sql-reference/data-types/decimal.md), [Decimal128](../../../sql-reference/data-types/decimal.md), [Decimal256](../../../sql-reference/data-types/decimal.md), [String](../../../sql-reference/data-types/string.md).
ClickHouse пытается привести значение из словаря к заданному типу данных. Например, в случае MySQL, в таблице-источнике поле может быть `TEXT`, `VARCHAR`, `BLOB`, но загружено может быть как `String`.
[Nullable](../../../sql-reference/data-types/nullable.md) в настоящее время поддерживается для словарей [Flat](external-dicts-dict-layout.md#flat), [Hashed](external-dicts-dict-layout.md#dicts-external_dicts_dict_layout-hashed), [ComplexKeyHashed](external-dicts-dict-layout.md#complex-key-hashed), [Direct](external-dicts-dict-layout.md#direct), [ComplexKeyDirect](external-dicts-dict-layout.md#complex-key-direct), [RangeHashed](external-dicts-dict-layout.md#range-hashed), [Polygon](external-dicts-dict-polygon.md), [Cache](external-dicts-dict-layout.md#cache), [ComplexKeyCache](external-dicts-dict-layout.md#complex-key-cache), [SSDCache](external-dicts-dict-layout.md#ssd-cache), [SSDComplexKeyCache](external-dicts-dict-layout.md#complex-key-ssd-cache). Для словарей [IPTrie](external-dicts-dict-layout.md#ip-trie) `Nullable`-типы не поддерживаются. | Да | +| `type` | Тип данных ClickHouse: [UInt8](../../../sql-reference/data-types/int-uint.md), [UInt16](../../../sql-reference/data-types/int-uint.md), [UInt32](../../../sql-reference/data-types/int-uint.md), [UInt64](../../../sql-reference/data-types/int-uint.md), [Int8](../../../sql-reference/data-types/int-uint.md), [Int16](../../../sql-reference/data-types/int-uint.md), [Int32](../../../sql-reference/data-types/int-uint.md), [Int64](../../../sql-reference/data-types/int-uint.md), [Float32](../../../sql-reference/data-types/float.md), [Float64](../../../sql-reference/data-types/float.md), [UUID](../../../sql-reference/data-types/uuid.md), [Decimal32](../../../sql-reference/data-types/decimal.md), [Decimal64](../../../sql-reference/data-types/decimal.md), [Decimal128](../../../sql-reference/data-types/decimal.md), [Decimal256](../../../sql-reference/data-types/decimal.md), [String](../../../sql-reference/data-types/string.md), [Array](../../../sql-reference/data-types/array.md).
ClickHouse пытается привести значение из словаря к заданному типу данных. Например, в случае MySQL, в таблице-источнике поле может быть `TEXT`, `VARCHAR`, `BLOB`, но загружено может быть как `String`.
[Nullable](../../../sql-reference/data-types/nullable.md) в настоящее время поддерживается для словарей [Flat](external-dicts-dict-layout.md#flat), [Hashed](external-dicts-dict-layout.md#dicts-external_dicts_dict_layout-hashed), [ComplexKeyHashed](external-dicts-dict-layout.md#complex-key-hashed), [Direct](external-dicts-dict-layout.md#direct), [ComplexKeyDirect](external-dicts-dict-layout.md#complex-key-direct), [RangeHashed](external-dicts-dict-layout.md#range-hashed), [Polygon](external-dicts-dict-polygon.md), [Cache](external-dicts-dict-layout.md#cache), [ComplexKeyCache](external-dicts-dict-layout.md#complex-key-cache), [SSDCache](external-dicts-dict-layout.md#ssd-cache), [SSDComplexKeyCache](external-dicts-dict-layout.md#complex-key-ssd-cache). Для словарей [IPTrie](external-dicts-dict-layout.md#ip-trie) `Nullable`-типы не поддерживаются. | Да | | `null_value` | Значение по умолчанию для несуществующего элемента.
В примере это пустая строка. Значение [NULL](../../syntax.md#null-literal) можно указывать только для типов `Nullable` (см. предыдущую строку с описанием типов). | Да | | `expression` | [Выражение](../../syntax.md#syntax-expressions), которое ClickHouse выполняет со значением.
Выражением может быть имя столбца в удаленной SQL базе. Таким образом, вы можете использовать его для создания псевдонима удаленного столбца.

Значение по умолчанию: нет выражения. | Нет | | `hierarchical` | Если `true`, то атрибут содержит ключ предка для текущего элемента. Смотрите [Иерархические словари](external-dicts-dict-hierarchical.md).

Значение по умолчанию: `false`. | Нет | diff --git a/docs/ru/sql-reference/functions/array-functions.md b/docs/ru/sql-reference/functions/array-functions.md index 67c4f6c0136..6586dd663c7 100644 --- a/docs/ru/sql-reference/functions/array-functions.md +++ b/docs/ru/sql-reference/functions/array-functions.md @@ -7,19 +7,89 @@ toc_title: "Массивы" ## empty {#function-empty} -Возвращает 1 для пустого массива, и 0 для непустого массива. -Тип результата - UInt8. -Функция также работает для строк. +Проверяет, является ли входной массив пустым. -Функцию можно оптимизировать, если включить настройку [optimize_functions_to_subcolumns](../../operations/settings/settings.md#optimize-functions-to-subcolumns). При `optimize_functions_to_subcolumns = 1` функция читает только подстолбец [size0](../../sql-reference/data-types/array.md#array-size) вместо чтения и обработки всего столбца массива. Запрос `SELECT empty(arr) FROM table` преобразуется к запросу `SELECT arr.size0 = 0 FROM TABLE`. +**Синтаксис** + +``` sql +empty([x]) +``` + +Массив считается пустым, если он не содержит ни одного элемента. + +!!! note "Примечание" + Функцию можно оптимизировать, если включить настройку [optimize_functions_to_subcolumns](../../operations/settings/settings.md#optimize-functions-to-subcolumns). При `optimize_functions_to_subcolumns = 1` функция читает только подстолбец [size0](../../sql-reference/data-types/array.md#array-size) вместо чтения и обработки всего столбца массива. Запрос `SELECT empty(arr) FROM TABLE` преобразуется к запросу `SELECT arr.size0 = 0 FROM TABLE`. + +Функция также поддерживает работу с типами [String](string-functions.md#empty) и [UUID](uuid-functions.md#empty). + +**Параметры** + +- `[x]` — массив на входе функции. [Array](../data-types/array.md). + +**Возвращаемое значение** + +- Возвращает `1` для пустого массива или `0` — для непустого массива. + +Тип: [UInt8](../data-types/int-uint.md). + +**Пример** + +Запрос: + +```sql +SELECT empty([]); +``` + +Ответ: + +```text +┌─empty(array())─┐ +│ 1 │ +└────────────────┘ +``` ## notEmpty {#function-notempty} -Возвращает 0 для пустого массива, и 1 для непустого массива. -Тип результата - UInt8. -Функция также работает для строк. +Проверяет, является ли входной массив непустым. -Функцию можно оптимизировать, если включить настройку [optimize_functions_to_subcolumns](../../operations/settings/settings.md#optimize-functions-to-subcolumns). При `optimize_functions_to_subcolumns = 1` функция читает только подстолбец [size0](../../sql-reference/data-types/array.md#array-size) вместо чтения и обработки всего столбца массива. Запрос `SELECT notEmpty(arr) FROM table` преобразуется к запросу `SELECT arr.size0 != 0 FROM TABLE`. +**Синтаксис** + +``` sql +notEmpty([x]) +``` + +Массив считается непустым, если он содержит хотя бы один элемент. + +!!! note "Примечание" + Функцию можно оптимизировать, если включить настройку [optimize_functions_to_subcolumns](../../operations/settings/settings.md#optimize-functions-to-subcolumns). При `optimize_functions_to_subcolumns = 1` функция читает только подстолбец [size0](../../sql-reference/data-types/array.md#array-size) вместо чтения и обработки всего столбца массива. Запрос `SELECT notEmpty(arr) FROM table` преобразуется к запросу `SELECT arr.size0 != 0 FROM TABLE`. + +Функция также поддерживает работу с типами [String](string-functions.md#notempty) и [UUID](uuid-functions.md#notempty). + +**Параметры** + +- `[x]` — массив на входе функции. [Array](../data-types/array.md). + +**Возвращаемое значение** + +- Возвращает `1` для непустого массива или `0` — для пустого массива. + +Тип: [UInt8](../data-types/int-uint.md). + +**Пример** + +Запрос: + +```sql +SELECT notEmpty([1,2]); +``` + +Результат: + +```text +┌─notEmpty([1, 2])─┐ +│ 1 │ +└──────────────────┘ +``` ## length {#array_functions-length} @@ -62,18 +132,15 @@ range([start, ] end [, step]) - `end` — конец диапазона. Обязательный аргумент. Должен быть больше, чем `start`. Тип: [UInt](../data-types/int-uint.md) - `step` — шаг обхода. Необязательный аргумент. По умолчанию равен `1`. Тип: [UInt](../data-types/int-uint.md) - **Возвращаемые значения** - массив `UInt` чисел от `start` до `end - 1` с шагом `step` - **Особенности реализации** - Не поддерживаются отрицательные значения аргументов: `start`, `end`, `step` имеют тип `UInt`. -- Если в результате запроса создаются массивы суммарной длиной больше 100 000 000 элементов, то генерируется исключение. - +- Если в результате запроса создаются массивы суммарной длиной больше, чем количество элементов, указанное настройкой [function_range_max_elements_in_block](../../operations/settings/settings.md#settings-function_range_max_elements_in_block), то генерируется исключение. **Примеры** @@ -839,7 +906,7 @@ SELECT arrayEnumerateDense([10, 20, 10, 30]) ## arrayIntersect(arr) {#array-functions-arrayintersect} -Принимает несколько массивов, возвращает массив с элементами, присутствующими во всех исходных массивах. Элементы на выходе следуют в порядке следования в первом массиве. +Принимает несколько массивов, возвращает массив с элементами, присутствующими во всех исходных массивах. Пример: diff --git a/docs/ru/sql-reference/functions/bit-functions.md b/docs/ru/sql-reference/functions/bit-functions.md index a5124e67235..557288ae7c1 100644 --- a/docs/ru/sql-reference/functions/bit-functions.md +++ b/docs/ru/sql-reference/functions/bit-functions.md @@ -257,7 +257,7 @@ bitHammingDistance(int1, int2) **Возвращаемое значение** -- Расстояние Хэмминга. +- Расстояние Хэмминга. Тип: [UInt8](../../sql-reference/data-types/int-uint.md). diff --git a/docs/ru/sql-reference/functions/conditional-functions.md b/docs/ru/sql-reference/functions/conditional-functions.md index b191937df51..8a78425efd4 100644 --- a/docs/ru/sql-reference/functions/conditional-functions.md +++ b/docs/ru/sql-reference/functions/conditional-functions.md @@ -7,7 +7,7 @@ toc_title: "Условные функции" ## if {#if} -Условное выражение. В отличии от большинства систем, ClickHouse всегда считает оба выражения `then` и `else`. +Условное выражение. В отличие от большинства систем, ClickHouse всегда считает оба выражения `then` и `else`. **Синтаксис** diff --git a/docs/ru/sql-reference/functions/date-time-functions.md b/docs/ru/sql-reference/functions/date-time-functions.md index 69f9a89f4cb..282962b9e3f 100644 --- a/docs/ru/sql-reference/functions/date-time-functions.md +++ b/docs/ru/sql-reference/functions/date-time-functions.md @@ -27,40 +27,40 @@ SELECT Возвращает часовой пояс сервера. -**Синтаксис** +**Синтаксис** ``` sql timeZone() ``` -Псевдоним: `timezone`. +Синоним: `timezone`. **Возвращаемое значение** -- Часовой пояс. +- Часовой пояс. Тип: [String](../../sql-reference/data-types/string.md). ## toTimeZone {#totimezone} -Переводит дату или дату с временем в указанный часовой пояс. Часовой пояс - это атрибут типов `Date` и `DateTime`. Внутреннее значение (количество секунд) поля таблицы или результирующего столбца не изменяется, изменяется тип поля и, соответственно, его текстовое отображение. +Переводит дату или дату с временем в указанный часовой пояс. Часовой пояс - это атрибут типов `Date` и `DateTime`. Внутреннее значение (количество секунд) поля таблицы или результирующего столбца не изменяется, изменяется тип поля и, соответственно, его текстовое отображение. -**Синтаксис** +**Синтаксис** ``` sql toTimezone(value, timezone) ``` -Псевдоним: `toTimezone`. +Синоним: `toTimezone`. -**Аргументы** +**Аргументы** - `value` — время или дата с временем. [DateTime64](../../sql-reference/data-types/datetime64.md). - `timezone` — часовой пояс для возвращаемого значения. [String](../../sql-reference/data-types/string.md). **Возвращаемое значение** -- Дата с временем. +- Дата с временем. Тип: [DateTime](../../sql-reference/data-types/datetime.md). @@ -80,6 +80,7 @@ SELECT toDateTime('2019-01-01 00:00:00', 'UTC') AS time_utc, toInt32(time_samoa) AS int32samoa FORMAT Vertical; ``` + Результат: ```text @@ -102,21 +103,21 @@ int32samoa: 1546300800 Возвращает название часового пояса для значений типа [DateTime](../../sql-reference/data-types/datetime.md) и [DateTime64](../../sql-reference/data-types/datetime64.md). -**Синтаксис** +**Синтаксис** ``` sql timeZoneOf(value) ``` -Псевдоним: `timezoneOf`. +Синоним: `timezoneOf`. **Аргументы** -- `value` — Дата с временем. [DateTime](../../sql-reference/data-types/datetime.md) или [DateTime64](../../sql-reference/data-types/datetime64.md). +- `value` — Дата с временем. [DateTime](../../sql-reference/data-types/datetime.md) или [DateTime64](../../sql-reference/data-types/datetime64.md). **Возвращаемое значение** -- Название часового пояса. +- Название часового пояса. Тип: [String](../../sql-reference/data-types/string.md). @@ -145,15 +146,15 @@ SELECT timezoneOf(now()); timeZoneOffset(value) ``` -Псевдоним: `timezoneOffset`. +Синоним: `timezoneOffset`. **Аргументы** -- `value` — Дата с временем. [DateTime](../../sql-reference/data-types/datetime.md) or [DateTime64](../../sql-reference/data-types/datetime64.md). +- `value` — Дата с временем. [DateTime](../../sql-reference/data-types/datetime.md) or [DateTime64](../../sql-reference/data-types/datetime64.md). **Возвращаемое значение** -- Смещение в секундах от UTC. +- Смещение в секундах от UTC. Тип: [Int32](../../sql-reference/data-types/int-uint.md). @@ -339,7 +340,7 @@ toStartOfSecond(value[, timezone]) **Аргументы** - `value` — дата и время. [DateTime64](../data-types/datetime64.md). -- `timezone` — [часовой пояс](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) для возвращаемого значения (необязательно). Если параметр не задан, используется часовой пояс параметра `value`. [String](../data-types/string.md). +- `timezone` — [часовой пояс](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) для возвращаемого значения (необязательно). Если параметр не задан, используется часовой пояс параметра `value`. [String](../data-types/string.md). **Возвращаемое значение** @@ -557,13 +558,13 @@ SELECT toDate('2016-12-27') AS date, toYearWeek(date) AS yearWeek0, toYearWeek(d Отсекает от даты и времени части, меньшие чем указанная часть. -**Синтаксис** +**Синтаксис** ``` sql date_trunc(unit, value[, timezone]) ``` -Синоним: `dateTrunc`. +Синоним: `dateTrunc`. **Аргументы** @@ -626,7 +627,7 @@ SELECT now(), date_trunc('hour', now(), 'Europe/Moscow'); Добавляет интервал времени или даты к указанной дате или дате со временем. -**Синтаксис** +**Синтаксис** ``` sql date_add(unit, value, date) @@ -647,7 +648,7 @@ date_add(unit, value, date) - `month` - `quarter` - `year` - + - `value` — значение интервала для добавления. [Int](../../sql-reference/data-types/int-uint.md). - `date` — дата или дата со временем, к которой добавляется `value`. [Date](../../sql-reference/data-types/date.md) или [DateTime](../../sql-reference/data-types/datetime.md). @@ -782,16 +783,16 @@ SELECT date_sub(YEAR, 3, toDate('2018-01-01')); Добавляет интервал времени к указанной дате или дате со временем. -**Синтаксис** +**Синтаксис** ``` sql timestamp_add(date, INTERVAL value unit) ``` -Синонимы: `timeStampAdd`, `TIMESTAMP_ADD`. +Синонимы: `timeStampAdd`, `TIMESTAMP_ADD`. **Аргументы** - + - `date` — дата или дата со временем. [Date](../../sql-reference/data-types/date.md) или [DateTime](../../sql-reference/data-types/datetime.md). - `value` — значение интервала для добавления. [Int](../../sql-reference/data-types/int-uint.md). - `unit` — единица измерения времени, в которой задан интервал для добавления. [String](../../sql-reference/data-types/string.md). @@ -811,7 +812,7 @@ timestamp_add(date, INTERVAL value unit) Дата или дата со временем, полученная в результате добавления `value`, выраженного в `unit`, к `date`. Тип: [Date](../../sql-reference/data-types/date.md) или [DateTime](../../sql-reference/data-types/datetime.md). - + **Пример** Запрос: @@ -832,13 +833,13 @@ select timestamp_add(toDate('2018-01-01'), INTERVAL 3 MONTH); Вычитает интервал времени из указанной даты или даты со временем. -**Синтакис** +**Синтакис** ``` sql timestamp_sub(unit, value, date) ``` -Синонимы: `timeStampSub`, `TIMESTAMP_SUB`. +Синонимы: `timeStampSub`, `TIMESTAMP_SUB`. **Аргументы** @@ -853,8 +854,8 @@ timestamp_sub(unit, value, date) - `month` - `quarter` - `year` - -- `value` — значение интервала для вычитания. [Int](../../sql-reference/data-types/int-uint.md). + +- `value` — значение интервала для вычитания. [Int](../../sql-reference/data-types/int-uint.md). - `date` — дата или дата со временем. [Date](../../sql-reference/data-types/date.md) или [DateTime](../../sql-reference/data-types/datetime.md). **Возвращаемое значение** @@ -881,9 +882,9 @@ select timestamp_sub(MONTH, 5, toDateTime('2018-12-18 01:02:03')); ## now {#now} -Возвращает текущую дату и время. +Возвращает текущую дату и время. -**Синтаксис** +**Синтаксис** ``` sql now([timezone]) @@ -1025,9 +1026,48 @@ SELECT formatDateTime(toDate('2010-01-04'), '%g'); └────────────────────────────────────────────┘ ``` +## dateName {#dataname} + +Возвращает указанную часть даты. + +**Синтаксис** + +``` sql +dateName(date_part, date) +``` + +**Аргументы** + +- `date_part` — часть даты. Возможные значения: 'year', 'quarter', 'month', 'week', 'dayofyear', 'day', 'weekday', 'hour', 'minute', 'second'. [String](../../sql-reference/data-types/string.md). +- `date` — дата. [Date](../../sql-reference/data-types/date.md), [DateTime](../../sql-reference/data-types/datetime.md) или [DateTime64](../../sql-reference/data-types/datetime64.md). +- `timezone` — часовой пояс. Необязательный аргумент. [String](../../sql-reference/data-types/string.md). + +**Возвращаемое значение** + +- Указанная часть даты. + +Тип: [String](../../sql-reference/data-types/string.md#string). + +**Пример** + +Запрос: + +```sql +WITH toDateTime('2021-04-14 11:22:33') AS date_value +SELECT dateName('year', date_value), dateName('month', date_value), dateName('day', date_value); +``` + +Результат: + +```text +┌─dateName('year', date_value)─┬─dateName('month', date_value)─┬─dateName('day', date_value)─┐ +│ 2021 │ April │ 14 │ +└──────────────────────────────┴───────────────────────────────┴───────────────────────────── +``` + ## FROM\_UNIXTIME {#fromunixtime} -Функция преобразует Unix timestamp в календарную дату и время. +Функция преобразует Unix timestamp в календарную дату и время. **Примеры** diff --git a/docs/ru/sql-reference/functions/encoding-functions.md b/docs/ru/sql-reference/functions/encoding-functions.md index 23e840a7898..161c1304b7c 100644 --- a/docs/ru/sql-reference/functions/encoding-functions.md +++ b/docs/ru/sql-reference/functions/encoding-functions.md @@ -223,3 +223,53 @@ SELECT reinterpretAsUInt64(reverse(unhex('FFF'))) AS num; ## bitmaskToArray(num) {#bitmasktoarraynum} Принимает целое число. Возвращает массив чисел типа UInt64, содержащий степени двойки, в сумме дающих исходное число; числа в массиве идут по возрастанию. + +## bitPositionsToArray(num) {#bitpositionstoarraynum} + +Принимает целое число и приводит его к беззнаковому виду. Возвращает массив `UInt64` чисел, который содержит список позиций битов `arg`, равных `1`, в порядке возрастания. + +**Синтаксис** + +```sql +bitPositionsToArray(arg) +``` + +**Аргументы** + +- `arg` — целое значение. [Int/UInt](../../sql-reference/data-types/int-uint.md). + +**Возвращаемое значение** + +- Массив, содержащий список позиций битов, равных `1`, в порядке возрастания. + +Тип: [Array](../../sql-reference/data-types/array.md)([UInt64](../../sql-reference/data-types/int-uint.md)). + +**Примеры** + +Запрос: + +``` sql +SELECT bitPositionsToArray(toInt8(1)) AS bit_positions; +``` + +Результат: + +``` text +┌─bit_positions─┐ +│ [0] │ +└───────────────┘ +``` + +Запрос: + +``` sql +select bitPositionsToArray(toInt8(-1)) as bit_positions; +``` + +Результат: + +``` text +┌─bit_positions─────┐ +│ [0,1,2,3,4,5,6,7] │ +└───────────────────┘ +``` diff --git a/docs/ru/sql-reference/functions/encryption-functions.md b/docs/ru/sql-reference/functions/encryption-functions.md index 44957fde152..d9bcbaf0887 100644 --- a/docs/ru/sql-reference/functions/encryption-functions.md +++ b/docs/ru/sql-reference/functions/encryption-functions.md @@ -9,7 +9,7 @@ toc_title: "Функции для шифрования" Длина ключа зависит от режима шифрования. Он может быть длинной в 16, 24 и 32 байта для режимов шифрования `-128-`, `-196-` и `-256-` соответственно. -Длина инициализирующего вектора всегда 16 байт (лишние байты игнорируются). +Длина инициализирующего вектора всегда 16 байт (лишние байты игнорируются). Обратите внимание, что до версии Clickhouse 21.1 эти функции работали медленно. @@ -58,7 +58,7 @@ CREATE TABLE encryption_test ENGINE = Memory; ``` -Вставим некоторые данные (замечание: не храните ключи или инициализирующие векторы в базе данных, так как это компрометирует всю концепцию шифрования), также хранение "подсказок" небезопасно и используется только для наглядности: +Вставим некоторые данные (замечание: не храните ключи или инициализирующие векторы в базе данных, так как это компрометирует всю концепцию шифрования), также хранение "подсказок" небезопасно и используется только для наглядности: Запрос: @@ -168,7 +168,7 @@ SELECT encrypt('aes-256-cfb128', 'Secret', '123456789101213141516171819202122', ``` text Received exception from server (version 21.1.2): -Code: 36. DB::Exception: Received from localhost:9000. DB::Exception: Invalid key size: 33 expected 32: While processing encrypt('aes-256-cfb128', 'Secret', '123456789101213141516171819202122', 'iviviviviviviviv123'). +Code: 36. DB::Exception: Received from localhost:9000. DB::Exception: Invalid key size: 33 expected 32: While processing encrypt('aes-256-cfb128', 'Secret', '123456789101213141516171819202122', 'iviviviviviviviv123'). ``` Однако функция `aes_encrypt_mysql` в аналогичном случае возвращает результат, который может быть обработан MySQL: @@ -297,7 +297,7 @@ SELECT comment, decrypt('aes-256-cfb128', secret, '12345678910121314151617181920 ## aes_decrypt_mysql {#aes_decrypt_mysql} -Совместима с шифрованием myqsl и может расшифровать данные, зашифрованные функцией [AES_ENCRYPT](https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_aes-encrypt). +Совместима с шифрованием myqsl и может расшифровать данные, зашифрованные функцией [AES_ENCRYPT](https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_aes-encrypt). При одинаковых входящих значениях расшифрованный текст будет совпадать с результатом, возвращаемым функцией `decrypt`. Однако если `key` или `iv` длиннее, чем должны быть, `aes_decrypt_mysql` будет работать аналогично функции `aes_decrypt` в MySQL: свернет ключ и проигнорирует лишнюю часть `iv`. diff --git a/docs/ru/sql-reference/functions/ext-dict-functions.md b/docs/ru/sql-reference/functions/ext-dict-functions.md index 612477dc806..0e234f1d84e 100644 --- a/docs/ru/sql-reference/functions/ext-dict-functions.md +++ b/docs/ru/sql-reference/functions/ext-dict-functions.md @@ -23,8 +23,8 @@ dictGetOrNull('dict_name', attr_name, id_expr) **Аргументы** - `dict_name` — имя словаря. [Строковый литерал](../syntax.md#syntax-string-literal). -- `attr_names` — имя столбца словаря, [Строковый литерал](../syntax.md#syntax-string-literal), или кортеж [Tuple](../../sql-reference/data-types/tuple.md) таких имен. -- `id_expr` — значение ключа словаря. [Выражение](../syntax.md#syntax-expressions), возвращающее значение типа [UInt64](../../sql-reference/functions/ext-dict-functions.md) или [Tuple](../../sql-reference/functions/ext-dict-functions.md), в зависимости от конфигурации словаря. +- `attr_names` — имя столбца словаря. [Строковый литерал](../syntax.md#syntax-string-literal), или кортеж [Tuple](../../sql-reference/data-types/tuple.md) таких имен. +- `id_expr` — значение ключа словаря. [Expression](../../sql-reference/syntax.md#syntax-expressions) возвращает пару "ключ-значение" словаря или [Tuple](../../sql-reference/functions/ext-dict-functions.md), в зависимости от конфигурации словаря. - `default_value_expr` — значение, возвращаемое в том случае, когда словарь не содержит строки с заданным ключом `id_expr`. [Выражение](../syntax.md#syntax-expressions), возвращающее значение с типом данных, сконфигурированным для атрибута `attr_names`, или кортеж [Tuple](../../sql-reference/data-types/tuple.md) таких выражений. **Возвращаемое значение** @@ -87,7 +87,7 @@ SELECT dictGetOrDefault('ext-dict-test', 'c1', number + 1, toUInt32(number * 10)) AS val, toTypeName(val) AS type FROM system.numbers -LIMIT 3 +LIMIT 3; ``` ``` text @@ -138,7 +138,7 @@ LIMIT 3 c2 String - + 0 @@ -237,7 +237,7 @@ dictHas('dict_name', id) **Аргументы** - `dict_name` — имя словаря. [Строковый литерал](../syntax.md#syntax-string-literal). -- `id_expr` — значение ключа словаря. [Выражение](../syntax.md#syntax-expressions), возвращающее значение типа [UInt64](../../sql-reference/functions/ext-dict-functions.md) или [Tuple](../../sql-reference/functions/ext-dict-functions.md) в зависимости от конфигурации словаря. +- `id_expr` — значение ключа словаря. [Expression](../../sql-reference/syntax.md#syntax-expressions) возвращает пару "ключ-значение" словаря или [Tuple](../../sql-reference/functions/ext-dict-functions.md) в зависимости от конфигурации словаря. **Возвращаемое значение** @@ -290,16 +290,16 @@ Type: [Array](../../sql-reference/data-types/array.md)([UInt64](../../sql-refere Возвращает потомков первого уровня в виде массива индексов. Это обратное преобразование для [dictGetHierarchy](#dictgethierarchy). -**Синтаксис** +**Синтаксис** ``` sql dictGetChildren(dict_name, key) ``` -**Аргументы** +**Аргументы** -- `dict_name` — имя словаря. [String literal](../../sql-reference/syntax.md#syntax-string-literal). -- `key` — значение ключа. [Выражение](../syntax.md#syntax-expressions), возвращающее значение типа [UInt64](../../sql-reference/functions/ext-dict-functions.md). +- `dict_name` — имя словаря. [String literal](../../sql-reference/syntax.md#syntax-string-literal). +- `key` — значение ключа. [Выражение](../syntax.md#syntax-expressions), возвращающее значение типа [UInt64](../../sql-reference/functions/ext-dict-functions.md). **Возвращаемые значения** @@ -337,7 +337,7 @@ SELECT dictGetChildren('hierarchy_flat_dictionary', number) FROM system.numbers ## dictGetDescendant {#dictgetdescendant} -Возвращает всех потомков, как если бы функция [dictGetChildren](#dictgetchildren) была выполнена `level` раз рекурсивно. +Возвращает всех потомков, как если бы функция [dictGetChildren](#dictgetchildren) была выполнена `level` раз рекурсивно. **Синтаксис** @@ -345,9 +345,9 @@ SELECT dictGetChildren('hierarchy_flat_dictionary', number) FROM system.numbers dictGetDescendants(dict_name, key, level) ``` -**Аргументы** +**Аргументы** -- `dict_name` — имя словаря. [String literal](../../sql-reference/syntax.md#syntax-string-literal). +- `dict_name` — имя словаря. [String literal](../../sql-reference/syntax.md#syntax-string-literal). - `key` — значение ключа. [Выражение](../syntax.md#syntax-expressions), возвращающее значение типа [UInt64](../../sql-reference/functions/ext-dict-functions.md). - `level` — уровень иерархии. Если `level = 0`, возвращаются все потомки. [UInt8](../../sql-reference/data-types/int-uint.md). diff --git a/docs/ru/sql-reference/functions/geo/geohash.md b/docs/ru/sql-reference/functions/geo/geohash.md index 0992b620e60..73e739893ca 100644 --- a/docs/ru/sql-reference/functions/geo/geohash.md +++ b/docs/ru/sql-reference/functions/geo/geohash.md @@ -4,7 +4,7 @@ toc_title: "Функции для работы с системой Geohash" # Функции для работы с системой Geohash {#geohash} -[Geohash](https://en.wikipedia.org/wiki/Geohash) — это система геокодирования, которая делит поверхность Земли на участки в виде "решетки", и каждую ячейку решетки кодирует в виде строки из букв и цифр. Система поддерживает иерархию (вложенность) ячеек, поэтому чем точнее определена геопозиция, тем длиннее строка с кодом соответствующей ячейки. +[Geohash](https://en.wikipedia.org/wiki/Geohash) — это система геокодирования, которая делит поверхность Земли на участки в виде "решетки", и каждую ячейку решетки кодирует в виде строки из букв и цифр. Система поддерживает иерархию (вложенность) ячеек, поэтому чем точнее определена геопозиция, тем длиннее строка с кодом соответствующей ячейки. Для ручного преобразования географических координат в строку geohash можно использовать сайт [geohash.org](http://geohash.org/). @@ -89,7 +89,7 @@ geohashesInBox(longitude_min, latitude_min, longitude_max, latitude_max, precisi **Возвращаемые значения** -- Массив строк, описывающих участки, покрывающие заданный участок. Длина каждой строки соответствует точности geohash. Порядок строк — произвольный. +- Массив строк, описывающих участки, покрывающие заданный участок. Длина каждой строки соответствует точности geohash. Порядок строк — произвольный. - \[\] - Если переданные минимальные значения широты и долготы больше соответствующих максимальных значений, функция возвращает пустой массив. Тип данных: [Array](../../../sql-reference/data-types/array.md)([String](../../../sql-reference/data-types/string.md)). diff --git a/docs/ru/sql-reference/functions/geo/h3.md b/docs/ru/sql-reference/functions/geo/h3.md index 27a512a9931..088814c4d7d 100644 --- a/docs/ru/sql-reference/functions/geo/h3.md +++ b/docs/ru/sql-reference/functions/geo/h3.md @@ -4,9 +4,9 @@ toc_title: "Функции для работы с индексами H3" # Функции для работы с индексами H3 {#h3index} -[H3](https://eng.uber.com/h3/) — это система геокодирования, которая делит поверхность Земли на равные шестигранные ячейки. Система поддерживает иерархию (вложенность) ячеек, т.е. каждый "родительский" шестигранник может быть поделен на семь одинаковых вложенных "дочерних" шестигранников, и так далее. +[H3](https://eng.uber.com/h3/) — это система геокодирования, которая делит поверхность Земли на равные шестигранные ячейки. Система поддерживает иерархию (вложенность) ячеек, т.е. каждый "родительский" шестигранник может быть поделен на семь одинаковых вложенных "дочерних" шестигранников, и так далее. -Уровень вложенности назвается `разрешением` и может принимать значение от `0` до `15`, где `0` соответствует `базовым` ячейкам самого верхнего уровня (наиболее крупным). +Уровень вложенности назвается `разрешением` и может принимать значение от `0` до `15`, где `0` соответствует `базовым` ячейкам самого верхнего уровня (наиболее крупным). Для каждой точки, имеющей широту и долготу, можно получить 64-битный индекс H3, соответствующий номеру шестигранной ячейки, где эта точка находится. @@ -65,7 +65,7 @@ h3GetResolution(h3index) **Возвращаемые значения** -- Разрешение сетки. Диапазон значений: `[0, 15]`. +- Разрешение сетки. Диапазон значений: `[0, 15]`. - Для несуществующего идентификатора может быть возвращено произвольное значение. Используйте [h3IsValid](#h3isvalid) для проверки идентификаторов. Тип: [UInt8](../../../sql-reference/data-types/int-uint.md). @@ -252,7 +252,7 @@ h3GetBaseCell(index) **Возвращаемое значение** -- Индекс базовой шестиугольной ячейки. +- Индекс базовой шестиугольной ячейки. Тип: [UInt8](../../../sql-reference/data-types/int-uint.md). @@ -274,7 +274,7 @@ SELECT h3GetBaseCell(612916788725809151) as basecell; ## h3HexAreaM2 {#h3hexaream2} -Определяет среднюю площадь шестиугольной [H3](#h3index)-ячейки заданного разрешения в квадратных метрах. +Определяет среднюю площадь шестиугольной [H3](#h3index)-ячейки заданного разрешения в квадратных метрах. **Синтаксис** @@ -324,7 +324,7 @@ h3IndexesAreNeighbors(index1, index2) **Возвращаемое значение** - `1` — ячейки являются соседями. -- `0` — ячейки не являются соседями. +- `0` — ячейки не являются соседями. Тип: [UInt8](../../../sql-reference/data-types/int-uint.md). @@ -361,7 +361,7 @@ h3ToChildren(index, resolution) **Возвращаемое значение** -- Массив дочерних H3-ячеек. +- Массив дочерних H3-ячеек. Тип: [Array](../../../sql-reference/data-types/array.md)([UInt64](../../../sql-reference/data-types/int-uint.md)). @@ -398,7 +398,7 @@ h3ToParent(index, resolution) **Возвращаемое значение** -- Индекс родительской H3-ячейки. +- Индекс родительской H3-ячейки. Тип: [UInt64](../../../sql-reference/data-types/int-uint.md). @@ -432,7 +432,7 @@ h3ToString(index) **Возвращаемое значение** -- Строковое представление H3-индекса. +- Строковое представление H3-индекса. Тип: [String](../../../sql-reference/data-types/string.md). @@ -468,8 +468,8 @@ stringToH3(index_str) **Возвращаемое значение** -- Числовое представление индекса шестиугольной ячейки. -- `0`, если при преобразовании возникла ошибка. +- Числовое представление индекса шестиугольной ячейки. +- `0`, если при преобразовании возникла ошибка. Тип: [UInt64](../../../sql-reference/data-types/int-uint.md). @@ -505,7 +505,7 @@ h3GetResolution(index) **Возвращаемое значение** -- Разрешение ячейки. Диапазон: `[0, 15]`. +- Разрешение ячейки. Диапазон: `[0, 15]`. Тип: [UInt8](../../../sql-reference/data-types/int-uint.md). diff --git a/docs/ru/sql-reference/functions/index.md b/docs/ru/sql-reference/functions/index.md index 1eefd4d9f73..15da9d36ef5 100644 --- a/docs/ru/sql-reference/functions/index.md +++ b/docs/ru/sql-reference/functions/index.md @@ -48,9 +48,9 @@ toc_title: "Введение" Функции высшего порядка, в качестве своего функционального аргумента могут принимать только лямбда-функции. Чтобы передать лямбда-функцию в функцию высшего порядка, используйте оператор `->`. Слева от стрелочки стоит формальный параметр — произвольный идентификатор, или несколько формальных параметров — произвольные идентификаторы в кортеже. Справа от стрелочки стоит выражение, в котором могут использоваться эти формальные параметры, а также любые столбцы таблицы. -Примеры: +Примеры: ``` -x -> 2 * x +x -> 2 * x str -> str != Referer ``` diff --git a/docs/ru/sql-reference/functions/ip-address-functions.md b/docs/ru/sql-reference/functions/ip-address-functions.md index b02d45d7667..92ea368828e 100644 --- a/docs/ru/sql-reference/functions/ip-address-functions.md +++ b/docs/ru/sql-reference/functions/ip-address-functions.md @@ -53,7 +53,7 @@ LIMIT 10 ### IPv6NumToString(x) {#ipv6numtostringx} Принимает значение типа FixedString(16), содержащее IPv6-адрес в бинарном виде. Возвращает строку, содержащую этот адрес в текстовом виде. -IPv6-mapped IPv4 адреса выводится в формате ::ffff:111.222.33.44. +IPv6-mapped IPv4 адреса выводится в формате ::ffff:111.222.33.44. Примеры: `INET6_NTOA`. @@ -137,7 +137,7 @@ HEX может быть в любом регистре. IPv6StringToNum(string) ``` -**Аргумент** +**Аргумент** - `string` — IP адрес. [String](../../sql-reference/data-types/string.md). @@ -281,7 +281,7 @@ toIPv6(string) **Возвращаемое значение** -- IP адрес. +- IP адрес. Тип: [IPv6](../../sql-reference/data-types/domains/ipv6.md). diff --git a/docs/ru/sql-reference/functions/json-functions.md b/docs/ru/sql-reference/functions/json-functions.md index 8941ccc1691..d20d8cf5998 100644 --- a/docs/ru/sql-reference/functions/json-functions.md +++ b/docs/ru/sql-reference/functions/json-functions.md @@ -306,3 +306,51 @@ SELECT JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello" │ [('d','"hello"'),('f','"world"')] │ └───────────────────────────────────────────────────────────────────────────────────────────────────────┘ ``` + + +## toJSONString {#tojsonstring} + +Сериализует значение в JSON представление. Поддерживаются различные типы данных и вложенные структуры. +По умолчанию 64-битные [целые числа](../../sql-reference/data-types/int-uint.md) и более (например, `UInt64` или `Int128`) заключаются в кавычки. Настройка [output_format_json_quote_64bit_integers](../../operations/settings/settings.md#session_settings-output_format_json_quote_64bit_integers) управляет этим поведением. +Специальные значения `NaN` и `inf` заменяются на `null`. Чтобы они отображались, включите настройку [output_format_json_quote_denormals](../../operations/settings/settings.md#settings-output_format_json_quote_denormals). +Когда сериализуется значение [Enum](../../sql-reference/data-types/enum.md), то функция выводит его имя. + +**Синтаксис** + +``` sql +toJSONString(value) +``` + +**Аргументы** + +- `value` — значение, которое необходимо сериализовать. Может быть любого типа. + +**Возвращаемое значение** + +- JSON представление значения. + +Тип: [String](../../sql-reference/data-types/string.md). + +**Пример** + +Первый пример показывает сериализацию [Map](../../sql-reference/data-types/map.md). +Во втором примере есть специальные значения, обернутые в [Tuple](../../sql-reference/data-types/tuple.md). + +Запрос: + +``` sql +SELECT toJSONString(map('key1', 1, 'key2', 2)); +SELECT toJSONString(tuple(1.25, NULL, NaN, +inf, -inf, [])) SETTINGS output_format_json_quote_denormals = 1; +``` + +Результат: + +``` text +{"key1":1,"key2":2} +[1.25,null,"nan","inf","-inf",[]] +``` + +**Смотрите также** + +- [output_format_json_quote_64bit_integers](../../operations/settings/settings.md#session_settings-output_format_json_quote_64bit_integers) +- [output_format_json_quote_denormals](../../operations/settings/settings.md#settings-output_format_json_quote_denormals) diff --git a/docs/ru/sql-reference/functions/logical-functions.md b/docs/ru/sql-reference/functions/logical-functions.md index 8566657d2eb..837541ec58f 100644 --- a/docs/ru/sql-reference/functions/logical-functions.md +++ b/docs/ru/sql-reference/functions/logical-functions.md @@ -5,15 +5,186 @@ toc_title: "Логические функции" # Логические функции {#logicheskie-funktsii} -Логические функции принимают любые числовые типы, а возвращают число типа UInt8, равное 0 или 1. +Логические функции производят логические операции над любыми числовыми типами, а возвращают число типа [UInt8](../../sql-reference/data-types/int-uint.md), равное 0, 1, а в некоторых случаях `NULL`. -Ноль в качестве аргумента считается «ложью», а любое ненулевое значение - «истиной». +Ноль в качестве аргумента считается `ложью`, а любое ненулевое значение — `истиной`. -## and, оператор AND {#and-operator-and} +## and {#logical-and-function} -## or, оператор OR {#or-operator-or} +Вычисляет результат логической конъюнкции между двумя и более значениями. Соответствует [оператору логического "И"](../../sql-reference/operators/index.md#logical-and-operator). -## not, оператор NOT {#not-operator-not} +**Синтаксис** -## xor {#xor} +``` sql +and(val1, val2...) +``` +**Аргументы** + +- `val1, val2, ...` — список из как минимум двух значений. [Int](../../sql-reference/data-types/int-uint.md), [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) или [Nullable](../../sql-reference/data-types/nullable.md). + +**Возвращаемое значение** + +- `0`, если среди аргументов есть хотя бы один нуль. +- `NULL`, если среди аргументов нет нулей, но есть хотя бы один `NULL`. +- `1`, в остальных случаях. + +Тип: [UInt8](../../sql-reference/data-types/int-uint.md) или [Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md)). + +**Пример** + +Запрос: + +``` sql +SELECT and(0, 1, -2); +``` + +Результат: + +``` text +┌─and(0, 1, -2)─┐ +│ 0 │ +└───────────────┘ +``` + +Со значениями `NULL`: + +``` sql +SELECT and(NULL, 1, 10, -2); +``` + +Результат: + +``` text +┌─and(NULL, 1, 10, -2)─┐ +│ ᴺᵁᴸᴸ │ +└──────────────────────┘ +``` + +## or {#logical-or-function} + +Вычисляет результат логической дизъюнкции между двумя и более значениями. Соответствует [оператору логического "ИЛИ"](../../sql-reference/operators/index.md#logical-or-operator). + +**Синтаксис** + +``` sql +and(val1, val2...) +``` + +**Аргументы** + +- `val1, val2, ...` — список из как минимум двух значений. [Int](../../sql-reference/data-types/int-uint.md), [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) или [Nullable](../../sql-reference/data-types/nullable.md). + +**Returned value** + +- `1`, если среди аргументов есть хотя бы одно ненулевое число. +- `0`, если среди аргументов только нули. +- `NULL`, если среди аргументов нет ненулевых значений, и есть `NULL`. + +Тип: [UInt8](../../sql-reference/data-types/int-uint.md) или [Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md)). + +**Пример** + +Запрос: + +``` sql +SELECT or(1, 0, 0, 2, NULL); +``` + +Результат: + +``` text +┌─or(1, 0, 0, 2, NULL)─┐ +│ 1 │ +└──────────────────────┘ +``` + +Со значениями `NULL`: + +``` sql +SELECT or(0, NULL); +``` + +Результат: + +``` text +┌─or(0, NULL)─┐ +│ ᴺᵁᴸᴸ │ +└─────────────┘ +``` + +## not {#logical-not-function} + +Вычисляет результат логического отрицания аргумента. Соответствует [оператору логического отрицания](../../sql-reference/operators/index.md#logical-negation-operator). + +**Синтаксис** + +``` sql +not(val); +``` + +**Аргументы** + +- `val` — значение. [Int](../../sql-reference/data-types/int-uint.md), [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) или [Nullable](../../sql-reference/data-types/nullable.md). + +**Возвращаемое значение** + +- `1`, если `val` — это `0`. +- `0`, если `val` — это ненулевое число. +- `NULL`, если `val` — это `NULL`. + +Тип: [UInt8](../../sql-reference/data-types/int-uint.md) или [Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md)). + +**Пример** + +Запрос: + +``` sql +SELECT NOT(1); +``` + +Результат: + +``` test +┌─not(1)─┐ +│ 0 │ +└────────┘ +``` + +## xor {#logical-xor-function} + +Вычисляет результат логической исключающей дизъюнкции между двумя и более значениями. При более чем двух значениях функция работает так: сначала вычисляет `XOR` для первых двух значений, а потом использует полученный результат при вычислении `XOR` со следующим значением и так далее. + +**Синтаксис** + +``` sql +xor(val1, val2...) +``` + +**Аргументы** + +- `val1, val2, ...` — список из как минимум двух значений. [Int](../../sql-reference/data-types/int-uint.md), [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) или [Nullable](../../sql-reference/data-types/nullable.md). + +**Returned value** + +- `1`, для двух значений: если одно из значений является нулем, а второе нет. +- `0`, для двух значений: если оба значения одновременно нули или ненулевые числа. +- `NULL`, если среди аргументов хотя бы один `NULL`. + +Тип: [UInt8](../../sql-reference/data-types/int-uint.md) or [Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md)). + +**Пример** + +Запрос: + +``` sql +SELECT xor(0, 1, 1); +``` + +Результат: + +``` text +┌─xor(0, 1, 1)─┐ +│ 0 │ +└──────────────┘ +``` diff --git a/docs/ru/sql-reference/functions/machine-learning-functions.md b/docs/ru/sql-reference/functions/machine-learning-functions.md index a1716eed6c2..ce7d3cfd09e 100644 --- a/docs/ru/sql-reference/functions/machine-learning-functions.md +++ b/docs/ru/sql-reference/functions/machine-learning-functions.md @@ -21,13 +21,13 @@ toc_title: "Функции машинного обучения" Сравнивает тестовые группы (варианты) и для каждой группы рассчитывает вероятность того, что эта группа окажется лучшей. Первая из перечисленных групп считается контрольной. -**Синтаксис** +**Синтаксис** ``` sql bayesAB(distribution_name, higher_is_better, variant_names, x, y) ``` -**Аргументы** +**Аргументы** - `distribution_name` — вероятностное распределение. [String](../../sql-reference/data-types/string.md). Возможные значения: diff --git a/docs/ru/sql-reference/functions/nlp-functions.md b/docs/ru/sql-reference/functions/nlp-functions.md new file mode 100644 index 00000000000..58c4eb86e35 --- /dev/null +++ b/docs/ru/sql-reference/functions/nlp-functions.md @@ -0,0 +1,132 @@ +--- +toc_priority: 67 +toc_title: NLP +--- + +# [экспериментально] Функции для работы с ествественным языком {#nlp-functions} + +!!! warning "Предупреждение" + Сейчас использование функций для работы с ествественным языком является экспериментальной возможностью. Чтобы использовать данные функции, включите настройку `allow_experimental_nlp_functions = 1`. + +## stem {#stem} + +Данная функция проводит стемминг заданного слова. + +**Синтаксис** + +``` sql +stem('language', word) +``` + +**Аргументы** + +- `language` — Язык, правила которого будут применены для стемминга. Допускается только нижний регистр. [String](../../sql-reference/data-types/string.md#string). +- `word` — Слово подлежащее стеммингу. Допускается только нижний регистр. [String](../../sql-reference/data-types/string.md#string). + +**Examples** + +Query: + +``` sql +SELECT SELECT arrayMap(x -> stem('en', x), ['I', 'think', 'it', 'is', 'a', 'blessing', 'in', 'disguise']) as res; +``` + +Result: + +``` text +┌─res────────────────────────────────────────────────┐ +│ ['I','think','it','is','a','bless','in','disguis'] │ +└────────────────────────────────────────────────────┘ +``` + +## lemmatize {#lemmatize} + +Данная функция проводит лемматизацию для заданного слова. Для работы лемматизатора необходимы словари, которые можно найти [здесь](https://github.com/vpodpecan/lemmagen3/tree/master/src/lemmagen3/models). + +**Синтаксис** + +``` sql +lemmatize('language', word) +``` + +**Аргументы** + +- `language` — Язык, правила которого будут применены для лемматизации. [String](../../sql-reference/data-types/string.md#string). +- `word` — Слово, подлежащее лемматизации. Допускается только нижний регистр. [String](../../sql-reference/data-types/string.md#string). + +**Примеры** + +Запрос: + +``` sql +SELECT lemmatize('en', 'wolves'); +``` + +Результат: + +``` text +┌─lemmatize("wolves")─┐ +│ "wolf" │ +└─────────────────────┘ +``` + +Конфигурация: +``` xml + + + en + en.bin + + +``` + +## synonyms {#synonyms} + +Находит синонимы к заданному слову. Представлены два типа расширений словарей: `plain` и `wordnet`. + +Для работы расширения типа `plain` необходимо указать путь до простого текстового файла, где каждая строка соотвествует одному набору синонимов. Слова в данной строке должны быть разделены с помощью пробела или знака табуляции. + +Для работы расширения типа `plain` необходимо указать путь до WordNet тезауруса. Тезаурус должен содержать WordNet sense index. + +**Синтаксис** + +``` sql +synonyms('extension_name', word) +``` + +**Аргументы** + +- `extension_name` — Название расширения, в котором будет проводиться поиск. [String](../../sql-reference/data-types/string.md#string). +- `word` — Слово, которое будет искаться в расширении. [String](../../sql-reference/data-types/string.md#string). + +**Примеры** + +Запрос: + +``` sql +SELECT synonyms('list', 'important'); +``` + +Результат: + +``` text +┌─synonyms('list', 'important')────────────┐ +│ ['important','big','critical','crucial'] │ +└──────────────────────────────────────────┘ +``` + +Конфигурация: +``` xml + + + en + plain + en.txt + + + en + wordnet + en/ + + +``` \ No newline at end of file diff --git a/docs/ru/sql-reference/functions/other-functions.md b/docs/ru/sql-reference/functions/other-functions.md index a07bd19faa1..c023786b788 100644 --- a/docs/ru/sql-reference/functions/other-functions.md +++ b/docs/ru/sql-reference/functions/other-functions.md @@ -2088,3 +2088,100 @@ SELECT tcpPort(); - [tcp_port](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-tcp_port) +## currentProfiles {#current-profiles} + +Возвращает список [профилей настроек](../../operations/access-rights.md#settings-profiles-management) для текущего пользователя. + +Для изменения текущего профиля настроек может быть использована команда SET PROFILE. Если команда `SET PROFILE` не применялась, функция возвращает профили, указанные при определении текущего пользователя (см. [CREATE USER](../../sql-reference/statements/create/user.md#create-user-statement)). + +**Синтаксис** + +``` sql +currentProfiles() +``` + +**Возвращаемое значение** + +- Список профилей настроек для текущего пользователя. + +Тип: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). + +## enabledProfiles {#enabled-profiles} + +Возвращает профили настроек, назначенные пользователю как явно, так и неявно. Явно назначенные профили — это те же профили, которые возвращает функция [currentProfiles](#current-profiles). Неявно назначенные профили включают родительские профили других назначенных профилей; профили, назначенные с помощью предоставленных ролей; профили, назначенные с помощью собственных настроек; основной профиль по умолчанию (см. секцию `default_profile` в основном конфигурационном файле сервера). + +**Синтаксис** + +``` sql +enabledProfiles() +``` + +**Возвращаемое значение** + +- Список доступных профилей для текущего пользователя. + +Тип: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). + +## defaultProfiles {#default-profiles} + +Возвращает все профили, указанные при объявлении текущего пользователя (см. [CREATE USER](../../sql-reference/statements/create/user.md#create-user-statement)) + +**Синтаксис** + +``` sql +defaultProfiles() +``` + +**Возвращаемое значение** + +- Список профилей по умолчанию. + +Тип: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). + +## currentRoles {#current-roles} + +Возвращает список текущих ролей для текущего пользователя. Список ролей пользователя можно изменить с помощью выражения [SET ROLE](../../sql-reference/statements/set-role.md#set-role-statement). Если выражение `SET ROLE` не использовалось, данная функция возвращает тот же результат, что и функция [defaultRoles](#default-roles). + +**Синтаксис** + +``` sql +currentRoles() +``` + +**Возвращаемое значение** + +- Список текущих ролей для текущего пользователя. + +Тип: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). + +## enabledRoles {#enabled-roles} + +Возвращает имена текущих ролей, а также ролей, которые разрешено использовать текущему пользователю путем назначения привилегий. + +**Синтаксис** + +``` sql +enabledRoles() +``` + +**Возвращаемое значение** + +- Список доступных ролей для текущего пользователя. + +Тип: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). + +## defaultRoles {#default-roles} + +Возвращает имена ролей, которые задаются по умолчанию для текущего пользователя при входе в систему. Изначально это все роли, которые разрешено использовать текущему пользователю (см. [GRANT](../../sql-reference/statements/grant/#grant-select)). Список ролей по умолчанию может быть изменен с помощью выражения [SET DEFAULT ROLE](../../sql-reference/statements/set-role.md#set-default-role-statement). + +**Синтаксис** + +``` sql +defaultRoles() +``` + +**Возвращаемое значение** + +- Список ролей по умолчанию. + +Тип: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). diff --git a/docs/ru/sql-reference/functions/splitting-merging-functions.md b/docs/ru/sql-reference/functions/splitting-merging-functions.md index 5a0c540cf3a..efe74dba043 100644 --- a/docs/ru/sql-reference/functions/splitting-merging-functions.md +++ b/docs/ru/sql-reference/functions/splitting-merging-functions.md @@ -146,6 +146,70 @@ SELECT splitByRegexp('', 'abcde'); └────────────────────────────┘ ``` +## splitByWhitespace(s) {#splitbywhitespaceseparator-s} + +Разбивает строку на подстроки, используя в качестве разделителей пробельные символы. + +**Синтаксис** + +``` sql +splitByWhitespace(s) +``` + +**Аргументы** + +- `s` — разбиваемая строка. [String](../../sql-reference/data-types/string.md). + +**Возвращаемые значения** + +Возвращает массив подстрок. + +Тип: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). + +**Пример** + +``` sql +SELECT splitByWhitespace(' 1! a, b. '); +``` + +``` text +┌─splitByWhitespace(' 1! a, b. ')─┐ +│ ['1!','a,','b.'] │ +└─────────────────────────────────────┘ +``` + +## splitByNonAlpha(s) {#splitbynonalphaseparator-s} + +Разбивает строку на подстроки, используя в качестве разделителей пробельные символы и символы пунктуации. + +**Синтаксис** + +``` sql +splitByNonAlpha(s) +``` + +**Аргументы** + +- `s` — разбиваемая строка. [String](../../sql-reference/data-types/string.md). + +**Возвращаемые значения** + +Возвращает массив подстрок. + +Тип: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). + +**Пример** + +``` sql +SELECT splitByNonAlpha(' 1! a, b. '); +``` + +``` text +┌─splitByNonAlpha(' 1! a, b. ')─┐ +│ ['1','a','b'] │ +└───────────────────────────────────┘ +``` + ## arrayStringConcat(arr\[, separator\]) {#arraystringconcatarr-separator} Склеивает строки, перечисленные в массиве, с разделителем separator. diff --git a/docs/ru/sql-reference/functions/string-functions.md b/docs/ru/sql-reference/functions/string-functions.md index 04af599c09a..cbda5188881 100644 --- a/docs/ru/sql-reference/functions/string-functions.md +++ b/docs/ru/sql-reference/functions/string-functions.md @@ -7,16 +7,83 @@ toc_title: "Функции для работы со строками" ## empty {#empty} -Возвращает 1 для пустой строки, и 0 для непустой строки. -Тип результата — UInt8. -Строка считается непустой, если содержит хотя бы один байт, пусть даже это пробел или нулевой байт. -Функция также работает для массивов. +Проверяет, является ли входная строка пустой. + +**Синтаксис** + +``` sql +empty(x) +``` + +Строка считается непустой, если содержит хотя бы один байт, пусть даже это пробел или нулевой байт. + +Функция также поддерживает работу с типами [Array](array-functions.md#function-empty) и [UUID](uuid-functions.md#empty). + +**Параметры** + +- `x` — Входная строка. [String](../data-types/string.md). + +**Возвращаемое значение** + +- Возвращает `1` для пустой строки и `0` — для непустой строки. + +Тип: [UInt8](../data-types/int-uint.md). + +**Пример** + +Запрос: + +```sql +SELECT notempty('text'); +``` + +Результат: + +```text +┌─empty('')─┐ +│ 1 │ +└───────────┘ +``` ## notEmpty {#notempty} -Возвращает 0 для пустой строки, и 1 для непустой строки. -Тип результата — UInt8. -Функция также работает для массивов. +Проверяет, является ли входная строка непустой. + +**Синтаксис** + +``` sql +notEmpty(x) +``` + +Строка считается непустой, если содержит хотя бы один байт, пусть даже это пробел или нулевой байт. + +Функция также поддерживает работу с типами [Array](array-functions.md#function-notempty) и [UUID](uuid-functions.md#notempty). + +**Параметры** + +- `x` — Входная строка. [String](../data-types/string.md). + +**Возвращаемое значение** + +- Возвращает `1` для непустой строки и `0` — для пустой строки. + +Тип: [UInt8](../data-types/int-uint.md). + +**Пример** + +Запрос: + +```sql +SELECT notEmpty('text'); +``` + +Результат: + +```text +┌─notEmpty('text')─┐ +│ 1 │ +└──────────────────┘ +``` ## length {#length} @@ -39,6 +106,158 @@ toc_title: "Функции для работы со строками" Возвращает длину строки в кодовых точках Unicode (не символах), при допущении, что строка содержит набор байтов, являющийся текстом в кодировке UTF-8. Если допущение не выполнено, возвращает какой-нибудь результат (не кидает исключение). Тип результата — UInt64. +## leftPad {#leftpad} + +Дополняет текущую строку слева пробелами или указанной строкой (несколько раз, если необходимо), пока результирующая строка не достигнет заданной длины. Соответствует MySQL функции `LPAD`. + +**Синтаксис** + +``` sql +leftPad('string', 'length'[, 'pad_string']) +``` + +**Параметры** + +- `string` — входная строка, которую необходимо дополнить. [String](../data-types/string.md). +- `length` — длина результирующей строки. [UInt](../data-types/int-uint.md). Если указанное значение меньше, чем длина входной строки, то входная строка возвращается как есть. +- `pad_string` — строка, используемая для дополнения входной строки. [String](../data-types/string.md). Необязательный параметр. Если не указано, то входная строка дополняется пробелами. + +**Возвращаемое значение** + +- Результирующая строка заданной длины. + +Type: [String](../data-types/string.md). + +**Пример** + +Запрос: + +``` sql +SELECT leftPad('abc', 7, '*'), leftPad('def', 7); +``` + +Результат: + +``` text +┌─leftPad('abc', 7, '*')─┬─leftPad('def', 7)─┐ +│ ****abc │ def │ +└────────────────────────┴───────────────────┘ +``` + +## leftPadUTF8 {#leftpadutf8} + +Дополняет текущую строку слева пробелами или указанной строкой (несколько раз, если необходимо), пока результирующая строка не достигнет заданной длины. Соответствует MySQL функции `LPAD`. В отличие от функции [leftPad](#leftpad), измеряет длину строки не в байтах, а в кодовых точках Unicode. + +**Синтаксис** + +``` sql +leftPadUTF8('string','length'[, 'pad_string']) +``` + +**Параметры** + +- `string` — входная строка, которую необходимо дополнить. [String](../data-types/string.md). +- `length` — длина результирующей строки. [UInt](../data-types/int-uint.md). Если указанное значение меньше, чем длина входной строки, то входная строка возвращается как есть. +- `pad_string` — строка, используемая для дополнения входной строки. [String](../data-types/string.md). Необязательный параметр. Если не указано, то входная строка дополняется пробелами. + +**Возвращаемое значение** + +- Результирующая строка заданной длины. + +Type: [String](../data-types/string.md). + +**Пример** + +Запрос: + +``` sql +SELECT leftPadUTF8('абвг', 7, '*'), leftPadUTF8('дежз', 7); +``` + +Результат: + +``` text +┌─leftPadUTF8('абвг', 7, '*')─┬─leftPadUTF8('дежз', 7)─┐ +│ ***абвг │ дежз │ +└─────────────────────────────┴────────────────────────┘ +``` + +## rightPad {#rightpad} + +Дополняет текущую строку справа пробелами или указанной строкой (несколько раз, если необходимо), пока результирующая строка не достигнет заданной длины. Соответствует MySQL функции `RPAD`. + +**Синтаксис** + +``` sql +rightPad('string', 'length'[, 'pad_string']) +``` + +**Параметры** + +- `string` — входная строка, которую необходимо дополнить. [String](../data-types/string.md). +- `length` — длина результирующей строки. [UInt](../data-types/int-uint.md). Если указанное значение меньше, чем длина входной строки, то входная строка возвращается как есть. +- `pad_string` — строка, используемая для дополнения входной строки. [String](../data-types/string.md). Необязательный параметр. Если не указано, то входная строка дополняется пробелами. + +**Возвращаемое значение** + +- Результирующая строка заданной длины. + +Type: [String](../data-types/string.md). + +**Пример** + +Запрос: + +``` sql +SELECT rightPad('abc', 7, '*'), rightPad('abc', 7); +``` + +Результат: + +``` text +┌─rightPad('abc', 7, '*')─┬─rightPad('abc', 7)─┐ +│ abc**** │ abc │ +└─────────────────────────┴────────────────────┘ +``` + +## rightPadUTF8 {#rightpadutf8} + +Дополняет текущую строку слева пробелами или указанной строкой (несколько раз, если необходимо), пока результирующая строка не достигнет заданной длины. Соответствует MySQL функции `RPAD`. В отличие от функции [rightPad](#rightpad), измеряет длину строки не в байтах, а в кодовых точках Unicode. + +**Синтаксис** + +``` sql +rightPadUTF8('string','length'[, 'pad_string']) +``` + +**Параметры** + +- `string` — входная строка, которую необходимо дополнить. [String](../data-types/string.md). +- `length` — длина результирующей строки. [UInt](../data-types/int-uint.md). Если указанное значение меньше, чем длина входной строки, то входная строка возвращается как есть. +- `pad_string` — строка, используемая для дополнения входной строки. [String](../data-types/string.md). Необязательный параметр. Если не указано, то входная строка дополняется пробелами. + +**Возвращаемое значение** + +- Результирующая строка заданной длины. + +Type: [String](../data-types/string.md). + +**Пример** + +Запрос: + +``` sql +SELECT rightPadUTF8('абвг', 7, '*'), rightPadUTF8('абвг', 7); +``` + +Результат: + +``` text +┌─rightPadUTF8('абвг', 7, '*')─┬─rightPadUTF8('абвг', 7)─┐ +│ абвг*** │ абвг │ +└──────────────────────────────┴─────────────────────────┘ +``` + ## lower, lcase {#lower} Переводит ASCII-символы латиницы в строке в нижний регистр. @@ -500,7 +719,7 @@ SELECT trimBoth(' Hello, world! '); normalizeQuery(x) ``` -**Аргументы** +**Аргументы** - `x` — последовательность символов. [String](../../sql-reference/data-types/string.md). @@ -530,13 +749,13 @@ SELECT normalizeQuery('[1, 2, 3, x]') AS query; Возвращает идентичные 64-битные хэш - суммы без значений литералов для аналогичных запросов. Это помогает анализировать журнал запросов. -**Синтаксис** +**Синтаксис** ``` sql normalizedQueryHash(x) ``` -**Аргументы** +**Аргументы** - `x` — последовательность символов. [String](../../sql-reference/data-types/string.md). @@ -568,13 +787,13 @@ SELECT normalizedQueryHash('SELECT 1 AS `xyz`') != normalizedQueryHash('SELECT 1 Экранируются символы, которые в формате XML являются зарезервированными (служебными): `<`, `&`, `>`, `"`, `'`. -**Синтаксис** +**Синтаксис** ``` sql encodeXMLComponent(x) ``` -**Аргументы** +**Аргументы** - `x` — последовательность символов. [String](../../sql-reference/data-types/string.md). @@ -637,7 +856,7 @@ SELECT decodeXMLComponent('< Σ >'); Результат: ``` text -'foo' +'foo' < Σ > ``` @@ -679,7 +898,7 @@ extractTextFromHTML(x) **Аргументы** -- `x` — текст для обработки. [String](../../sql-reference/data-types/string.md). +- `x` — текст для обработки. [String](../../sql-reference/data-types/string.md). **Возвращаемое значение** diff --git a/docs/ru/sql-reference/functions/string-search-functions.md b/docs/ru/sql-reference/functions/string-search-functions.md index 2417a1c6ffd..5b6cbc68d2e 100644 --- a/docs/ru/sql-reference/functions/string-search-functions.md +++ b/docs/ru/sql-reference/functions/string-search-functions.md @@ -23,7 +23,7 @@ position(haystack, needle[, start_pos]) ``` sql position(needle IN haystack) -``` +``` Алиас: `locate(haystack, needle[, start_pos])`. @@ -93,7 +93,7 @@ SELECT 1 = position('абв' IN 'абв'); └───────────────────────────────────┘ ``` -Запрос: +Запрос: ```sql SELECT 0 = position('абв' IN ''); @@ -383,27 +383,27 @@ Result: ## extractAllGroupsHorizontal {#extractallgroups-horizontal} -Разбирает строку `haystack` на фрагменты, соответствующие группам регулярного выражения `pattern`. Возвращает массив массивов, где первый массив содержит все фрагменты, соответствующие первой группе регулярного выражения, второй массив - соответствующие второй группе, и т.д. +Разбирает строку `haystack` на фрагменты, соответствующие группам регулярного выражения `pattern`. Возвращает массив массивов, где первый массив содержит все фрагменты, соответствующие первой группе регулярного выражения, второй массив - соответствующие второй группе, и т.д. !!! note "Замечание" Функция `extractAllGroupsHorizontal` работает медленнее, чем функция [extractAllGroupsVertical](#extractallgroups-vertical). -**Синтаксис** +**Синтаксис** ``` sql extractAllGroupsHorizontal(haystack, pattern) ``` -**Аргументы** +**Аргументы** - `haystack` — строка для разбора. Тип: [String](../../sql-reference/data-types/string.md). -- `pattern` — регулярное выражение, построенное по синтаксическим правилам [re2](https://github.com/google/re2/wiki/Syntax). Выражение должно содержать группы, заключенные в круглые скобки. Если выражение не содержит групп, генерируется исключение. Тип: [String](../../sql-reference/data-types/string.md). +- `pattern` — регулярное выражение, построенное по синтаксическим правилам [re2](https://github.com/google/re2/wiki/Syntax). Выражение должно содержать группы, заключенные в круглые скобки. Если выражение не содержит групп, генерируется исключение. Тип: [String](../../sql-reference/data-types/string.md). **Возвращаемое значение** - Тип: [Array](../../sql-reference/data-types/array.md). -Если в строке `haystack` нет групп, соответствующих регулярному выражению `pattern`, возвращается массив пустых массивов. +Если в строке `haystack` нет групп, соответствующих регулярному выражению `pattern`, возвращается массив пустых массивов. **Пример** @@ -429,13 +429,13 @@ SELECT extractAllGroupsHorizontal('abc=111, def=222, ghi=333', '("[^"]+"|\\w+)=( Разбирает строку `haystack` на фрагменты, соответствующие группам регулярного выражения `pattern`. Возвращает массив массивов, где каждый массив содержит по одному фрагменту, соответствующему каждой группе регулярного выражения. Фрагменты группируются в массивы в соответствии с порядком появления в исходной строке. -**Синтаксис** +**Синтаксис** ``` sql extractAllGroupsVertical(haystack, pattern) ``` -**Аргументы** +**Аргументы** - `haystack` — строка для разбора. Тип: [String](../../sql-reference/data-types/string.md). - `pattern` — регулярное выражение, построенное по синтаксическим правилам [re2](https://github.com/google/re2/wiki/Syntax). Выражение должно содержать группы, заключенные в круглые скобки. Если выражение не содержит групп, генерируется исключение. Тип: [String](../../sql-reference/data-types/string.md). @@ -444,7 +444,7 @@ extractAllGroupsVertical(haystack, pattern) - Тип: [Array](../../sql-reference/data-types/array.md). -Если в строке `haystack` нет групп, соответствующих регулярному выражению `pattern`, возвращается пустой массив. +Если в строке `haystack` нет групп, соответствующих регулярному выражению `pattern`, возвращается пустой массив. **Пример** @@ -558,7 +558,7 @@ SELECT * FROM Months WHERE ilike(name, '%j%'); !!! note "Примечание" Для случая UTF-8 мы используем триграммное расстояние. Вычисление n-граммного расстояния не совсем честное. Мы используем 2-х байтные хэши для хэширования n-грамм, а затем вычисляем (не)симметрическую разность между хэш таблицами – могут возникнуть коллизии. В формате UTF-8 без учета регистра мы не используем честную функцию `tolower` – мы обнуляем 5-й бит (нумерация с нуля) каждого байта кодовой точки, а также первый бит нулевого байта, если байтов больше 1 – это работает для латиницы и почти для всех кириллических букв. - + ## countMatches(haystack, pattern) {#countmatcheshaystack-pattern} Возвращает количество совпадений, найденных в строке `haystack`, для регулярного выражения `pattern`. diff --git a/docs/ru/sql-reference/functions/tuple-map-functions.md b/docs/ru/sql-reference/functions/tuple-map-functions.md index 94dccb58622..4775152fb54 100644 --- a/docs/ru/sql-reference/functions/tuple-map-functions.md +++ b/docs/ru/sql-reference/functions/tuple-map-functions.md @@ -9,13 +9,13 @@ toc_title: Работа с контейнерами map Преобразовывает пары `ключ:значение` в тип данных [Map(key, value)](../../sql-reference/data-types/map.md). -**Синтаксис** +**Синтаксис** ``` sql map(key1, value1[, key2, value2, ...]) ``` -**Аргументы** +**Аргументы** - `key` — ключ. [String](../../sql-reference/data-types/string.md) или [Integer](../../sql-reference/data-types/int-uint.md). - `value` — значение. [String](../../sql-reference/data-types/string.md), [Integer](../../sql-reference/data-types/int-uint.md) или [Array](../../sql-reference/data-types/array.md). @@ -62,7 +62,7 @@ SELECT a['key2'] FROM table_map; └─────────────────────────┘ ``` -**Смотрите также** +**Смотрите также** - тип данных [Map(key, value)](../../sql-reference/data-types/map.md) @@ -70,13 +70,13 @@ SELECT a['key2'] FROM table_map; Собирает все ключи и суммирует соответствующие значения. -**Синтаксис** +**Синтаксис** ``` sql mapAdd(Tuple(Array, Array), Tuple(Array, Array) [, ...]) ``` -**Аргументы** +**Аргументы** Аргументами являются [кортежи](../../sql-reference/data-types/tuple.md#tuplet1-t2) из двух [массивов](../../sql-reference/data-types/array.md#data-type-array), где элементы в первом массиве представляют ключи, а второй массив содержит значения для каждого ключа. Все массивы ключей должны иметь один и тот же тип, а все массивы значений должны содержать элементы, которые можно приводить к одному типу ([Int64](../../sql-reference/data-types/int-uint.md#int-ranges), [UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges) или [Float64](../../sql-reference/data-types/float.md#float32-float64)). @@ -106,7 +106,7 @@ SELECT mapAdd(([toUInt8(1), 2], [1, 1]), ([toUInt8(1), 2], [1, 1])) as res, toTy Собирает все ключи и вычитает соответствующие значения. -**Синтаксис** +**Синтаксис** ``` sql mapSubtract(Tuple(Array, Array), Tuple(Array, Array) [, ...]) @@ -142,7 +142,7 @@ SELECT mapSubtract(([toUInt8(1), 2], [toInt32(1), 1]), ([toUInt8(1), 2], [toInt3 Заполняет недостающие ключи в контейнере map (пара массивов ключей и значений), где ключи являются целыми числами. Кроме того, он поддерживает указание максимального ключа, который используется для расширения массива ключей. -**Синтаксис** +**Синтаксис** ``` sql mapPopulateSeries(keys, values[, max]) @@ -187,7 +187,7 @@ select mapPopulateSeries([1,2,4], [11,22,44], 5) as res, toTypeName(res) as type mapContains(map, key) ``` -**Аргументы** +**Аргументы** - `map` — контейнер Map. [Map](../../sql-reference/data-types/map.md). - `key` — ключ. Тип соответстует типу ключей параметра `map`. diff --git a/docs/ru/sql-reference/functions/type-conversion-functions.md b/docs/ru/sql-reference/functions/type-conversion-functions.md index 8707642eb59..757afca9588 100644 --- a/docs/ru/sql-reference/functions/type-conversion-functions.md +++ b/docs/ru/sql-reference/functions/type-conversion-functions.md @@ -435,8 +435,8 @@ reinterpret(x, type) **Аргументы** -- `x` — любой тип данных. -- `type` — конечный тип данных. [String](../../sql-reference/data-types/string.md). +- `x` — любой тип данных. +- `type` — конечный тип данных. [String](../../sql-reference/data-types/string.md). **Возвращаемое значение** @@ -462,27 +462,29 @@ SELECT reinterpret(toInt8(-1), 'UInt8') as int_to_uint, ## CAST(x, T) {#type_conversion_function-cast} -Преобразует входное значение `x` в указанный тип данных `T`. В отличии от функции `reinterpret` использует внешнее представление значения `x`. - -Поддерживается также синтаксис `CAST(x AS t)`. - -!!! warning "Предупреждение" - Если значение `x` не может быть преобразовано к типу `T`, возникает переполнение. Например, `CAST(-1, 'UInt8')` возвращает 255. +Преобразует входное значение к указанному типу данных. В отличие от функции [reinterpret](#type_conversion_function-reinterpret) `CAST` пытается представить то же самое значение в новом типе данных. Если преобразование невозможно, то возникает исключение. +Поддерживается несколько вариантов синтаксиса. **Синтаксис** ``` sql CAST(x, T) +CAST(x AS t) +x::t ``` **Аргументы** -- `x` — любой тип данных. -- `T` — конечный тип данных. [String](../../sql-reference/data-types/string.md). +- `x` — значение, которое нужно преобразовать. Может быть любого типа. +- `T` — имя типа данных. [String](../../sql-reference/data-types/string.md). +- `t` — тип данных. **Возвращаемое значение** -- Значение конечного типа данных. +- Преобразованное значение. + +!!! note "Примечание" + Если входное значение выходит за границы нового типа, то результат переполняется. Например, `CAST(-1, 'UInt8')` возвращает `255`. **Примеры** @@ -491,16 +493,16 @@ CAST(x, T) ```sql SELECT CAST(toInt8(-1), 'UInt8') AS cast_int_to_uint, - CAST(toInt8(1), 'Float32') AS cast_int_to_float, - CAST('1', 'UInt32') AS cast_string_to_int + CAST(1.5 AS Decimal(3,2)) AS cast_float_to_decimal, + '1'::Int32 AS cast_string_to_int; ``` Результат: ``` -┌─cast_int_to_uint─┬─cast_int_to_float─┬─cast_string_to_int─┐ -│ 255 │ 1 │ 1 │ -└──────────────────┴───────────────────┴────────────────────┘ +┌─cast_int_to_uint─┬─cast_float_to_decimal─┬─cast_string_to_int─┐ +│ 255 │ 1.50 │ 1 │ +└──────────────────┴───────────────────────┴────────────────────┘ ``` Запрос: @@ -524,7 +526,7 @@ SELECT Преобразование в FixedString(N) работает только для аргументов типа [String](../../sql-reference/data-types/string.md) или [FixedString](../../sql-reference/data-types/fixedstring.md). -Поддерживается преобразование к типу [Nullable](../../sql-reference/functions/type-conversion-functions.md) и обратно. +Поддерживается преобразование к типу [Nullable](../../sql-reference/data-types/nullable.md) и обратно. **Примеры** @@ -573,7 +575,7 @@ SELECT toTypeName(CAST(x, 'Nullable(UInt16)')) FROM t_null; Запрос: ``` sql -SELECT cast(-1, 'UInt8') as uint8; +SELECT cast(-1, 'UInt8') as uint8; ``` Результат: @@ -1166,8 +1168,8 @@ SELECT toLowCardinality('1'); ## toUnixTimestamp64Nano {#tounixtimestamp64nano} -Преобразует значение `DateTime64` в значение `Int64` с фиксированной точностью менее одной секунды. -Входное значение округляется соответствующим образом вверх или вниз в зависимости от его точности. +Преобразует значение `DateTime64` в значение `Int64` с фиксированной точностью менее одной секунды. +Входное значение округляется соответствующим образом вверх или вниз в зависимости от его точности. !!! info "Примечание" Возвращаемое значение — это временная метка в UTC, а не в часовом поясе `DateTime64`. @@ -1203,7 +1205,7 @@ SELECT toUnixTimestamp64Milli(dt64); └──────────────────────────────┘ ``` -Запрос: +Запрос: ``` sql WITH toDateTime64('2019-09-16 19:20:12.345678910', 6) AS dt64 @@ -1262,7 +1264,7 @@ SELECT fromUnixTimestamp64Milli(i64, 'UTC'); Преобразует произвольные выражения в строку заданного формата. -**Синтаксис** +**Синтаксис** ``` sql formatRow(format, x, y, ...) @@ -1303,7 +1305,7 @@ FROM numbers(3); Преобразует произвольные выражения в строку заданного формата. При этом удаляет лишние переводы строк `\n`, если они появились. -**Синтаксис** +**Синтаксис** ``` sql formatRowNoNewline(format, x, y, ...) diff --git a/docs/ru/sql-reference/functions/url-functions.md b/docs/ru/sql-reference/functions/url-functions.md index bdf9beeabf5..87e4b1b89c1 100644 --- a/docs/ru/sql-reference/functions/url-functions.md +++ b/docs/ru/sql-reference/functions/url-functions.md @@ -267,7 +267,7 @@ SELECT firstSignificantSubdomainCustom('bar.foo.there-is-no-such-domain', 'publi Результат: -```text +```text ┌─firstSignificantSubdomainCustom('bar.foo.there-is-no-such-domain', 'public_suffix_list')─┐ │ foo │ └──────────────────────────────────────────────────────────────────────────────────────────┘ @@ -279,7 +279,7 @@ SELECT firstSignificantSubdomainCustom('bar.foo.there-is-no-such-domain', 'publi ### port(URL[, default_port = 0]) {#port} -Возвращает порт или значение `default_port`, если в URL-адресе нет порта (или передан невалидный URL) +Возвращает порт или значение `default_port`, если в URL-адресе нет порта (или передан невалидный URL) ### path {#path} diff --git a/docs/ru/sql-reference/functions/uuid-functions.md b/docs/ru/sql-reference/functions/uuid-functions.md index f0017adbc8b..0d534a2d7ce 100644 --- a/docs/ru/sql-reference/functions/uuid-functions.md +++ b/docs/ru/sql-reference/functions/uuid-functions.md @@ -35,6 +35,90 @@ SELECT * FROM t_uuid └──────────────────────────────────────┘ ``` +## empty {#empty} + +Проверяет, является ли входной UUID пустым. + +**Синтаксис** + +```sql +empty(UUID) +``` + +UUID считается пустым, если он содержит все нули (нулевой UUID). + +Функция также поддерживает работу с типами [Array](array-functions.md#function-empty) и [String](string-functions.md#empty). + +**Параметры** + +- `x` — UUID на входе функции. [UUID](../data-types/uuid.md). + +**Возвращаемое значение** + +- Возвращает `1` для пустого UUID или `0` — для непустого UUID. + +Тип: [UInt8](../data-types/int-uint.md). + +**Пример** + +Для генерации UUID-значений предназначена функция [generateUUIDv4](#uuid-function-generate). + +Запрос: + +```sql +SELECT empty(generateUUIDv4()); +``` + +Ответ: + +```text +┌─empty(generateUUIDv4())─┐ +│ 0 │ +└─────────────────────────┘ +``` + +## notEmpty {#notempty} + +Проверяет, является ли входной UUID непустым. + +**Синтаксис** + +```sql +notEmpty(UUID) +``` + +UUID считается пустым, если он содержит все нули (нулевой UUID). + +Функция также поддерживает работу с типами [Array](array-functions.md#function-notempty) и [String](string-functions.md#function-notempty). + +**Параметры** + +- `x` — UUID на входе функции. [UUID](../data-types/uuid.md). + +**Возвращаемое значение** + +- Возвращает `1` для непустого UUID или `0` — для пустого UUID. + +Тип: [UInt8](../data-types/int-uint.md). + +**Пример** + +Для генерации UUID-значений предназначена функция [generateUUIDv4](#uuid-function-generate). + +Запрос: + +```sql +SELECT notEmpty(generateUUIDv4()); +``` + +Результат: + +```text +┌─notEmpty(generateUUIDv4())─┐ +│ 1 │ +└────────────────────────────┘ +``` + ## toUUID (x) {#touuid-x} Преобразует значение типа String в тип UUID. diff --git a/docs/ru/sql-reference/operators/index.md b/docs/ru/sql-reference/operators/index.md index cfdb42f85a7..98f6873f712 100644 --- a/docs/ru/sql-reference/operators/index.md +++ b/docs/ru/sql-reference/operators/index.md @@ -192,7 +192,7 @@ SELECT now() AS current_date_time, current_date_time + INTERVAL '4' day + INTERV Вы можете изменить дату, не используя синтаксис `INTERVAL`, а просто добавив или отняв секунды, минуты и часы. Например, чтобы передвинуть дату на один день вперед, можно прибавить к ней значение `60*60*24`. !!! note "Примечание" - Синтаксис `INTERVAL` или функция `addDays` предпочтительнее для работы с датами. Сложение с числом (например, синтаксис `now() + ...`) не учитывает региональные настройки времени, например, переход на летнее время. + Синтаксис `INTERVAL` или функция `addDays` предпочтительнее для работы с датами. Сложение с числом (например, синтаксис `now() + ...`) не учитывает региональные настройки времени, например, переход на летнее время. Пример: @@ -211,17 +211,17 @@ SELECT toDateTime('2014-10-26 00:00:00', 'Europe/Moscow') AS time, time + 60 * 6 - Тип данных [Interval](../../sql-reference/operators/index.md) - Функции преобразования типов [toInterval](../../sql-reference/operators/index.md#function-tointerval) -## Оператор логического отрицания {#operator-logicheskogo-otritsaniia} +## Оператор логического "И" {#logical-and-operator} -`NOT a` - функция `not(a)` +Синтаксис `SELECT a AND b` — вычисляет логическую конъюнкцию между `a` и `b` функцией [and](../../sql-reference/functions/logical-functions.md#logical-and-function). -## Оператор логического ‘И’ {#operator-logicheskogo-i} +## Оператор логического "ИЛИ" {#logical-or-operator} -`a AND b` - функция `and(a, b)` +Синтаксис `SELECT a OR b` — вычисляет логическую дизъюнкцию между `a` и `b` функцией [or](../../sql-reference/functions/logical-functions.md#logical-or-function). -## Оператор логического ‘ИЛИ’ {#operator-logicheskogo-ili} +## Оператор логического отрицания {#logical-negation-operator} -`a OR b` - функция `or(a, b)` +Синтаксис `SELECT NOT a` — вычисляет логическое отрицание `a` функцией [not](../../sql-reference/functions/logical-functions.md#logical-not-function). ## Условный оператор {#uslovnyi-operator} diff --git a/docs/ru/sql-reference/statements/alter/column.md b/docs/ru/sql-reference/statements/alter/column.md index 158ab2e7385..9f59c79bfdd 100644 --- a/docs/ru/sql-reference/statements/alter/column.md +++ b/docs/ru/sql-reference/statements/alter/column.md @@ -5,15 +5,26 @@ toc_title: "Манипуляции со столбцами" # Манипуляции со столбцами {#manipuliatsii-so-stolbtsami} +Набор действий, позволяющих изменять структуру таблицы. + +Синтаксис: + +``` sql +ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|CLEAR|COMMENT|MODIFY COLUMN ... +``` + +В запросе можно указать сразу несколько действий над одной таблицей через запятую. +Каждое действие — это манипуляция над столбцом. + Существуют следующие действия: - [ADD COLUMN](#alter_add-column) — добавляет столбец в таблицу; - [DROP COLUMN](#alter_drop-column) — удаляет столбец; +- [RENAME COLUMN](#alter_rename-column) — переименовывает существующий столбец. - [CLEAR COLUMN](#alter_clear-column) — сбрасывает все значения в столбце для заданной партиции; - [COMMENT COLUMN](#alter_comment-column) — добавляет комментарий к столбцу; - [MODIFY COLUMN](#alter_modify-column) — изменяет тип столбца, выражение для значения по умолчанию и TTL. - [MODIFY COLUMN REMOVE](#modify-remove) — удаляет какое-либо из свойств столбца. -- [RENAME COLUMN](#alter_rename-column) — переименовывает существующий столбец. Подробное описание для каждого действия приведено ниже. @@ -72,6 +83,22 @@ DROP COLUMN [IF EXISTS] name ALTER TABLE visits DROP COLUMN browser ``` +## RENAME COLUMN {#alter_rename-column} + +``` sql +RENAME COLUMN [IF EXISTS] name to new_name +``` + +Переименовывает столбец `name` в `new_name`. Если указано выражение `IF EXISTS`, то запрос не будет возвращать ошибку при условии, что столбец `name` не существует. Поскольку переименование не затрагивает физические данные колонки, запрос выполняется практически мгновенно. + +**ЗАМЕЧЕНИЕ**: Столбцы, являющиеся частью основного ключа или ключа сортировки (заданные с помощью `ORDER BY` или `PRIMARY KEY`), не могут быть переименованы. Попытка переименовать эти слобцы приведет к `SQL Error [524]`. + +Пример: + +``` sql +ALTER TABLE visits RENAME COLUMN webBrowser TO browser +``` + ## CLEAR COLUMN {#alter_clear-column} ``` sql @@ -109,7 +136,7 @@ ALTER TABLE visits COMMENT COLUMN browser 'Столбец показывает, ## MODIFY COLUMN {#alter_modify-column} ``` sql -MODIFY COLUMN [IF EXISTS] name [type] [default_expr] [TTL] [AFTER name_after | FIRST] +MODIFY COLUMN [IF EXISTS] name [type] [default_expr] [codec] [TTL] [AFTER name_after | FIRST] ``` Запрос изменяет следующие свойства столбца `name`: @@ -118,11 +145,15 @@ MODIFY COLUMN [IF EXISTS] name [type] [default_expr] [TTL] [AFTER name_after | F - Значение по умолчанию +- Кодеки сжатия + - TTL - Примеры изменения TTL столбца смотрите в разделе [TTL столбца](../../../engines/table-engines/mergetree-family/mergetree.md#mergetree-column-ttl). +Примеры изменения кодеков сжатия смотрите в разделе [Кодеки сжатия столбцов](../create/table.md#codecs). -Если указано `IF EXISTS`, запрос не возвращает ошибку, если столбца не существует. +Примеры изменения TTL столбца смотрите в разделе [TTL столбца](../../../engines/table-engines/mergetree-family/mergetree.md#mergetree-column-ttl). + +Если указано `IF EXISTS`, запрос не возвращает ошибку при условии, что столбец не существует. Запрос также может изменять порядок столбцов при помощи `FIRST | AFTER`, смотрите описание [ADD COLUMN](#alter_add-column). @@ -162,22 +193,6 @@ ALTER TABLE table_with_ttl MODIFY COLUMN column_ttl REMOVE TTL; - [REMOVE TTL](ttl.md). -## RENAME COLUMN {#alter_rename-column} - -Переименовывает существующий столбец. - -Синтаксис: - -```sql -ALTER TABLE table_name RENAME COLUMN column_name TO new_column_name -``` - -**Пример** - -```sql -ALTER TABLE table_with_ttl RENAME COLUMN column_ttl TO column_ttl_new; -``` - ## Ограничения запроса ALTER {#ogranicheniia-zaprosa-alter} Запрос `ALTER` позволяет создавать и удалять отдельные элементы (столбцы) вложенных структур данных, но не вложенные структуры данных целиком. Для добавления вложенной структуры данных, вы можете добавить столбцы с именем вида `name.nested_name` и типом `Array(T)` - вложенная структура данных полностью эквивалентна нескольким столбцам-массивам с именем, имеющим одинаковый префикс до точки. @@ -186,7 +201,6 @@ ALTER TABLE table_with_ttl RENAME COLUMN column_ttl TO column_ttl_new; Если возможностей запроса `ALTER` не хватает для нужного изменения таблицы, вы можете создать новую таблицу, скопировать туда данные с помощью запроса [INSERT SELECT](../insert-into.md#insert_query_insert-select), затем поменять таблицы местами с помощью запроса [RENAME](../misc.md#misc_operations-rename), и удалить старую таблицу. В качестве альтернативы для запроса `INSERT SELECT`, можно использовать инструмент [clickhouse-copier](../../../sql-reference/statements/alter/index.md). -Запрос `ALTER` блокирует все чтения и записи для таблицы. То есть, если на момент запроса `ALTER`, выполнялся долгий `SELECT`, то запрос `ALTER` сначала дождётся его выполнения. И в это время, все новые запросы к той же таблице, будут ждать, пока завершится этот `ALTER`. +Запрос `ALTER` блокирует все чтения и записи для таблицы. То есть если на момент запроса `ALTER` выполнялся долгий `SELECT`, то запрос `ALTER` сначала дождётся его выполнения. И в это время все новые запросы к той же таблице будут ждать, пока завершится этот `ALTER`. Для таблиц, которые не хранят данные самостоятельно (типа [Merge](../../../sql-reference/statements/alter/index.md) и [Distributed](../../../sql-reference/statements/alter/index.md)), `ALTER` всего лишь меняет структуру таблицы, но не меняет структуру подчинённых таблиц. Для примера, при ALTER-е таблицы типа `Distributed`, вам также потребуется выполнить запрос `ALTER` для таблиц на всех удалённых серверах. - diff --git a/docs/ru/sql-reference/statements/alter/index.md b/docs/ru/sql-reference/statements/alter/index.md index 648fb7e7c5c..043ac3839d9 100644 --- a/docs/ru/sql-reference/statements/alter/index.md +++ b/docs/ru/sql-reference/statements/alter/index.md @@ -67,5 +67,5 @@ ALTER TABLE [db.]table MATERIALIZE INDEX name IN PARTITION partition_name Для запросов `ALTER ... ATTACH|DETACH|DROP` можно настроить ожидание, с помощью настройки `replication_alter_partitions_sync`. Возможные значения: `0` - не ждать, `1` - ждать выполнения только у себя (по умолчанию), `2` - ждать всех. -Для запросов `ALTER TABLE ... UPDATE|DELETE` синхронность выполнения определяется настройкой [mutations_sync](../../../operations/settings/settings.md#mutations_sync). +Для запросов `ALTER TABLE ... UPDATE|DELETE` синхронность выполнения определяется настройкой [mutations_sync](../../../operations/settings/settings.md#mutations_sync). diff --git a/docs/ru/sql-reference/statements/alter/partition.md b/docs/ru/sql-reference/statements/alter/partition.md index 0a485c7b591..f875103a498 100644 --- a/docs/ru/sql-reference/statements/alter/partition.md +++ b/docs/ru/sql-reference/statements/alter/partition.md @@ -17,7 +17,7 @@ toc_title: PARTITION - [CLEAR INDEX IN PARTITION](#alter_clear-index-partition) — очистить построенные вторичные индексы для заданной партиции; - [FREEZE PARTITION](#alter_freeze-partition) — создать резервную копию партиции; - [UNFREEZE PARTITION](#alter_unfreeze-partition) — удалить резервную копию партиции; -- [FETCH PARTITION](#alter_fetch-partition) — скачать партицию с другого сервера; +- [FETCH PARTITION\|PART](#alter_fetch-partition) — скачать партицию/кусок с другого сервера; - [MOVE PARTITION\|PART](#alter_move-partition) — переместить партицию/кускок на другой диск или том. - [UPDATE IN PARTITION](#update-in-partition) — обновить данные внутри партиции по условию. - [DELETE IN PARTITION](#delete-in-partition) — удалить данные внутри партиции по условию. @@ -209,29 +209,35 @@ ALTER TABLE 'table_name' UNFREEZE [PARTITION 'part_expr'] WITH NAME 'backup_name Удаляет с диска "замороженные" партиции с указанным именем. Если секция `PARTITION` опущена, запрос удаляет резервную копию всех партиций сразу. -## FETCH PARTITION {#alter_fetch-partition} +## FETCH PARTITION\|PART {#alter_fetch-partition} ``` sql -ALTER TABLE table_name FETCH PARTITION partition_expr FROM 'path-in-zookeeper' +ALTER TABLE table_name FETCH PARTITION|PART partition_expr FROM 'path-in-zookeeper' ``` Загружает партицию с другого сервера. Этот запрос работает только для реплицированных таблиц. Запрос выполняет следующее: -1. Загружает партицию с указанного шарда. Путь к шарду задается в секции `FROM` (‘path-in-zookeeper’). Обратите внимание, нужно задавать путь к шарду в ZooKeeper. +1. Загружает партицию/кусок с указанного шарда. Путь к шарду задается в секции `FROM` (‘path-in-zookeeper’). Обратите внимание, нужно задавать путь к шарду в ZooKeeper. 2. Помещает загруженные данные в директорию `detached` таблицы `table_name`. Чтобы прикрепить эти данные к таблице, используйте запрос [ATTACH PARTITION\|PART](#alter_attach-partition). Например: +1. FETCH PARTITION ``` sql ALTER TABLE users FETCH PARTITION 201902 FROM '/clickhouse/tables/01-01/visits'; ALTER TABLE users ATTACH PARTITION 201902; ``` +2. FETCH PART +``` sql +ALTER TABLE users FETCH PART 201901_2_2_0 FROM '/clickhouse/tables/01-01/visits'; +ALTER TABLE users ATTACH PART 201901_2_2_0; +``` Следует иметь в виду: -- Запрос `ALTER TABLE t FETCH PARTITION` не реплицируется. Он загружает партицию в директорию `detached` только на локальном сервере. +- Запрос `ALTER TABLE t FETCH PARTITION|PART` не реплицируется. Он загружает партицию в директорию `detached` только на локальном сервере. - Запрос `ALTER TABLE t ATTACH` реплицируется — он добавляет данные в таблицу сразу на всех репликах. На одной из реплик данные будут добавлены из директории `detached`, а на других — из соседних реплик. Перед загрузкой данных система проверяет, существует ли партиция и совпадает ли её структура со структурой таблицы. При этом автоматически выбирается наиболее актуальная реплика среди всех живых реплик. diff --git a/docs/ru/sql-reference/statements/alter/projection.md b/docs/ru/sql-reference/statements/alter/projection.md new file mode 100644 index 00000000000..db116963aa6 --- /dev/null +++ b/docs/ru/sql-reference/statements/alter/projection.md @@ -0,0 +1,23 @@ +--- +toc_priority: 49 +toc_title: PROJECTION +--- + +# Манипуляции с проекциями {#manipulations-with-projections} + +Доступны следующие операции: + +- `ALTER TABLE [db].name ADD PROJECTION name AS SELECT [GROUP BY] [ORDER BY]` — добавляет описание проекции в метаданные. + +- `ALTER TABLE [db].name DROP PROJECTION name` — удаляет описание проекции из метаданных и удаляет файлы проекции с диска. + +- `ALTER TABLE [db.]table MATERIALIZE PROJECTION name IN PARTITION partition_name` — перестраивает проекцию в указанной партиции. Реализовано как [мутация](../../../sql-reference/statements/alter/index.md#mutations). + +- `ALTER TABLE [db.]table CLEAR PROJECTION name IN PARTITION partition_name` — удаляет файлы проекции с диска без удаления описания. + +Комманды ADD, DROP и CLEAR — легковесны, поскольку они только меняют метаданные или удаляют файлы. + +Также команды реплицируются, синхронизируя описания проекций в метаданных с помощью ZooKeeper. + +!!! note "Note" + Манипуляции с проекциями поддерживаются только для таблиц с движком [`*MergeTree`](../../../engines/table-engines/mergetree-family/mergetree.md) (включая [replicated](../../../engines/table-engines/mergetree-family/replication.md) варианты). diff --git a/docs/ru/sql-reference/statements/alter/role.md b/docs/ru/sql-reference/statements/alter/role.md index e9ce62c58d5..73f13b005a7 100644 --- a/docs/ru/sql-reference/statements/alter/role.md +++ b/docs/ru/sql-reference/statements/alter/role.md @@ -10,7 +10,7 @@ toc_title: ROLE Синтаксис: ``` sql -ALTER ROLE [IF EXISTS] name1 [ON CLUSTER cluster_name1] [RENAME TO new_name1] +ALTER ROLE [IF EXISTS] name1 [ON CLUSTER cluster_name1] [RENAME TO new_name1] [, name2 [ON CLUSTER cluster_name2] [RENAME TO new_name2] ...] [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | PROFILE 'profile_name'] [,...] ``` diff --git a/docs/ru/sql-reference/statements/alter/row-policy.md b/docs/ru/sql-reference/statements/alter/row-policy.md index cff4d4e497a..63214f89e12 100644 --- a/docs/ru/sql-reference/statements/alter/row-policy.md +++ b/docs/ru/sql-reference/statements/alter/row-policy.md @@ -10,7 +10,7 @@ toc_title: ROW POLICY Синтаксис: ``` sql -ALTER [ROW] POLICY [IF EXISTS] name1 [ON CLUSTER cluster_name1] ON [database1.]table1 [RENAME TO new_name1] +ALTER [ROW] POLICY [IF EXISTS] name1 [ON CLUSTER cluster_name1] ON [database1.]table1 [RENAME TO new_name1] [, name2 [ON CLUSTER cluster_name2] ON [database2.]table2 [RENAME TO new_name2] ...] [AS {PERMISSIVE | RESTRICTIVE}] [FOR SELECT] diff --git a/docs/ru/sql-reference/statements/alter/setting.md b/docs/ru/sql-reference/statements/alter/setting.md new file mode 100644 index 00000000000..1378bdf5cf8 --- /dev/null +++ b/docs/ru/sql-reference/statements/alter/setting.md @@ -0,0 +1,60 @@ +--- +toc_priority: 38 +toc_title: SETTING +--- + +# Изменение настроек таблицы {#table_settings_manipulations} + +Существуют запросы, которые изменяют настройки таблицы или сбрасывают их в значения по умолчанию. В одном запросе можно изменить сразу несколько настроек. +Если настройка с указанным именем не существует, то генерируется исключение. + +**Синтаксис** + +``` sql +ALTER TABLE [db].name [ON CLUSTER cluster] MODIFY|RESET SETTING ... +``` + +!!! note "Примечание" + Эти запросы могут применяться только к таблицам на движке [MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md). + + +## MODIFY SETTING {#alter_modify_setting} + +Изменяет настройки таблицы. + +**Синтаксис** + +```sql +MODIFY SETTING setting_name=value [, ...] +``` + +**Пример** + +```sql +CREATE TABLE example_table (id UInt32, data String) ENGINE=MergeTree() ORDER BY id; + +ALTER TABLE example_table MODIFY SETTING max_part_loading_threads=8, max_parts_in_total=50000; +``` + +## RESET SETTING {#alter_reset_setting} + +Сбрасывает настройки таблицы в значения по умолчанию. Если настройка уже находится в состоянии по умолчанию, то никакие действия не выполняются. + +**Синтаксис** + +```sql +RESET SETTING setting_name [, ...] +``` + +**Пример** + +```sql +CREATE TABLE example_table (id UInt32, data String) ENGINE=MergeTree() ORDER BY id + SETTINGS max_part_loading_threads=8; + +ALTER TABLE example_table RESET SETTING max_part_loading_threads; +``` + +**Смотрите также** + +- [Настройки MergeTree таблиц](../../../operations/settings/merge-tree-settings.md) diff --git a/docs/ru/sql-reference/statements/alter/user.md b/docs/ru/sql-reference/statements/alter/user.md index bb57c3bb328..42970982fa1 100644 --- a/docs/ru/sql-reference/statements/alter/user.md +++ b/docs/ru/sql-reference/statements/alter/user.md @@ -10,14 +10,14 @@ toc_title: USER Синтаксис: ``` sql -ALTER USER [IF EXISTS] name1 [ON CLUSTER cluster_name1] [RENAME TO new_name1] +ALTER USER [IF EXISTS] name1 [ON CLUSTER cluster_name1] [RENAME TO new_name1] [, name2 [ON CLUSTER cluster_name2] [RENAME TO new_name2] ...] [NOT IDENTIFIED | IDENTIFIED {[WITH {no_password | plaintext_password | sha256_password | sha256_hash | double_sha1_password | double_sha1_hash}] BY {'password' | 'hash'}} | {WITH ldap SERVER 'server_name'} | {WITH kerberos [REALM 'realm']}] [[ADD | DROP] HOST {LOCAL | NAME 'name' | REGEXP 'name_regexp' | IP 'address' | LIKE 'pattern'} [,...] | ANY | NONE] [DEFAULT ROLE role [,...] | ALL | ALL EXCEPT role [,...] ] [GRANTEES {user | role | ANY | NONE} [,...] [EXCEPT {user | role} [,...]]] [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY | WRITABLE] | PROFILE 'profile_name'] [,...] -``` +``` Для выполнения `ALTER USER` необходима привилегия [ALTER USER](../grant.md#grant-access-management). diff --git a/docs/ru/sql-reference/statements/attach.md b/docs/ru/sql-reference/statements/attach.md index b135507b818..fab469ec6c8 100644 --- a/docs/ru/sql-reference/statements/attach.md +++ b/docs/ru/sql-reference/statements/attach.md @@ -3,16 +3,23 @@ toc_priority: 40 toc_title: ATTACH --- -# ATTACH Statement {#attach} +# ATTACH {#attach} -Выполняет подключение таблицы, например, при перемещении базы данных на другой сервер. +Выполняет подключение таблицы или словаря, например, при перемещении базы данных на другой сервер. -Запрос не создаёт данные на диске, а предполагает, что данные уже лежат в соответствующих местах, и всего лишь добавляет информацию о таблице на сервер. После выполнения запроса `ATTACH` сервер будет знать о существовании таблицы. +**Синтаксис** + +``` sql +ATTACH TABLE|DICTIONARY [IF NOT EXISTS] [db.]name [ON CLUSTER cluster] ... +``` + +Запрос не создаёт данные на диске, а предполагает, что данные уже лежат в соответствующих местах, и всего лишь добавляет информацию о таблице или словаре на сервер. После выполнения запроса `ATTACH` сервер будет знать о существовании таблицы или словаря. Если таблица перед этим была отключена при помощи ([DETACH](../../sql-reference/statements/detach.md)), т.е. её структура известна, можно использовать сокращенную форму записи без определения структуры. -## Варианты синтаксиса {#syntax-forms} -### Присоединение существующей таблицы {#attach-existing-table} +## Присоединение существующей таблицы {#attach-existing-table} + +**Синтаксис** ``` sql ATTACH TABLE [IF NOT EXISTS] [db.]name [ON CLUSTER cluster] @@ -22,16 +29,18 @@ ATTACH TABLE [IF NOT EXISTS] [db.]name [ON CLUSTER cluster] Если таблица была отключена перманентно, она не будет подключена обратно во время старта сервера, так что нужно явно использовать запрос `ATTACH`, чтобы подключить ее. -### Создание новой таблицы и присоединение данных {#create-new-table-and-attach-data} +## Создание новой таблицы и присоединение данных {#create-new-table-and-attach-data} -**С указанием пути к табличным данным** +### С указанием пути к табличным данным {#attach-with-specified-path} + +Запрос создает новую таблицу с указанной структурой и присоединяет табличные данные из соответствующего каталога в `user_files`. + +**Синтаксис** ```sql ATTACH TABLE name FROM 'path/to/data/' (col1 Type1, ...) ``` -Cоздает новую таблицу с указанной структурой и присоединяет табличные данные из соответствующего каталога в `user_files`. - **Пример** Запрос: @@ -50,10 +59,23 @@ SELECT * FROM test; └──────┴────┘ ``` -**С указанием UUID таблицы** (Только для баз данных `Atomic`) +### С указанием UUID таблицы {#attach-with-specified-uuid} + +Этот запрос создает новую таблицу с указанной структурой и присоединяет данные из таблицы с указанным UUID. +Запрос поддерживается только движком баз данных [Atomic](../../engines/database-engines/atomic.md). + +**Синтаксис** ```sql ATTACH TABLE name UUID '' (col1 Type1, ...) ``` -Cоздает новую таблицу с указанной структурой и присоединяет данные из таблицы с указанным UUID. +## Присоединение существующего словаря {#attach-existing-dictionary} + +Присоединяет ранее отключенный словарь. + +**Синтаксис** + +``` sql +ATTACH DICTIONARY [IF NOT EXISTS] [db.]name [ON CLUSTER cluster] +``` diff --git a/docs/ru/sql-reference/statements/check-table.md b/docs/ru/sql-reference/statements/check-table.md index 9592c1a5bc2..87330d75383 100644 --- a/docs/ru/sql-reference/statements/check-table.md +++ b/docs/ru/sql-reference/statements/check-table.md @@ -31,7 +31,7 @@ CHECK TABLE [db.]name ## Проверка таблиц семейства MergeTree {#checking-mergetree-tables} -Для таблиц семейства `MergeTree` если [check_query_single_value_result](../../operations/settings/settings.md#check_query_single_value_result) = 0, запрос `CHECK TABLE` возвращает статус каждого куска данных таблицы на локальном сервере. +Для таблиц семейства `MergeTree` если [check_query_single_value_result](../../operations/settings/settings.md#check_query_single_value_result) = 0, запрос `CHECK TABLE` возвращает статус каждого куска данных таблицы на локальном сервере. ```sql SET check_query_single_value_result = 0; diff --git a/docs/ru/sql-reference/statements/create/row-policy.md b/docs/ru/sql-reference/statements/create/row-policy.md index 6fe1dc45815..8f32c916309 100644 --- a/docs/ru/sql-reference/statements/create/row-policy.md +++ b/docs/ru/sql-reference/statements/create/row-policy.md @@ -10,8 +10,8 @@ toc_title: "Политика доступа" Синтаксис: ``` sql -CREATE [ROW] POLICY [IF NOT EXISTS | OR REPLACE] policy_name1 [ON CLUSTER cluster_name1] ON [db1.]table1 - [, policy_name2 [ON CLUSTER cluster_name2] ON [db2.]table2 ...] +CREATE [ROW] POLICY [IF NOT EXISTS | OR REPLACE] policy_name1 [ON CLUSTER cluster_name1] ON [db1.]table1 + [, policy_name2 [ON CLUSTER cluster_name2] ON [db2.]table2 ...] [AS {PERMISSIVE | RESTRICTIVE}] [FOR SELECT] USING condition [TO {role [,...] | ALL | ALL EXCEPT role [,...]}] @@ -33,7 +33,7 @@ CREATE [ROW] POLICY [IF NOT EXISTS | OR REPLACE] policy_name1 [ON CLUSTER cluste `CREATE ROW POLICY pol1 ON mydb.table1 USING b=1 TO mira, peter` запретит пользователям `mira` и `peter` видеть строки с `b != 1`, и еще запретит всем остальным пользователям (например, пользователю `paul`) видеть какие-либо строки вообще из таблицы `mydb.table1`. - + Если это нежелательно, такое поведение можно исправить, определив дополнительную политику: `CREATE ROW POLICY pol2 ON mydb.table1 USING 1 TO ALL EXCEPT mira, peter` diff --git a/docs/ru/sql-reference/statements/create/settings-profile.md b/docs/ru/sql-reference/statements/create/settings-profile.md index 522caf04c80..5d5b47f2efa 100644 --- a/docs/ru/sql-reference/statements/create/settings-profile.md +++ b/docs/ru/sql-reference/statements/create/settings-profile.md @@ -10,7 +10,7 @@ toc_title: "Профиль настроек" Синтаксис: ``` sql -CREATE SETTINGS PROFILE [IF NOT EXISTS | OR REPLACE] TO name1 [ON CLUSTER cluster_name1] +CREATE SETTINGS PROFILE [IF NOT EXISTS | OR REPLACE] TO name1 [ON CLUSTER cluster_name1] [, name2 [ON CLUSTER cluster_name2] ...] [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | INHERIT 'profile_name'] [,...] ``` diff --git a/docs/ru/sql-reference/statements/create/table.md b/docs/ru/sql-reference/statements/create/table.md index 1d65d82b24c..073cd4fa7c1 100644 --- a/docs/ru/sql-reference/statements/create/table.md +++ b/docs/ru/sql-reference/statements/create/table.md @@ -74,7 +74,7 @@ SELECT x, toTypeName(x) FROM t1; ## Модификатор NULL или NOT NULL {#null-modifiers} -Модификатор `NULL` или `NOT NULL`, указанный после типа данных в определении столбца, позволяет или не позволяет типу данных быть [Nullable](../../../sql-reference/data-types/nullable.md#data_type-nullable). +Модификатор `NULL` или `NOT NULL`, указанный после типа данных в определении столбца, позволяет или не позволяет типу данных быть [Nullable](../../../sql-reference/data-types/nullable.md#data_type-nullable). Если тип не `Nullable` и указан модификатор `NULL`, то столбец будет иметь тип `Nullable`; если `NOT NULL`, то не `Nullable`. Например, `INT NULL` то же, что и `Nullable(INT)`. Если тип `Nullable` и указаны модификаторы `NULL` или `NOT NULL`, то будет вызвано исключение. @@ -129,11 +129,11 @@ SELECT x, toTypeName(x) FROM t1; - в списке столбцов: ``` sql -CREATE TABLE db.table_name -( - name1 type1, name2 type2, ..., +CREATE TABLE db.table_name +( + name1 type1, name2 type2, ..., PRIMARY KEY(expr1[, expr2,...])] -) +) ENGINE = engine; ``` @@ -141,9 +141,9 @@ ENGINE = engine; ``` sql CREATE TABLE db.table_name -( +( name1 type1, name2 type2, ... -) +) ENGINE = engine PRIMARY KEY(expr1[, expr2,...]); ``` @@ -183,7 +183,7 @@ CREATE TABLE codec_example dt Date CODEC(ZSTD), ts DateTime CODEC(LZ4HC), float_value Float32 CODEC(NONE), - double_value Float64 CODEC(LZ4HC(9)) + double_value Float64 CODEC(LZ4HC(9)), value Float32 CODEC(Delta, ZSTD) ) ENGINE = @@ -199,7 +199,7 @@ ENGINE = ALTER TABLE codec_example MODIFY COLUMN float_value CODEC(Default); ``` -Кодеки можно последовательно комбинировать, например, `CODEC(Delta, Default)`. +Кодеки можно последовательно комбинировать, например, `CODEC(Delta, Default)`. Чтобы выбрать наиболее подходящую для вашего проекта комбинацию кодеков, необходимо провести сравнительные тесты, подобные тем, что описаны в статье Altinity [New Encodings to Improve ClickHouse Efficiency](https://www.altinity.com/blog/2019/7/new-encodings-to-improve-clickhouse). Для столбцов типа `ALIAS` кодеки не применяются. @@ -352,7 +352,7 @@ SELECT * FROM base.t1; !!!note "Замечание" Комментарий поддерживается для всех движков таблиц, кроме [Kafka](../../../engines/table-engines/integrations/kafka.md), [RabbitMQ](../../../engines/table-engines/integrations/rabbitmq.md) и [EmbeddedRocksDB](../../../engines/table-engines/integrations/embedded-rocksdb.md). - + **Синтаксис** ``` sql @@ -363,7 +363,7 @@ CREATE TABLE db.table_name ENGINE = engine COMMENT 'Comment' ``` - + **Пример** Запрос: diff --git a/docs/ru/sql-reference/statements/create/user.md b/docs/ru/sql-reference/statements/create/user.md index ea64bff061b..22efaa71bfc 100644 --- a/docs/ru/sql-reference/statements/create/user.md +++ b/docs/ru/sql-reference/statements/create/user.md @@ -10,7 +10,7 @@ toc_title: "Пользователь" Синтаксис: ``` sql -CREATE USER [IF NOT EXISTS | OR REPLACE] name1 [ON CLUSTER cluster_name1] +CREATE USER [IF NOT EXISTS | OR REPLACE] name1 [ON CLUSTER cluster_name1] [, name2 [ON CLUSTER cluster_name2] ...] [NOT IDENTIFIED | IDENTIFIED {[WITH {no_password | plaintext_password | sha256_password | sha256_hash | double_sha1_password | double_sha1_hash}] BY {'password' | 'hash'}} | {WITH ldap SERVER 'server_name'} | {WITH kerberos [REALM 'realm']}] [HOST {LOCAL | NAME 'name' | REGEXP 'name_regexp' | IP 'address' | LIKE 'pattern'} [,...] | ANY | NONE] @@ -53,7 +53,7 @@ CREATE USER [IF NOT EXISTS | OR REPLACE] name1 [ON CLUSTER cluster_name1] !!! info "Внимание" ClickHouse трактует конструкцию `user_name@'address'` как имя пользователя целиком. То есть технически вы можете создать несколько пользователей с одинаковыми `user_name`, но разными частями конструкции после `@`, но лучше так не делать. - + ## Секция GRANTEES {#grantees} Указываются пользователи или роли, которым разрешено получать [привилегии](../../../sql-reference/statements/grant.md#grant-privileges) от создаваемого пользователя при условии, что этому пользователю также предоставлен весь необходимый доступ с использованием [GRANT OPTION](../../../sql-reference/statements/grant.md#grant-privigele-syntax). Параметры секции `GRANTEES`: diff --git a/docs/ru/sql-reference/statements/create/view.md b/docs/ru/sql-reference/statements/create/view.md index 4e34b5e3b6e..0be29b12aea 100644 --- a/docs/ru/sql-reference/statements/create/view.md +++ b/docs/ru/sql-reference/statements/create/view.md @@ -57,7 +57,7 @@ CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db.]table_name [ON CLUSTER] [TO[db.]na Недоработано выполнение запросов `ALTER` над материализованными представлениями, поэтому они могут быть неудобными для использования. Если материализованное представление использует конструкцию `TO [db.]name`, то можно выполнить `DETACH` представления, `ALTER` для целевой таблицы и последующий `ATTACH` ранее отсоединенного (`DETACH`) представления. Обратите внимание, что работа материализованного представления находится под влиянием настройки [optimize_on_insert](../../../operations/settings/settings.md#optimize-on-insert). Перед вставкой данных в таблицу происходит их слияние. - + Представления выглядят так же, как обычные таблицы. Например, они перечисляются в результате запроса `SHOW TABLES`. Чтобы удалить представление, следует использовать [DROP VIEW](../../../sql-reference/statements/drop.md#drop-view). Впрочем, `DROP TABLE` тоже работает для представлений. @@ -65,8 +65,8 @@ CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db.]table_name [ON CLUSTER] [TO[db.]na ## LIVE-представления {#live-view} !!! important "Важно" - Представления `LIVE VIEW` являются экспериментальной возможностью. Их использование может повлечь потерю совместимости в будущих версиях. - Чтобы использовать `LIVE VIEW` и запросы `WATCH`, включите настройку [allow_experimental_live_view](../../../operations/settings/settings.md#allow-experimental-live-view). + Представления `LIVE VIEW` являются экспериментальной возможностью. Их использование может повлечь потерю совместимости в будущих версиях. + Чтобы использовать `LIVE VIEW` и запросы `WATCH`, включите настройку [allow_experimental_live_view](../../../operations/settings/settings.md#allow-experimental-live-view). ```sql CREATE LIVE VIEW [IF NOT EXISTS] [db.]table_name [WITH [TIMEOUT [value_in_sec] [AND]] [REFRESH [value_in_sec]]] AS SELECT ... @@ -154,7 +154,7 @@ SELECT * FROM [db.]live_view WHERE ... ### Секция WITH TIMEOUT {#live-view-with-timeout} -LIVE-представление, созданное с параметром `WITH TIMEOUT`, будет автоматически удалено через определенное количество секунд с момента предыдущего запроса [WATCH](../../../sql-reference/statements/watch.md), примененного к данному LIVE-представлению. +LIVE-представление, созданное с параметром `WITH TIMEOUT`, будет автоматически удалено через определенное количество секунд с момента предыдущего запроса [WATCH](../../../sql-reference/statements/watch.md), примененного к данному LIVE-представлению. ```sql CREATE LIVE VIEW [db.]table_name WITH TIMEOUT [value_in_sec] AS SELECT ... @@ -198,7 +198,7 @@ WATCH lv; └─────────────────────┴──────────┘ ``` -Параметры `WITH TIMEOUT` и `WITH REFRESH` можно сочетать с помощью `AND`. +Параметры `WITH TIMEOUT` и `WITH REFRESH` можно сочетать с помощью `AND`. ```sql CREATE LIVE VIEW [db.]table_name WITH TIMEOUT [value_in_sec] AND REFRESH [value_in_sec] AS SELECT ... @@ -217,7 +217,7 @@ WATCH lv; ``` ``` -Code: 60. DB::Exception: Received from localhost:9000. DB::Exception: Table default.lv doesn't exist.. +Code: 60. DB::Exception: Received from localhost:9000. DB::Exception: Table default.lv doesn't exist.. ``` ### Использование {#live-view-usage} diff --git a/docs/ru/sql-reference/statements/detach.md b/docs/ru/sql-reference/statements/detach.md index af915d38772..71b4012104b 100644 --- a/docs/ru/sql-reference/statements/detach.md +++ b/docs/ru/sql-reference/statements/detach.md @@ -5,17 +5,17 @@ toc_title: DETACH # DETACH {#detach-statement} -Заставляет сервер "забыть" о существовании таблицы или материализованного представления. +Заставляет сервер "забыть" о существовании таблицы, материализованного представления или словаря. -Синтаксис: +**Синтаксис** ``` sql -DETACH TABLE|VIEW [IF EXISTS] [db.]name [ON CLUSTER cluster] [PERMANENTLY] +DETACH TABLE|VIEW|DICTIONARY [IF EXISTS] [db.]name [ON CLUSTER cluster] [PERMANENTLY] ``` -Но ни данные, ни метаданные таблицы или материализованного представления не удаляются. При следующем запуске сервера, если не было использовано `PERMANENTLY`, сервер прочитает метаданные и снова узнает о таблице/представлении. Если таблица или представление были отключены перманентно, сервер не подключит их обратно автоматически. +Такой запрос не удаляет ни данные, ни метаданные таблицы, материализованного представления или словаря. Если отключение не было перманентным (запрос без ключевого слова `PERMANENTLY`), то при следующем запуске сервер прочитает метаданные и снова узнает о таблице/представлении/словаре. Если сущность была отключена перманентно, то сервер не подключит их обратно автоматически. -Независимо от того, каким способом таблица была отключена, ее можно подключить обратно с помощью запроса [ATTACH](../../sql-reference/statements/attach.md). Системные log таблицы также могут быть подключены обратно (к примеру `query_log`, `text_log` и др.) Другие системные таблицы не могут быть подключены обратно, но на следующем запуске сервер снова "вспомнит" об этих таблицах. +Независимо от того, каким способом таблица была отключена, ее можно подключить обратно с помощью запроса [ATTACH](../../sql-reference/statements/attach.md). Системные log таблицы также могут быть подключены обратно (к примеру, `query_log`, `text_log` и др.). Другие системные таблицы не могут быть подключены обратно, но на следующем запуске сервер снова "вспомнит" об этих таблицах. `ATTACH MATERIALIZED VIEW` не может быть использован с кратким синтаксисом (без `SELECT`), но можно подключить представление с помощью запроса `ATTACH TABLE`. @@ -67,3 +67,7 @@ Received exception from server (version 21.4.1): Code: 60. DB::Exception: Received from localhost:9000. DB::Exception: Table default.test doesn't exist. ``` +**Смотрите также** + +- [Материализованные представления](../../sql-reference/statements/create/view.md#materialized) +- [Словари](../../sql-reference/dictionaries/index.md) diff --git a/docs/ru/sql-reference/statements/exchange.md b/docs/ru/sql-reference/statements/exchange.md new file mode 100644 index 00000000000..81dea27ddb6 --- /dev/null +++ b/docs/ru/sql-reference/statements/exchange.md @@ -0,0 +1,42 @@ +--- +toc_priority: 49 +toc_title: EXCHANGE +--- + +# EXCHANGE {#exchange} + +Атомарно обменивает имена двух таблиц или словарей. +Это действие также можно выполнить с помощью запроса [RENAME](./rename.md), используя третье временное имя, но в таком случае действие неатомарно. + +!!! note "Примечание" + Запрос `EXCHANGE` поддерживается только движком баз данных [Atomic](../../engines/database-engines/atomic.md). + +**Синтаксис** + +```sql +EXCHANGE TABLES|DICTIONARIES [db0.]name_A AND [db1.]name_B +``` + +## EXCHANGE TABLES {#exchange_tables} + +Обменивает имена двух таблиц. + +**Синтаксис** + +```sql +EXCHANGE TABLES [db0.]table_A AND [db1.]table_B +``` + +## EXCHANGE DICTIONARIES {#exchange_dictionaries} + +Обменивает имена двух словарей. + +**Синтаксис** + +```sql +EXCHANGE DICTIONARIES [db0.]dict_A AND [db1.]dict_B +``` + +**Смотрите также** + +- [Словари](../../sql-reference/dictionaries/index.md) diff --git a/docs/ru/sql-reference/statements/explain.md b/docs/ru/sql-reference/statements/explain.md index c925e7030a7..7a028b31a12 100644 --- a/docs/ru/sql-reference/statements/explain.md +++ b/docs/ru/sql-reference/statements/explain.md @@ -135,7 +135,7 @@ Union !!! note "Примечание" Оценка стоимости выполнения шага и запроса не поддерживается. - + При `json = 1` шаги выполнения запроса выводятся в формате JSON. Каждый узел — это словарь, в котором всегда есть ключи `Node Type` и `Plans`. `Node Type` — это строка с именем шага. `Plans` — это массив с описаниями дочерних шагов. Другие дополнительные ключи могут быть добавлены в зависимости от типа узла и настроек. Пример: @@ -240,7 +240,7 @@ EXPLAIN json = 1, description = 0, header = 1 SELECT 1, 2 + dummy; } ] ``` - + При `indexes` = 1 добавляется ключ `Indexes`. Он содержит массив используемых индексов. Каждый индекс описывается как строка в формате JSON с ключом `Type` (`MinMax`, `Partition`, `PrimaryKey` или `Skip`) и дополнительные ключи: - `Name` — имя индекса (на данный момент используется только для индекса `Skip`). @@ -385,4 +385,32 @@ ExpressionTransform NumbersMt × 2 0 → 1 ``` +### EXPLAIN ESTIMATE {#explain-estimate} + + Отображает оценки числа строк, засечек и кусков, которые будут прочитаны при выполнении запроса. Применяется для таблиц семейства [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md#table_engines-mergetree). + +**Пример** + +Создадим таблицу: + +```sql +CREATE TABLE ttt (i Int64) ENGINE = MergeTree() ORDER BY i SETTINGS index_granularity = 16, write_final_mark = 0; +INSERT INTO ttt SELECT number FROM numbers(128); +OPTIMIZE TABLE ttt; +``` + +Запрос: + +```sql +EXPLAIN ESTIMATE SELECT * FROM ttt; +``` + +Результат: + +```text +┌─database─┬─table─┬─parts─┬─rows─┬─marks─┐ +│ default │ ttt │ 1 │ 128 │ 8 │ +└──────────┴───────┴───────┴──────┴───────┘ +``` + [Оригинальная статья](https://clickhouse.tech/docs/ru/sql-reference/statements/explain/) diff --git a/docs/ru/sql-reference/statements/grant.md b/docs/ru/sql-reference/statements/grant.md index 05ffaa22bbd..8d6605e1571 100644 --- a/docs/ru/sql-reference/statements/grant.md +++ b/docs/ru/sql-reference/statements/grant.md @@ -13,7 +13,7 @@ toc_title: GRANT ## Синтаксис присвоения привилегий {#grant-privigele-syntax} ```sql -GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION] +GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION] [WITH REPLACE OPTION] ``` - `privilege` — Тип привилегии @@ -21,18 +21,20 @@ GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.ta - `user` — Пользователь ClickHouse. `WITH GRANT OPTION` разрешает пользователю или роли выполнять запрос `GRANT`. Пользователь может выдавать только те привилегии, которые есть у него, той же или меньшей области действий. +`WITH REPLACE OPTION` заменяет все старые привилегии новыми привилегиями для `user` или `role`, Если не указано, добавьте новые привилегии для старых. ## Синтаксис назначения ролей {#assign-role-syntax} ```sql -GRANT [ON CLUSTER cluster_name] role [,...] TO {user | another_role | CURRENT_USER} [,...] [WITH ADMIN OPTION] +GRANT [ON CLUSTER cluster_name] role [,...] TO {user | another_role | CURRENT_USER} [,...] [WITH ADMIN OPTION] [WITH REPLACE OPTION] ``` - `role` — Роль пользователя ClickHouse. - `user` — Пользователь ClickHouse. `WITH ADMIN OPTION` присваивает привилегию [ADMIN OPTION](#admin-option-privilege) пользователю или роли. +`WITH REPLACE OPTION` заменяет все старые роли новыми ролями для пользователя `user` или `role`, Если не указано, добавьте новые роли в старые. ## Использование {#grant-usage} @@ -84,7 +86,7 @@ GRANT SELECT(x,y) ON db.table TO john WITH GRANT OPTION - `ALTER RENAME COLUMN` - `ALTER INDEX` - `ALTER ORDER BY` - - `ALTER SAMPLE BY` + - `ALTER SAMPLE BY` - `ALTER ADD INDEX` - `ALTER DROP INDEX` - `ALTER MATERIALIZE INDEX` @@ -183,7 +185,7 @@ GRANT SELECT(x,y) ON db.table TO john WITH GRANT OPTION Примеры того, как трактуется данная иерархия: -- Привилегия `ALTER` включает все остальные `ALTER*` привилегии. +- Привилегия `ALTER` включает все остальные `ALTER*` привилегии. - `ALTER CONSTRAINT` включает `ALTER ADD CONSTRAINT` и `ALTER DROP CONSTRAINT`. Привилегии применяются на разных уровнях. Уровень определяет синтаксис присваивания привилегии. @@ -257,7 +259,7 @@ GRANT INSERT(x,y) ON db.table TO john Разрешает выполнять запросы [ALTER](alter/index.md) в соответствии со следующей иерархией привилегий: -- `ALTER`. Уровень: `COLUMN`. +- `ALTER`. Уровень: `COLUMN`. - `ALTER TABLE`. Уровень: `GROUP` - `ALTER UPDATE`. Уровень: `COLUMN`. Алиасы: `UPDATE` - `ALTER DELETE`. Уровень: `COLUMN`. Алиасы: `DELETE` @@ -270,7 +272,7 @@ GRANT INSERT(x,y) ON db.table TO john - `ALTER RENAME COLUMN`. Уровень: `COLUMN`. Алиасы: `RENAME COLUMN` - `ALTER INDEX`. Уровень: `GROUP`. Алиасы: `INDEX` - `ALTER ORDER BY`. Уровень: `TABLE`. Алиасы: `ALTER MODIFY ORDER BY`, `MODIFY ORDER BY` - - `ALTER SAMPLE BY`. Уровень: `TABLE`. Алиасы: `ALTER MODIFY SAMPLE BY`, `MODIFY SAMPLE BY` + - `ALTER SAMPLE BY`. Уровень: `TABLE`. Алиасы: `ALTER MODIFY SAMPLE BY`, `MODIFY SAMPLE BY` - `ALTER ADD INDEX`. Уровень: `TABLE`. Алиасы: `ADD INDEX` - `ALTER DROP INDEX`. Уровень: `TABLE`. Алиасы: `DROP INDEX` - `ALTER MATERIALIZE INDEX`. Уровень: `TABLE`. Алиасы: `MATERIALIZE INDEX` @@ -282,7 +284,7 @@ GRANT INSERT(x,y) ON db.table TO john - `ALTER MATERIALIZE TTL`. Уровень: `TABLE`. Алиасы: `MATERIALIZE TTL` - `ALTER SETTINGS`. Уровень: `TABLE`. Алиасы: `ALTER SETTING`, `ALTER MODIFY SETTING`, `MODIFY SETTING` - `ALTER MOVE PARTITION`. Уровень: `TABLE`. Алиасы: `ALTER MOVE PART`, `MOVE PARTITION`, `MOVE PART` - - `ALTER FETCH PARTITION`. Уровень: `TABLE`. Алиасы: `FETCH PARTITION` + - `ALTER FETCH PARTITION`. Уровень: `TABLE`. Алиасы: `ALTER FETCH PART`, `FETCH PARTITION`, `FETCH PART` - `ALTER FREEZE PARTITION`. Уровень: `TABLE`. Алиасы: `FREEZE PARTITION` - `ALTER VIEW` Уровень: `GROUP` - `ALTER VIEW REFRESH `. Уровень: `VIEW`. Алиасы: `ALTER LIVE VIEW REFRESH`, `REFRESH VIEW` @@ -290,7 +292,7 @@ GRANT INSERT(x,y) ON db.table TO john Примеры того, как трактуется данная иерархия: -- Привилегия `ALTER` включает все остальные `ALTER*` привилегии. +- Привилегия `ALTER` включает все остальные `ALTER*` привилегии. - `ALTER CONSTRAINT` включает `ALTER ADD CONSTRAINT` и `ALTER DROP CONSTRAINT`. **Дополнительно** @@ -481,4 +483,3 @@ GRANT INSERT(x,y) ON db.table TO john ### ADMIN OPTION {#admin-option-privilege} Привилегия `ADMIN OPTION` разрешает пользователю назначать свои роли другому пользователю. - diff --git a/docs/ru/sql-reference/statements/insert-into.md b/docs/ru/sql-reference/statements/insert-into.md index 328f1023624..da9f3a11101 100644 --- a/docs/ru/sql-reference/statements/insert-into.md +++ b/docs/ru/sql-reference/statements/insert-into.md @@ -107,7 +107,7 @@ INSERT INTO [db.]table [(c1, c2, c3)] SELECT ... Для табличной функции [input()](../table-functions/input.md) после секции `SELECT` должна следовать секция `FORMAT`. -Чтобы вставить значение по умолчанию вместо `NULL` в столбец, который не позволяет хранить `NULL`, включите настройку [insert_null_as_default](../../operations/settings/settings.md#insert_null_as_default). +Чтобы вставить значение по умолчанию вместо `NULL` в столбец, который не позволяет хранить `NULL`, включите настройку [insert_null_as_default](../../operations/settings/settings.md#insert_null_as_default). ### Замечания о производительности {#zamechaniia-o-proizvoditelnosti} diff --git a/docs/ru/sql-reference/statements/optimize.md b/docs/ru/sql-reference/statements/optimize.md index 70503ec4de9..1f0c5a0ebe9 100644 --- a/docs/ru/sql-reference/statements/optimize.md +++ b/docs/ru/sql-reference/statements/optimize.md @@ -62,12 +62,12 @@ CREATE TABLE example ( materialized_value UInt32 MATERIALIZED 12345, aliased_value UInt32 ALIAS 2, PRIMARY KEY primary_key -) ENGINE=MergeTree  +) ENGINE=MergeTree PARTITION BY partition_key ORDER BY (primary_key, secondary_key); ``` ``` sql -INSERT INTO example (primary_key, secondary_key, value, partition_key) +INSERT INTO example (primary_key, secondary_key, value, partition_key) VALUES (0, 0, 0, 0), (0, 0, 0, 0), (1, 1, 2, 2), (1, 1, 2, 3), (1, 1, 3, 3); ``` ``` sql diff --git a/docs/ru/sql-reference/statements/rename.md b/docs/ru/sql-reference/statements/rename.md index b78505ce9c4..f026be304c6 100644 --- a/docs/ru/sql-reference/statements/rename.md +++ b/docs/ru/sql-reference/statements/rename.md @@ -3,20 +3,58 @@ toc_priority: 48 toc_title: RENAME --- -# RENAME Statement {#misc_operations-rename} +# RENAME {#misc_operations-rename} + +Переименовывает базы данных, таблицы или словари. Несколько сущностей могут быть переименованы в одном запросе. +Обратите внимание, что запрос `RENAME` с несколькими сущностями это неатомарная операция. Чтобы обменять имена атомарно, используйте выражение [EXCHANGE](./exchange.md). + +!!! note "Примечание" + Запрос `RENAME` поддерживается только движком баз данных [Atomic](../../engines/database-engines/atomic.md). + +**Синтаксис** + +```sql +RENAME DATABASE|TABLE|DICTIONARY name TO new_name [,...] [ON CLUSTER cluster] +``` ## RENAME DATABASE {#misc_operations-rename_database} -Переименовывает базу данных, поддерживается только для движка базы данных Atomic. -``` -RENAME DATABASE atomic_database1 TO atomic_database2 [ON CLUSTER cluster] +Переименовывает базы данных. + +**Синтаксис** + +```sql +RENAME DATABASE atomic_database1 TO atomic_database2 [,...] [ON CLUSTER cluster] ``` ## RENAME TABLE {#misc_operations-rename_table} + Переименовывает одну или несколько таблиц. +Переименовывание таблиц является лёгкой операцией. Если вы указали после `TO` другую базу данных, то таблица будет перенесена в эту базу данных. При этом директории с базами данных должны быть расположены в одной файловой системе, иначе возвращается ошибка. Если переименовывается несколько таблиц в одном запросе, то такая операция неатомарная. Она может выполнится частично, и запросы в других сессиях могут получить ошибку `Table ... doesn't exist...`. + +**Синтаксис** + ``` sql -RENAME TABLE [db11.]name11 TO [db12.]name12, [db21.]name21 TO [db22.]name22, ... [ON CLUSTER cluster] +RENAME TABLE [db1.]name1 TO [db2.]name2 [,...] [ON CLUSTER cluster] ``` -Переименовывание таблицы является лёгкой операцией. Если вы указали после `TO` другую базу данных, то таблица будет перенесена в эту базу данных. При этом, директории с базами данных должны быть расположены в одной файловой системе (иначе возвращается ошибка). В случае переименования нескольких таблиц в одном запросе — это неатомарная операция, может выполнится частично, запросы в других сессиях могут получить ошибку `Table ... doesn't exist...`. +**Пример** + +```sql +RENAME TABLE table_A TO table_A_bak, table_B TO table_B_bak; +``` + +## RENAME DICTIONARY {#rename_dictionary} + +Переименовывает один или несколько словарей. Этот запрос можно использовать для перемещения словарей между базами данных. + +**Синтаксис** + +```sql +RENAME DICTIONARY [db0.]dict_A TO [db1.]dict_B [,...] [ON CLUSTER cluster] +``` + +**Смотрите также** + +- [Словари](../../sql-reference/dictionaries/index.md) diff --git a/docs/ru/sql-reference/statements/select/distinct.md b/docs/ru/sql-reference/statements/select/distinct.md index 6616f421486..42c1df64540 100644 --- a/docs/ru/sql-reference/statements/select/distinct.md +++ b/docs/ru/sql-reference/statements/select/distinct.md @@ -6,19 +6,51 @@ toc_title: DISTINCT Если указан `SELECT DISTINCT`, то в результате запроса останутся только уникальные строки. Таким образом, из всех наборов полностью совпадающих строк в результате останется только одна строка. -## Обработк NULL {#null-processing} +Вы можете указать столбцы, по которым хотите отбирать уникальные значения: `SELECT DISTINCT ON (column1, column2,...)`. Если столбцы не указаны, то отбираются строки, в которых значения уникальны во всех столбцах. -`DISTINCT` работает с [NULL](../../syntax.md#null-literal) как-будто `NULL` — обычное значение и `NULL==NULL`. Другими словами, в результате `DISTINCT`, различные комбинации с `NULL` встретятся только один раз. Это отличается от обработки `NULL` в большинстве других контекстов. +Рассмотрим таблицу: -## Альтернативы {#alternatives} +```text +┌─a─┬─b─┬─c─┐ +│ 1 │ 1 │ 1 │ +│ 1 │ 1 │ 1 │ +│ 2 │ 2 │ 2 │ +│ 2 │ 2 │ 2 │ +│ 1 │ 1 │ 2 │ +│ 1 │ 2 │ 2 │ +└───┴───┴───┘ +``` -Такой же результат можно получить, применив секцию [GROUP BY](group-by.md) для того же набора значений, которые указан в секции `SELECT`, без использования каких-либо агрегатных функций. Но есть от `GROUP BY` несколько отличий: +Использование `DISTINCT` без указания столбцов: -- `DISTINCT` может применяться вместе с `GROUP BY`. -- Когда секция [ORDER BY](order-by.md) опущена, а секция [LIMIT](limit.md) присутствует, запрос прекращает выполнение сразу после считывания необходимого количества различных строк. -- Блоки данных выводятся по мере их обработки, не дожидаясь завершения выполнения всего запроса. +```sql +SELECT DISTINCT * FROM t1; +``` -## Примеры {#examples} +```text +┌─a─┬─b─┬─c─┐ +│ 1 │ 1 │ 1 │ +│ 2 │ 2 │ 2 │ +│ 1 │ 1 │ 2 │ +│ 1 │ 2 │ 2 │ +└───┴───┴───┘ +``` + +Использование `DISTINCT` с указанием столбцов: + +```sql +SELECT DISTINCT ON (a,b) * FROM t1; +``` + +```text +┌─a─┬─b─┬─c─┐ +│ 1 │ 1 │ 1 │ +│ 2 │ 2 │ 2 │ +│ 1 │ 2 │ 2 │ +└───┴───┴───┘ +``` + +## DISTINCT и ORDER BY {#distinct-orderby} ClickHouse поддерживает использование секций `DISTINCT` и `ORDER BY` для разных столбцов в одном запросе. Секция `DISTINCT` выполняется до секции `ORDER BY`. @@ -56,3 +88,16 @@ ClickHouse поддерживает использование секций `DIS Ряд `2, 4` был разрезан перед сортировкой. Учитывайте эту специфику при разработке запросов. + +## Обработка NULL {#null-processing} + +`DISTINCT` работает с [NULL](../../syntax.md#null-literal) как-будто `NULL` — обычное значение и `NULL==NULL`. Другими словами, в результате `DISTINCT`, различные комбинации с `NULL` встретятся только один раз. Это отличается от обработки `NULL` в большинстве других контекстов. + +## Альтернативы {#alternatives} + +Можно получить такой же результат, применив [GROUP BY](group-by.md) для того же набора значений, которые указан в секции `SELECT`, без использования каких-либо агрегатных функций. Но есть несколько отличий от `GROUP BY`: + +- `DISTINCT` может применяться вместе с `GROUP BY`. +- Когда секция [ORDER BY](order-by.md) опущена, а секция [LIMIT](limit.md) присутствует, запрос прекращает выполнение сразу после считывания необходимого количества различных строк. +- Блоки данных выводятся по мере их обработки, не дожидаясь завершения выполнения всего запроса. + diff --git a/docs/ru/sql-reference/statements/select/group-by.md b/docs/ru/sql-reference/statements/select/group-by.md index e94091f156d..2f0cabd14fb 100644 --- a/docs/ru/sql-reference/statements/select/group-by.md +++ b/docs/ru/sql-reference/statements/select/group-by.md @@ -52,7 +52,7 @@ toc_title: GROUP BY !!! note "Примечание" Если в запросе есть секция [HAVING](../../../sql-reference/statements/select/having.md), она может повлиять на результаты расчета подытогов. -**Пример** +**Пример** Рассмотрим таблицу t: @@ -105,14 +105,14 @@ SELECT year, month, day, count(*) FROM t GROUP BY year, month, day WITH ROLLUP; ## Модификатор WITH CUBE {#with-cube-modifier} -Модификатор `WITH CUBE` применятеся для расчета подытогов по всем комбинациям группировки ключевых выражений в списке `GROUP BY`. +Модификатор `WITH CUBE` применятеся для расчета подытогов по всем комбинациям группировки ключевых выражений в списке `GROUP BY`. Строки с подытогами добавляются в конец результирующей таблицы. В колонках, по которым выполняется группировка, указывается значение `0` или пустая строка. !!! note "Примечание" Если в запросе есть секция [HAVING](../../../sql-reference/statements/select/having.md), она может повлиять на результаты расчета подытогов. -**Пример** +**Пример** Рассмотрим таблицу t: @@ -135,13 +135,13 @@ SELECT year, month, day, count(*) FROM t GROUP BY year, month, day WITH CUBE; Поскольку секция `GROUP BY` содержит три ключевых выражения, результат состоит из восьми таблиц с подытогами — по таблице для каждой комбинации ключевых выражений: -- `GROUP BY year, month, day` -- `GROUP BY year, month` +- `GROUP BY year, month, day` +- `GROUP BY year, month` - `GROUP BY year, day` -- `GROUP BY year` -- `GROUP BY month, day` -- `GROUP BY month` -- `GROUP BY day` +- `GROUP BY year` +- `GROUP BY month, day` +- `GROUP BY month` +- `GROUP BY day` - и общий итог. Колонки, которые не участвуют в `GROUP BY`, заполнены нулями. @@ -254,7 +254,7 @@ GROUP BY вычисляет для каждого встретившегося ### Оптимизация GROUP BY для отсортированных таблиц {#aggregation-in-order} -Агрегирование данных в отсортированных таблицах может выполняться более эффективно, если выражение `GROUP BY` содержит хотя бы префикс ключа сортировки или инъективную функцию с этим ключом. В таких случаях в момент считывания из таблицы нового значения ключа сортировки промежуточный результат агрегирования будет финализироваться и отправляться на клиентскую машину. Чтобы включить такой способ выполнения запроса, используйте настройку [optimize_aggregation_in_order](../../../operations/settings/settings.md#optimize_aggregation_in_order). Подобная оптимизация позволяет сэкономить память во время агрегации, но в некоторых случаях может привести к увеличению времени выполнения запроса. +Агрегирование данных в отсортированных таблицах может выполняться более эффективно, если выражение `GROUP BY` содержит хотя бы префикс ключа сортировки или инъективную функцию с этим ключом. В таких случаях в момент считывания из таблицы нового значения ключа сортировки промежуточный результат агрегирования будет финализироваться и отправляться на клиентскую машину. Чтобы включить такой способ выполнения запроса, используйте настройку [optimize_aggregation_in_order](../../../operations/settings/settings.md#optimize_aggregation_in_order). Подобная оптимизация позволяет сэкономить память во время агрегации, но в некоторых случаях может привести к увеличению времени выполнения запроса. ### Группировка во внешней памяти {#select-group-by-in-external-memory} diff --git a/docs/ru/sql-reference/statements/select/index.md b/docs/ru/sql-reference/statements/select/index.md index a3b4e889397..c2820bc7be4 100644 --- a/docs/ru/sql-reference/statements/select/index.md +++ b/docs/ru/sql-reference/statements/select/index.md @@ -11,7 +11,7 @@ toc_title: "Обзор" ``` sql [WITH expr_list|(subquery)] -SELECT [DISTINCT] expr_list +SELECT [DISTINCT [ON (column1, column2, ...)]] expr_list [FROM [db.]table | (subquery) | table_function] [FINAL] [SAMPLE sample_coeff] [ARRAY JOIN ...] @@ -20,7 +20,7 @@ SELECT [DISTINCT] expr_list [WHERE expr] [GROUP BY expr_list] [WITH ROLLUP|WITH CUBE] [WITH TOTALS] [HAVING expr] -[ORDER BY expr_list] [WITH FILL] [FROM expr] [TO expr] [STEP expr] +[ORDER BY expr_list] [WITH FILL] [FROM expr] [TO expr] [STEP expr] [LIMIT [offset_value, ]n BY columns] [LIMIT [n, ]m] [WITH TIES] [SETTINGS ...] @@ -34,6 +34,8 @@ SELECT [DISTINCT] expr_list Особенности каждой необязательной секции рассматриваются в отдельных разделах, которые перечислены в том же порядке, в каком они выполняются: - [Секция WITH](with.md) +- [Секция SELECT](#select-clause) +- [Секция DISTINCT](distinct.md) - [Секция FROM](from.md) - [Секция SAMPLE](sample.md) - [Секция JOIN](join.md) @@ -42,8 +44,6 @@ SELECT [DISTINCT] expr_list - [Секция GROUP BY](group-by.md) - [Секция LIMIT BY](limit-by.md) - [Секция HAVING](having.md) -- [Секция SELECT](#select-clause) -- [Секция DISTINCT](distinct.md) - [Секция LIMIT](limit.md) [Секция OFFSET](offset.md) - [Секция UNION ALL](union.md) @@ -147,7 +147,7 @@ Code: 42. DB::Exception: Received from localhost:9000. DB::Exception: Number of ## Детали реализации {#implementation-details} Если в запросе отсутствуют секции `DISTINCT`, `GROUP BY`, `ORDER BY`, подзапросы в `IN` и `JOIN`, то запрос будет обработан полностью потоково, с использованием O(1) количества оперативки. -Иначе запрос может съесть много оперативки, если не указаны подходящие ограничения: +Иначе запрос может съесть много оперативки, если не указаны подходящие ограничения: - `max_memory_usage` - `max_rows_to_group_by` @@ -169,7 +169,7 @@ Code: 42. DB::Exception: Received from localhost:9000. DB::Exception: Number of ### APPLY {#apply-modifier} -Вызывает указанную функцию для каждой строки, возвращаемой внешним табличным выражением запроса. +Вызывает указанную функцию для каждой строки, возвращаемой внешним табличным выражением запроса. **Синтаксис:** @@ -177,7 +177,7 @@ Code: 42. DB::Exception: Received from localhost:9000. DB::Exception: Number of SELECT APPLY( ) FROM [db.]table_name ``` -**Пример:** +**Пример:** ``` sql CREATE TABLE columns_transformers (i Int64, j Int16, k Int64) ENGINE = MergeTree ORDER by (i); @@ -271,9 +271,9 @@ SELECT * REPLACE(i + 1 AS i) EXCEPT (j) APPLY(sum) from columns_transformers; ## SETTINGS в запросе SELECT {#settings-in-select} -Вы можете задать значения необходимых настроек непосредственно в запросе `SELECT` в секции `SETTINGS`. Эти настройки действуют только в рамках данного запроса, а после его выполнения сбрасываются до предыдущего значения или значения по умолчанию. +Вы можете задать значения необходимых настроек непосредственно в запросе `SELECT` в секции `SETTINGS`. Эти настройки действуют только в рамках данного запроса, а после его выполнения сбрасываются до предыдущего значения или значения по умолчанию. -Другие способы задания настроек описаны [здесь](../../../operations/settings/index.md). +Другие способы задания настроек описаны [здесь](../../../operations/settings/index.md). **Пример** diff --git a/docs/ru/sql-reference/statements/select/join.md b/docs/ru/sql-reference/statements/select/join.md index 4bd883c87ff..03018a953ce 100644 --- a/docs/ru/sql-reference/statements/select/join.md +++ b/docs/ru/sql-reference/statements/select/join.md @@ -4,7 +4,7 @@ toc_title: JOIN # Секция JOIN {#select-join} -Join создаёт новую таблицу путем объединения столбцов из одной или нескольких таблиц с использованием общих для каждой из них значений. Это обычная операция в базах данных с поддержкой SQL, которая соответствует join из [реляционной алгебры](https://en.wikipedia.org/wiki/Relational_algebra#Joins_and_join-like_operators). Частный случай соединения одной таблицы часто называют «self-join». +`JOIN` создаёт новую таблицу путем объединения столбцов из одной или нескольких таблиц с использованием общих для каждой из них значений. Это обычная операция в базах данных с поддержкой SQL, которая соответствует join из [реляционной алгебры](https://en.wikipedia.org/wiki/Relational_algebra#Joins_and_join-like_operators). Частный случай соединения одной таблицы часто называют self-join. Синтаксис: @@ -38,12 +38,21 @@ FROM ## Настройки {#join-settings} -!!! note "Примечание" - Значение строгости по умолчанию может быть переопределено с помощью настройки [join_default_strictness](../../../operations/settings/settings.md#settings-join_default_strictness). +Значение строгости по умолчанию может быть переопределено с помощью настройки [join_default_strictness](../../../operations/settings/settings.md#settings-join_default_strictness). Поведение сервера ClickHouse для операций `ANY JOIN` зависит от параметра [any_join_distinct_right_table_keys](../../../operations/settings/settings.md#any_join_distinct_right_table_keys). -### Использование ASOF JOIN {#asof-join-usage} +**См. также** + +- [join_algorithm](../../../operations/settings/settings.md#settings-join_algorithm) +- [join_any_take_last_row](../../../operations/settings/settings.md#settings-join_any_take_last_row) +- [join_use_nulls](../../../operations/settings/settings.md#join_use_nulls) +- [partial_merge_join_optimizations](../../../operations/settings/settings.md#partial_merge_join_optimizations) +- [partial_merge_join_rows_in_right_blocks](../../../operations/settings/settings.md#partial_merge_join_rows_in_right_blocks) +- [join_on_disk_max_files_to_merge](../../../operations/settings/settings.md#join_on_disk_max_files_to_merge) +- [any_join_distinct_right_table_keys](../../../operations/settings/settings.md#any_join_distinct_right_table_keys) + +## Использование ASOF JOIN {#asof-join-usage} `ASOF JOIN` применим в том случае, когда необходимо объединять записи, которые не имеют точного совпадения. @@ -95,7 +104,7 @@ USING (equi_column1, ... equi_columnN, asof_column) Чтобы задать значение строгости по умолчанию, используйте сессионный параметр [join_default_strictness](../../../operations/settings/settings.md#settings-join_default_strictness). -#### Распределённый join {#global-join} +## Распределённый JOIN {#global-join} Есть два пути для выполнения соединения с участием распределённых таблиц: @@ -104,6 +113,42 @@ USING (equi_column1, ... equi_columnN, asof_column) Будьте аккуратны при использовании `GLOBAL`. За дополнительной информацией обращайтесь в раздел [Распределенные подзапросы](../../../sql-reference/operators/in.md#select-distributed-subqueries). +## Неявные преобразования типов {#implicit-type-conversion} + +Запросы `INNER JOIN`, `LEFT JOIN`, `RIGHT JOIN` и `FULL JOIN` поддерживают неявные преобразования типов для ключей соединения. Однако запрос не может быть выполнен, если не существует типа, к которому можно привести значения ключей с обеих сторон (например, нет типа, который бы одновременно вмещал в себя значения `UInt64` и `Int64`, или `String` и `Int32`). + +**Пример** + +Рассмотрим таблицу `t_1`: +```text +┌─a─┬─b─┬─toTypeName(a)─┬─toTypeName(b)─┐ +│ 1 │ 1 │ UInt16 │ UInt8 │ +│ 2 │ 2 │ UInt16 │ UInt8 │ +└───┴───┴───────────────┴───────────────┘ +``` +и таблицу `t_2`: +```text +┌──a─┬────b─┬─toTypeName(a)─┬─toTypeName(b)───┐ +│ -1 │ 1 │ Int16 │ Nullable(Int64) │ +│ 1 │ -1 │ Int16 │ Nullable(Int64) │ +│ 1 │ 1 │ Int16 │ Nullable(Int64) │ +└────┴──────┴───────────────┴─────────────────┘ +``` + +Запрос +```sql +SELECT a, b, toTypeName(a), toTypeName(b) FROM t_1 FULL JOIN t_2 USING (a, b); +``` +вернёт результат: +```text +┌──a─┬────b─┬─toTypeName(a)─┬─toTypeName(b)───┐ +│ 1 │ 1 │ Int32 │ Nullable(Int64) │ +│ 2 │ 2 │ Int32 │ Nullable(Int64) │ +│ -1 │ 1 │ Int32 │ Nullable(Int64) │ +│ 1 │ -1 │ Int32 │ Nullable(Int64) │ +└────┴──────┴───────────────┴─────────────────┘ +``` + ## Рекомендации по использованию {#usage-recommendations} ### Обработка пустых ячеек и NULL {#processing-of-empty-or-null-cells} @@ -142,12 +187,14 @@ USING (equi_column1, ... equi_columnN, asof_column) ### Ограничения по памяти {#memory-limitations} -По умолчанию ClickHouse использует алгоритм [hash join](https://en.wikipedia.org/wiki/Hash_join). ClickHouse берет `` и создает для него хэш-таблицу в оперативной памяти. После некоторого порога потребления памяти ClickHouse переходит к алгоритму merge join. +По умолчанию ClickHouse использует алгоритм [hash join](https://ru.wikipedia.org/wiki/Алгоритм_соединения_хешированием). ClickHouse берет правую таблицу и создает для нее хеш-таблицу в оперативной памяти. При включённой настройке `join_algorithm = 'auto'`, после некоторого порога потребления памяти ClickHouse переходит к алгоритму [merge join](https://ru.wikipedia.org/wiki/Алгоритм_соединения_слиянием_сортированных_списков). Описание алгоритмов `JOIN` см. в настройке [join_algorithm](../../../operations/settings/settings.md#settings-join_algorithm). -- [max_rows_in_join](../../../operations/settings/query-complexity.md#settings-max_rows_in_join) — ограничивает количество строк в хэш-таблице. -- [max_bytes_in_join](../../../operations/settings/query-complexity.md#settings-max_bytes_in_join) — ограничивает размер хэш-таблицы. +Если вы хотите ограничить потребление памяти во время выполнения операции `JOIN`, используйте настройки: -По достижении любого из этих ограничений, ClickHouse действует в соответствии с настройкой [join_overflow_mode](../../../operations/settings/query-complexity.md#settings-join_overflow_mode). +- [max_rows_in_join](../../../operations/settings/query-complexity.md#settings-max_rows_in_join) — ограничивает количество строк в хеш-таблице. +- [max_bytes_in_join](../../../operations/settings/query-complexity.md#settings-max_bytes_in_join) — ограничивает размер хеш-таблицы. + +По достижении любого из этих ограничений ClickHouse действует в соответствии с настройкой [join_overflow_mode](../../../operations/settings/query-complexity.md#settings-join_overflow_mode). ## Примеры {#examples} diff --git a/docs/ru/sql-reference/statements/select/limit.md b/docs/ru/sql-reference/statements/select/limit.md index e4012e89556..0266dbc540c 100644 --- a/docs/ru/sql-reference/statements/select/limit.md +++ b/docs/ru/sql-reference/statements/select/limit.md @@ -12,7 +12,7 @@ toc_title: LIMIT При отсутствии секции [ORDER BY](order-by.md), однозначно сортирующей результат, результат может быть произвольным и может являться недетерминированным. -!!! note "Примечание" +!!! note "Примечание" Количество возвращаемых строк может зависеть также от настройки [limit](../../../operations/settings/settings.md#limit). ## Модификатор LIMIT ... WITH TIES {#limit-with-ties} @@ -46,7 +46,7 @@ SELECT * FROM ( ) ORDER BY n LIMIT 0,5 WITH TIES ``` -возвращает другой набор строк +возвращает другой набор строк ```text ┌─n─┐ │ 0 │ diff --git a/docs/ru/sql-reference/statements/select/offset.md b/docs/ru/sql-reference/statements/select/offset.md index 31ff1d6ea8b..5b6f4cdfba8 100644 --- a/docs/ru/sql-reference/statements/select/offset.md +++ b/docs/ru/sql-reference/statements/select/offset.md @@ -35,7 +35,7 @@ SELECT * FROM test_fetch ORDER BY a LIMIT 3 OFFSET 1; !!! note "Примечание" Общее количество пропущенных строк может зависеть также от настройки [offset](../../../operations/settings/settings.md#offset). - + ## Примеры {#examples} Входная таблица: diff --git a/docs/ru/sql-reference/statements/select/order-by.md b/docs/ru/sql-reference/statements/select/order-by.md index cb49d167b13..d7d2e9c7574 100644 --- a/docs/ru/sql-reference/statements/select/order-by.md +++ b/docs/ru/sql-reference/statements/select/order-by.md @@ -250,8 +250,8 @@ SELECT * FROM collate_test ORDER BY s ASC COLLATE 'en'; ## Оптимизация чтения данных {#optimize_read_in_order} - Если в списке выражений в секции `ORDER BY` первыми указаны те поля, по которым проиндексирована таблица, по которой строится выборка, такой запрос можно оптимизировать — для этого используйте настройку [optimize_read_in_order](../../../operations/settings/settings.md#optimize_read_in_order). - + Если в списке выражений в секции `ORDER BY` первыми указаны те поля, по которым проиндексирована таблица, по которой строится выборка, такой запрос можно оптимизировать — для этого используйте настройку [optimize_read_in_order](../../../operations/settings/settings.md#optimize_read_in_order). + Когда настройка `optimize_read_in_order` включена, при выполнении запроса сервер использует табличные индексы и считывает данные в том порядке, который задан списком выражений `ORDER BY`. Поэтому если в запросе установлен [LIMIT](../../../sql-reference/statements/select/limit.md), сервер не станет считывать лишние данные. Таким образом, запросы к большим таблицам, но имеющие ограничения по числу записей, выполняются быстрее. Оптимизация работает при любом порядке сортировки `ASC` или `DESC`, но не работает при использовании группировки [GROUP BY](../../../sql-reference/statements/select/group-by.md) и модификатора [FINAL](../../../sql-reference/statements/select/from.md#select-from-final). @@ -271,8 +271,8 @@ SELECT * FROM collate_test ORDER BY s ASC COLLATE 'en'; Этот модификатор также может быть скобинирован с модификатором [LIMIT ... WITH TIES](../../../sql-reference/statements/select/limit.md#limit-with-ties) -`WITH FILL` модификатор может быть установлен после `ORDER BY expr` с опциональными параметрами `FROM expr`, `TO expr` и `STEP expr`. -Все пропущенные значнеия для колонки `expr` будут заполненые значениями соответсвующими предполагаемой последовательности значений колонки, другие колонки будут заполнены значенями по умолчанию. +Модификатор `WITH FILL` может быть установлен после `ORDER BY expr` с опциональными параметрами `FROM expr`, `TO expr` и `STEP expr`. +Все пропущенные значения для колонки `expr` будут заполнены значениями, соответствующими предполагаемой последовательности значений колонки, другие колонки будут заполнены значениями по умолчанию. Используйте следующую конструкцию для заполнения нескольких колонок с модификатором `WITH FILL` с необязательными параметрами после каждого имени поля в секции `ORDER BY`. @@ -280,22 +280,22 @@ SELECT * FROM collate_test ORDER BY s ASC COLLATE 'en'; ORDER BY expr [WITH FILL] [FROM const_expr] [TO const_expr] [STEP const_numeric_expr], ... exprN [WITH FILL] [FROM expr] [TO expr] [STEP numeric_expr] ``` -`WITH FILL` может быть применене только к полям с числовыми (все разновидности float, int, decimal) или временными (все разновидности Date, DateTime) типами. +`WITH FILL` может быть применен к полям с числовыми (все разновидности float, int, decimal) или временными (все разновидности Date, DateTime) типами. В случае применения к полям типа `String` недостающие значения заполняются пустой строкой. Когда не определен `FROM const_expr`, последовательность заполнения использует минимальное значение поля `expr` из `ORDER BY`. Когда не определен `TO const_expr`, последовательность заполнения использует максимальное значение поля `expr` из `ORDER BY`. -Когда `STEP const_numeric_expr` определен, тогда `const_numeric_expr` интерпретируется `как есть` для числовых типов, как `дни` для типа Date и как `секунды` для типа DateTime. +Когда `STEP const_numeric_expr` определен, `const_numeric_expr` интерпретируется "как есть" для числовых типов, как "дни" для типа `Date` и как "секунды" для типа `DateTime`. + Когда `STEP const_numeric_expr` не указан, тогда используется `1.0` для числовых типов, `1 день` для типа Date и `1 секунда` для типа DateTime. - -Для примера, следующий запрос +Пример запроса без использования `WITH FILL`: ```sql SELECT n, source FROM ( SELECT toFloat32(number % 10) AS n, 'original' AS source FROM numbers(10) WHERE number % 3 = 1 -) ORDER BY n +) ORDER BY n; ``` -возвращает +Результат: ```text ┌─n─┬─source───┐ │ 1 │ original │ @@ -304,7 +304,7 @@ SELECT n, source FROM ( └───┴──────────┘ ``` -но после применения модификатора `WITH FILL` +Тот же запрос после применения модификатора `WITH FILL`: ```sql SELECT n, source FROM ( SELECT toFloat32(number % 10) AS n, 'original' AS source @@ -312,7 +312,8 @@ SELECT n, source FROM ( ) ORDER BY n WITH FILL FROM 0 TO 5.51 STEP 0.5 ``` -возвращает +Результат: + ```text ┌───n─┬─source───┐ │ 0 │ │ @@ -331,7 +332,7 @@ SELECT n, source FROM ( └─────┴──────────┘ ``` -Для случая когда у нас есть несколько полей `ORDER BY field2 WITH FILL, field1 WITH FILL` порядок заполнения будет следовать порядку полей в секции `ORDER BY`. +Для случая с несколькими полями `ORDER BY field2 WITH FILL, field1 WITH FILL` порядок заполнения будет соответствовать порядку полей в секции `ORDER BY`. Пример: ```sql @@ -341,12 +342,12 @@ SELECT 'original' AS source FROM numbers(10) WHERE (number % 3) = 1 -ORDER BY - d2 WITH FILL, +ORDER BY + d2 WITH FILL, d1 WITH FILL STEP 5; ``` -возвращает +Результат: ```text ┌───d1───────┬───d2───────┬─source───┐ │ 1970-01-11 │ 1970-01-02 │ original │ @@ -354,41 +355,41 @@ ORDER BY │ 1970-01-01 │ 1970-01-04 │ │ │ 1970-02-10 │ 1970-01-05 │ original │ │ 1970-01-01 │ 1970-01-06 │ │ -│ 1970-01-01 │ 1970-01-07 │ │ +│ 1970-01-01 │ 1970-01-07 │ │ │ 1970-03-12 │ 1970-01-08 │ original │ -└────────────┴────────────┴──────────┘ +└────────────┴────────────┴──────────┘ ``` -Поле `d1` не заполняет и используется значение по умолчанию поскольку у нас нет повторяющихся значения для `d2` поэтому мы не можем правильно рассчитать последователность заполнения для`d1`. +Поле `d1` не заполняется и использует значение по умолчанию. Поскольку у нас нет повторяющихся значений для `d2`, мы не можем правильно рассчитать последователность заполнения для `d1`. -Cледующий запрос (с измененым порядком в ORDER BY) +Cледующий запрос (с измененым порядком в ORDER BY): ```sql -SELECT - toDate((number * 10) * 86400) AS d1, - toDate(number * 86400) AS d2, +SELECT + toDate((number * 10) * 86400) AS d1, + toDate(number * 86400) AS d2, 'original' AS source FROM numbers(10) WHERE (number % 3) = 1 -ORDER BY +ORDER BY d1 WITH FILL STEP 5, - d2 WITH FILL; + d2 WITH FILL; ``` -возвращает +Результат: ```text ┌───d1───────┬───d2───────┬─source───┐ -│ 1970-01-11 │ 1970-01-02 │ original │ -│ 1970-01-16 │ 1970-01-01 │ │ -│ 1970-01-21 │ 1970-01-01 │ │ -│ 1970-01-26 │ 1970-01-01 │ │ -│ 1970-01-31 │ 1970-01-01 │ │ -│ 1970-02-05 │ 1970-01-01 │ │ +│ 1970-01-11 │ 1970-01-02 │ original │ +│ 1970-01-16 │ 1970-01-01 │ │ +│ 1970-01-21 │ 1970-01-01 │ │ +│ 1970-01-26 │ 1970-01-01 │ │ +│ 1970-01-31 │ 1970-01-01 │ │ +│ 1970-02-05 │ 1970-01-01 │ │ │ 1970-02-10 │ 1970-01-05 │ original │ -│ 1970-02-15 │ 1970-01-01 │ │ -│ 1970-02-20 │ 1970-01-01 │ │ -│ 1970-02-25 │ 1970-01-01 │ │ -│ 1970-03-02 │ 1970-01-01 │ │ +│ 1970-02-15 │ 1970-01-01 │ │ +│ 1970-02-20 │ 1970-01-01 │ │ +│ 1970-02-25 │ 1970-01-01 │ │ +│ 1970-03-02 │ 1970-01-01 │ │ │ 1970-03-07 │ 1970-01-01 │ │ -│ 1970-03-12 │ 1970-01-08 │ original │ -└────────────┴────────────┴──────────┘ +│ 1970-03-12 │ 1970-01-08 │ original │ +└────────────┴────────────┴──────────┘ ``` diff --git a/docs/ru/sql-reference/statements/select/with.md b/docs/ru/sql-reference/statements/select/with.md index 7e09d94770a..a80bc46a5a3 100644 --- a/docs/ru/sql-reference/statements/select/with.md +++ b/docs/ru/sql-reference/statements/select/with.md @@ -15,7 +15,7 @@ WITH AS ``` sql WITH AS ``` - + ## Примеры **Пример 1:** Использование константного выражения как «переменной» @@ -63,7 +63,7 @@ LIMIT 10; **Пример 4:** Переиспользование выражения ``` sql -WITH test1 AS (SELECT i + 1, j + 1 FROM test1) +WITH test1 AS (SELECT i + 1, j + 1 FROM test1) SELECT * FROM test1; ``` diff --git a/docs/ru/sql-reference/statements/show.md b/docs/ru/sql-reference/statements/show.md index 29d184f6c34..7b5296e988e 100644 --- a/docs/ru/sql-reference/statements/show.md +++ b/docs/ru/sql-reference/statements/show.md @@ -301,7 +301,7 @@ SHOW CREATE [SETTINGS] PROFILE name1 [, name2 ...] ``` sql SHOW USERS ``` - + ## SHOW ROLES {#show-roles-statement} Выводит список [ролей](../../operations/access-rights.md#role-management). Для просмотра параметров ролей, см. системные таблицы [system.roles](../../operations/system-tables/roles.md#system_tables-roles) и [system.role-grants](../../operations/system-tables/role-grants.md#system_tables-role_grants). @@ -340,8 +340,8 @@ SHOW [ROW] POLICIES [ON [db.]table] ``` sql SHOW QUOTAS -``` - +``` + ## SHOW QUOTA {#show-quota-statement} Выводит потребление [квоты](../../operations/quotas.md) для всех пользователей или только для текущего пользователя. Для просмотра других параметров, см. системные таблицы [system.quotas_usage](../../operations/system-tables/quotas_usage.md#system_tables-quotas_usage) и [system.quota_usage](../../operations/system-tables/quota_usage.md#system_tables-quota_usage). diff --git a/docs/ru/sql-reference/statements/watch.md b/docs/ru/sql-reference/statements/watch.md index ef5b2f80584..b7567bce6c4 100644 --- a/docs/ru/sql-reference/statements/watch.md +++ b/docs/ru/sql-reference/statements/watch.md @@ -7,7 +7,7 @@ toc_title: WATCH !!! important "Важно" Это экспериментальная функция. Она может повлечь потерю совместимости в будущих версиях. - Чтобы использовать `LIVE VIEW` и запросы `WATCH`, включите настройку `set allow_experimental_live_view = 1`. + Чтобы использовать `LIVE VIEW` и запросы `WATCH`, включите настройку `set allow_experimental_live_view = 1`. **Синтаксис** diff --git a/docs/ru/sql-reference/table-functions/cluster.md b/docs/ru/sql-reference/table-functions/cluster.md index b59ccf085ed..1a087971afe 100644 --- a/docs/ru/sql-reference/table-functions/cluster.md +++ b/docs/ru/sql-reference/table-functions/cluster.md @@ -6,7 +6,7 @@ toc_title: cluster # cluster, clusterAllReplicas {#cluster-clusterallreplicas} Позволяет обратиться ко всем серверам существующего кластера, который присутствует в таблице `system.clusters` и сконфигурирован в секцци `remote_servers` без создания таблицы типа `Distributed`. -`clusterAllReplicas` - работает также как `cluster` но каждая реплика в кластере будет использована как отдельный шард/отдельное соединение. +`clusterAllReplicas` - работает также как `cluster` но каждая реплика в кластере будет использована как отдельный шард/отдельное соединение. Сигнатуры: @@ -18,7 +18,7 @@ clusterAllReplicas('cluster_name', db.table) clusterAllReplicas('cluster_name', db, table) ``` -`cluster_name` – имя кластера, который обязан присутствовать в таблице `system.clusters` и обозначает подмножество адресов и параметров подключения к удаленным и локальным серверам, входящим в кластер. +`cluster_name` – имя кластера, который обязан присутствовать в таблице `system.clusters` и обозначает подмножество адресов и параметров подключения к удаленным и локальным серверам, входящим в кластер. Использование табличных функций `cluster` и `clusterAllReplicas` менее оптимальное чем создание таблицы типа `Distributed`, поскольку в этом случае соединение с сервером переустанавливается на каждый запрос. При обработке большого количества запросов, всегда создавайте `Distributed` таблицу заранее и не используйте табличные функции `cluster` и `clusterAllReplicas`. diff --git a/docs/ru/sql-reference/table-functions/dictionary.md b/docs/ru/sql-reference/table-functions/dictionary.md index d4909bf5d9f..093ca6d03c7 100644 --- a/docs/ru/sql-reference/table-functions/dictionary.md +++ b/docs/ru/sql-reference/table-functions/dictionary.md @@ -13,7 +13,7 @@ toc_title: dictionary dictionary('dict') ``` -**Аргументы** +**Аргументы** - `dict` — имя словаря. [String](../../sql-reference/data-types/string.md). diff --git a/docs/ru/sql-reference/table-functions/jdbc.md b/docs/ru/sql-reference/table-functions/jdbc.md index 3bbbbb240e5..3955846d8db 100644 --- a/docs/ru/sql-reference/table-functions/jdbc.md +++ b/docs/ru/sql-reference/table-functions/jdbc.md @@ -25,7 +25,7 @@ SELECT * FROM jdbc('mysql-dev?p1=233', 'num Int32', 'select toInt32OrZero(''{{p1 ``` ``` sql -SELECT * +SELECT * FROM jdbc('mysql-dev?p1=233', 'num Int32', 'select toInt32OrZero(''{{p1}}'') as num') ``` diff --git a/docs/ru/sql-reference/table-functions/mysql.md b/docs/ru/sql-reference/table-functions/mysql.md index e21d1a7fa06..e881961e3d9 100644 --- a/docs/ru/sql-reference/table-functions/mysql.md +++ b/docs/ru/sql-reference/table-functions/mysql.md @@ -29,9 +29,9 @@ mysql('host:port', 'database', 'table', 'user', 'password'[, replace_query, 'on_ - `0` - выполняется запрос `INSERT INTO`. - `1` - выполняется запрос `REPLACE INTO`. -- `on_duplicate_clause` — выражение `ON DUPLICATE KEY on_duplicate_clause`, добавляемое в запрос `INSERT`. Может быть передано только с помощью `replace_query = 0` (если вы одновременно передадите `replace_query = 1` и `on_duplicate_clause`, будет сгенерировано исключение). +- `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`. + Пример: `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](http://www.mysql.ru/docs/). Простые условия `WHERE` такие как `=, !=, >, >=, <, =` выполняются на стороне сервера MySQL. @@ -104,7 +104,7 @@ SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123'); └────────┴───────┘ ``` -**Смотрите также** +**Смотрите также** - [Движок таблиц ‘MySQL’](../../sql-reference/table-functions/mysql.md) - [Использование MySQL как источника данных для внешнего словаря](../../sql-reference/table-functions/mysql.md#dicts-external_dicts_dict_sources-mysql) diff --git a/docs/ru/sql-reference/table-functions/null.md b/docs/ru/sql-reference/table-functions/null.md index 8e0173733f8..44fbc111db2 100644 --- a/docs/ru/sql-reference/table-functions/null.md +++ b/docs/ru/sql-reference/table-functions/null.md @@ -7,13 +7,13 @@ toc_title: null функция Создает временную таблицу указанной структуры с движком [Null](../../engines/table-engines/special/null.md). В соответствии со свойствами движка, данные в таблице игнорируются, а сама таблица удаляется сразу после выполнения запроса. Функция используется для удобства написания тестов и демонстрационных примеров. -**Синтаксис** +**Синтаксис** ``` sql null('structure') ``` -**Параметр** +**Параметр** - `structure` — список колонок и их типов. [String](../../sql-reference/data-types/string.md). @@ -36,7 +36,7 @@ INSERT INTO t SELECT * FROM numbers_mt(1000000000); DROP TABLE IF EXISTS t; ``` -См. также: +См. также: - [Движок таблиц Null](../../engines/table-engines/special/null.md) diff --git a/docs/ru/sql-reference/table-functions/postgresql.md b/docs/ru/sql-reference/table-functions/postgresql.md index 50f651527c5..76c2ee0fa18 100644 --- a/docs/ru/sql-reference/table-functions/postgresql.md +++ b/docs/ru/sql-reference/table-functions/postgresql.md @@ -20,7 +20,7 @@ postgresql('host:port', 'database', 'table', 'user', 'password'[, `schema`]) - `table` — имя таблицы на удалённом сервере. - `user` — пользователь PostgreSQL. - `password` — пароль пользователя. -- `schema` — имя схемы, если не используется схема по умолчанию. Необязательный аргумент. +- `schema` — имя схемы, если не используется схема по умолчанию. Необязательный аргумент. **Возвращаемое значение** @@ -43,7 +43,7 @@ PostgreSQL массивы конвертируются в массивы ClickHo !!! info "Примечание" Будьте внимательны, в PostgreSQL массивы, созданные как `type_name[]`, являются многомерными и могут содержать в себе разное количество измерений в разных строках одной таблицы. Внутри ClickHouse допустипы только многомерные массивы с одинаковым кол-вом измерений во всех строках таблицы. - + Поддерживает несколько реплик, которые должны быть перечислены через `|`. Например: ```sql @@ -56,7 +56,7 @@ SELECT name FROM postgresql(`postgres{1|2|3}:5432`, 'postgres_database', 'postgr SELECT name FROM postgresql(`postgres1:5431|postgres2:5432`, 'postgres_database', 'postgres_table', 'user', 'password'); ``` -При использовании словаря PostgreSQL поддерживается приоритет реплик. Чем больше номер реплики, тем ниже ее приоритет. Наивысший приоритет у реплики с номером `0`. +При использовании словаря PostgreSQL поддерживается приоритет реплик. Чем больше номер реплики, тем ниже ее приоритет. Наивысший приоритет у реплики с номером `0`. **Примеры** @@ -86,7 +86,7 @@ postgresql> SELECT * FROM test; Получение данных в ClickHouse: ```sql -SELECT * FROM postgresql('localhost:5432', 'test', 'test', 'postgresql_user', 'password') WHERE str IN ('test'); +SELECT * FROM postgresql('localhost:5432', 'test', 'test', 'postgresql_user', 'password') WHERE str IN ('test'); ``` ``` text diff --git a/docs/ru/sql-reference/table-functions/remote.md b/docs/ru/sql-reference/table-functions/remote.md index 00179abb207..20c38ef2af7 100644 --- a/docs/ru/sql-reference/table-functions/remote.md +++ b/docs/ru/sql-reference/table-functions/remote.md @@ -23,7 +23,7 @@ remoteSecure('addresses_expr', db.table[, 'user'[, 'password']]) - `addresses_expr` — выражение, генерирующее адреса удалённых серверов. Это может быть просто один адрес сервера. Адрес сервера — это `host:port` или только `host`. Вместо параметра `host` может быть указано имя сервера или его адрес в формате IPv4 или IPv6. IPv6 адрес указывается в квадратных скобках. - + `port` — TCP-порт удалённого сервера. Если порт не указан, используется [tcp_port](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-tcp_port) из конфигурационного файла сервера, к которому обратились через функцию `remote` (по умолчанию - 9000), и [tcp_port_secure](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-tcp_port_secure), к которому обратились через функцию `remoteSecure` (по умолчанию — 9440). С IPv6-адресом обязательно нужно указывать порт. @@ -68,28 +68,6 @@ localhost example01-01-1,example01-02-1 ``` -Часть выражения может быть указана в фигурных скобках. Предыдущий пример может быть записан следующим образом: - -``` text -example01-0{1,2}-1 -``` - -В фигурных скобках может быть указан диапазон (неотрицательных целых) чисел через две точки. В этом случае диапазон раскрывается в множество значений, генерирующих адреса шардов. Если запись первого числа начинается с нуля, то значения формируются с таким же выравниванием нулями. Предыдущий пример может быть записан следующим образом: - -``` text -example01-{01..02}-1 -``` - -При наличии нескольких пар фигурных скобок генерируется прямое произведение соответствующих множеств. - -Адреса или их фрагменты в фигурных скобках можно указать через символ \|. В этом случае соответствующие множества адресов понимаются как реплики — запрос будет отправлен на первую живую реплику. При этом реплики перебираются в порядке, согласно текущей настройке [load_balancing](../../operations/settings/settings.md#settings-load_balancing). В этом примере указаны два шарда, в каждом из которых имеются две реплики: - -``` text -example01-{01..02}-{1|2} -``` - -Количество генерируемых адресов ограничено константой. Сейчас это 1000 адресов. - **Примеры** Выборка данных с удаленного сервера: @@ -106,3 +84,15 @@ INSERT INTO FUNCTION remote('127.0.0.1', currentDatabase(), 'remote_table') VALU SELECT * FROM remote_table; ``` +## Символы подстановки в адресах {globs-in-addresses} + +Шаблоны в фигурных скобках `{ }` используются, чтобы сгенерировать список шардов или указать альтернативный адрес на случай отказа. В одном URL можно использовать несколько шаблонов. +Поддерживаются следующие типы шаблонов. + +- {*a*,*b*} - несколько вариантов, разделенных запятой. Весь шаблон заменяется на *a* в адресе первого шарда, заменяется на *b* в адресе второго шарда и так далее. Например, `example0{1,2}-1` генерирует адреса `example01-1` и `example02-1`. +- {*n*..*m*} - диапазон чисел. Этот шаблон генерирует адреса шардов с увеличивающимися индексами от *n* до *m*. `example0{1..2}-1` генерирует `example01-1` и `example02-1`. +- {*0n*..*0m*} - диапазон чисел с ведущими нулями. Такой вариант сохраняет ведущие нули в индексах. По шаблону `example{01..03}-1` генерируются `example01-1`, `example02-1` и `example03-1`. +- {*a*|*b*} - несколько вариантов, разделенных `|`. Шаблон задает адреса реплик. Например, `example01-{1|2}` генерирует реплики`example01-1` и `example01-2`. + +Запрос будет отправлен на первую живую реплику. При этом для `remote` реплики перебираются в порядке, заданном настройкой [load_balancing](../../operations/settings/settings.md#settings-load_balancing). +Количество генерируемых адресов ограничено настройкой [table_function_remote_max_addresses](../../operations/settings/settings.md#table_function_remote_max_addresses). diff --git a/docs/ru/sql-reference/table-functions/s3.md b/docs/ru/sql-reference/table-functions/s3.md index 5b54940e830..597f145c096 100644 --- a/docs/ru/sql-reference/table-functions/s3.md +++ b/docs/ru/sql-reference/table-functions/s3.md @@ -18,7 +18,7 @@ s3(path, [aws_access_key_id, aws_secret_access_key,] format, structure, [compres - `path` — URL-адрес бакета с указанием пути к файлу. Поддерживает следующие подстановочные знаки в режиме "только чтение": `*, ?, {abc,def} и {N..M}` где `N, M` — числа, `'abc', 'def'` — строки. Подробнее смотри [здесь](../../engines/table-engines/integrations/s3.md#wildcards-in-path). - `format` — [формат](../../interfaces/formats.md#formats) файла. - `structure` — cтруктура таблицы. Формат `'column1_name column1_type, column2_name column2_type, ...'`. -- `compression` — автоматически обнаруживает сжатие по расширению файла. Возможные значения: `none`, `gzip/gz`, `brotli/br`, `xz/LZMA`, `zstd/zst`. Необязательный параметр. +- `compression` — автоматически обнаруживает сжатие по расширению файла. Возможные значения: `none`, `gzip/gz`, `brotli/br`, `xz/LZMA`, `zstd/zst`. Необязательный параметр. **Возвращаемые значения** @@ -50,8 +50,8 @@ LIMIT 2; Запрос: ``` sql -SELECT * -FROM s3('https://storage.yandexcloud.net/my-test-bucket-768/data.csv.gz', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32', 'gzip') +SELECT * +FROM s3('https://storage.yandexcloud.net/my-test-bucket-768/data.csv.gz', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32', 'gzip') LIMIT 2; ``` diff --git a/docs/ru/sql-reference/table-functions/url.md b/docs/ru/sql-reference/table-functions/url.md index a41a1f53cde..b5fd948cc45 100644 --- a/docs/ru/sql-reference/table-functions/url.md +++ b/docs/ru/sql-reference/table-functions/url.md @@ -41,3 +41,7 @@ INSERT INTO FUNCTION url('http://127.0.0.1:8123/?query=INSERT+INTO+test_table+FO SELECT * FROM test_table; ``` +## Символы подстановки в URL {globs-in-url} + +Шаблоны в фигурных скобках `{ }` используются, чтобы сгенерировать список шардов или указать альтернативные адреса на случай отказа. Поддерживаемые типы шаблонов и примеры смотрите в описании функции [remote](remote.md#globs-in-addresses). +Символ `|` внутри шаблонов используется, чтобы задать адреса, если предыдущие оказались недоступны. Эти адреса перебираются в том же порядке, в котором они указаны в шаблоне. Количество адресов, которые могут быть сгенерированы, ограничено настройкой [glob_expansion_max_elements](../../operations/settings/settings.md#glob_expansion_max_elements). diff --git a/docs/ru/whats-new/security-changelog.md b/docs/ru/whats-new/security-changelog.md index e3d26e772c4..60d6c2f1b66 100644 --- a/docs/ru/whats-new/security-changelog.md +++ b/docs/ru/whats-new/security-changelog.md @@ -5,6 +5,17 @@ toc_title: Security Changelog # Security Changelog {#security-changelog} +## Исправлено в релизе 21.4.3.21, 2021-04-12 {#fixed-in-clickhouse-release-21-4-3-21-2019-09-10} + +### CVE-2021-25263 {#cve-2021-25263} + +Злоумышленник с доступом к созданию словарей может читать файлы на файловой системе сервера Clickhouse. +Злоумышленник может обойти некорректную проверку пути к файлу словаря и загрузить часть любого файла как словарь. При этом, манипулируя опциями парсинга файла, можно получить следующую часть файла и пошагово прочитать весь файл. + +Исправление доступно в версиях 20.8.18.32-lts, 21.1.9.41-stable, 21.2.9.41-stable, 21.3.6.55-lts, 21.4.3.21-stable и выше. + +Обнаружено благодаря: [Вячеславу Егошину](https://twitter.com/vegoshin) + ## Исправлено в релизе 19.14.3.3, 2019-09-10 {#ispravleno-v-relize-19-14-3-3-2019-09-10} ### CVE-2019-15024 {#cve-2019-15024} diff --git a/docs/zh/commercial/cloud.md b/docs/zh/commercial/cloud.md index e0a297f51c8..651a1a15ec4 100644 --- a/docs/zh/commercial/cloud.md +++ b/docs/zh/commercial/cloud.md @@ -1,6 +1,6 @@ --- toc_priority: 1 -toc_title: 云 +toc_title: 云 --- # ClickHouse 云服务提供商 {#clickhouse-cloud-service-providers} @@ -22,7 +22,7 @@ toc_title: 云 [Altinity.Cloud](https://altinity.com/cloud-database/) 是针对 Amazon 公共云的完全托管的 ClickHouse-as-a-Service -- 在 Amazon 资源上快速部署 ClickHouse 集群 +- 在 Amazon 资源上快速部署 ClickHouse 集群 - 轻松进行横向扩展/纵向扩展以及节点的垂直扩展 - 具有公共端点或VPC对等的租户隔离 - 可配置存储类型以及卷配置 diff --git a/docs/zh/commercial/index.md b/docs/zh/commercial/index.md index 2bfd0767d1b..047ee817d7b 100644 --- a/docs/zh/commercial/index.md +++ b/docs/zh/commercial/index.md @@ -1,5 +1,5 @@ --- -toc_folder_title: 商业支持 +toc_folder_title: 商业支持 toc_priority: 70 toc_title: 简介 --- diff --git a/docs/zh/development/browse-code.md b/docs/zh/development/browse-code.md index 49da72a63aa..fd334dac55f 100644 --- a/docs/zh/development/browse-code.md +++ b/docs/zh/development/browse-code.md @@ -7,6 +7,6 @@ toc_title: "\u6D4F\u89C8\u6E90\u4EE3\u7801" 您可以使用 **Woboq** 在线代码浏览器 [点击这里](https://clickhouse.tech/codebrowser/html_report/ClickHouse/src/index.html). 它提供了代码导航和语义突出显示、搜索和索引。 代码快照每天更新。 -此外,您还可以像往常一样浏览源代码 [GitHub](https://github.com/ClickHouse/ClickHouse) +此外,您还可以像往常一样浏览源代码 [GitHub](https://github.com/ClickHouse/ClickHouse) 如果你希望了解哪种IDE较好,我们推荐使用CLion,QT Creator,VS Code和KDevelop(有注意事项)。 您可以使用任何您喜欢的IDE。 Vim和Emacs也可以。 diff --git a/docs/zh/development/style.md b/docs/zh/development/style.md index bb9bfde7b9b..dcbfbc79e33 100644 --- a/docs/zh/development/style.md +++ b/docs/zh/development/style.md @@ -742,19 +742,11 @@ CPU指令集是我们服务器中支持的最小集合。 目前,它是SSE 4.2 ## 库 {#ku} -**1.** 使用C++20标准库(允许实验性功能),以及 `boost` 和 `Poco` 框架。 +**1.** The C++20 standard library is used (experimental extensions are allowed), as well as `boost` and `Poco` frameworks. -**2.** 如有必要,您可以使用 OS 包中提供的任何已知库。 +**2.** It is not allowed to use libraries from OS packages. It is also not allowed to use pre-installed libraries. All libraries should be placed in form of source code in `contrib` directory and built with ClickHouse. -如果有一个好的解决方案已经可用,那就使用它,即使这意味着你必须安装另一个库。 - -(但要准备从代码中删除不好的库) - -**3.** 如果软件包没有您需要的软件包或者有过时的版本或错误的编译类型,则可以安装不在软件包中的库。 - -**4.** 如果库很小并且没有自己的复杂构建系统,请将源文件放在 `contrib` 文件夹中。 - -**5.** 始终优先考虑已经使用的库。 +**3.** Preference is always given to libraries that are already in use. ## 一般建议 {#yi-ban-jian-yi-1} diff --git a/docs/zh/engines/database-engines/atomic.md b/docs/zh/engines/database-engines/atomic.md index f019b94a00b..73e044b5e98 100644 --- a/docs/zh/engines/database-engines/atomic.md +++ b/docs/zh/engines/database-engines/atomic.md @@ -6,12 +6,12 @@ toc_title: Atomic # Atomic {#atomic} -It is supports non-blocking `DROP` and `RENAME TABLE` queries and atomic `EXCHANGE TABLES t1 AND t2` queries. Atomic database engine is used by default. +它支持非阻塞 DROP 和 RENAME TABLE 查询以及原子 EXCHANGE TABLES t1 AND t2 查询。默认情况下使用Atomic数据库引擎。 -## Creating a Database {#creating-a-database} +## 创建数据库 {#creating-a-database} ```sql CREATE DATABASE test ENGINE = Atomic; ``` -[Original article](https://clickhouse.tech/docs/en/engines/database_engines/atomic/) +[原文](https://clickhouse.tech/docs/en/engines/database_engines/atomic/) diff --git a/docs/zh/engines/table-engines/integrations/mongodb.md b/docs/zh/engines/table-engines/integrations/mongodb.md index a3fa677c672..ff3fdae5b40 100644 --- a/docs/zh/engines/table-engines/integrations/mongodb.md +++ b/docs/zh/engines/table-engines/integrations/mongodb.md @@ -37,7 +37,7 @@ ClickHouse 中的表,从 MongoDB 集合中读取数据: ``` text CREATE TABLE mongo_table ( - key UInt64, + key UInt64, data String ) ENGINE = MongoDB('mongo1:27017', 'test', 'simple_table', 'testuser', 'clickhouse'); ``` diff --git a/docs/zh/engines/table-engines/mergetree-family/collapsingmergetree.md b/docs/zh/engines/table-engines/mergetree-family/collapsingmergetree.md index 6d1dfac7686..6fb57dc19d9 100644 --- a/docs/zh/engines/table-engines/mergetree-family/collapsingmergetree.md +++ b/docs/zh/engines/table-engines/mergetree-family/collapsingmergetree.md @@ -1,4 +1,4 @@ -# 折叠树 {#table_engine-collapsingmergetree} +# CollapsingMergeTree {#table_engine-collapsingmergetree} 该引擎继承于 [MergeTree](mergetree.md),并在数据块合并算法中添加了折叠行的逻辑。 @@ -203,4 +203,4 @@ SELECT * FROM UAct FINAL 这种查询数据的方法是非常低效的。不要在大表中使用它。 -[来源文章](https://clickhouse.tech/docs/en/operations/table_engines/collapsingmergetree/) +[原文](https://clickhouse.tech/docs/en/operations/table_engines/collapsingmergetree/) diff --git a/docs/zh/engines/table-engines/mergetree-family/graphitemergetree.md b/docs/zh/engines/table-engines/mergetree-family/graphitemergetree.md index 7440abcc027..fa17e0d5c5e 100644 --- a/docs/zh/engines/table-engines/mergetree-family/graphitemergetree.md +++ b/docs/zh/engines/table-engines/mergetree-family/graphitemergetree.md @@ -70,7 +70,7 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] 除了`config_section`,其它所有参数和`MergeTree`的相应参数一样. -- `config_section` —配置文件中设置汇总规则的节点 +- `config_section` —配置文件中设置汇总规则的节点 diff --git a/docs/zh/engines/table-engines/mergetree-family/replacingmergetree.md b/docs/zh/engines/table-engines/mergetree-family/replacingmergetree.md index 73328015ea9..75ec4ea8b3d 100644 --- a/docs/zh/engines/table-engines/mergetree-family/replacingmergetree.md +++ b/docs/zh/engines/table-engines/mergetree-family/replacingmergetree.md @@ -28,7 +28,7 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] - `ver` — 版本列。类型为 `UInt*`, `Date` 或 `DateTime`。可选参数。 在数据合并的时候,`ReplacingMergeTree` 从所有具有相同排序键的行中选择一行留下: - + - 如果 `ver` 列未指定,保留最后一条。 - 如果 `ver` 列已指定,保留 `ver` 值最大的版本。 diff --git a/docs/zh/engines/table-engines/mergetree-family/versionedcollapsingmergetree.md b/docs/zh/engines/table-engines/mergetree-family/versionedcollapsingmergetree.md index 3b89da9f595..8479c92f56f 100644 --- a/docs/zh/engines/table-engines/mergetree-family/versionedcollapsingmergetree.md +++ b/docs/zh/engines/table-engines/mergetree-family/versionedcollapsingmergetree.md @@ -3,7 +3,7 @@ toc_priority: 37 toc_title: "版本折叠MergeTree" --- -# 版本折叠MergeTree {#versionedcollapsingmergetree} +# VersionedCollapsingMergeTree {#versionedcollapsingmergetree} 这个引擎: @@ -47,7 +47,7 @@ VersionedCollapsingMergeTree(sign, version) **查询 Clauses** -当创建一个 `VersionedCollapsingMergeTree` 表时,跟创建一个 `MergeTree`表的时候需要相同 [Clause](mergetree.md) +当创建一个 `VersionedCollapsingMergeTree` 表时,跟创建一个 `MergeTree`表的时候需要相同 [Clause](mergetree.md)
diff --git a/docs/zh/engines/table-engines/special/generate.md b/docs/zh/engines/table-engines/special/generate.md index 80966767462..885ad381d7f 100644 --- a/docs/zh/engines/table-engines/special/generate.md +++ b/docs/zh/engines/table-engines/special/generate.md @@ -5,7 +5,7 @@ toc_title: 随机数生成 # 随机数生成表引擎 {#table_engines-generate} -随机数生成表引擎为指定的表模式生成随机数 +随机数生成表引擎为指定的表模式生成随机数 使用示例: - 测试时生成可复写的大表 diff --git a/docs/zh/guides/apply-catboost-model.md b/docs/zh/guides/apply-catboost-model.md index 9002e5cf005..ad325dc29db 100644 --- a/docs/zh/guides/apply-catboost-model.md +++ b/docs/zh/guides/apply-catboost-model.md @@ -130,7 +130,7 @@ CatBoost集成到ClickHouse步骤: **1.** 构建评估库。 -评估CatBoost模型的最快方法是编译 `libcatboostmodel.` 库文件. +评估CatBoost模型的最快方法是编译 `libcatboostmodel.` 库文件. 有关如何构建库文件的详细信息,请参阅 [CatBoost文件](https://catboost.ai/docs/concepts/c-plus-plus-api_dynamic-c-pluplus-wrapper.html). @@ -186,7 +186,7 @@ CatBoost集成到ClickHouse步骤: ACTION AS target FROM amazon_train LIMIT 10 -``` +``` !!! note "注" 函数 [modelEvaluate](../sql-reference/functions/other-functions.md#function-modelevaluate) 返回带有多类模型的每类原始预测的元组。 diff --git a/docs/zh/guides/index.md b/docs/zh/guides/index.md index 8d822307c28..54cb4e1055c 100644 --- a/docs/zh/guides/index.md +++ b/docs/zh/guides/index.md @@ -8,9 +8,9 @@ toc_title: "\u6982\u8FF0" # ClickHouse指南 {#clickhouse-guides} -详细的一步一步的说明,帮助解决使用ClickHouse的各种任务列表: +列出了如何使用 Clickhouse 解决各种任务的详细说明: -- [简单集群设置教程](../getting-started/tutorial.md) +- [关于简单集群设置的教程](../getting-started/tutorial.md) - [在ClickHouse中应用CatBoost模型](apply-catboost-model.md) [原始文章](https://clickhouse.tech/docs/en/guides/) diff --git a/docs/zh/interfaces/formats.md b/docs/zh/interfaces/formats.md index ef18679af12..1cd91690e57 100644 --- a/docs/zh/interfaces/formats.md +++ b/docs/zh/interfaces/formats.md @@ -62,7 +62,7 @@ ClickHouse可以接受和返回各种格式的数据。受支持的输入格式 | [RawBLOB](#rawblob) | ✔ | ✔ | -您可以使用ClickHouse设置一些格式化参数。更多详情设置请参考[设置](../operations/settings/settings.md) +您可以使用ClickHouse设置一些格式化参数。更多详情设置请参考[设置](../operations/settings/settings.md) ## TabSeparated {#tabseparated} diff --git a/docs/zh/interfaces/http.md b/docs/zh/interfaces/http.md index 1bae0ad1df3..8ab54293b32 100644 --- a/docs/zh/interfaces/http.md +++ b/docs/zh/interfaces/http.md @@ -162,7 +162,7 @@ $ echo 'DROP TABLE t' | curl 'http://localhost:8123/' --data-binary @- 如果在URL中指定了`compress=1`,服务会返回压缩的数据。 如果在URL中指定了`decompress=1`,服务会解压通过POST方法发送的数据。 -您也可以选择使用[HTTP compression](https://en.wikipedia.org/wiki/HTTP_compression)。发送一个压缩的POST请求,附加请求头`Content-Encoding: compression_method`。为了使ClickHouse响应,您必须附加`Accept-Encoding: compression_method`。ClickHouse支持`gzip`,`br`和`deflate` [compression methods](https://en.wikipedia.org/wiki/HTTP_compression#Content-Encoding_tokens)。要启用HTTP压缩,必须使用ClickHouse[启用Http压缩](../operations/settings/settings.md#settings-enable_http_compression)配置。您可以在[Http zlib压缩级别](#settings-http_zlib_compression_level)设置中为所有压缩方法配置数据压缩级别。 +您也可以选择使用[HTTP compression](https://en.wikipedia.org/wiki/HTTP_compression)。发送一个压缩的POST请求,附加请求头`Content-Encoding: compression_method`。为了使ClickHouse响应,您必须附加`Accept-Encoding: compression_method`。ClickHouse支持`gzip`,`br`和`deflate` [compression methods](https://en.wikipedia.org/wiki/HTTP_compression#Content-Encoding_tokens)。要启用HTTP压缩,必须使用ClickHouse[启用Http压缩](../operations/settings/settings.md#settings-enable_http_compression)配置。您可以在[Http zlib压缩级别](#settings-http_zlib_compression_level)设置中为所有压缩方法配置数据压缩级别。 您可以使用它在传输大量数据时减少网络流量,或者创建立即压缩的转储。 diff --git a/docs/zh/interfaces/tcp.md b/docs/zh/interfaces/tcp.md index b779b9fea40..571fd22b758 100644 --- a/docs/zh/interfaces/tcp.md +++ b/docs/zh/interfaces/tcp.md @@ -5,6 +5,6 @@ toc_title: 原生接口(TCP) # 原生接口(TCP){#native-interface-tcp} -原生接口用于[命令行客户端](cli.md),用于分布式查询处理期间的服务器间通信,以及其他C++程序。可惜的是,原生的ClickHouse协议还没有正式的规范,但它可以从ClickHouse[源代码](https://github.com/ClickHouse/ClickHouse/tree/master/src/Client)通过拦截和分析TCP流量进行反向工程。 +原生接口协议用于[命令行客户端](cli.md),用于分布式查询处理期间的服务器间通信,以及其他C++ 程序。不幸的是,原生ClickHouse协议还没有正式的规范,但它可以从ClickHouse源代码[从这里开始](https://github.com/ClickHouse/ClickHouse/tree/master/src/Client)或通过拦截和分析TCP流量进行逆向工程。 -[来源文章](https://clickhouse.tech/docs/zh/interfaces/tcp/) +[原文](https://clickhouse.tech/docs/en/interfaces/tcp/) diff --git a/docs/zh/interfaces/third-party/gui.md b/docs/zh/interfaces/third-party/gui.md index e85f8b2ec79..46baf55d564 100644 --- a/docs/zh/interfaces/third-party/gui.md +++ b/docs/zh/interfaces/third-party/gui.md @@ -57,9 +57,9 @@ ClickHouse Web 界面 [Tabix](https://github.com/tabixio/tabix). - 表格预览。 - 自动完成。 -### ツ环板-ョツ嘉ッツ偲 {#clickhouse-cli} +### clickhouse-cli {#clickhouse-cli} -[ツ环板-ョツ嘉ッツ偲](https://github.com/hatarist/clickhouse-cli) 是ClickHouse的替代命令行客户端,用Python 3编写。 +[clickhouse-cli](https://github.com/hatarist/clickhouse-cli) 是ClickHouse的替代命令行客户端,用Python 3编写。 特征: @@ -68,15 +68,15 @@ ClickHouse Web 界面 [Tabix](https://github.com/tabixio/tabix). - 寻呼机支持数据输出。 - 自定义PostgreSQL类命令。 -### ツ暗ェツ氾环催ツ団ツ法ツ人 {#clickhouse-flamegraph} +### clickhouse-flamegraph {#clickhouse-flamegraph} [clickhouse-flamegraph](https://github.com/Slach/clickhouse-flamegraph) 是一个可视化的专业工具`system.trace_log`如[flamegraph](http://www.brendangregg.com/flamegraphs.html). ## 商业 {#shang-ye} -### ツ环板Softwareョツ嘉ッ {#holistics-software} +### Holistics {#holistics-software} -[整体学](https://www.holistics.io/) 在2019年被Gartner FrontRunners列为可用性最高排名第二的商业智能工具之一。 Holistics是一个基于SQL的全栈数据平台和商业智能工具,用于设置您的分析流程。 +[Holistics](https://www.holistics.io/) 在2019年被Gartner FrontRunners列为可用性最高排名第二的商业智能工具之一。 Holistics是一个基于SQL的全栈数据平台和商业智能工具,用于设置您的分析流程。 特征: diff --git a/docs/zh/interfaces/third-party/integrations.md b/docs/zh/interfaces/third-party/integrations.md index 403ef994bb9..20dcf47cabd 100644 --- a/docs/zh/interfaces/third-party/integrations.md +++ b/docs/zh/interfaces/third-party/integrations.md @@ -43,7 +43,7 @@ Yandex**没有**维护下面列出的库,也没有做过任何广泛的测试 - Monitoring - [Graphite](https://graphiteapp.org) - [graphouse](https://github.com/yandex/graphouse) - - [carbon-clickhouse](https://github.com/lomik/carbon-clickhouse) + + - [carbon-clickhouse](https://github.com/lomik/carbon-clickhouse) - [graphite-clickhouse](https://github.com/lomik/graphite-clickhouse) - [graphite-ch-optimizer](https://github.com/innogames/graphite-ch-optimizer) - optimizes staled partitions in [\*GraphiteMergeTree](../../engines/table-engines/mergetree-family/graphitemergetree.md#graphitemergetree) if rules from [rollup configuration](../../engines/table-engines/mergetree-family/graphitemergetree.md#rollup-configuration) could be applied - [Grafana](https://grafana.com/) diff --git a/docs/zh/introduction/adopters.md b/docs/zh/introduction/adopters.md index ed78abeacfb..6b9ac7c2ceb 100644 --- a/docs/zh/introduction/adopters.md +++ b/docs/zh/introduction/adopters.md @@ -64,7 +64,7 @@ toc_title: "ClickHouse用户" | [Splunk](https://www.splunk.com/) | 业务分析 | 主要产品 | — | — | [英文幻灯片,2018年1月](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup12/splunk.pdf) | | [Spotify](https://www.spotify.com) | 音乐 | 实验 | — | — | [幻灯片,七月2018](https://www.slideshare.net/glebus/using-clickhouse-for-experimentation-104247173) | | [腾讯](https://www.tencent.com) | 大数据 | 数据处理 | — | — | [中文幻灯片,2018年10月](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/5.%20ClickHouse大数据集群应用_李俊飞腾讯网媒事业部.pdf) | -| 腾讯QQ音乐(TME) | 大数据 | 数据处理 | — | — | [博客文章,2020年6月](https://cloud.tencent.com/developer/article/1637840) +| 腾讯QQ音乐(TME) | 大数据 | 数据处理 | — | — | [博客文章,2020年6月](https://cloud.tencent.com/developer/article/1637840) | [优步](https://www.uber.com) | 出租车 | 日志记录 | — | — | [幻灯片,二月2020](https://presentations.clickhouse.tech/meetup40/uber.pdf) | | [VKontakte](https://vk.com) | 社交网络 | 统计,日志记录 | — | — | [俄文幻灯片,八月2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup17/3_vk.pdf) | | [Wisebits](https://wisebits.com/) | IT解决方案 | 分析 | — | — | [俄文幻灯片,2019年5月](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup22/strategies.pdf) | diff --git a/docs/zh/operations/index.md b/docs/zh/operations/index.md index f35858279f5..5139f083ceb 100644 --- a/docs/zh/operations/index.md +++ b/docs/zh/operations/index.md @@ -5,9 +5,21 @@ toc_title: "操作" # 操作 {#operations} -Clickhouse运维手册主要包含下面几部分: +ClickHouse操作手册由以下主要部分组成: -- 安装要求 +- [安装要求](../operations/requirements.md) +- [监控](../operations/monitoring.md) +- [故障排除](../operations/troubleshooting.md) +- [使用建议](../operations/tips.md) +- [更新程序](../operations/update.md) +- [访问权限](../operations/access-rights.md) +- [数据备份](../operations/backup.md) +- [配置文件](../operations/configuration-files.md) +- [配额](../operations/quotas.md) +- [系统表](../operations/system-tables/index.md) +- [服务器配置参数](../operations/server-configuration-parameters/index.md) +- [如何用ClickHouse测试你的硬件](../operations/performance-test.md) +- [设置](../operations/settings/index.md) +- [实用工具](../operations/utilities/index.md) - -[原始文章](https://clickhouse.tech/docs/en/operations/) +[原文](https://clickhouse.tech/docs/en/operations/) diff --git a/docs/zh/operations/server-configuration-parameters/settings.md b/docs/zh/operations/server-configuration-parameters/settings.md index 615f5ef933d..0c6a5046877 100644 --- a/docs/zh/operations/server-configuration-parameters/settings.md +++ b/docs/zh/operations/server-configuration-parameters/settings.md @@ -462,7 +462,7 @@ SSL客户端/服务器配置。 - extendedVerification – Automatically extended verification of certificates after the session ends. Acceptable values: `true`, `false`. - requireTLSv1 – Require a TLSv1 connection. Acceptable values: `true`, `false`. - requireTLSv1_1 – Require a TLSv1.1 connection. Acceptable values: `true`, `false`. -- requireTLSv1 – Require a TLSv1.2 connection. Acceptable values: `true`, `false`. +- requireTLSv1_2 – Require a TLSv1.2 connection. Acceptable values: `true`, `false`. - fips – Activates OpenSSL FIPS mode. Supported if the library’s OpenSSL version supports FIPS. - privateKeyPassphraseHandler – Class (PrivateKeyPassphraseHandler subclass) that requests the passphrase for accessing the private key. For example: ``, `KeyFileHandler`, `test`, ``. - invalidCertificateHandler – Class (a subclass of CertificateHandler) for verifying invalid certificates. For example: ` ConsoleCertificateHandler ` . diff --git a/docs/zh/operations/system-tables/asynchronous_metrics.md b/docs/zh/operations/system-tables/asynchronous_metrics.md index 5a302f6da7b..d6d2682c9a1 100644 --- a/docs/zh/operations/system-tables/asynchronous_metrics.md +++ b/docs/zh/operations/system-tables/asynchronous_metrics.md @@ -9,8 +9,8 @@ machine_translated_rev: 5decc73b5dc60054f19087d3690c4eb99446a6c3 列: -- `metric` ([字符串](../../sql-reference/data-types/string.md)) — 指标名。 -- `value` ([Float64](../../sql-reference/data-types/float.md)) — 指标值。 +- `metric` ([字符串](../../sql-reference/data-types/string.md)) — 指标名。 +- `value` ([Float64](../../sql-reference/data-types/float.md)) — 指标值。 **示例** @@ -35,6 +35,6 @@ SELECT * FROM system.asynchronous_metrics LIMIT 10 **另请参阅** - [监测](../../operations/monitoring.md) — ClickHouse监控的基本概念。 -- [系统。指标](../../operations/system-tables/metrics.md#system_tables-metrics) — 包含即时计算的指标。 -- [系统。活动](../../operations/system-tables/events.md#system_tables-events) — 包含出现的事件的次数。 +- [系统。指标](../../operations/system-tables/metrics.md#system_tables-metrics) — 包含即时计算的指标。 +- [系统。活动](../../operations/system-tables/events.md#system_tables-events) — 包含出现的事件的次数。 - [系统。metric\_log](../../operations/system-tables/metric_log.md#system_tables-metric_log) — 包含`system.metrics` 和 `system.events`表中的指标的历史值。 diff --git a/docs/zh/operations/system-tables/clusters.md b/docs/zh/operations/system-tables/clusters.md index bcafff4970a..386bdfd539b 100644 --- a/docs/zh/operations/system-tables/clusters.md +++ b/docs/zh/operations/system-tables/clusters.md @@ -5,13 +5,13 @@ 列: - `cluster` (String) — 集群名。 -- `shard_num` (UInt32) — 集群中的分片数,从1开始。 +- `shard_num` (UInt32) — 集群中的分片数,从1开始。 - `shard_weight` (UInt32) — 写数据时该分片的相对权重。 -- `replica_num` (UInt32) — 分片的副本数量,从1开始。 -- `host_name` (String) — 配置中指定的主机名。 +- `replica_num` (UInt32) — 分片的副本数量,从1开始。 +- `host_name` (String) — 配置中指定的主机名。 - `host_address` (String) — 从DNS获取的主机IP地址。 -- `port` (UInt16) — 连接到服务器的端口。 -- `user` (String) — 连接到服务器的用户名。 +- `port` (UInt16) — 连接到服务器的端口。 +- `user` (String) — 连接到服务器的用户名。 - `errors_count` (UInt32) - 此主机无法访问副本的次数。 - `slowdowns_count` (UInt32) - 与对冲请求建立连接时导致更改副本的减速次数。 - `estimated_recovery_time` (UInt32) - 剩下的秒数,直到副本错误计数归零并被视为恢复正常。 diff --git a/docs/zh/operations/system-tables/data_type_families.md b/docs/zh/operations/system-tables/data_type_families.md index 000abfce65d..b1d114a6df0 100644 --- a/docs/zh/operations/system-tables/data_type_families.md +++ b/docs/zh/operations/system-tables/data_type_families.md @@ -1,9 +1,5 @@ ---- -machine_translated: true -machine_translated_rev: 5decc73b5dc60054f19087d3690c4eb99446a6c3 ---- -# 系统。data_type_families {#system_tables-data_type_families} +# system.data_type_families {#system_tables-data_type_families} 包含有关受支持的[数据类型](../../sql-reference/data-types/)的信息. diff --git a/docs/zh/operations/system-tables/functions.md b/docs/zh/operations/system-tables/functions.md index 8229a94cd5c..695c7b7fee1 100644 --- a/docs/zh/operations/system-tables/functions.md +++ b/docs/zh/operations/system-tables/functions.md @@ -26,5 +26,5 @@ │ JSONExtractInt │ 0 │ 0 │ │ └──────────────────────────┴──────────────┴──────────────────┴──────────┘ -10 rows in set. Elapsed: 0.002 sec. +10 rows in set. Elapsed: 0.002 sec. ``` diff --git a/docs/zh/operations/system-tables/tables.md b/docs/zh/operations/system-tables/tables.md index 0c3e913b9bb..d82911498ad 100644 --- a/docs/zh/operations/system-tables/tables.md +++ b/docs/zh/operations/system-tables/tables.md @@ -51,7 +51,7 @@ machine_translated_rev: 5decc73b5dc60054f19087d3690c4eb99446a6c3 - 如果表将数据存在磁盘上,返回实际使用的磁盘空间(压缩后)。 - 如果表在内存中存储数据,返回在内存中使用的近似字节数。 -- `lifetime_rows` (Nullbale(UInt64))-服务启动后插入的总行数(只针对`Buffer`表)。 +- `lifetime_rows` (Nullbale(UInt64))-服务启动后插入的总行数(只针对`Buffer`表)。 `system.tables` 表被用于 `SHOW TABLES` 的查询实现中。 diff --git a/docs/zh/operations/system-tables/zookeeper.md b/docs/zh/operations/system-tables/zookeeper.md index ca767fba7aa..c25ce498460 100644 --- a/docs/zh/operations/system-tables/zookeeper.md +++ b/docs/zh/operations/system-tables/zookeeper.md @@ -20,14 +20,14 @@ machine_translated_rev: 5decc73b5dc60054f19087d3690c4eb99446a6c3 - `name` (String) — 节点的名字。 - `path` (String) — 节点的路径。 -- `value` (String) — 节点的值。 +- `value` (String) — 节点的值。 - `dataLength` (Int32) — 节点的值长度。 - `numChildren` (Int32) — 子节点的个数。 - `czxid` (Int64) — 创建该节点的事务ID。 - `mzxid` (Int64) — 最后修改该节点的事务ID。 - `pzxid` (Int64) — 最后删除或者增加子节点的事务ID。 -- `ctime` (DateTime) — 节点的创建时间。 -- `mtime` (DateTime) — 节点的最后修改时间。 +- `ctime` (DateTime) — 节点的创建时间。 +- `mtime` (DateTime) — 节点的最后修改时间。 - `version` (Int32) — 节点版本:节点被修改的次数。 - `cversion` (Int32) — 增加或删除子节点的个数。 - `aversion` (Int32) — ACL的修改次数。 diff --git a/docs/zh/operations/utilities/clickhouse-benchmark.md b/docs/zh/operations/utilities/clickhouse-benchmark.md index 1c255f621c0..54dbadc79bc 100644 --- a/docs/zh/operations/utilities/clickhouse-benchmark.md +++ b/docs/zh/operations/utilities/clickhouse-benchmark.md @@ -89,11 +89,11 @@ localhost:9000, queries 10, QPS: 6.772, RPS: 67904487.440, MiB/s: 518.070, resul - ClickHouse服务器的连接信息。 - 已处理的查询数。 - - QPS:服务端每秒处理的查询数量 - - RPS:服务器每秒读取多少行 - - MiB/s:服务器每秒读取多少字节的数据 - - 结果RPS:服务端每秒生成多少行的结果集数据 - - 结果MiB/s.服务端每秒生成多少字节的结果集数据 + - QPS:服务端每秒处理的查询数量 + - RPS:服务器每秒读取多少行 + - MiB/s:服务器每秒读取多少字节的数据 + - 结果RPS:服务端每秒生成多少行的结果集数据 + - 结果MiB/s.服务端每秒生成多少字节的结果集数据 - 查询执行时间的百分比。 diff --git a/docs/zh/sql-reference/aggregate-functions/parametric-functions.md b/docs/zh/sql-reference/aggregate-functions/parametric-functions.md index fc0c7144305..468e8e9c76e 100644 --- a/docs/zh/sql-reference/aggregate-functions/parametric-functions.md +++ b/docs/zh/sql-reference/aggregate-functions/parametric-functions.md @@ -19,7 +19,7 @@ histogram(number_of_bins)(values) **参数** -`number_of_bins` — 直方图bin个数,这个函数会自动计算bin的数量,而且会尽量使用指定值,如果无法做到,那就使用更小的bin个数。 +`number_of_bins` — 直方图bin个数,这个函数会自动计算bin的数量,而且会尽量使用指定值,如果无法做到,那就使用更小的bin个数。 `values` — [表达式](../syntax.md#syntax-expressions) 输入值。 diff --git a/docs/zh/sql-reference/aggregate-functions/reference/anylast.md b/docs/zh/sql-reference/aggregate-functions/reference/anylast.md index e6792e0e449..81c93957fbf 100644 --- a/docs/zh/sql-reference/aggregate-functions/reference/anylast.md +++ b/docs/zh/sql-reference/aggregate-functions/reference/anylast.md @@ -6,4 +6,3 @@ toc_priority: 104 选择遇到的最后一个值。 其结果和[any](../../../sql-reference/aggregate-functions/reference/any.md) 函数一样是不确定的 。 - \ No newline at end of file diff --git a/docs/zh/sql-reference/aggregate-functions/reference/avgweighted.md b/docs/zh/sql-reference/aggregate-functions/reference/avgweighted.md index 9b732f57b4a..433b1c12099 100644 --- a/docs/zh/sql-reference/aggregate-functions/reference/avgweighted.md +++ b/docs/zh/sql-reference/aggregate-functions/reference/avgweighted.md @@ -15,8 +15,8 @@ avgWeighted(x, weight) **参数** -- `x` — 值。 -- `weight` — 值的加权。 +- `x` — 值。 +- `weight` — 值的加权。 `x` 和 `weight` 的类型必须是 [整数](../../../sql-reference/data-types/int-uint.md), 或 diff --git a/docs/zh/sql-reference/aggregate-functions/reference/rankCorr.md b/docs/zh/sql-reference/aggregate-functions/reference/rankCorr.md index c29a43f6ca9..716a9fb2440 100644 --- a/docs/zh/sql-reference/aggregate-functions/reference/rankCorr.md +++ b/docs/zh/sql-reference/aggregate-functions/reference/rankCorr.md @@ -17,7 +17,7 @@ rankCorr(x, y) - Returns a rank correlation coefficient of the ranks of x and y. The value of the correlation coefficient ranges from -1 to +1. If less than two arguments are passed, the function will return an exception. The value close to +1 denotes a high linear relationship, and with an increase of one random variable, the second random variable also increases. The value close to -1 denotes a high linear relationship, and with an increase of one random variable, the second random variable decreases. The value close or equal to 0 denotes no relationship between the two random variables. -类型: [Float64](../../../sql-reference/data-types/float.md#float32-float64)。 +类型: [Float64](../../../sql-reference/data-types/float.md#float32-float64)。 **示例** diff --git a/docs/zh/sql-reference/data-types/lowcardinality.md b/docs/zh/sql-reference/data-types/lowcardinality.md index b8985691f0f..a0cd4c270c3 100644 --- a/docs/zh/sql-reference/data-types/lowcardinality.md +++ b/docs/zh/sql-reference/data-types/lowcardinality.md @@ -32,7 +32,7 @@ LowCardinality(data_type) ```sql CREATE TABLE lc_t ( - `id` UInt16, + `id` UInt16, `strings` LowCardinality(String) ) ENGINE = MergeTree() diff --git a/docs/zh/sql-reference/data-types/special-data-types/interval.md b/docs/zh/sql-reference/data-types/special-data-types/interval.md index 9df25e3f555..7328988c68d 100644 --- a/docs/zh/sql-reference/data-types/special-data-types/interval.md +++ b/docs/zh/sql-reference/data-types/special-data-types/interval.md @@ -57,7 +57,7 @@ SELECT now() as current_date_time, current_date_time + INTERVAL 4 DAY 不同类型的间隔不能合并。 你不能使用诸如 `4 DAY 1 HOUR` 的时间间隔. 以小于或等于时间间隔最小单位的单位来指定间隔,例如,时间间隔 `1 day and an hour` 可以表示为 `25 HOUR` 或 `90000 SECOND`. 你不能对 `Interval` 类型的值执行算术运算,但你可以向 `Date` 或 `DateTime` 数据类型的值添加不同类型的时间间隔,例如: - + ``` sql SELECT now() AS current_date_time, current_date_time + INTERVAL 4 DAY + INTERVAL 3 HOUR ``` diff --git a/docs/zh/sql-reference/functions/bitmap-functions.md b/docs/zh/sql-reference/functions/bitmap-functions.md index 5a6baf2f217..c4c1b7293f6 100644 --- a/docs/zh/sql-reference/functions/bitmap-functions.md +++ b/docs/zh/sql-reference/functions/bitmap-functions.md @@ -81,13 +81,37 @@ SELECT bitmapToArray(bitmapSubsetInRange(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11, **示例** ``` sql -SELECT bitmapToArray(bitmapSubsetInRange(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,100,200,500]), toUInt32(30), toUInt32(200))) AS res +SELECT bitmapToArray(bitmapSubsetLimit(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,100,200,500]), toUInt32(30), toUInt32(200))) AS res ``` ┌─res───────────────────────┐ │ [30,31,32,33,100,200,500] │ └───────────────────────────┘ +## subBitmap {#subBitmap} + +将位图跳过`offset`个元素,限制大小为`limit`个的结果转换为另一个位图。 + + subBitmap(bitmap, offset, limit) + +**参数** + +- `bitmap` – 位图对象. +- `offset` – 跳过多少个元素. +- `limit` – 子位图基数上限. + +**示例** + +``` sql +SELECT bitmapToArray(subBitmap(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,100,200,500]), toUInt32(10), toUInt32(10))) AS res +``` + +```text +┌─res─────────────────────────────┐ +│ [10,11,12,13,14,15,16,17,18,19] │ +└─────────────────────────────────┘ +``` + ## bitmapContains {#bitmapcontains} 检查位图是否包含指定元素。 @@ -174,7 +198,7 @@ SELECT bitmapToArray(bitmapAnd(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS re │ [3] │ └─────┘ -## 位图 {#bitmapor} +## 位图或 {#bitmapor} 为两个位图对象进行或操作,返回一个新的位图对象。 diff --git a/docs/zh/sql-reference/functions/date-time-functions.md b/docs/zh/sql-reference/functions/date-time-functions.md index 12024a11c3d..9f8e7f49d07 100644 --- a/docs/zh/sql-reference/functions/date-time-functions.md +++ b/docs/zh/sql-reference/functions/date-time-functions.md @@ -364,13 +364,13 @@ SELECT toDate('2016-12-27') AS date, toYearWeek(date) AS yearWeek0, toYearWeek(d 将Date或DateTime按指定的单位向前取整到最接近的时间点。 -**语法** +**语法** ``` sql date_trunc(unit, value[, timezone]) ``` -别名: `dateTrunc`. +别名: `dateTrunc`. **参数** @@ -433,7 +433,7 @@ SELECT now(), date_trunc('hour', now(), 'Europe/Moscow'); 返回当前日期和时间。 -**语法** +**语法** ``` sql now([timezone]) diff --git a/docs/zh/sql-reference/functions/encoding-functions.md b/docs/zh/sql-reference/functions/encoding-functions.md index 75e0118a88d..e0daab15dd3 100644 --- a/docs/zh/sql-reference/functions/encoding-functions.md +++ b/docs/zh/sql-reference/functions/encoding-functions.md @@ -1,7 +1,7 @@ # 编码函数 {#bian-ma-han-shu} ## char {#char} - + 返回长度为传递参数数量的字符串,并且每个字节都有对应参数的值。接受数字Numeric类型的多个参数。如果参数的值超出了UInt8数据类型的范围,则将其转换为UInt8,并可能进行舍入和溢出。 **语法** diff --git a/docs/zh/sql-reference/statements/alter.md b/docs/zh/sql-reference/statements/alter.md index 4d1cdca71e5..81ef9124e45 100644 --- a/docs/zh/sql-reference/statements/alter.md +++ b/docs/zh/sql-reference/statements/alter.md @@ -208,7 +208,7 @@ ALTER TABLE [db].name DROP CONSTRAINT constraint_name; - [MOVE PARTITION TO TABLE](#alter_move_to_table-partition) — 从表中复制数据分区到其它表. - [CLEAR COLUMN IN PARTITION](#alter_clear-column-partition) — 重置分区中某个列的值 - [CLEAR INDEX IN PARTITION](#alter_clear-index-partition) — 重置分区中指定的二级索引 -- [FREEZE PARTITION](#alter_freeze-partition) — 创建分区的备份 +- [FREEZE PARTITION](#alter_freeze-partition) — 创建分区的备份 - [FETCH PARTITION](#alter_fetch-partition) — 从其它服务器上下载分 - [MOVE PARTITION\|PART](#alter_move-partition) — 将分区/数据块移动到另外的磁盘/卷 @@ -380,7 +380,7 @@ ALTER TABLE table_name FETCH PARTITION partition_expr FROM 'path-in-zookeeper' 从另一服务器上下载分区数据。仅支持可复制引擎表。 该操作做了如下步骤: 1. 从指定数据分片上下载分区。在 path-in-zookeeper 这一参数你必须设置Zookeeper中该分片的path值。 -2. 然后将已下载的数据放到 `table_name` 表的 `detached` 目录下。通过 [ATTACH PARTITION\|PART](#alter_attach-partition)将数据加载到表中。 +2. 然后将已下载的数据放到 `table_name` 表的 `detached` 目录下。通过 [ATTACH PARTITION\|PART](#alter_attach-partition)将数据加载到表中。 示例: diff --git a/docs/zh/sql-reference/statements/grant.md b/docs/zh/sql-reference/statements/grant.md index f8d85679fa3..cb3952767ac 100644 --- a/docs/zh/sql-reference/statements/grant.md +++ b/docs/zh/sql-reference/statements/grant.md @@ -12,7 +12,7 @@ toc_title: 授权操作 ## 授权操作语法 {#grant-privigele-syntax} ``` sql -GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION] +GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION] [WITH REPLACE OPTION] ``` - `privilege` — 权限类型 @@ -20,17 +20,19 @@ GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.ta - `user` — 用户账号 `WITH GRANT OPTION` 授予 `user` 或 `role`执行 `GRANT` 操作的权限。用户可将在自身权限范围内的权限进行授权 +`WITH REPLACE OPTION` 以当前sql里的新权限替代掉 `user` 或 `role`的旧权限,如果没有该选项则是追加授权。 ## 角色分配的语法 {#assign-role-syntax} ``` sql -GRANT [ON CLUSTER cluster_name] role [,...] TO {user | another_role | CURRENT_USER} [,...] [WITH ADMIN OPTION] +GRANT [ON CLUSTER cluster_name] role [,...] TO {user | another_role | CURRENT_USER} [,...] [WITH ADMIN OPTION] [WITH REPLACE OPTION] ``` - `role` — 角色 - `user` — 用户 `WITH ADMIN OPTION` 授予 `user` 或 `role` 执行[ADMIN OPTION](#admin-option-privilege) 的权限 +`WITH REPLACE OPTION` 以当前sql里的新role替代掉 `user` 或 `role`的旧role,如果没有该选项则是追加roles。 ## 用法 {#grant-usage} @@ -86,7 +88,7 @@ GRANT SELECT(x,y) ON db.table TO john WITH GRANT OPTION - `ALTER CLEAR INDEX` - `ALTER CONSTRAINT` - `ALTER ADD CONSTRAINT` - + - `ALTER DROP CONSTRAINT` - `ALTER TTL` - `ALTER MATERIALIZE TTL` diff --git a/docs/zh/sql-reference/statements/misc.md b/docs/zh/sql-reference/statements/misc.md index 26b3997a4d6..5ec589c9e9a 100644 --- a/docs/zh/sql-reference/statements/misc.md +++ b/docs/zh/sql-reference/statements/misc.md @@ -21,7 +21,7 @@ toc_title: "\u5176\u4ED6" ATTACH TABLE [IF NOT EXISTS] [db.]name [ON CLUSTER cluster] ``` -启动服务器时会自动触发此查询。 +启动服务器时会自动触发此查询。 服务器将表的元数据作为文件存储 `ATTACH` 查询,它只是在启动时运行。有些表例外,如系统表,它们是在服务器上显式指定的。 diff --git a/docs/zh/sql-reference/statements/select/from.md b/docs/zh/sql-reference/statements/select/from.md index 71b7cd319eb..fae25c0c3c1 100644 --- a/docs/zh/sql-reference/statements/select/from.md +++ b/docs/zh/sql-reference/statements/select/from.md @@ -14,7 +14,7 @@ toc_title: FROM 子查询是另一个 `SELECT` 可以指定在 `FROM` 后的括号内的查询。 -`FROM` 子句可以包含多个数据源,用逗号分隔,这相当于在他们身上执行 [CROSS JOIN](../../../sql-reference/statements/select/join.md) +`FROM` 子句可以包含多个数据源,用逗号分隔,这相当于在他们身上执行 [CROSS JOIN](../../../sql-reference/statements/select/join.md) ## FINAL 修饰符 {#select-from-final} diff --git a/docs/zh/sql-reference/statements/select/index.md b/docs/zh/sql-reference/statements/select/index.md index 689a4f91a0c..d3de71efc6b 100644 --- a/docs/zh/sql-reference/statements/select/index.md +++ b/docs/zh/sql-reference/statements/select/index.md @@ -22,7 +22,7 @@ SELECT [DISTINCT] expr_list [WHERE expr] [GROUP BY expr_list] [WITH TOTALS] [HAVING expr] -[ORDER BY expr_list] [WITH FILL] [FROM expr] [TO expr] [STEP expr] +[ORDER BY expr_list] [WITH FILL] [FROM expr] [TO expr] [STEP expr] [LIMIT [offset_value, ]n BY columns] [LIMIT [n, ]m] [WITH TIES] [UNION ALL ...] diff --git a/docs/zh/sql-reference/statements/select/join.md b/docs/zh/sql-reference/statements/select/join.md index 407c8ca6101..911ff15f576 100644 --- a/docs/zh/sql-reference/statements/select/join.md +++ b/docs/zh/sql-reference/statements/select/join.md @@ -51,7 +51,7 @@ ClickHouse中提供的其他联接类型: - 必须包含有序序列。 - 可以是以下类型之一: [Int*,UInt*](../../../sql-reference/data-types/int-uint.md), [Float\*](../../../sql-reference/data-types/float.md), [Date](../../../sql-reference/data-types/date.md), [DateTime](../../../sql-reference/data-types/datetime.md), [Decimal\*](../../../sql-reference/data-types/decimal.md). -- 不能是`JOIN`子句中唯一的列 +- 不能是`JOIN`子句中唯一的列 语法 `ASOF JOIN ... ON`: diff --git a/docs/zh/sql-reference/table-functions/input.md b/docs/zh/sql-reference/table-functions/input.md index a0215b26c8a..61bb58d73e2 100644 --- a/docs/zh/sql-reference/table-functions/input.md +++ b/docs/zh/sql-reference/table-functions/input.md @@ -16,7 +16,7 @@ toc_title: input 数据可以像普通 `INSERT` 查询一样发送,并以必须在查询末尾指定的任何可用[格式](../../interfaces/formats.md#formats) 传递(与普通 `INSERT SELECT`不同)。 -该函数的主要特点是,当服务器从客户端接收数据时,它会同时根据 `SELECT` 子句中的表达式列表将其转换,并插入到目标表中。 +该函数的主要特点是,当服务器从客户端接收数据时,它会同时根据 `SELECT` 子句中的表达式列表将其转换,并插入到目标表中。 不会创建包含所有已传输数据的临时表。 **例** diff --git a/docs/zh/sql-reference/table-functions/jdbc.md b/docs/zh/sql-reference/table-functions/jdbc.md index 02ebdcb407e..4d95a5ed203 100644 --- a/docs/zh/sql-reference/table-functions/jdbc.md +++ b/docs/zh/sql-reference/table-functions/jdbc.md @@ -25,7 +25,7 @@ SELECT * FROM jdbc('mysql-dev?p1=233', 'num Int32', 'select toInt32OrZero(''{{p1 ``` ``` sql -SELECT * +SELECT * FROM jdbc('mysql-dev?p1=233', 'num Int32', 'select toInt32OrZero(''{{p1}}'') as num') ``` diff --git a/docs/zh/sql-reference/table-functions/mysql.md b/docs/zh/sql-reference/table-functions/mysql.md index c54cd7d2a06..3ed0001b0a0 100644 --- a/docs/zh/sql-reference/table-functions/mysql.md +++ b/docs/zh/sql-reference/table-functions/mysql.md @@ -1,13 +1,8 @@ ---- -machine_translated: true -machine_translated_rev: 72537a2d527c63c07aa5d2361a8829f3895cf2bd -toc_priority: 42 -toc_title: mysql ---- - # mysql {#mysql} -允许 `SELECT` 要对存储在远程MySQL服务器上的数据执行的查询。 +允许对存储在远程MySQL服务器上的数据执行`SELECT`和`INSERT`查询。 + +**语法** ``` sql mysql('host:port', 'database', 'table', 'user', 'password'[, replace_query, 'on_duplicate_clause']); @@ -15,31 +10,44 @@ mysql('host:port', 'database', 'table', 'user', 'password'[, replace_query, 'on_ **参数** -- `host:port` — MySQL server address. +- `host:port` — MySQL服务器地址. -- `database` — Remote database name. +- `database` — 远程数据库名称. -- `table` — Remote table name. +- `table` — 远程表名称. -- `user` — MySQL user. +- `user` — MySQL用户. -- `password` — User password. +- `password` — 用户密码. -- `replace_query` — Flag that converts `INSERT INTO` 查询到 `REPLACE INTO`. 如果 `replace_query=1`,查询被替换。 +- `replace_query` — 将INSERT INTO` 查询转换为 `REPLACE INTO`的标志。如果 `replace_query=1`,查询被替换。 -- `on_duplicate_clause` — The `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`,ClickHouse将产生异常。 - Example: `INSERT INTO t (c1,c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1`, where `on_duplicate_clause` is `UPDATE c2 = c2 + 1`. See the MySQL documentation to find which `on_duplicate_clause` you can use with the `ON DUPLICATE KEY` clause. + 示例:`INSERT INTO t (c1,c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1` - To specify `on_duplicate_clause` you need to pass `0` to the `replace_query` parameter. If you simultaneously pass `replace_query = 1` and `on_duplicate_clause`, ClickHouse generates an exception. + `on_duplicate_clause`这里是`UPDATE c2 = c2 + 1`。请查阅MySQL文档,来找到可以和`ON DUPLICATE KEY`一起使用的 `on_duplicate_clause`子句。 -简单 `WHERE` 条款如 `=, !=, >, >=, <, <=` 当前在MySQL服务器上执行。 +简单的 `WHERE` 子句如 `=, !=, >, >=, <, <=` 将即时在MySQL服务器上执行。其余的条件和 `LIMIT` 只有在对MySQL的查询完成后,才会在ClickHouse中执行采样约束。 -其余的条件和 `LIMIT` 只有在对MySQL的查询完成后,才会在ClickHouse中执行采样约束。 +支持使用`|`并列进行多副本查询,示例如下: + +```sql +SELECT name FROM mysql(`mysql{1|2|3}:3306`, 'mysql_database', 'mysql_table', 'user', 'password'); +``` + +或 + +```sql +SELECT name FROM mysql(`mysql1:3306|mysql2:3306|mysql3:3306`, 'mysql_database', 'mysql_table', 'user', 'password'); +``` **返回值** -与原始MySQL表具有相同列的table对象。 +与原始MySQL表具有相同列的表对象。 + +!!! note "注意" + 在`INSERT`查询中为了区分`mysql(...)`与带有列名列表的表名的表函数,你必须使用关键字`FUNCTION`或`TABLE FUNCTION`。查看如下示例。 ## 用法示例 {#usage-example} @@ -66,7 +74,7 @@ mysql> select * from test; 1 row in set (0,00 sec) ``` -从ClickHouse中选择数据: +从ClickHouse中查询数据: ``` sql SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123') @@ -78,6 +86,21 @@ SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123') └────────┴──────────────┴───────┴────────────────┘ ``` +替换和插入: + +```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 │ +└────────┴───────┘ +``` + ## 另请参阅 {#see-also} - [该 ‘MySQL’ 表引擎](../../engines/table-engines/integrations/mysql.md) diff --git a/docs/zh/sql-reference/table-functions/remote.md b/docs/zh/sql-reference/table-functions/remote.md index cacc68c0b71..dfe81d0bafe 100644 --- a/docs/zh/sql-reference/table-functions/remote.md +++ b/docs/zh/sql-reference/table-functions/remote.md @@ -16,27 +16,27 @@ remoteSecure('addresses_expr', db.table[, 'user'[, 'password'], sharding_key]) **参数** - `addresses_expr` – 代表远程服务器地址的一个表达式。可以只是单个服务器地址。 服务器地址可以是 `host:port` 或 `host`。 - + `host` 可以指定为服务器名称,或是IPV4或IPV6地址。IPv6地址在方括号中指定。 - + `port` 是远程服务器上的TCP端口。 如果省略端口,则 `remote` 使用服务器配置文件中的 [tcp_port](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-tcp_port) (默认情况为,9000),`remoteSecure` 使用 [tcp_port_secure](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-tcp_port_secure) (默认情况为,9440)。 IPv6地址需要指定端口。 - + 类型: [String](../../sql-reference/data-types/string.md)。 - + - `db` — 数据库名。类型: [String](../../sql-reference/data-types/string.md)。 - `table` — 表名。类型: [String](../../sql-reference/data-types/string.md)。 - `user` — 用户名。如果未指定用户,则使用 `default` 。类型: [String](../../sql-reference/data-types/string.md)。 - `password` — 用户密码。如果未指定密码,则使用空密码。类型: [String](../../sql-reference/data-types/string.md)。 - `sharding_key` — 分片键以支持在节点之间分布数据。 例如: `insert into remote('127.0.0.1:9000,127.0.0.2', db, table, 'default', rand())`。 类型: [UInt32](../../sql-reference/data-types/int-uint.md)。 - + **返回值** - + 来自远程服务器的数据集。 - + **用法** - + 使用 `remote` 表函数没有创建一个 `Distributed` 表更优,因为在这种情况下,将为每个请求重新建立服务器连接。此外,如果设置了主机名,则会解析这些名称,并且在使用各种副本时不会计入错误。 在处理大量查询时,始终优先创建 `Distributed` 表,不要使用 `remote` 表函数。 该 `remote` 表函数可以在以下情况下是有用的: @@ -45,7 +45,7 @@ remoteSecure('addresses_expr', db.table[, 'user'[, 'password'], sharding_key]) - 在多个ClickHouse集群之间的用户研究目的的查询。 - 手动发出的不频繁分布式请求。 - 每次重新定义服务器集的分布式请求。 - + **地址** ``` text diff --git a/programs/benchmark/Benchmark.cpp b/programs/benchmark/Benchmark.cpp index 859222c236e..be57a3b92a0 100644 --- a/programs/benchmark/Benchmark.cpp +++ b/programs/benchmark/Benchmark.cpp @@ -58,7 +58,8 @@ namespace ErrorCodes class Benchmark : public Poco::Util::Application { public: - Benchmark(unsigned concurrency_, double delay_, Strings && hosts_, Ports && ports_, + Benchmark(unsigned concurrency_, double delay_, + Strings && hosts_, Ports && ports_, bool round_robin_, bool cumulative_, bool secure_, const String & default_database_, const String & user_, const String & password_, const String & stage, bool randomize_, size_t max_iterations_, double max_time_, @@ -66,7 +67,7 @@ public: const String & query_id_, const String & query_to_execute_, bool continue_on_errors_, bool reconnect_, bool print_stacktrace_, const Settings & settings_) : - concurrency(concurrency_), delay(delay_), queue(concurrency), randomize(randomize_), + round_robin(round_robin_), concurrency(concurrency_), delay(delay_), queue(concurrency), randomize(randomize_), cumulative(cumulative_), max_iterations(max_iterations_), max_time(max_time_), json_path(json_path_), confidence(confidence_), query_id(query_id_), query_to_execute(query_to_execute_), continue_on_errors(continue_on_errors_), reconnect(reconnect_), @@ -78,8 +79,8 @@ public: size_t connections_cnt = std::max(ports_.size(), hosts_.size()); connections.reserve(connections_cnt); - comparison_info_total.reserve(connections_cnt); - comparison_info_per_interval.reserve(connections_cnt); + comparison_info_total.reserve(round_robin ? 1 : connections_cnt); + comparison_info_per_interval.reserve(round_robin ? 1 : connections_cnt); for (size_t i = 0; i < connections_cnt; ++i) { @@ -90,11 +91,17 @@ public: concurrency, cur_host, cur_port, default_database_, user_, password_, - "", /* cluster */ - "", /* cluster_secret */ - "benchmark", Protocol::Compression::Enable, secure)); - comparison_info_per_interval.emplace_back(std::make_shared()); - comparison_info_total.emplace_back(std::make_shared()); + /* cluster_= */ "", + /* cluster_secret_= */ "", + /* client_name_= */ "benchmark", + Protocol::Compression::Enable, + secure)); + + if (!round_robin || comparison_info_per_interval.empty()) + { + comparison_info_per_interval.emplace_back(std::make_shared()); + comparison_info_total.emplace_back(std::make_shared()); + } } global_context->makeGlobalContext(); @@ -134,6 +141,7 @@ private: using EntryPtr = std::shared_ptr; using EntryPtrs = std::vector; + bool round_robin; unsigned concurrency; double delay; @@ -271,7 +279,8 @@ private: if (max_time > 0 && total_watch.elapsedSeconds() >= max_time) { - std::cout << "Stopping launch of queries. Requested time limit is exhausted.\n"; + std::cout << "Stopping launch of queries." + << " Requested time limit " << max_time << " seconds is exhausted.\n"; return false; } @@ -313,6 +322,7 @@ private: } catch (...) { + shutdown = true; pool.wait(); throw; } @@ -368,8 +378,7 @@ private: { extracted = queue.tryPop(query, 100); - if (shutdown - || (max_iterations && queries_executed == max_iterations)) + if (shutdown || (max_iterations && queries_executed == max_iterations)) { return; } @@ -382,8 +391,9 @@ private: } catch (...) { - std::cerr << "An error occurred while processing the query '" - << query << "'.\n"; + std::lock_guard lock(mutex); + std::cerr << "An error occurred while processing the query " << "'" << query << "'" + << ": " << getCurrentExceptionMessage(false) << std::endl; if (!continue_on_errors) { shutdown = true; @@ -394,8 +404,9 @@ private: std::cerr << getCurrentExceptionMessage(print_stacktrace, true /*check embedded stack trace*/) << std::endl; - comparison_info_per_interval[connection_index]->errors++; - comparison_info_total[connection_index]->errors++; + size_t info_index = round_robin ? 0 : connection_index; + comparison_info_per_interval[info_index]->errors++; + comparison_info_total[info_index]->errors++; } } // Count failed queries toward executed, so that we'd reach @@ -432,9 +443,10 @@ private: std::lock_guard lock(mutex); - comparison_info_per_interval[connection_index]->add(seconds, progress.read_rows, progress.read_bytes, info.rows, info.bytes); - comparison_info_total[connection_index]->add(seconds, progress.read_rows, progress.read_bytes, info.rows, info.bytes); - t_test.add(connection_index, seconds); + size_t info_index = round_robin ? 0 : connection_index; + comparison_info_per_interval[info_index]->add(seconds, progress.read_rows, progress.read_bytes, info.rows, info.bytes); + comparison_info_total[info_index]->add(seconds, progress.read_rows, progress.read_bytes, info.rows, info.bytes); + t_test.add(info_index, seconds); } void report(MultiStats & infos) @@ -452,8 +464,19 @@ private: double seconds = info->work_time / concurrency; + std::string connection_description = connections[i]->getDescription(); + if (round_robin) + { + connection_description.clear(); + for (const auto & conn : connections) + { + if (!connection_description.empty()) + connection_description += ", "; + connection_description += conn->getDescription(); + } + } std::cerr - << connections[i]->getDescription() << ", " + << connection_description << ", " << "queries " << info->queries << ", "; if (info->errors) { @@ -586,8 +609,9 @@ int mainEntryClickHouseBenchmark(int argc, char ** argv) ("timelimit,t", value()->default_value(0.), "stop launch of queries after specified time limit") ("randomize,r", value()->default_value(false), "randomize order of execution") ("json", value()->default_value(""), "write final report to specified file in JSON format") - ("host,h", value()->multitoken(), "") - ("port,p", value()->multitoken(), "") + ("host,h", value()->multitoken(), "list of hosts") + ("port,p", value()->multitoken(), "list of ports") + ("roundrobin", "Instead of comparing queries for different --host/--port just pick one random --host/--port for every query and send query to it.") ("cumulative", "prints cumulative data instead of data per interval") ("secure,s", "Use TLS connection") ("user", value()->default_value("default"), "") @@ -634,6 +658,7 @@ int mainEntryClickHouseBenchmark(int argc, char ** argv) options["delay"].as(), std::move(hosts), std::move(ports), + options.count("roundrobin"), options.count("cumulative"), options.count("secure"), options["database"].as(), diff --git a/programs/client/CMakeLists.txt b/programs/client/CMakeLists.txt index 084e1b45911..1de5ea88aee 100644 --- a/programs/client/CMakeLists.txt +++ b/programs/client/CMakeLists.txt @@ -3,6 +3,7 @@ set (CLICKHOUSE_CLIENT_SOURCES ConnectionParameters.cpp QueryFuzzer.cpp Suggest.cpp + TestHint.cpp ) set (CLICKHOUSE_CLIENT_LINK diff --git a/programs/client/Client.cpp b/programs/client/Client.cpp index c4aef014971..14442167042 100644 --- a/programs/client/Client.cpp +++ b/programs/client/Client.cpp @@ -1,3 +1,6 @@ +#include +#include "Common/MemoryTracker.h" +#include "Columns/ColumnsNumber.h" #include "ConnectionParameters.h" #include "QueryFuzzer.h" #include "Suggest.h" @@ -26,6 +29,10 @@ #include #include #include +#include +#include +#include +#include #include #include #include @@ -54,8 +61,7 @@ #include #include #include -#include -#include +#include #include #include #include @@ -79,6 +85,7 @@ #include #include #include +#include #include #include #include @@ -96,6 +103,14 @@ #pragma GCC optimize("-fno-var-tracking-assignments") #endif +namespace CurrentMetrics +{ + extern const Metric Revision; + extern const Metric VersionInteger; + extern const Metric MemoryTracking; + extern const Metric MaxDDLEntryID; +} + namespace fs = std::filesystem; namespace DB @@ -193,7 +208,7 @@ private: std::unique_ptr pager_cmd; /// The user can specify to redirect query output to a file. - std::optional out_file_buf; + std::unique_ptr out_file_buf; BlockOutputStreamPtr block_out_stream; /// The user could specify special file for server logs (stderr by default) @@ -301,26 +316,9 @@ private: } catch (const Exception & e) { - bool print_stack_trace = config().getBool("stacktrace", false); + bool print_stack_trace = config().getBool("stacktrace", false) && e.code() != ErrorCodes::NETWORK_ERROR; - std::string text = e.displayText(); - - /** If exception is received from server, then stack trace is embedded in message. - * If exception is thrown on client, then stack trace is in separate field. - */ - - auto embedded_stack_trace_pos = text.find("Stack trace"); - if (std::string::npos != embedded_stack_trace_pos && !print_stack_trace) - text.resize(embedded_stack_trace_pos); - - std::cerr << "Code: " << e.code() << ". " << text << std::endl << std::endl; - - /// Don't print the stack trace on the client if it was logged on the server. - /// Also don't print the stack trace in case of network errors. - if (print_stack_trace && e.code() != ErrorCodes::NETWORK_ERROR && std::string::npos == embedded_stack_trace_pos) - { - std::cerr << "Stack trace:" << std::endl << e.getStackTraceString(); - } + std::cerr << getExceptionMessage(e, print_stack_trace, true) << std::endl << std::endl; /// If exception code isn't zero, we should return non-zero return code anyway. return e.code() ? e.code() : -1; @@ -430,6 +428,7 @@ private: {TokenType::ClosingRoundBracket, Replxx::Color::BROWN}, {TokenType::OpeningSquareBracket, Replxx::Color::BROWN}, {TokenType::ClosingSquareBracket, Replxx::Color::BROWN}, + {TokenType::DoubleColon, Replxx::Color::BROWN}, {TokenType::OpeningCurlyBrace, Replxx::Color::INTENSE}, {TokenType::ClosingCurlyBrace, Replxx::Color::INTENSE}, @@ -437,6 +436,7 @@ private: {TokenType::Semicolon, Replxx::Color::INTENSE}, {TokenType::Dot, Replxx::Color::INTENSE}, {TokenType::Asterisk, Replxx::Color::INTENSE}, + {TokenType::HereDoc, Replxx::Color::CYAN}, {TokenType::Plus, Replxx::Color::INTENSE}, {TokenType::Minus, Replxx::Color::INTENSE}, {TokenType::Slash, Replxx::Color::INTENSE}, @@ -462,8 +462,7 @@ private: {TokenType::ErrorDoubleQuoteIsNotClosed, Replxx::Color::RED}, {TokenType::ErrorSinglePipeMark, Replxx::Color::RED}, {TokenType::ErrorWrongNumber, Replxx::Color::RED}, - { TokenType::ErrorMaxQuerySizeExceeded, - Replxx::Color::RED }}; + {TokenType::ErrorMaxQuerySizeExceeded, Replxx::Color::RED }}; const Replxx::Color unknown_token_color = Replxx::Color::RED; @@ -486,10 +485,68 @@ private: } #endif + /// Make query to get all server warnings + std::vector loadWarningMessages() + { + std::vector messages; + connection->sendQuery(connection_parameters.timeouts, "SELECT message FROM system.warnings", "" /* query_id */, QueryProcessingStage::Complete); + while (true) + { + Packet packet = connection->receivePacket(); + switch (packet.type) + { + case Protocol::Server::Data: + if (packet.block) + { + const ColumnString & column = typeid_cast(*packet.block.getByPosition(0).column); + + size_t rows = packet.block.rows(); + for (size_t i = 0; i < rows; ++i) + messages.emplace_back(column.getDataAt(i).toString()); + } + continue; + + case Protocol::Server::Progress: + continue; + case Protocol::Server::ProfileInfo: + continue; + case Protocol::Server::Totals: + continue; + case Protocol::Server::Extremes: + continue; + case Protocol::Server::Log: + continue; + + case Protocol::Server::Exception: + packet.exception->rethrow(); + return messages; + + case Protocol::Server::EndOfStream: + return messages; + + default: + throw Exception(ErrorCodes::UNKNOWN_PACKET_FROM_SERVER, "Unknown packet {} from server {}", + packet.type, connection->getDescription()); + } + } + } + int mainImpl() { UseSSL use_ssl; + MainThreadStatus::getInstance(); + + /// Limit on total memory usage + size_t max_client_memory_usage = config().getInt64("max_memory_usage_in_client", 0 /*default value*/); + + if (max_client_memory_usage != 0) + { + total_memory_tracker.setHardLimit(max_client_memory_usage); + total_memory_tracker.setDescription("(total)"); + total_memory_tracker.setMetric(CurrentMetrics::MemoryTracking); + } + registerFormats(); registerFunctions(); registerAggregateFunctions(); @@ -564,6 +621,26 @@ private: suggest->load(connection_parameters, config().getInt("suggestion_limit")); } + /// Load Warnings at the beginning of connection + if (!config().has("no-warnings")) + { + try + { + std::vector messages = loadWarningMessages(); + if (!messages.empty()) + { + std::cout << "Warnings:" << std::endl; + for (const auto & message : messages) + std::cout << "* " << message << std::endl; + std::cout << std::endl; + } + } + catch (...) + { + /// Ignore exception + } + } + /// Load command history if present. if (config().has("history_file")) history_file = config().getString("history_file"); @@ -632,17 +709,10 @@ private: } catch (const Exception & e) { - // We don't need to handle the test hints in the interactive - // mode. - std::cerr << std::endl - << "Exception on client:" << std::endl - << "Code: " << e.code() << ". " << e.displayText() << std::endl; - - if (config().getBool("stacktrace", false)) - std::cerr << "Stack trace:" << std::endl << e.getStackTraceString() << std::endl; - - std::cerr << std::endl; + /// We don't need to handle the test hints in the interactive mode. + bool print_stack_trace = config().getBool("stacktrace", false); + std::cerr << "Exception on client:" << std::endl << getExceptionMessage(e, print_stack_trace, true) << std::endl << std::endl; client_exception = std::make_unique(e); } @@ -939,18 +1009,11 @@ private: { if (server_exception) { - std::string text = server_exception->displayText(); - auto embedded_stack_trace_pos = text.find("Stack trace"); - if (std::string::npos != embedded_stack_trace_pos && !config().getBool("stacktrace", false)) - { - text.resize(embedded_stack_trace_pos); - } + bool print_stack_trace = config().getBool("stacktrace", false); std::cerr << "Received exception from server (version " << server_version << "):" << std::endl - << "Code: " << server_exception->code() << ". " << text << std::endl; + << getExceptionMessage(*server_exception, print_stack_trace, true) << std::endl; if (is_interactive) - { std::cerr << std::endl; - } } if (client_exception) @@ -1409,11 +1472,15 @@ private: { // Just report it, we'll terminate below. fmt::print(stderr, - "Error while reconnecting to the server: Code: {}: {}\n", - getCurrentExceptionCode(), + "Error while reconnecting to the server: {}\n", getCurrentExceptionMessage(true)); - assert(!connection->isConnected()); + // The reconnection might fail, but we'll still be connected + // in the sense of `connection->isConnected() = true`, + // in case when the requested database doesn't exist. + // Disconnect manually now, so that the following code doesn't + // have any doubts, and the connection state is predictable. + connection->disconnect(); } } @@ -1889,19 +1956,24 @@ private: current_format = insert->format; } - BlockInputStreamPtr block_input = context->getInputFormat(current_format, buf, sample, insert_format_max_block_size); + auto source = FormatFactory::instance().getInput(current_format, buf, sample, context, insert_format_max_block_size); + Pipe pipe(source); if (columns_description.hasDefaults()) - block_input = std::make_shared(block_input, columns_description, context); - - BlockInputStreamPtr async_block_input = std::make_shared(block_input); - - async_block_input->readPrefix(); - - while (true) { - Block block = async_block_input->read(); + pipe.addSimpleTransform([&](const Block & header) + { + return std::make_shared(header, columns_description, *source, context); + }); + } + QueryPipeline pipeline; + pipeline.init(std::move(pipe)); + PullingAsyncPipelineExecutor executor(pipeline); + + Block block; + while (executor.pull(block)) + { /// Check if server send Log packet receiveLogs(); @@ -1913,18 +1985,18 @@ private: * We're exiting with error, so it makes sense to kill the * input stream without waiting for it to complete. */ - async_block_input->cancel(true); + executor.cancel(); return; } - connection->sendData(block); - processed_rows += block.rows(); - - if (!block) - break; + if (block) + { + connection->sendData(block); + processed_rows += block.rows(); + } } - async_block_input->readSuffix(); + connection->sendData({}); } @@ -2194,8 +2266,11 @@ private: const auto & out_file_node = query_with_output->out_file->as(); const auto & out_file = out_file_node.value.safeGet(); - out_file_buf.emplace(out_file, DBMS_DEFAULT_BUFFER_SIZE, O_WRONLY | O_EXCL | O_CREAT); - out_buf = &*out_file_buf; + out_file_buf = wrapWriteBufferWithCompressionMethod( + std::make_unique(out_file, DBMS_DEFAULT_BUFFER_SIZE, O_WRONLY | O_EXCL | O_CREAT), + chooseCompressionMethod(out_file, ""), + /* compression level = */ 3 + ); // We are writing to file, so default format is the same as in non-interactive mode. if (is_interactive && is_default_format) @@ -2215,9 +2290,9 @@ private: /// It is not clear how to write progress with parallel formatting. It may increase code complexity significantly. if (!need_render_progress) - block_out_stream = context->getOutputStreamParallelIfPossible(current_format, *out_buf, block); + block_out_stream = context->getOutputStreamParallelIfPossible(current_format, out_file_buf ? *out_file_buf : *out_buf, block); else - block_out_stream = context->getOutputStream(current_format, *out_buf, block); + block_out_stream = context->getOutputStream(current_format, out_file_buf ? *out_file_buf : *out_buf, block); block_out_stream->writePrefix(); } @@ -2528,6 +2603,8 @@ public: ("opentelemetry-traceparent", po::value(), "OpenTelemetry traceparent header as described by W3C Trace Context recommendation") ("opentelemetry-tracestate", po::value(), "OpenTelemetry tracestate header as described by W3C Trace Context recommendation") ("history_file", po::value(), "path to history file") + ("no-warnings", "disable warnings when client connects to server") + ("max_memory_usage_in_client", po::value(), "sets memory limit in client") ; Settings cmd_settings; @@ -2595,8 +2672,7 @@ public: } catch (const Exception & e) { - std::string text = e.displayText(); - std::cerr << "Code: " << e.code() << ". " << text << std::endl; + std::cerr << getExceptionMessage(e, false) << std::endl; std::cerr << "Table №" << i << std::endl << std::endl; /// Avoid the case when error exit code can possibly overflow to normal (zero). auto exit_code = e.code() % 256; @@ -2688,6 +2764,8 @@ public: config().setBool("highlight", options["highlight"].as()); if (options.count("history_file")) config().setString("history_file", options["history_file"].as()); + if (options.count("no-warnings")) + config().setBool("no-warnings", true); if ((query_fuzzer_runs = options["query-fuzzer-runs"].as())) { @@ -2739,8 +2817,7 @@ int mainEntryClickHouseClient(int argc, char ** argv) } catch (const DB::Exception & e) { - std::string text = e.displayText(); - std::cerr << "Code: " << e.code() << ". " << text << std::endl; + std::cerr << DB::getExceptionMessage(e, false) << std::endl; return 1; } catch (...) diff --git a/programs/client/QueryFuzzer.h b/programs/client/QueryFuzzer.h index 19f089c6c4e..09d57f4161f 100644 --- a/programs/client/QueryFuzzer.h +++ b/programs/client/QueryFuzzer.h @@ -7,7 +7,6 @@ #include #include -#include #include #include diff --git a/programs/client/TestHint.cpp b/programs/client/TestHint.cpp new file mode 100644 index 00000000000..2f3be2a5350 --- /dev/null +++ b/programs/client/TestHint.cpp @@ -0,0 +1,105 @@ +#include "TestHint.h" + +#include +#include +#include +#include +#include + +namespace +{ + +/// Parse error as number or as a string (name of the error code const) +int parseErrorCode(DB::ReadBufferFromString & in) +{ + int code = -1; + String code_name; + + auto * pos = in.position(); + tryReadText(code, in); + if (pos != in.position()) + { + return code; + } + + /// Try parse as string + readStringUntilWhitespace(code_name, in); + return DB::ErrorCodes::getErrorCodeByName(code_name); +} + +} + +namespace DB +{ + +TestHint::TestHint(bool enabled_, const String & query_) + : query(query_) +{ + if (!enabled_) + return; + + // Don't parse error hints in leading comments, because it feels weird. + // Leading 'echo' hint is OK. + bool is_leading_hint = true; + + Lexer lexer(query.data(), query.data() + query.size()); + + for (Token token = lexer.nextToken(); !token.isEnd(); token = lexer.nextToken()) + { + if (token.type != TokenType::Comment + && token.type != TokenType::Whitespace) + { + is_leading_hint = false; + } + else if (token.type == TokenType::Comment) + { + String comment(token.begin, token.begin + token.size()); + + if (!comment.empty()) + { + size_t pos_start = comment.find('{', 0); + if (pos_start != String::npos) + { + size_t pos_end = comment.find('}', pos_start); + if (pos_end != String::npos) + { + String hint(comment.begin() + pos_start + 1, comment.begin() + pos_end); + parse(hint, is_leading_hint); + } + } + } + } + } +} + +void TestHint::parse(const String & hint, bool is_leading_hint) +{ + ReadBufferFromString in(hint); + String item; + + while (!in.eof()) + { + readStringUntilWhitespace(item, in); + if (in.eof()) + break; + + skipWhitespaceIfAny(in); + + if (!is_leading_hint) + { + if (item == "serverError") + server_error = parseErrorCode(in); + else if (item == "clientError") + client_error = parseErrorCode(in); + } + + if (item == "echo") + echo.emplace(true); + if (item == "echoOn") + echo.emplace(true); + if (item == "echoOff") + echo.emplace(false); + } +} + +} diff --git a/programs/client/TestHint.h b/programs/client/TestHint.h index 100d47f4dd2..377637d0db8 100644 --- a/programs/client/TestHint.h +++ b/programs/client/TestHint.h @@ -1,11 +1,7 @@ #pragma once -#include -#include -#include +#include #include -#include -#include namespace DB @@ -19,6 +15,10 @@ namespace DB /// /// - "-- { clientError 20 }" -- in case of you are expecting client error. /// +/// - "-- { serverError FUNCTION_THROW_IF_VALUE_IS_NON_ZERO }" -- by error name. +/// +/// - "-- { clientError FUNCTION_THROW_IF_VALUE_IS_NON_ZERO }" -- by error name. +/// /// Remember that the client parse the query first (not the server), so for /// example if you are expecting syntax error, then you should use /// clientError not serverError. @@ -43,45 +43,7 @@ namespace DB class TestHint { public: - TestHint(bool enabled_, const String & query_) : - query(query_) - { - if (!enabled_) - return; - - // Don't parse error hints in leading comments, because it feels weird. - // Leading 'echo' hint is OK. - bool is_leading_hint = true; - - Lexer lexer(query.data(), query.data() + query.size()); - - for (Token token = lexer.nextToken(); !token.isEnd(); token = lexer.nextToken()) - { - if (token.type != TokenType::Comment - && token.type != TokenType::Whitespace) - { - is_leading_hint = false; - } - else if (token.type == TokenType::Comment) - { - String comment(token.begin, token.begin + token.size()); - - if (!comment.empty()) - { - size_t pos_start = comment.find('{', 0); - if (pos_start != String::npos) - { - size_t pos_end = comment.find('}', pos_start); - if (pos_end != String::npos) - { - String hint(comment.begin() + pos_start + 1, comment.begin() + pos_end); - parse(hint, is_leading_hint); - } - } - } - } - } - } + TestHint(bool enabled_, const String & query_); int serverError() const { return server_error; } int clientError() const { return client_error; } @@ -93,34 +55,7 @@ private: int client_error = 0; std::optional echo; - void parse(const String & hint, bool is_leading_hint) - { - std::stringstream ss; // STYLE_CHECK_ALLOW_STD_STRING_STREAM - ss << hint; - String item; - - while (!ss.eof()) - { - ss >> item; - if (ss.eof()) - break; - - if (!is_leading_hint) - { - if (item == "serverError") - ss >> server_error; - else if (item == "clientError") - ss >> client_error; - } - - if (item == "echo") - echo.emplace(true); - if (item == "echoOn") - echo.emplace(true); - if (item == "echoOff") - echo.emplace(false); - } - } + void parse(const String & hint, bool is_leading_hint); bool allErrorsExpected(int actual_server_error, int actual_client_error) const { diff --git a/programs/copier/CMakeLists.txt b/programs/copier/CMakeLists.txt index dfb067b00f9..57e0996ed78 100644 --- a/programs/copier/CMakeLists.txt +++ b/programs/copier/CMakeLists.txt @@ -11,7 +11,6 @@ set (CLICKHOUSE_COPIER_LINK clickhouse_functions clickhouse_table_functions clickhouse_aggregate_functions - clickhouse_dictionaries string_utils PUBLIC diff --git a/programs/copier/ClusterCopier.cpp b/programs/copier/ClusterCopier.cpp index 128f8bc1cdd..cf0b6cc76a4 100644 --- a/programs/copier/ClusterCopier.cpp +++ b/programs/copier/ClusterCopier.cpp @@ -1702,14 +1702,15 @@ void ClusterCopier::dropParticularPartitionPieceFromAllHelpingTables(const TaskT LOG_INFO(log, "All helping tables dropped partition {}", partition_name); } -String ClusterCopier::getRemoteCreateTable(const DatabaseAndTableName & table, Connection & connection, const Settings & settings) +String ClusterCopier::getRemoteCreateTable( + const DatabaseAndTableName & table, Connection & connection, const Settings & settings) { auto remote_context = Context::createCopy(context); remote_context->setSettings(settings); String query = "SHOW CREATE TABLE " + getQuotedTable(table); - Block block = getBlockWithAllStreamData(std::make_shared( - connection, query, InterpreterShowCreateQuery::getSampleBlock(), remote_context)); + Block block = getBlockWithAllStreamData( + std::make_shared(connection, query, InterpreterShowCreateQuery::getSampleBlock(), remote_context)); return typeid_cast(*block.safeGetByPosition(0).column).getDataAt(0).toString(); } @@ -1719,10 +1720,8 @@ ASTPtr ClusterCopier::getCreateTableForPullShard(const ConnectionTimeouts & time { /// Fetch and parse (possibly) new definition auto connection_entry = task_shard.info.pool->get(timeouts, &task_cluster->settings_pull, true); - String create_query_pull_str = getRemoteCreateTable( - task_shard.task_table.table_pull, - *connection_entry, - task_cluster->settings_pull); + String create_query_pull_str + = getRemoteCreateTable(task_shard.task_table.table_pull, *connection_entry, task_cluster->settings_pull); ParserCreateQuery parser_create_query; const auto & settings = getContext()->getSettingsRef(); @@ -1953,8 +1952,8 @@ UInt64 ClusterCopier::executeQueryOnCluster( /// For unknown reason global context is passed to IStorage::read() method /// So, task_identifier is passed as constructor argument. It is more obvious. auto remote_query_executor = std::make_shared( - *connections.back(), query, header, getContext(), - /*throttler=*/nullptr, Scalars(), Tables(), QueryProcessingStage::Complete); + *connections.back(), query, header, getContext(), + /*throttler=*/nullptr, Scalars(), Tables(), QueryProcessingStage::Complete); try { diff --git a/programs/extract-from-config/ExtractFromConfig.cpp b/programs/extract-from-config/ExtractFromConfig.cpp index dff7e81c430..3fd665bcb26 100644 --- a/programs/extract-from-config/ExtractFromConfig.cpp +++ b/programs/extract-from-config/ExtractFromConfig.cpp @@ -33,7 +33,7 @@ static std::string extractFromConfig( { DB::ConfigurationPtr bootstrap_configuration(new Poco::Util::XMLConfiguration(config_xml)); zkutil::ZooKeeperPtr zookeeper = std::make_shared( - *bootstrap_configuration, "zookeeper"); + *bootstrap_configuration, "zookeeper", nullptr); zkutil::ZooKeeperNodeCache zk_node_cache([&] { return zookeeper; }); config_xml = processor.processConfig(&has_zk_includes, &zk_node_cache); } diff --git a/programs/library-bridge/HandlerFactory.cpp b/programs/library-bridge/HandlerFactory.cpp index 9f53a24156f..43087082c46 100644 --- a/programs/library-bridge/HandlerFactory.cpp +++ b/programs/library-bridge/HandlerFactory.cpp @@ -12,8 +12,8 @@ namespace DB Poco::URI uri{request.getURI()}; LOG_DEBUG(log, "Request URI: {}", uri.toString()); - if (uri == "/ping" && request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) - return std::make_unique(keep_alive_timeout); + if (request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) + return std::make_unique(keep_alive_timeout, getContext()); if (request.getMethod() == Poco::Net::HTTPRequest::HTTP_POST) return std::make_unique(keep_alive_timeout, getContext()); diff --git a/programs/library-bridge/Handlers.cpp b/programs/library-bridge/Handlers.cpp index ec82d7d52f4..2b6d0057bb2 100644 --- a/programs/library-bridge/Handlers.cpp +++ b/programs/library-bridge/Handlers.cpp @@ -17,8 +17,24 @@ namespace DB { + +namespace ErrorCodes +{ + extern const int BAD_REQUEST_PARAMETER; +} + namespace { + void processError(HTTPServerResponse & response, const std::string & message) + { + response.setStatusAndReason(HTTPResponse::HTTP_INTERNAL_SERVER_ERROR); + + if (!response.sent()) + *response.send() << message << std::endl; + + LOG_WARNING(&Poco::Logger::get("LibraryBridge"), message); + } + std::shared_ptr parseColumns(std::string && column_string) { auto sample_block = std::make_shared(); @@ -30,9 +46,8 @@ namespace return sample_block; } - std::vector parseIdsFromBinary(const std::string & ids_string) + std::vector parseIdsFromBinary(ReadBuffer & buf) { - ReadBufferFromString buf(ids_string); std::vector ids; readVectorBinary(ids, buf); return ids; @@ -67,13 +82,36 @@ void LibraryRequestHandler::handleRequest(HTTPServerRequest & request, HTTPServe std::string method = params.get("method"); std::string dictionary_id = params.get("dictionary_id"); - LOG_TRACE(log, "Library method: '{}', dictionary id: {}", method, dictionary_id); + LOG_TRACE(log, "Library method: '{}', dictionary id: {}", method, dictionary_id); WriteBufferFromHTTPServerResponse out(response, request.getMethod() == Poco::Net::HTTPRequest::HTTP_HEAD, keep_alive_timeout); try { - if (method == "libNew") + bool lib_new = (method == "libNew"); + if (method == "libClone") + { + if (!params.has("from_dictionary_id")) + { + processError(response, "No 'from_dictionary_id' in request URL"); + return; + } + + std::string from_dictionary_id = params.get("from_dictionary_id"); + bool cloned = false; + cloned = SharedLibraryHandlerFactory::instance().clone(from_dictionary_id, dictionary_id); + + if (cloned) + { + writeStringBinary("1", out); + } + else + { + LOG_TRACE(log, "Cannot clone from dictionary with id: {}, will call libNew instead"); + lib_new = true; + } + } + if (lib_new) { auto & read_buf = request.getStream(); params.read(read_buf); @@ -92,6 +130,8 @@ void LibraryRequestHandler::handleRequest(HTTPServerRequest & request, HTTPServe std::string library_path = params.get("library_path"); const auto & settings_string = params.get("library_settings"); + + LOG_DEBUG(log, "Parsing library settings from binary string"); std::vector library_settings = parseNamesFromBinary(settings_string); /// Needed for library dictionary @@ -102,6 +142,8 @@ void LibraryRequestHandler::handleRequest(HTTPServerRequest & request, HTTPServe } const auto & attributes_string = params.get("attributes_names"); + + LOG_DEBUG(log, "Parsing attributes names from binary string"); std::vector attributes_names = parseNamesFromBinary(attributes_string); /// Needed to parse block from binary string format @@ -140,59 +182,63 @@ void LibraryRequestHandler::handleRequest(HTTPServerRequest & request, HTTPServe SharedLibraryHandlerFactory::instance().create(dictionary_id, library_path, library_settings, sample_block_with_nulls, attributes_names); writeStringBinary("1", out); } - else if (method == "libClone") - { - if (!params.has("from_dictionary_id")) - { - processError(response, "No 'from_dictionary_id' in request URL"); - return; - } - - std::string from_dictionary_id = params.get("from_dictionary_id"); - LOG_TRACE(log, "Calling libClone from {} to {}", from_dictionary_id, dictionary_id); - SharedLibraryHandlerFactory::instance().clone(from_dictionary_id, dictionary_id); - writeStringBinary("1", out); - } else if (method == "libDelete") { - SharedLibraryHandlerFactory::instance().remove(dictionary_id); + auto deleted = SharedLibraryHandlerFactory::instance().remove(dictionary_id); + + /// Do not throw, a warning is ok. + if (!deleted) + LOG_WARNING(log, "Cannot delete library for with dictionary id: {}, because such id was not found.", dictionary_id); + writeStringBinary("1", out); } else if (method == "isModified") { auto library_handler = SharedLibraryHandlerFactory::instance().get(dictionary_id); + if (!library_handler) + throw Exception(ErrorCodes::BAD_REQUEST_PARAMETER, "Not found dictionary with id: {}", dictionary_id); + bool res = library_handler->isModified(); writeStringBinary(std::to_string(res), out); } else if (method == "supportsSelectiveLoad") { auto library_handler = SharedLibraryHandlerFactory::instance().get(dictionary_id); + if (!library_handler) + throw Exception(ErrorCodes::BAD_REQUEST_PARAMETER, "Not found dictionary with id: {}", dictionary_id); + bool res = library_handler->supportsSelectiveLoad(); writeStringBinary(std::to_string(res), out); } else if (method == "loadAll") { auto library_handler = SharedLibraryHandlerFactory::instance().get(dictionary_id); + if (!library_handler) + throw Exception(ErrorCodes::BAD_REQUEST_PARAMETER, "Not found dictionary with id: {}", dictionary_id); + const auto & sample_block = library_handler->getSampleBlock(); + LOG_DEBUG(log, "Calling loadAll() for dictionary id: {}", dictionary_id); auto input = library_handler->loadAll(); + LOG_DEBUG(log, "Started sending result data for dictionary id: {}", dictionary_id); BlockOutputStreamPtr output = FormatFactory::instance().getOutputStream(FORMAT, out, sample_block, getContext()); copyData(*input, *output); } else if (method == "loadIds") { - params.read(request.getStream()); + LOG_DEBUG(log, "Getting diciontary ids for dictionary with id: {}", dictionary_id); + String ids_string; + std::vector ids = parseIdsFromBinary(request.getStream()); - if (!params.has("ids")) - { - processError(response, "No 'ids' in request URL"); - return; - } - - std::vector ids = parseIdsFromBinary(params.get("ids")); auto library_handler = SharedLibraryHandlerFactory::instance().get(dictionary_id); + if (!library_handler) + throw Exception(ErrorCodes::BAD_REQUEST_PARAMETER, "Not found dictionary with id: {}", dictionary_id); + const auto & sample_block = library_handler->getSampleBlock(); + LOG_DEBUG(log, "Calling loadIds() for dictionary id: {}", dictionary_id); auto input = library_handler->loadIds(ids); + + LOG_DEBUG(log, "Started sending result data for dictionary id: {}", dictionary_id); BlockOutputStreamPtr output = FormatFactory::instance().getOutputStream(FORMAT, out, sample_block, getContext()); copyData(*input, *output); } @@ -224,8 +270,14 @@ void LibraryRequestHandler::handleRequest(HTTPServerRequest & request, HTTPServe auto block = reader->read(); auto library_handler = SharedLibraryHandlerFactory::instance().get(dictionary_id); + if (!library_handler) + throw Exception(ErrorCodes::BAD_REQUEST_PARAMETER, "Not found dictionary with id: {}", dictionary_id); + const auto & sample_block = library_handler->getSampleBlock(); + LOG_DEBUG(log, "Calling loadKeys() for dictionary id: {}", dictionary_id); auto input = library_handler->loadKeys(block.getColumns()); + + LOG_DEBUG(log, "Started sending result data for dictionary id: {}", dictionary_id); BlockOutputStreamPtr output = FormatFactory::instance().getOutputStream(FORMAT, out, sample_block, getContext()); copyData(*input, *output); } @@ -233,8 +285,9 @@ void LibraryRequestHandler::handleRequest(HTTPServerRequest & request, HTTPServe catch (...) { auto message = getCurrentExceptionMessage(true); - response.setStatusAndReason(Poco::Net::HTTPResponse::HTTP_INTERNAL_SERVER_ERROR, message); // can't call process_error, because of too soon response sending + LOG_ERROR(log, "Failed to process request for dictionary_id: {}. Error: {}", dictionary_id, message); + response.setStatusAndReason(Poco::Net::HTTPResponse::HTTP_INTERNAL_SERVER_ERROR, message); // can't call process_error, because of too soon response sending try { writeStringBinary(message, out); @@ -244,8 +297,6 @@ void LibraryRequestHandler::handleRequest(HTTPServerRequest & request, HTTPServe { tryLogCurrentException(log); } - - tryLogCurrentException(log); } try @@ -259,24 +310,30 @@ void LibraryRequestHandler::handleRequest(HTTPServerRequest & request, HTTPServe } -void LibraryRequestHandler::processError(HTTPServerResponse & response, const std::string & message) -{ - response.setStatusAndReason(HTTPResponse::HTTP_INTERNAL_SERVER_ERROR); - - if (!response.sent()) - *response.send() << message << std::endl; - - LOG_WARNING(log, message); -} - - -void PingHandler::handleRequest(HTTPServerRequest & /* request */, HTTPServerResponse & response) +void LibraryExistsHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse & response) { try { + LOG_TRACE(log, "Request URI: {}", request.getURI()); + HTMLForm params(getContext()->getSettingsRef(), request); + + if (!params.has("dictionary_id")) + { + processError(response, "No 'dictionary_id' in request URL"); + return; + } + + std::string dictionary_id = params.get("dictionary_id"); + auto library_handler = SharedLibraryHandlerFactory::instance().get(dictionary_id); + String res; + if (library_handler) + res = "1"; + else + res = "0"; + setResponseDefaultHeaders(response, keep_alive_timeout); - const char * data = "Ok.\n"; - response.sendBuffer(data, strlen(data)); + LOG_TRACE(log, "Senging ping response: {} (dictionary id: {})", res, dictionary_id); + response.sendBuffer(res.data(), res.size()); } catch (...) { diff --git a/programs/library-bridge/Handlers.h b/programs/library-bridge/Handlers.h index dac61d3a735..58af24b06d1 100644 --- a/programs/library-bridge/Handlers.h +++ b/programs/library-bridge/Handlers.h @@ -22,8 +22,7 @@ class LibraryRequestHandler : public HTTPRequestHandler, WithContext public: LibraryRequestHandler( - size_t keep_alive_timeout_, - ContextPtr context_) + size_t keep_alive_timeout_, ContextPtr context_) : WithContext(context_) , log(&Poco::Logger::get("LibraryRequestHandler")) , keep_alive_timeout(keep_alive_timeout_) @@ -35,18 +34,18 @@ public: private: static constexpr inline auto FORMAT = "RowBinary"; - void processError(HTTPServerResponse & response, const std::string & message); - Poco::Logger * log; size_t keep_alive_timeout; }; -class PingHandler : public HTTPRequestHandler +class LibraryExistsHandler : public HTTPRequestHandler, WithContext { public: - explicit PingHandler(size_t keep_alive_timeout_) - : keep_alive_timeout(keep_alive_timeout_) + explicit LibraryExistsHandler(size_t keep_alive_timeout_, ContextPtr context_) + : WithContext(context_) + , keep_alive_timeout(keep_alive_timeout_) + , log(&Poco::Logger::get("LibraryRequestHandler")) { } @@ -54,6 +53,8 @@ public: private: const size_t keep_alive_timeout; + Poco::Logger * log; + }; } diff --git a/programs/library-bridge/SharedLibraryHandlerFactory.cpp b/programs/library-bridge/SharedLibraryHandlerFactory.cpp index 05494c313c4..a9358ca552a 100644 --- a/programs/library-bridge/SharedLibraryHandlerFactory.cpp +++ b/programs/library-bridge/SharedLibraryHandlerFactory.cpp @@ -4,11 +4,6 @@ namespace DB { -namespace ErrorCodes -{ - extern const int LOGICAL_ERROR; -} - SharedLibraryHandlerPtr SharedLibraryHandlerFactory::get(const std::string & dictionary_id) { std::lock_guard lock(mutex); @@ -29,32 +24,32 @@ void SharedLibraryHandlerFactory::create( const std::vector & attributes_names) { std::lock_guard lock(mutex); - library_handlers[dictionary_id] = std::make_shared(library_path, library_settings, sample_block, attributes_names); + if (!library_handlers.count(dictionary_id)) + library_handlers.emplace(std::make_pair(dictionary_id, std::make_shared(library_path, library_settings, sample_block, attributes_names))); + else + LOG_WARNING(&Poco::Logger::get("SharedLibraryHandlerFactory"), "Library handler with dictionary id {} already exists", dictionary_id); } -void SharedLibraryHandlerFactory::clone(const std::string & from_dictionary_id, const std::string & to_dictionary_id) +bool SharedLibraryHandlerFactory::clone(const std::string & from_dictionary_id, const std::string & to_dictionary_id) { std::lock_guard lock(mutex); auto from_library_handler = library_handlers.find(from_dictionary_id); - /// This is not supposed to happen as libClone is called from copy constructor of LibraryDictionarySource - /// object, and shared library handler of from_dictionary is removed only in its destructor. - /// And if for from_dictionary there was no shared library handler, it would have received and exception in - /// its constructor, so no libClone would be made from it. if (from_library_handler == library_handlers.end()) - throw Exception(ErrorCodes::LOGICAL_ERROR, "No shared library handler found"); + return false; /// libClone method will be called in copy constructor library_handlers[to_dictionary_id] = std::make_shared(*from_library_handler->second); + return true; } -void SharedLibraryHandlerFactory::remove(const std::string & dictionary_id) +bool SharedLibraryHandlerFactory::remove(const std::string & dictionary_id) { std::lock_guard lock(mutex); /// libDelete is called in destructor. - library_handlers.erase(dictionary_id); + return library_handlers.erase(dictionary_id); } diff --git a/programs/library-bridge/SharedLibraryHandlerFactory.h b/programs/library-bridge/SharedLibraryHandlerFactory.h index 473d90618a2..115cc78ae52 100644 --- a/programs/library-bridge/SharedLibraryHandlerFactory.h +++ b/programs/library-bridge/SharedLibraryHandlerFactory.h @@ -24,9 +24,9 @@ public: const Block & sample_block, const std::vector & attributes_names); - void clone(const std::string & from_dictionary_id, const std::string & to_dictionary_id); + bool clone(const std::string & from_dictionary_id, const std::string & to_dictionary_id); - void remove(const std::string & dictionary_id); + bool remove(const std::string & dictionary_id); private: /// map: dict_id -> sharedLibraryHandler diff --git a/programs/local/CMakeLists.txt b/programs/local/CMakeLists.txt index b61f0ea33b7..530128c2041 100644 --- a/programs/local/CMakeLists.txt +++ b/programs/local/CMakeLists.txt @@ -6,7 +6,6 @@ set (CLICKHOUSE_LOCAL_LINK clickhouse_aggregate_functions clickhouse_common_config clickhouse_common_io - clickhouse_dictionaries clickhouse_functions clickhouse_parsers clickhouse_storages_system diff --git a/programs/local/LocalServer.cpp b/programs/local/LocalServer.cpp index 2633f0e9426..e256338a538 100644 --- a/programs/local/LocalServer.cpp +++ b/programs/local/LocalServer.cpp @@ -388,24 +388,32 @@ void LocalServer::processQueries() /// Use the same query_id (and thread group) for all queries CurrentThread::QueryScope query_scope_holder(context); - ///Set progress show + /// Set progress show need_render_progress = config().getBool("progress", false); + std::function finalize_progress; if (need_render_progress) { + /// Set progress callback, which can be run from multiple threads. context->setProgressCallback([&](const Progress & value) { /// Write progress only if progress was updated if (progress_indication.updateProgress(value)) progress_indication.writeProgress(); }); + + /// Set finalizing callback for progress, which is called right before finalizing query output. + finalize_progress = [&]() + { + progress_indication.clearProgressOutput(); + }; + + /// Set callback for file processing progress. + progress_indication.setFileProgressCallback(context); } bool echo_queries = config().hasOption("echo") || config().hasOption("verbose"); - if (need_render_progress) - progress_indication.setFileProgressCallback(context); - std::exception_ptr exception; for (const auto & query : queries) @@ -425,7 +433,7 @@ void LocalServer::processQueries() try { - executeQuery(read_buf, write_buf, /* allow_into_outfile = */ true, context, {}); + executeQuery(read_buf, write_buf, /* allow_into_outfile = */ true, context, {}, {}, finalize_progress); } catch (...) { diff --git a/programs/main.cpp b/programs/main.cpp index 225c1ac84de..7619f945f07 100644 --- a/programs/main.cpp +++ b/programs/main.cpp @@ -322,7 +322,7 @@ struct Checker { checkRequiredInstructions(); } -} checker; +} checker __attribute__((init_priority(101))); /// Run before other static initializers. } diff --git a/programs/obfuscator/Obfuscator.cpp b/programs/obfuscator/Obfuscator.cpp index ecefcac1faf..b1acc34ef93 100644 --- a/programs/obfuscator/Obfuscator.cpp +++ b/programs/obfuscator/Obfuscator.cpp @@ -15,8 +15,8 @@ #include #include #include -#include -#include +#include +#include #include #include #include @@ -24,6 +24,10 @@ #include #include #include +#include +#include +#include +#include #include #include #include @@ -1156,17 +1160,20 @@ try if (!silent) std::cerr << "Training models\n"; - BlockInputStreamPtr input = context->getInputFormat(input_format, file_in, header, max_block_size); + Pipe pipe(FormatFactory::instance().getInput(input_format, file_in, header, context, max_block_size)); - input->readPrefix(); - while (Block block = input->read()) + QueryPipeline pipeline; + pipeline.init(std::move(pipe)); + PullingPipelineExecutor executor(pipeline); + + Block block; + while (executor.pull(block)) { obfuscator.train(block.getColumns()); source_rows += block.rows(); if (!silent) std::cerr << "Processed " << source_rows << " rows\n"; } - input->readSuffix(); } obfuscator.finalize(); @@ -1183,15 +1190,26 @@ try file_in.seek(0, SEEK_SET); - BlockInputStreamPtr input = context->getInputFormat(input_format, file_in, header, max_block_size); - BlockOutputStreamPtr output = context->getOutputStreamParallelIfPossible(output_format, file_out, header); + Pipe pipe(FormatFactory::instance().getInput(input_format, file_in, header, context, max_block_size)); if (processed_rows + source_rows > limit) - input = std::make_shared(input, limit - processed_rows, 0); + { + pipe.addSimpleTransform([&](const Block & cur_header) + { + return std::make_shared(cur_header, limit - processed_rows, 0); + }); + } + + QueryPipeline pipeline; + pipeline.init(std::move(pipe)); + + BlockOutputStreamPtr output = context->getOutputStreamParallelIfPossible(output_format, file_out, header); + + PullingPipelineExecutor executor(pipeline); - input->readPrefix(); output->writePrefix(); - while (Block block = input->read()) + Block block; + while (executor.pull(block)) { Columns columns = obfuscator.generate(block.getColumns()); output->write(header.cloneWithColumns(columns)); @@ -1200,7 +1218,6 @@ try std::cerr << "Processed " << processed_rows << " rows\n"; } output->writeSuffix(); - input->readSuffix(); obfuscator.updateSeed(); } diff --git a/programs/server/CMakeLists.txt b/programs/server/CMakeLists.txt index 739d1004025..281c25d50eb 100644 --- a/programs/server/CMakeLists.txt +++ b/programs/server/CMakeLists.txt @@ -13,7 +13,6 @@ set (CLICKHOUSE_SERVER_LINK clickhouse_common_config clickhouse_common_io clickhouse_common_zookeeper - clickhouse_dictionaries clickhouse_functions clickhouse_parsers clickhouse_storages_system diff --git a/programs/server/Server.cpp b/programs/server/Server.cpp index 9d7a4275dc1..5520f920823 100644 --- a/programs/server/Server.cpp +++ b/programs/server/Server.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -39,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -59,6 +61,7 @@ #include #include #include +#include #include #include #include @@ -94,6 +97,9 @@ #endif #if USE_SSL +# if USE_INTERNAL_SSL_LIBRARY && !defined(ARCADIA_BUILD) +# include +# endif # include # include #endif @@ -106,6 +112,10 @@ # include #endif +#if USE_BASE64 +# include +#endif + #if USE_JEMALLOC # include #endif @@ -116,6 +126,7 @@ namespace CurrentMetrics extern const Metric VersionInteger; extern const Metric MemoryTracking; extern const Metric MaxDDLEntryID; + extern const Metric MaxPushedDDLEntryID; } namespace fs = std::filesystem; @@ -241,6 +252,7 @@ namespace ErrorCodes extern const int SUPPORT_IS_DISABLED; extern const int ARGUMENT_OUT_OF_BOUND; extern const int EXCESSIVE_ELEMENT_IN_CONFIG; + extern const int INCORRECT_DATA; extern const int INVALID_CONFIG_PARAMETER; extern const int SYSTEM_ERROR; extern const int FAILED_TO_GETPWUID; @@ -444,6 +456,39 @@ void checkForUsersNotInMainConfig( } } +static void loadEncryptionKey(const std::string & key_command [[maybe_unused]], Poco::Logger * log) +{ +#if USE_BASE64 && USE_SSL && USE_INTERNAL_SSL_LIBRARY + + auto process = ShellCommand::execute(key_command); + + std::string b64_key; + readStringUntilEOF(b64_key, process->out); + process->wait(); + + // turbob64 doesn't like whitespace characters in input. Strip + // them before decoding. + std::erase_if(b64_key, [](char c) + { + return c == ' ' || c == '\t' || c == '\r' || c == '\n'; + }); + + std::vector buf(b64_key.size()); + const size_t key_size = tb64dec(reinterpret_cast(b64_key.data()), b64_key.size(), + reinterpret_cast(buf.data())); + if (!key_size) + throw Exception("Failed to decode encryption key", ErrorCodes::INCORRECT_DATA); + else if (key_size < 16) + LOG_WARNING(log, "The encryption key should be at least 16 octets long."); + + const std::string_view key = std::string_view(buf.data(), key_size); + CompressionCodecEncrypted::setMasterKey(key); + +#else + LOG_WARNING(log, "Server was built without Base64 or SSL support. Encryption is disabled."); +#endif +} + [[noreturn]] void forceShutdown() { @@ -477,17 +522,6 @@ int Server::main(const std::vector & /*args*/) CurrentMetrics::set(CurrentMetrics::Revision, ClickHouseRevision::getVersionRevision()); CurrentMetrics::set(CurrentMetrics::VersionInteger, ClickHouseRevision::getVersionInteger()); - if (ThreadFuzzer::instance().isEffective()) - LOG_WARNING(log, "ThreadFuzzer is enabled. Application will run slowly and unstable."); - -#if !defined(NDEBUG) || !defined(__OPTIMIZE__) - LOG_WARNING(log, "Server was built in debug mode. It will work slowly."); -#endif - -#if defined(SANITIZER) - LOG_WARNING(log, "Server was built with sanitizer. It will work slowly."); -#endif - /** Context contains all that query execution is dependent: * settings, available functions, data types, aggregate functions, databases, ... */ @@ -497,11 +531,25 @@ int Server::main(const std::vector & /*args*/) global_context->makeGlobalContext(); global_context->setApplicationType(Context::ApplicationType::SERVER); +#if !defined(NDEBUG) || !defined(__OPTIMIZE__) + global_context->addWarningMessage("Server was built in debug mode. It will work slowly."); +#endif + +if (ThreadFuzzer::instance().isEffective()) + global_context->addWarningMessage("ThreadFuzzer is enabled. Application will run slowly and unstable."); + +#if defined(SANITIZER) + global_context->addWarningMessage("Server was built with sanitizer. It will work slowly."); +#endif + + // Initialize global thread pool. Do it before we fetch configs from zookeeper // nodes (`from_zk`), because ZooKeeper interface uses the pool. We will // ignore `max_thread_pool_size` in configs we fetch from ZK, but oh well. GlobalThreadPool::initialize(config().getUInt("max_thread_pool_size", 10000)); + ConnectionCollector::init(global_context, config().getUInt("max_threads_for_connection_collector", 10)); + bool has_zookeeper = config().has("zookeeper"); zkutil::ZooKeeperNodeCache main_config_zk_node_cache([&] { return global_context->getZooKeeper(); }); @@ -552,8 +600,10 @@ int Server::main(const std::vector & /*args*/) if (ptrace(PTRACE_TRACEME, 0, nullptr, nullptr) == -1) { /// Program is run under debugger. Modification of it's binary image is ok for breakpoints. - LOG_WARNING(log, "Server is run under debugger and its binary image is modified (most likely with breakpoints).", - calculated_binary_hash); + global_context->addWarningMessage( + fmt::format("Server is run under debugger and its binary image is modified (most likely with breakpoints).", + calculated_binary_hash) + ); } else { @@ -636,7 +686,7 @@ int Server::main(const std::vector & /*args*/) } else { - LOG_WARNING(log, message); + global_context->addWarningMessage(message); } } @@ -910,6 +960,10 @@ int Server::main(const std::vector & /*args*/) global_context->getMergeTreeSettings().sanityCheck(settings); global_context->getReplicatedMergeTreeSettings().sanityCheck(settings); + /// Set up encryption. + if (config().has("encryption.key_command")) + loadEncryptionKey(config().getString("encryption.key_command"), log); + Poco::Timespan keep_alive_timeout(config().getUInt("keep_alive_timeout", 10), 0); Poco::ThreadPool server_pool(3, config().getUInt("max_connections", 1024)); @@ -1041,6 +1095,7 @@ int Server::main(const std::vector & /*args*/) loadMetadataSystem(global_context); /// After attaching system databases we can initialize system log. global_context->initializeSystemLogs(); + global_context->setSystemZooKeeperLogAfterInitializationIfNeeded(); auto & database_catalog = DatabaseCatalog::instance(); /// After the system database is created, attach virtual system tables (in addition to query_log and part_log) attachSystemTablesServer(*database_catalog.getSystemDatabase(), has_zookeeper); @@ -1159,7 +1214,7 @@ int Server::main(const std::vector & /*args*/) { /// This object will periodically calculate some metrics. AsynchronousMetrics async_metrics( - global_context, config().getUInt("asynchronous_metrics_update_period_s", 60), servers_to_start_before_tables, servers); + global_context, config().getUInt("asynchronous_metrics_update_period_s", 1), servers_to_start_before_tables, servers); attachSystemTablesAsync(*DatabaseCatalog::instance().getSystemDatabase(), async_metrics); for (const auto & listen_host : listen_hosts) @@ -1414,7 +1469,8 @@ int Server::main(const std::vector & /*args*/) if (pool_size < 1) throw Exception("distributed_ddl.pool_size should be greater then 0", ErrorCodes::ARGUMENT_OUT_OF_BOUND); global_context->setDDLWorker(std::make_unique(pool_size, ddl_zookeeper_path, global_context, &config(), - "distributed_ddl", "DDLWorker", &CurrentMetrics::MaxDDLEntryID)); + "distributed_ddl", "DDLWorker", + &CurrentMetrics::MaxDDLEntryID, &CurrentMetrics::MaxPushedDDLEntryID)); } for (auto & server : *servers) diff --git a/programs/server/config.xml b/programs/server/config.xml index dd50a693403..510a5e230f8 100644 --- a/programs/server/config.xml +++ b/programs/server/config.xml @@ -320,7 +320,7 @@ The amount of data in mapped files can be monitored in system.metrics, system.metric_log by the MMappedFiles, MMappedFileBytes metrics and in system.asynchronous_metrics, system.asynchronous_metrics_log by the MMapCacheCells metric, - and also in system.events, system.processes, system.query_log, system.query_thread_log by the + and also in system.events, system.processes, system.query_log, system.query_thread_log, system.query_views_log by the CreatedReadBufferMMap, CreatedReadBufferMMapFailed, MMappedFileCacheHits, MMappedFileCacheMisses events. Note that the amount of data in mapped files does not consume memory directly and is not accounted in query or server memory usage - because this memory can be discarded similar to OS page cache. @@ -583,7 +583,7 @@ 9019 --> - + @@ -878,14 +878,23 @@ 7500 + + + system + query_views_log
+ toYYYYMM(event_date) + 7500 +
+ system part_log
+ toYYYYMM(event_date) 7500
- --> - 60000 + 7000 @@ -1002,6 +1012,16 @@
--> + + + + + + @@ -1156,4 +1176,27 @@ + + + diff --git a/programs/server/config.yaml.example b/programs/server/config.yaml.example index bebfd74ff58..5b2da1d3128 100644 --- a/programs/server/config.yaml.example +++ b/programs/server/config.yaml.example @@ -271,7 +271,7 @@ mark_cache_size: 5368709120 # The amount of data in mapped files can be monitored # in system.metrics, system.metric_log by the MMappedFiles, MMappedFileBytes metrics # and in system.asynchronous_metrics, system.asynchronous_metrics_log by the MMapCacheCells metric, -# and also in system.events, system.processes, system.query_log, system.query_thread_log by the +# and also in system.events, system.processes, system.query_log, system.query_thread_log, system.query_views_log by the # CreatedReadBufferMMap, CreatedReadBufferMMapFailed, MMappedFileCacheHits, MMappedFileCacheMisses events. # Note that the amount of data in mapped files does not consume memory directly and is not accounted # in query or server memory usage - because this memory can be discarded similar to OS page cache. @@ -731,12 +731,21 @@ query_thread_log: partition_by: toYYYYMM(event_date) flush_interval_milliseconds: 7500 +# Query views log. Has information about all dependent views associated with a query. +# Used only for queries with setting log_query_views = 1. +query_views_log: + database: system + table: query_views_log + partition_by: toYYYYMM(event_date) + flush_interval_milliseconds: 7500 + # Uncomment if use part log. # Part log contains information about all actions with parts in MergeTree tables (creation, deletion, merges, downloads). -# part_log: -# database: system -# table: part_log -# flush_interval_milliseconds: 7500 +part_log: + database: system + table: part_log + partition_by: toYYYYMM(event_date) + flush_interval_milliseconds: 7500 # Uncomment to write text log into table. # Text log contains all information from usual server log but stores it in structured and efficient way. diff --git a/programs/server/play.html b/programs/server/play.html index 066cd09d16a..8fb32efe98e 100644 --- a/programs/server/play.html +++ b/programs/server/play.html @@ -9,7 +9,7 @@ Do not use any JavaScript or CSS frameworks or preprocessors. This HTML page should not require any build systems (node.js, npm, gulp, etc.) This HTML page should not be minified, instead it should be reasonably minimalistic by itself. - This HTML page should not load any external resources + This HTML page should not load any external resources on load. (CSS and JavaScript must be embedded directly to the page. No external fonts or images should be loaded). This UI should look as lightweight, clean and fast as possible. All UI elements must be aligned in pixel-perfect way. @@ -68,7 +68,7 @@ html, body { /* Personal choice. */ - font-family: Sans-Serif; + font-family: Liberation Sans, DejaVu Sans, sans-serif, Noto Color Emoji, Apple Color Emoji, Segoe UI Emoji; background: var(--background-color); color: var(--text-color); } @@ -96,11 +96,16 @@ .monospace { /* Prefer fonts that have full hinting info. This is important for non-retina displays. - Also I personally dislike "Ubuntu" font due to the similarity of 'r' and 'г' (it looks very ignorant). - */ + Also I personally dislike "Ubuntu" font due to the similarity of 'r' and 'г' (it looks very ignorant). */ font-family: Liberation Mono, DejaVu Sans Mono, MonoLisa, Consolas, Monospace; } + .monospace-table + { + /* Liberation is worse than DejaVu for block drawing characters. */ + font-family: DejaVu Sans Mono, Liberation Mono, MonoLisa, Consolas, Monospace; + } + .shadow { box-shadow: 0 0 1rem var(--shadow-color); @@ -283,6 +288,29 @@ color: var(--link-color); text-decoration: none; } + + /* This is for graph in svg */ + text + { + font-size: 14px; + fill: var(--text-color); + } + + .node rect + { + fill: var(--element-background-color); + filter: drop-shadow(.2rem .2rem .2rem var(--shadow-color)); + } + + .edgePath path + { + stroke: var(--text-color); + } + + marker + { + fill: var(--text-color); + } @@ -302,9 +330,10 @@ 🌑🌞
-
-

+        
+

     
+

@@ -319,34 +348,40 @@ /// Save query in history only if it is different. let previous_query = ''; - /// Substitute the address of the server where the page is served. - if (location.protocol != 'file:') { + const current_url = new URL(window.location); + + const server_address = current_url.searchParams.get('url'); + if (server_address) { + document.getElementById('url').value = server_address; + } else if (location.protocol != 'file:') { + /// Substitute the address of the server where the page is served. document.getElementById('url').value = location.origin; } /// Substitute user name if it's specified in the query string - let user_from_url = (new URL(window.location)).searchParams.get('user'); + const user_from_url = current_url.searchParams.get('user'); if (user_from_url) { document.getElementById('user').value = user_from_url; } function postImpl(posted_request_num, query) { - /// TODO: Check if URL already contains query string (append parameters). + const user = document.getElementById('user').value; + const password = document.getElementById('password').value; - let user = document.getElementById('user').value; - let password = document.getElementById('password').value; + const server_address = document.getElementById('url').value; - let url = document.getElementById('url').value + + const url = server_address + + (server_address.indexOf('?') >= 0 ? '&' : '?') + /// Ask server to allow cross-domain requests. - '?add_http_cors_header=1' + + 'add_http_cors_header=1' + '&user=' + encodeURIComponent(user) + '&password=' + encodeURIComponent(password) + '&default_format=JSONCompact' + /// Safety settings to prevent results that browser cannot display. '&max_result_rows=1000&max_result_bytes=10000000&result_overflow_mode=break'; - let xhr = new XMLHttpRequest; + const xhr = new XMLHttpRequest; xhr.open('POST', url, true); @@ -360,17 +395,24 @@ /// The query is saved in browser history (in state JSON object) /// as well as in URL fragment identifier. if (query != previous_query) { - let state = { + const state = { query: query, status: this.status, response: this.response.length > 100000 ? null : this.response /// Lower than the browser's limit. }; - let title = "ClickHouse Query: " + query; - let url = window.location.pathname + '?user=' + encodeURIComponent(user) + '#' + window.btoa(query); + const title = "ClickHouse Query: " + query; + + let history_url = window.location.pathname + '?user=' + encodeURIComponent(user); + if (server_address != location.origin) { + /// Save server's address in URL if it's not identical to the address of the play UI. + history_url += '&url=' + encodeURIComponent(server_address); + } + history_url += '#' + window.btoa(query); + if (previous_query == '') { - history.replaceState(state, title, url); + history.replaceState(state, title, history_url); } else { - history.pushState(state, title, url); + history.pushState(state, title, history_url); } document.title = title; previous_query = query; @@ -447,6 +489,12 @@ table.removeChild(table.lastChild); } + let graph = document.getElementById('graph'); + while (graph.firstChild) { + graph.removeChild(graph.lastChild); + } + graph.style.display = 'none'; + document.getElementById('data-unparsed').innerText = ''; document.getElementById('data-unparsed').style.display = 'none'; @@ -461,12 +509,21 @@ function renderResult(response) { - //console.log(response); clear(); let stats = document.getElementById('stats'); stats.innerText = 'Elapsed: ' + response.statistics.elapsed.toFixed(3) + " sec, read " + response.statistics.rows_read + " rows."; + /// We can also render graphs if user performed EXPLAIN PIPELINE graph=1. + if (response.data.length > 3 && response.data[0][0] === "digraph" && document.getElementById('query').value.match(/^\s*EXPLAIN/i)) { + renderGraph(response); + } else { + renderTable(response); + } + } + + function renderTable(response) + { let thead = document.createElement('thead'); for (let idx in response.meta) { let th = document.createElement('th'); @@ -559,6 +616,61 @@ document.getElementById('error').style.display = 'block'; } + /// Huge JS libraries should be loaded only if needed. + function loadJS(src, integrity) { + return new Promise((resolve, reject) => { + const script = document.createElement('script'); + script.src = src; + if (integrity) { + script.crossOrigin = 'anonymous'; + script.integrity = integrity; + } else { + console.warn('no integrity for', src) + } + script.addEventListener('load', function() { resolve(true); }); + document.head.appendChild(script); + }); + } + + let load_dagre_promise; + function loadDagre() { + if (load_dagre_promise) { return load_dagre_promise; } + + load_dagre_promise = Promise.all([ + loadJS('https://dagrejs.github.io/project/dagre/v0.8.5/dagre.min.js', + 'sha384-2IH3T69EIKYC4c+RXZifZRvaH5SRUdacJW7j6HtE5rQbvLhKKdawxq6vpIzJ7j9M'), + loadJS('https://dagrejs.github.io/project/graphlib-dot/v0.6.4/graphlib-dot.min.js', + 'sha384-Q7oatU+b+y0oTkSoiRH9wTLH6sROySROCILZso/AbMMm9uKeq++r8ujD4l4f+CWj'), + loadJS('https://dagrejs.github.io/project/dagre-d3/v0.6.4/dagre-d3.min.js', + 'sha384-9N1ty7Yz7VKL3aJbOk+8ParYNW8G5W+MvxEfFL9G7CRYPmkHI9gJqyAfSI/8190W'), + loadJS('https://cdn.jsdelivr.net/npm/d3@7.0.0', + 'sha384-S+Kf0r6YzKIhKA8d1k2/xtYv+j0xYUU3E7+5YLrcPVab6hBh/r1J6cq90OXhw80u'), + ]); + + return load_dagre_promise; + } + + async function renderGraph(response) + { + await loadDagre(); + + /// https://github.com/dagrejs/dagre-d3/issues/131 + const dot = response.data.reduce((acc, row) => acc + '\n' + row[0].replace(/shape\s*=\s*box/g, 'shape=rect')); + + let graph = graphlibDot.read(dot); + graph.graph().rankdir = 'TB'; + + let render = new dagreD3.render(); + + let svg = document.getElementById('graph'); + svg.style.display = 'block'; + + render(d3.select("#graph"), graph); + + svg.style.width = graph.graph().width; + svg.style.height = graph.graph().height; + } + function setColorTheme(theme) { window.localStorage.setItem('theme', theme); diff --git a/programs/server/users.xml b/programs/server/users.xml index b33dc0628d1..5166b135e33 100644 --- a/programs/server/users.xml +++ b/programs/server/users.xml @@ -1,5 +1,7 @@ + + @@ -28,7 +30,9 @@ - IN + * != ALL --> NOT IN + * = ALL --> IN (SELECT singleValueOrNull(*) FROM subquery) + * != ANY --> NOT IN (SELECT singleValueOrNull(*) FROM subquery) + **/ + + auto * function = assert_cast(ast.get()); + String operator_name = function->name; + + auto function_equals = operator_name == "equals"; + auto function_not_equals = operator_name == "notEquals"; + + String aggregate_function_name; + if (function_equals || function_not_equals) + { + if (operator_name == "notEquals") + function->name = "notIn"; + else + function->name = "in"; + + if ((type == SubqueryFunctionType::ANY && function_equals) + || (type == SubqueryFunctionType::ALL && function_not_equals)) + { + return true; + } + + aggregate_function_name = "singleValueOrNull"; + } + else if (operator_name == "greaterOrEquals" || operator_name == "greater") + { + aggregate_function_name = (type == SubqueryFunctionType::ANY ? "min" : "max"); + } + else if (operator_name == "lessOrEquals" || operator_name == "less") + { + aggregate_function_name = (type == SubqueryFunctionType::ANY ? "max" : "min"); + } + else + return false; + + /// subquery --> (SELECT aggregate_function(*) FROM subquery) + auto aggregate_function = makeASTFunction(aggregate_function_name, std::make_shared()); + auto subquery_node = function->children[0]->children[1]; + + auto table_expression = std::make_shared(); + table_expression->subquery = std::move(subquery_node); + table_expression->children.push_back(table_expression->subquery); + + auto tables_in_select_element = std::make_shared(); + tables_in_select_element->table_expression = std::move(table_expression); + tables_in_select_element->children.push_back(tables_in_select_element->table_expression); + + auto tables_in_select = std::make_shared(); + tables_in_select->children.push_back(std::move(tables_in_select_element)); + + auto select_exp_list = std::make_shared(); + select_exp_list->children.push_back(aggregate_function); + + auto select_query = std::make_shared(); + select_query->children.push_back(select_exp_list); + select_query->children.push_back(tables_in_select); + + select_query->setExpression(ASTSelectQuery::Expression::SELECT, select_exp_list); + select_query->setExpression(ASTSelectQuery::Expression::TABLES, tables_in_select); + + auto select_with_union_query = std::make_shared(); + select_with_union_query->list_of_selects = std::make_shared(); + select_with_union_query->list_of_selects->children.push_back(std::move(select_query)); + select_with_union_query->children.push_back(select_with_union_query->list_of_selects); + + auto new_subquery = std::make_shared(); + new_subquery->children.push_back(select_with_union_query); + ast->children[0]->children.back() = std::move(new_subquery); + + return true; +} bool ParserLeftAssociativeBinaryOperatorList::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) { @@ -213,7 +320,15 @@ bool ParserLeftAssociativeBinaryOperatorList::parseImpl(Pos & pos, ASTPtr & node auto exp_list = std::make_shared(); ASTPtr elem; - if (!(remaining_elem_parser ? remaining_elem_parser : first_elem_parser)->parse(pos, elem, expected)) + SubqueryFunctionType subquery_function_type = SubqueryFunctionType::NONE; + if (allow_any_all_operators && ParserKeyword("ANY").ignore(pos, expected)) + subquery_function_type = SubqueryFunctionType::ANY; + else if (allow_any_all_operators && ParserKeyword("ALL").ignore(pos, expected)) + subquery_function_type = SubqueryFunctionType::ALL; + else if (!(remaining_elem_parser ? remaining_elem_parser : first_elem_parser)->parse(pos, elem, expected)) + return false; + + if (subquery_function_type != SubqueryFunctionType::NONE && !ParserSubquery().parse(pos, elem, expected)) return false; /// the first argument of the function is the previous element, the second is the next one @@ -224,6 +339,9 @@ bool ParserLeftAssociativeBinaryOperatorList::parseImpl(Pos & pos, ASTPtr & node exp_list->children.push_back(node); exp_list->children.push_back(elem); + if (allow_any_all_operators && subquery_function_type != SubqueryFunctionType::NONE && !modifyAST(function, subquery_function_type)) + return false; + /** special exception for the access operator to the element of the array `x[y]`, which * contains the infix part '[' and the suffix ''] '(specified as' [') */ @@ -855,4 +973,3 @@ bool ParserKeyValuePairsList::parseImpl(Pos & pos, ASTPtr & node, Expected & exp } } - diff --git a/src/Parsers/ExpressionListParsers.h b/src/Parsers/ExpressionListParsers.h index bd4763297d4..17deec4e9e4 100644 --- a/src/Parsers/ExpressionListParsers.h +++ b/src/Parsers/ExpressionListParsers.h @@ -79,14 +79,6 @@ private: class ParserUnionList : public IParserBase { public: - ParserUnionList(ParserPtr && elem_parser_, ParserPtr && s_union_parser_, ParserPtr && s_all_parser_, ParserPtr && s_distinct_parser_) - : elem_parser(std::move(elem_parser_)) - , s_union_parser(std::move(s_union_parser_)) - , s_all_parser(std::move(s_all_parser_)) - , s_distinct_parser(std::move(s_distinct_parser_)) - { - } - template static bool parseUtil(Pos & pos, const ElemFunc & parse_element, const SepFunc & parse_separator) { @@ -116,10 +108,6 @@ protected: const char * getName() const override { return "list of union elements"; } bool parseImpl(Pos & pos, ASTPtr & node, Expected & expected) override; private: - ParserPtr elem_parser; - ParserPtr s_union_parser; - ParserPtr s_all_parser; - ParserPtr s_distinct_parser; ASTSelectWithUnionQuery::UnionModes union_modes; }; @@ -133,6 +121,8 @@ private: Operators_t overlapping_operators_to_skip = { (const char *[]){ nullptr } }; ParserPtr first_elem_parser; ParserPtr remaining_elem_parser; + /// =, !=, <, > ALL (subquery) / ANY (subquery) + bool allow_any_all_operators = false; public: /** `operators_` - allowed operators and their corresponding functions @@ -142,8 +132,10 @@ public: { } - ParserLeftAssociativeBinaryOperatorList(Operators_t operators_, Operators_t overlapping_operators_to_skip_, ParserPtr && first_elem_parser_) - : operators(operators_), overlapping_operators_to_skip(overlapping_operators_to_skip_), first_elem_parser(std::move(first_elem_parser_)) + ParserLeftAssociativeBinaryOperatorList(Operators_t operators_, + Operators_t overlapping_operators_to_skip_, ParserPtr && first_elem_parser_, bool allow_any_all_operators_ = false) + : operators(operators_), overlapping_operators_to_skip(overlapping_operators_to_skip_), + first_elem_parser(std::move(first_elem_parser_)), allow_any_all_operators(allow_any_all_operators_) { } @@ -353,7 +345,8 @@ class ParserComparisonExpression : public IParserBase private: static const char * operators[]; static const char * overlapping_operators_to_skip[]; - ParserLeftAssociativeBinaryOperatorList operator_parser {operators, overlapping_operators_to_skip, std::make_unique()}; + ParserLeftAssociativeBinaryOperatorList operator_parser {operators, + overlapping_operators_to_skip, std::make_unique(), true}; protected: const char * getName() const override{ return "comparison expression"; } @@ -364,7 +357,6 @@ protected: } }; - /** Parser for nullity checking with IS (NOT) NULL. */ class ParserNullityChecking : public IParserBase diff --git a/src/Parsers/IAST.cpp b/src/Parsers/IAST.cpp index 0f38fcf98dd..3a21d704eb9 100644 --- a/src/Parsers/IAST.cpp +++ b/src/Parsers/IAST.cpp @@ -109,14 +109,6 @@ String IAST::getColumnName() const } -String IAST::getColumnName(const Settings & settings) const -{ - WriteBufferFromOwnString write_buffer; - appendColumnName(write_buffer, settings); - return write_buffer.str(); -} - - String IAST::getColumnNameWithoutAlias() const { WriteBufferFromOwnString write_buffer; diff --git a/src/Parsers/IAST.h b/src/Parsers/IAST.h index 143094e1d7a..2f9212da632 100644 --- a/src/Parsers/IAST.h +++ b/src/Parsers/IAST.h @@ -42,7 +42,6 @@ public: /** Get the canonical name of the column if the element is a column */ String getColumnName() const; - String getColumnName(const Settings & settings) const; /** Same as the above but ensure no alias names are used. This is for index analysis */ String getColumnNameWithoutAlias() const; @@ -52,8 +51,6 @@ public: throw Exception("Trying to get name of not a column: " + getID(), ErrorCodes::LOGICAL_ERROR); } - virtual void appendColumnName(WriteBuffer & ostr, const Settings &) const { appendColumnName(ostr); } - virtual void appendColumnNameWithoutAlias(WriteBuffer &) const { throw Exception("Trying to get name of not a column: " + getID(), ErrorCodes::LOGICAL_ERROR); @@ -61,7 +58,6 @@ public: /** Get the alias, if any, or the canonical name of the column, if it is not. */ virtual String getAliasOrColumnName() const { return getColumnName(); } - virtual String getAliasOrColumnName(const Settings & settings) const { return getColumnName(settings); } /** Get the alias, if any, or an empty string if it does not exist, or if the element does not support aliases. */ virtual String tryGetAlias() const { return String(); } @@ -231,6 +227,9 @@ public: void cloneChildren(); + // Return query_kind string representation of this AST query. + virtual const char * getQueryKindString() const { return ""; } + public: /// For syntax highlighting. static const char * hilite_keyword; diff --git a/src/Parsers/Lexer.cpp b/src/Parsers/Lexer.cpp index 241abbd98de..24390773d18 100644 --- a/src/Parsers/Lexer.cpp +++ b/src/Parsers/Lexer.cpp @@ -2,7 +2,6 @@ #include #include - namespace DB { @@ -338,6 +337,34 @@ Token Lexer::nextTokenImpl() } default: + if (*pos == '$') + { + /// Try to capture dollar sign as start of here doc + + std::string_view token_stream(pos, end - pos); + auto heredoc_name_end_position = token_stream.find('$', 1); + if (heredoc_name_end_position != std::string::npos) + { + size_t heredoc_size = heredoc_name_end_position + 1; + std::string_view heredoc = {token_stream.data(), heredoc_size}; + + size_t heredoc_end_position = token_stream.find(heredoc, heredoc_size); + if (heredoc_end_position != std::string::npos) + { + + pos += heredoc_end_position; + pos += heredoc_size; + + return Token(TokenType::HereDoc, token_begin, pos); + } + } + + if (((pos + 1 < end && !isWordCharASCII(pos[1])) || pos + 1 == end)) + { + /// Capture standalone dollar sign + return Token(TokenType::DollarSign, token_begin, ++pos); + } + } if (isWordCharASCII(*pos) || *pos == '$') { ++pos; diff --git a/src/Parsers/Lexer.h b/src/Parsers/Lexer.h index 447964355c8..f41e05147e5 100644 --- a/src/Parsers/Lexer.h +++ b/src/Parsers/Lexer.h @@ -33,6 +33,9 @@ namespace DB \ M(Asterisk) /** Could be used as multiplication operator or on it's own: "SELECT *" */ \ \ + M(HereDoc) \ + \ + M(DollarSign) \ M(Plus) \ M(Minus) \ M(Slash) \ diff --git a/src/Parsers/ParserCreateUserQuery.cpp b/src/Parsers/ParserCreateUserQuery.cpp index 1d132582580..72246a27f80 100644 --- a/src/Parsers/ParserCreateUserQuery.cpp +++ b/src/Parsers/ParserCreateUserQuery.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -300,6 +301,23 @@ namespace return ParserKeyword{"ON"}.ignore(pos, expected) && ASTQueryWithOnCluster::parse(pos, cluster, expected); }); } + + bool parseDefaultDatabase(IParserBase::Pos & pos, Expected & expected, std::shared_ptr & default_database) + { + return IParserBase::wrapParseImpl(pos, [&] + { + if (!ParserKeyword{"DEFAULT DATABASE"}.ignore(pos, expected)) + return false; + + ASTPtr ast; + ParserDatabaseOrNone database_p; + if (!database_p.parse(pos, ast, expected)) + return false; + + default_database = typeid_cast>(ast); + return true; + }); + } } @@ -349,6 +367,7 @@ bool ParserCreateUserQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expec std::shared_ptr default_roles; std::shared_ptr settings; std::shared_ptr grantees; + std::shared_ptr default_database; String cluster; while (true) @@ -390,6 +409,9 @@ bool ParserCreateUserQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expec if (!grantees && parseGrantees(pos, expected, attach_mode, grantees)) continue; + if (!default_database && parseDefaultDatabase(pos, expected, default_database)) + continue; + if (alter) { if (new_name.empty() && (names->size() == 1) && parseRenameTo(pos, expected, new_name)) @@ -445,6 +467,7 @@ bool ParserCreateUserQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expec query->default_roles = std::move(default_roles); query->settings = std::move(settings); query->grantees = std::move(grantees); + query->default_database = std::move(default_database); return true; } diff --git a/src/Parsers/ParserDatabaseOrNone.cpp b/src/Parsers/ParserDatabaseOrNone.cpp new file mode 100644 index 00000000000..c53c547aedd --- /dev/null +++ b/src/Parsers/ParserDatabaseOrNone.cpp @@ -0,0 +1,29 @@ +#include +#include +#include +#include + +namespace DB +{ +bool ParserDatabaseOrNone::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) +{ + auto result = std::make_shared(); + node = result; + + if (ParserKeyword{"NONE"}.ignore(pos, expected)) + { + result->none = true; + return true; + } + String database_name; + if (parseIdentifierOrStringLiteral(pos, expected, database_name)) + { + result->database_name = database_name; + return true; + } + return false; + + +} + +} diff --git a/src/Parsers/ParserDatabaseOrNone.h b/src/Parsers/ParserDatabaseOrNone.h new file mode 100644 index 00000000000..e5a21df4316 --- /dev/null +++ b/src/Parsers/ParserDatabaseOrNone.h @@ -0,0 +1,17 @@ +#pragma once +#include + +namespace DB +{ + +class ParserDatabaseOrNone : public IParserBase +{ +protected: + const char * getName() const override { return "DatabaseOrNone"; } + bool parseImpl(Pos & pos, ASTPtr & node, Expected & expected) override; + +}; + +} + + diff --git a/src/Parsers/ParserExplainQuery.cpp b/src/Parsers/ParserExplainQuery.cpp index dc548164157..b4ba0523239 100644 --- a/src/Parsers/ParserExplainQuery.cpp +++ b/src/Parsers/ParserExplainQuery.cpp @@ -19,6 +19,7 @@ bool ParserExplainQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected ParserKeyword s_syntax("SYNTAX"); ParserKeyword s_pipeline("PIPELINE"); ParserKeyword s_plan("PLAN"); + ParserKeyword s_estimates("ESTIMATE"); if (s_explain.ignore(pos, expected)) { @@ -32,6 +33,8 @@ bool ParserExplainQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected kind = ASTExplainQuery::ExplainKind::QueryPipeline; else if (s_plan.ignore(pos, expected)) kind = ASTExplainQuery::ExplainKind::QueryPlan; //-V1048 + else if (s_estimates.ignore(pos, expected)) + kind = ASTExplainQuery::ExplainKind::QueryEstimates; //-V1048 } else return false; diff --git a/src/Parsers/ParserGrantQuery.cpp b/src/Parsers/ParserGrantQuery.cpp index 9411fa93892..85a6c9c71d4 100644 --- a/src/Parsers/ParserGrantQuery.cpp +++ b/src/Parsers/ParserGrantQuery.cpp @@ -231,6 +231,7 @@ bool ParserGrantQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) if (attach_mode && !ParserKeyword{"ATTACH"}.ignore(pos, expected)) return false; + bool is_replace = false; bool is_revoke = false; if (ParserKeyword{"REVOKE"}.ignore(pos, expected)) is_revoke = true; @@ -271,6 +272,9 @@ bool ParserGrantQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) grant_option = true; else if (ParserKeyword{"WITH ADMIN OPTION"}.ignore(pos, expected)) admin_option = true; + + if (ParserKeyword{"WITH REPLACE OPTION"}.ignore(pos, expected)) + is_replace = true; } if (cluster.empty()) @@ -287,6 +291,17 @@ bool ParserGrantQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) element.grant_option = true; } + + bool replace_access = false; + bool replace_role = false; + if (is_replace) + { + if (roles) + replace_role = true; + else + replace_access = true; + } + if (!is_revoke) eraseNonGrantable(elements); @@ -300,6 +315,8 @@ bool ParserGrantQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) query->roles = std::move(roles); query->grantees = std::move(grantees); query->admin_option = admin_option; + query->replace_access = replace_access; + query->replace_granted_roles = replace_role; return true; } diff --git a/src/Parsers/ParserQueryWithOutput.cpp b/src/Parsers/ParserQueryWithOutput.cpp index d5aa1e47533..82f9f561187 100644 --- a/src/Parsers/ParserQueryWithOutput.cpp +++ b/src/Parsers/ParserQueryWithOutput.cpp @@ -1,27 +1,27 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include #include #include #include -#include +#include +#include +#include +#include #include diff --git a/src/Parsers/ParserSelectQuery.cpp b/src/Parsers/ParserSelectQuery.cpp index 548ec8879bd..b1f7570878f 100644 --- a/src/Parsers/ParserSelectQuery.cpp +++ b/src/Parsers/ParserSelectQuery.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -16,11 +17,12 @@ namespace DB namespace ErrorCodes { - extern const int TOP_AND_LIMIT_TOGETHER; - extern const int WITH_TIES_WITHOUT_ORDER_BY; + extern const int FIRST_AND_NEXT_TOGETHER; extern const int LIMIT_BY_WITH_TIES_IS_NOT_SUPPORTED; extern const int ROW_AND_ROWS_TOGETHER; - extern const int FIRST_AND_NEXT_TOGETHER; + extern const int SYNTAX_ERROR; + extern const int TOP_AND_LIMIT_TOGETHER; + extern const int WITH_TIES_WITHOUT_ORDER_BY; } @@ -32,6 +34,7 @@ bool ParserSelectQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) ParserKeyword s_select("SELECT"); ParserKeyword s_all("ALL"); ParserKeyword s_distinct("DISTINCT"); + ParserKeyword s_distinct_on("DISTINCT ON"); ParserKeyword s_from("FROM"); ParserKeyword s_prewhere("PREWHERE"); ParserKeyword s_where("WHERE"); @@ -77,12 +80,13 @@ bool ParserSelectQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) ASTPtr limit_by_length; ASTPtr limit_by_offset; ASTPtr limit_by_expression_list; + ASTPtr distinct_on_expression_list; ASTPtr limit_offset; ASTPtr limit_length; ASTPtr top_length; ASTPtr settings; - /// WITH expr list + /// WITH expr_list { if (s_with.ignore(pos, expected)) { @@ -94,7 +98,7 @@ bool ParserSelectQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) } } - /// SELECT [ALL/DISTINCT] [TOP N [WITH TIES]] expr list + /// SELECT [ALL/DISTINCT [ON (expr_list)]] [TOP N [WITH TIES]] expr_list { bool has_all = false; if (!s_select.ignore(pos, expected)) @@ -103,13 +107,27 @@ bool ParserSelectQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) if (s_all.ignore(pos, expected)) has_all = true; - if (s_distinct.ignore(pos, expected)) + if (s_distinct_on.ignore(pos, expected)) + { + if (open_bracket.ignore(pos, expected)) + { + if (!exp_list.parse(pos, distinct_on_expression_list, expected)) + return false; + if (!close_bracket.ignore(pos, expected)) + return false; + } + else + return false; + } + else if (s_distinct.ignore(pos, expected)) + { select_query->distinct = true; + } if (!has_all && s_all.ignore(pos, expected)) has_all = true; - if (has_all && select_query->distinct) + if (has_all && (select_query->distinct || distinct_on_expression_list)) return false; if (s_top.ignore(pos, expected)) @@ -256,13 +274,19 @@ bool ParserSelectQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) select_query->limit_with_ties = true; } + if (limit_with_ties_occured && distinct_on_expression_list) + throw Exception("Can not use WITH TIES alongside LIMIT BY/DISTINCT ON", ErrorCodes::LIMIT_BY_WITH_TIES_IS_NOT_SUPPORTED); + if (s_by.ignore(pos, expected)) { /// WITH TIES was used alongside LIMIT BY /// But there are other kind of queries like LIMIT n BY smth LIMIT m WITH TIES which are allowed. /// So we have to ignore WITH TIES exactly in LIMIT BY state. if (limit_with_ties_occured) - throw Exception("Can not use WITH TIES alongside LIMIT BY", ErrorCodes::LIMIT_BY_WITH_TIES_IS_NOT_SUPPORTED); + throw Exception("Can not use WITH TIES alongside LIMIT BY/DISTINCT ON", ErrorCodes::LIMIT_BY_WITH_TIES_IS_NOT_SUPPORTED); + + if (distinct_on_expression_list) + throw Exception("Can not use DISTINCT ON alongside LIMIT BY", ErrorCodes::SYNTAX_ERROR); limit_by_length = limit_length; limit_by_offset = limit_offset; @@ -335,6 +359,17 @@ bool ParserSelectQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) } } + if (distinct_on_expression_list) + { + /// DISTINCT ON and LIMIT BY are mutually exclusive, checked before + assert (limit_by_expression_list == nullptr); + + /// Transform `DISTINCT ON expr` to `LIMIT 1 BY expr` + limit_by_expression_list = distinct_on_expression_list; + limit_by_length = std::make_shared(Field{UInt8(1)}); + distinct_on_expression_list = nullptr; + } + /// Because TOP n in totally equals LIMIT n if (top_length) limit_length = top_length; diff --git a/src/Parsers/ParserSelectWithUnionQuery.cpp b/src/Parsers/ParserSelectWithUnionQuery.cpp index 87e2dab1a47..532a9e20735 100644 --- a/src/Parsers/ParserSelectWithUnionQuery.cpp +++ b/src/Parsers/ParserSelectWithUnionQuery.cpp @@ -10,12 +10,7 @@ namespace DB bool ParserSelectWithUnionQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) { ASTPtr list_node; - - ParserUnionList parser( - std::make_unique(), - std::make_unique("UNION"), - std::make_unique("ALL"), - std::make_unique("DISTINCT")); + ParserUnionList parser; if (!parser.parse(pos, list_node, expected)) return false; diff --git a/src/Parsers/queryNormalization.h b/src/Parsers/queryNormalization.h index bea365c02e4..e5b1724ccfa 100644 --- a/src/Parsers/queryNormalization.h +++ b/src/Parsers/queryNormalization.h @@ -28,7 +28,7 @@ inline UInt64 ALWAYS_INLINE normalizedQueryHash(const char * begin, const char * continue; /// Literals. - if (token.type == TokenType::Number || token.type == TokenType::StringLiteral) + if (token.type == TokenType::Number || token.type == TokenType::StringLiteral || token.type == TokenType::HereDoc) { if (0 == num_literals_in_sequence) hash.update("\x00", 1); @@ -156,7 +156,7 @@ inline void ALWAYS_INLINE normalizeQueryToPODArray(const char * begin, const cha prev_insignificant = false; /// Literals. - if (token.type == TokenType::Number || token.type == TokenType::StringLiteral) + if (token.type == TokenType::Number || token.type == TokenType::StringLiteral || token.type == TokenType::HereDoc) { if (0 == num_literals_in_sequence) res_data.push_back('?'); diff --git a/src/Parsers/ya.make b/src/Parsers/ya.make index 62e0c2b3225..3b8a9a19bce 100644 --- a/src/Parsers/ya.make +++ b/src/Parsers/ya.make @@ -21,6 +21,7 @@ SRCS( ASTCreateRowPolicyQuery.cpp ASTCreateSettingsProfileQuery.cpp ASTCreateUserQuery.cpp + ASTDatabaseOrNone.cpp ASTDictionary.cpp ASTDictionaryAttributeDeclaration.cpp ASTDropAccessEntityQuery.cpp @@ -95,6 +96,7 @@ SRCS( ParserCreateSettingsProfileQuery.cpp ParserCreateUserQuery.cpp ParserDataType.cpp + ParserDatabaseOrNone.cpp ParserDescribeTableQuery.cpp ParserDictionary.cpp ParserDictionaryAttributeDeclaration.cpp diff --git a/src/Processors/Executors/PipelineExecutor.cpp b/src/Processors/Executors/PipelineExecutor.cpp index ac6a2176979..b91c1caa4a5 100644 --- a/src/Processors/Executors/PipelineExecutor.cpp +++ b/src/Processors/Executors/PipelineExecutor.cpp @@ -45,6 +45,8 @@ PipelineExecutor::PipelineExecutor(Processors & processors_, QueryStatus * elem) try { graph = std::make_unique(processors); + if (process_list_element) + process_list_element->addPipelineExecutor(this); } catch (Exception & exception) { @@ -59,6 +61,12 @@ PipelineExecutor::PipelineExecutor(Processors & processors_, QueryStatus * elem) } } +PipelineExecutor::~PipelineExecutor() +{ + if (process_list_element) + process_list_element->removePipelineExecutor(this); +} + void PipelineExecutor::addChildlessProcessorsToStack(Stack & stack) { UInt64 num_processors = processors.size(); @@ -391,6 +399,9 @@ void PipelineExecutor::finish() void PipelineExecutor::execute(size_t num_threads) { + if (num_threads < 1) + num_threads = 1; + try { executeImpl(num_threads); diff --git a/src/Processors/Executors/PipelineExecutor.h b/src/Processors/Executors/PipelineExecutor.h index 213446ad43f..0652d81addc 100644 --- a/src/Processors/Executors/PipelineExecutor.h +++ b/src/Processors/Executors/PipelineExecutor.h @@ -31,6 +31,7 @@ public: /// /// Explicit graph representation is built in constructor. Throws if graph is not correct. explicit PipelineExecutor(Processors & processors_, QueryStatus * elem = nullptr); + ~PipelineExecutor(); /// Execute pipeline in multiple threads. Must be called once. /// In case of exception during execution throws any occurred. @@ -127,7 +128,7 @@ private: ProcessorsMap processors_map; /// Now it's used to check if query was killed. - QueryStatus * process_list_element = nullptr; + QueryStatus * const process_list_element = nullptr; /// Graph related methods. bool expandPipeline(Stack & stack, UInt64 pid); diff --git a/src/Processors/Executors/PullingAsyncPipelineExecutor.cpp b/src/Processors/Executors/PullingAsyncPipelineExecutor.cpp index ca5f4cc290f..8ecbe75af3a 100644 --- a/src/Processors/Executors/PullingAsyncPipelineExecutor.cpp +++ b/src/Processors/Executors/PullingAsyncPipelineExecutor.cpp @@ -174,9 +174,8 @@ void PullingAsyncPipelineExecutor::cancel() if (data && !data->is_finished && data->executor) data->executor->cancel(); - /// Finish lazy format. Otherwise thread.join() may hung. - if (lazy_format && !lazy_format->isFinished()) - lazy_format->finish(); + /// The following code is needed to rethrow exception from PipelineExecutor. + /// It could have been thrown from pull(), but we will not likely call it again. /// Join thread here to wait for possible exception. if (data && data->thread.joinable()) diff --git a/src/Processors/Formats/IInputFormat.h b/src/Processors/Formats/IInputFormat.h index f8811962260..59d33e3295e 100644 --- a/src/Processors/Formats/IInputFormat.h +++ b/src/Processors/Formats/IInputFormat.h @@ -72,12 +72,16 @@ public: size_t getCurrentUnitNumber() const { return current_unit_number; } void setCurrentUnitNumber(size_t current_unit_number_) { current_unit_number = current_unit_number_; } + void addBuffer(std::unique_ptr buffer) { owned_buffers.emplace_back(std::move(buffer)); } + protected: ColumnMappingPtr column_mapping{}; private: /// Number of currently parsed chunk (if parallel parsing is enabled) size_t current_unit_number = 0; + + std::vector> owned_buffers; }; } diff --git a/src/Processors/Formats/IOutputFormat.cpp b/src/Processors/Formats/IOutputFormat.cpp index 88649d9ca25..7d82c267f36 100644 --- a/src/Processors/Formats/IOutputFormat.cpp +++ b/src/Processors/Formats/IOutputFormat.cpp @@ -76,6 +76,9 @@ void IOutputFormat::work() if (rows_before_limit_counter && rows_before_limit_counter->hasAppliedLimit()) setRowsBeforeLimit(rows_before_limit_counter->get()); + if (before_finalize_callback) + before_finalize_callback(); + finalize(); finalized = true; return; @@ -117,4 +120,3 @@ void IOutputFormat::write(const Block & block) } } - diff --git a/src/Processors/Formats/IOutputFormat.h b/src/Processors/Formats/IOutputFormat.h index 4c2b3f30070..4d86d18f70e 100644 --- a/src/Processors/Formats/IOutputFormat.h +++ b/src/Processors/Formats/IOutputFormat.h @@ -67,6 +67,9 @@ public: /// Passed value are delta, that must be summarized. virtual void onProgress(const Progress & /*progress*/) {} + /// Set callback, which will be called before call to finalize(). + void setBeforeFinalizeCallback(std::function callback) { before_finalize_callback = callback; } + /// Content-Type to set when sending HTTP response. virtual std::string getContentType() const { return "text/plain; charset=UTF-8"; } @@ -91,6 +94,7 @@ private: size_t result_bytes = 0; bool prefix_written = false; + + std::function before_finalize_callback; }; } - diff --git a/src/Processors/Formats/IRowInputFormat.h b/src/Processors/Formats/IRowInputFormat.h index 2ca182b7ffe..19a94d41044 100644 --- a/src/Processors/Formats/IRowInputFormat.h +++ b/src/Processors/Formats/IRowInputFormat.h @@ -5,8 +5,8 @@ #include #include #include -#include +class Stopwatch; namespace DB { diff --git a/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp b/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp index 269faac5258..84ca789261f 100644 --- a/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp +++ b/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp @@ -22,8 +22,8 @@ namespace ErrorCodes extern const int CANNOT_READ_ALL_DATA; } -ArrowBlockInputFormat::ArrowBlockInputFormat(ReadBuffer & in_, const Block & header_, bool stream_) - : IInputFormat(header_, in_), stream{stream_} +ArrowBlockInputFormat::ArrowBlockInputFormat(ReadBuffer & in_, const Block & header_, bool stream_, const FormatSettings & format_settings_) + : IInputFormat(header_, in_), stream{stream_}, format_settings(format_settings_) { } @@ -102,7 +102,7 @@ void ArrowBlockInputFormat::prepareReader() schema = file_reader->schema(); } - arrow_column_to_ch_column = std::make_unique(getPort().getHeader(), std::move(schema), "Arrow"); + arrow_column_to_ch_column = std::make_unique(getPort().getHeader(), "Arrow", format_settings.arrow.import_nested); if (stream) record_batch_total = -1; @@ -119,9 +119,9 @@ void registerInputFormatProcessorArrow(FormatFactory & factory) [](ReadBuffer & buf, const Block & sample, const RowInputFormatParams & /* params */, - const FormatSettings & /* format_settings */) + const FormatSettings & format_settings) { - return std::make_shared(buf, sample, false); + return std::make_shared(buf, sample, false, format_settings); }); factory.markFormatAsColumnOriented("Arrow"); factory.registerInputFormatProcessor( @@ -129,9 +129,9 @@ void registerInputFormatProcessorArrow(FormatFactory & factory) [](ReadBuffer & buf, const Block & sample, const RowInputFormatParams & /* params */, - const FormatSettings & /* format_settings */) + const FormatSettings & format_settings) { - return std::make_shared(buf, sample, true); + return std::make_shared(buf, sample, true, format_settings); }); } diff --git a/src/Processors/Formats/Impl/ArrowBlockInputFormat.h b/src/Processors/Formats/Impl/ArrowBlockInputFormat.h index 3bfead93bf1..705c47c9b17 100644 --- a/src/Processors/Formats/Impl/ArrowBlockInputFormat.h +++ b/src/Processors/Formats/Impl/ArrowBlockInputFormat.h @@ -1,8 +1,12 @@ #pragma once -#include "config_formats.h" +#if !defined(ARCADIA_BUILD) +# include "config_formats.h" +#endif + #if USE_ARROW #include +#include namespace arrow { class RecordBatchReader; } namespace arrow::ipc { class RecordBatchFileReader; } @@ -16,7 +20,7 @@ class ArrowColumnToCHColumn; class ArrowBlockInputFormat : public IInputFormat { public: - ArrowBlockInputFormat(ReadBuffer & in_, const Block & header_, bool stream_); + ArrowBlockInputFormat(ReadBuffer & in_, const Block & header_, bool stream_, const FormatSettings & format_settings_); void resetParser() override; @@ -38,6 +42,8 @@ private: int record_batch_total = 0; int record_batch_current = 0; + const FormatSettings format_settings; + void prepareReader(); }; diff --git a/src/Processors/Formats/Impl/ArrowBlockOutputFormat.h b/src/Processors/Formats/Impl/ArrowBlockOutputFormat.h index 40d81f8b919..44d46e97d2a 100644 --- a/src/Processors/Formats/Impl/ArrowBlockOutputFormat.h +++ b/src/Processors/Formats/Impl/ArrowBlockOutputFormat.h @@ -1,5 +1,8 @@ #pragma once -#include "config_formats.h" +#if !defined(ARCADIA_BUILD) +# include "config_formats.h" +#endif + #if USE_ARROW #include diff --git a/src/Processors/Formats/Impl/ArrowBufferedStreams.cpp b/src/Processors/Formats/Impl/ArrowBufferedStreams.cpp index 9582e0c3312..243f3da5903 100644 --- a/src/Processors/Formats/Impl/ArrowBufferedStreams.cpp +++ b/src/Processors/Formats/Impl/ArrowBufferedStreams.cpp @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/Processors/Formats/Impl/ArrowBufferedStreams.h b/src/Processors/Formats/Impl/ArrowBufferedStreams.h index a10a5bcabdb..a49936f326c 100644 --- a/src/Processors/Formats/Impl/ArrowBufferedStreams.h +++ b/src/Processors/Formats/Impl/ArrowBufferedStreams.h @@ -1,5 +1,8 @@ #pragma once -#include "config_formats.h" +#if !defined(ARCADIA_BUILD) +# include "config_formats.h" +#endif + #if USE_ARROW || USE_ORC || USE_PARQUET #include diff --git a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp index 16f27058121..2da4d7d298d 100644 --- a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp +++ b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp @@ -1,7 +1,7 @@ -#include "config_formats.h" #include "ArrowColumnToCHColumn.h" #if USE_ARROW || USE_ORC || USE_PARQUET + #include #include #include @@ -10,9 +10,13 @@ #include #include #include +#include +#include +#include +#include #include #include -#include +#include #include #include #include @@ -20,574 +24,564 @@ #include #include #include +#include #include #include -#include +#include +#include +/// UINT16 and UINT32 are processed separately, see comments in readColumnFromArrowColumn. +#define FOR_ARROW_NUMERIC_TYPES(M) \ + M(arrow::Type::UINT8, DB::UInt8) \ + M(arrow::Type::INT8, DB::Int8) \ + M(arrow::Type::INT16, DB::Int16) \ + M(arrow::Type::INT32, DB::Int32) \ + M(arrow::Type::UINT64, DB::UInt64) \ + M(arrow::Type::INT64, DB::Int64) \ + M(arrow::Type::HALF_FLOAT, DB::Float32) \ + M(arrow::Type::FLOAT, DB::Float32) \ + M(arrow::Type::DOUBLE, DB::Float64) + +#define FOR_ARROW_INDEXES_TYPES(M) \ + M(arrow::Type::UINT8, DB::UInt8) \ + M(arrow::Type::INT8, DB::UInt8) \ + M(arrow::Type::UINT16, DB::UInt16) \ + M(arrow::Type::INT16, DB::UInt16) \ + M(arrow::Type::UINT32, DB::UInt32) \ + M(arrow::Type::INT32, DB::UInt32) \ + M(arrow::Type::UINT64, DB::UInt64) \ + M(arrow::Type::INT64, DB::UInt64) + namespace DB { - namespace ErrorCodes - { - extern const int UNKNOWN_TYPE; - extern const int VALUE_IS_OUT_OF_RANGE_OF_DATA_TYPE; - extern const int CANNOT_CONVERT_TYPE; - extern const int CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN; - extern const int THERE_IS_NO_COLUMN; - extern const int BAD_ARGUMENTS; - } - static const std::initializer_list> arrow_type_to_internal_type = - { - {arrow::Type::UINT8, "UInt8"}, - {arrow::Type::INT8, "Int8"}, - {arrow::Type::UINT16, "UInt16"}, - {arrow::Type::INT16, "Int16"}, - {arrow::Type::UINT32, "UInt32"}, - {arrow::Type::INT32, "Int32"}, - {arrow::Type::UINT64, "UInt64"}, - {arrow::Type::INT64, "Int64"}, - {arrow::Type::HALF_FLOAT, "Float32"}, - {arrow::Type::FLOAT, "Float32"}, - {arrow::Type::DOUBLE, "Float64"}, +namespace ErrorCodes +{ + extern const int UNKNOWN_TYPE; + extern const int VALUE_IS_OUT_OF_RANGE_OF_DATA_TYPE; + extern const int THERE_IS_NO_COLUMN; + extern const int BAD_ARGUMENTS; + extern const int UNKNOWN_EXCEPTION; +} - {arrow::Type::BOOL, "UInt8"}, - {arrow::Type::DATE32, "Date"}, - {arrow::Type::DATE64, "DateTime"}, - {arrow::Type::TIMESTAMP, "DateTime"}, - - {arrow::Type::STRING, "String"}, - {arrow::Type::BINARY, "String"}, - - // TODO: add other types that are convertible to internal ones: - // 0. ENUM? - // 1. UUID -> String - // 2. JSON -> String - // Full list of types: contrib/arrow/cpp/src/arrow/type.h - }; /// Inserts numeric data right into internal column data to reduce an overhead - template > - static void fillColumnWithNumericData(std::shared_ptr & arrow_column, IColumn & internal_column) +template > +static ColumnWithTypeAndName readColumnWithNumericData(std::shared_ptr & arrow_column, const String & column_name) +{ + auto internal_type = std::make_shared>(); + auto internal_column = internal_type->createColumn(); + auto & column_data = static_cast(*internal_column).getData(); + column_data.reserve(arrow_column->length()); + + for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) { - auto & column_data = static_cast(internal_column).getData(); - column_data.reserve(arrow_column->length()); + std::shared_ptr chunk = arrow_column->chunk(chunk_i); + /// buffers[0] is a null bitmap and buffers[1] are actual values + std::shared_ptr buffer = chunk->data()->buffers[1]; - for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) - { - std::shared_ptr chunk = arrow_column->chunk(chunk_i); - /// buffers[0] is a null bitmap and buffers[1] are actual values - std::shared_ptr buffer = chunk->data()->buffers[1]; - - const auto * raw_data = reinterpret_cast(buffer->data()); - column_data.insert_assume_reserved(raw_data, raw_data + chunk->length()); - } + const auto * raw_data = reinterpret_cast(buffer->data()); + column_data.insert_assume_reserved(raw_data, raw_data + chunk->length()); } + return {std::move(internal_column), std::move(internal_type), column_name}; +} /// Inserts chars and offsets right into internal column data to reduce an overhead. /// Internal offsets are shifted by one to the right in comparison with Arrow ones. So the last offset should map to the end of all chars. /// Also internal strings are null terminated. - static void fillColumnWithStringData(std::shared_ptr & arrow_column, IColumn & internal_column) +static ColumnWithTypeAndName readColumnWithStringData(std::shared_ptr & arrow_column, const String & column_name) +{ + auto internal_type = std::make_shared(); + auto internal_column = internal_type->createColumn(); + PaddedPODArray & column_chars_t = assert_cast(*internal_column).getChars(); + PaddedPODArray & column_offsets = assert_cast(*internal_column).getOffsets(); + + size_t chars_t_size = 0; + for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) { - PaddedPODArray & column_chars_t = assert_cast(internal_column).getChars(); - PaddedPODArray & column_offsets = assert_cast(internal_column).getOffsets(); + arrow::BinaryArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const size_t chunk_length = chunk.length(); - size_t chars_t_size = 0; - for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) + if (chunk_length > 0) { - arrow::BinaryArray & chunk = static_cast(*(arrow_column->chunk(chunk_i))); - const size_t chunk_length = chunk.length(); - - if (chunk_length > 0) - { - chars_t_size += chunk.value_offset(chunk_length - 1) + chunk.value_length(chunk_length - 1); - chars_t_size += chunk_length; /// additional space for null bytes - } - } - - column_chars_t.reserve(chars_t_size); - column_offsets.reserve(arrow_column->length()); - - for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) - { - arrow::BinaryArray & chunk = static_cast(*(arrow_column->chunk(chunk_i))); - std::shared_ptr buffer = chunk.value_data(); - const size_t chunk_length = chunk.length(); - - for (size_t offset_i = 0; offset_i != chunk_length; ++offset_i) - { - if (!chunk.IsNull(offset_i) && buffer) - { - const auto * raw_data = buffer->data() + chunk.value_offset(offset_i); - column_chars_t.insert_assume_reserved(raw_data, raw_data + chunk.value_length(offset_i)); - } - column_chars_t.emplace_back('\0'); - - column_offsets.emplace_back(column_chars_t.size()); - } + chars_t_size += chunk.value_offset(chunk_length - 1) + chunk.value_length(chunk_length - 1); + chars_t_size += chunk_length; /// additional space for null bytes } } - static void fillColumnWithBooleanData(std::shared_ptr & arrow_column, IColumn & internal_column) + column_chars_t.reserve(chars_t_size); + column_offsets.reserve(arrow_column->length()); + + for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) { - auto & column_data = assert_cast &>(internal_column).getData(); - column_data.reserve(arrow_column->length()); + arrow::BinaryArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + std::shared_ptr buffer = chunk.value_data(); + const size_t chunk_length = chunk.length(); - for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) + for (size_t offset_i = 0; offset_i != chunk_length; ++offset_i) { - arrow::BooleanArray & chunk = static_cast(*(arrow_column->chunk(chunk_i))); - /// buffers[0] is a null bitmap and buffers[1] are actual values - std::shared_ptr buffer = chunk.data()->buffers[1]; - - for (size_t bool_i = 0; bool_i != static_cast(chunk.length()); ++bool_i) - column_data.emplace_back(chunk.Value(bool_i)); - } - } - -/// Arrow stores Parquet::DATE in Int32, while ClickHouse stores Date in UInt16. Therefore, it should be checked before saving - static void fillColumnWithDate32Data(std::shared_ptr & arrow_column, IColumn & internal_column) - { - PaddedPODArray & column_data = assert_cast &>(internal_column).getData(); - column_data.reserve(arrow_column->length()); - - for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) - { - arrow::Date32Array & chunk = static_cast(*(arrow_column->chunk(chunk_i))); - - for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) + if (!chunk.IsNull(offset_i) && buffer) { - UInt32 days_num = static_cast(chunk.Value(value_i)); - if (days_num > DATE_LUT_MAX_DAY_NUM) - { - // TODO: will it rollback correctly? - throw Exception - { - fmt::format("Input value {} of a column \"{}\" is greater than max allowed Date value, which is {}", days_num, internal_column.getName(), DATE_LUT_MAX_DAY_NUM), - ErrorCodes::VALUE_IS_OUT_OF_RANGE_OF_DATA_TYPE - }; - } - - column_data.emplace_back(days_num); + const auto * raw_data = buffer->data() + chunk.value_offset(offset_i); + column_chars_t.insert_assume_reserved(raw_data, raw_data + chunk.value_length(offset_i)); } + column_chars_t.emplace_back('\0'); + + column_offsets.emplace_back(column_chars_t.size()); } } + return {std::move(internal_column), std::move(internal_type), column_name}; +} + +static ColumnWithTypeAndName readColumnWithBooleanData(std::shared_ptr & arrow_column, const String & column_name) +{ + auto internal_type = std::make_shared(); + auto internal_column = internal_type->createColumn(); + auto & column_data = assert_cast &>(*internal_column).getData(); + column_data.reserve(arrow_column->length()); + + for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) + { + arrow::BooleanArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + /// buffers[0] is a null bitmap and buffers[1] are actual values + std::shared_ptr buffer = chunk.data()->buffers[1]; + + for (size_t bool_i = 0; bool_i != static_cast(chunk.length()); ++bool_i) + column_data.emplace_back(chunk.Value(bool_i)); + } + return {std::move(internal_column), std::move(internal_type), column_name}; +} + +static ColumnWithTypeAndName readColumnWithDate32Data(std::shared_ptr & arrow_column, const String & column_name) +{ + auto internal_type = std::make_shared(); + auto internal_column = internal_type->createColumn(); + PaddedPODArray & column_data = assert_cast &>(*internal_column).getData(); + column_data.reserve(arrow_column->length()); + + for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) + { + arrow::Date32Array & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + + for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) + { + Int32 days_num = static_cast(chunk.Value(value_i)); + if (days_num > DATE_LUT_MAX_EXTEND_DAY_NUM) + throw Exception{ErrorCodes::VALUE_IS_OUT_OF_RANGE_OF_DATA_TYPE, + "Input value {} of a column \"{}\" is greater than max allowed Date value, which is {}", days_num, column_name, DATE_LUT_MAX_DAY_NUM}; + + column_data.emplace_back(days_num); + } + } + return {std::move(internal_column), std::move(internal_type), column_name}; +} /// Arrow stores Parquet::DATETIME in Int64, while ClickHouse stores DateTime in UInt32. Therefore, it should be checked before saving - static void fillColumnWithDate64Data(std::shared_ptr & arrow_column, IColumn & internal_column) - { - auto & column_data = assert_cast &>(internal_column).getData(); - column_data.reserve(arrow_column->length()); +static ColumnWithTypeAndName readColumnWithDate64Data(std::shared_ptr & arrow_column, const String & column_name) +{ + auto internal_type = std::make_shared(); + auto internal_column = internal_type->createColumn(); + auto & column_data = assert_cast &>(*internal_column).getData(); + column_data.reserve(arrow_column->length()); - for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) + for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) + { + auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) { - auto & chunk = static_cast(*(arrow_column->chunk(chunk_i))); - for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) - { - auto timestamp = static_cast(chunk.Value(value_i) / 1000); // Always? in ms - column_data.emplace_back(timestamp); - } + auto timestamp = static_cast(chunk.Value(value_i) / 1000); // Always? in ms + column_data.emplace_back(timestamp); } } + return {std::move(internal_column), std::move(internal_type), column_name}; +} - static void fillColumnWithTimestampData(std::shared_ptr & arrow_column, IColumn & internal_column) +static ColumnWithTypeAndName readColumnWithTimestampData(std::shared_ptr & arrow_column, const String & column_name) +{ + auto internal_type = std::make_shared(); + auto internal_column = internal_type->createColumn(); + auto & column_data = assert_cast &>(*internal_column).getData(); + column_data.reserve(arrow_column->length()); + + for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) { - auto & column_data = assert_cast &>(internal_column).getData(); - column_data.reserve(arrow_column->length()); + auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & type = static_cast(*chunk.type()); - for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) + UInt32 divide = 1; + const auto unit = type.unit(); + switch (unit) { - auto & chunk = static_cast(*(arrow_column->chunk(chunk_i))); - const auto & type = static_cast(*chunk.type()); + case arrow::TimeUnit::SECOND: + divide = 1; + break; + case arrow::TimeUnit::MILLI: + divide = 1000; + break; + case arrow::TimeUnit::MICRO: + divide = 1000000; + break; + case arrow::TimeUnit::NANO: + divide = 1000000000; + break; + } - UInt32 divide = 1; - const auto unit = type.unit(); - switch (unit) - { - case arrow::TimeUnit::SECOND: - divide = 1; - break; - case arrow::TimeUnit::MILLI: - divide = 1000; - break; - case arrow::TimeUnit::MICRO: - divide = 1000000; - break; - case arrow::TimeUnit::NANO: - divide = 1000000000; - break; - } - - for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) - { - auto timestamp = static_cast(chunk.Value(value_i) / divide); // ms! TODO: check other 's' 'ns' ... - column_data.emplace_back(timestamp); - } + for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) + { + auto timestamp = static_cast(chunk.Value(value_i) / divide); // ms! TODO: check other 's' 'ns' ... + column_data.emplace_back(timestamp); } } + return {std::move(internal_column), std::move(internal_type), column_name}; +} - template - static void fillColumnWithDecimalData(std::shared_ptr & arrow_column, IColumn & internal_column) +template +static ColumnWithTypeAndName readColumnWithDecimalData(std::shared_ptr & arrow_column, const String & column_name) +{ + const auto * arrow_decimal_type = static_cast(arrow_column->type().get()); + auto internal_type = std::make_shared>(arrow_decimal_type->precision(), arrow_decimal_type->scale()); + auto internal_column = internal_type->createColumn(); + auto & column = assert_cast &>(*internal_column); + auto & column_data = column.getData(); + column_data.reserve(arrow_column->length()); + + for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) { - auto & column = assert_cast &>(internal_column); - auto & column_data = column.getData(); - column_data.reserve(arrow_column->length()); - - for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) + auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) { - auto & chunk = static_cast(*(arrow_column->chunk(chunk_i))); - for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) - { - column_data.emplace_back(chunk.IsNull(value_i) ? DecimalType(0) : *reinterpret_cast(chunk.Value(value_i))); // TODO: copy column - } + column_data.emplace_back(chunk.IsNull(value_i) ? DecimalType(0) : *reinterpret_cast(chunk.Value(value_i))); // TODO: copy column } } + return {std::move(internal_column), std::move(internal_type), column_name}; +} /// Creates a null bytemap from arrow's null bitmap - static void fillByteMapFromArrowColumn(std::shared_ptr & arrow_column, IColumn & bytemap) +static ColumnPtr readByteMapFromArrowColumn(std::shared_ptr & arrow_column) +{ + auto nullmap_column = ColumnUInt8::create(); + PaddedPODArray & bytemap_data = assert_cast &>(*nullmap_column).getData(); + bytemap_data.reserve(arrow_column->length()); + + for (size_t chunk_i = 0; chunk_i != static_cast(arrow_column->num_chunks()); ++chunk_i) { - PaddedPODArray & bytemap_data = assert_cast &>(bytemap).getData(); - bytemap_data.reserve(arrow_column->length()); + std::shared_ptr chunk = arrow_column->chunk(chunk_i); - for (size_t chunk_i = 0; chunk_i != static_cast(arrow_column->num_chunks()); ++chunk_i) - { - std::shared_ptr chunk = arrow_column->chunk(chunk_i); - - for (size_t value_i = 0; value_i != static_cast(chunk->length()); ++value_i) - bytemap_data.emplace_back(chunk->IsNull(value_i)); - } + for (size_t value_i = 0; value_i != static_cast(chunk->length()); ++value_i) + bytemap_data.emplace_back(chunk->IsNull(value_i)); } + return nullmap_column; +} - static void fillOffsetsFromArrowListColumn(std::shared_ptr & arrow_column, IColumn & offsets) +static ColumnPtr readOffsetsFromArrowListColumn(std::shared_ptr & arrow_column) +{ + auto offsets_column = ColumnUInt64::create(); + ColumnArray::Offsets & offsets_data = assert_cast &>(*offsets_column).getData(); + offsets_data.reserve(arrow_column->length()); + + for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) { - ColumnArray::Offsets & offsets_data = assert_cast &>(offsets).getData(); - offsets_data.reserve(arrow_column->length()); - - for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) - { - arrow::ListArray & list_chunk = static_cast(*(arrow_column->chunk(chunk_i))); - auto arrow_offsets_array = list_chunk.offsets(); - auto & arrow_offsets = static_cast(*arrow_offsets_array); - auto start = offsets_data.back(); - for (int64_t i = 1; i < arrow_offsets.length(); ++i) - offsets_data.emplace_back(start + arrow_offsets.Value(i)); - } + arrow::ListArray & list_chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + auto arrow_offsets_array = list_chunk.offsets(); + auto & arrow_offsets = dynamic_cast(*arrow_offsets_array); + auto start = offsets_data.back(); + for (int64_t i = 1; i < arrow_offsets.length(); ++i) + offsets_data.emplace_back(start + arrow_offsets.Value(i)); } - static ColumnPtr createAndFillColumnWithIndexesData(std::shared_ptr & arrow_column) + return offsets_column; +} + +static ColumnPtr readColumnWithIndexesData(std::shared_ptr & arrow_column) +{ + switch (arrow_column->type()->id()) { - switch (arrow_column->type()->id()) - { # define DISPATCH(ARROW_NUMERIC_TYPE, CPP_NUMERIC_TYPE) \ case ARROW_NUMERIC_TYPE: \ { \ - auto column = DataTypeNumber().createColumn(); \ - fillColumnWithNumericData(arrow_column, *column); \ - return column; \ + return readColumnWithNumericData(arrow_column, "").column; \ } - FOR_ARROW_INDEXES_TYPES(DISPATCH) + FOR_ARROW_INDEXES_TYPES(DISPATCH) # undef DISPATCH - default: - throw Exception(fmt::format("Unsupported type for indexes in LowCardinality: {}.", arrow_column->type()->name()), ErrorCodes::BAD_ARGUMENTS); - } - } - - static void readColumnFromArrowColumn( - std::shared_ptr & arrow_column, - IColumn & internal_column, - const std::string & column_name, - const std::string & format_name, - bool is_nullable, - std::unordered_map dictionary_values) - { - if (internal_column.isNullable()) - { - ColumnNullable & column_nullable = assert_cast(internal_column); - readColumnFromArrowColumn(arrow_column, column_nullable.getNestedColumn(), column_name, format_name, true, dictionary_values); - fillByteMapFromArrowColumn(arrow_column, column_nullable.getNullMapColumn()); - return; - } - - /// TODO: check if a column is const? - if (!is_nullable && arrow_column->null_count() && arrow_column->type()->id() != arrow::Type::LIST - && arrow_column->type()->id() != arrow::Type::MAP && arrow_column->type()->id() != arrow::Type::STRUCT) - { - throw Exception - { - fmt::format("Can not insert NULL data into non-nullable column \"{}\".", column_name), - ErrorCodes::CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN - }; - } - - switch (arrow_column->type()->id()) - { - case arrow::Type::STRING: - case arrow::Type::BINARY: - //case arrow::Type::FIXED_SIZE_BINARY: - fillColumnWithStringData(arrow_column, internal_column); - break; - case arrow::Type::BOOL: - fillColumnWithBooleanData(arrow_column, internal_column); - break; - case arrow::Type::DATE32: - fillColumnWithDate32Data(arrow_column, internal_column); - break; - case arrow::Type::DATE64: - fillColumnWithDate64Data(arrow_column, internal_column); - break; - case arrow::Type::TIMESTAMP: - fillColumnWithTimestampData(arrow_column, internal_column); - break; - case arrow::Type::DECIMAL128: - fillColumnWithDecimalData(arrow_column, internal_column /*, internal_nested_type*/); - break; - case arrow::Type::DECIMAL256: - fillColumnWithDecimalData(arrow_column, internal_column /*, internal_nested_type*/); - break; - case arrow::Type::MAP: [[fallthrough]]; - case arrow::Type::LIST: - { - arrow::ArrayVector array_vector; - array_vector.reserve(arrow_column->num_chunks()); - for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) - { - arrow::ListArray & list_chunk = static_cast(*(arrow_column->chunk(chunk_i))); - std::shared_ptr chunk = list_chunk.values(); - array_vector.emplace_back(std::move(chunk)); - } - auto arrow_nested_column = std::make_shared(array_vector); - - ColumnArray & column_array = arrow_column->type()->id() == arrow::Type::MAP - ? assert_cast(internal_column).getNestedColumn() - : assert_cast(internal_column); - - readColumnFromArrowColumn(arrow_nested_column, column_array.getData(), column_name, format_name, false, dictionary_values); - fillOffsetsFromArrowListColumn(arrow_column, column_array.getOffsetsColumn()); - break; - } - case arrow::Type::STRUCT: - { - ColumnTuple & column_tuple = assert_cast(internal_column); - int fields_count = column_tuple.tupleSize(); - std::vector nested_arrow_columns(fields_count); - for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) - { - arrow::StructArray & struct_chunk = static_cast(*(arrow_column->chunk(chunk_i))); - for (int i = 0; i < fields_count; ++i) - nested_arrow_columns[i].emplace_back(struct_chunk.field(i)); - } - - for (int i = 0; i != fields_count; ++i) - { - auto nested_arrow_column = std::make_shared(nested_arrow_columns[i]); - readColumnFromArrowColumn(nested_arrow_column, column_tuple.getColumn(i), column_name, format_name, false, dictionary_values); - } - break; - } - case arrow::Type::DICTIONARY: - { - ColumnLowCardinality & column_lc = assert_cast(internal_column); - auto & dict_values = dictionary_values[column_name]; - /// Load dictionary values only once and reuse it. - if (!dict_values) - { - arrow::ArrayVector dict_array; - for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) - { - arrow::DictionaryArray & dict_chunk = static_cast(*(arrow_column->chunk(chunk_i))); - dict_array.emplace_back(dict_chunk.dictionary()); - } - auto arrow_dict_column = std::make_shared(dict_array); - - auto dict_column = IColumn::mutate(column_lc.getDictionaryPtr()); - auto * uniq_column = static_cast(dict_column.get()); - auto values_column = uniq_column->getNestedColumn()->cloneEmpty(); - readColumnFromArrowColumn(arrow_dict_column, *values_column, column_name, format_name, false, dictionary_values); - uniq_column->uniqueInsertRangeFrom(*values_column, 0, values_column->size()); - dict_values = std::move(dict_column); - } - - arrow::ArrayVector indexes_array; - for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) - { - arrow::DictionaryArray & dict_chunk = static_cast(*(arrow_column->chunk(chunk_i))); - indexes_array.emplace_back(dict_chunk.indices()); - } - - auto arrow_indexes_column = std::make_shared(indexes_array); - auto indexes_column = createAndFillColumnWithIndexesData(arrow_indexes_column); - - auto new_column_lc = ColumnLowCardinality::create(dict_values, std::move(indexes_column)); - column_lc = std::move(*new_column_lc); - break; - } -# define DISPATCH(ARROW_NUMERIC_TYPE, CPP_NUMERIC_TYPE) \ - case ARROW_NUMERIC_TYPE: \ - fillColumnWithNumericData(arrow_column, internal_column); \ - break; - - FOR_ARROW_NUMERIC_TYPES(DISPATCH) -# undef DISPATCH - // TODO: support TIMESTAMP_MICROS and TIMESTAMP_MILLIS with truncated micro- and milliseconds? - // TODO: read JSON as a string? - // TODO: read UUID as a string? - default: - throw Exception - { - fmt::format(R"(Unsupported {} type "{}" of an input column "{}".)", format_name, arrow_column->type()->name(), column_name), - ErrorCodes::UNKNOWN_TYPE - }; - } - } - - static DataTypePtr getInternalType(std::shared_ptr arrow_type, const DataTypePtr & column_type, const std::string & column_name, const std::string & format_name) - { - if (column_type->isNullable()) - { - DataTypePtr nested_type = assert_cast(column_type.get())->getNestedType(); - return makeNullable(getInternalType(arrow_type, nested_type, column_name, format_name)); - } - - if (arrow_type->id() == arrow::Type::DECIMAL128) - { - const auto * decimal_type = static_cast(arrow_type.get()); - return std::make_shared>(decimal_type->precision(), decimal_type->scale()); - } - - if (arrow_type->id() == arrow::Type::DECIMAL256) - { - const auto * decimal_type = static_cast(arrow_type.get()); - return std::make_shared>(decimal_type->precision(), decimal_type->scale()); - } - - if (arrow_type->id() == arrow::Type::LIST) - { - const auto * list_type = static_cast(arrow_type.get()); - auto list_nested_type = list_type->value_type(); - - const DataTypeArray * array_type = typeid_cast(column_type.get()); - if (!array_type) - throw Exception{fmt::format("Cannot convert arrow LIST type to a not Array ClickHouse type {}.", column_type->getName()), ErrorCodes::CANNOT_CONVERT_TYPE}; - - return std::make_shared(getInternalType(list_nested_type, array_type->getNestedType(), column_name, format_name)); - } - - if (arrow_type->id() == arrow::Type::STRUCT) - { - const auto * struct_type = static_cast(arrow_type.get()); - const DataTypeTuple * tuple_type = typeid_cast(column_type.get()); - if (!tuple_type) - throw Exception{fmt::format("Cannot convert arrow STRUCT type to a not Tuple ClickHouse type {}.", column_type->getName()), ErrorCodes::CANNOT_CONVERT_TYPE}; - - const DataTypes & tuple_nested_types = tuple_type->getElements(); - int internal_fields_num = tuple_nested_types.size(); - /// If internal column has less elements then arrow struct, we will select only first internal_fields_num columns. - if (internal_fields_num > struct_type->num_fields()) - throw Exception - { - fmt::format( - "Cannot convert arrow STRUCT with {} fields to a ClickHouse Tuple with {} elements: {}.", - struct_type->num_fields(), - internal_fields_num, - column_type->getName()), - ErrorCodes::CANNOT_CONVERT_TYPE - }; - - DataTypes nested_types; - for (int i = 0; i < internal_fields_num; ++i) - nested_types.push_back(getInternalType(struct_type->field(i)->type(), tuple_nested_types[i], column_name, format_name)); - - return std::make_shared(std::move(nested_types)); - } - - if (arrow_type->id() == arrow::Type::DICTIONARY) - { - const auto * arrow_dict_type = static_cast(arrow_type.get()); - const auto * lc_type = typeid_cast(column_type.get()); - /// We allow to insert arrow dictionary into a non-LowCardinality column. - const auto & dict_type = lc_type ? lc_type->getDictionaryType() : column_type; - return std::make_shared(getInternalType(arrow_dict_type->value_type(), dict_type, column_name, format_name)); - } - - if (arrow_type->id() == arrow::Type::MAP) - { - const auto * arrow_map_type = typeid_cast(arrow_type.get()); - const auto * map_type = typeid_cast(column_type.get()); - if (!map_type) - throw Exception{fmt::format("Cannot convert arrow MAP type to a not Map ClickHouse type {}.", column_type->getName()), ErrorCodes::CANNOT_CONVERT_TYPE}; - - return std::make_shared( - getInternalType(arrow_map_type->key_type(), map_type->getKeyType(), column_name, format_name), - getInternalType(arrow_map_type->item_type(), map_type->getValueType(), column_name, format_name) - ); - } - - if (const auto * internal_type_it = std::find_if(arrow_type_to_internal_type.begin(), arrow_type_to_internal_type.end(), - [=](auto && elem) { return elem.first == arrow_type->id(); }); - internal_type_it != arrow_type_to_internal_type.end()) - { - return DataTypeFactory::instance().get(internal_type_it->second); - } - throw Exception - { - fmt::format(R"(The type "{}" of an input column "{}" is not supported for conversion from a {} data format.)", arrow_type->name(), column_name, format_name), - ErrorCodes::CANNOT_CONVERT_TYPE - }; - } - - ArrowColumnToCHColumn::ArrowColumnToCHColumn(const Block & header_, std::shared_ptr schema_, const std::string & format_name_) : header(header_), format_name(format_name_) - { - for (const auto & field : schema_->fields()) - { - if (header.has(field->name())) - { - const auto column_type = recursiveRemoveLowCardinality(header.getByName(field->name()).type); - name_to_internal_type[field->name()] = getInternalType(field->type(), column_type, field->name(), format_name); - } - } - } - - void ArrowColumnToCHColumn::arrowTableToCHChunk(Chunk & res, std::shared_ptr & table) - { - Columns columns_list; - UInt64 num_rows = 0; - - columns_list.reserve(header.rows()); - - using NameToColumnPtr = std::unordered_map>; - - NameToColumnPtr name_to_column_ptr; - for (const auto& column_name : table->ColumnNames()) - { - std::shared_ptr arrow_column = table->GetColumnByName(column_name); - name_to_column_ptr[column_name] = arrow_column; - } - - for (size_t column_i = 0, columns = header.columns(); column_i < columns; ++column_i) - { - const ColumnWithTypeAndName & header_column = header.getByPosition(column_i); - - if (name_to_column_ptr.find(header_column.name) == name_to_column_ptr.end()) - // TODO: What if some columns were not presented? Insert NULLs? What if a column is not nullable? - throw Exception{fmt::format("Column \"{}\" is not presented in input data.", header_column.name), - ErrorCodes::THERE_IS_NO_COLUMN}; - - std::shared_ptr arrow_column = name_to_column_ptr[header_column.name]; - - DataTypePtr & internal_type = name_to_internal_type[header_column.name]; - MutableColumnPtr read_column = internal_type->createColumn(); - readColumnFromArrowColumn(arrow_column, *read_column, header_column.name, format_name, false, dictionary_values); - - ColumnWithTypeAndName column; - column.name = header_column.name; - column.type = internal_type; - column.column = std::move(read_column); - - column.column = castColumn(column, header_column.type); - column.type = header_column.type; - num_rows = column.column->size(); - columns_list.push_back(std::move(column.column)); - } - - res.setColumns(columns_list, num_rows); + default: + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Unsupported type for indexes in LowCardinality: {}.", arrow_column->type()->name()); } } + +static std::shared_ptr getNestedArrowColumn(std::shared_ptr & arrow_column) +{ + arrow::ArrayVector array_vector; + array_vector.reserve(arrow_column->num_chunks()); + for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) + { + arrow::ListArray & list_chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + std::shared_ptr chunk = list_chunk.values(); + array_vector.emplace_back(std::move(chunk)); + } + return std::make_shared(array_vector); +} + +static ColumnWithTypeAndName readColumnFromArrowColumn( + std::shared_ptr & arrow_column, + const std::string & column_name, + const std::string & format_name, + bool is_nullable, + std::unordered_map> & dictionary_values) +{ + if (!is_nullable && arrow_column->null_count() && arrow_column->type()->id() != arrow::Type::LIST + && arrow_column->type()->id() != arrow::Type::MAP && arrow_column->type()->id() != arrow::Type::STRUCT) + { + auto nested_column = readColumnFromArrowColumn(arrow_column, column_name, format_name, true, dictionary_values); + auto nullmap_column = readByteMapFromArrowColumn(arrow_column); + auto nullable_type = std::make_shared(std::move(nested_column.type)); + auto nullable_column = ColumnNullable::create(std::move(nested_column.column), std::move(nullmap_column)); + return {std::move(nullable_column), std::move(nullable_type), column_name}; + } + + switch (arrow_column->type()->id()) + { + case arrow::Type::STRING: + case arrow::Type::BINARY: + //case arrow::Type::FIXED_SIZE_BINARY: + return readColumnWithStringData(arrow_column, column_name); + case arrow::Type::BOOL: + return readColumnWithBooleanData(arrow_column, column_name); + case arrow::Type::DATE32: + return readColumnWithDate32Data(arrow_column, column_name); + case arrow::Type::DATE64: + return readColumnWithDate64Data(arrow_column, column_name); + // ClickHouse writes Date as arrow UINT16 and DateTime as arrow UINT32, + // so, read UINT16 as Date and UINT32 as DateTime to perform correct conversion + // between Date and DateTime further. + case arrow::Type::UINT16: + { + auto column = readColumnWithNumericData(arrow_column, column_name); + column.type = std::make_shared(); + return column; + } + case arrow::Type::UINT32: + { + auto column = readColumnWithNumericData(arrow_column, column_name); + column.type = std::make_shared(); + return column; + } + case arrow::Type::TIMESTAMP: + return readColumnWithTimestampData(arrow_column, column_name); +#if defined(ARCADIA_BUILD) + case arrow::Type::DECIMAL: + return readColumnWithDecimalData(arrow_column, column_name); +#else + case arrow::Type::DECIMAL128: + return readColumnWithDecimalData(arrow_column, column_name); + case arrow::Type::DECIMAL256: + return readColumnWithDecimalData(arrow_column, column_name); #endif + case arrow::Type::MAP: + { + auto arrow_nested_column = getNestedArrowColumn(arrow_column); + auto nested_column = readColumnFromArrowColumn(arrow_nested_column, column_name, format_name, false, dictionary_values); + auto offsets_column = readOffsetsFromArrowListColumn(arrow_column); + + const auto * tuple_column = assert_cast(nested_column.column.get()); + const auto * tuple_type = assert_cast(nested_column.type.get()); + auto map_column = ColumnMap::create(std::move(tuple_column->getColumnPtr(0)), std::move(tuple_column->getColumnPtr(1)), std::move(offsets_column)); + auto map_type = std::make_shared(tuple_type->getElements()[0], tuple_type->getElements()[1]); + return {std::move(map_column), std::move(map_type), column_name}; + } + case arrow::Type::LIST: + { + auto arrow_nested_column = getNestedArrowColumn(arrow_column); + auto nested_column = readColumnFromArrowColumn(arrow_nested_column, column_name, format_name, false, dictionary_values); + auto offsets_column = readOffsetsFromArrowListColumn(arrow_column); + auto array_column = ColumnArray::create(std::move(nested_column.column), std::move(offsets_column)); + auto array_type = std::make_shared(nested_column.type); + return {std::move(array_column), std::move(array_type), column_name}; + } + case arrow::Type::STRUCT: + { + auto arrow_type = arrow_column->type(); + auto * arrow_struct_type = assert_cast(arrow_type.get()); + std::vector nested_arrow_columns(arrow_struct_type->num_fields()); + for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) + { + arrow::StructArray & struct_chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + for (int i = 0; i < arrow_struct_type->num_fields(); ++i) + nested_arrow_columns[i].emplace_back(struct_chunk.field(i)); + } + + Columns tuple_elements; + DataTypes tuple_types; + std::vector tuple_names; + + for (int i = 0; i != arrow_struct_type->num_fields(); ++i) + { + auto nested_arrow_column = std::make_shared(nested_arrow_columns[i]); + auto element = readColumnFromArrowColumn(nested_arrow_column, arrow_struct_type->field(i)->name(), format_name, false, dictionary_values); + tuple_elements.emplace_back(std::move(element.column)); + tuple_types.emplace_back(std::move(element.type)); + tuple_names.emplace_back(std::move(element.name)); + } + + auto tuple_column = ColumnTuple::create(std::move(tuple_elements)); + auto tuple_type = std::make_shared(std::move(tuple_types), std::move(tuple_names)); + return {std::move(tuple_column), std::move(tuple_type), column_name}; + } + case arrow::Type::DICTIONARY: + { + auto & dict_values = dictionary_values[column_name]; + /// Load dictionary values only once and reuse it. + if (!dict_values) + { + arrow::ArrayVector dict_array; + for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) + { + arrow::DictionaryArray & dict_chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + dict_array.emplace_back(dict_chunk.dictionary()); + } + auto arrow_dict_column = std::make_shared(dict_array); + auto dict_column = readColumnFromArrowColumn(arrow_dict_column, column_name, format_name, false, dictionary_values); + + /// We should convert read column to ColumnUnique. + auto tmp_lc_column = DataTypeLowCardinality(dict_column.type).createColumn(); + auto tmp_dict_column = IColumn::mutate(assert_cast(tmp_lc_column.get())->getDictionaryPtr()); + static_cast(tmp_dict_column.get())->uniqueInsertRangeFrom(*dict_column.column, 0, dict_column.column->size()); + dict_column.column = std::move(tmp_dict_column); + dict_values = std::make_shared(std::move(dict_column)); + } + + arrow::ArrayVector indexes_array; + for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i) + { + arrow::DictionaryArray & dict_chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + indexes_array.emplace_back(dict_chunk.indices()); + } + + auto arrow_indexes_column = std::make_shared(indexes_array); + auto indexes_column = readColumnWithIndexesData(arrow_indexes_column); + auto lc_column = ColumnLowCardinality::create(dict_values->column, std::move(indexes_column)); + auto lc_type = std::make_shared(dict_values->type); + return {std::move(lc_column), std::move(lc_type), column_name}; + } +# define DISPATCH(ARROW_NUMERIC_TYPE, CPP_NUMERIC_TYPE) \ + case ARROW_NUMERIC_TYPE: \ + return readColumnWithNumericData(arrow_column, column_name); + FOR_ARROW_NUMERIC_TYPES(DISPATCH) +# undef DISPATCH + // TODO: support TIMESTAMP_MICROS and TIMESTAMP_MILLIS with truncated micro- and milliseconds? + // TODO: read JSON as a string? + // TODO: read UUID as a string? + default: + throw Exception(ErrorCodes::UNKNOWN_TYPE, + "Unsupported {} type '{}' of an input column '{}'.", format_name, arrow_column->type()->name(), column_name); + } +} + + +// Creating CH header by arrow schema. Will be useful in task about inserting +// data from file without knowing table structure. + +static void checkStatus(const arrow::Status & status, const String & column_name, const String & format_name) +{ + if (!status.ok()) + throw Exception{ErrorCodes::UNKNOWN_EXCEPTION, "Error with a {} column '{}': {}.", format_name, column_name, status.ToString()}; +} + +static Block arrowSchemaToCHHeader(const arrow::Schema & schema, const std::string & format_name) +{ + ColumnsWithTypeAndName sample_columns; + for (const auto & field : schema.fields()) + { + /// Create empty arrow column by it's type and convert it to ClickHouse column. + arrow::MemoryPool* pool = arrow::default_memory_pool(); + std::unique_ptr array_builder; + arrow::Status status = MakeBuilder(pool, field->type(), &array_builder); + checkStatus(status, field->name(), format_name); + std::shared_ptr arrow_array; + status = array_builder->Finish(&arrow_array); + checkStatus(status, field->name(), format_name); + arrow::ArrayVector array_vector = {arrow_array}; + auto arrow_column = std::make_shared(array_vector); + std::unordered_map> dict_values; + ColumnWithTypeAndName sample_column = readColumnFromArrowColumn(arrow_column, field->name(), format_name, false, dict_values); + sample_columns.emplace_back(std::move(sample_column)); + } + return Block(std::move(sample_columns)); +} + +ArrowColumnToCHColumn::ArrowColumnToCHColumn( + const arrow::Schema & schema, const std::string & format_name_, bool import_nested_) + : header(arrowSchemaToCHHeader(schema, format_name_)), format_name(format_name_), import_nested(import_nested_) +{ +} + +ArrowColumnToCHColumn::ArrowColumnToCHColumn( + const Block & header_, const std::string & format_name_, bool import_nested_) + : header(header_), format_name(format_name_), import_nested(import_nested_) +{ +} + +void ArrowColumnToCHColumn::arrowTableToCHChunk(Chunk & res, std::shared_ptr & table) +{ + Columns columns_list; + UInt64 num_rows = 0; + + columns_list.reserve(header.rows()); + + using NameToColumnPtr = std::unordered_map>; + + NameToColumnPtr name_to_column_ptr; + for (const auto& column_name : table->ColumnNames()) + { + std::shared_ptr arrow_column = table->GetColumnByName(column_name); + name_to_column_ptr[column_name] = arrow_column; + } + + std::unordered_map nested_tables; + for (size_t column_i = 0, columns = header.columns(); column_i < columns; ++column_i) + { + const ColumnWithTypeAndName & header_column = header.getByPosition(column_i); + + bool read_from_nested = false; + String nested_table_name = Nested::extractTableName(header_column.name); + if (!name_to_column_ptr.contains(header_column.name)) + { + /// Check if it's a column from nested table. + if (import_nested && name_to_column_ptr.contains(nested_table_name)) + { + if (!nested_tables.contains(nested_table_name)) + { + std::shared_ptr arrow_column = name_to_column_ptr[nested_table_name]; + ColumnsWithTypeAndName cols = {readColumnFromArrowColumn(arrow_column, nested_table_name, format_name, false, dictionary_values)}; + Block block(cols); + nested_tables[nested_table_name] = std::make_shared(Nested::flatten(block)); + } + + read_from_nested = nested_tables[nested_table_name]->has(header_column.name); + } + + + // TODO: What if some columns were not presented? Insert NULLs? What if a column is not nullable? + if (!read_from_nested) + throw Exception{ErrorCodes::THERE_IS_NO_COLUMN, "Column '{}' is not presented in input data.", header_column.name}; + } + + std::shared_ptr arrow_column = name_to_column_ptr[header_column.name]; + + ColumnWithTypeAndName column; + if (read_from_nested) + column = nested_tables[nested_table_name]->getByName(header_column.name); + else + column = readColumnFromArrowColumn(arrow_column, header_column.name, format_name, false, dictionary_values); + + column.column = castColumn(column, header_column.type); + column.type = header_column.type; + num_rows = column.column->size(); + columns_list.push_back(std::move(column.column)); + } + + res.setColumns(columns_list, num_rows); +} + +} +#endif + diff --git a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.h b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.h index 7da54a8a02d..abce6759250 100644 --- a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.h +++ b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.h @@ -1,63 +1,45 @@ #pragma once -#include "config_formats.h" + +#if !defined(ARCADIA_BUILD) +# include "config_formats.h" +#endif #if USE_ARROW || USE_ORC || USE_PARQUET #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #include +#include + namespace DB { +class Block; +class Chunk; + class ArrowColumnToCHColumn { public: - ArrowColumnToCHColumn(const Block & header_, std::shared_ptr schema_, const std::string & format_name_); + ArrowColumnToCHColumn(const Block & header_, const std::string & format_name_, bool import_nested_); + + /// Constructor that create header by arrow schema. It will be useful for inserting + /// data from file without knowing table structure. + ArrowColumnToCHColumn(const arrow::Schema & schema, const std::string & format_name, bool import_nested_); void arrowTableToCHChunk(Chunk & res, std::shared_ptr & table); private: -#define FOR_ARROW_NUMERIC_TYPES(M) \ - M(arrow::Type::UINT8, DB::UInt8) \ - M(arrow::Type::INT8, DB::Int8) \ - M(arrow::Type::UINT16, DB::UInt16) \ - M(arrow::Type::INT16, DB::Int16) \ - M(arrow::Type::UINT32, DB::UInt32) \ - M(arrow::Type::INT32, DB::Int32) \ - M(arrow::Type::UINT64, DB::UInt64) \ - M(arrow::Type::INT64, DB::Int64) \ - M(arrow::Type::HALF_FLOAT, DB::Float32) \ - M(arrow::Type::FLOAT, DB::Float32) \ - M(arrow::Type::DOUBLE, DB::Float64) - -#define FOR_ARROW_INDEXES_TYPES(M) \ - M(arrow::Type::UINT8, DB::UInt8) \ - M(arrow::Type::INT8, DB::UInt8) \ - M(arrow::Type::UINT16, DB::UInt16) \ - M(arrow::Type::INT16, DB::UInt16) \ - M(arrow::Type::UINT32, DB::UInt32) \ - M(arrow::Type::INT32, DB::UInt32) \ - M(arrow::Type::UINT64, DB::UInt64) \ - M(arrow::Type::INT64, DB::UInt64) - - - const Block & header; - std::unordered_map name_to_internal_type; + const Block header; const std::string format_name; + bool import_nested; + /// Map {column name : dictionary column}. /// To avoid converting dictionary from Arrow Dictionary /// to LowCardinality every chunk we save it and reuse. - std::unordered_map dictionary_values; + std::unordered_map> dictionary_values; }; + } + #endif diff --git a/src/Processors/Formats/Impl/AvroRowOutputFormat.cpp b/src/Processors/Formats/Impl/AvroRowOutputFormat.cpp index 81922bdde80..24b231e9ea8 100644 --- a/src/Processors/Formats/Impl/AvroRowOutputFormat.cpp +++ b/src/Processors/Formats/Impl/AvroRowOutputFormat.cpp @@ -41,6 +41,7 @@ #include #include +#include namespace DB { @@ -48,8 +49,32 @@ namespace ErrorCodes { extern const int ILLEGAL_COLUMN; extern const int BAD_ARGUMENTS; + extern const int CANNOT_COMPILE_REGEXP; } +class AvroSerializerTraits +{ +public: + explicit AvroSerializerTraits(const FormatSettings & settings_) + : string_to_string_regexp(settings_.avro.string_column_pattern) + { + if (!string_to_string_regexp.ok()) + throw DB::Exception( + "Avro: cannot compile re2: " + settings_.avro.string_column_pattern + ", error: " + string_to_string_regexp.error() + + ". Look at https://github.com/google/re2/wiki/Syntax for reference.", + DB::ErrorCodes::CANNOT_COMPILE_REGEXP); + } + + bool isStringAsString(const String & column_name) + { + return RE2::PartialMatch(column_name, string_to_string_regexp); + } + +private: + const RE2 string_to_string_regexp; +}; + + class OutputStreamWriteBufferAdapter : public avro::OutputStream { public: @@ -75,7 +100,7 @@ private: }; -AvroSerializer::SchemaWithSerializeFn AvroSerializer::createSchemaWithSerializeFn(DataTypePtr data_type, size_t & type_name_increment) +AvroSerializer::SchemaWithSerializeFn AvroSerializer::createSchemaWithSerializeFn(DataTypePtr data_type, size_t & type_name_increment, const String & column_name) { ++type_name_increment; @@ -161,11 +186,20 @@ AvroSerializer::SchemaWithSerializeFn AvroSerializer::createSchemaWithSerializeF }}; } case TypeIndex::String: - return {avro::BytesSchema(), [](const IColumn & column, size_t row_num, avro::Encoder & encoder) - { - const StringRef & s = assert_cast(column).getDataAt(row_num); - encoder.encodeBytes(reinterpret_cast(s.data), s.size); - }}; + if (traits->isStringAsString(column_name)) + return {avro::StringSchema(), [](const IColumn & column, size_t row_num, avro::Encoder & encoder) + { + const StringRef & s = assert_cast(column).getDataAt(row_num); + encoder.encodeString(s.toString()); + } + }; + else + return {avro::BytesSchema(), [](const IColumn & column, size_t row_num, avro::Encoder & encoder) + { + const StringRef & s = assert_cast(column).getDataAt(row_num); + encoder.encodeBytes(reinterpret_cast(s.data), s.size); + } + }; case TypeIndex::FixedString: { auto size = data_type->getSizeOfValueInMemory(); @@ -223,7 +257,7 @@ AvroSerializer::SchemaWithSerializeFn AvroSerializer::createSchemaWithSerializeF case TypeIndex::Array: { const auto & array_type = assert_cast(*data_type); - auto nested_mapping = createSchemaWithSerializeFn(array_type.getNestedType(), type_name_increment); + auto nested_mapping = createSchemaWithSerializeFn(array_type.getNestedType(), type_name_increment, column_name); auto schema = avro::ArraySchema(nested_mapping.schema); return {schema, [nested_mapping](const IColumn & column, size_t row_num, avro::Encoder & encoder) { @@ -249,7 +283,7 @@ AvroSerializer::SchemaWithSerializeFn AvroSerializer::createSchemaWithSerializeF case TypeIndex::Nullable: { auto nested_type = removeNullable(data_type); - auto nested_mapping = createSchemaWithSerializeFn(nested_type, type_name_increment); + auto nested_mapping = createSchemaWithSerializeFn(nested_type, type_name_increment, column_name); if (nested_type->getTypeId() == TypeIndex::Nothing) { return nested_mapping; @@ -278,7 +312,7 @@ AvroSerializer::SchemaWithSerializeFn AvroSerializer::createSchemaWithSerializeF case TypeIndex::LowCardinality: { const auto & nested_type = removeLowCardinality(data_type); - auto nested_mapping = createSchemaWithSerializeFn(nested_type, type_name_increment); + auto nested_mapping = createSchemaWithSerializeFn(nested_type, type_name_increment, column_name); return {nested_mapping.schema, [nested_mapping](const IColumn & column, size_t row_num, avro::Encoder & encoder) { const auto & col = assert_cast(column); @@ -294,7 +328,8 @@ AvroSerializer::SchemaWithSerializeFn AvroSerializer::createSchemaWithSerializeF } -AvroSerializer::AvroSerializer(const ColumnsWithTypeAndName & columns) +AvroSerializer::AvroSerializer(const ColumnsWithTypeAndName & columns, std::unique_ptr traits_) + : traits(std::move(traits_)) { avro::RecordSchema record_schema("row"); @@ -303,7 +338,7 @@ AvroSerializer::AvroSerializer(const ColumnsWithTypeAndName & columns) { try { - auto field_mapping = createSchemaWithSerializeFn(column.type, type_name_increment); + auto field_mapping = createSchemaWithSerializeFn(column.type, type_name_increment, column.name); serialize_fns.push_back(field_mapping.serialize); //TODO: verify name starts with A-Za-z_ record_schema.addField(column.name, field_mapping.schema); @@ -314,7 +349,7 @@ AvroSerializer::AvroSerializer(const ColumnsWithTypeAndName & columns) throw; } } - schema.setSchema(record_schema); + valid_schema.setSchema(record_schema); } void AvroSerializer::serializeRow(const Columns & columns, size_t row_num, avro::Encoder & encoder) @@ -350,7 +385,7 @@ AvroRowOutputFormat::AvroRowOutputFormat( WriteBuffer & out_, const Block & header_, const RowOutputFormatParams & params_, const FormatSettings & settings_) : IRowOutputFormat(header_, out_, params_) , settings(settings_) - , serializer(header_.getColumnsWithTypeAndName()) + , serializer(header_.getColumnsWithTypeAndName(), std::make_unique(settings)) , file_writer( std::make_unique(out_), serializer.getSchema(), diff --git a/src/Processors/Formats/Impl/AvroRowOutputFormat.h b/src/Processors/Formats/Impl/AvroRowOutputFormat.h index 8d0581d3307..c807736071e 100644 --- a/src/Processors/Formats/Impl/AvroRowOutputFormat.h +++ b/src/Processors/Formats/Impl/AvroRowOutputFormat.h @@ -18,11 +18,13 @@ namespace DB { class WriteBuffer; +class AvroSerializerTraits; + class AvroSerializer { public: - AvroSerializer(const ColumnsWithTypeAndName & columns); - const avro::ValidSchema & getSchema() const { return schema; } + AvroSerializer(const ColumnsWithTypeAndName & columns, std::unique_ptr); + const avro::ValidSchema & getSchema() const { return valid_schema; } void serializeRow(const Columns & columns, size_t row_num, avro::Encoder & encoder); private: @@ -34,10 +36,11 @@ private: }; /// Type names for different complex types (e.g. enums, fixed strings) must be unique. We use simple incremental number to give them different names. - static SchemaWithSerializeFn createSchemaWithSerializeFn(DataTypePtr data_type, size_t & type_name_increment); + SchemaWithSerializeFn createSchemaWithSerializeFn(DataTypePtr data_type, size_t & type_name_increment, const String & column_name); std::vector serialize_fns; - avro::ValidSchema schema; + avro::ValidSchema valid_schema; + std::unique_ptr traits; }; class AvroRowOutputFormat : public IRowOutputFormat diff --git a/src/Processors/Formats/Impl/CHColumnToArrowColumn.cpp b/src/Processors/Formats/Impl/CHColumnToArrowColumn.cpp index 230b28c657e..8734f9c7279 100644 --- a/src/Processors/Formats/Impl/CHColumnToArrowColumn.cpp +++ b/src/Processors/Formats/Impl/CHColumnToArrowColumn.cpp @@ -23,6 +23,30 @@ #include #include +#define FOR_INTERNAL_NUMERIC_TYPES(M) \ + M(UInt8, arrow::UInt8Builder) \ + M(Int8, arrow::Int8Builder) \ + M(UInt16, arrow::UInt16Builder) \ + M(Int16, arrow::Int16Builder) \ + M(UInt32, arrow::UInt32Builder) \ + M(Int32, arrow::Int32Builder) \ + M(UInt64, arrow::UInt64Builder) \ + M(Int64, arrow::Int64Builder) \ + M(Float32, arrow::FloatBuilder) \ + M(Float64, arrow::DoubleBuilder) + +#define FOR_ARROW_TYPES(M) \ + M(UINT8, arrow::UInt8Type) \ + M(INT8, arrow::Int8Type) \ + M(UINT16, arrow::UInt16Type) \ + M(INT16, arrow::Int16Type) \ + M(UINT32, arrow::UInt32Type) \ + M(INT32, arrow::Int32Type) \ + M(UINT64, arrow::UInt64Type) \ + M(INT64, arrow::Int64Type) \ + M(FLOAT, arrow::FloatType) \ + M(DOUBLE, arrow::DoubleType) \ + M(BINARY, arrow::BinaryType) namespace DB { @@ -46,11 +70,9 @@ namespace DB {"Float32", arrow::float32()}, {"Float64", arrow::float64()}, - //{"Date", arrow::date64()}, - //{"Date", arrow::date32()}, - {"Date", arrow::uint16()}, // CHECK - //{"DateTime", arrow::date64()}, // BUG! saves as date32 - {"DateTime", arrow::uint32()}, + {"Date", arrow::uint16()}, /// uint16 is used instead of date32, because Apache Arrow cannot correctly serialize Date32Array. + {"DateTime", arrow::uint32()}, /// uint32 is used instead of date64, because we don't need milliseconds. + {"Date32", arrow::date32()}, {"String", arrow::binary()}, {"FixedString", arrow::binary()}, @@ -265,15 +287,16 @@ namespace DB auto value_type = assert_cast(array_builder->type().get())->value_type(); #define DISPATCH(ARROW_TYPE_ID, ARROW_TYPE) \ - if (arrow::Type::ARROW_TYPE_ID == value_type->id()) \ - { \ - fillArrowArrayWithLowCardinalityColumnDataImpl(column_name, column, column_type, null_bytemap, array_builder, format_name, start, end, dictionary_values); \ - return; \ - } + if (arrow::Type::ARROW_TYPE_ID == value_type->id()) \ + { \ + fillArrowArrayWithLowCardinalityColumnDataImpl(column_name, column, column_type, null_bytemap, array_builder, format_name, start, end, dictionary_values); \ + return; \ + } FOR_ARROW_TYPES(DISPATCH) #undef DISPATCH + throw Exception(ErrorCodes::LOGICAL_ERROR, "Cannot fill arrow array with {} data.", column_type->getName()); } template @@ -313,7 +336,6 @@ namespace DB size_t end) { const PaddedPODArray & internal_data = assert_cast &>(*write_column).getData(); - //arrow::Date32Builder date_builder; arrow::UInt16Builder & builder = assert_cast(*array_builder); arrow::Status status; @@ -322,7 +344,6 @@ namespace DB if (null_bytemap && (*null_bytemap)[value_i]) status = builder.AppendNull(); else - /// Implicitly converts UInt16 to Int32 status = builder.Append(internal_data[value_i]); checkStatus(status, write_column->getName(), format_name); } @@ -337,7 +358,6 @@ namespace DB size_t end) { const auto & internal_data = assert_cast &>(*write_column).getData(); - //arrow::Date64Builder builder; arrow::UInt32Builder & builder = assert_cast(*array_builder); arrow::Status status; @@ -346,14 +366,34 @@ namespace DB if (null_bytemap && (*null_bytemap)[value_i]) status = builder.AppendNull(); else - /// Implicitly converts UInt16 to Int32 - //status = date_builder.Append(static_cast(internal_data[value_i]) * 1000); // now ms. TODO check other units status = builder.Append(internal_data[value_i]); checkStatus(status, write_column->getName(), format_name); } } + static void fillArrowArrayWithDate32ColumnData( + ColumnPtr write_column, + const PaddedPODArray * null_bytemap, + const String & format_name, + arrow::ArrayBuilder* array_builder, + size_t start, + size_t end) + { + const PaddedPODArray & internal_data = assert_cast &>(*write_column).getData(); + arrow::Date32Builder & builder = assert_cast(*array_builder); + arrow::Status status; + + for (size_t value_i = start; value_i < end; ++value_i) + { + if (null_bytemap && (*null_bytemap)[value_i]) + status = builder.AppendNull(); + else + status = builder.Append(internal_data[value_i]); + checkStatus(status, write_column->getName(), format_name); + } + } + static void fillArrowArray( const String & column_name, ColumnPtr & column, @@ -367,7 +407,7 @@ namespace DB { const String column_type_name = column_type->getFamilyName(); - if ("Nullable" == column_type_name) + if (column_type->isNullable()) { const ColumnNullable * column_nullable = assert_cast(column.get()); ColumnPtr nested_column = column_nullable->getNestedColumnPtr(); @@ -376,35 +416,39 @@ namespace DB const PaddedPODArray & bytemap = assert_cast &>(*null_column).getData(); fillArrowArray(column_name, nested_column, nested_type, &bytemap, array_builder, format_name, start, end, dictionary_values); } - else if ("String" == column_type_name) + else if (isString(column_type)) { fillArrowArrayWithStringColumnData(column, null_bytemap, format_name, array_builder, start, end); } - else if ("FixedString" == column_type_name) + else if (isFixedString(column_type)) { fillArrowArrayWithStringColumnData(column, null_bytemap, format_name, array_builder, start, end); } - else if ("Date" == column_type_name) + else if (isDate(column_type)) { fillArrowArrayWithDateColumnData(column, null_bytemap, format_name, array_builder, start, end); } - else if ("DateTime" == column_type_name) + else if (isDateTime(column_type)) { fillArrowArrayWithDateTimeColumnData(column, null_bytemap, format_name, array_builder, start, end); } - else if ("Array" == column_type_name) + else if (isDate32(column_type)) + { + fillArrowArrayWithDate32ColumnData(column, null_bytemap, format_name, array_builder, start, end); + } + else if (isArray(column_type)) { fillArrowArrayWithArrayColumnData(column_name, column, column_type, null_bytemap, array_builder, format_name, start, end, dictionary_values); } - else if ("Tuple" == column_type_name) + else if (isTuple(column_type)) { fillArrowArrayWithTupleColumnData(column_name, column, column_type, null_bytemap, array_builder, format_name, start, end, dictionary_values); } - else if ("LowCardinality" == column_type_name) + else if (column_type->getTypeId() == TypeIndex::LowCardinality) { fillArrowArrayWithLowCardinalityColumnData(column_name, column, column_type, null_bytemap, array_builder, format_name, start, end, dictionary_values); } - else if ("Map" == column_type_name) + else if (isMap(column_type)) { ColumnPtr column_array = assert_cast(column.get())->getNestedColumnPtr(); DataTypePtr array_type = assert_cast(column_type.get())->getNestedType(); @@ -424,11 +468,13 @@ namespace DB fillArrowArrayWithDecimalColumnData(column, null_bytemap, array_builder, format_name, start, end); return true; } +#if !defined(ARCADIA_BUILD) if constexpr (std::is_same_v>) { fillArrowArrayWithDecimalColumnData(column, null_bytemap, array_builder, format_name, start, end); return true; } +#endif return false; }; @@ -437,10 +483,10 @@ namespace DB throw Exception{ErrorCodes::LOGICAL_ERROR, "Cannot fill arrow array with decimal data with type {}", column_type_name}; } #define DISPATCH(CPP_NUMERIC_TYPE, ARROW_BUILDER_TYPE) \ - else if (#CPP_NUMERIC_TYPE == column_type_name) \ - { \ - fillArrowArrayWithNumericColumnData(column, null_bytemap, format_name, array_builder, start, end); \ - } + else if (#CPP_NUMERIC_TYPE == column_type_name) \ + { \ + fillArrowArrayWithNumericColumnData(column, null_bytemap, format_name, array_builder, start, end); \ + } FOR_INTERNAL_NUMERIC_TYPES(DISPATCH) #undef DISPATCH @@ -448,7 +494,7 @@ namespace DB { throw Exception { - fmt::format(R"(Internal type "{}" of a column "{}" is not supported for conversion into a {} data format.)", column_type_name, column_name, format_name), + fmt::format("Internal type '{}' of a column '{}' is not supported for conversion into {} data format.", column_type_name, column_name, format_name), ErrorCodes::UNKNOWN_TYPE }; } @@ -502,14 +548,15 @@ namespace DB } } - static std::shared_ptr getArrowType(DataTypePtr column_type, ColumnPtr column, const std::string & column_name, const std::string & format_name, bool * is_column_nullable) + static std::shared_ptr getArrowType( + DataTypePtr column_type, ColumnPtr column, const std::string & column_name, const std::string & format_name, bool * out_is_column_nullable) { if (column_type->isNullable()) { DataTypePtr nested_type = assert_cast(column_type.get())->getNestedType(); ColumnPtr nested_column = assert_cast(column.get())->getNestedColumnPtr(); - auto arrow_type = getArrowType(nested_type, nested_column, column_name, format_name, is_column_nullable); - *is_column_nullable = true; + auto arrow_type = getArrowType(nested_type, nested_column, column_name, format_name, out_is_column_nullable); + *out_is_column_nullable = true; return arrow_type; } @@ -542,7 +589,7 @@ namespace DB { auto nested_type = assert_cast(column_type.get())->getNestedType(); auto nested_column = assert_cast(column.get())->getDataPtr(); - auto nested_arrow_type = getArrowType(nested_type, nested_column, column_name, format_name, is_column_nullable); + auto nested_arrow_type = getArrowType(nested_type, nested_column, column_name, format_name, out_is_column_nullable); return arrow::list(nested_arrow_type); } @@ -554,8 +601,8 @@ namespace DB for (size_t i = 0; i != nested_types.size(); ++i) { String name = column_name + "." + std::to_string(i); - auto nested_arrow_type = getArrowType(nested_types[i], tuple_column->getColumnPtr(i), name, format_name, is_column_nullable); - nested_fields.push_back(std::make_shared(name, nested_arrow_type, *is_column_nullable)); + auto nested_arrow_type = getArrowType(nested_types[i], tuple_column->getColumnPtr(i), name, format_name, out_is_column_nullable); + nested_fields.push_back(std::make_shared(name, nested_arrow_type, *out_is_column_nullable)); } return arrow::struct_(std::move(nested_fields)); } @@ -568,7 +615,7 @@ namespace DB const auto & indexes_column = lc_column->getIndexesPtr(); return arrow::dictionary( getArrowTypeForLowCardinalityIndexes(indexes_column), - getArrowType(nested_type, nested_column, column_name, format_name, is_column_nullable)); + getArrowType(nested_type, nested_column, column_name, format_name, out_is_column_nullable)); } if (isMap(column_type)) @@ -579,9 +626,8 @@ namespace DB const auto & columns = assert_cast(column.get())->getNestedData().getColumns(); return arrow::map( - getArrowType(key_type, columns[0], column_name, format_name, is_column_nullable), - getArrowType(val_type, columns[1], column_name, format_name, is_column_nullable) - ); + getArrowType(key_type, columns[0], column_name, format_name, out_is_column_nullable), + getArrowType(val_type, columns[1], column_name, format_name, out_is_column_nullable)); } const std::string type_name = column_type->getFamilyName(); @@ -594,8 +640,9 @@ namespace DB return arrow_type_it->second; } - throw Exception{fmt::format(R"(The type "{}" of a column "{}" is not supported for conversion into a {} data format.)", column_type->getName(), column_name, format_name), - ErrorCodes::UNKNOWN_TYPE}; + throw Exception(ErrorCodes::UNKNOWN_TYPE, + "The type '{}' of a column '{}' is not supported for conversion into {} data format.", + column_type->getName(), column_name, format_name); } CHColumnToArrowColumn::CHColumnToArrowColumn(const Block & header, const std::string & format_name_, bool low_cardinality_as_dictionary_) @@ -638,7 +685,8 @@ namespace DB arrow::Status status = MakeBuilder(pool, arrow_fields[column_i]->type(), &array_builder); checkStatus(status, column->getName(), format_name); - fillArrowArray(header_column.name, column, header_column.type, nullptr, array_builder.get(), format_name, 0, column->size(), dictionary_values); + fillArrowArray( + header_column.name, column, header_column.type, nullptr, array_builder.get(), format_name, 0, column->size(), dictionary_values); std::shared_ptr arrow_array; status = array_builder->Finish(&arrow_array); diff --git a/src/Processors/Formats/Impl/CHColumnToArrowColumn.h b/src/Processors/Formats/Impl/CHColumnToArrowColumn.h index efe02a0d7d9..c0885d3778c 100644 --- a/src/Processors/Formats/Impl/CHColumnToArrowColumn.h +++ b/src/Processors/Formats/Impl/CHColumnToArrowColumn.h @@ -1,5 +1,8 @@ #pragma once -#include "config_formats.h" +#if !defined(ARCADIA_BUILD) +# include "config_formats.h" +#endif + #if USE_ARROW || USE_PARQUET @@ -7,42 +10,18 @@ #include #include + namespace DB { class CHColumnToArrowColumn { public: - CHColumnToArrowColumn(const Block & header, const std::string & format_name_, bool low_cardinality_as_dictionary_ = false); + CHColumnToArrowColumn(const Block & header, const std::string & format_name_, bool low_cardinality_as_dictionary_); void chChunkToArrowTable(std::shared_ptr & res, const Chunk & chunk, size_t columns_num); + private: - -#define FOR_INTERNAL_NUMERIC_TYPES(M) \ - M(UInt8, arrow::UInt8Builder) \ - M(Int8, arrow::Int8Builder) \ - M(UInt16, arrow::UInt16Builder) \ - M(Int16, arrow::Int16Builder) \ - M(UInt32, arrow::UInt32Builder) \ - M(Int32, arrow::Int32Builder) \ - M(UInt64, arrow::UInt64Builder) \ - M(Int64, arrow::Int64Builder) \ - M(Float32, arrow::FloatBuilder) \ - M(Float64, arrow::DoubleBuilder) - -#define FOR_ARROW_TYPES(M) \ - M(UINT8, arrow::UInt8Type) \ - M(INT8, arrow::Int8Type) \ - M(UINT16, arrow::UInt16Type) \ - M(INT16, arrow::Int16Type) \ - M(UINT32, arrow::UInt32Type) \ - M(INT32, arrow::Int32Type) \ - M(UINT64, arrow::UInt64Type) \ - M(INT64, arrow::Int64Type) \ - M(FLOAT, arrow::FloatType) \ - M(DOUBLE, arrow::DoubleType) \ - M(STRING, arrow::StringType) - ColumnsWithTypeAndName header_columns; std::vector> arrow_fields; const std::string format_name; @@ -52,5 +31,7 @@ private: /// Dictionary every chunk we save it and reuse. std::unordered_map> dictionary_values; }; + } + #endif diff --git a/src/Processors/Formats/Impl/ConstantExpressionTemplate.cpp b/src/Processors/Formats/Impl/ConstantExpressionTemplate.cpp index cc9ae5e65bb..1f780a206dd 100644 --- a/src/Processors/Formats/Impl/ConstantExpressionTemplate.cpp +++ b/src/Processors/Formats/Impl/ConstantExpressionTemplate.cpp @@ -639,7 +639,7 @@ void ConstantExpressionTemplate::TemplateStructure::addNodesToCastResult(const I expr = makeASTFunction("assumeNotNull", std::move(expr)); } - expr = makeASTFunction("CAST", std::move(expr), std::make_shared(result_column_type.getName())); + expr = makeASTFunction("_CAST", std::move(expr), std::make_shared(result_column_type.getName())); if (null_as_default) { diff --git a/src/Processors/Formats/Impl/MySQLOutputFormat.cpp b/src/Processors/Formats/Impl/MySQLOutputFormat.cpp index 0f73349c271..6fdcc544a18 100644 --- a/src/Processors/Formats/Impl/MySQLOutputFormat.cpp +++ b/src/Processors/Formats/Impl/MySQLOutputFormat.cpp @@ -1,7 +1,11 @@ #include -#include +#include +#include #include +#include #include +#include + namespace DB { @@ -13,8 +17,18 @@ using namespace MySQLProtocol::ProtocolText; MySQLOutputFormat::MySQLOutputFormat(WriteBuffer & out_, const Block & header_, const FormatSettings & settings_) : IOutputFormat(header_, out_) - , format_settings(settings_) + , client_capabilities(settings_.mysql_wire.client_capabilities) { + /// MySQlWire is a special format that is usually used as output format for MySQL protocol connections. + /// In this case we have a correct `sequence_id` stored in `settings_.mysql_wire`. + /// But it's also possible to specify MySQLWire as output format for clickhouse-client or clickhouse-local. + /// There is no `sequence_id` stored in `settings_.mysql_wire` in this case, so we create a dummy one. + sequence_id = settings_.mysql_wire.sequence_id ? settings_.mysql_wire.sequence_id : &dummy_sequence_id; +} + +void MySQLOutputFormat::setContext(ContextPtr context_) +{ + context = context_; } void MySQLOutputFormat::initialize() @@ -23,6 +37,7 @@ void MySQLOutputFormat::initialize() return; initialized = true; + const auto & header = getPort(PortKind::Main).getHeader(); data_types = header.getDataTypes(); @@ -30,6 +45,8 @@ void MySQLOutputFormat::initialize() for (const auto & type : data_types) serializations.emplace_back(type->getDefaultSerialization()); + packet_endpoint = MySQLProtocol::PacketEndpoint::create(out, *sequence_id); + if (header.columns()) { packet_endpoint->sendPacket(LengthEncodedNumber(header.columns())); @@ -40,7 +57,7 @@ void MySQLOutputFormat::initialize() packet_endpoint->sendPacket(getColumnDefinition(column_name, data_types[i]->getTypeId())); } - if (!(getContext()->mysql.client_capabilities & Capability::CLIENT_DEPRECATE_EOF)) + if (!(client_capabilities & Capability::CLIENT_DEPRECATE_EOF)) { packet_endpoint->sendPacket(EOFPacket(0, 0)); } @@ -50,7 +67,6 @@ void MySQLOutputFormat::initialize() void MySQLOutputFormat::consume(Chunk chunk) { - initialize(); for (size_t i = 0; i < chunk.getNumRows(); i++) @@ -78,11 +94,9 @@ void MySQLOutputFormat::finalize() const auto & header = getPort(PortKind::Main).getHeader(); if (header.columns() == 0) - packet_endpoint->sendPacket( - OKPacket(0x0, getContext()->mysql.client_capabilities, affected_rows, 0, 0, "", human_readable_info), true); - else if (getContext()->mysql.client_capabilities & CLIENT_DEPRECATE_EOF) - packet_endpoint->sendPacket( - OKPacket(0xfe, getContext()->mysql.client_capabilities, affected_rows, 0, 0, "", human_readable_info), true); + packet_endpoint->sendPacket(OKPacket(0x0, client_capabilities, affected_rows, 0, 0, "", human_readable_info), true); + else if (client_capabilities & CLIENT_DEPRECATE_EOF) + packet_endpoint->sendPacket(OKPacket(0xfe, client_capabilities, affected_rows, 0, 0, "", human_readable_info), true); else packet_endpoint->sendPacket(EOFPacket(0, 0), true); } diff --git a/src/Processors/Formats/Impl/MySQLOutputFormat.h b/src/Processors/Formats/Impl/MySQLOutputFormat.h index 7d67df3015e..a8e1ada3d6a 100644 --- a/src/Processors/Formats/Impl/MySQLOutputFormat.h +++ b/src/Processors/Formats/Impl/MySQLOutputFormat.h @@ -3,11 +3,9 @@ #include #include -#include -#include -#include -#include -#include +#include +#include + namespace DB { @@ -15,6 +13,7 @@ namespace DB class IColumn; class IDataType; class WriteBuffer; +struct FormatSettings; /** A stream for outputting data in a binary line-by-line format. */ @@ -25,24 +24,21 @@ public: String getName() const override { return "MySQLOutputFormat"; } - void setContext(ContextPtr context_) - { - context = context_; - packet_endpoint = std::make_unique(out, const_cast(getContext()->mysql.sequence_id)); /// TODO: fix it - } + void setContext(ContextPtr context_); void consume(Chunk) override; void finalize() override; void flush() override; void doWritePrefix() override { initialize(); } +private: void initialize(); -private: bool initialized = false; - - std::unique_ptr packet_endpoint; - FormatSettings format_settings; + uint32_t client_capabilities = 0; + uint8_t * sequence_id = nullptr; + uint8_t dummy_sequence_id = 0; + MySQLProtocol::PacketEndpointPtr packet_endpoint; DataTypes data_types; Serializations serializations; }; diff --git a/src/Processors/Formats/Impl/ORCBlockInputFormat.cpp b/src/Processors/Formats/Impl/ORCBlockInputFormat.cpp index 6ee247413e9..9d56d2c8fa8 100644 --- a/src/Processors/Formats/Impl/ORCBlockInputFormat.cpp +++ b/src/Processors/Formats/Impl/ORCBlockInputFormat.cpp @@ -9,6 +9,7 @@ #include #include "ArrowBufferedStreams.h" #include "ArrowColumnToCHColumn.h" +#include namespace DB { @@ -26,7 +27,8 @@ namespace ErrorCodes throw Exception(_s.ToString(), ErrorCodes::BAD_ARGUMENTS); \ } while (false) -ORCBlockInputFormat::ORCBlockInputFormat(ReadBuffer & in_, Block header_) : IInputFormat(std::move(header_), in_) +ORCBlockInputFormat::ORCBlockInputFormat(ReadBuffer & in_, Block header_, const FormatSettings & format_settings_) + : IInputFormat(std::move(header_), in_), format_settings(format_settings_) { } @@ -98,7 +100,11 @@ void ORCBlockInputFormat::prepareReader() std::shared_ptr schema; THROW_ARROW_NOT_OK(file_reader->ReadSchema(&schema)); - arrow_column_to_ch_column = std::make_unique(getPort().getHeader(), schema, "ORC"); + arrow_column_to_ch_column = std::make_unique(getPort().getHeader(), "ORC", format_settings.orc.import_nested); + + std::unordered_set nested_table_names; + if (format_settings.orc.import_nested) + nested_table_names = Nested::getAllTableNames(getPort().getHeader()); /// In ReadStripe column indices should be started from 1, /// because 0 indicates to select all columns. @@ -108,7 +114,8 @@ void ORCBlockInputFormat::prepareReader() /// LIST type require 2 indices, STRUCT - the number of elements + 1, /// so we should recursively count the number of indices we need for this type. int indexes_count = countIndicesForType(schema->field(i)->type()); - if (getPort().getHeader().has(schema->field(i)->name())) + const auto & name = schema->field(i)->name(); + if (getPort().getHeader().has(name) || nested_table_names.contains(name)) { for (int j = 0; j != indexes_count; ++j) include_indices.push_back(index + j); @@ -124,9 +131,9 @@ void registerInputFormatProcessorORC(FormatFactory &factory) [](ReadBuffer &buf, const Block &sample, const RowInputFormatParams &, - const FormatSettings & /* settings */) + const FormatSettings & settings) { - return std::make_shared(buf, sample); + return std::make_shared(buf, sample, settings); }); factory.markFormatAsColumnOriented("ORC"); } diff --git a/src/Processors/Formats/Impl/ORCBlockInputFormat.h b/src/Processors/Formats/Impl/ORCBlockInputFormat.h index f27685a9884..254d0554cb2 100644 --- a/src/Processors/Formats/Impl/ORCBlockInputFormat.h +++ b/src/Processors/Formats/Impl/ORCBlockInputFormat.h @@ -3,6 +3,7 @@ #if USE_ORC #include +#include namespace arrow::adapters::orc { class ORCFileReader; } @@ -14,7 +15,7 @@ class ArrowColumnToCHColumn; class ORCBlockInputFormat : public IInputFormat { public: - ORCBlockInputFormat(ReadBuffer & in_, Block header_); + ORCBlockInputFormat(ReadBuffer & in_, Block header_, const FormatSettings & format_settings_); String getName() const override { return "ORCBlockInputFormat"; } @@ -38,6 +39,8 @@ private: // indices of columns to read from ORC file std::vector include_indices; + const FormatSettings format_settings; + void prepareReader(); }; diff --git a/src/Processors/Formats/Impl/ParallelFormattingOutputFormat.cpp b/src/Processors/Formats/Impl/ParallelFormattingOutputFormat.cpp index ce7dd1abd51..f7723e3f1d2 100644 --- a/src/Processors/Formats/Impl/ParallelFormattingOutputFormat.cpp +++ b/src/Processors/Formats/Impl/ParallelFormattingOutputFormat.cpp @@ -13,11 +13,15 @@ namespace DB addChunk(Chunk{}, ProcessingUnitType::FINALIZE, /*can_throw_exception*/ false); collector_finished.wait(); - if (collector_thread.joinable()) - collector_thread.join(); + { + std::lock_guard lock(collector_thread_mutex); + if (collector_thread.joinable()) + collector_thread.join(); + } { std::unique_lock lock(mutex); + if (background_exception) std::rethrow_exception(background_exception); } @@ -66,8 +70,11 @@ namespace DB writer_condvar.notify_all(); } - if (collector_thread.joinable()) - collector_thread.join(); + { + std::lock_guard lock(collector_thread_mutex); + if (collector_thread.joinable()) + collector_thread.join(); + } try { diff --git a/src/Processors/Formats/Impl/ParallelFormattingOutputFormat.h b/src/Processors/Formats/Impl/ParallelFormattingOutputFormat.h index 8b9e8293c69..e7a6435981b 100644 --- a/src/Processors/Formats/Impl/ParallelFormattingOutputFormat.h +++ b/src/Processors/Formats/Impl/ParallelFormattingOutputFormat.h @@ -172,6 +172,7 @@ private: ThreadPool pool; // Collecting all memory to original ReadBuffer ThreadFromGlobalPool collector_thread; + std::mutex collector_thread_mutex; std::exception_ptr background_exception = nullptr; diff --git a/src/Processors/Formats/Impl/ParallelParsingInputFormat.h b/src/Processors/Formats/Impl/ParallelParsingInputFormat.h index dafaf9bed72..5cf83bd3bb3 100644 --- a/src/Processors/Formats/Impl/ParallelParsingInputFormat.h +++ b/src/Processors/Formats/Impl/ParallelParsingInputFormat.h @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include #include @@ -13,6 +12,7 @@ #include #include + namespace DB { diff --git a/src/Processors/Formats/Impl/ParquetBlockInputFormat.cpp b/src/Processors/Formats/Impl/ParquetBlockInputFormat.cpp index 07a0e15cb6b..a0b92f98ca9 100644 --- a/src/Processors/Formats/Impl/ParquetBlockInputFormat.cpp +++ b/src/Processors/Formats/Impl/ParquetBlockInputFormat.cpp @@ -11,6 +11,7 @@ #include #include "ArrowBufferedStreams.h" #include "ArrowColumnToCHColumn.h" +#include #include @@ -30,8 +31,8 @@ namespace ErrorCodes throw Exception(_s.ToString(), ErrorCodes::BAD_ARGUMENTS); \ } while (false) -ParquetBlockInputFormat::ParquetBlockInputFormat(ReadBuffer & in_, Block header_) - : IInputFormat(std::move(header_), in_) +ParquetBlockInputFormat::ParquetBlockInputFormat(ReadBuffer & in_, Block header_, const FormatSettings & format_settings_) + : IInputFormat(std::move(header_), in_), format_settings(format_settings_) { } @@ -98,7 +99,11 @@ void ParquetBlockInputFormat::prepareReader() std::shared_ptr schema; THROW_ARROW_NOT_OK(file_reader->GetSchema(&schema)); - arrow_column_to_ch_column = std::make_unique(getPort().getHeader(), schema, "Parquet"); + arrow_column_to_ch_column = std::make_unique(getPort().getHeader(), "Parquet", format_settings.parquet.import_nested); + + std::unordered_set nested_table_names; + if (format_settings.parquet.import_nested) + nested_table_names = Nested::getAllTableNames(getPort().getHeader()); int index = 0; for (int i = 0; i < schema->num_fields(); ++i) @@ -107,7 +112,8 @@ void ParquetBlockInputFormat::prepareReader() /// nested elements, so we should recursively /// count the number of indices we need for this type. int indexes_count = countIndicesForType(schema->field(i)->type()); - if (getPort().getHeader().has(schema->field(i)->name())) + const auto & name = schema->field(i)->name(); + if (getPort().getHeader().has(name) || nested_table_names.contains(name)) { for (int j = 0; j != indexes_count; ++j) column_indices.push_back(index + j); @@ -123,9 +129,9 @@ void registerInputFormatProcessorParquet(FormatFactory &factory) [](ReadBuffer &buf, const Block &sample, const RowInputFormatParams &, - const FormatSettings & /* settings */) + const FormatSettings & settings) { - return std::make_shared(buf, sample); + return std::make_shared(buf, sample, settings); }); factory.markFormatAsColumnOriented("Parquet"); } diff --git a/src/Processors/Formats/Impl/ParquetBlockInputFormat.h b/src/Processors/Formats/Impl/ParquetBlockInputFormat.h index b68f97c005a..c2ed1552423 100644 --- a/src/Processors/Formats/Impl/ParquetBlockInputFormat.h +++ b/src/Processors/Formats/Impl/ParquetBlockInputFormat.h @@ -4,6 +4,7 @@ #if USE_PARQUET #include +#include namespace parquet::arrow { class FileReader; } @@ -17,7 +18,7 @@ class ArrowColumnToCHColumn; class ParquetBlockInputFormat : public IInputFormat { public: - ParquetBlockInputFormat(ReadBuffer & in_, Block header_); + ParquetBlockInputFormat(ReadBuffer & in_, Block header_, const FormatSettings & format_settings_); void resetParser() override; @@ -36,6 +37,7 @@ private: std::vector column_indices; std::unique_ptr arrow_column_to_ch_column; int row_group_current = 0; + const FormatSettings format_settings; }; } diff --git a/src/Processors/Formats/Impl/ParquetBlockOutputFormat.cpp b/src/Processors/Formats/Impl/ParquetBlockOutputFormat.cpp index 800fd0ff0e8..c3771c7b552 100644 --- a/src/Processors/Formats/Impl/ParquetBlockOutputFormat.cpp +++ b/src/Processors/Formats/Impl/ParquetBlockOutputFormat.cpp @@ -2,16 +2,7 @@ #if USE_PARQUET -// TODO: clean includes -#include -#include -#include -#include -#include #include -#include -#include -#include #include #include "ArrowBufferedStreams.h" #include "CHColumnToArrowColumn.h" @@ -19,6 +10,7 @@ namespace DB { + namespace ErrorCodes { extern const int UNKNOWN_EXCEPTION; @@ -37,7 +29,7 @@ void ParquetBlockOutputFormat::consume(Chunk chunk) if (!ch_column_to_arrow_column) { const Block & header = getPort(PortKind::Main).getHeader(); - ch_column_to_arrow_column = std::make_unique(header, "Parquet"); + ch_column_to_arrow_column = std::make_unique(header, "Parquet", false); } ch_column_to_arrow_column->chChunkToArrowTable(arrow_table, chunk, columns_num); @@ -91,11 +83,7 @@ void registerOutputFormatProcessorParquet(FormatFactory & factory) const RowOutputFormatParams &, const FormatSettings & format_settings) { - auto impl = std::make_shared(buf, sample, format_settings); - /// TODO - // auto res = std::make_shared(impl, impl->getHeader(), format_settings.parquet.row_group_size, 0); - // res->disableFlush(); - return impl; + return std::make_shared(buf, sample, format_settings); }); } diff --git a/src/Processors/Formats/LazyOutputFormat.h b/src/Processors/Formats/LazyOutputFormat.h index 15ea5022f82..c6be0adb347 100644 --- a/src/Processors/Formats/LazyOutputFormat.h +++ b/src/Processors/Formats/LazyOutputFormat.h @@ -29,7 +29,7 @@ public: void setRowsBeforeLimit(size_t rows_before_limit) override; - void finish() + void onCancel() override { finished_processing = true; /// Clear queue in case if somebody is waiting lazy_format to push. diff --git a/src/Processors/ISink.cpp b/src/Processors/ISink.cpp index bfe015f876c..0de3ed37a61 100644 --- a/src/Processors/ISink.cpp +++ b/src/Processors/ISink.cpp @@ -11,12 +11,17 @@ ISink::ISink(Block header) ISink::Status ISink::prepare() { + if (!was_on_start_called) + return Status::Ready; + if (has_input) return Status::Ready; if (input.isFinished()) { - onFinish(); + if (!was_on_finish_called) + return Status::Ready; + return Status::Finished; } @@ -31,9 +36,21 @@ ISink::Status ISink::prepare() void ISink::work() { - consume(std::move(current_chunk)); - has_input = false; + if (!was_on_start_called) + { + was_on_start_called = true; + onStart(); + } + else if (has_input) + { + has_input = false; + consume(std::move(current_chunk)); + } + else if (!was_on_finish_called) + { + was_on_finish_called = true; + onFinish(); + } } } - diff --git a/src/Processors/ISink.h b/src/Processors/ISink.h index 33cb361e30b..f960def1cdd 100644 --- a/src/Processors/ISink.h +++ b/src/Processors/ISink.h @@ -12,9 +12,11 @@ protected: InputPort & input; Chunk current_chunk; bool has_input = false; + bool was_on_start_called = false; + bool was_on_finish_called = false; virtual void consume(Chunk block) = 0; - + virtual void onStart() {} virtual void onFinish() {} public: diff --git a/src/Processors/Merges/AggregatingSortedTransform.h b/src/Processors/Merges/AggregatingSortedTransform.h index a0425d4c376..e8bf90c2b31 100644 --- a/src/Processors/Merges/AggregatingSortedTransform.h +++ b/src/Processors/Merges/AggregatingSortedTransform.h @@ -16,7 +16,7 @@ public: const Block & header, size_t num_inputs, SortDescription description_, size_t max_block_size) : IMergingTransform( - num_inputs, header, header, true, + num_inputs, header, header, /*have_all_inputs_=*/ true, /*has_limit_below_one_block_=*/ false, header, num_inputs, std::move(description_), diff --git a/src/Processors/Merges/Algorithms/GraphiteRollupSortedAlgorithm.cpp b/src/Processors/Merges/Algorithms/GraphiteRollupSortedAlgorithm.cpp index df10fb26d40..7795292f922 100644 --- a/src/Processors/Merges/Algorithms/GraphiteRollupSortedAlgorithm.cpp +++ b/src/Processors/Merges/Algorithms/GraphiteRollupSortedAlgorithm.cpp @@ -2,6 +2,8 @@ #include #include #include +#include + namespace DB { @@ -16,6 +18,8 @@ static GraphiteRollupSortedAlgorithm::ColumnsDefinition defineColumns( def.value_column_num = header.getPositionByName(params.value_column_name); def.version_column_num = header.getPositionByName(params.version_column_name); + def.time_column_type = header.getByPosition(def.time_column_num).type; + size_t num_columns = header.columns(); for (size_t i = 0; i < num_columns; ++i) if (i != def.time_column_num && i != def.value_column_num && i != def.version_column_num) @@ -122,8 +126,8 @@ UInt32 GraphiteRollupSortedAlgorithm::selectPrecision(const Graphite::Retentions * In this case, the date should not change. The date is calculated using the local time zone. * * If the rounding value is less than an hour, - * then, assuming that time zones that differ from UTC by a non-integer number of hours are not supported, - * just simply round the unix timestamp down to a multiple of 3600. + * then, assuming that time zones that differ from UTC by a multiple of 15-minute intervals + * (that is true for all modern timezones but not true for historical timezones). * And if the rounding value is greater, * then we will round down the number of seconds from the beginning of the day in the local time zone. * @@ -131,7 +135,7 @@ UInt32 GraphiteRollupSortedAlgorithm::selectPrecision(const Graphite::Retentions */ static time_t roundTimeToPrecision(const DateLUTImpl & date_lut, time_t time, UInt32 precision) { - if (precision <= 3600) + if (precision <= 900) { return time / precision * precision; } @@ -145,7 +149,10 @@ static time_t roundTimeToPrecision(const DateLUTImpl & date_lut, time_t time, UI IMergingAlgorithm::Status GraphiteRollupSortedAlgorithm::merge() { - const DateLUTImpl & date_lut = DateLUT::instance(); + /// Timestamp column can be DateTime or UInt32. If it is DateTime, we can use its timezone for calculations. + const TimezoneMixin * timezone = dynamic_cast(columns_definition.time_column_type.get()); + + const DateLUTImpl & date_lut = timezone ? timezone->getTimeZone() : DateLUT::instance(); /// Take rows in needed order and put them into `merged_data` until we get `max_block_size` rows. /// diff --git a/src/Processors/Merges/Algorithms/GraphiteRollupSortedAlgorithm.h b/src/Processors/Merges/Algorithms/GraphiteRollupSortedAlgorithm.h index a0e8f1662aa..0155b73b238 100644 --- a/src/Processors/Merges/Algorithms/GraphiteRollupSortedAlgorithm.h +++ b/src/Processors/Merges/Algorithms/GraphiteRollupSortedAlgorithm.h @@ -35,6 +35,8 @@ public: size_t value_column_num; size_t version_column_num; + DataTypePtr time_column_type; + /// All columns other than 'time', 'value', 'version'. They are unmodified during rollup. ColumnNumbers unmodified_column_numbers; }; diff --git a/src/Processors/Merges/CollapsingSortedTransform.h b/src/Processors/Merges/CollapsingSortedTransform.h index 9e6bd306eee..87c466f31e8 100644 --- a/src/Processors/Merges/CollapsingSortedTransform.h +++ b/src/Processors/Merges/CollapsingSortedTransform.h @@ -20,7 +20,7 @@ public: WriteBuffer * out_row_sources_buf_ = nullptr, bool use_average_block_sizes = false) : IMergingTransform( - num_inputs, header, header, true, + num_inputs, header, header, /*have_all_inputs_=*/ true, /*has_limit_below_one_block_=*/ false, header, num_inputs, std::move(description_), diff --git a/src/Processors/Merges/FinishAggregatingInOrderTransform.h b/src/Processors/Merges/FinishAggregatingInOrderTransform.h index 4f9e53bd7d5..6d5e334311f 100644 --- a/src/Processors/Merges/FinishAggregatingInOrderTransform.h +++ b/src/Processors/Merges/FinishAggregatingInOrderTransform.h @@ -19,7 +19,7 @@ public: SortDescription description, size_t max_block_size) : IMergingTransform( - num_inputs, header, header, true, + num_inputs, header, header, /*have_all_inputs_=*/ true, /*has_limit_below_one_block_=*/ false, header, num_inputs, params, diff --git a/src/Processors/Merges/GraphiteRollupSortedTransform.h b/src/Processors/Merges/GraphiteRollupSortedTransform.h index 5104801aa0d..46272f00eed 100644 --- a/src/Processors/Merges/GraphiteRollupSortedTransform.h +++ b/src/Processors/Merges/GraphiteRollupSortedTransform.h @@ -15,7 +15,7 @@ public: SortDescription description_, size_t max_block_size, Graphite::Params params_, time_t time_of_merge_) : IMergingTransform( - num_inputs, header, header, true, + num_inputs, header, header, /*have_all_inputs_=*/ true, /*has_limit_below_one_block_=*/ false, header, num_inputs, std::move(description_), diff --git a/src/Processors/Merges/IMergingTransform.cpp b/src/Processors/Merges/IMergingTransform.cpp index eff786b150f..cba78390c97 100644 --- a/src/Processors/Merges/IMergingTransform.cpp +++ b/src/Processors/Merges/IMergingTransform.cpp @@ -14,9 +14,11 @@ IMergingTransformBase::IMergingTransformBase( size_t num_inputs, const Block & input_header, const Block & output_header, - bool have_all_inputs_) + bool have_all_inputs_, + bool has_limit_below_one_block_) : IProcessor(InputPorts(num_inputs, input_header), {output_header}) , have_all_inputs(have_all_inputs_) + , has_limit_below_one_block(has_limit_below_one_block_) { } @@ -64,10 +66,7 @@ IProcessor::Status IMergingTransformBase::prepareInitializeInputs() continue; if (input_states[i].is_initialized) - { - // input.setNotNeeded(); continue; - } input.setNeeded(); @@ -77,12 +76,17 @@ IProcessor::Status IMergingTransformBase::prepareInitializeInputs() continue; } - auto chunk = input.pull(); + /// setNotNeeded after reading first chunk, because in optimismtic case + /// (e.g. with optimized 'ORDER BY primary_key LIMIT n' and small 'n') + /// we won't have to read any chunks anymore; + auto chunk = input.pull(has_limit_below_one_block); if (!chunk.hasRows()) { - if (!input.isFinished()) + { + input.setNeeded(); all_inputs_has_data = false; + } continue; } diff --git a/src/Processors/Merges/IMergingTransform.h b/src/Processors/Merges/IMergingTransform.h index ce673131ab6..8b0a44ae025 100644 --- a/src/Processors/Merges/IMergingTransform.h +++ b/src/Processors/Merges/IMergingTransform.h @@ -16,7 +16,8 @@ public: size_t num_inputs, const Block & input_header, const Block & output_header, - bool have_all_inputs_); + bool have_all_inputs_, + bool has_limit_below_one_block_); OutputPort & getOutputPort() { return outputs.front(); } @@ -66,6 +67,7 @@ private: std::vector input_states; std::atomic have_all_inputs; bool is_initialized = false; + bool has_limit_below_one_block = false; IProcessor::Status prepareInitializeInputs(); }; @@ -81,8 +83,9 @@ public: const Block & input_header, const Block & output_header, bool have_all_inputs_, + bool has_limit_below_one_block_, Args && ... args) - : IMergingTransformBase(num_inputs, input_header, output_header, have_all_inputs_) + : IMergingTransformBase(num_inputs, input_header, output_header, have_all_inputs_, has_limit_below_one_block_) , algorithm(std::forward(args) ...) { } diff --git a/src/Processors/Merges/MergingSortedTransform.cpp b/src/Processors/Merges/MergingSortedTransform.cpp index ec1bdc59683..92fafa4242c 100644 --- a/src/Processors/Merges/MergingSortedTransform.cpp +++ b/src/Processors/Merges/MergingSortedTransform.cpp @@ -13,12 +13,13 @@ MergingSortedTransform::MergingSortedTransform( SortDescription description_, size_t max_block_size, UInt64 limit_, + bool has_limit_below_one_block_, WriteBuffer * out_row_sources_buf_, bool quiet_, bool use_average_block_sizes, bool have_all_inputs_) : IMergingTransform( - num_inputs, header, header, have_all_inputs_, + num_inputs, header, header, have_all_inputs_, has_limit_below_one_block_, header, num_inputs, std::move(description_), diff --git a/src/Processors/Merges/MergingSortedTransform.h b/src/Processors/Merges/MergingSortedTransform.h index 93bd36d8aec..1fa9b1275bd 100644 --- a/src/Processors/Merges/MergingSortedTransform.h +++ b/src/Processors/Merges/MergingSortedTransform.h @@ -17,6 +17,7 @@ public: SortDescription description, size_t max_block_size, UInt64 limit_ = 0, + bool has_limit_below_one_block_ = false, WriteBuffer * out_row_sources_buf_ = nullptr, bool quiet_ = false, bool use_average_block_sizes = false, diff --git a/src/Processors/Merges/ReplacingSortedTransform.h b/src/Processors/Merges/ReplacingSortedTransform.h index 757e19e2cbe..e760cdf0d2b 100644 --- a/src/Processors/Merges/ReplacingSortedTransform.h +++ b/src/Processors/Merges/ReplacingSortedTransform.h @@ -18,7 +18,7 @@ public: WriteBuffer * out_row_sources_buf_ = nullptr, bool use_average_block_sizes = false) : IMergingTransform( - num_inputs, header, header, true, + num_inputs, header, header, /*have_all_inputs_=*/ true, /*has_limit_below_one_block_=*/ false, header, num_inputs, std::move(description_), diff --git a/src/Processors/Merges/SummingSortedTransform.h b/src/Processors/Merges/SummingSortedTransform.h index 22361bb1a44..0287caed5aa 100644 --- a/src/Processors/Merges/SummingSortedTransform.h +++ b/src/Processors/Merges/SummingSortedTransform.h @@ -19,7 +19,7 @@ public: const Names & partition_key_columns, size_t max_block_size) : IMergingTransform( - num_inputs, header, header, true, + num_inputs, header, header, /*have_all_inputs_=*/ true, /*has_limit_below_one_block_=*/ false, header, num_inputs, std::move(description_), diff --git a/src/Processors/Merges/VersionedCollapsingTransform.h b/src/Processors/Merges/VersionedCollapsingTransform.h index f593734c603..f260e20f1da 100644 --- a/src/Processors/Merges/VersionedCollapsingTransform.h +++ b/src/Processors/Merges/VersionedCollapsingTransform.h @@ -19,7 +19,7 @@ public: WriteBuffer * out_row_sources_buf_ = nullptr, bool use_average_block_sizes = false) : IMergingTransform( - num_inputs, header, header, true, + num_inputs, header, header, /*have_all_inputs_=*/ true, /*has_limit_below_one_block_=*/ false, header, num_inputs, std::move(description_), diff --git a/src/Processors/Pipe.cpp b/src/Processors/Pipe.cpp index abd4df1f51f..e0da79f148d 100644 --- a/src/Processors/Pipe.cpp +++ b/src/Processors/Pipe.cpp @@ -4,7 +4,8 @@ #include #include #include -#include +#include +#include #include #include #include diff --git a/src/Processors/Port.h b/src/Processors/Port.h index ac71c394518..9f27b440be5 100644 --- a/src/Processors/Port.h +++ b/src/Processors/Port.h @@ -394,7 +394,7 @@ public: pushData({.chunk = std::move(chunk), .exception = {}}); } - void ALWAYS_INLINE push(std::exception_ptr exception) + void ALWAYS_INLINE pushException(std::exception_ptr exception) { pushData({.chunk = {}, .exception = std::move(exception)}); } diff --git a/src/Processors/QueryPipeline.cpp b/src/Processors/QueryPipeline.cpp index 14b60d0b14c..2b882ee93ab 100644 --- a/src/Processors/QueryPipeline.cpp +++ b/src/Processors/QueryPipeline.cpp @@ -350,6 +350,7 @@ std::unique_ptr QueryPipeline::joinPipelines( left->pipe.processors.insert(left->pipe.processors.end(), right->pipe.processors.begin(), right->pipe.processors.end()); left->pipe.holder = std::move(right->pipe.holder); left->pipe.header = left->pipe.output_ports.front()->getHeader(); + left->pipe.max_parallel_streams = std::max(left->pipe.max_parallel_streams, right->pipe.max_parallel_streams); return left; } diff --git a/src/Processors/QueryPipeline.h b/src/Processors/QueryPipeline.h index 1585f2532ff..358d31a6dff 100644 --- a/src/Processors/QueryPipeline.h +++ b/src/Processors/QueryPipeline.h @@ -1,6 +1,5 @@ #pragma once -#include #include #include #include diff --git a/src/Processors/QueryPlan/FinishSortingStep.cpp b/src/Processors/QueryPlan/FinishSortingStep.cpp index a2e056b3029..718eeb96cd8 100644 --- a/src/Processors/QueryPlan/FinishSortingStep.cpp +++ b/src/Processors/QueryPlan/FinishSortingStep.cpp @@ -31,12 +31,14 @@ FinishSortingStep::FinishSortingStep( SortDescription prefix_description_, SortDescription result_description_, size_t max_block_size_, - UInt64 limit_) + UInt64 limit_, + bool has_filtration_) : ITransformingStep(input_stream_, input_stream_.header, getTraits(limit_)) , prefix_description(std::move(prefix_description_)) , result_description(std::move(result_description_)) , max_block_size(max_block_size_) , limit(limit_) + , has_filtration(has_filtration_) { /// TODO: check input_stream is sorted by prefix_description. output_stream->sort_description = result_description; @@ -58,11 +60,14 @@ void FinishSortingStep::transformPipeline(QueryPipeline & pipeline, const BuildQ if (pipeline.getNumStreams() > 1) { UInt64 limit_for_merging = (need_finish_sorting ? 0 : limit); + bool has_limit_below_one_block = !has_filtration && limit_for_merging && limit_for_merging < max_block_size; auto transform = std::make_shared( pipeline.getHeader(), pipeline.getNumStreams(), prefix_description, - max_block_size, limit_for_merging); + max_block_size, + limit_for_merging, + has_limit_below_one_block); pipeline.addTransform(std::move(transform)); } diff --git a/src/Processors/QueryPlan/FinishSortingStep.h b/src/Processors/QueryPlan/FinishSortingStep.h index 9fe031e792d..5ea3a6d91b5 100644 --- a/src/Processors/QueryPlan/FinishSortingStep.h +++ b/src/Processors/QueryPlan/FinishSortingStep.h @@ -13,8 +13,9 @@ public: const DataStream & input_stream_, SortDescription prefix_description_, SortDescription result_description_, - size_t max_block_size, - UInt64 limit); + size_t max_block_size_, + UInt64 limit_, + bool has_filtration_); String getName() const override { return "FinishSorting"; } @@ -31,6 +32,7 @@ private: SortDescription result_description; size_t max_block_size; UInt64 limit; + bool has_filtration; }; } diff --git a/src/Processors/QueryPlan/IntersectOrExceptStep.cpp b/src/Processors/QueryPlan/IntersectOrExceptStep.cpp new file mode 100644 index 00000000000..d1bb1eb41e9 --- /dev/null +++ b/src/Processors/QueryPlan/IntersectOrExceptStep.cpp @@ -0,0 +1,87 @@ +#include + +#include +#include +#include +#include +#include +#include +#include + + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int LOGICAL_ERROR; +} + +static Block checkHeaders(const DataStreams & input_streams_) +{ + if (input_streams_.empty()) + throw Exception(ErrorCodes::LOGICAL_ERROR, "Cannot perform intersect/except on empty set of query plan steps"); + + Block res = input_streams_.front().header; + for (const auto & stream : input_streams_) + assertBlocksHaveEqualStructure(stream.header, res, "IntersectOrExceptStep"); + + return res; +} + +IntersectOrExceptStep::IntersectOrExceptStep( + DataStreams input_streams_ , Operator operator_ , size_t max_threads_) + : header(checkHeaders(input_streams_)) + , current_operator(operator_) + , max_threads(max_threads_) +{ + input_streams = std::move(input_streams_); + output_stream = DataStream{.header = header}; +} + +QueryPipelinePtr IntersectOrExceptStep::updatePipeline(QueryPipelines pipelines, const BuildQueryPipelineSettings &) +{ + auto pipeline = std::make_unique(); + QueryPipelineProcessorsCollector collector(*pipeline, this); + + if (pipelines.empty()) + { + pipeline->init(Pipe(std::make_shared(output_stream->header))); + processors = collector.detachProcessors(); + return pipeline; + } + + for (auto & cur_pipeline : pipelines) + { + /// Just in case. + if (!isCompatibleHeader(cur_pipeline->getHeader(), getOutputStream().header)) + { + auto converting_dag = ActionsDAG::makeConvertingActions( + cur_pipeline->getHeader().getColumnsWithTypeAndName(), + getOutputStream().header.getColumnsWithTypeAndName(), + ActionsDAG::MatchColumnsMode::Name); + + auto converting_actions = std::make_shared(std::move(converting_dag)); + cur_pipeline->addSimpleTransform([&](const Block & cur_header) + { + return std::make_shared(cur_header, converting_actions); + }); + } + + /// For the case of union. + cur_pipeline->addTransform(std::make_shared(header, cur_pipeline->getNumStreams(), 1)); + } + + *pipeline = QueryPipeline::unitePipelines(std::move(pipelines), max_threads); + pipeline->addTransform(std::make_shared(header, current_operator)); + + processors = collector.detachProcessors(); + return pipeline; +} + +void IntersectOrExceptStep::describePipeline(FormatSettings & settings) const +{ + IQueryPlanStep::describePipeline(processors, settings); +} + +} diff --git a/src/Processors/QueryPlan/IntersectOrExceptStep.h b/src/Processors/QueryPlan/IntersectOrExceptStep.h new file mode 100644 index 00000000000..9e87c921ab2 --- /dev/null +++ b/src/Processors/QueryPlan/IntersectOrExceptStep.h @@ -0,0 +1,30 @@ +#pragma once +#include +#include + + +namespace DB +{ + +class IntersectOrExceptStep : public IQueryPlanStep +{ +using Operator = ASTSelectIntersectExceptQuery::Operator; + +public: + /// max_threads is used to limit the number of threads for result pipeline. + IntersectOrExceptStep(DataStreams input_streams_, Operator operator_, size_t max_threads_ = 0); + + String getName() const override { return "IntersectOrExcept"; } + + QueryPipelinePtr updatePipeline(QueryPipelines pipelines, const BuildQueryPipelineSettings & settings) override; + + void describePipeline(FormatSettings & settings) const override; + +private: + Block header; + Operator current_operator; + size_t max_threads; + Processors processors; +}; + +} diff --git a/src/Processors/QueryPlan/JoinStep.cpp b/src/Processors/QueryPlan/JoinStep.cpp index b06d6628dcb..736d7eb37c1 100644 --- a/src/Processors/QueryPlan/JoinStep.cpp +++ b/src/Processors/QueryPlan/JoinStep.cpp @@ -70,7 +70,7 @@ FilledJoinStep::FilledJoinStep(const DataStream & input_stream_, JoinPtr join_, void FilledJoinStep::transformPipeline(QueryPipeline & pipeline, const BuildQueryPipelineSettings &) { bool default_totals = false; - if (!pipeline.hasTotals() && join->hasTotals()) + if (!pipeline.hasTotals() && join->getTotals()) { pipeline.addDefaultTotals(); default_totals = true; diff --git a/src/Processors/QueryPlan/QueryPlan.cpp b/src/Processors/QueryPlan/QueryPlan.cpp index 44c5c48975c..bc3b8458531 100644 --- a/src/Processors/QueryPlan/QueryPlan.cpp +++ b/src/Processors/QueryPlan/QueryPlan.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include namespace DB @@ -434,4 +435,59 @@ void QueryPlan::optimize(const QueryPlanOptimizationSettings & optimization_sett QueryPlanOptimizations::optimizeTree(optimization_settings, *root, nodes); } +void QueryPlan::explainEstimate(MutableColumns & columns) +{ + checkInitialized(); + + struct EstimateCounters + { + std::string database_name; + std::string table_name; + UInt64 parts = 0; + UInt64 rows = 0; + UInt64 marks = 0; + + EstimateCounters(const std::string & database, const std::string & table) : database_name(database), table_name(table) + { + } + }; + + using CountersPtr = std::shared_ptr; + std::unordered_map counters; + using processNodeFuncType = std::function; + processNodeFuncType process_node = [&counters, &process_node] (const Node * node) + { + if (!node) + return; + if (const auto * step = dynamic_cast(node->step.get())) + { + const auto & id = step->getStorageID(); + auto key = id.database_name + "." + id.table_name; + auto it = counters.find(key); + if (it == counters.end()) + { + it = counters.insert({key, std::make_shared(id.database_name, id.table_name)}).first; + } + it->second->parts += step->getSelectedParts(); + it->second->rows += step->getSelectedRows(); + it->second->marks += step->getSelectedMarks(); + } + for (const auto * child : node->children) + process_node(child); + }; + process_node(root); + + for (const auto & counter : counters) + { + size_t index = 0; + const auto & database_name = counter.second->database_name; + const auto & table_name = counter.second->table_name; + columns[index++]->insertData(database_name.c_str(), database_name.size()); + columns[index++]->insertData(table_name.c_str(), table_name.size()); + columns[index++]->insert(counter.second->parts); + columns[index++]->insert(counter.second->rows); + columns[index++]->insert(counter.second->marks); + } +} + } diff --git a/src/Processors/QueryPlan/QueryPlan.h b/src/Processors/QueryPlan/QueryPlan.h index 4c75f00cf4d..95034d34c9c 100644 --- a/src/Processors/QueryPlan/QueryPlan.h +++ b/src/Processors/QueryPlan/QueryPlan.h @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -85,6 +86,7 @@ public: JSONBuilder::ItemPtr explainPlan(const ExplainPlanOptions & options); void explainPlan(WriteBuffer & buffer, const ExplainPlanOptions & options); void explainPipeline(WriteBuffer & buffer, const ExplainPipelineOptions & options); + void explainEstimate(MutableColumns & columns); /// Set upper limit for the recommend number of threads. Will be applied to the newly-created pipelines. /// TODO: make it in a better way. diff --git a/src/Processors/QueryPlan/ReadFromMergeTree.cpp b/src/Processors/QueryPlan/ReadFromMergeTree.cpp index 2dc8246cde7..4276160f514 100644 --- a/src/Processors/QueryPlan/ReadFromMergeTree.cpp +++ b/src/Processors/QueryPlan/ReadFromMergeTree.cpp @@ -13,9 +13,9 @@ #include #include #include -#include +#include #include -#include +#include #include #include #include @@ -47,6 +47,9 @@ struct ReadFromMergeTree::AnalysisResult IndexStats index_stats; Names column_names_to_read; ReadFromMergeTree::ReadType read_type = ReadFromMergeTree::ReadType::Default; + UInt64 selected_rows = 0; + UInt64 selected_marks = 0; + UInt64 selected_parts = 0; }; static MergeTreeReaderSettings getMergeTreeReaderSettings(const ContextPtr & context) @@ -154,7 +157,7 @@ Pipe ReadFromMergeTree::readFromPool( for (size_t i = 0; i < max_streams; ++i) { - auto source = std::make_shared( + auto source = std::make_shared( i, pool, min_marks_for_concurrent_read, max_block_size, settings.preferred_block_size_bytes, settings.preferred_max_column_in_block_size_bytes, data, metadata_snapshot, use_uncompressed_cache, @@ -176,26 +179,32 @@ template ProcessorPtr ReadFromMergeTree::createSource( const RangesInDataPart & part, const Names & required_columns, - bool use_uncompressed_cache) + bool use_uncompressed_cache, + bool has_limit_below_one_block) { return std::make_shared( data, metadata_snapshot, part.data_part, max_block_size, preferred_block_size_bytes, - preferred_max_column_in_block_size_bytes, required_columns, part.ranges, use_uncompressed_cache, - prewhere_info, actions_settings, true, reader_settings, virt_column_names, part.part_index_in_query); + preferred_max_column_in_block_size_bytes, required_columns, part.ranges, use_uncompressed_cache, prewhere_info, + actions_settings, true, reader_settings, virt_column_names, part.part_index_in_query, has_limit_below_one_block); } Pipe ReadFromMergeTree::readInOrder( RangesInDataParts parts_with_range, Names required_columns, ReadType read_type, - bool use_uncompressed_cache) + bool use_uncompressed_cache, + UInt64 limit) { Pipes pipes; + /// For reading in order it makes sense to read only + /// one range per task to reduce number of read rows. + bool has_limit_below_one_block = read_type != ReadType::Default && limit && limit < max_block_size; + for (const auto & part : parts_with_range) { auto source = read_type == ReadType::InReverseOrder - ? createSource(part, required_columns, use_uncompressed_cache) - : createSource(part, required_columns, use_uncompressed_cache); + ? createSource(part, required_columns, use_uncompressed_cache, has_limit_below_one_block) + : createSource(part, required_columns, use_uncompressed_cache, has_limit_below_one_block); pipes.emplace_back(std::move(source)); } @@ -221,7 +230,7 @@ Pipe ReadFromMergeTree::read( return readFromPool(parts_with_range, required_columns, max_streams, min_marks_for_concurrent_read, use_uncompressed_cache); - auto pipe = readInOrder(parts_with_range, required_columns, read_type, use_uncompressed_cache); + auto pipe = readInOrder(parts_with_range, required_columns, read_type, use_uncompressed_cache, 0); /// Use ConcatProcessor to concat sources together. /// It is needed to read in parts order (and so in PK order) if single thread is used. @@ -400,7 +409,6 @@ Pipe ReadFromMergeTree::spreadMarkRangesAmongStreamsWithOrder( { RangesInDataPart part = parts_with_ranges.back(); parts_with_ranges.pop_back(); - size_t & marks_in_part = info.sum_marks_in_parts.back(); /// We will not take too few rows from a part. @@ -415,8 +423,13 @@ Pipe ReadFromMergeTree::spreadMarkRangesAmongStreamsWithOrder( MarkRanges ranges_to_get_from_part; + /// We take full part if it contains enough marks or + /// if we know limit and part contains less than 'limit' rows. + bool take_full_part = marks_in_part <= need_marks + || (input_order_info->limit && input_order_info->limit < part.getRowsCount()); + /// We take the whole part if it is small enough. - if (marks_in_part <= need_marks) + if (take_full_part) { ranges_to_get_from_part = part.ranges; @@ -446,6 +459,7 @@ Pipe ReadFromMergeTree::spreadMarkRangesAmongStreamsWithOrder( } parts_with_ranges.emplace_back(part); } + ranges_to_get_from_part = split_ranges(ranges_to_get_from_part, input_order_info->direction); new_parts.emplace_back(part.data_part, part.part_index_in_query, std::move(ranges_to_get_from_part)); } @@ -454,8 +468,8 @@ Pipe ReadFromMergeTree::spreadMarkRangesAmongStreamsWithOrder( ? ReadFromMergeTree::ReadType::InOrder : ReadFromMergeTree::ReadType::InReverseOrder; - pipes.emplace_back(read(std::move(new_parts), column_names, read_type, - requested_num_streams, info.min_marks_for_concurrent_read, info.use_uncompressed_cache)); + pipes.emplace_back(readInOrder(std::move(new_parts), column_names, read_type, + info.use_uncompressed_cache, input_order_info->limit)); } if (need_preliminary_merge) @@ -483,7 +497,8 @@ Pipe ReadFromMergeTree::spreadMarkRangesAmongStreamsWithOrder( pipe.getHeader(), pipe.numOutputPorts(), sort_description, - max_block_size); + max_block_size, + 0, true); pipe.addTransform(std::move(transform)); } @@ -659,7 +674,7 @@ Pipe ReadFromMergeTree::spreadMarkRangesAmongStreamsFinal( /// If do_not_merge_across_partitions_select_final is true and there is only one part in partition /// with level > 0 then we won't postprocess this part and if num_streams > 1 we /// can use parallel select on such parts. We save such parts in one vector and then use - /// MergeTreeReadPool and MergeTreeThreadSelectBlockInputProcessor for parallel select. + /// MergeTreeReadPool and MergeTreeThreadSelectProcessor for parallel select. if (num_streams > 1 && settings.do_not_merge_across_partitions_select_final && std::distance(parts_to_merge_ranges[range_index], parts_to_merge_ranges[range_index + 1]) == 1 && parts_to_merge_ranges[range_index]->data_part->info.level > 0) @@ -829,7 +844,8 @@ ReadFromMergeTree::AnalysisResult ReadFromMergeTree::selectRangesToRead(MergeTre log, requested_num_streams, result.index_stats, - true); + true /* use_skip_indexes */, + true /* check_limits */); size_t sum_marks_pk = total_marks_pk; for (const auto & stat : result.index_stats) @@ -838,13 +854,17 @@ ReadFromMergeTree::AnalysisResult ReadFromMergeTree::selectRangesToRead(MergeTre size_t sum_marks = 0; size_t sum_ranges = 0; + size_t sum_rows = 0; for (const auto & part : result.parts_with_ranges) { sum_ranges += part.ranges.size(); sum_marks += part.getMarksCount(); + sum_rows += part.getRowsCount(); } - + result.selected_parts = result.parts_with_ranges.size(); + result.selected_marks = sum_marks; + result.selected_rows = sum_rows; LOG_DEBUG( log, "Selected {}/{} parts by partition key, {} parts by primary key, {}/{} marks by primary key, {} marks to read from {} ranges", @@ -882,6 +902,9 @@ void ReadFromMergeTree::initializePipeline(QueryPipeline & pipeline, const Build return; } + selected_marks = result.selected_marks; + selected_rows = result.selected_rows; + selected_parts = result.selected_parts; /// Projection, that needed to drop columns, which have appeared by execution /// of some extra expressions, and to allow execute the same expressions later. /// NOTE: It may lead to double computation of expressions. @@ -969,17 +992,14 @@ void ReadFromMergeTree::initializePipeline(QueryPipeline & pipeline, const Build }); } - Block cur_header = result_projection ? result_projection->getResultColumns() - : pipe.getHeader(); + Block cur_header = pipe.getHeader(); - auto append_actions = [&result_projection, &cur_header](ActionsDAGPtr actions) + auto append_actions = [&result_projection](ActionsDAGPtr actions) { if (!result_projection) result_projection = std::move(actions); else result_projection = ActionsDAG::merge(std::move(*result_projection), std::move(*actions)); - - cur_header = result_projection->getResultColumns(); }; /// By the way, if a distributed query or query to a Merge table is made, then the `_sample_factor` column can have different values. @@ -994,6 +1014,9 @@ void ReadFromMergeTree::initializePipeline(QueryPipeline & pipeline, const Build append_actions(std::move(adding_column)); } + if (result_projection) + cur_header = result_projection->updateHeader(cur_header); + /// Extra columns may be returned (for example, if sampling is used). /// Convert pipe to step header structure. if (!isCompatibleHeader(cur_header, getOutputStream().header)) diff --git a/src/Processors/QueryPlan/ReadFromMergeTree.h b/src/Processors/QueryPlan/ReadFromMergeTree.h index a5184d28593..e83746c3ff0 100644 --- a/src/Processors/QueryPlan/ReadFromMergeTree.h +++ b/src/Processors/QueryPlan/ReadFromMergeTree.h @@ -80,6 +80,10 @@ public: void describeActions(JSONBuilder::JSONMap & map) const override; void describeIndexes(JSONBuilder::JSONMap & map) const override; + const StorageID getStorageID() const { return data.getStorageID(); } + UInt64 getSelectedParts() const { return selected_parts; } + UInt64 getSelectedRows() const { return selected_rows; } + UInt64 getSelectedMarks() const { return selected_marks; } private: const MergeTreeReaderSettings reader_settings; @@ -106,13 +110,16 @@ private: std::shared_ptr max_block_numbers_to_read; Poco::Logger * log; + UInt64 selected_parts = 0; + UInt64 selected_rows = 0; + UInt64 selected_marks = 0; Pipe read(RangesInDataParts parts_with_range, Names required_columns, ReadType read_type, size_t max_streams, size_t min_marks_for_concurrent_read, bool use_uncompressed_cache); Pipe readFromPool(RangesInDataParts parts_with_ranges, Names required_columns, size_t max_streams, size_t min_marks_for_concurrent_read, bool use_uncompressed_cache); - Pipe readInOrder(RangesInDataParts parts_with_range, Names required_columns, ReadType read_type, bool use_uncompressed_cache); + Pipe readInOrder(RangesInDataParts parts_with_range, Names required_columns, ReadType read_type, bool use_uncompressed_cache, UInt64 limit); template - ProcessorPtr createSource(const RangesInDataPart & part, const Names & required_columns, bool use_uncompressed_cache); + ProcessorPtr createSource(const RangesInDataPart & part, const Names & required_columns, bool use_uncompressed_cache, bool has_limit_below_one_block); Pipe spreadMarkRangesAmongStreams( RangesInDataParts && parts_with_ranges, diff --git a/src/Processors/QueryPlan/ReadFromRemote.cpp b/src/Processors/QueryPlan/ReadFromRemote.cpp new file mode 100644 index 00000000000..506ef795473 --- /dev/null +++ b/src/Processors/QueryPlan/ReadFromRemote.cpp @@ -0,0 +1,237 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int ALL_CONNECTION_TRIES_FAILED; +} + +static ActionsDAGPtr getConvertingDAG(const Block & block, const Block & header) +{ + /// Convert header structure to expected. + /// Also we ignore constants from result and replace it with constants from header. + /// It is needed for functions like `now64()` or `randConstant()` because their values may be different. + return ActionsDAG::makeConvertingActions( + block.getColumnsWithTypeAndName(), + header.getColumnsWithTypeAndName(), + ActionsDAG::MatchColumnsMode::Name, + true); +} + +void addConvertingActions(QueryPlan & plan, const Block & header) +{ + if (blocksHaveEqualStructure(plan.getCurrentDataStream().header, header)) + return; + + auto convert_actions_dag = getConvertingDAG(plan.getCurrentDataStream().header, header); + auto converting = std::make_unique(plan.getCurrentDataStream(), convert_actions_dag); + plan.addStep(std::move(converting)); +} + +static void addConvertingActions(Pipe & pipe, const Block & header) +{ + if (blocksHaveEqualStructure(pipe.getHeader(), header)) + return; + + auto convert_actions = std::make_shared(getConvertingDAG(pipe.getHeader(), header)); + pipe.addSimpleTransform([&](const Block & cur_header, Pipe::StreamType) -> ProcessorPtr + { + return std::make_shared(cur_header, convert_actions); + }); +} + +static String formattedAST(const ASTPtr & ast) +{ + if (!ast) + return {}; + WriteBufferFromOwnString buf; + formatAST(*ast, buf, false, true); + return buf.str(); +} + +static std::unique_ptr createLocalPlan( + const ASTPtr & query_ast, + const Block & header, + ContextPtr context, + QueryProcessingStage::Enum processed_stage, + UInt32 shard_num, + UInt32 shard_count) +{ + checkStackSize(); + + auto query_plan = std::make_unique(); + + InterpreterSelectQuery interpreter( + query_ast, context, SelectQueryOptions(processed_stage).setShardInfo(shard_num, shard_count)); + interpreter.buildQueryPlan(*query_plan); + + addConvertingActions(*query_plan, header); + + return query_plan; +} + + +ReadFromRemote::ReadFromRemote( + ClusterProxy::IStreamFactory::Shards shards_, + Block header_, + QueryProcessingStage::Enum stage_, + StorageID main_table_, + ASTPtr table_func_ptr_, + ContextPtr context_, + ThrottlerPtr throttler_, + Scalars scalars_, + Tables external_tables_, + Poco::Logger * log_, + UInt32 shard_count_) + : ISourceStep(DataStream{.header = std::move(header_)}) + , shards(std::move(shards_)) + , stage(stage_) + , main_table(std::move(main_table_)) + , table_func_ptr(std::move(table_func_ptr_)) + , context(std::move(context_)) + , throttler(std::move(throttler_)) + , scalars(std::move(scalars_)) + , external_tables(std::move(external_tables_)) + , log(log_) + , shard_count(shard_count_) +{ +} + +void ReadFromRemote::addLazyPipe(Pipes & pipes, const ClusterProxy::IStreamFactory::Shard & shard) +{ + bool add_agg_info = stage == QueryProcessingStage::WithMergeableState; + bool add_totals = false; + bool add_extremes = false; + bool async_read = context->getSettingsRef().async_socket_for_remote; + if (stage == QueryProcessingStage::Complete) + { + add_totals = shard.query->as().group_by_with_totals; + add_extremes = context->getSettingsRef().extremes; + } + + auto lazily_create_stream = [ + pool = shard.pool, shard_num = shard.shard_num, shard_count = shard_count, query = shard.query, header = shard.header, + context = context, throttler = throttler, + main_table = main_table, table_func_ptr = table_func_ptr, + scalars = scalars, external_tables = external_tables, + stage = stage, local_delay = shard.local_delay, + add_agg_info, add_totals, add_extremes, async_read]() mutable + -> Pipe + { + auto current_settings = context->getSettingsRef(); + auto timeouts = ConnectionTimeouts::getTCPTimeoutsWithFailover( + current_settings).getSaturated( + current_settings.max_execution_time); + std::vector try_results; + try + { + if (table_func_ptr) + try_results = pool->getManyForTableFunction(timeouts, ¤t_settings, PoolMode::GET_MANY); + else + try_results = pool->getManyChecked(timeouts, ¤t_settings, PoolMode::GET_MANY, main_table.getQualifiedName()); + } + catch (const Exception & ex) + { + if (ex.code() == ErrorCodes::ALL_CONNECTION_TRIES_FAILED) + LOG_WARNING(&Poco::Logger::get("ClusterProxy::SelectStreamFactory"), + "Connections to remote replicas of local shard {} failed, will use stale local replica", shard_num); + else + throw; + } + + double max_remote_delay = 0.0; + for (const auto & try_result : try_results) + { + if (!try_result.is_up_to_date) + max_remote_delay = std::max(try_result.staleness, max_remote_delay); + } + + if (try_results.empty() || local_delay < max_remote_delay) + { + auto plan = createLocalPlan(query, header, context, stage, shard_num, shard_count); + return QueryPipeline::getPipe(std::move(*plan->buildQueryPipeline( + QueryPlanOptimizationSettings::fromContext(context), + BuildQueryPipelineSettings::fromContext(context)))); + } + else + { + std::vector connections; + connections.reserve(try_results.size()); + for (auto & try_result : try_results) + connections.emplace_back(std::move(try_result.entry)); + + String query_string = formattedAST(query); + + scalars["_shard_num"] + = Block{{DataTypeUInt32().createColumnConst(1, shard_num), std::make_shared(), "_shard_num"}}; + auto remote_query_executor = std::make_shared( + pool, std::move(connections), query_string, header, context, throttler, scalars, external_tables, stage); + + return createRemoteSourcePipe(remote_query_executor, add_agg_info, add_totals, add_extremes, async_read); + } + }; + + pipes.emplace_back(createDelayedPipe(shard.header, lazily_create_stream, add_totals, add_extremes)); + pipes.back().addInterpreterContext(context); + addConvertingActions(pipes.back(), output_stream->header); +} + +void ReadFromRemote::addPipe(Pipes & pipes, const ClusterProxy::IStreamFactory::Shard & shard) +{ + bool add_agg_info = stage == QueryProcessingStage::WithMergeableState; + bool add_totals = false; + bool add_extremes = false; + bool async_read = context->getSettingsRef().async_socket_for_remote; + if (stage == QueryProcessingStage::Complete) + { + add_totals = shard.query->as().group_by_with_totals; + add_extremes = context->getSettingsRef().extremes; + } + + String query_string = formattedAST(shard.query); + + scalars["_shard_num"] + = Block{{DataTypeUInt32().createColumnConst(1, shard.shard_num), std::make_shared(), "_shard_num"}}; + auto remote_query_executor = std::make_shared( + shard.pool, query_string, shard.header, context, throttler, scalars, external_tables, stage); + remote_query_executor->setLogger(log); + + remote_query_executor->setPoolMode(PoolMode::GET_MANY); + if (!table_func_ptr) + remote_query_executor->setMainTable(main_table); + + pipes.emplace_back(createRemoteSourcePipe(remote_query_executor, add_agg_info, add_totals, add_extremes, async_read)); + pipes.back().addInterpreterContext(context); + addConvertingActions(pipes.back(), output_stream->header); +} + +void ReadFromRemote::initializePipeline(QueryPipeline & pipeline, const BuildQueryPipelineSettings &) +{ + Pipes pipes; + for (const auto & shard : shards) + { + if (shard.lazy) + addLazyPipe(pipes, shard); + else + addPipe(pipes, shard); + } + + auto pipe = Pipe::unitePipes(std::move(pipes)); + pipeline.init(std::move(pipe)); +} + +} diff --git a/src/Processors/QueryPlan/ReadFromRemote.h b/src/Processors/QueryPlan/ReadFromRemote.h new file mode 100644 index 00000000000..ba0060d5470 --- /dev/null +++ b/src/Processors/QueryPlan/ReadFromRemote.h @@ -0,0 +1,59 @@ +#pragma once +#include +#include +#include +#include +#include + +namespace DB +{ + +class ConnectionPoolWithFailover; +using ConnectionPoolWithFailoverPtr = std::shared_ptr; + +class Throttler; +using ThrottlerPtr = std::shared_ptr; + +/// Reading step from remote servers. +/// Unite query results from several shards. +class ReadFromRemote final : public ISourceStep +{ +public: + ReadFromRemote( + ClusterProxy::IStreamFactory::Shards shards_, + Block header_, + QueryProcessingStage::Enum stage_, + StorageID main_table_, + ASTPtr table_func_ptr_, + ContextPtr context_, + ThrottlerPtr throttler_, + Scalars scalars_, + Tables external_tables_, + Poco::Logger * log_, + UInt32 shard_count_); + + String getName() const override { return "ReadFromRemote"; } + + void initializePipeline(QueryPipeline & pipeline, const BuildQueryPipelineSettings &) override; + +private: + ClusterProxy::IStreamFactory::Shards shards; + QueryProcessingStage::Enum stage; + + StorageID main_table; + ASTPtr table_func_ptr; + + ContextPtr context; + + ThrottlerPtr throttler; + Scalars scalars; + Tables external_tables; + + Poco::Logger * log; + + UInt32 shard_count; + void addLazyPipe(Pipes & pipes, const ClusterProxy::IStreamFactory::Shard & shard); + void addPipe(Pipes & pipes, const ClusterProxy::IStreamFactory::Shard & shard); +}; + +} diff --git a/src/Processors/QueueBuffer.h b/src/Processors/QueueBuffer.h index d81f7e779a3..826f4a22b8b 100644 --- a/src/Processors/QueueBuffer.h +++ b/src/Processors/QueueBuffer.h @@ -7,6 +7,9 @@ namespace DB { +/** Reads all data into queue. + * After all data has been read - output it in the same order. + */ class QueueBuffer : public IAccumulatingTransform { private: diff --git a/src/Processors/Sinks/EmptySink.h b/src/Processors/Sinks/EmptySink.h new file mode 100644 index 00000000000..6f4b1675779 --- /dev/null +++ b/src/Processors/Sinks/EmptySink.h @@ -0,0 +1,18 @@ +#pragma once +#include + +namespace DB +{ + +/// Sink which reads everything and do nothing with it. +class EmptySink : public ISink +{ +public: + explicit EmptySink(Block header) : ISink(std::move(header)) {} + String getName() const override { return "EmptySink"; } + +protected: + void consume(Chunk) override {} +}; + +} diff --git a/src/Processors/NullSink.h b/src/Processors/Sinks/NullSink.h similarity index 57% rename from src/Processors/NullSink.h rename to src/Processors/Sinks/NullSink.h index 962e65b5560..c63ef1a88b1 100644 --- a/src/Processors/NullSink.h +++ b/src/Processors/Sinks/NullSink.h @@ -1,5 +1,4 @@ #pragma once -#include #include namespace DB @@ -21,15 +20,4 @@ protected: void consume(Chunk) override {} }; -/// Sink which reads everything and do nothing with it. -class EmptySink : public ISink -{ -public: - explicit EmptySink(Block header) : ISink(std::move(header)) {} - String getName() const override { return "EmptySink"; } - -protected: - void consume(Chunk) override {} -}; - } diff --git a/src/Processors/Sinks/SinkToStorage.h b/src/Processors/Sinks/SinkToStorage.h new file mode 100644 index 00000000000..c57adef568f --- /dev/null +++ b/src/Processors/Sinks/SinkToStorage.h @@ -0,0 +1,32 @@ +#pragma once +#include +#include + +namespace DB +{ + +/// Sink which is returned from Storage::read. +/// The same as ISink, but also can hold table lock. +class SinkToStorage : public ISink +{ +public: + using ISink::ISink; + + void addTableLock(const TableLockHolder & lock) { table_locks.push_back(lock); } + +private: + std::vector table_locks; +}; + +using SinkToStoragePtr = std::shared_ptr; + + +class NullSinkToStorage : public SinkToStorage +{ +public: + using SinkToStorage::SinkToStorage; + std::string getName() const override { return "NullSinkToStorage"; } + void consume(Chunk) override {} +}; + +} diff --git a/src/Processors/Sources/BlocksListSource.h b/src/Processors/Sources/BlocksListSource.h new file mode 100644 index 00000000000..e0388214f3e --- /dev/null +++ b/src/Processors/Sources/BlocksListSource.h @@ -0,0 +1,47 @@ +#pragma once + +#include + + +namespace DB +{ + +/** A stream of blocks from which you can read the next block from an explicitly provided list. + * Also see OneBlockInputStream. + */ +class BlocksListSource : public SourceWithProgress +{ +public: + /// Acquires the ownership of the block list. + explicit BlocksListSource(BlocksList && list_) + : SourceWithProgress(list_.empty() ? Block() : list_.front().cloneEmpty()) + , list(std::move(list_)), it(list.begin()), end(list.end()) {} + + /// Uses a list of blocks lying somewhere else. + BlocksListSource(BlocksList::iterator & begin_, BlocksList::iterator & end_) + : SourceWithProgress(begin_ == end_ ? Block() : begin_->cloneEmpty()) + , it(begin_), end(end_) {} + + String getName() const override { return "BlocksListSource"; } + +protected: + + Chunk generate() override + { + if (it == end) + return {}; + + Block res = *it; + ++it; + + size_t num_rows = res.rows(); + return Chunk(res.getColumns(), num_rows); + } + +private: + BlocksList list; + BlocksList::iterator it; + const BlocksList::iterator end; +}; + +} diff --git a/src/DataStreams/BlocksSource.h b/src/Processors/Sources/BlocksSource.h similarity index 97% rename from src/DataStreams/BlocksSource.h rename to src/Processors/Sources/BlocksSource.h index 249f089f9af..a416a48e9d2 100644 --- a/src/DataStreams/BlocksSource.h +++ b/src/Processors/Sources/BlocksSource.h @@ -11,7 +11,6 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ -#include #include #include diff --git a/src/Processors/Sources/DelayedSource.cpp b/src/Processors/Sources/DelayedSource.cpp index 054453c4b5a..205ea6e2253 100644 --- a/src/Processors/Sources/DelayedSource.cpp +++ b/src/Processors/Sources/DelayedSource.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include #include namespace DB diff --git a/src/Processors/Sources/SourceFromInputStream.h b/src/Processors/Sources/SourceFromInputStream.h index 2e8cf007623..9649385909c 100644 --- a/src/Processors/Sources/SourceFromInputStream.h +++ b/src/Processors/Sources/SourceFromInputStream.h @@ -1,6 +1,9 @@ #pragma once + #include #include +#include + namespace DB { diff --git a/src/Processors/Sources/SourceWithProgress.cpp b/src/Processors/Sources/SourceWithProgress.cpp index 66168e7d73a..647ad0f205f 100644 --- a/src/Processors/Sources/SourceWithProgress.cpp +++ b/src/Processors/Sources/SourceWithProgress.cpp @@ -49,7 +49,7 @@ void SourceWithProgress::setProcessListElement(QueryStatus * elem) void SourceWithProgress::work() { - if (!limits.speed_limits.checkTimeLimit(total_stopwatch.elapsed(), limits.timeout_overflow_mode)) + if (!limits.speed_limits.checkTimeLimit(total_stopwatch, limits.timeout_overflow_mode)) { cancel(); } diff --git a/src/Processors/Sources/SourceWithProgress.h b/src/Processors/Sources/SourceWithProgress.h index 78e56eafb52..49728be01e3 100644 --- a/src/Processors/Sources/SourceWithProgress.h +++ b/src/Processors/Sources/SourceWithProgress.h @@ -1,12 +1,16 @@ #pragma once #include -#include #include #include +#include + namespace DB { +class QueryStatus; +class EnabledQuota; + /// Adds progress to ISource. /// This class takes care of limits, quotas, callback on progress and updating performance counters for current thread. class ISourceWithProgress : public ISource diff --git a/src/DataStreams/AddingDefaultsBlockInputStream.cpp b/src/Processors/Transforms/AddingDefaultsTransform.cpp similarity index 89% rename from src/DataStreams/AddingDefaultsBlockInputStream.cpp rename to src/Processors/Transforms/AddingDefaultsTransform.cpp index 81be24439a5..c92d4d7a456 100644 --- a/src/DataStreams/AddingDefaultsBlockInputStream.cpp +++ b/src/Processors/Transforms/AddingDefaultsTransform.cpp @@ -2,7 +2,8 @@ #include #include #include -#include +#include +#include #include #include @@ -13,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -127,31 +129,32 @@ static MutableColumnPtr mixColumns(const ColumnWithTypeAndName & col_read, } -AddingDefaultsBlockInputStream::AddingDefaultsBlockInputStream( - const BlockInputStreamPtr & input, +AddingDefaultsTransform::AddingDefaultsTransform( + const Block & header, const ColumnsDescription & columns_, + IInputFormat & input_format_, ContextPtr context_) - : columns(columns_) + : ISimpleTransform(header, header, true) + , columns(columns_) , column_defaults(columns.getDefaults()) + , input_format(input_format_) , context(context_) { - children.push_back(input); - header = input->getHeader(); } -Block AddingDefaultsBlockInputStream::readImpl() +void AddingDefaultsTransform::transform(Chunk & chunk) { - Block res = children.back()->read(); - if (!res) - return res; - if (column_defaults.empty()) - return res; + return; - const BlockMissingValues & block_missing_values = children.back()->getMissingValues(); + const BlockMissingValues & block_missing_values = input_format.getMissingValues(); if (block_missing_values.empty()) - return res; + return; + + const auto & header = getOutputPort().getHeader(); + size_t num_rows = chunk.getNumRows(); + auto res = header.cloneWithColumns(chunk.detachColumns()); /// res block already has all columns values, with default value for type /// (not value specified in table). We identify which columns we need to @@ -169,7 +172,7 @@ Block AddingDefaultsBlockInputStream::readImpl() } if (!evaluate_block.columns()) - evaluate_block.insert({ColumnConst::create(ColumnUInt8::create(1, 0), res.rows()), std::make_shared(), "_dummy"}); + evaluate_block.insert({ColumnConst::create(ColumnUInt8::create(1, 0), num_rows), std::make_shared(), "_dummy"}); auto dag = evaluateMissingDefaults(evaluate_block, header.getNamesAndTypesList(), columns, context, false); if (dag) @@ -223,7 +226,7 @@ Block AddingDefaultsBlockInputStream::readImpl() res.setColumns(std::move(mutation)); } - return res; + chunk.setColumns(res.getColumns(), num_rows); } } diff --git a/src/DataStreams/AddingDefaultsBlockInputStream.h b/src/Processors/Transforms/AddingDefaultsTransform.h similarity index 52% rename from src/DataStreams/AddingDefaultsBlockInputStream.h rename to src/Processors/Transforms/AddingDefaultsTransform.h index 957f14caff3..844f4fb96e6 100644 --- a/src/DataStreams/AddingDefaultsBlockInputStream.h +++ b/src/Processors/Transforms/AddingDefaultsTransform.h @@ -1,31 +1,33 @@ #pragma once -#include +#include #include namespace DB { +class IInputFormat; + /// Adds defaults to columns using BlockDelayedDefaults bitmask attached to Block by child InputStream. -class AddingDefaultsBlockInputStream : public IBlockInputStream +class AddingDefaultsTransform : public ISimpleTransform { public: - AddingDefaultsBlockInputStream( - const BlockInputStreamPtr & input, + AddingDefaultsTransform( + const Block & header, const ColumnsDescription & columns_, + IInputFormat & input_format_, ContextPtr context_); - String getName() const override { return "AddingDefaults"; } - Block getHeader() const override { return header; } + String getName() const override { return "AddingDefaultsTransform"; } protected: - Block readImpl() override; + void transform(Chunk & chunk) override; private: - Block header; const ColumnsDescription columns; const ColumnDefaults column_defaults; + IInputFormat & input_format; ContextPtr context; }; diff --git a/src/DataStreams/CheckSortedBlockInputStream.cpp b/src/Processors/Transforms/CheckSortedTransform.cpp similarity index 68% rename from src/DataStreams/CheckSortedBlockInputStream.cpp rename to src/Processors/Transforms/CheckSortedTransform.cpp index 064c1b690b8..3d4518a935d 100644 --- a/src/DataStreams/CheckSortedBlockInputStream.cpp +++ b/src/Processors/Transforms/CheckSortedTransform.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -12,20 +12,20 @@ namespace ErrorCodes extern const int LOGICAL_ERROR; } -CheckSortedBlockInputStream::CheckSortedBlockInputStream( - const BlockInputStreamPtr & input_, +CheckSortedTransform::CheckSortedTransform( + const Block & header_, const SortDescription & sort_description_) - : header(input_->getHeader()) + : ISimpleTransform(header_, header_, false) , sort_description_map(addPositionsToSortDescriptions(sort_description_)) { - children.push_back(input_); } SortDescriptionsWithPositions -CheckSortedBlockInputStream::addPositionsToSortDescriptions(const SortDescription & sort_description) +CheckSortedTransform::addPositionsToSortDescriptions(const SortDescription & sort_description) { SortDescriptionsWithPositions result; result.reserve(sort_description.size()); + const auto & header = getInputPort().getHeader(); for (SortColumnDescription description_copy : sort_description) { @@ -39,11 +39,11 @@ CheckSortedBlockInputStream::addPositionsToSortDescriptions(const SortDescriptio } -Block CheckSortedBlockInputStream::readImpl() +void CheckSortedTransform::transform(Chunk & chunk) { - Block block = children.back()->read(); - if (!block || block.rows() == 0) - return block; + size_t num_rows = chunk.getNumRows(); + if (num_rows == 0) + return; auto check = [this](const Columns & left, size_t left_index, const Columns & right, size_t right_index) { @@ -70,23 +70,20 @@ Block CheckSortedBlockInputStream::readImpl() } }; - auto block_columns = block.getColumns(); + const auto & chunk_columns = chunk.getColumns(); if (!last_row.empty()) - check(last_row, 0, block_columns, 0); + check(last_row, 0, chunk_columns, 0); - size_t rows = block.rows(); - for (size_t i = 1; i < rows; ++i) - check(block_columns, i - 1, block_columns, i); + for (size_t i = 1; i < num_rows; ++i) + check(chunk_columns, i - 1, chunk_columns, i); last_row.clear(); - for (size_t i = 0; i < block.columns(); ++i) + for (const auto & chunk_column : chunk_columns) { - auto column = block_columns[i]->cloneEmpty(); - column->insertFrom(*block_columns[i], rows - 1); + auto column = chunk_column->cloneEmpty(); + column->insertFrom(*chunk_column, num_rows - 1); last_row.emplace_back(std::move(column)); } - - return block; } } diff --git a/src/DataStreams/CheckSortedBlockInputStream.h b/src/Processors/Transforms/CheckSortedTransform.h similarity index 64% rename from src/DataStreams/CheckSortedBlockInputStream.h rename to src/Processors/Transforms/CheckSortedTransform.h index 42060befeeb..d1b13d22578 100644 --- a/src/DataStreams/CheckSortedBlockInputStream.h +++ b/src/Processors/Transforms/CheckSortedTransform.h @@ -1,5 +1,5 @@ #pragma once -#include +#include #include #include @@ -9,26 +9,23 @@ using SortDescriptionsWithPositions = std::vector; /// Streams checks that flow of blocks is sorted in the sort_description order /// Othrewise throws exception in readImpl function. -class CheckSortedBlockInputStream : public IBlockInputStream +class CheckSortedTransform : public ISimpleTransform { public: - CheckSortedBlockInputStream( - const BlockInputStreamPtr & input_, + CheckSortedTransform( + const Block & header_, const SortDescription & sort_description_); - String getName() const override { return "CheckingSorted"; } + String getName() const override { return "CheckSortedTransform"; } - Block getHeader() const override { return header; } protected: - Block readImpl() override; + void transform(Chunk & chunk) override; private: - Block header; SortDescriptionsWithPositions sort_description_map; Columns last_row; -private: /// Just checks, that all sort_descriptions has column_number SortDescriptionsWithPositions addPositionsToSortDescriptions(const SortDescription & sort_description); }; diff --git a/src/Processors/Transforms/CreatingSetsTransform.cpp b/src/Processors/Transforms/CreatingSetsTransform.cpp index 86051019235..6f69765ee23 100644 --- a/src/Processors/Transforms/CreatingSetsTransform.cpp +++ b/src/Processors/Transforms/CreatingSetsTransform.cpp @@ -1,6 +1,6 @@ #include +#include -#include #include #include @@ -10,6 +10,7 @@ #include #include + namespace DB { @@ -49,7 +50,7 @@ void CreatingSetsTransform::startSubquery() LOG_TRACE(log, "Filling temporary table."); if (subquery.table) - table_out = subquery.table->write({}, subquery.table->getInMemoryMetadataPtr(), getContext()); + table_out = std::make_shared(subquery.table->write({}, subquery.table->getInMemoryMetadataPtr(), getContext())); done_with_set = !subquery.set; done_with_table = !subquery.table; diff --git a/src/Processors/Transforms/FillingTransform.cpp b/src/Processors/Transforms/FillingTransform.cpp index 45e46649b3a..831130d06d1 100644 --- a/src/Processors/Transforms/FillingTransform.cpp +++ b/src/Processors/Transforms/FillingTransform.cpp @@ -47,7 +47,7 @@ FillingTransform::FillingTransform( DataTypePtr to_type; /// TODO Wrong results for big integers. - if (isInteger(type) || which.isDate() || which.isDateTime()) + if (isInteger(type) || which.isDate() || which.isDate32() || which.isDateTime()) { max_type = Field::Types::Int64; to_type = std::make_shared(); diff --git a/src/Processors/Transforms/IntersectOrExceptTransform.cpp b/src/Processors/Transforms/IntersectOrExceptTransform.cpp new file mode 100644 index 00000000000..3e39123ae4b --- /dev/null +++ b/src/Processors/Transforms/IntersectOrExceptTransform.cpp @@ -0,0 +1,197 @@ +#include + + +namespace DB +{ + +/// After visitor is applied, ASTSelectIntersectExcept always has two child nodes. +IntersectOrExceptTransform::IntersectOrExceptTransform(const Block & header_, Operator operator_) + : IProcessor(InputPorts(2, header_), {header_}) + , current_operator(operator_) +{ + const Names & columns = header_.getNames(); + size_t num_columns = columns.empty() ? header_.columns() : columns.size(); + + key_columns_pos.reserve(columns.size()); + for (size_t i = 0; i < num_columns; ++i) + { + auto pos = columns.empty() ? i : header_.getPositionByName(columns[i]); + key_columns_pos.emplace_back(pos); + } +} + + +IntersectOrExceptTransform::Status IntersectOrExceptTransform::prepare() +{ + auto & output = outputs.front(); + + if (output.isFinished()) + { + for (auto & in : inputs) + in.close(); + + return Status::Finished; + } + + if (!output.canPush()) + { + for (auto & input : inputs) + input.setNotNeeded(); + + return Status::PortFull; + } + + if (current_output_chunk) + { + output.push(std::move(current_output_chunk)); + } + + if (finished_second_input) + { + if (inputs.front().isFinished()) + { + output.finish(); + return Status::Finished; + } + } + else if (inputs.back().isFinished()) + { + finished_second_input = true; + } + + if (!has_input) + { + InputPort & input = finished_second_input ? inputs.front() : inputs.back(); + + input.setNeeded(); + if (!input.hasData()) + return Status::NeedData; + + current_input_chunk = input.pull(); + has_input = true; + } + + return Status::Ready; +} + + +void IntersectOrExceptTransform::work() +{ + if (!finished_second_input) + { + accumulate(std::move(current_input_chunk)); + } + else + { + filter(current_input_chunk); + current_output_chunk = std::move(current_input_chunk); + } + + has_input = false; +} + + +template +void IntersectOrExceptTransform::addToSet(Method & method, const ColumnRawPtrs & columns, size_t rows, SetVariants & variants) const +{ + typename Method::State state(columns, key_sizes, nullptr); + + for (size_t i = 0; i < rows; ++i) + state.emplaceKey(method.data, i, variants.string_pool); +} + + +template +size_t IntersectOrExceptTransform::buildFilter( + Method & method, const ColumnRawPtrs & columns, IColumn::Filter & filter, size_t rows, SetVariants & variants) const +{ + typename Method::State state(columns, key_sizes, nullptr); + size_t new_rows_num = 0; + + for (size_t i = 0; i < rows; ++i) + { + auto find_result = state.findKey(method.data, i, variants.string_pool); + filter[i] = current_operator == ASTSelectIntersectExceptQuery::Operator::EXCEPT ? !find_result.isFound() : find_result.isFound(); + if (filter[i]) + ++new_rows_num; + } + return new_rows_num; +} + + +void IntersectOrExceptTransform::accumulate(Chunk chunk) +{ + auto num_rows = chunk.getNumRows(); + auto columns = chunk.detachColumns(); + + ColumnRawPtrs column_ptrs; + column_ptrs.reserve(key_columns_pos.size()); + + for (auto pos : key_columns_pos) + column_ptrs.emplace_back(columns[pos].get()); + + if (!data) + data.emplace(); + + if (data->empty()) + data->init(SetVariants::chooseMethod(column_ptrs, key_sizes)); + + auto & data_set = *data; + switch (data->type) + { + case SetVariants::Type::EMPTY: + break; +#define M(NAME) \ + case SetVariants::Type::NAME: \ + addToSet(*data_set.NAME, column_ptrs, num_rows, data_set); \ + break; + APPLY_FOR_SET_VARIANTS(M) +#undef M + } +} + + +void IntersectOrExceptTransform::filter(Chunk & chunk) +{ + auto num_rows = chunk.getNumRows(); + auto columns = chunk.detachColumns(); + + ColumnRawPtrs column_ptrs; + column_ptrs.reserve(key_columns_pos.size()); + + for (auto pos : key_columns_pos) + column_ptrs.emplace_back(columns[pos].get()); + + if (!data) + data.emplace(); + + if (data->empty()) + data->init(SetVariants::chooseMethod(column_ptrs, key_sizes)); + + size_t new_rows_num = 0; + + IColumn::Filter filter(num_rows); + auto & data_set = *data; + + switch (data->type) + { + case SetVariants::Type::EMPTY: + break; +#define M(NAME) \ + case SetVariants::Type::NAME: \ + new_rows_num = buildFilter(*data_set.NAME, column_ptrs, filter, num_rows, data_set); \ + break; + APPLY_FOR_SET_VARIANTS(M) +#undef M + } + + if (!new_rows_num) + return; + + for (auto & column : columns) + column = column->filter(filter, -1); + + chunk.setColumns(std::move(columns), new_rows_num); +} + +} diff --git a/src/Processors/Transforms/IntersectOrExceptTransform.h b/src/Processors/Transforms/IntersectOrExceptTransform.h new file mode 100644 index 00000000000..e200bfd6cc5 --- /dev/null +++ b/src/Processors/Transforms/IntersectOrExceptTransform.h @@ -0,0 +1,51 @@ +#pragma once + +#include +#include +#include +#include + + +namespace DB +{ + +class IntersectOrExceptTransform : public IProcessor +{ +using Operator = ASTSelectIntersectExceptQuery::Operator; + +public: + IntersectOrExceptTransform(const Block & header_, Operator operator_); + + String getName() const override { return "IntersectOrExcept"; } + +protected: + Status prepare() override; + + void work() override; + +private: + Operator current_operator; + + ColumnNumbers key_columns_pos; + std::optional data; + Sizes key_sizes; + + Chunk current_input_chunk; + Chunk current_output_chunk; + + bool finished_second_input = false; + bool has_input = false; + + void accumulate(Chunk chunk); + + void filter(Chunk & chunk); + + template + void addToSet(Method & method, const ColumnRawPtrs & key_columns, size_t rows, SetVariants & variants) const; + + template + size_t buildFilter(Method & method, const ColumnRawPtrs & columns, + IColumn::Filter & filter, size_t rows, SetVariants & variants) const; +}; + +} diff --git a/src/Processors/Transforms/JoiningTransform.cpp b/src/Processors/Transforms/JoiningTransform.cpp index 31b2da46ab3..e402fd788bc 100644 --- a/src/Processors/Transforms/JoiningTransform.cpp +++ b/src/Processors/Transforms/JoiningTransform.cpp @@ -1,8 +1,9 @@ #include #include -#include -#include +#include #include +#include + namespace DB { @@ -159,19 +160,16 @@ void JoiningTransform::transform(Chunk & chunk) Block block; if (on_totals) { - /// We have to make chunk empty before return - /// In case of using `arrayJoin` we can get more or less rows than one - auto cols = chunk.detachColumns(); - for (auto & col : cols) - col = col->cloneResized(1); - block = inputs.front().getHeader().cloneWithColumns(std::move(cols)); + const auto & left_totals = inputs.front().getHeader().cloneWithColumns(chunk.detachColumns()); + const auto & right_totals = join->getTotals(); /// Drop totals if both out stream and joined stream doesn't have ones. /// See comment in ExpressionTransform.h - if (default_totals && !join->hasTotals()) + if (default_totals && !right_totals) return; - join->joinTotals(block); + block = outputs.front().getHeader().cloneEmpty(); + JoinCommon::joinTotals(left_totals, right_totals, join->getTableJoin(), block); } else block = readExecute(chunk); @@ -183,11 +181,9 @@ void JoiningTransform::transform(Chunk & chunk) Block JoiningTransform::readExecute(Chunk & chunk) { Block res; - // std::cerr << "=== Chunk rows " << chunk.getNumRows() << " cols " << chunk.getNumColumns() << std::endl; if (!not_processed) { - // std::cerr << "!not_processed " << std::endl; if (chunk.hasColumns()) res = inputs.front().getHeader().cloneWithColumns(chunk.detachColumns()); @@ -196,7 +192,6 @@ Block JoiningTransform::readExecute(Chunk & chunk) } else if (not_processed->empty()) /// There's not processed data inside expression. { - // std::cerr << "not_processed->empty() " << std::endl; if (chunk.hasColumns()) res = inputs.front().getHeader().cloneWithColumns(chunk.detachColumns()); @@ -205,12 +200,10 @@ Block JoiningTransform::readExecute(Chunk & chunk) } else { - // std::cerr << "not not_processed->empty() " << std::endl; res = std::move(not_processed->block); join->joinBlock(res, not_processed); } - // std::cerr << "Res block rows " << res.rows() << " cols " << res.columns() << std::endl; return res; } diff --git a/src/Processors/Transforms/LimitsCheckingTransform.cpp b/src/Processors/Transforms/LimitsCheckingTransform.cpp index 9e021e8e59d..64b6b64ccd9 100644 --- a/src/Processors/Transforms/LimitsCheckingTransform.cpp +++ b/src/Processors/Transforms/LimitsCheckingTransform.cpp @@ -32,7 +32,7 @@ void LimitsCheckingTransform::transform(Chunk & chunk) info.started = true; } - if (!limits.speed_limits.checkTimeLimit(info.total_stopwatch.elapsed(), limits.timeout_overflow_mode)) + if (!limits.speed_limits.checkTimeLimit(info.total_stopwatch, limits.timeout_overflow_mode)) { stopReading(); return; diff --git a/src/Processors/Transforms/MergeSortingTransform.cpp b/src/Processors/Transforms/MergeSortingTransform.cpp index 1806693db3a..ca78a29071e 100644 --- a/src/Processors/Transforms/MergeSortingTransform.cpp +++ b/src/Processors/Transforms/MergeSortingTransform.cpp @@ -200,6 +200,7 @@ void MergeSortingTransform::consume(Chunk chunk) description, max_merged_block_size, limit, + false, nullptr, quiet, use_average_block_sizes, diff --git a/src/Processors/Transforms/SortingTransform.h b/src/Processors/Transforms/SortingTransform.h index 9178991f324..0f7cb4347a4 100644 --- a/src/Processors/Transforms/SortingTransform.h +++ b/src/Processors/Transforms/SortingTransform.h @@ -3,7 +3,6 @@ #include #include #include -#include #include diff --git a/src/Processors/Transforms/SquashingChunksTransform.cpp b/src/Processors/Transforms/SquashingChunksTransform.cpp new file mode 100644 index 00000000000..398ce9eb9fb --- /dev/null +++ b/src/Processors/Transforms/SquashingChunksTransform.cpp @@ -0,0 +1,27 @@ +#include + +namespace DB +{ + +SquashingChunksTransform::SquashingChunksTransform( + const Block & header, size_t min_block_size_rows, size_t min_block_size_bytes, bool reserve_memory) + : IAccumulatingTransform(header, header) + , squashing(min_block_size_rows, min_block_size_bytes, reserve_memory) +{ +} + +void SquashingChunksTransform::consume(Chunk chunk) +{ + if (auto block = squashing.add(getInputPort().getHeader().cloneWithColumns(chunk.detachColumns()))) + { + setReadyChunk(Chunk(block.getColumns(), block.rows())); + } +} + +Chunk SquashingChunksTransform::generate() +{ + auto block = squashing.add({}); + return Chunk(block.getColumns(), block.rows()); +} + +} diff --git a/src/Processors/Transforms/SquashingChunksTransform.h b/src/Processors/Transforms/SquashingChunksTransform.h new file mode 100644 index 00000000000..bcacf5abcda --- /dev/null +++ b/src/Processors/Transforms/SquashingChunksTransform.h @@ -0,0 +1,24 @@ +#pragma once +#include +#include + +namespace DB +{ + +class SquashingChunksTransform : public IAccumulatingTransform +{ +public: + explicit SquashingChunksTransform( + const Block & header, size_t min_block_size_rows, size_t min_block_size_bytes, bool reserve_memory = false); + + String getName() const override { return "SquashingTransform"; } + +protected: + void consume(Chunk chunk) override; + Chunk generate() override; + +private: + SquashingTransform squashing; +}; + +} diff --git a/src/Processors/Transforms/TotalsHavingTransform.h b/src/Processors/Transforms/TotalsHavingTransform.h index 5809f382e0e..d42543d311a 100644 --- a/src/Processors/Transforms/TotalsHavingTransform.h +++ b/src/Processors/Transforms/TotalsHavingTransform.h @@ -70,7 +70,7 @@ private: /// They are added or not added to the current_totals, depending on the totals_mode. Chunk overflow_aggregates; - /// Here, total values are accumulated. After the work is finished, they will be placed in IBlockInputStream::totals. + /// Here, total values are accumulated. After the work is finished, they will be placed in totals. MutableColumns current_totals; }; diff --git a/src/Processors/Transforms/WindowTransform.cpp b/src/Processors/Transforms/WindowTransform.cpp index 43a7e745842..1b8406682ea 100644 --- a/src/Processors/Transforms/WindowTransform.cpp +++ b/src/Processors/Transforms/WindowTransform.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -196,6 +197,16 @@ WindowTransform::WindowTransform(const Block & input_header_, , input_header(input_header_) , window_description(window_description_) { + // Materialize all columns in header, because we materialize all columns + // in chunks and it's convenient if they match. + auto input_columns = input_header.getColumns(); + for (auto & column : input_columns) + { + column = std::move(column)->convertToFullColumnIfConst(); + } + input_header.setColumns(std::move(input_columns)); + + // Initialize window function workspaces. workspaces.reserve(functions.size()); for (const auto & f : functions) { @@ -347,8 +358,8 @@ void WindowTransform::advancePartitionEnd() assert(end.block == partition_end.block + 1); // Try to advance the partition end pointer. - const size_t n = partition_by_indices.size(); - if (n == 0) + const size_t partition_by_columns = partition_by_indices.size(); + if (partition_by_columns == 0) { // No PARTITION BY. All input is one partition, which will end when the // input ends. @@ -359,27 +370,44 @@ void WindowTransform::advancePartitionEnd() // Check for partition end. // The partition ends when the PARTITION BY columns change. We need // some reference columns for comparison. We might have already - // dropped the blocks where the partition starts, but any row in the - // partition will do. We use the current_row for this. It might be the same - // as the partition_end if we're at the first row of the first partition, so - // we will compare it to itself, but it still works correctly. + // dropped the blocks where the partition starts, but any other row in the + // partition will do. We can't use frame_start or frame_end or current_row (the next row + // for which we are calculating the window functions), because they all might be + // past the end of the partition. prev_frame_start is suitable, because it + // is a pointer to the first row of the previous frame that must have been + // valid, or to the first row of the partition, and we make sure not to drop + // its block. + assert(partition_start <= prev_frame_start); + // The frame start should be inside the prospective partition, except the + // case when it still has no rows. + assert(prev_frame_start < partition_end || partition_start == partition_end); + assert(first_block_number <= prev_frame_start.block); const auto block_rows = blockRowsNumber(partition_end); for (; partition_end.row < block_rows; ++partition_end.row) { +// fmt::print(stderr, "compare reference '{}' to compared '{}'\n", +// prev_frame_start, partition_end); + size_t i = 0; - for (; i < n; i++) + for (; i < partition_by_columns; i++) { - const auto * ref = inputAt(current_row)[partition_by_indices[i]].get(); - const auto * c = inputAt(partition_end)[partition_by_indices[i]].get(); - if (c->compareAt(partition_end.row, - current_row.row, *ref, + const auto * reference_column + = inputAt(prev_frame_start)[partition_by_indices[i]].get(); + const auto * compared_column + = inputAt(partition_end)[partition_by_indices[i]].get(); + +// fmt::print(stderr, "reference '{}', compared '{}'\n", +// (*reference_column)[prev_frame_start.row], +// (*compared_column)[partition_end.row]); + if (compared_column->compareAt(partition_end.row, + prev_frame_start.row, *reference_column, 1 /* nan_direction_hint */) != 0) { break; } } - if (i < n) + if (i < partition_by_columns) { partition_ended = true; return; @@ -850,6 +878,8 @@ void WindowTransform::updateAggregationState() assert(prev_frame_start <= prev_frame_end); assert(prev_frame_start <= frame_start); assert(prev_frame_end <= frame_end); + assert(partition_start <= frame_start); + assert(frame_end <= partition_end); // We might have to reset aggregation state and/or add some rows to it. // Figure out what to do. @@ -963,12 +993,42 @@ void WindowTransform::writeOutCurrentRow() a->insertResultInto(buf, *result_column, arena.get()); } } + +// fmt::print(stderr, "wrote out aggregation state for current row '{}'\n", +// current_row); +} + +static void assertSameColumns(const Columns & left_all, + const Columns & right_all) +{ + assert(left_all.size() == right_all.size()); + + for (size_t i = 0; i < left_all.size(); ++i) + { + const auto * left_column = left_all[i].get(); + const auto * right_column = right_all[i].get(); + + assert(left_column); + assert(right_column); + + assert(typeid(*left_column).hash_code() + == typeid(*right_column).hash_code()); + + if (isColumnConst(*left_column)) + { + Field left_value = assert_cast(*left_column).getField(); + Field right_value = assert_cast(*right_column).getField(); + + assert(left_value == right_value); + } + } } void WindowTransform::appendChunk(Chunk & chunk) { // fmt::print(stderr, "new chunk, {} rows, finished={}\n", chunk.getNumRows(), // input_is_finished); +// fmt::print(stderr, "chunk structure '{}'\n", chunk.dumpStructure()); // First, prepare the new input block and add it to the queue. We might not // have it if it's end of data, though. @@ -984,28 +1044,42 @@ void WindowTransform::appendChunk(Chunk & chunk) blocks.push_back({}); auto & block = blocks.back(); + // Use the number of rows from the Chunk, because it is correct even in // the case where the Chunk has no columns. Not sure if this actually // happens, because even in the case of `count() over ()` we have a dummy // input column. block.rows = chunk.getNumRows(); - block.input_columns = chunk.detachColumns(); + // If we have a (logically) constant column, some Chunks will have a + // Const column for it, and some -- materialized. Such difference is + // generated by e.g. MergingSortedAlgorithm, which mostly materializes + // the constant ORDER BY columns, but in some obscure cases passes them + // through, unmaterialized. This mix is a pain to work with in Window + // Transform, because we have to compare columns across blocks, when e.g. + // searching for peer group boundaries, and each of the four combinations + // of const and materialized requires different code. + // Another problem with Const columns is that the aggregate functions + // can't work with them, so we have to materialize them like the + // Aggregator does. + // Just materialize everything. + auto columns = chunk.detachColumns(); + for (auto & column : columns) + column = std::move(column)->convertToFullColumnIfConst(); + block.input_columns = std::move(columns); + + // Initialize output columns. for (auto & ws : workspaces) { - // Aggregate functions can't work with constant columns, so we have to - // materialize them like the Aggregator does. - for (const auto column_index : ws.argument_column_indices) - { - block.input_columns[column_index] - = std::move(block.input_columns[column_index]) - ->convertToFullColumnIfConst(); - } - block.output_columns.push_back(ws.aggregate_function->getReturnType() ->createColumn()); block.output_columns.back()->reserve(block.rows); } + + // As a debugging aid, assert that all chunks have the same C++ type of + // columns, that also matches the input header, because we often have to + // work across chunks. + assertSameColumns(input_header.getColumns(), block.input_columns); } // Start the calculations. First, advance the partition end. @@ -1092,6 +1166,23 @@ void WindowTransform::appendChunk(Chunk & chunk) // Write out the aggregation results. writeOutCurrentRow(); + if (isCancelled()) + { + // Good time to check if the query is cancelled. Checking once + // per block might not be enough in severe quadratic cases. + // Just leave the work halfway through and return, the 'prepare' + // method will figure out what to do. Note that this doesn't + // handle 'max_execution_time' and other limits, because these + // limits are only updated between blocks. Eventually we should + // start updating them in background and canceling the processor, + // like we do for Ctrl+C handling. + // + // This class is final, so the check should hopefully be + // devirtualized and become a single never-taken branch that is + // basically free. + return; + } + // Move to the next row. The frame will have to be recalculated. // The peer group start is updated at the beginning of the loop, // because current_row might now be past-the-end. @@ -1136,7 +1227,7 @@ void WindowTransform::appendChunk(Chunk & chunk) peer_group_number = 1; // fmt::print(stderr, "reinitialize agg data at start of {}\n", -// new_partition_start); +// partition_start); // Reinitialize the aggregate function states because the new partition // has started. for (auto & ws : workspaces) @@ -1181,10 +1272,12 @@ IProcessor::Status WindowTransform::prepare() // next_output_block_number, first_not_ready_row, first_block_number, // blocks.size()); - if (output.isFinished()) + if (output.isFinished() || isCancelled()) { // The consumer asked us not to continue (or we decided it ourselves), - // so we abort. + // so we abort. Not sure what the difference between the two conditions + // is, but it seemed that output.isFinished() is not enough to cancel on + // Ctrl+C. Test manually if you change it. input.close(); return Status::Finished; } @@ -1313,13 +1406,16 @@ void WindowTransform::work() } // We don't really have to keep the entire partition, and it can be big, so - // we want to drop the starting blocks to save memory. - // We can drop the old blocks if we already returned them as output, and the - // frame and the current row are already past them. Note that the frame - // start can be further than current row for some frame specs (e.g. EXCLUDE - // CURRENT ROW), so we have to check both. + // we want to drop the starting blocks to save memory. We can drop the old + // blocks if we already returned them as output, and the frame and the + // current row are already past them. We also need to keep the previous + // frame start because we use it as the partition etalon. It is always less + // than the current frame start, so we don't have to check the latter. Note + // that the frame start can be further than current row for some frame specs + // (e.g. EXCLUDE CURRENT ROW), so we have to check both. + assert(prev_frame_start <= frame_start); const auto first_used_block = std::min(next_output_block_number, - std::min(frame_start.block, current_row.block)); + std::min(prev_frame_start.block, current_row.block)); if (first_block_number < first_used_block) { @@ -1332,6 +1428,7 @@ void WindowTransform::work() assert(next_output_block_number >= first_block_number); assert(frame_start.block >= first_block_number); + assert(prev_frame_start.block >= first_block_number); assert(current_row.block >= first_block_number); assert(peer_group_start.block >= first_block_number); } @@ -1475,12 +1572,21 @@ struct WindowFunctionLagLeadInFrame final : public WindowFunction return; } - if (!getLeastSupertype({argument_types[0], argument_types[2]})) + const auto supertype = getLeastSupertype({argument_types[0], argument_types[2]}); + if (!supertype) { throw Exception(ErrorCodes::BAD_ARGUMENTS, - "The default value type '{}' is not convertible to the argument type '{}'", - argument_types[2]->getName(), - argument_types[0]->getName()); + "There is no supertype for the argument type '{}' and the default value type '{}'", + argument_types[0]->getName(), + argument_types[2]->getName()); + } + if (!argument_types[0]->equals(*supertype)) + { + throw Exception(ErrorCodes::BAD_ARGUMENTS, + "The supertype '{}' for the argument type '{}' and the default value type '{}' is not the same as the argument type", + supertype->getName(), + argument_types[0]->getName(), + argument_types[2]->getName()); } if (argument_types.size() > 3) @@ -1491,8 +1597,7 @@ struct WindowFunctionLagLeadInFrame final : public WindowFunction } } - DataTypePtr getReturnType() const override - { return argument_types[0]; } + DataTypePtr getReturnType() const override { return argument_types[0]; } bool allocatesMemoryInArena() const override { return false; } @@ -1534,9 +1639,13 @@ struct WindowFunctionLagLeadInFrame final : public WindowFunction if (argument_types.size() > 2) { // Column with default values is specified. - to.insertFrom(*current_block.input_columns[ - workspace.argument_column_indices[2]], - transform->current_row.row); + // The conversion through Field is inefficient, but we accept + // subtypes of the argument type as a default value (for convenience), + // and it's a pain to write conversion that respects ColumnNothing + // and ColumnConst and so on. + const IColumn & default_column = *current_block.input_columns[ + workspace.argument_column_indices[2]].get(); + to.insert(default_column[transform->current_row.row]); } else { @@ -1553,6 +1662,74 @@ struct WindowFunctionLagLeadInFrame final : public WindowFunction } }; +struct WindowFunctionNthValue final : public WindowFunction +{ + WindowFunctionNthValue(const std::string & name_, + const DataTypes & argument_types_, const Array & parameters_) + : WindowFunction(name_, argument_types_, parameters_) + { + if (!parameters.empty()) + { + throw Exception(ErrorCodes::BAD_ARGUMENTS, + "Function {} cannot be parameterized", name_); + } + + if (argument_types.size() != 2) + { + throw Exception(ErrorCodes::BAD_ARGUMENTS, + "Function '{}' accepts 2 arguments, {} given", + name_, argument_types.size()); + } + } + + DataTypePtr getReturnType() const override + { return argument_types[0]; } + + bool allocatesMemoryInArena() const override { return false; } + + void windowInsertResultInto(const WindowTransform * transform, + size_t function_index) override + { + const auto & current_block = transform->blockAt(transform->current_row); + IColumn & to = *(current_block.output_columns[function_index]); + const auto & workspace = transform->workspaces[function_index]; + + int64_t offset = (*current_block.input_columns[ + workspace.argument_column_indices[1]])[ + transform->current_row.row].get() - 1; + + if (offset < 0) + { + throw Exception(ErrorCodes::BAD_ARGUMENTS, + "The offset for function {} must be non-negative, {} given", + getName(), offset); + } + + if (offset > INT_MAX) + { + throw Exception(ErrorCodes::BAD_ARGUMENTS, + "The offset for function {} must be less than {}, {} given", + getName(), INT_MAX, offset); + } + + const auto [target_row, offset_left] = transform->moveRowNumber(transform->frame_start, offset); + if (offset_left != 0 + || target_row < transform->frame_start + || transform->frame_end <= target_row) + { + // Offset is outside the frame. + to.insertDefault(); + } + else + { + // Offset is inside the frame. + to.insertFrom(*transform->blockAt(target_row).input_columns[ + workspace.argument_column_indices[0]], + target_row.row); + } + } +}; + void registerWindowFunctions(AggregateFunctionFactory & factory) { // Why didn't I implement lag/lead yet? Because they are a mess. I imagine @@ -1573,40 +1750,56 @@ void registerWindowFunctions(AggregateFunctionFactory & factory) // to a (rows between unbounded preceding and unbounded following) frame, // instead of adding separate logic for them. - factory.registerFunction("rank", [](const std::string & name, + const AggregateFunctionProperties properties = { + // By default, if an aggregate function has a null argument, it will be + // replaced with AggregateFunctionNothing. We don't need this behavior + // e.g. for lagInFrame(number, 1, null). + .returns_default_when_only_null = true, + // This probably doesn't make any difference for window functions because + // it is an Aggregator-specific setting. + .is_order_dependent = true }; + + factory.registerFunction("rank", {[](const std::string & name, const DataTypes & argument_types, const Array & parameters, const Settings *) { return std::make_shared(name, argument_types, parameters); - }); + }, properties}); - factory.registerFunction("dense_rank", [](const std::string & name, + factory.registerFunction("dense_rank", {[](const std::string & name, const DataTypes & argument_types, const Array & parameters, const Settings *) { return std::make_shared(name, argument_types, parameters); - }); + }, properties}); - factory.registerFunction("row_number", [](const std::string & name, + factory.registerFunction("row_number", {[](const std::string & name, const DataTypes & argument_types, const Array & parameters, const Settings *) { return std::make_shared(name, argument_types, parameters); - }); + }, properties}); - factory.registerFunction("lagInFrame", [](const std::string & name, + factory.registerFunction("lagInFrame", {[](const std::string & name, const DataTypes & argument_types, const Array & parameters, const Settings *) { return std::make_shared>( name, argument_types, parameters); - }); + }, properties}); - factory.registerFunction("leadInFrame", [](const std::string & name, + factory.registerFunction("leadInFrame", {[](const std::string & name, const DataTypes & argument_types, const Array & parameters, const Settings *) { return std::make_shared>( name, argument_types, parameters); - }); + }, properties}); + + factory.registerFunction("nth_value", {[](const std::string & name, + const DataTypes & argument_types, const Array & parameters, const Settings *) + { + return std::make_shared( + name, argument_types, parameters); + }, properties}); } } diff --git a/src/Processors/Transforms/WindowTransform.h b/src/Processors/Transforms/WindowTransform.h index 611b03ebf72..5dc78a34f78 100644 --- a/src/Processors/Transforms/WindowTransform.h +++ b/src/Processors/Transforms/WindowTransform.h @@ -80,8 +80,10 @@ struct RowNumber * the order of input data. This property also trivially holds for the ROWS and * GROUPS frames. For the RANGE frame, the proof requires the additional fact * that the ranges are specified in terms of (the single) ORDER BY column. + * + * `final` is so that the isCancelled() is devirtualized, we call it every row. */ -class WindowTransform : public IProcessor /* public ISimpleTransform */ +class WindowTransform final : public IProcessor { public: WindowTransform( @@ -139,7 +141,9 @@ public: } const Columns & inputAt(const RowNumber & x) const - { return const_cast(this)->inputAt(x); } + { + return const_cast(this)->inputAt(x); + } auto & blockAt(const uint64_t block_number) { @@ -149,13 +153,19 @@ public: } const auto & blockAt(const uint64_t block_number) const - { return const_cast(this)->blockAt(block_number); } + { + return const_cast(this)->blockAt(block_number); + } auto & blockAt(const RowNumber & x) - { return blockAt(x.block); } + { + return blockAt(x.block); + } const auto & blockAt(const RowNumber & x) const - { return const_cast(this)->blockAt(x); } + { + return const_cast(this)->blockAt(x); + } size_t blockRowsNumber(const RowNumber & x) const { @@ -225,10 +235,14 @@ public: } RowNumber blocksEnd() const - { return RowNumber{first_block_number + blocks.size(), 0}; } + { + return RowNumber{first_block_number + blocks.size(), 0}; + } RowNumber blocksBegin() const - { return RowNumber{first_block_number, 0}; } + { + return RowNumber{first_block_number, 0}; + } public: /* diff --git a/src/DataStreams/InputStreamFromASTInsertQuery.cpp b/src/Processors/Transforms/getSourceFromFromASTInsertQuery.cpp similarity index 69% rename from src/DataStreams/InputStreamFromASTInsertQuery.cpp rename to src/Processors/Transforms/getSourceFromFromASTInsertQuery.cpp index 0848d838276..8d8a4761657 100644 --- a/src/DataStreams/InputStreamFromASTInsertQuery.cpp +++ b/src/Processors/Transforms/getSourceFromFromASTInsertQuery.cpp @@ -1,13 +1,16 @@ #include #include #include +#include #include #include #include -#include -#include +#include +#include #include #include +#include +#include namespace DB @@ -20,7 +23,7 @@ namespace ErrorCodes } -InputStreamFromASTInsertQuery::InputStreamFromASTInsertQuery( +Pipe getSourceFromFromASTInsertQuery( const ASTPtr & ast, ReadBuffer * input_buffer_tail_part, const Block & header, @@ -42,7 +45,7 @@ InputStreamFromASTInsertQuery::InputStreamFromASTInsertQuery( /// Data could be in parsed (ast_insert_query.data) and in not parsed yet (input_buffer_tail_part) part of query. - input_buffer_ast_part = std::make_unique( + auto input_buffer_ast_part = std::make_unique( ast_insert_query->data, ast_insert_query->data ? ast_insert_query->end - ast_insert_query->data : 0); ConcatReadBuffer::ReadBuffers buffers; @@ -56,9 +59,10 @@ InputStreamFromASTInsertQuery::InputStreamFromASTInsertQuery( * - because 'query.data' could refer to memory piece, used as buffer for 'input_buffer_tail_part'. */ - input_buffer_contacenated = std::make_unique(buffers); + auto input_buffer_contacenated = std::make_unique(buffers); - res_stream = context->getInputFormat(format, *input_buffer_contacenated, header, context->getSettings().max_insert_block_size); + auto source = FormatFactory::instance().getInput(format, *input_buffer_contacenated, header, context, context->getSettings().max_insert_block_size); + Pipe pipe(source); if (context->getSettingsRef().input_format_defaults_for_omitted_fields && ast_insert_query->table_id && !input_function) { @@ -66,8 +70,18 @@ InputStreamFromASTInsertQuery::InputStreamFromASTInsertQuery( auto metadata_snapshot = storage->getInMemoryMetadataPtr(); const auto & columns = metadata_snapshot->getColumns(); if (columns.hasDefaults()) - res_stream = std::make_shared(res_stream, columns, context); + { + pipe.addSimpleTransform([&](const Block & cur_header) + { + return std::make_shared(cur_header, columns, *source, context); + }); + } } + + source->addBuffer(std::move(input_buffer_ast_part)); + source->addBuffer(std::move(input_buffer_contacenated)); + + return pipe; } } diff --git a/src/Processors/Transforms/getSourceFromFromASTInsertQuery.h b/src/Processors/Transforms/getSourceFromFromASTInsertQuery.h new file mode 100644 index 00000000000..3c00bd47ea0 --- /dev/null +++ b/src/Processors/Transforms/getSourceFromFromASTInsertQuery.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include +#include +#include + + +namespace DB +{ + +/** Prepares a pipe which produce data containing in INSERT query + * Head of inserting data could be stored in INSERT ast directly + * Remaining (tail) data could be stored in input_buffer_tail_part + */ + +class Pipe; + +Pipe getSourceFromFromASTInsertQuery( + const ASTPtr & ast, + ReadBuffer * input_buffer_tail_part, + const Block & header, + ContextPtr context, + const ASTPtr & input_function); + +} diff --git a/src/Processors/printPipeline.cpp b/src/Processors/printPipeline.cpp index 5cdab1ed3ff..cbf8cb3a77d 100644 --- a/src/Processors/printPipeline.cpp +++ b/src/Processors/printPipeline.cpp @@ -103,7 +103,7 @@ void printPipelineCompact(const Processors & processors, WriteBuffer & out, bool out << "digraph\n{\n"; out << " rankdir=\"LR\";\n"; - out << " { node [shape = box]\n"; + out << " { node [shape = rect]\n"; /// Nodes // TODO quoting and escaping size_t next_step = 0; diff --git a/src/Processors/printPipeline.h b/src/Processors/printPipeline.h index 9497bc3cc3c..6ff5fb24c37 100644 --- a/src/Processors/printPipeline.h +++ b/src/Processors/printPipeline.h @@ -16,7 +16,7 @@ void printPipeline(const Processors & processors, const Statuses & statuses, Wri { out << "digraph\n{\n"; out << " rankdir=\"LR\";\n"; - out << " { node [shape = box]\n"; + out << " { node [shape = rect]\n"; auto get_proc_id = [](const IProcessor & proc) -> UInt64 { diff --git a/src/Processors/tests/gtest_exception_on_incorrect_pipeline.cpp b/src/Processors/tests/gtest_exception_on_incorrect_pipeline.cpp index 3d85ffede9a..df3901e2eb1 100644 --- a/src/Processors/tests/gtest_exception_on_incorrect_pipeline.cpp +++ b/src/Processors/tests/gtest_exception_on_incorrect_pipeline.cpp @@ -1,7 +1,7 @@ #include #include -#include +#include #include #include diff --git a/src/Processors/ya.make b/src/Processors/ya.make index 86a40685d1f..db0ae80c742 100644 --- a/src/Processors/ya.make +++ b/src/Processors/ya.make @@ -7,8 +7,14 @@ PEERDIR( clickhouse/src/Common contrib/libs/msgpack contrib/libs/protobuf + contrib/libs/apache/arrow ) +ADDINCL( + contrib/libs/apache/arrow/src +) + +CFLAGS(-DUSE_ARROW=1) SRCS( Chunk.cpp @@ -25,8 +31,13 @@ SRCS( Formats/IOutputFormat.cpp Formats/IRowInputFormat.cpp Formats/IRowOutputFormat.cpp + Formats/Impl/ArrowBlockInputFormat.cpp + Formats/Impl/ArrowBlockOutputFormat.cpp + Formats/Impl/ArrowBufferedStreams.cpp + Formats/Impl/ArrowColumnToCHColumn.cpp Formats/Impl/BinaryRowInputFormat.cpp Formats/Impl/BinaryRowOutputFormat.cpp + Formats/Impl/CHColumnToArrowColumn.cpp Formats/Impl/CSVRowInputFormat.cpp Formats/Impl/CSVRowOutputFormat.cpp Formats/Impl/ConstantExpressionTemplate.cpp @@ -126,6 +137,7 @@ SRCS( QueryPlan/QueryPlan.cpp QueryPlan/ReadFromMergeTree.cpp QueryPlan/ReadFromPreparedSource.cpp + QueryPlan/ReadFromRemote.cpp QueryPlan/ReadNothingStep.cpp QueryPlan/RollupStep.cpp QueryPlan/SettingQuotaAndLimitsStep.cpp @@ -138,10 +150,12 @@ SRCS( Sources/SinkToOutputStream.cpp Sources/SourceFromInputStream.cpp Sources/SourceWithProgress.cpp + Transforms/AddingDefaultsTransform.cpp Transforms/AddingSelectorTransform.cpp Transforms/AggregatingInOrderTransform.cpp Transforms/AggregatingTransform.cpp Transforms/ArrayJoinTransform.cpp + Transforms/CheckSortedTransform.cpp Transforms/CopyTransform.cpp Transforms/CreatingSetsTransform.cpp Transforms/CubeTransform.cpp @@ -162,8 +176,10 @@ SRCS( Transforms/ReverseTransform.cpp Transforms/RollupTransform.cpp Transforms/SortingTransform.cpp + Transforms/SquashingChunksTransform.cpp Transforms/TotalsHavingTransform.cpp Transforms/WindowTransform.cpp + Transforms/getSourceFromFromASTInsertQuery.cpp printPipeline.cpp ) diff --git a/src/Processors/ya.make.in b/src/Processors/ya.make.in index 06230b96be8..7160e80bcce 100644 --- a/src/Processors/ya.make.in +++ b/src/Processors/ya.make.in @@ -6,11 +6,17 @@ PEERDIR( clickhouse/src/Common contrib/libs/msgpack contrib/libs/protobuf + contrib/libs/apache/arrow ) +ADDINCL( + contrib/libs/apache/arrow/src +) + +CFLAGS(-DUSE_ARROW=1) SRCS( - + ) END() diff --git a/src/Server/GRPCServer.cpp b/src/Server/GRPCServer.cpp index 82e5ed4d0db..b90b0c33f17 100644 --- a/src/Server/GRPCServer.cpp +++ b/src/Server/GRPCServer.cpp @@ -5,8 +5,10 @@ #include #include #include -#include +#include +#include #include +#include #include #include #include @@ -20,6 +22,10 @@ #include #include #include +#include +#include +#include +#include #include #include #include @@ -475,6 +481,40 @@ namespace }; + /// A boolean state protected by mutex able to wait until other thread sets it to a specific value. + class BoolState + { + public: + explicit BoolState(bool initial_value) : value(initial_value) {} + + bool get() const + { + std::lock_guard lock{mutex}; + return value; + } + + void set(bool new_value) + { + std::lock_guard lock{mutex}; + if (value == new_value) + return; + value = new_value; + changed.notify_all(); + } + + void wait(bool wanted_value) const + { + std::unique_lock lock{mutex}; + changed.wait(lock, [this, wanted_value]() { return value == wanted_value; }); + } + + private: + bool value; + mutable std::mutex mutex; + mutable std::condition_variable changed; + }; + + /// Handles a connection after a responder is started (i.e. after getting a new call). class Call { @@ -547,7 +587,8 @@ namespace std::optional read_buffer; std::optional write_buffer; - BlockInputStreamPtr block_input_stream; + std::unique_ptr pipeline; + std::unique_ptr pipeline_executor; BlockOutputStreamPtr block_output_stream; bool need_input_data_from_insert_query = true; bool need_input_data_from_query_info = true; @@ -558,18 +599,15 @@ namespace UInt64 waited_for_client_writing = 0; /// The following fields are accessed both from call_thread and queue_thread. - std::atomic reading_query_info = false; + BoolState reading_query_info{false}; std::atomic failed_to_read_query_info = false; GRPCQueryInfo next_query_info_while_reading; std::atomic want_to_cancel = false; std::atomic check_query_info_contains_cancel_only = false; - std::atomic sending_result = false; + BoolState sending_result{false}; std::atomic failed_to_send_result = false; ThreadFromGlobalPool call_thread; - std::condition_variable read_finished; - std::condition_variable write_finished; - std::mutex dummy_mutex; /// Doesn't protect anything. }; Call::Call(CallType call_type_, std::unique_ptr responder_, IServer & iserver_, Poco::Logger * log_) @@ -604,6 +642,7 @@ namespace { try { + setThreadName("GRPCServerCall"); receiveQuery(); executeQuery(); processInput(); @@ -755,16 +794,16 @@ namespace throw Exception("Unexpected context in Input initializer", ErrorCodes::LOGICAL_ERROR); input_function_is_used = true; initializeBlockInputStream(input_storage->getInMemoryMetadataPtr()->getSampleBlock()); - block_input_stream->readPrefix(); }); query_context->setInputBlocksReaderCallback([this](ContextPtr context) -> Block { if (context != query_context) throw Exception("Unexpected context in InputBlocksReader", ErrorCodes::LOGICAL_ERROR); - auto block = block_input_stream->read(); - if (!block) - block_input_stream->readSuffix(); + + Block block; + while (!block && pipeline_executor->pull(block)); + return block; }); @@ -797,13 +836,15 @@ namespace /// So we mustn't touch the input stream from other thread. initializeBlockInputStream(io.out->getHeader()); - block_input_stream->readPrefix(); io.out->writePrefix(); - while (auto block = block_input_stream->read()) - io.out->write(block); + Block block; + while (pipeline_executor->pull(block)) + { + if (block) + io.out->write(block); + } - block_input_stream->readSuffix(); io.out->writeSuffix(); } @@ -866,9 +907,11 @@ namespace return {nullptr, 0}; /// no more input data }); - assert(!block_input_stream); - block_input_stream = query_context->getInputFormat( - input_format, *read_buffer, header, query_context->getSettings().max_insert_block_size); + assert(!pipeline); + pipeline = std::make_unique(); + auto source = FormatFactory::instance().getInput( + input_format, *read_buffer, header, query_context, query_context->getSettings().max_insert_block_size); + pipeline->init(Pipe(source)); /// Add default values if necessary. if (ast) @@ -881,10 +924,17 @@ namespace StoragePtr storage = DatabaseCatalog::instance().getTable(table_id, query_context); const auto & columns = storage->getInMemoryMetadataPtr()->getColumns(); if (!columns.empty()) - block_input_stream = std::make_shared(block_input_stream, columns, query_context); + { + pipeline->addSimpleTransform([&](const Block & cur_header) + { + return std::make_shared(cur_header, columns, *source, query_context); + }); + } } } } + + pipeline_executor = std::make_unique(*pipeline); } void Call::createExternalTables() @@ -927,7 +977,7 @@ namespace { /// The data will be written directly to the table. auto metadata_snapshot = storage->getInMemoryMetadataPtr(); - auto out_stream = storage->write(ASTPtr(), metadata_snapshot, query_context); + auto out_stream = std::make_shared(storage->write(ASTPtr(), metadata_snapshot, query_context)); ReadBufferFromMemory data(external_table.data().data(), external_table.data().size()); String format = external_table.format(); if (format.empty()) @@ -1150,7 +1200,7 @@ namespace { io.onException(); - LOG_ERROR(log, "Code: {}, e.displayText() = {}, Stack trace:\n\n{}", exception.code(), exception.displayText(), exception.getStackTraceString()); + LOG_ERROR(log, getExceptionMessage(exception, true)); if (responder && !responder_finished) { @@ -1196,7 +1246,8 @@ namespace void Call::close() { responder.reset(); - block_input_stream.reset(); + pipeline_executor.reset(); + pipeline.reset(); block_output_stream.reset(); read_buffer.reset(); write_buffer.reset(); @@ -1212,8 +1263,7 @@ namespace { auto start_reading = [&] { - assert(!reading_query_info); - reading_query_info = true; + reading_query_info.set(true); responder->read(next_query_info_while_reading, [this](bool ok) { /// Called on queue_thread. @@ -1238,18 +1288,16 @@ namespace /// on queue_thread. failed_to_read_query_info = true; } - reading_query_info = false; - read_finished.notify_one(); + reading_query_info.set(false); }); }; auto finish_reading = [&] { - if (reading_query_info) + if (reading_query_info.get()) { Stopwatch client_writing_watch; - std::unique_lock lock{dummy_mutex}; - read_finished.wait(lock, [this] { return !reading_query_info; }); + reading_query_info.wait(false); waited_for_client_writing += client_writing_watch.elapsedNanoseconds(); } throwIfFailedToReadQueryInfo(); @@ -1412,11 +1460,10 @@ namespace /// Wait for previous write to finish. /// (gRPC doesn't allow to start sending another result while the previous is still being sending.) - if (sending_result) + if (sending_result.get()) { Stopwatch client_reading_watch; - std::unique_lock lock{dummy_mutex}; - write_finished.wait(lock, [this] { return !sending_result; }); + sending_result.wait(false); waited_for_client_reading += client_reading_watch.elapsedNanoseconds(); } throwIfFailedToSendResult(); @@ -1427,14 +1474,13 @@ namespace if (write_buffer) write_buffer->finalize(); - sending_result = true; + sending_result.set(true); auto callback = [this](bool ok) { /// Called on queue_thread. if (!ok) failed_to_send_result = true; - sending_result = false; - write_finished.notify_one(); + sending_result.set(false); }; Stopwatch client_reading_final_watch; @@ -1454,8 +1500,7 @@ namespace if (send_final_message) { /// Wait until the result is actually sent. - std::unique_lock lock{dummy_mutex}; - write_finished.wait(lock, [this] { return !sending_result; }); + sending_result.wait(false); waited_for_client_reading += client_reading_final_watch.elapsedNanoseconds(); throwIfFailedToSendResult(); LOG_TRACE(log, "Final result has been sent to the client"); @@ -1566,7 +1611,7 @@ private: { /// Called on call_thread. That's why we can't destroy the `call` right now /// (thread can't join to itself). Thus here we only move the `call` from - /// `current_call` to `finished_calls` and run() will actually destroy the `call`. + /// `current_calls` to `finished_calls` and run() will actually destroy the `call`. std::lock_guard lock{mutex}; auto it = current_calls.find(call); finished_calls.push_back(std::move(it->second)); @@ -1575,6 +1620,7 @@ private: void run() { + setThreadName("GRPCServerQueue"); while (true) { { diff --git a/src/Server/HTTPHandler.cpp b/src/Server/HTTPHandler.cpp index ad38cfb341a..7c9ff0637f0 100644 --- a/src/Server/HTTPHandler.cpp +++ b/src/Server/HTTPHandler.cpp @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include @@ -945,7 +944,9 @@ bool DynamicQueryHandler::customizeQueryParam(ContextMutablePtr context, const s { /// Save name and values of substitution in dictionary. const String parameter_name = key.substr(strlen("param_")); - context->setQueryParameter(parameter_name, value); + + if (!context->getQueryParameters().contains(parameter_name)) + context->setQueryParameter(parameter_name, value); return true; } @@ -971,8 +972,16 @@ std::string DynamicQueryHandler::getQuery(HTTPServerRequest & request, HTMLForm std::string full_query; /// Params are of both form params POST and uri (GET params) for (const auto & it : params) + { if (it.first == param_name) + { full_query += it.second; + } + else + { + customizeQueryParam(context, it.first, it.second); + } + } return full_query; } diff --git a/src/Server/KeeperTCPHandler.cpp b/src/Server/KeeperTCPHandler.cpp index 2d5f41fe666..df40a78749b 100644 --- a/src/Server/KeeperTCPHandler.cpp +++ b/src/Server/KeeperTCPHandler.cpp @@ -195,8 +195,8 @@ KeeperTCPHandler::KeeperTCPHandler(IServer & server_, const Poco::Net::StreamSoc , log(&Poco::Logger::get("NuKeeperTCPHandler")) , global_context(Context::createCopy(server.context())) , keeper_dispatcher(global_context->getKeeperStorageDispatcher()) - , operation_timeout(0, global_context->getConfigRef().getUInt("test_keeper_server.operation_timeout_ms", Coordination::DEFAULT_OPERATION_TIMEOUT_MS) * 1000) - , session_timeout(0, global_context->getConfigRef().getUInt("test_keeper_server.session_timeout_ms", Coordination::DEFAULT_SESSION_TIMEOUT_MS) * 1000) + , operation_timeout(0, global_context->getConfigRef().getUInt("keeper_server.operation_timeout_ms", Coordination::DEFAULT_OPERATION_TIMEOUT_MS) * 1000) + , session_timeout(0, global_context->getConfigRef().getUInt("keeper_server.session_timeout_ms", Coordination::DEFAULT_SESSION_TIMEOUT_MS) * 1000) , poll_wrapper(std::make_unique(socket_)) , responses(std::make_unique()) { diff --git a/src/Server/MySQLHandler.cpp b/src/Server/MySQLHandler.cpp index beace5dd576..52182257ac9 100644 --- a/src/Server/MySQLHandler.cpp +++ b/src/Server/MySQLHandler.cpp @@ -1,8 +1,6 @@ #include "MySQLHandler.h" #include -#include -#include #include #include #include @@ -10,7 +8,6 @@ #include #include #include -#include #include #include #include @@ -20,7 +17,6 @@ #include #include #include -#include #include #include #include @@ -31,7 +27,6 @@ #endif #if USE_SSL -# include # include # include # include @@ -57,6 +52,7 @@ namespace ErrorCodes extern const int NOT_IMPLEMENTED; extern const int MYSQL_CLIENT_INSUFFICIENT_CAPABILITIES; extern const int SUPPORT_IS_DISABLED; + extern const int UNSUPPORTED_METHOD; } @@ -73,13 +69,13 @@ MySQLHandler::MySQLHandler(IServer & server_, const Poco::Net::StreamSocket & so : Poco::Net::TCPServerConnection(socket_) , server(server_) , log(&Poco::Logger::get("MySQLHandler")) - , connection_context(Context::createCopy(server.context())) , connection_id(connection_id_) + , connection_context(Context::createCopy(server.context())) , auth_plugin(new MySQLProtocol::Authentication::Native41()) { - server_capability_flags = CLIENT_PROTOCOL_41 | CLIENT_SECURE_CONNECTION | CLIENT_PLUGIN_AUTH | CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA | CLIENT_CONNECT_WITH_DB | CLIENT_DEPRECATE_EOF; + server_capabilities = CLIENT_PROTOCOL_41 | CLIENT_SECURE_CONNECTION | CLIENT_PLUGIN_AUTH | CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA | CLIENT_CONNECT_WITH_DB | CLIENT_DEPRECATE_EOF; if (ssl_enabled) - server_capability_flags |= CLIENT_SSL; + server_capabilities |= CLIENT_SSL; replacements.emplace("KILL QUERY", killConnectionIdReplacementQuery); replacements.emplace("SHOW TABLE STATUS LIKE", showTableStatusReplacementQuery); @@ -95,14 +91,15 @@ void MySQLHandler::run() connection_context->getClientInfo().interface = ClientInfo::Interface::MYSQL; connection_context->setDefaultFormat("MySQLWire"); connection_context->getClientInfo().connection_id = connection_id; + connection_context->getClientInfo().query_kind = ClientInfo::QueryKind::INITIAL_QUERY; in = std::make_shared(socket()); out = std::make_shared(socket()); - packet_endpoint = std::make_shared(*in, *out, connection_context->mysql.sequence_id); + packet_endpoint = MySQLProtocol::PacketEndpoint::create(*in, *out, sequence_id); try { - Handshake handshake(server_capability_flags, connection_id, VERSION_STRING + String("-") + VERSION_NAME, + Handshake handshake(server_capabilities, connection_id, VERSION_STRING + String("-") + VERSION_NAME, auth_plugin->getName(), auth_plugin->getAuthPluginData(), CharacterSet::utf8_general_ci); packet_endpoint->sendPacket(handshake, true); @@ -110,11 +107,8 @@ void MySQLHandler::run() HandshakeResponse handshake_response; finishHandshake(handshake_response); - connection_context->mysql.client_capabilities = handshake_response.capability_flags; - if (handshake_response.max_packet_size) - connection_context->mysql.max_packet_size = handshake_response.max_packet_size; - if (!connection_context->mysql.max_packet_size) - connection_context->mysql.max_packet_size = MAX_PACKET_LENGTH; + client_capabilities = handshake_response.capability_flags; + max_packet_size = handshake_response.max_packet_size ? handshake_response.max_packet_size : MAX_PACKET_LENGTH; LOG_TRACE(log, "Capabilities: {}, max_packet_size: {}, character_set: {}, user: {}, auth_response length: {}, database: {}, auth_plugin_name: {}", @@ -126,8 +120,7 @@ void MySQLHandler::run() handshake_response.database, handshake_response.auth_plugin_name); - client_capability_flags = handshake_response.capability_flags; - if (!(client_capability_flags & CLIENT_PROTOCOL_41)) + if (!(client_capabilities & CLIENT_PROTOCOL_41)) throw Exception("Required capability: CLIENT_PROTOCOL_41.", ErrorCodes::MYSQL_CLIENT_INSUFFICIENT_CAPABILITIES); authenticate(handshake_response.username, handshake_response.auth_plugin_name, handshake_response.auth_response); @@ -281,7 +274,7 @@ void MySQLHandler::comInitDB(ReadBuffer & payload) readStringUntilEOF(database, payload); LOG_DEBUG(log, "Setting current database to {}", database); connection_context->setCurrentDatabase(database); - packet_endpoint->sendPacket(OKPacket(0, client_capability_flags, 0, 0, 1), true); + packet_endpoint->sendPacket(OKPacket(0, client_capabilities, 0, 0, 1), true); } void MySQLHandler::comFieldList(ReadBuffer & payload) @@ -298,12 +291,12 @@ void MySQLHandler::comFieldList(ReadBuffer & payload) ); packet_endpoint->sendPacket(column_definition); } - packet_endpoint->sendPacket(OKPacket(0xfe, client_capability_flags, 0, 0, 0), true); + packet_endpoint->sendPacket(OKPacket(0xfe, client_capabilities, 0, 0, 0), true); } void MySQLHandler::comPing() { - packet_endpoint->sendPacket(OKPacket(0x0, client_capability_flags, 0, 0, 0), true); + packet_endpoint->sendPacket(OKPacket(0x0, client_capabilities, 0, 0, 0), true); } static bool isFederatedServerSetupSetCommand(const String & query); @@ -316,7 +309,7 @@ void MySQLHandler::comQuery(ReadBuffer & payload) // As Clickhouse doesn't support these statements, we just send OK packet in response. if (isFederatedServerSetupSetCommand(query)) { - packet_endpoint->sendPacket(OKPacket(0x00, client_capability_flags, 0, 0, 0), true); + packet_endpoint->sendPacket(OKPacket(0x00, client_capabilities, 0, 0, 0), true); } else { @@ -350,15 +343,22 @@ void MySQLHandler::comQuery(ReadBuffer & payload) CurrentThread::QueryScope query_scope{query_context}; - executeQuery(should_replace ? replacement : payload, *out, false, query_context, - [&with_output](const String &, const String &, const String &, const String &) - { - with_output = true; - } - ); + FormatSettings format_settings; + format_settings.mysql_wire.client_capabilities = client_capabilities; + format_settings.mysql_wire.max_packet_size = max_packet_size; + format_settings.mysql_wire.sequence_id = &sequence_id; + + auto set_result_details = [&with_output](const String &, const String &, const String &format, const String &) + { + if (format != "MySQLWire") + throw Exception(ErrorCodes::UNSUPPORTED_METHOD, "MySQL protocol does not support custom output formats"); + with_output = true; + }; + + executeQuery(should_replace ? replacement : payload, *out, false, query_context, set_result_details, format_settings); if (!with_output) - packet_endpoint->sendPacket(OKPacket(0x00, client_capability_flags, affected_rows, 0, 0), true); + packet_endpoint->sendPacket(OKPacket(0x00, client_capabilities, affected_rows, 0, 0), true); } } @@ -395,14 +395,14 @@ void MySQLHandlerSSL::finishHandshakeSSL( ReadBufferFromMemory payload(buf, pos); payload.ignore(PACKET_HEADER_SIZE); ssl_request.readPayloadWithUnpacked(payload); - connection_context->mysql.client_capabilities = ssl_request.capability_flags; - connection_context->mysql.max_packet_size = ssl_request.max_packet_size ? ssl_request.max_packet_size : MAX_PACKET_LENGTH; + client_capabilities = ssl_request.capability_flags; + max_packet_size = ssl_request.max_packet_size ? ssl_request.max_packet_size : MAX_PACKET_LENGTH; secure_connection = true; ss = std::make_shared(SecureStreamSocket::attach(socket(), SSLManager::instance().defaultServerContext())); in = std::make_shared(*ss); out = std::make_shared(*ss); - connection_context->mysql.sequence_id = 2; - packet_endpoint = std::make_shared(*in, *out, connection_context->mysql.sequence_id); + sequence_id = 2; + packet_endpoint = MySQLProtocol::PacketEndpoint::create(*in, *out, sequence_id); packet_endpoint->receivePacket(packet); /// Reading HandshakeResponse from secure socket. } diff --git a/src/Server/MySQLHandler.h b/src/Server/MySQLHandler.h index e681ad2e6f6..96467797105 100644 --- a/src/Server/MySQLHandler.h +++ b/src/Server/MySQLHandler.h @@ -32,7 +32,7 @@ public: void run() final; -private: +protected: CurrentMetrics::Increment metric_increment{CurrentMetrics::MySQLConnection}; /// Enables SSL, if client requested. @@ -52,32 +52,25 @@ private: virtual void finishHandshakeSSL(size_t packet_size, char * buf, size_t pos, std::function read_bytes, MySQLProtocol::ConnectionPhase::HandshakeResponse & packet); IServer & server; - -protected: Poco::Logger * log; - - ContextMutablePtr connection_context; - - std::shared_ptr packet_endpoint; - -private: UInt64 connection_id = 0; - size_t server_capability_flags = 0; - size_t client_capability_flags = 0; + uint32_t server_capabilities = 0; + uint32_t client_capabilities = 0; + size_t max_packet_size = 0; + uint8_t sequence_id = 0; -protected: - std::unique_ptr auth_plugin; + MySQLProtocol::PacketEndpointPtr packet_endpoint; + ContextMutablePtr connection_context; - std::shared_ptr in; - std::shared_ptr out; - - bool secure_connection = false; - -private: using ReplacementFn = std::function; using Replacements = std::unordered_map; Replacements replacements; + + std::unique_ptr auth_plugin; + std::shared_ptr in; + std::shared_ptr out; + bool secure_connection = false; }; #if USE_SSL diff --git a/src/Server/PostgreSQLHandler.cpp b/src/Server/PostgreSQLHandler.cpp index 01887444c65..1e98ed2e134 100644 --- a/src/Server/PostgreSQLHandler.cpp +++ b/src/Server/PostgreSQLHandler.cpp @@ -55,6 +55,7 @@ void PostgreSQLHandler::run() connection_context->makeSessionContext(); connection_context->getClientInfo().interface = ClientInfo::Interface::POSTGRESQL; connection_context->setDefaultFormat("PostgreSQLWire"); + connection_context->getClientInfo().query_kind = ClientInfo::QueryKind::INITIAL_QUERY; try { diff --git a/src/Server/PrometheusMetricsWriter.cpp b/src/Server/PrometheusMetricsWriter.cpp index 787f0fcd95e..30ae6f6fe42 100644 --- a/src/Server/PrometheusMetricsWriter.cpp +++ b/src/Server/PrometheusMetricsWriter.cpp @@ -4,7 +4,7 @@ #include #include -#include +#include namespace { @@ -24,9 +24,13 @@ void writeOutLine(DB::WriteBuffer & wb, T && val, TArgs &&... args) writeOutLine(wb, std::forward(args)...); } -void replaceInvalidChars(std::string & metric_name) +/// Returns false if name is not valid +bool replaceInvalidChars(std::string & metric_name) { - std::replace(metric_name.begin(), metric_name.end(), '.', '_'); + /// dirty solution + metric_name = std::regex_replace(metric_name, std::regex("[^a-zA-Z0-9_:]"), "_"); + metric_name = std::regex_replace(metric_name, std::regex("^[^a-zA-Z]*"), ""); + return !metric_name.empty(); } } @@ -57,7 +61,8 @@ void PrometheusMetricsWriter::write(WriteBuffer & wb) const std::string metric_name{ProfileEvents::getName(static_cast(i))}; std::string metric_doc{ProfileEvents::getDocumentation(static_cast(i))}; - replaceInvalidChars(metric_name); + if (!replaceInvalidChars(metric_name)) + continue; std::string key{profile_events_prefix + metric_name}; writeOutLine(wb, "# HELP", key, metric_doc); @@ -75,7 +80,8 @@ void PrometheusMetricsWriter::write(WriteBuffer & wb) const std::string metric_name{CurrentMetrics::getName(static_cast(i))}; std::string metric_doc{CurrentMetrics::getDocumentation(static_cast(i))}; - replaceInvalidChars(metric_name); + if (!replaceInvalidChars(metric_name)) + continue; std::string key{current_metrics_prefix + metric_name}; writeOutLine(wb, "# HELP", key, metric_doc); @@ -91,7 +97,8 @@ void PrometheusMetricsWriter::write(WriteBuffer & wb) const { std::string key{asynchronous_metrics_prefix + name_value.first}; - replaceInvalidChars(key); + if (!replaceInvalidChars(key)) + continue; auto value = name_value.second; // TODO: add HELP section? asynchronous_metrics contains only key and value @@ -108,7 +115,8 @@ void PrometheusMetricsWriter::write(WriteBuffer & wb) const std::string metric_name{CurrentStatusInfo::getName(static_cast(i))}; std::string metric_doc{CurrentStatusInfo::getDocumentation(static_cast(i))}; - replaceInvalidChars(metric_name); + if (!replaceInvalidChars(metric_name)) + continue; std::string key{current_status_prefix + metric_name}; writeOutLine(wb, "# HELP", key, metric_doc); diff --git a/src/Server/TCPHandler.cpp b/src/Server/TCPHandler.cpp index 108b7b8070a..0339b144f09 100644 --- a/src/Server/TCPHandler.cpp +++ b/src/Server/TCPHandler.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -31,6 +32,7 @@ #include #include #include +#include #include @@ -45,6 +47,27 @@ namespace DB { +namespace +{ +std::string formatHTTPErrorResponse(const Poco::Util::AbstractConfiguration& config) +{ + std::string result = fmt::format( + "HTTP/1.0 400 Bad Request\r\n\r\n" + "Port {} is for clickhouse-client program\r\n", + config.getString("tcp_port")); + + if (config.has("http_port")) + { + result += fmt::format( + "You must use port {} for HTTP.\r\n", + config.getString("http_port")); + } + + return result; +} +} + + namespace ErrorCodes { extern const int LOGICAL_ERROR; @@ -149,7 +172,7 @@ void TCPHandler::runImpl() if (!DatabaseCatalog::instance().isDatabaseExist(default_database)) { Exception e("Database " + backQuote(default_database) + " doesn't exist", ErrorCodes::UNKNOWN_DATABASE); - LOG_ERROR(log, "Code: {}, e.displayText() = {}, Stack trace:\n\n{}", e.code(), e.displayText(), e.getStackTraceString()); + LOG_ERROR(log, getExceptionMessage(e, true)); sendException(e, connection_context->getSettingsRef().calculate_text_stack_trace); return; } @@ -422,7 +445,7 @@ void TCPHandler::runImpl() } const auto & e = *exception; - LOG_ERROR(log, "Code: {}, e.displayText() = {}, Stack trace:\n\n{}", e.code(), e.displayText(), e.getStackTraceString()); + LOG_ERROR(log, getExceptionMessage(e, true)); sendException(*exception, send_exception_with_stack_trace); } } @@ -921,10 +944,8 @@ void TCPHandler::receiveHello() */ if (packet_type == 'G' || packet_type == 'P') { - writeString("HTTP/1.0 400 Bad Request\r\n\r\n" - "Port " + server.config().getString("tcp_port") + " is for clickhouse-client program.\r\n" - "You must use port " + server.config().getString("http_port") + " for HTTP.\r\n", - *out); + writeString(formatHTTPErrorResponse(server.config()), + *out); throw Exception("Client has connected to wrong port", ErrorCodes::CLIENT_HAS_CONNECTED_TO_WRONG_PORT); } @@ -1026,7 +1047,17 @@ bool TCPHandler::receivePacket() return false; case Protocol::Client::Cancel: + { + /// For testing connection collector. + const Settings & settings = query_context->getSettingsRef(); + if (settings.sleep_in_receive_cancel_ms.totalMilliseconds()) + { + std::chrono::milliseconds ms(settings.sleep_in_receive_cancel_ms.totalMilliseconds()); + std::this_thread::sleep_for(ms); + } + return false; + } case Protocol::Client::Hello: receiveUnexpectedHello(); @@ -1063,6 +1094,13 @@ String TCPHandler::receiveReadTaskResponseAssumeLocked() if (packet_type == Protocol::Client::Cancel) { state.is_cancelled = true; + /// For testing connection collector. + const Settings & settings = query_context->getSettingsRef(); + if (settings.sleep_in_receive_cancel_ms.totalMilliseconds()) + { + std::chrono::milliseconds ms(settings.sleep_in_receive_cancel_ms.totalMilliseconds()); + std::this_thread::sleep_for(ms); + } return {}; } else @@ -1313,7 +1351,7 @@ bool TCPHandler::receiveData(bool scalar) } auto metadata_snapshot = storage->getInMemoryMetadataPtr(); /// The data will be written directly to the table. - auto temporary_table_out = storage->write(ASTPtr(), metadata_snapshot, query_context); + auto temporary_table_out = std::make_shared(storage->write(ASTPtr(), metadata_snapshot, query_context)); temporary_table_out->write(block); temporary_table_out->writeSuffix(); @@ -1461,6 +1499,16 @@ bool TCPHandler::isQueryCancelled() throw NetException("Unexpected packet Cancel received from client", ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT); LOG_INFO(log, "Query was cancelled."); state.is_cancelled = true; + /// For testing connection collector. + { + const Settings & settings = query_context->getSettingsRef(); + if (settings.sleep_in_receive_cancel_ms.totalMilliseconds()) + { + std::chrono::milliseconds ms(settings.sleep_in_receive_cancel_ms.totalMilliseconds()); + std::this_thread::sleep_for(ms); + } + } + return true; default: diff --git a/src/Server/grpc_protos/clickhouse_grpc.proto b/src/Server/grpc_protos/clickhouse_grpc.proto index 2f25973297c..da01432d76c 100644 --- a/src/Server/grpc_protos/clickhouse_grpc.proto +++ b/src/Server/grpc_protos/clickhouse_grpc.proto @@ -32,7 +32,7 @@ message ExternalTable { // Data to insert to the external table. // If a method with streaming input (i.e. ExecuteQueryWithStreamInput() or ExecuteQueryWithStreamIO()) is used, // then data for insertion to the same external table can be split between multiple QueryInfos. - string data = 3; + bytes data = 3; // Format of the data to insert to the external table. string format = 4; @@ -53,10 +53,10 @@ message QueryInfo { string database = 4; // Input data, used both as data for INSERT query and as data for the input() function. - string input_data = 5; + bytes input_data = 5; // Delimiter for input_data, inserted between input_data from adjacent QueryInfos. - string input_data_delimiter = 6; + bytes input_data_delimiter = 6; // Default output format. If not specified, 'TabSeparated' is used. string output_format = 7; @@ -128,9 +128,9 @@ message Exception { // Result of execution of a query which is sent back by the ClickHouse server to the client. message Result { // Output of the query, represented in the `output_format` or in a format specified in `query`. - string output = 1; - string totals = 2; - string extremes = 3; + bytes output = 1; + bytes totals = 2; + bytes extremes = 3; repeated LogEntry logs = 4; Progress progress = 5; diff --git a/src/Storages/AlterCommands.cpp b/src/Storages/AlterCommands.cpp index 9e9510b51a4..1bb8e6bb9b0 100644 --- a/src/Storages/AlterCommands.cpp +++ b/src/Storages/AlterCommands.cpp @@ -1276,6 +1276,11 @@ void AlterCommands::validate(const StorageInMemoryMetadata & metadata, ContextPt validateColumnsDefaultsAndGetSampleBlock(default_expr_list, all_columns.getAll(), context); } +bool AlterCommands::hasSettingsAlterCommand() const +{ + return std::any_of(begin(), end(), [](const AlterCommand & c) { return c.isSettingsAlter(); }); +} + bool AlterCommands::isSettingsAlter() const { return std::all_of(begin(), end(), [](const AlterCommand & c) { return c.isSettingsAlter(); }); diff --git a/src/Storages/AlterCommands.h b/src/Storages/AlterCommands.h index 6987de68f9c..60f4ad7d552 100644 --- a/src/Storages/AlterCommands.h +++ b/src/Storages/AlterCommands.h @@ -195,9 +195,12 @@ public: void apply(StorageInMemoryMetadata & metadata, ContextPtr context) const; /// At least one command modify settings. + bool hasSettingsAlterCommand() const; + + /// All commands modify settings only. bool isSettingsAlter() const; - /// At least one command modify comments. + /// All commands modify comments only. bool isCommentAlter() const; /// Return mutation commands which some storages may execute as part of diff --git a/src/Storages/ColumnsDescription.cpp b/src/Storages/ColumnsDescription.cpp index 179204a1a0b..c05441148df 100644 --- a/src/Storages/ColumnsDescription.cpp +++ b/src/Storages/ColumnsDescription.cpp @@ -168,7 +168,7 @@ ColumnsDescription::ColumnsDescription(NamesAndTypesList ordinary, NamesAndAlias /// We are trying to find first column from end with name `column_name` or with a name beginning with `column_name` and ".". /// For example "fruits.bananas" /// names are considered the same if they completely match or `name_without_dot` matches the part of the name to the point -static auto getNameRange(const ColumnsDescription::Container & columns, const String & name_without_dot) +static auto getNameRange(const ColumnsDescription::ColumnsContainer & columns, const String & name_without_dot) { String name_with_dot = name_without_dot + "."; @@ -228,7 +228,7 @@ void ColumnsDescription::remove(const String & column_name) for (auto list_it = range.first; list_it != range.second;) { - removeSubcolumns(list_it->name, list_it->type); + removeSubcolumns(list_it->name); list_it = columns.get<0>().erase(list_it); } } @@ -303,7 +303,7 @@ void ColumnsDescription::flattenNested() } ColumnDescription column = std::move(*it); - removeSubcolumns(column.name, column.type); + removeSubcolumns(column.name); it = columns.get<0>().erase(it); const DataTypes & elements = type_tuple->getElements(); @@ -372,12 +372,7 @@ bool ColumnsDescription::hasNested(const String & column_name) const bool ColumnsDescription::hasSubcolumn(const String & column_name) const { - return subcolumns.find(column_name) != subcolumns.end(); -} - -bool ColumnsDescription::hasInStorageOrSubcolumn(const String & column_name) const -{ - return has(column_name) || hasSubcolumn(column_name); + return subcolumns.get<0>().count(column_name); } const ColumnDescription & ColumnsDescription::get(const String & column_name) const @@ -390,6 +385,50 @@ const ColumnDescription & ColumnsDescription::get(const String & column_name) co return *it; } +static ColumnsDescription::GetFlags defaultKindToGetFlag(ColumnDefaultKind kind) +{ + switch (kind) + { + case ColumnDefaultKind::Default: + return ColumnsDescription::Ordinary; + case ColumnDefaultKind::Materialized: + return ColumnsDescription::Materialized; + case ColumnDefaultKind::Alias: + return ColumnsDescription::Aliases; + } + __builtin_unreachable(); +} + +NamesAndTypesList ColumnsDescription::getByNames(GetFlags flags, const Names & names, bool with_subcolumns) const +{ + NamesAndTypesList res; + for (const auto & name : names) + { + if (auto it = columns.get<1>().find(name); it != columns.get<1>().end()) + { + auto kind = defaultKindToGetFlag(it->default_desc.kind); + if (flags & kind) + { + res.emplace_back(name, it->type); + continue; + } + } + else if (with_subcolumns) + { + auto jt = subcolumns.get<0>().find(name); + if (jt != subcolumns.get<0>().end()) + { + res.push_back(*jt); + continue; + } + } + + throw Exception(ErrorCodes::NO_SUCH_COLUMN_IN_TABLE, "There is no column {} in table", name); + } + + return res; +} + NamesAndTypesList ColumnsDescription::getAllPhysical() const { @@ -409,29 +448,46 @@ Names ColumnsDescription::getNamesOfPhysical() const return ret; } -NameAndTypePair ColumnsDescription::getPhysical(const String & column_name) const +std::optional ColumnsDescription::tryGetColumnOrSubcolumn(GetFlags flags, const String & column_name) const +{ + auto it = columns.get<1>().find(column_name); + if (it != columns.get<1>().end() && (defaultKindToGetFlag(it->default_desc.kind) & flags)) + return NameAndTypePair(it->name, it->type); + + auto jt = subcolumns.get<0>().find(column_name); + if (jt != subcolumns.get<0>().end()) + return *jt; + + return {}; +} + +NameAndTypePair ColumnsDescription::getColumnOrSubcolumn(GetFlags flags, const String & column_name) const +{ + auto column = tryGetColumnOrSubcolumn(flags, column_name); + if (!column) + throw Exception(ErrorCodes::NO_SUCH_COLUMN_IN_TABLE, + "There is no column or subcolumn {} in table.", column_name); + + return *column; +} + +std::optional ColumnsDescription::tryGetPhysical(const String & column_name) const { auto it = columns.get<1>().find(column_name); if (it == columns.get<1>().end() || it->default_desc.kind == ColumnDefaultKind::Alias) - throw Exception("There is no physical column " + column_name + " in table.", ErrorCodes::NO_SUCH_COLUMN_IN_TABLE); + return {}; + return NameAndTypePair(it->name, it->type); } -NameAndTypePair ColumnsDescription::getPhysicalOrSubcolumn(const String & column_name) const +NameAndTypePair ColumnsDescription::getPhysical(const String & column_name) const { - if (auto it = columns.get<1>().find(column_name); it != columns.get<1>().end() - && it->default_desc.kind != ColumnDefaultKind::Alias) - { - return NameAndTypePair(it->name, it->type); - } + auto column = tryGetPhysical(column_name); + if (!column) + throw Exception(ErrorCodes::NO_SUCH_COLUMN_IN_TABLE, + "There is no physical column {} in table.", column_name); - if (auto it = subcolumns.find(column_name); it != subcolumns.end()) - { - return it->second; - } - - throw Exception(ErrorCodes::NO_SUCH_COLUMN_IN_TABLE, - "There is no physical column or subcolumn {} in table.", column_name); + return *column; } bool ColumnsDescription::hasPhysical(const String & column_name) const @@ -440,32 +496,39 @@ bool ColumnsDescription::hasPhysical(const String & column_name) const return it != columns.get<1>().end() && it->default_desc.kind != ColumnDefaultKind::Alias; } -bool ColumnsDescription::hasPhysicalOrSubcolumn(const String & column_name) const +bool ColumnsDescription::hasColumnOrSubcolumn(GetFlags flags, const String & column_name) const { - return hasPhysical(column_name) || subcolumns.find(column_name) != subcolumns.end(); + auto it = columns.get<1>().find(column_name); + return (it != columns.get<1>().end() + && (defaultKindToGetFlag(it->default_desc.kind) & flags)) + || hasSubcolumn(column_name); } -static NamesAndTypesList getWithSubcolumns(NamesAndTypesList && source_list) +void ColumnsDescription::addSubcolumnsToList(NamesAndTypesList & source_list) const { - NamesAndTypesList ret; + NamesAndTypesList subcolumns_list; for (const auto & col : source_list) { - ret.emplace_back(col.name, col.type); - for (const auto & subcolumn : col.type->getSubcolumnNames()) - ret.emplace_back(col.name, subcolumn, col.type, col.type->getSubcolumnType(subcolumn)); + auto range = subcolumns.get<1>().equal_range(col.name); + if (range.first != range.second) + subcolumns_list.insert(subcolumns_list.end(), range.first, range.second); } - return ret; + source_list.splice(source_list.end(), std::move(subcolumns_list)); } NamesAndTypesList ColumnsDescription::getAllWithSubcolumns() const { - return getWithSubcolumns(getAll()); + auto columns_list = getAll(); + addSubcolumnsToList(columns_list); + return columns_list; } NamesAndTypesList ColumnsDescription::getAllPhysicalWithSubcolumns() const { - return getWithSubcolumns(getAllPhysical()); + auto columns_list = getAllPhysical(); + addSubcolumnsToList(columns_list); + return columns_list; } bool ColumnsDescription::hasDefaults() const @@ -591,14 +654,15 @@ void ColumnsDescription::addSubcolumns(const String & name_in_storage, const Dat throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Cannot add subcolumn {}: column with this name already exists", subcolumn.name); - subcolumns[subcolumn.name] = subcolumn; + subcolumns.get<0>().insert(std::move(subcolumn)); } } -void ColumnsDescription::removeSubcolumns(const String & name_in_storage, const DataTypePtr & type_in_storage) +void ColumnsDescription::removeSubcolumns(const String & name_in_storage) { - for (const auto & subcolumn_name : type_in_storage->getSubcolumnNames()) - subcolumns.erase(name_in_storage + "." + subcolumn_name); + auto range = subcolumns.get<1>().equal_range(name_in_storage); + if (range.first != range.second) + subcolumns.get<1>().erase(range.first, range.second); } Block validateColumnsDefaultsAndGetSampleBlock(ASTPtr default_expr_list, const NamesAndTypesList & all_columns, ContextPtr context) diff --git a/src/Storages/ColumnsDescription.h b/src/Storages/ColumnsDescription.h index f1887d772ca..44f895c89ce 100644 --- a/src/Storages/ColumnsDescription.h +++ b/src/Storages/ColumnsDescription.h @@ -11,6 +11,8 @@ #include #include +#include +#include #include #include #include @@ -77,6 +79,18 @@ public: auto begin() const { return columns.begin(); } auto end() const { return columns.end(); } + enum GetFlags : UInt8 + { + Ordinary = 1, + Materialized = 2, + Aliases = 4, + + AllPhysical = Ordinary | Materialized, + All = AllPhysical | Aliases, + }; + + NamesAndTypesList getByNames(GetFlags flags, const Names & names, bool with_subcolumns) const; + NamesAndTypesList getOrdinary() const; NamesAndTypesList getMaterialized() const; NamesAndTypesList getAliases() const; @@ -91,7 +105,6 @@ public: bool has(const String & column_name) const; bool hasNested(const String & column_name) const; bool hasSubcolumn(const String & column_name) const; - bool hasInStorageOrSubcolumn(const String & column_name) const; const ColumnDescription & get(const String & column_name) const; template @@ -113,10 +126,15 @@ public: } Names getNamesOfPhysical() const; + bool hasPhysical(const String & column_name) const; - bool hasPhysicalOrSubcolumn(const String & column_name) const; + bool hasColumnOrSubcolumn(GetFlags flags, const String & column_name) const; + NameAndTypePair getPhysical(const String & column_name) const; - NameAndTypePair getPhysicalOrSubcolumn(const String & column_name) const; + NameAndTypePair getColumnOrSubcolumn(GetFlags flags, const String & column_name) const; + + std::optional tryGetPhysical(const String & column_name) const; + std::optional tryGetColumnOrSubcolumn(GetFlags flags, const String & column_name) const; ColumnDefaults getDefaults() const; /// TODO: remove bool hasDefault(const String & column_name) const; @@ -143,21 +161,27 @@ public: } /// Keep the sequence of columns and allow to lookup by name. - using Container = boost::multi_index_container< + using ColumnsContainer = boost::multi_index_container< ColumnDescription, boost::multi_index::indexed_by< boost::multi_index::sequenced<>, boost::multi_index::ordered_unique>>>; -private: - Container columns; + using SubcolumnsContainter = boost::multi_index_container< + NameAndTypePair, + boost::multi_index::indexed_by< + boost::multi_index::hashed_unique>, + boost::multi_index::hashed_non_unique>>>; - using SubcolumnsContainer = std::unordered_map; - SubcolumnsContainer subcolumns; +private: + ColumnsContainer columns; + SubcolumnsContainter subcolumns; void modifyColumnOrder(const String & column_name, const String & after_column, bool first); + void addSubcolumnsToList(NamesAndTypesList & source_list) const; + void addSubcolumns(const String & name_in_storage, const DataTypePtr & type_in_storage); - void removeSubcolumns(const String & name_in_storage, const DataTypePtr & type_in_storage); + void removeSubcolumns(const String & name_in_storage); }; /// Validate default expressions and corresponding types compatibility, i.e. diff --git a/src/Storages/Distributed/DirectoryMonitor.cpp b/src/Storages/Distributed/DirectoryMonitor.cpp index 17c0eec5c49..c674a705de1 100644 --- a/src/Storages/Distributed/DirectoryMonitor.cpp +++ b/src/Storages/Distributed/DirectoryMonitor.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -27,6 +28,7 @@ #include #include #include +#include #include @@ -330,6 +332,13 @@ namespace CheckingCompressedReadBuffer checking_in(in); remote.writePrepared(checking_in); } + + uint64_t doubleToUInt64(double d) + { + if (d >= std::numeric_limits::max()) + return std::numeric_limits::max(); + return static_cast(d); + } } @@ -345,15 +354,15 @@ StorageDistributedDirectoryMonitor::StorageDistributedDirectoryMonitor( , disk(disk_) , relative_path(relative_path_) , path(fs::path(disk->getPath()) / relative_path / "") - , should_batch_inserts(storage.getContext()->getSettingsRef().distributed_directory_monitor_batch_inserts) - , split_batch_on_failure(storage.getContext()->getSettingsRef().distributed_directory_monitor_split_batch_on_failure) + , should_batch_inserts(storage.getDistributedSettingsRef().monitor_batch_inserts) + , split_batch_on_failure(storage.getDistributedSettingsRef().monitor_split_batch_on_failure) , dir_fsync(storage.getDistributedSettingsRef().fsync_directories) , min_batched_block_size_rows(storage.getContext()->getSettingsRef().min_insert_block_size_rows) , min_batched_block_size_bytes(storage.getContext()->getSettingsRef().min_insert_block_size_bytes) , current_batch_file_path(path + "current_batch.txt") - , default_sleep_time(storage.getContext()->getSettingsRef().distributed_directory_monitor_sleep_time_ms.totalMilliseconds()) + , default_sleep_time(storage.getDistributedSettingsRef().monitor_sleep_time_ms.totalMilliseconds()) , sleep_time(default_sleep_time) - , max_sleep_time(storage.getContext()->getSettingsRef().distributed_directory_monitor_max_sleep_time_ms.totalMilliseconds()) + , max_sleep_time(storage.getDistributedSettingsRef().monitor_max_sleep_time_ms.totalMilliseconds()) , log(&Poco::Logger::get(getLoggerName())) , monitor_blocker(monitor_blocker_) , metric_pending_files(CurrentMetrics::DistributedFilesToInsert, 0) @@ -431,9 +440,14 @@ void StorageDistributedDirectoryMonitor::run() do_sleep = true; ++status.error_count; - sleep_time = std::min( - std::chrono::milliseconds{Int64(default_sleep_time.count() * std::exp2(status.error_count))}, - max_sleep_time); + + UInt64 q = doubleToUInt64(std::exp2(status.error_count)); + std::chrono::milliseconds new_sleep_time(default_sleep_time.count() * q); + if (new_sleep_time.count() < 0) + sleep_time = max_sleep_time; + else + sleep_time = std::min(new_sleep_time, max_sleep_time); + tryLogCurrentException(getLoggerName().data()); status.last_exception = std::current_exception(); } @@ -763,8 +777,8 @@ struct StorageDistributedDirectoryMonitor::Batch else { std::vector files(file_index_to_path.size()); - for (const auto & [index, name] : file_index_to_path) - files.push_back(name); + for (const auto && file_info : file_index_to_path | boost::adaptors::indexed()) + files[file_info.index()] = file_info.value().second; e.addMessage(fmt::format("While sending batch {}", fmt::join(files, "\n"))); throw; @@ -889,50 +903,78 @@ private: } }; -class DirectoryMonitorBlockInputStream : public IBlockInputStream +class DirectoryMonitorSource : public SourceWithProgress { public: - explicit DirectoryMonitorBlockInputStream(const String & file_name) - : in(file_name) - , decompressing_in(in) - , block_in(decompressing_in, DBMS_TCP_PROTOCOL_VERSION) - , log{&Poco::Logger::get("DirectoryMonitorBlockInputStream")} - { - readDistributedHeader(in, log); - block_in.readPrefix(); - first_block = block_in.read(); - header = first_block.cloneEmpty(); + struct Data + { + std::unique_ptr in; + std::unique_ptr decompressing_in; + std::unique_ptr block_in; + + Poco::Logger * log = nullptr; + + Block first_block; + + explicit Data(const String & file_name) + { + in = std::make_unique(file_name); + decompressing_in = std::make_unique(*in); + block_in = std::make_unique(*decompressing_in, DBMS_TCP_PROTOCOL_VERSION); + log = &Poco::Logger::get("DirectoryMonitorSource"); + + readDistributedHeader(*in, log); + + block_in->readPrefix(); + first_block = block_in->read(); + } + + Data(Data &&) = default; + }; + + explicit DirectoryMonitorSource(const String & file_name) + : DirectoryMonitorSource(Data(file_name)) + { } - String getName() const override { return "DirectoryMonitor"; } + explicit DirectoryMonitorSource(Data data_) + : SourceWithProgress(data_.first_block.cloneEmpty()) + , data(std::move(data_)) + { + } + + String getName() const override { return "DirectoryMonitorSource"; } protected: - Block getHeader() const override { return header; } - Block readImpl() override + Chunk generate() override { - if (first_block) - return std::move(first_block); + if (data.first_block) + { + size_t num_rows = data.first_block.rows(); + Chunk res(data.first_block.getColumns(), num_rows); + data.first_block.clear(); + return res; + } - return block_in.read(); + auto block = data.block_in->read(); + if (!block) + { + data.block_in->readSuffix(); + return {}; + } + + size_t num_rows = block.rows(); + return Chunk(block.getColumns(), num_rows); } - void readSuffix() override { block_in.readSuffix(); } - private: - ReadBufferFromFile in; - CompressedReadBuffer decompressing_in; - NativeBlockInputStream block_in; - - Block first_block; - Block header; - - Poco::Logger * log; + Data data; }; -BlockInputStreamPtr StorageDistributedDirectoryMonitor::createStreamFromFile(const String & file_name) +ProcessorPtr StorageDistributedDirectoryMonitor::createSourceFromFile(const String & file_name) { - return std::make_shared(file_name); + return std::make_shared(file_name); } bool StorageDistributedDirectoryMonitor::addAndSchedule(size_t file_size, size_t ms) diff --git a/src/Storages/Distributed/DirectoryMonitor.h b/src/Storages/Distributed/DirectoryMonitor.h index c04c49f3b9b..cd1d25179f3 100644 --- a/src/Storages/Distributed/DirectoryMonitor.h +++ b/src/Storages/Distributed/DirectoryMonitor.h @@ -21,6 +21,9 @@ class StorageDistributed; class ActionBlocker; class BackgroundSchedulePool; +class IProcessor; +using ProcessorPtr = std::shared_ptr; + /** Details of StorageDistributed. * This type is not designed for standalone use. */ @@ -45,7 +48,7 @@ public: void shutdownAndDropAllData(); - static BlockInputStreamPtr createStreamFromFile(const String & file_name); + static ProcessorPtr createSourceFromFile(const String & file_name); /// For scheduling via DistributedBlockOutputStream bool addAndSchedule(size_t file_size, size_t ms); diff --git a/src/Storages/Distributed/DistributedSettings.h b/src/Storages/Distributed/DistributedSettings.h index 7296fa11ffd..8cc942cab02 100644 --- a/src/Storages/Distributed/DistributedSettings.h +++ b/src/Storages/Distributed/DistributedSettings.h @@ -21,6 +21,11 @@ class ASTStorage; M(UInt64, bytes_to_throw_insert, 0, "If more than this number of compressed bytes will be pending for async INSERT, an exception will be thrown. 0 - do not throw.", 0) \ M(UInt64, bytes_to_delay_insert, 0, "If more than this number of compressed bytes will be pending for async INSERT, the query will be delayed. 0 - do not delay.", 0) \ M(UInt64, max_delay_to_insert, 60, "Max delay of inserting data into Distributed table in seconds, if there are a lot of pending bytes for async send.", 0) \ + /** Directory monitor settings */ \ + M(UInt64, monitor_batch_inserts, 0, "Default - distributed_directory_monitor_batch_inserts", 0) \ + M(UInt64, monitor_split_batch_on_failure, 0, "Default - distributed_directory_monitor_split_batch_on_failure", 0) \ + M(Milliseconds, monitor_sleep_time_ms, 0, "Default - distributed_directory_monitor_sleep_time_ms", 0) \ + M(Milliseconds, monitor_max_sleep_time_ms, 0, "Default - distributed_directory_monitor_max_sleep_time_ms", 0) \ DECLARE_SETTINGS_TRAITS(DistributedSettingsTraits, LIST_OF_DISTRIBUTED_SETTINGS) diff --git a/src/Storages/Distributed/DistributedBlockOutputStream.cpp b/src/Storages/Distributed/DistributedSink.cpp similarity index 91% rename from src/Storages/Distributed/DistributedBlockOutputStream.cpp rename to src/Storages/Distributed/DistributedSink.cpp index 9a50cec5986..ec3f82d914c 100644 --- a/src/Storages/Distributed/DistributedBlockOutputStream.cpp +++ b/src/Storages/Distributed/DistributedSink.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -86,7 +86,7 @@ static void writeBlockConvert(const BlockOutputStreamPtr & out, const Block & bl } -DistributedBlockOutputStream::DistributedBlockOutputStream( +DistributedSink::DistributedSink( ContextPtr context_, StorageDistributed & storage_, const StorageMetadataPtr & metadata_snapshot_, @@ -95,7 +95,8 @@ DistributedBlockOutputStream::DistributedBlockOutputStream( bool insert_sync_, UInt64 insert_timeout_, StorageID main_table_) - : context(Context::createCopy(context_)) + : SinkToStorage(metadata_snapshot_->getSampleBlock()) + , context(Context::createCopy(context_)) , storage(storage_) , metadata_snapshot(metadata_snapshot_) , query_ast(query_ast_) @@ -111,27 +112,19 @@ DistributedBlockOutputStream::DistributedBlockOutputStream( if (settings.max_distributed_depth && context->getClientInfo().distributed_depth > settings.max_distributed_depth) throw Exception("Maximum distributed depth exceeded", ErrorCodes::TOO_LARGE_DISTRIBUTED_DEPTH); context->getClientInfo().distributed_depth += 1; + random_shard_insert = settings.insert_distributed_one_random_shard && !storage.has_sharding_key; } -Block DistributedBlockOutputStream::getHeader() const +void DistributedSink::consume(Chunk chunk) { - if (!allow_materialized) - return metadata_snapshot->getSampleBlockNonMaterialized(); - else - return metadata_snapshot->getSampleBlock(); -} + if (is_first_chunk) + { + storage.delayInsertOrThrowIfNeeded(); + is_first_chunk = false; + } - -void DistributedBlockOutputStream::writePrefix() -{ - storage.delayInsertOrThrowIfNeeded(); -} - - -void DistributedBlockOutputStream::write(const Block & block) -{ - Block ordinary_block{ block }; + auto ordinary_block = getPort().getHeader().cloneWithColumns(chunk.detachColumns()); if (!allow_materialized) { @@ -154,11 +147,8 @@ void DistributedBlockOutputStream::write(const Block & block) writeAsync(ordinary_block); } -void DistributedBlockOutputStream::writeAsync(const Block & block) +void DistributedSink::writeAsync(const Block & block) { - const Settings & settings = context->getSettingsRef(); - bool random_shard_insert = settings.insert_distributed_one_random_shard && !storage.has_sharding_key; - if (random_shard_insert) { writeAsyncImpl(block, storage.getRandomShardIndex(cluster->getShardsInfo())); @@ -176,7 +166,7 @@ void DistributedBlockOutputStream::writeAsync(const Block & block) } -std::string DistributedBlockOutputStream::getCurrentStateDescription() +std::string DistributedSink::getCurrentStateDescription() { WriteBufferFromOwnString buffer; const auto & addresses = cluster->getShardsAddresses(); @@ -205,7 +195,7 @@ std::string DistributedBlockOutputStream::getCurrentStateDescription() } -void DistributedBlockOutputStream::initWritingJobs(const Block & first_block, size_t start, size_t end) +void DistributedSink::initWritingJobs(const Block & first_block, size_t start, size_t end) { const Settings & settings = context->getSettingsRef(); const auto & addresses_with_failovers = cluster->getShardsAddresses(); @@ -251,7 +241,7 @@ void DistributedBlockOutputStream::initWritingJobs(const Block & first_block, si } -void DistributedBlockOutputStream::waitForJobs() +void DistributedSink::waitForJobs() { pool->wait(); @@ -264,16 +254,24 @@ void DistributedBlockOutputStream::waitForJobs() } } - size_t jobs_count = remote_jobs_count + local_jobs_count; size_t num_finished_jobs = finished_jobs_count; + if (random_shard_insert) + { + if (finished_jobs_count != 1) + LOG_WARNING(log, "Expected 1 writing jobs when doing random shard insert, but finished {}", num_finished_jobs); + } + else + { + size_t jobs_count = remote_jobs_count + local_jobs_count; - if (num_finished_jobs < jobs_count) - LOG_WARNING(log, "Expected {} writing jobs, but finished only {}", jobs_count, num_finished_jobs); + if (num_finished_jobs < jobs_count) + LOG_WARNING(log, "Expected {} writing jobs, but finished only {}", jobs_count, num_finished_jobs); + } } ThreadPool::Job -DistributedBlockOutputStream::runWritingJob(DistributedBlockOutputStream::JobReplica & job, const Block & current_block, size_t num_shards) +DistributedSink::runWritingJob(JobReplica & job, const Block & current_block, size_t num_shards) { auto thread_group = CurrentThread::getGroup(); return [this, thread_group, &job, ¤t_block, num_shards]() @@ -397,11 +395,10 @@ DistributedBlockOutputStream::runWritingJob(DistributedBlockOutputStream::JobRep } -void DistributedBlockOutputStream::writeSync(const Block & block) +void DistributedSink::writeSync(const Block & block) { const Settings & settings = context->getSettingsRef(); const auto & shards_info = cluster->getShardsInfo(); - bool random_shard_insert = settings.insert_distributed_one_random_shard && !storage.has_sharding_key; size_t start = 0; size_t end = shards_info.size(); @@ -410,20 +407,13 @@ void DistributedBlockOutputStream::writeSync(const Block & block) start = settings.insert_shard_id - 1; end = settings.insert_shard_id; } - else if (random_shard_insert) - { - start = storage.getRandomShardIndex(shards_info); - end = start + 1; - } - - size_t num_shards = end - start; if (!pool) { /// Deferred initialization. Only for sync insertion. initWritingJobs(block, start, end); - size_t jobs_count = remote_jobs_count + local_jobs_count; + size_t jobs_count = random_shard_insert ? 1 : (remote_jobs_count + local_jobs_count); size_t max_threads = std::min(settings.max_distributed_connections, jobs_count); pool.emplace(/* max_threads_= */ max_threads, /* max_free_threads_= */ max_threads, @@ -440,12 +430,20 @@ void DistributedBlockOutputStream::writeSync(const Block & block) watch_current_block.restart(); + if (random_shard_insert) + { + start = storage.getRandomShardIndex(shards_info); + end = start + 1; + } + + size_t num_shards = end - start; + if (num_shards > 1) { auto current_selector = createSelector(block); - /// Prepare row numbers for each shard - for (size_t shard_index : collections::range(0, num_shards)) + /// Prepare row numbers for needed shards + for (size_t shard_index : collections::range(start, end)) per_shard_jobs[shard_index].shard_current_block_permutation.resize(0); for (size_t i = 0; i < block.rows(); ++i) @@ -456,7 +454,7 @@ void DistributedBlockOutputStream::writeSync(const Block & block) { /// Run jobs in parallel for each block and wait them finished_jobs_count = 0; - for (size_t shard_index : collections::range(0, shards_info.size())) + for (size_t shard_index : collections::range(start, end)) for (JobReplica & job : per_shard_jobs[shard_index].replicas_jobs) pool->scheduleOrThrowOnError(runWritingJob(job, block, num_shards)); } @@ -481,7 +479,7 @@ void DistributedBlockOutputStream::writeSync(const Block & block) } -void DistributedBlockOutputStream::writeSuffix() +void DistributedSink::onFinish() { auto log_performance = [this]() { @@ -531,7 +529,7 @@ void DistributedBlockOutputStream::writeSuffix() } -IColumn::Selector DistributedBlockOutputStream::createSelector(const Block & source_block) const +IColumn::Selector DistributedSink::createSelector(const Block & source_block) const { Block current_block_with_sharding_key_expr = source_block; storage.getShardingKeyExpr()->execute(current_block_with_sharding_key_expr); @@ -542,7 +540,7 @@ IColumn::Selector DistributedBlockOutputStream::createSelector(const Block & sou } -Blocks DistributedBlockOutputStream::splitBlock(const Block & block) +Blocks DistributedSink::splitBlock(const Block & block) { auto selector = createSelector(block); @@ -566,7 +564,7 @@ Blocks DistributedBlockOutputStream::splitBlock(const Block & block) } -void DistributedBlockOutputStream::writeSplitAsync(const Block & block) +void DistributedSink::writeSplitAsync(const Block & block) { Blocks splitted_blocks = splitBlock(block); const size_t num_shards = splitted_blocks.size(); @@ -579,7 +577,7 @@ void DistributedBlockOutputStream::writeSplitAsync(const Block & block) } -void DistributedBlockOutputStream::writeAsyncImpl(const Block & block, size_t shard_id) +void DistributedSink::writeAsyncImpl(const Block & block, size_t shard_id) { const auto & shard_info = cluster->getShardsInfo()[shard_id]; const auto & settings = context->getSettingsRef(); @@ -615,7 +613,7 @@ void DistributedBlockOutputStream::writeAsyncImpl(const Block & block, size_t sh } -void DistributedBlockOutputStream::writeToLocal(const Block & block, size_t repeats) +void DistributedSink::writeToLocal(const Block & block, size_t repeats) { InterpreterInsertQuery interp(query_ast, context, allow_materialized); @@ -627,7 +625,7 @@ void DistributedBlockOutputStream::writeToLocal(const Block & block, size_t repe } -void DistributedBlockOutputStream::writeToShard(const Block & block, const std::vector & dir_names) +void DistributedSink::writeToShard(const Block & block, const std::vector & dir_names) { const auto & settings = context->getSettingsRef(); const auto & distributed_settings = storage.getDistributedSettingsRef(); diff --git a/src/Storages/Distributed/DistributedBlockOutputStream.h b/src/Storages/Distributed/DistributedSink.h similarity index 90% rename from src/Storages/Distributed/DistributedBlockOutputStream.h rename to src/Storages/Distributed/DistributedSink.h index 0ae57ce053d..af04f8c8aac 100644 --- a/src/Storages/Distributed/DistributedBlockOutputStream.h +++ b/src/Storages/Distributed/DistributedSink.h @@ -1,7 +1,7 @@ #pragma once #include -#include +#include #include #include #include @@ -34,10 +34,10 @@ class StorageDistributed; * and the resulting blocks are written in a compressed Native format in separate directories for sending. * For each destination address (each directory with data to send), a separate thread is created in StorageDistributed, * which monitors the directory and sends data. */ -class DistributedBlockOutputStream : public IBlockOutputStream +class DistributedSink : public SinkToStorage { public: - DistributedBlockOutputStream( + DistributedSink( ContextPtr context_, StorageDistributed & storage_, const StorageMetadataPtr & metadata_snapshot_, @@ -47,11 +47,9 @@ public: UInt64 insert_timeout_, StorageID main_table_); - Block getHeader() const override; - void write(const Block & block) override; - void writePrefix() override; - - void writeSuffix() override; + String getName() const override { return "DistributedSink"; } + void consume(Chunk chunk) override; + void onFinish() override; private: IColumn::Selector createSelector(const Block & source_block) const; @@ -77,7 +75,7 @@ private: void initWritingJobs(const Block & first_block, size_t start, size_t end); struct JobReplica; - ThreadPool::Job runWritingJob(DistributedBlockOutputStream::JobReplica & job, const Block & current_block, size_t num_shards); + ThreadPool::Job runWritingJob(JobReplica & job, const Block & current_block, size_t num_shards); void waitForJobs(); @@ -94,8 +92,11 @@ private: size_t inserted_rows = 0; bool insert_sync; + bool random_shard_insert; bool allow_materialized; + bool is_first_chunk = true; + /// Sync-related stuff UInt64 insert_timeout; // in seconds StorageID main_table; diff --git a/src/Storages/HDFS/StorageHDFS.cpp b/src/Storages/HDFS/StorageHDFS.cpp index e3fd287bad8..9600eb975b4 100644 --- a/src/Storages/HDFS/StorageHDFS.cpp +++ b/src/Storages/HDFS/StorageHDFS.cpp @@ -15,9 +15,8 @@ #include #include #include -#include +#include #include -#include #include #include #include @@ -27,6 +26,7 @@ #include #include + namespace fs = std::filesystem; namespace DB @@ -34,6 +34,7 @@ namespace DB namespace ErrorCodes { extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; + extern const int ACCESS_DENIED; } StorageHDFS::StorageHDFS( @@ -171,36 +172,33 @@ private: Block sample_block; }; -class HDFSBlockOutputStream : public IBlockOutputStream +class HDFSSink : public SinkToStorage { public: - HDFSBlockOutputStream(const String & uri, + HDFSSink(const String & uri, const String & format, - const Block & sample_block_, + const Block & sample_block, ContextPtr context, const CompressionMethod compression_method) - : sample_block(sample_block_) + : SinkToStorage(sample_block) { write_buf = wrapWriteBufferWithCompressionMethod(std::make_unique(uri, context->getGlobalContext()->getConfigRef()), compression_method, 3); writer = FormatFactory::instance().getOutputStreamParallelIfPossible(format, *write_buf, sample_block, context); } - Block getHeader() const override + String getName() const override { return "HDFSSink"; } + + void consume(Chunk chunk) override { - return sample_block; + if (is_first_chunk) + { + writer->writePrefix(); + is_first_chunk = false; + } + writer->write(getPort().getHeader().cloneWithColumns(chunk.detachColumns())); } - void write(const Block & block) override - { - writer->write(block); - } - - void writePrefix() override - { - writer->writePrefix(); - } - - void writeSuffix() override + void onFinish() override { try { @@ -217,9 +215,9 @@ public: } private: - Block sample_block; std::unique_ptr write_buf; BlockOutputStreamPtr writer; + bool is_first_chunk = true; }; /* Recursive directory listing with matched paths as a result. @@ -280,15 +278,7 @@ Pipe StorageHDFS::read( size_t max_block_size, unsigned num_streams) { - size_t begin_of_path; - /// This uri is checked for correctness in constructor of StorageHDFS and never modified afterwards - auto two_slash = uri.find("//"); - - if (two_slash == std::string::npos) - begin_of_path = uri.find('/'); - else - begin_of_path = uri.find('/', two_slash + 2); - + const size_t begin_of_path = uri.find('/', uri.find("//") + 2); const String path_from_uri = uri.substr(begin_of_path); const String uri_without_path = uri.substr(0, begin_of_path); @@ -321,15 +311,30 @@ Pipe StorageHDFS::read( return Pipe::unitePipes(std::move(pipes)); } -BlockOutputStreamPtr StorageHDFS::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr /*context*/) +SinkToStoragePtr StorageHDFS::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr /*context*/) { - return std::make_shared(uri, + return std::make_shared(uri, format_name, metadata_snapshot->getSampleBlock(), getContext(), chooseCompressionMethod(uri, compression_method)); } +void StorageHDFS::truncate(const ASTPtr & /* query */, const StorageMetadataPtr &, ContextPtr context_, TableExclusiveLockHolder &) +{ + const size_t begin_of_path = uri.find('/', uri.find("//") + 2); + const String path = uri.substr(begin_of_path); + const String url = uri.substr(0, begin_of_path); + + HDFSBuilderWrapper builder = createHDFSBuilder(url + "/", context_->getGlobalContext()->getConfigRef()); + HDFSFSPtr fs = createHDFSFS(builder.get()); + + int ret = hdfsDelete(fs.get(), path.data(), 0); + if (ret) + throw Exception(ErrorCodes::ACCESS_DENIED, "Unable to truncate hdfs table: {}", std::string(hdfsGetLastError())); +} + + void registerStorageHDFS(StorageFactory & factory) { factory.registerStorage("HDFS", [](const StorageFactory::Arguments & args) diff --git a/src/Storages/HDFS/StorageHDFS.h b/src/Storages/HDFS/StorageHDFS.h index 397e147e7cd..268f2205b97 100644 --- a/src/Storages/HDFS/StorageHDFS.h +++ b/src/Storages/HDFS/StorageHDFS.h @@ -32,7 +32,9 @@ public: size_t max_block_size, unsigned num_streams) override; - BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; + SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; + + void truncate(const ASTPtr & query, const StorageMetadataPtr & metadata_snapshot, ContextPtr context_, TableExclusiveLockHolder &) override; NamesAndTypesList getVirtuals() const override; diff --git a/src/Storages/IStorage.h b/src/Storages/IStorage.h index 2d6109bd7af..85bfbfb1f84 100644 --- a/src/Storages/IStorage.h +++ b/src/Storages/IStorage.h @@ -51,6 +51,9 @@ class Pipe; class QueryPlan; using QueryPlanPtr = std::unique_ptr; +class SinkToStorage; +using SinkToStoragePtr = std::shared_ptr; + class QueryPipeline; using QueryPipelinePtr = std::unique_ptr; @@ -261,7 +264,7 @@ public: * * It is guaranteed that the structure of the table will not change over the lifetime of the returned streams (that is, there will not be ALTER, RENAME and DROP). */ - virtual BlockInputStreams watch( + virtual Pipe watch( const Names & /*column_names*/, const SelectQueryInfo & /*query_info*/, ContextPtr /*context*/, @@ -272,6 +275,10 @@ public: throw Exception("Method watch is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED); } + /// Returns true if FINAL modifier must be added to SELECT query depending on required columns. + /// It's needed for ReplacingMergeTree wrappers such as MaterializedMySQL and MaterializedPostrgeSQL + virtual bool needRewriteQueryWithFinal(const Names & /*column_names*/) const { return false; } + /** Read a set of columns from the table. * Accepts a list of columns to read, as well as a description of the query, * from which information can be extracted about how to retrieve data @@ -322,7 +329,7 @@ public: * changed during lifetime of the returned streams, but the snapshot is * guaranteed to be immutable. */ - virtual BlockOutputStreamPtr write( + virtual SinkToStoragePtr write( const ASTPtr & /*query*/, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr /*context*/) diff --git a/src/Storages/Kafka/KafkaBlockOutputStream.cpp b/src/Storages/Kafka/KafkaBlockOutputStream.cpp index 21de27708b4..c7fe71f42c1 100644 --- a/src/Storages/Kafka/KafkaBlockOutputStream.cpp +++ b/src/Storages/Kafka/KafkaBlockOutputStream.cpp @@ -6,30 +6,26 @@ namespace DB { -KafkaBlockOutputStream::KafkaBlockOutputStream( +KafkaSink::KafkaSink( StorageKafka & storage_, const StorageMetadataPtr & metadata_snapshot_, const ContextPtr & context_) - : storage(storage_) + : SinkToStorage(metadata_snapshot_->getSampleBlockNonMaterialized()) + , storage(storage_) , metadata_snapshot(metadata_snapshot_) , context(context_) { } -Block KafkaBlockOutputStream::getHeader() const +void KafkaSink::onStart() { - return metadata_snapshot->getSampleBlockNonMaterialized(); -} - -void KafkaBlockOutputStream::writePrefix() -{ - buffer = storage.createWriteBuffer(getHeader()); + buffer = storage.createWriteBuffer(getPort().getHeader()); auto format_settings = getFormatSettings(context); format_settings.protobuf.allow_multiple_rows_without_delimiter = true; child = FormatFactory::instance().getOutputStream(storage.getFormatName(), *buffer, - getHeader(), context, + getPort().getHeader(), context, [this](const Columns & columns, size_t row) { buffer->countRow(columns, row); @@ -37,20 +33,17 @@ void KafkaBlockOutputStream::writePrefix() format_settings); } -void KafkaBlockOutputStream::write(const Block & block) +void KafkaSink::consume(Chunk chunk) { - child->write(block); + child->write(getPort().getHeader().cloneWithColumns(chunk.detachColumns())); } -void KafkaBlockOutputStream::writeSuffix() +void KafkaSink::onFinish() { if (child) child->writeSuffix(); - flush(); -} + //flush(); -void KafkaBlockOutputStream::flush() -{ if (buffer) buffer->flush(); } diff --git a/src/Storages/Kafka/KafkaBlockOutputStream.h b/src/Storages/Kafka/KafkaBlockOutputStream.h index 9f413ae527f..7d65ac99998 100644 --- a/src/Storages/Kafka/KafkaBlockOutputStream.h +++ b/src/Storages/Kafka/KafkaBlockOutputStream.h @@ -1,26 +1,25 @@ #pragma once -#include +#include #include namespace DB { -class KafkaBlockOutputStream : public IBlockOutputStream +class KafkaSink : public SinkToStorage { public: - explicit KafkaBlockOutputStream( + explicit KafkaSink( StorageKafka & storage_, const StorageMetadataPtr & metadata_snapshot_, const std::shared_ptr & context_); - Block getHeader() const override; + void consume(Chunk chunk) override; + void onStart() override; + void onFinish() override; + String getName() const override { return "KafkaSink"; } - void writePrefix() override; - void write(const Block & block) override; - void writeSuffix() override; - - void flush() override; + ///void flush() override; private: StorageKafka & storage; diff --git a/src/Storages/Kafka/StorageKafka.cpp b/src/Storages/Kafka/StorageKafka.cpp index 15dd5b553b0..cba67bc3bcb 100644 --- a/src/Storages/Kafka/StorageKafka.cpp +++ b/src/Storages/Kafka/StorageKafka.cpp @@ -1,7 +1,6 @@ #include #include -#include #include #include #include @@ -34,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -289,14 +289,14 @@ Pipe StorageKafka::read( } -BlockOutputStreamPtr StorageKafka::write(const ASTPtr &, const StorageMetadataPtr & metadata_snapshot, ContextPtr local_context) +SinkToStoragePtr StorageKafka::write(const ASTPtr &, const StorageMetadataPtr & metadata_snapshot, ContextPtr local_context) { auto modified_context = Context::createCopy(local_context); modified_context->applySettingsChanges(settings_adjustments); if (topics.size() > 1) throw Exception("Can't write to Kafka table with multiple topics!", ErrorCodes::NOT_IMPLEMENTED); - return std::make_shared(*this, metadata_snapshot, modified_context); + return std::make_shared(*this, metadata_snapshot, modified_context); } @@ -747,10 +747,11 @@ void registerStorageKafka(StorageFactory & factory) #undef CHECK_KAFKA_STORAGE_ARGUMENT auto num_consumers = kafka_settings->kafka_num_consumers.value; + auto physical_cpu_cores = getNumberOfPhysicalCPUCores(); - if (num_consumers > 16) + if (num_consumers > physical_cpu_cores) { - throw Exception("Number of consumers can not be bigger than 16", ErrorCodes::BAD_ARGUMENTS); + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Number of consumers can not be bigger than {}", physical_cpu_cores); } else if (num_consumers < 1) { diff --git a/src/Storages/Kafka/StorageKafka.h b/src/Storages/Kafka/StorageKafka.h index 805fa9d510c..2d3abca6059 100644 --- a/src/Storages/Kafka/StorageKafka.h +++ b/src/Storages/Kafka/StorageKafka.h @@ -50,7 +50,7 @@ public: size_t max_block_size, unsigned num_streams) override; - BlockOutputStreamPtr write( + SinkToStoragePtr write( const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; diff --git a/src/Storages/LiveView/LiveViewEventsBlockInputStream.h b/src/Storages/LiveView/LiveViewEventsSource.h similarity index 90% rename from src/Storages/LiveView/LiveViewEventsBlockInputStream.h rename to src/Storages/LiveView/LiveViewEventsSource.h index dc6848ec20c..daf9edfef95 100644 --- a/src/Storages/LiveView/LiveViewEventsBlockInputStream.h +++ b/src/Storages/LiveView/LiveViewEventsSource.h @@ -16,7 +16,7 @@ limitations under the License. */ #include #include #include -#include +#include #include @@ -27,7 +27,7 @@ namespace DB * Keeps stream alive by outputting blocks with no rows * based on period specified by the heartbeat interval. */ -class LiveViewEventsBlockInputStream : public IBlockInputStream +class LiveViewEventsSource : public SourceWithProgress { using NonBlockingResult = std::pair; @@ -35,13 +35,14 @@ using NonBlockingResult = std::pair; public: /// length default -2 because we want LIMIT to specify number of updates so that LIMIT 1 waits for 1 update /// and LIMIT 0 just returns data without waiting for any updates - LiveViewEventsBlockInputStream(std::shared_ptr storage_, + LiveViewEventsSource(std::shared_ptr storage_, std::shared_ptr blocks_ptr_, std::shared_ptr blocks_metadata_ptr_, std::shared_ptr active_ptr_, const bool has_limit_, const UInt64 limit_, const UInt64 heartbeat_interval_sec_) - : storage(std::move(storage_)), blocks_ptr(std::move(blocks_ptr_)), + : SourceWithProgress({ColumnWithTypeAndName(ColumnUInt64::create(), std::make_shared(), "version")}), + storage(std::move(storage_)), blocks_ptr(std::move(blocks_ptr_)), blocks_metadata_ptr(std::move(blocks_metadata_ptr_)), active_ptr(std::move(active_ptr_)), has_limit(has_limit_), limit(limit_), @@ -51,22 +52,17 @@ public: active = active_ptr.lock(); } - String getName() const override { return "LiveViewEventsBlockInputStream"; } + String getName() const override { return "LiveViewEventsSource"; } - void cancel(bool kill) override + void onCancel() override { if (isCancelled() || storage->shutdown_called) return; - IBlockInputStream::cancel(kill); + std::lock_guard lock(storage->mutex); storage->condition.notify_all(); } - Block getHeader() const override - { - return {ColumnWithTypeAndName(ColumnUInt64::create(), std::make_shared(), "version")}; - } - void refresh() { if (active && blocks && it == end) @@ -109,10 +105,11 @@ public: return res; } protected: - Block readImpl() override + Chunk generate() override { /// try reading - return tryReadImpl(true).first; + auto block = tryReadImpl(true).first; + return Chunk(block.getColumns(), block.rows()); } /** tryRead method attempts to read a block in either blocking @@ -170,7 +167,7 @@ protected: if (!end_of_blocks) { end_of_blocks = true; - return { getHeader(), true }; + return { getPort().getHeader(), true }; } while (true) { @@ -192,7 +189,7 @@ protected: { // repeat the event block as a heartbeat last_event_timestamp_usec = static_cast(timestamp.epochMicroseconds()); - return { getHeader(), true }; + return { getPort().getHeader(), true }; } } } diff --git a/src/Storages/LiveView/LiveViewBlockOutputStream.h b/src/Storages/LiveView/LiveViewSink.h similarity index 74% rename from src/Storages/LiveView/LiveViewBlockOutputStream.h rename to src/Storages/LiveView/LiveViewSink.h index 6b8a5a2cb9e..433a5554152 100644 --- a/src/Storages/LiveView/LiveViewBlockOutputStream.h +++ b/src/Storages/LiveView/LiveViewSink.h @@ -1,7 +1,7 @@ #pragma once #include -#include +#include #include #include @@ -9,19 +9,28 @@ namespace DB { -class LiveViewBlockOutputStream : public IBlockOutputStream +class LiveViewSink : public SinkToStorage { -public: - explicit LiveViewBlockOutputStream(StorageLiveView & storage_) : storage(storage_) {} + /// _version column is added manually in sink. + static Block updateHeader(Block block) + { + block.erase("_version"); + return block; + } - void writePrefix() override +public: + explicit LiveViewSink(StorageLiveView & storage_) : SinkToStorage(updateHeader(storage_.getHeader())), storage(storage_) {} + + String getName() const override { return "LiveViewSink"; } + + void onStart() override { new_blocks = std::make_shared(); new_blocks_metadata = std::make_shared(); new_hash = std::make_shared(); } - void writeSuffix() override + void onFinish() override { UInt128 key; String key_str; @@ -65,14 +74,13 @@ public: new_hash.reset(); } - void write(const Block & block) override + void consume(Chunk chunk) override { - new_blocks->push_back(block); + auto block = getPort().getHeader().cloneWithColumns(chunk.detachColumns()); block.updateHash(*new_hash); + new_blocks->push_back(std::move(block)); } - Block getHeader() const override { return storage.getHeader(); } - private: using SipHashPtr = std::shared_ptr; diff --git a/src/Storages/LiveView/LiveViewBlockInputStream.h b/src/Storages/LiveView/LiveViewSource.h similarity index 89% rename from src/Storages/LiveView/LiveViewBlockInputStream.h rename to src/Storages/LiveView/LiveViewSource.h index 737e76754c5..af07d8558ad 100644 --- a/src/Storages/LiveView/LiveViewBlockInputStream.h +++ b/src/Storages/LiveView/LiveViewSource.h @@ -1,6 +1,7 @@ #pragma once -#include +#include +#include namespace DB @@ -10,19 +11,20 @@ namespace DB * Keeps stream alive by outputting blocks with no rows * based on period specified by the heartbeat interval. */ -class LiveViewBlockInputStream : public IBlockInputStream +class LiveViewSource : public SourceWithProgress { using NonBlockingResult = std::pair; public: - LiveViewBlockInputStream(std::shared_ptr storage_, + LiveViewSource(std::shared_ptr storage_, std::shared_ptr blocks_ptr_, std::shared_ptr blocks_metadata_ptr_, std::shared_ptr active_ptr_, const bool has_limit_, const UInt64 limit_, const UInt64 heartbeat_interval_sec_) - : storage(std::move(storage_)), blocks_ptr(std::move(blocks_ptr_)), + : SourceWithProgress(storage_->getHeader()) + , storage(std::move(storage_)), blocks_ptr(std::move(blocks_ptr_)), blocks_metadata_ptr(std::move(blocks_metadata_ptr_)), active_ptr(std::move(active_ptr_)), has_limit(has_limit_), limit(limit_), @@ -34,17 +36,15 @@ public: String getName() const override { return "LiveViewBlockInputStream"; } - void cancel(bool kill) override + void onCancel() override { if (isCancelled() || storage->shutdown_called) return; - IBlockInputStream::cancel(kill); + std::lock_guard lock(storage->mutex); storage->condition.notify_all(); } - Block getHeader() const override { return storage->getHeader(); } - void refresh() { if (active && blocks && it == end) @@ -74,10 +74,11 @@ public: } protected: - Block readImpl() override + Chunk generate() override { /// try reading - return tryReadImpl(true).first; + auto block = tryReadImpl(true).first; + return Chunk(block.getColumns(), block.rows()); } /** tryRead method attempts to read a block in either blocking @@ -135,7 +136,7 @@ protected: if (!end_of_blocks) { end_of_blocks = true; - return { getHeader(), true }; + return { getPort().getHeader(), true }; } while (true) { @@ -157,7 +158,7 @@ protected: { // heartbeat last_event_timestamp_usec = static_cast(Poco::Timestamp().epochMicroseconds()); - return { getHeader(), true }; + return { getPort().getHeader(), true }; } } } diff --git a/src/Storages/LiveView/StorageLiveView.cpp b/src/Storages/LiveView/StorageLiveView.cpp index f54abda6d7f..69390850ccc 100644 --- a/src/Storages/LiveView/StorageLiveView.cpp +++ b/src/Storages/LiveView/StorageLiveView.cpp @@ -15,10 +15,11 @@ limitations under the License. */ #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include #include #include @@ -26,9 +27,9 @@ limitations under the License. */ #include #include -#include -#include -#include +#include +#include +#include #include #include @@ -110,15 +111,23 @@ MergeableBlocksPtr StorageLiveView::collectMergeableBlocks(ContextPtr local_cont InterpreterSelectQuery interpreter(mergeable_query->clone(), local_context, SelectQueryOptions(QueryProcessingStage::WithMergeableState), Names()); - auto view_mergeable_stream = std::make_shared(interpreter.execute().getInputStream()); + auto io = interpreter.execute(); + io.pipeline.addSimpleTransform([&](const Block & cur_header) + { + return std::make_shared(cur_header); + }); - while (Block this_block = view_mergeable_stream->read()) + new_mergeable_blocks->sample_block = io.pipeline.getHeader(); + + PullingPipelineExecutor executor(io.pipeline); + Block this_block; + + while (executor.pull(this_block)) base_blocks->push_back(this_block); new_blocks->push_back(base_blocks); new_mergeable_blocks->blocks = new_blocks; - new_mergeable_blocks->sample_block = view_mergeable_stream->getHeader(); return new_mergeable_blocks; } @@ -133,7 +142,7 @@ Pipes StorageLiveView::blocksToPipes(BlocksPtrs blocks, Block & sample_block) } /// Complete query using input streams from mergeable blocks -BlockInputStreamPtr StorageLiveView::completeQuery(Pipes pipes) +QueryPipeline StorageLiveView::completeQuery(Pipes pipes) { //FIXME it's dangerous to create Context on stack auto block_context = Context::createCopy(getContext()); @@ -147,18 +156,25 @@ BlockInputStreamPtr StorageLiveView::completeQuery(Pipes pipes) std::move(pipes), QueryProcessingStage::WithMergeableState); }; block_context->addExternalTable(getBlocksTableName(), TemporaryTableHolder(getContext(), creator)); - InterpreterSelectQuery select(getInnerBlocksQuery(), block_context, StoragePtr(), nullptr, SelectQueryOptions(QueryProcessingStage::Complete)); - BlockInputStreamPtr data = std::make_shared(select.execute().getInputStream()); + auto io = select.execute(); + io.pipeline.addSimpleTransform([&](const Block & cur_header) + { + return std::make_shared(cur_header); + }); /// Squashing is needed here because the view query can generate a lot of blocks /// even when only one block is inserted into the parent table (e.g. if the query is a GROUP BY /// and two-level aggregation is triggered). - data = std::make_shared( - data, getContext()->getSettingsRef().min_insert_block_size_rows, - getContext()->getSettingsRef().min_insert_block_size_bytes); + io.pipeline.addSimpleTransform([&](const Block & cur_header) + { + return std::make_shared( + cur_header, + getContext()->getSettingsRef().min_insert_block_size_rows, + getContext()->getSettingsRef().min_insert_block_size_bytes); + }); - return data; + return std::move(io.pipeline); } void StorageLiveView::writeIntoLiveView( @@ -166,7 +182,7 @@ void StorageLiveView::writeIntoLiveView( const Block & block, ContextPtr local_context) { - BlockOutputStreamPtr output = std::make_shared(live_view); + auto output = std::make_shared(live_view); /// Check if live view has any readers if not /// just reset blocks to empty and do nothing else @@ -220,10 +236,16 @@ void StorageLiveView::writeIntoLiveView( InterpreterSelectQuery select_block(mergeable_query, local_context, blocks_storage.getTable(), blocks_storage.getTable()->getInMemoryMetadataPtr(), QueryProcessingStage::WithMergeableState); - auto data_mergeable_stream = std::make_shared( - select_block.execute().getInputStream()); + auto io = select_block.execute(); + io.pipeline.addSimpleTransform([&](const Block & cur_header) + { + return std::make_shared(cur_header); + }); - while (Block this_block = data_mergeable_stream->read()) + PullingPipelineExecutor executor(io.pipeline); + Block this_block; + + while (executor.pull(this_block)) new_mergeable_blocks->push_back(this_block); if (new_mergeable_blocks->empty()) @@ -238,8 +260,15 @@ void StorageLiveView::writeIntoLiveView( } } - BlockInputStreamPtr data = live_view.completeQuery(std::move(from)); - copyData(*data, *output); + auto pipeline = live_view.completeQuery(std::move(from)); + pipeline.resize(1); + pipeline.setSinks([&](const Block &, Pipe::StreamType) + { + return std::move(output); + }); + + auto executor = pipeline.execute(); + executor->execute(pipeline.getNumThreads()); } @@ -351,9 +380,11 @@ bool StorageLiveView::getNewBlocks() /// inserted data to be duplicated auto new_mergeable_blocks = collectMergeableBlocks(live_view_context); Pipes from = blocksToPipes(new_mergeable_blocks->blocks, new_mergeable_blocks->sample_block); - BlockInputStreamPtr data = completeQuery(std::move(from)); + auto pipeline = completeQuery(std::move(from)); - while (Block block = data->read()) + PullingPipelineExecutor executor(pipeline); + Block block; + while (executor.pull(block)) { /// calculate hash before virtual column is added block.updateHash(hash); @@ -521,7 +552,7 @@ Pipe StorageLiveView::read( return Pipe(std::make_shared(blocks_ptr, getHeader())); } -BlockInputStreams StorageLiveView::watch( +Pipe StorageLiveView::watch( const Names & /*column_names*/, const SelectQueryInfo & query_info, ContextPtr local_context, @@ -533,7 +564,7 @@ BlockInputStreams StorageLiveView::watch( bool has_limit = false; UInt64 limit = 0; - BlockInputStreamPtr reader; + Pipe reader; if (query.limit_length) { @@ -542,15 +573,15 @@ BlockInputStreams StorageLiveView::watch( } if (query.is_watch_events) - reader = std::make_shared( + reader = Pipe(std::make_shared( std::static_pointer_cast(shared_from_this()), blocks_ptr, blocks_metadata_ptr, active_ptr, has_limit, limit, - local_context->getSettingsRef().live_view_heartbeat_interval.totalSeconds()); + local_context->getSettingsRef().live_view_heartbeat_interval.totalSeconds())); else - reader = std::make_shared( + reader = Pipe(std::make_shared( std::static_pointer_cast(shared_from_this()), blocks_ptr, blocks_metadata_ptr, active_ptr, has_limit, limit, - local_context->getSettingsRef().live_view_heartbeat_interval.totalSeconds()); + local_context->getSettingsRef().live_view_heartbeat_interval.totalSeconds())); { std::lock_guard lock(mutex); @@ -563,7 +594,7 @@ BlockInputStreams StorageLiveView::watch( } processed_stage = QueryProcessingStage::Complete; - return { reader }; + return reader; } NamesAndTypesList StorageLiveView::getVirtuals() const diff --git a/src/Storages/LiveView/StorageLiveView.h b/src/Storages/LiveView/StorageLiveView.h index 23a9c84cb9e..15afc642989 100644 --- a/src/Storages/LiveView/StorageLiveView.h +++ b/src/Storages/LiveView/StorageLiveView.h @@ -52,9 +52,9 @@ using Pipes = std::vector; class StorageLiveView final : public shared_ptr_helper, public IStorage, WithContext { friend struct shared_ptr_helper; -friend class LiveViewBlockInputStream; -friend class LiveViewEventsBlockInputStream; -friend class LiveViewBlockOutputStream; +friend class LiveViewSource; +friend class LiveViewEventsSource; +friend class LiveViewSink; public: ~StorageLiveView() override; @@ -153,7 +153,7 @@ public: size_t max_block_size, unsigned num_streams) override; - BlockInputStreams watch( + Pipe watch( const Names & column_names, const SelectQueryInfo & query_info, ContextPtr context, @@ -167,7 +167,7 @@ public: /// Collect mergeable blocks and their sample. Must be called holding mutex MergeableBlocksPtr collectMergeableBlocks(ContextPtr context); /// Complete query using input streams from mergeable blocks - BlockInputStreamPtr completeQuery(Pipes pipes); + QueryPipeline completeQuery(Pipes pipes); void setMergeableBlocks(MergeableBlocksPtr blocks) { mergeable_blocks = blocks; } std::shared_ptr getActivePtr() { return active_ptr; } diff --git a/src/Storages/MergeTree/ActiveDataPartSet.cpp b/src/Storages/MergeTree/ActiveDataPartSet.cpp index 28a4f9e2068..77fc2c2f0b9 100644 --- a/src/Storages/MergeTree/ActiveDataPartSet.cpp +++ b/src/Storages/MergeTree/ActiveDataPartSet.cpp @@ -8,6 +8,11 @@ namespace DB { +namespace ErrorCodes +{ + extern const int LOGICAL_ERROR; +} + ActiveDataPartSet::ActiveDataPartSet(MergeTreeDataFormatVersion format_version_, const Strings & names) : format_version(format_version_) @@ -16,8 +21,7 @@ ActiveDataPartSet::ActiveDataPartSet(MergeTreeDataFormatVersion format_version_, add(name); } -/// FIXME replace warnings with logical errors -bool ActiveDataPartSet::add(const String & name, Strings * out_replaced_parts, Poco::Logger * log) +bool ActiveDataPartSet::add(const String & name, Strings * out_replaced_parts) { /// TODO make it exception safe (out_replaced_parts->push_back(...) may throw) auto part_info = MergeTreePartInfo::fromPartName(name, format_version); @@ -38,11 +42,7 @@ bool ActiveDataPartSet::add(const String & name, Strings * out_replaced_parts, P if (!part_info.contains(it->first)) { if (!part_info.isDisjoint(it->first)) - { - if (log) - LOG_ERROR(log, "Part {} intersects previous part {}. It is a bug.", name, it->first.getPartName()); - assert(false); - } + throw Exception(ErrorCodes::LOGICAL_ERROR, "Part {} intersects previous part {}. It is a bug.", name, it->first.getPartName()); ++it; break; } @@ -65,11 +65,7 @@ bool ActiveDataPartSet::add(const String & name, Strings * out_replaced_parts, P } if (it != part_info_to_name.end() && !part_info.isDisjoint(it->first)) - { - if (log) - LOG_ERROR(log, "Part {} intersects next part {}. It is a bug.", name, it->first.getPartName()); - assert(false); - } + throw Exception(ErrorCodes::LOGICAL_ERROR, "Part {} intersects next part {}. It is a bug.", name, it->first.getPartName()); part_info_to_name.emplace(part_info, name); return true; diff --git a/src/Storages/MergeTree/ActiveDataPartSet.h b/src/Storages/MergeTree/ActiveDataPartSet.h index 188bba91795..3d0ac8f949d 100644 --- a/src/Storages/MergeTree/ActiveDataPartSet.h +++ b/src/Storages/MergeTree/ActiveDataPartSet.h @@ -50,7 +50,7 @@ public: /// Returns true if the part was actually added. If out_replaced_parts != nullptr, it will contain /// parts that were replaced from the set by the newly added part. - bool add(const String & name, Strings * out_replaced_parts = nullptr, Poco::Logger * log = nullptr); + bool add(const String & name, Strings * out_replaced_parts = nullptr); bool remove(const MergeTreePartInfo & part_info) { diff --git a/src/Storages/MergeTree/BackgroundJobsExecutor.cpp b/src/Storages/MergeTree/BackgroundJobsExecutor.cpp index 36803ba5197..f3d957117e8 100644 --- a/src/Storages/MergeTree/BackgroundJobsExecutor.cpp +++ b/src/Storages/MergeTree/BackgroundJobsExecutor.cpp @@ -146,6 +146,9 @@ try catch (...) /// Exception while we looking for a task, reschedule { tryLogCurrentException(__PRETTY_FUNCTION__); + + /// Why do we scheduleTask again? + /// To retry on exception, since it may be some temporary exception. scheduleTask(/* with_backoff = */ true); } @@ -180,10 +183,16 @@ void IBackgroundJobExecutor::triggerTask() } void IBackgroundJobExecutor::backgroundTaskFunction() +try { if (!scheduleJob()) scheduleTask(/* with_backoff = */ true); } +catch (...) /// Catch any exception to avoid thread termination. +{ + tryLogCurrentException(__PRETTY_FUNCTION__); + scheduleTask(/* with_backoff = */ true); +} IBackgroundJobExecutor::~IBackgroundJobExecutor() { diff --git a/src/Storages/MergeTree/DataPartsExchange.cpp b/src/Storages/MergeTree/DataPartsExchange.cpp index ff6101fce07..6ff9c16dad5 100644 --- a/src/Storages/MergeTree/DataPartsExchange.cpp +++ b/src/Storages/MergeTree/DataPartsExchange.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include #include @@ -15,7 +16,8 @@ #include #include #include - +#include +#include namespace fs = std::filesystem; @@ -40,6 +42,7 @@ namespace ErrorCodes extern const int LOGICAL_ERROR; extern const int S3_ERROR; extern const int INCORRECT_PART_TYPE; + extern const int ZERO_COPY_REPLICATION_ERROR; } namespace DataPartsExchange @@ -52,7 +55,7 @@ constexpr auto REPLICATION_PROTOCOL_VERSION_WITH_PARTS_SIZE_AND_TTL_INFOS = 2; constexpr auto REPLICATION_PROTOCOL_VERSION_WITH_PARTS_TYPE = 3; constexpr auto REPLICATION_PROTOCOL_VERSION_WITH_PARTS_DEFAULT_COMPRESSION = 4; constexpr auto REPLICATION_PROTOCOL_VERSION_WITH_PARTS_UUID = 5; -constexpr auto REPLICATION_PROTOCOL_VERSION_WITH_PARTS_S3_COPY = 6; +constexpr auto REPLICATION_PROTOCOL_VERSION_WITH_PARTS_ZERO_COPY = 6; constexpr auto REPLICATION_PROTOCOL_VERSION_WITH_PARTS_PROJECTION = 7; @@ -168,27 +171,27 @@ void Service::processQuery(const HTMLForm & params, ReadBuffer & /*body*/, Write if (client_protocol_version >= REPLICATION_PROTOCOL_VERSION_WITH_PARTS_UUID) writeUUIDText(part->uuid, out); - bool try_use_s3_copy = false; + String remote_fs_metadata = parse(params.get("remote_fs_metadata", "")); + std::regex re("\\s*,\\s*"); + Strings capability( + std::sregex_token_iterator(remote_fs_metadata.begin(), remote_fs_metadata.end(), re, -1), + std::sregex_token_iterator()); - if (data_settings->allow_s3_zero_copy_replication - && client_protocol_version >= REPLICATION_PROTOCOL_VERSION_WITH_PARTS_S3_COPY) - { /// if source and destination are in the same S3 storage we try to use S3 CopyObject request first - int send_s3_metadata = parse(params.get("send_s3_metadata", "0")); - if (send_s3_metadata == 1) + if (data_settings->allow_remote_fs_zero_copy_replication && + client_protocol_version >= REPLICATION_PROTOCOL_VERSION_WITH_PARTS_ZERO_COPY) + { + auto disk = part->volume->getDisk(); + auto disk_type = DiskType::toString(disk->getType()); + if (disk->supportZeroCopyReplication() && std::find(capability.begin(), capability.end(), disk_type) != capability.end()) { - auto disk = part->volume->getDisk(); - if (disk->getType() == DB::DiskType::Type::S3) - { - try_use_s3_copy = true; - } + /// Send metadata if the receiver's capability covers the source disk type. + response.addCookie({"remote_fs_metadata", disk_type}); + sendPartFromDiskRemoteMeta(part, out); + return; } } - if (try_use_s3_copy) - { - response.addCookie({"send_s3_metadata", "1"}); - sendPartS3Metadata(part, out); - } - else if (client_protocol_version >= REPLICATION_PROTOCOL_VERSION_WITH_PARTS_PROJECTION) + + if (client_protocol_version >= REPLICATION_PROTOCOL_VERSION_WITH_PARTS_PROJECTION) { const auto & projections = part->getProjectionParts(); writeBinary(projections.size(), out); @@ -323,7 +326,7 @@ MergeTreeData::DataPart::Checksums Service::sendPartFromDisk( return data_checksums; } -void Service::sendPartS3Metadata(const MergeTreeData::DataPartPtr & part, WriteBuffer & out) +void Service::sendPartFromDiskRemoteMeta(const MergeTreeData::DataPartPtr & part, WriteBuffer & out) { /// We'll take a list of files from the list of checksums. MergeTreeData::DataPart::Checksums checksums = part->checksums; @@ -333,8 +336,8 @@ void Service::sendPartS3Metadata(const MergeTreeData::DataPartPtr & part, WriteB checksums.files[file_name] = {}; auto disk = part->volume->getDisk(); - if (disk->getType() != DB::DiskType::Type::S3) - throw Exception("S3 disk is not S3 anymore", ErrorCodes::LOGICAL_ERROR); + if (!disk->supportZeroCopyReplication()) + throw Exception(fmt::format("disk {} doesn't support zero-copy replication", disk->getName()), ErrorCodes::LOGICAL_ERROR); part->storage.lockSharedData(*part); @@ -351,9 +354,9 @@ void Service::sendPartS3Metadata(const MergeTreeData::DataPartPtr & part, WriteB fs::path metadata(metadata_file); if (!fs::exists(metadata)) - throw Exception("S3 metadata '" + file_name + "' is not exists", ErrorCodes::CORRUPTED_DATA); + throw Exception("Remote metadata '" + file_name + "' is not exists", ErrorCodes::CORRUPTED_DATA); if (!fs::is_regular_file(metadata)) - throw Exception("S3 metadata '" + file_name + "' is not a file", ErrorCodes::CORRUPTED_DATA); + throw Exception("Remote metadata '" + file_name + "' is not a file", ErrorCodes::CORRUPTED_DATA); UInt64 file_size = fs::file_size(metadata); writeStringBinary(it.first, out); @@ -399,8 +402,8 @@ MergeTreeData::MutableDataPartPtr Fetcher::fetchPart( bool to_detached, const String & tmp_prefix_, std::optional * tagger_ptr, - bool try_use_s3_copy, - const DiskPtr disk_s3) + bool try_zero_copy, + DiskPtr disk) { if (blocker.isCancelled()) throw Exception("Fetching of part was cancelled", ErrorCodes::ABORTED); @@ -421,30 +424,34 @@ MergeTreeData::MutableDataPartPtr Fetcher::fetchPart( {"compress", "false"} }); - if (try_use_s3_copy && disk_s3 && disk_s3->getType() != DB::DiskType::Type::S3) - throw Exception("Try to fetch shared s3 part on non-s3 disk", ErrorCodes::LOGICAL_ERROR); - - Disks disks_s3; - - if (!data_settings->allow_s3_zero_copy_replication) - try_use_s3_copy = false; - - if (try_use_s3_copy) + Strings capability; + if (try_zero_copy && data_settings->allow_remote_fs_zero_copy_replication) { - if (disk_s3) - disks_s3.push_back(disk_s3); - else + if (!disk) { - disks_s3 = data.getDisksByType(DiskType::Type::S3); - - if (disks_s3.empty()) - try_use_s3_copy = false; + DiskType::Type zero_copy_disk_types[] = {DiskType::Type::S3, DiskType::Type::HDFS}; + for (auto disk_type: zero_copy_disk_types) + { + Disks disks = data.getDisksByType(disk_type); + if (!disks.empty()) + { + capability.push_back(DiskType::toString(disk_type)); + } + } + } + else if (disk->supportZeroCopyReplication()) + { + capability.push_back(DiskType::toString(disk->getType())); } } - - if (try_use_s3_copy) + if (!capability.empty()) { - uri.addQueryParameter("send_s3_metadata", "1"); + const String & remote_fs_metadata = boost::algorithm::join(capability, ", "); + uri.addQueryParameter("remote_fs_metadata", remote_fs_metadata); + } + else + { + try_zero_copy = false; } Poco::Net::HTTPBasicCredentials creds{}; @@ -467,73 +474,6 @@ MergeTreeData::MutableDataPartPtr Fetcher::fetchPart( int server_protocol_version = parse(in.getResponseCookie("server_protocol_version", "0")); - int send_s3 = parse(in.getResponseCookie("send_s3_metadata", "0")); - - if (send_s3 == 1) - { - if (server_protocol_version < REPLICATION_PROTOCOL_VERSION_WITH_PARTS_S3_COPY) - throw Exception("Got 'send_s3_metadata' cookie with old protocol version", ErrorCodes::LOGICAL_ERROR); - if (!try_use_s3_copy) - throw Exception("Got 'send_s3_metadata' cookie when was not requested", ErrorCodes::LOGICAL_ERROR); - - size_t sum_files_size = 0; - readBinary(sum_files_size, in); - IMergeTreeDataPart::TTLInfos ttl_infos; - String ttl_infos_string; - readBinary(ttl_infos_string, in); - ReadBufferFromString ttl_infos_buffer(ttl_infos_string); - assertString("ttl format version: 1\n", ttl_infos_buffer); - ttl_infos.read(ttl_infos_buffer); - - ReservationPtr reservation - = data.balancedReservation(metadata_snapshot, sum_files_size, 0, part_name, part_info, {}, tagger_ptr, &ttl_infos, true); - if (!reservation) - reservation - = data.reserveSpacePreferringTTLRules(metadata_snapshot, sum_files_size, ttl_infos, std::time(nullptr), 0, true); - if (reservation) - { - /// When we have multi-volume storage, one of them was chosen, depends on TTL, free space, etc. - /// Chosen one may be S3 or not. - DiskPtr disk = reservation->getDisk(); - if (disk && disk->getType() == DiskType::Type::S3) - { - for (const auto & d : disks_s3) - { - if (d->getPath() == disk->getPath()) - { - Disks disks_tmp = { disk }; - disks_s3.swap(disks_tmp); - break; - } - } - } - } - - String part_type = "Wide"; - readStringBinary(part_type, in); - if (part_type == "InMemory") - throw Exception("Got 'send_s3_metadata' cookie for in-memory part", ErrorCodes::INCORRECT_PART_TYPE); - - UUID part_uuid = UUIDHelpers::Nil; - - /// Always true due to values of constants. But we keep this condition just in case. - if (server_protocol_version >= REPLICATION_PROTOCOL_VERSION_WITH_PARTS_UUID) //-V547 - readUUIDText(part_uuid, in); - - try - { - return downloadPartToS3(part_name, replica_path, to_detached, tmp_prefix_, std::move(disks_s3), in, throttler); - } - catch (const Exception & e) - { - if (e.code() != ErrorCodes::S3_ERROR) - throw; - /// Try again but without S3 copy - return fetchPart(metadata_snapshot, context, part_name, replica_path, host, port, timeouts, - user, password, interserver_scheme, throttler, to_detached, tmp_prefix_, nullptr, false); - } - } - ReservationPtr reservation; size_t sum_files_size = 0; if (server_protocol_version >= REPLICATION_PROTOCOL_VERSION_WITH_PARTS_SIZE) @@ -547,24 +487,29 @@ MergeTreeData::MutableDataPartPtr Fetcher::fetchPart( ReadBufferFromString ttl_infos_buffer(ttl_infos_string); assertString("ttl format version: 1\n", ttl_infos_buffer); ttl_infos.read(ttl_infos_buffer); - reservation - = data.balancedReservation(metadata_snapshot, sum_files_size, 0, part_name, part_info, {}, tagger_ptr, &ttl_infos, true); - if (!reservation) + if (!disk) + { reservation - = data.reserveSpacePreferringTTLRules(metadata_snapshot, sum_files_size, ttl_infos, std::time(nullptr), 0, true); + = data.balancedReservation(metadata_snapshot, sum_files_size, 0, part_name, part_info, {}, tagger_ptr, &ttl_infos, true); + if (!reservation) + reservation + = data.reserveSpacePreferringTTLRules(metadata_snapshot, sum_files_size, ttl_infos, std::time(nullptr), 0, true); + } } - else + else if (!disk) { reservation = data.balancedReservation(metadata_snapshot, sum_files_size, 0, part_name, part_info, {}, tagger_ptr, nullptr); if (!reservation) reservation = data.reserveSpace(sum_files_size); } } - else + else if (!disk) { /// We don't know real size of part because sender server version is too old reservation = data.makeEmptyReservationOnLargestDisk(); } + if (!disk) + disk = reservation->getDisk(); bool sync = (data_settings->min_compressed_bytes_to_fsync_after_fetch && sum_files_size >= data_settings->min_compressed_bytes_to_fsync_after_fetch); @@ -577,8 +522,35 @@ MergeTreeData::MutableDataPartPtr Fetcher::fetchPart( if (server_protocol_version >= REPLICATION_PROTOCOL_VERSION_WITH_PARTS_UUID) readUUIDText(part_uuid, in); + String remote_fs_metadata = parse(in.getResponseCookie("remote_fs_metadata", "")); + if (!remote_fs_metadata.empty()) + { + if (!try_zero_copy) + throw Exception("Got unexpected 'remote_fs_metadata' cookie", ErrorCodes::LOGICAL_ERROR); + if (std::find(capability.begin(), capability.end(), remote_fs_metadata) == capability.end()) + throw Exception(fmt::format("Got 'remote_fs_metadata' cookie {}, expect one from {}", remote_fs_metadata, fmt::join(capability, ", ")), ErrorCodes::LOGICAL_ERROR); + if (server_protocol_version < REPLICATION_PROTOCOL_VERSION_WITH_PARTS_ZERO_COPY) + throw Exception(fmt::format("Got 'remote_fs_metadata' cookie with old protocol version {}", server_protocol_version), ErrorCodes::LOGICAL_ERROR); + if (part_type == "InMemory") + throw Exception("Got 'remote_fs_metadata' cookie for in-memory part", ErrorCodes::INCORRECT_PART_TYPE); + + try + { + return downloadPartToDiskRemoteMeta(part_name, replica_path, to_detached, tmp_prefix_, disk, in, throttler); + } + catch (const Exception & e) + { + if (e.code() != ErrorCodes::S3_ERROR && e.code() != ErrorCodes::ZERO_COPY_REPLICATION_ERROR) + throw; + LOG_WARNING(log, e.message() + " Will retry fetching part without zero-copy."); + /// Try again but without zero-copy + return fetchPart(metadata_snapshot, context, part_name, replica_path, host, port, timeouts, + user, password, interserver_scheme, throttler, to_detached, tmp_prefix_, nullptr, false, disk); + } + } + auto storage_id = data.getStorageID(); - String new_part_path = part_type == "InMemory" ? "memory" : fs::path(data.getFullPathOnDisk(reservation->getDisk())) / part_name / ""; + String new_part_path = part_type == "InMemory" ? "memory" : fs::path(data.getFullPathOnDisk(disk)) / part_name / ""; auto entry = data.getContext()->getReplicatedFetchList().insert( storage_id.getDatabaseName(), storage_id.getTableName(), part_info.partition_id, part_name, new_part_path, @@ -586,15 +558,14 @@ MergeTreeData::MutableDataPartPtr Fetcher::fetchPart( in.setNextCallback(ReplicatedFetchReadCallback(*entry)); - size_t projections = 0; if (server_protocol_version >= REPLICATION_PROTOCOL_VERSION_WITH_PARTS_PROJECTION) readBinary(projections, in); MergeTreeData::DataPart::Checksums checksums; return part_type == "InMemory" - ? downloadPartToMemory(part_name, part_uuid, metadata_snapshot, context, std::move(reservation), in, projections, throttler) - : downloadPartToDisk(part_name, replica_path, to_detached, tmp_prefix_, sync, reservation->getDisk(), in, projections, checksums, throttler); + ? downloadPartToMemory(part_name, part_uuid, metadata_snapshot, context, disk, in, projections, throttler) + : downloadPartToDisk(part_name, replica_path, to_detached, tmp_prefix_, sync, disk, in, projections, checksums, throttler); } MergeTreeData::MutableDataPartPtr Fetcher::downloadPartToMemory( @@ -602,12 +573,12 @@ MergeTreeData::MutableDataPartPtr Fetcher::downloadPartToMemory( const UUID & part_uuid, const StorageMetadataPtr & metadata_snapshot, ContextPtr context, - ReservationPtr reservation, + DiskPtr disk, PooledReadWriteBufferFromHTTP & in, size_t projections, ThrottlerPtr throttler) { - auto volume = std::make_shared("volume_" + part_name, reservation->getDisk(), 0); + auto volume = std::make_shared("volume_" + part_name, disk, 0); MergeTreeData::MutableDataPartPtr new_data_part = std::make_shared(data, part_name, volume); @@ -741,7 +712,7 @@ MergeTreeData::MutableDataPartPtr Fetcher::downloadPartToDisk( MergeTreeData::DataPart::Checksums & checksums, ThrottlerPtr throttler) { - static const String TMP_PREFIX = "tmp_fetch_"; + static const String TMP_PREFIX = "tmp-fetch_"; String tmp_prefix = tmp_prefix_.empty() ? TMP_PREFIX : tmp_prefix_; /// We will remove directory if it's already exists. Make precautions. @@ -794,33 +765,26 @@ MergeTreeData::MutableDataPartPtr Fetcher::downloadPartToDisk( return new_data_part; } -MergeTreeData::MutableDataPartPtr Fetcher::downloadPartToS3( +MergeTreeData::MutableDataPartPtr Fetcher::downloadPartToDiskRemoteMeta( const String & part_name, const String & replica_path, bool to_detached, const String & tmp_prefix_, - const Disks & disks_s3, + DiskPtr disk, PooledReadWriteBufferFromHTTP & in, ThrottlerPtr throttler) { - if (disks_s3.empty()) - throw Exception("No S3 disks anymore", ErrorCodes::LOGICAL_ERROR); - String part_id; readStringBinary(part_id, in); - DiskPtr disk = disks_s3[0]; - - for (const auto & disk_s3 : disks_s3) + if (!disk->supportZeroCopyReplication() || !disk->checkUniqueId(part_id)) { - if (disk_s3->checkUniqueId(part_id)) - { - disk = disk_s3; - break; - } + throw Exception(fmt::format("Part {} unique id {} doesn't exist on {}.", part_name, part_id, disk->getName()), ErrorCodes::ZERO_COPY_REPLICATION_ERROR); } + LOG_DEBUG(log, "Downloading Part {} unique id {} metadata onto disk {}.", + part_name, part_id, disk->getName()); - static const String TMP_PREFIX = "tmp_fetch_"; + static const String TMP_PREFIX = "tmp-fetch_"; String tmp_prefix = tmp_prefix_.empty() ? TMP_PREFIX : tmp_prefix_; String part_relative_path = String(to_detached ? "detached/" : "") + tmp_prefix + part_name; diff --git a/src/Storages/MergeTree/DataPartsExchange.h b/src/Storages/MergeTree/DataPartsExchange.h index eb776c33f0f..0c12cc51cc7 100644 --- a/src/Storages/MergeTree/DataPartsExchange.h +++ b/src/Storages/MergeTree/DataPartsExchange.h @@ -50,7 +50,7 @@ private: int client_protocol_version, const std::map> & projections = {}); - void sendPartS3Metadata(const MergeTreeData::DataPartPtr & part, WriteBuffer & out); + void sendPartFromDiskRemoteMeta(const MergeTreeData::DataPartPtr & part, WriteBuffer & out); /// StorageReplicatedMergeTree::shutdown() waits for all parts exchange handlers to finish, /// so Service will never access dangling reference to storage @@ -81,8 +81,8 @@ public: bool to_detached = false, const String & tmp_prefix_ = "", std::optional * tagger_ptr = nullptr, - bool try_use_s3_copy = true, - const DiskPtr disk_s3 = nullptr); + bool try_zero_copy = true, + DiskPtr dest_disk = nullptr); /// You need to stop the data transfer. ActionBlocker blocker; @@ -115,17 +115,17 @@ private: const UUID & part_uuid, const StorageMetadataPtr & metadata_snapshot, ContextPtr context, - ReservationPtr reservation, + DiskPtr disk, PooledReadWriteBufferFromHTTP & in, size_t projections, ThrottlerPtr throttler); - MergeTreeData::MutableDataPartPtr downloadPartToS3( + MergeTreeData::MutableDataPartPtr downloadPartToDiskRemoteMeta( const String & part_name, const String & replica_path, bool to_detached, const String & tmp_prefix_, - const Disks & disks_s3, + DiskPtr disk, PooledReadWriteBufferFromHTTP & in, ThrottlerPtr throttler); diff --git a/src/Storages/MergeTree/DropPartsRanges.cpp b/src/Storages/MergeTree/DropPartsRanges.cpp new file mode 100644 index 00000000000..ab808f59970 --- /dev/null +++ b/src/Storages/MergeTree/DropPartsRanges.cpp @@ -0,0 +1,65 @@ +#include + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int LOGICAL_ERROR; +} + + +bool DropPartsRanges::isAffectedByDropRange(const std::string & new_part_name, std::string & postpone_reason) const +{ + if (new_part_name.empty()) + return false; + + MergeTreePartInfo entry_info = MergeTreePartInfo::fromPartName(new_part_name, format_version); + for (const auto & [znode, drop_range] : drop_ranges) + { + if (!drop_range.isDisjoint(entry_info)) + { + postpone_reason = fmt::format("Has DROP RANGE affecting entry {} producing part {}. Will postpone it's execution.", drop_range.getPartName(), new_part_name); + return true; + } + } + + return false; +} + +bool DropPartsRanges::isAffectedByDropRange(const ReplicatedMergeTreeLogEntry & entry, std::string & postpone_reason) const +{ + return isAffectedByDropRange(entry.new_part_name, postpone_reason); +} + +void DropPartsRanges::addDropRange(const ReplicatedMergeTreeLogEntryPtr & entry) +{ + if (entry->type != ReplicatedMergeTreeLogEntry::DROP_RANGE) + throw Exception(ErrorCodes::LOGICAL_ERROR, "Trying to add entry of type {} to drop ranges, expected DROP_RANGE", entry->typeToString()); + + MergeTreePartInfo entry_info = MergeTreePartInfo::fromPartName(*entry->getDropRange(format_version), format_version); + drop_ranges.emplace(entry->znode_name, entry_info); +} + +void DropPartsRanges::removeDropRange(const ReplicatedMergeTreeLogEntryPtr & entry) +{ + if (entry->type != ReplicatedMergeTreeLogEntry::DROP_RANGE) + throw Exception(ErrorCodes::LOGICAL_ERROR, "Trying to remove entry of type {} from drop ranges, expected DROP_RANGE", entry->typeToString()); + + auto it = drop_ranges.find(entry->znode_name); + assert(it != drop_ranges.end()); + drop_ranges.erase(it); +} + +bool DropPartsRanges::hasDropRange(const MergeTreePartInfo & new_drop_range_info) const +{ + for (const auto & [znode_name, drop_range] : drop_ranges) + { + if (drop_range.contains(new_drop_range_info)) + return true; + } + + return false; +} + +} diff --git a/src/Storages/MergeTree/DropPartsRanges.h b/src/Storages/MergeTree/DropPartsRanges.h new file mode 100644 index 00000000000..4d512263058 --- /dev/null +++ b/src/Storages/MergeTree/DropPartsRanges.h @@ -0,0 +1,43 @@ +#pragma once + +#include +#include +#include +#include + +namespace DB +{ + +/// All drop ranges in ReplicatedQueue. +/// Used to postpone execution of entries affected by DROP RANGE +class DropPartsRanges +{ +private: + MergeTreeDataFormatVersion format_version; + + /// znode_name -> drop_range + std::unordered_map drop_ranges; +public: + + explicit DropPartsRanges(MergeTreeDataFormatVersion format_version_) + : format_version(format_version_) + {} + + /// Entry is affected by DROP_RANGE and must be postponed + bool isAffectedByDropRange(const ReplicatedMergeTreeLogEntry & entry, std::string & postpone_reason) const; + + /// Part is affected by DROP_RANGE and must be postponed + bool isAffectedByDropRange(const std::string & new_part_name, std::string & postpone_reason) const; + + /// Already has equal DROP_RANGE. Don't need to assign new one + bool hasDropRange(const MergeTreePartInfo & new_drop_range_info) const; + + /// Add DROP_RANGE to map + void addDropRange(const ReplicatedMergeTreeLogEntryPtr & entry); + + /// Remove DROP_RANGE from map + void removeDropRange(const ReplicatedMergeTreeLogEntryPtr & entry); + +}; + +} diff --git a/src/Storages/MergeTree/IMergeTreeDataPart.cpp b/src/Storages/MergeTree/IMergeTreeDataPart.cpp index 8fe6a0a484b..db271cc280b 100644 --- a/src/Storages/MergeTree/IMergeTreeDataPart.cpp +++ b/src/Storages/MergeTree/IMergeTreeDataPart.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -78,6 +79,12 @@ void IMergeTreeDataPart::MinMaxIndex::load(const MergeTreeData & data, const Dis Field max_val; serialization->deserializeBinary(max_val, *file); + // NULL_LAST + if (min_val.isNull()) + min_val = PositiveInfinity(); + if (max_val.isNull()) + max_val = PositiveInfinity(); + hyperrectangle.emplace_back(min_val, true, max_val, true); } initialized = true; @@ -132,14 +139,19 @@ void IMergeTreeDataPart::MinMaxIndex::update(const Block & block, const Names & FieldRef min_value; FieldRef max_value; const ColumnWithTypeAndName & column = block.getByName(column_names[i]); - column.column->getExtremes(min_value, max_value); + if (const auto * column_nullable = typeid_cast(column.column.get())) + column_nullable->getExtremesNullLast(min_value, max_value); + else + column.column->getExtremes(min_value, max_value); if (!initialized) hyperrectangle.emplace_back(min_value, true, max_value, true); else { - hyperrectangle[i].left = std::min(hyperrectangle[i].left, min_value); - hyperrectangle[i].right = std::max(hyperrectangle[i].right, max_value); + hyperrectangle[i].left + = applyVisitor(FieldVisitorAccurateLess(), hyperrectangle[i].left, min_value) ? hyperrectangle[i].left : min_value; + hyperrectangle[i].right + = applyVisitor(FieldVisitorAccurateLess(), hyperrectangle[i].right, max_value) ? max_value : hyperrectangle[i].right; } } @@ -1103,7 +1115,7 @@ void IMergeTreeDataPart::renameTo(const String & new_relative_path, bool remove_ std::optional IMergeTreeDataPart::keepSharedDataInDecoupledStorage() const { - /// NOTE: It's needed for S3 zero-copy replication + /// NOTE: It's needed for zero-copy replication if (force_keep_shared_data) return true; @@ -1310,6 +1322,9 @@ String IMergeTreeDataPart::getRelativePathForDetachedPart(const String & prefix) { /// Do not allow underscores in the prefix because they are used as separators. assert(prefix.find_first_of('_') == String::npos); + assert(prefix.empty() || std::find(DetachedPartInfo::DETACH_REASONS.begin(), + DetachedPartInfo::DETACH_REASONS.end(), + prefix) != DetachedPartInfo::DETACH_REASONS.end()); return "detached/" + getRelativePathForPrefix(prefix); } @@ -1501,16 +1516,11 @@ SerializationPtr IMergeTreeDataPart::getSerializationForColumn(const NameAndType String IMergeTreeDataPart::getUniqueId() const { - String id; - auto disk = volume->getDisk(); + if (!disk->supportZeroCopyReplication()) + throw Exception(fmt::format("Disk {} doesn't support zero-copy replication", disk->getName()), ErrorCodes::LOGICAL_ERROR); - if (disk->getType() == DB::DiskType::Type::S3) - id = disk->getUniqueId(fs::path(getFullRelativePath()) / "checksums.txt"); - - if (id.empty()) - throw Exception("Can't get unique S3 object", ErrorCodes::LOGICAL_ERROR); - + String id = disk->getUniqueId(fs::path(getFullRelativePath()) / "checksums.txt"); return id; } diff --git a/src/Storages/MergeTree/IMergeTreeDataPart.h b/src/Storages/MergeTree/IMergeTreeDataPart.h index 54fcfc1adc9..8b7a15e5da0 100644 --- a/src/Storages/MergeTree/IMergeTreeDataPart.h +++ b/src/Storages/MergeTree/IMergeTreeDataPart.h @@ -1,7 +1,5 @@ #pragma once -#include - #include #include #include @@ -19,6 +17,7 @@ #include + namespace zkutil { class ZooKeeper; @@ -374,7 +373,7 @@ public: void loadProjections(bool require_columns_checksums, bool check_consistency); - /// Return set of metadat file names without checksums. For example, + /// Return set of metadata file names without checksums. For example, /// columns.txt or checksums.txt itself. NameSet getFileNamesWithoutChecksums() const; diff --git a/src/Storages/MergeTree/IMergeTreeReader.cpp b/src/Storages/MergeTree/IMergeTreeReader.cpp index 14187564536..d659259e1a9 100644 --- a/src/Storages/MergeTree/IMergeTreeReader.cpp +++ b/src/Storages/MergeTree/IMergeTreeReader.cpp @@ -33,6 +33,7 @@ IMergeTreeReader::IMergeTreeReader( : data_part(data_part_) , avg_value_size_hints(avg_value_size_hints_) , columns(columns_) + , part_columns(data_part->getColumns()) , uncompressed_cache(uncompressed_cache_) , mark_cache(mark_cache_) , settings(settings_) @@ -41,15 +42,14 @@ IMergeTreeReader::IMergeTreeReader( , all_mark_ranges(all_mark_ranges_) , alter_conversions(storage.getAlterConversionsForPart(data_part)) { - auto part_columns = data_part->getColumns(); if (settings.convert_nested_to_subcolumns) { columns = Nested::convertToSubcolumns(columns); part_columns = Nested::collect(part_columns); } - for (const NameAndTypePair & column_from_part : part_columns) - columns_from_part[column_from_part.name] = column_from_part.type; + for (const auto & column_from_part : part_columns) + columns_from_part[column_from_part.name] = &column_from_part.type; } IMergeTreeReader::~IMergeTreeReader() = default; @@ -212,7 +212,7 @@ NameAndTypePair IMergeTreeReader::getColumnFromPart(const NameAndTypePair & requ { auto name_in_storage = required_column.getNameInStorage(); - decltype(columns_from_part.begin()) it; + ColumnsFromPart::ConstLookupResult it; if (alter_conversions.isColumnRenamed(name_in_storage)) { String old_name = alter_conversions.getColumnOldName(name_in_storage); @@ -226,18 +226,19 @@ NameAndTypePair IMergeTreeReader::getColumnFromPart(const NameAndTypePair & requ if (it == columns_from_part.end()) return required_column; + const DataTypePtr & type = *it->getMapped(); if (required_column.isSubcolumn()) { auto subcolumn_name = required_column.getSubcolumnName(); - auto subcolumn_type = it->second->tryGetSubcolumnType(subcolumn_name); + auto subcolumn_type = type->tryGetSubcolumnType(subcolumn_name); if (!subcolumn_type) return required_column; - return {it->first, subcolumn_name, it->second, subcolumn_type}; + return {String(it->getKey()), subcolumn_name, type, subcolumn_type}; } - return {it->first, it->second}; + return {String(it->getKey()), type}; } void IMergeTreeReader::performRequiredConversions(Columns & res_columns) diff --git a/src/Storages/MergeTree/IMergeTreeReader.h b/src/Storages/MergeTree/IMergeTreeReader.h index 0771bc3d5cb..696cc2f105b 100644 --- a/src/Storages/MergeTree/IMergeTreeReader.h +++ b/src/Storages/MergeTree/IMergeTreeReader.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -72,6 +73,7 @@ protected: /// Columns that are read. NamesAndTypesList columns; + NamesAndTypesList part_columns; UncompressedCache * uncompressed_cache; MarkCache * mark_cache; @@ -92,7 +94,9 @@ private: MergeTreeData::AlterConversions alter_conversions; /// Actual data type of columns in part - std::unordered_map columns_from_part; + + using ColumnsFromPart = HashMapWithSavedHash; + ColumnsFromPart columns_from_part; }; } diff --git a/src/Storages/MergeTree/KeyCondition.cpp b/src/Storages/MergeTree/KeyCondition.cpp index 476032e66aa..b8896d535b4 100644 --- a/src/Storages/MergeTree/KeyCondition.cpp +++ b/src/Storages/MergeTree/KeyCondition.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -43,15 +44,8 @@ String Range::toString() const { WriteBufferFromOwnString str; - if (!left_bounded) - str << "(-inf, "; - else - str << (left_included ? '[' : '(') << applyVisitor(FieldVisitorToString(), left) << ", "; - - if (!right_bounded) - str << "+inf)"; - else - str << applyVisitor(FieldVisitorToString(), right) << (right_included ? ']' : ')'); + str << (left_included ? '[' : '(') << applyVisitor(FieldVisitorToString(), left) << ", "; + str << applyVisitor(FieldVisitorToString(), right) << (right_included ? ']' : ')'); return str.str(); } @@ -205,6 +199,38 @@ const KeyCondition::AtomMap KeyCondition::atom_map return true; } }, + { + "nullIn", + [] (RPNElement & out, const Field &) + { + out.function = RPNElement::FUNCTION_IN_SET; + return true; + } + }, + { + "notNullIn", + [] (RPNElement & out, const Field &) + { + out.function = RPNElement::FUNCTION_NOT_IN_SET; + return true; + } + }, + { + "globalNullIn", + [] (RPNElement & out, const Field &) + { + out.function = RPNElement::FUNCTION_IN_SET; + return true; + } + }, + { + "globalNotNullIn", + [] (RPNElement & out, const Field &) + { + out.function = RPNElement::FUNCTION_NOT_IN_SET; + return true; + } + }, { "empty", [] (RPNElement & out, const Field & value) @@ -291,6 +317,26 @@ const KeyCondition::AtomMap KeyCondition::atom_map return true; } + }, + { + "isNotNull", + [] (RPNElement & out, const Field &) + { + out.function = RPNElement::FUNCTION_IS_NOT_NULL; + // isNotNull means (-Inf, +Inf), which is the default Range + out.range = Range(); + return true; + } + }, + { + "isNull", + [] (RPNElement & out, const Field &) + { + out.function = RPNElement::FUNCTION_IS_NULL; + // When using NULL_LAST, isNull means [+Inf, +Inf] + out.range = Range(Field(PositiveInfinity{})); + return true; + } } }; @@ -304,6 +350,14 @@ static const std::map inverse_relations = { {"lessOrEquals", "greater"}, {"in", "notIn"}, {"notIn", "in"}, + {"globalIn", "globalNotIn"}, + {"globalNotIn", "globalIn"}, + {"nullIn", "notNullIn"}, + {"notNullIn", "nullIn"}, + {"globalNullIn", "globalNotNullIn"}, + {"globalNullNotIn", "globalNullIn"}, + {"isNull", "isNotNull"}, + {"isNotNull", "isNull"}, {"like", "notLike"}, {"notLike", "like"}, {"empty", "notEmpty"}, @@ -478,6 +532,11 @@ bool KeyCondition::getConstant(const ASTPtr & expr, Block & block_with_constants /// Simple literal out_value = lit->value; out_type = block_with_constants.getByName(column_name).type; + + /// If constant is not Null, we can assume it's type is not Nullable as well. + if (!out_value.isNull()) + out_type = removeNullable(out_type); + return true; } else if (block_with_constants.has(column_name) && isColumnConst(*block_with_constants.getByName(column_name).column)) @@ -486,6 +545,10 @@ bool KeyCondition::getConstant(const ASTPtr & expr, Block & block_with_constants const auto & expr_info = block_with_constants.getByName(column_name); out_value = (*expr_info.column)[0]; out_type = expr_info.type; + + if (!out_value.isNull()) + out_type = removeNullable(out_type); + return true; } else @@ -620,7 +683,6 @@ bool KeyCondition::canConstantBeWrappedByMonotonicFunctions( if (key_subexpr_names.count(expr_name) == 0) return false; - /// TODO Nullable index is not yet landed. if (out_value.isNull()) return false; @@ -745,7 +807,6 @@ bool KeyCondition::canConstantBeWrappedByFunctions( const auto & sample_block = key_expr->getSampleBlock(); - /// TODO Nullable index is not yet landed. if (out_value.isNull()) return false; @@ -995,6 +1056,8 @@ public: bool hasInformationAboutMonotonicity() const override { return func->hasInformationAboutMonotonicity(); } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & arguments) const override { return func->isSuitableForShortCircuitArgumentsExecution(arguments); } + IFunctionBase::Monotonicity getMonotonicityForRange(const IDataType & type, const Field & left, const Field & right) const override { return func->getMonotonicityForRange(type, left, right); @@ -1147,7 +1210,7 @@ static void castValueToType(const DataTypePtr & desired_type, Field & src_value, bool KeyCondition::tryParseAtomFromAST(const ASTPtr & node, ContextPtr context, Block & block_with_constants, RPNElement & out) { - /** Functions < > = != <= >= in `notIn`, where one argument is a constant, and the other is one of columns of key, + /** Functions < > = != <= >= in `notIn` isNull isNotNull, where one argument is a constant, and the other is one of columns of key, * or itself, wrapped in a chain of possibly-monotonic functions, * or constant expression - number. */ @@ -1192,8 +1255,8 @@ bool KeyCondition::tryParseAtomFromAST(const ASTPtr & node, ContextPtr context, /// If we use this key condition to prune partitions by single value, we cannot relax conditions for NOT. if (single_point - && (func_name == "notLike" || func_name == "notIn" || func_name == "globalNotIn" || func_name == "notEquals" - || func_name == "notEmpty")) + && (func_name == "notLike" || func_name == "notIn" || func_name == "globalNotIn" || func_name == "notNullIn" + || func_name == "globalNotNullIn" || func_name == "notEquals" || func_name == "notEmpty")) strict_condition = true; if (functionIsInOrGlobalInOperator(func_name)) @@ -1307,7 +1370,7 @@ bool KeyCondition::tryParseAtomFromAST(const ASTPtr & node, ContextPtr context, { ColumnsWithTypeAndName arguments{ {nullptr, key_expr_type, ""}, {DataTypeString().createColumnConst(1, common_type->getName()), common_type, ""}}; - FunctionOverloadResolverPtr func_builder_cast = CastOverloadResolver::createImpl(false); + FunctionOverloadResolverPtr func_builder_cast = CastInternalOverloadResolver::createImpl(); auto func_cast = func_builder_cast->build(arguments); /// If we know the given range only contains one value, then we treat all functions as positive monotonic. @@ -1504,6 +1567,8 @@ KeyCondition::Description KeyCondition::getDescription() const else if ( element.function == RPNElement::FUNCTION_IN_RANGE || element.function == RPNElement::FUNCTION_NOT_IN_RANGE + || element.function == RPNElement::FUNCTION_IS_NULL + || element.function == RPNElement::FUNCTION_IS_NOT_NULL || element.function == RPNElement::FUNCTION_IN_SET || element.function == RPNElement::FUNCTION_NOT_IN_SET) { @@ -1668,11 +1733,13 @@ KeyCondition::Description KeyCondition::getDescription() const * over at least one hyperrectangle from which this range consists. */ +FieldRef negativeInfinity(NegativeInfinity{}), positiveInfinity(PositiveInfinity{}); + template static BoolMask forAnyHyperrectangle( size_t key_size, - const FieldRef * key_left, - const FieldRef * key_right, + const FieldRef * left_keys, + const FieldRef * right_keys, bool left_bounded, bool right_bounded, std::vector & hyperrectangle, @@ -1688,10 +1755,10 @@ static BoolMask forAnyHyperrectangle( /// Let's go through the matching elements of the key. while (prefix_size < key_size) { - if (key_left[prefix_size] == key_right[prefix_size]) + if (left_keys[prefix_size] == right_keys[prefix_size]) { /// Point ranges. - hyperrectangle[prefix_size] = Range(key_left[prefix_size]); + hyperrectangle[prefix_size] = Range(left_keys[prefix_size]); ++prefix_size; } else @@ -1705,11 +1772,11 @@ static BoolMask forAnyHyperrectangle( if (prefix_size + 1 == key_size) { if (left_bounded && right_bounded) - hyperrectangle[prefix_size] = Range(key_left[prefix_size], true, key_right[prefix_size], true); + hyperrectangle[prefix_size] = Range(left_keys[prefix_size], true, right_keys[prefix_size], true); else if (left_bounded) - hyperrectangle[prefix_size] = Range::createLeftBounded(key_left[prefix_size], true); + hyperrectangle[prefix_size] = Range::createLeftBounded(left_keys[prefix_size], true); else if (right_bounded) - hyperrectangle[prefix_size] = Range::createRightBounded(key_right[prefix_size], true); + hyperrectangle[prefix_size] = Range::createRightBounded(right_keys[prefix_size], true); return callback(hyperrectangle); } @@ -1717,11 +1784,11 @@ static BoolMask forAnyHyperrectangle( /// (x1 .. x2) x (-inf .. +inf) if (left_bounded && right_bounded) - hyperrectangle[prefix_size] = Range(key_left[prefix_size], false, key_right[prefix_size], false); + hyperrectangle[prefix_size] = Range(left_keys[prefix_size], false, right_keys[prefix_size], false); else if (left_bounded) - hyperrectangle[prefix_size] = Range::createLeftBounded(key_left[prefix_size], false); + hyperrectangle[prefix_size] = Range::createLeftBounded(left_keys[prefix_size], false); else if (right_bounded) - hyperrectangle[prefix_size] = Range::createRightBounded(key_right[prefix_size], false); + hyperrectangle[prefix_size] = Range::createRightBounded(right_keys[prefix_size], false); for (size_t i = prefix_size + 1; i < key_size; ++i) hyperrectangle[i] = Range(); @@ -1741,8 +1808,8 @@ static BoolMask forAnyHyperrectangle( if (left_bounded) { - hyperrectangle[prefix_size] = Range(key_left[prefix_size]); - result = result | forAnyHyperrectangle(key_size, key_left, key_right, true, false, hyperrectangle, prefix_size + 1, initial_mask, callback); + hyperrectangle[prefix_size] = Range(left_keys[prefix_size]); + result = result | forAnyHyperrectangle(key_size, left_keys, right_keys, true, false, hyperrectangle, prefix_size + 1, initial_mask, callback); if (result.isComplete()) return result; } @@ -1751,8 +1818,8 @@ static BoolMask forAnyHyperrectangle( if (right_bounded) { - hyperrectangle[prefix_size] = Range(key_right[prefix_size]); - result = result | forAnyHyperrectangle(key_size, key_left, key_right, false, true, hyperrectangle, prefix_size + 1, initial_mask, callback); + hyperrectangle[prefix_size] = Range(right_keys[prefix_size]); + result = result | forAnyHyperrectangle(key_size, left_keys, right_keys, false, true, hyperrectangle, prefix_size + 1, initial_mask, callback); if (result.isComplete()) return result; } @@ -1763,37 +1830,31 @@ static BoolMask forAnyHyperrectangle( BoolMask KeyCondition::checkInRange( size_t used_key_size, - const FieldRef * left_key, - const FieldRef * right_key, + const FieldRef * left_keys, + const FieldRef * right_keys, const DataTypes & data_types, - bool right_bounded, BoolMask initial_mask) const { std::vector key_ranges(used_key_size, Range()); -/* std::cerr << "Checking for: ["; - for (size_t i = 0; i != used_key_size; ++i) - std::cerr << (i != 0 ? ", " : "") << applyVisitor(FieldVisitorToString(), left_key[i]); - std::cerr << " ... "; + // std::cerr << "Checking for: ["; + // for (size_t i = 0; i != used_key_size; ++i) + // std::cerr << (i != 0 ? ", " : "") << applyVisitor(FieldVisitorToString(), left_keys[i]); + // std::cerr << " ... "; - if (right_bounded) - { - for (size_t i = 0; i != used_key_size; ++i) - std::cerr << (i != 0 ? ", " : "") << applyVisitor(FieldVisitorToString(), right_key[i]); - std::cerr << "]\n"; - } - else - std::cerr << "+inf)\n";*/ + // for (size_t i = 0; i != used_key_size; ++i) + // std::cerr << (i != 0 ? ", " : "") << applyVisitor(FieldVisitorToString(), right_keys[i]); + // std::cerr << "]\n"; - return forAnyHyperrectangle(used_key_size, left_key, right_key, true, right_bounded, key_ranges, 0, initial_mask, + return forAnyHyperrectangle(used_key_size, left_keys, right_keys, true, true, key_ranges, 0, initial_mask, [&] (const std::vector & key_ranges_hyperrectangle) { auto res = checkInHyperrectangle(key_ranges_hyperrectangle, data_types); -/* std::cerr << "Hyperrectangle: "; - for (size_t i = 0, size = key_ranges.size(); i != size; ++i) - std::cerr << (i != 0 ? " x " : "") << key_ranges[i].toString(); - std::cerr << ": " << res.can_be_true << "\n";*/ + // std::cerr << "Hyperrectangle: "; + // for (size_t i = 0, size = key_ranges.size(); i != size; ++i) + // std::cerr << (i != 0 ? " x " : "") << key_ranges[i].toString(); + // std::cerr << ": " << res.can_be_true << "\n"; return res; }); @@ -1821,6 +1882,8 @@ std::optional KeyCondition::applyMonotonicFunctionsChainToRange( /// If we apply function to open interval, we can get empty intervals in result. /// E.g. for ('2020-01-03', '2020-01-20') after applying 'toYYYYMM' we will get ('202001', '202001'). /// To avoid this we make range left and right included. + /// Any function that treats NULL specially is not monotonic. + /// Thus we can safely use isNull() as an -Inf/+Inf indicator here. if (!key_range.left.isNull()) { key_range.left = applyFunction(func, current_type, key_range.left); @@ -1836,7 +1899,7 @@ std::optional KeyCondition::applyMonotonicFunctionsChainToRange( current_type = func->getResultType(); if (!monotonicity.is_positive) - key_range.swapLeftAndRight(); + key_range.invert(); } return key_range; } @@ -1961,6 +2024,17 @@ BoolMask KeyCondition::checkInHyperrectangle( if (element.function == RPNElement::FUNCTION_NOT_IN_RANGE) rpn_stack.back() = !rpn_stack.back(); } + else if ( + element.function == RPNElement::FUNCTION_IS_NULL + || element.function == RPNElement::FUNCTION_IS_NOT_NULL) + { + const Range * key_range = &hyperrectangle[element.key_column]; + + /// No need to apply monotonic functions as nulls are kept. + bool intersects = element.range.intersectsRange(*key_range); + bool contains = element.range.containsRange(*key_range); + rpn_stack.emplace_back(intersects, !contains); + } else if ( element.function == RPNElement::FUNCTION_IN_SET || element.function == RPNElement::FUNCTION_NOT_IN_SET) @@ -2015,43 +2089,13 @@ BoolMask KeyCondition::checkInHyperrectangle( } -BoolMask KeyCondition::checkInRange( - size_t used_key_size, - const FieldRef * left_key, - const FieldRef * right_key, - const DataTypes & data_types, - BoolMask initial_mask) const -{ - return checkInRange(used_key_size, left_key, right_key, data_types, true, initial_mask); -} - - bool KeyCondition::mayBeTrueInRange( size_t used_key_size, - const FieldRef * left_key, - const FieldRef * right_key, + const FieldRef * left_keys, + const FieldRef * right_keys, const DataTypes & data_types) const { - return checkInRange(used_key_size, left_key, right_key, data_types, true, BoolMask::consider_only_can_be_true).can_be_true; -} - - -BoolMask KeyCondition::checkAfter( - size_t used_key_size, - const FieldRef * left_key, - const DataTypes & data_types, - BoolMask initial_mask) const -{ - return checkInRange(used_key_size, left_key, nullptr, data_types, false, initial_mask); -} - - -bool KeyCondition::mayBeTrueAfter( - size_t used_key_size, - const FieldRef * left_key, - const DataTypes & data_types) const -{ - return checkInRange(used_key_size, left_key, nullptr, data_types, false, BoolMask::consider_only_can_be_true).can_be_true; + return checkInRange(used_key_size, left_keys, right_keys, data_types, BoolMask::consider_only_can_be_true).can_be_true; } String KeyCondition::RPNElement::toString() const { return toString("column " + std::to_string(key_column), false); } @@ -2121,6 +2165,15 @@ String KeyCondition::RPNElement::toString(const std::string_view & column_name, buf << ")"; return buf.str(); } + case FUNCTION_IS_NULL: + case FUNCTION_IS_NOT_NULL: + { + buf << "("; + print_wrapped_column(buf); + buf << (function == FUNCTION_IS_NULL ? " isNull" : " isNotNull"); + buf << ")"; + return buf.str(); + } case ALWAYS_FALSE: return "false"; case ALWAYS_TRUE: @@ -2162,6 +2215,8 @@ bool KeyCondition::unknownOrAlwaysTrue(bool unknown_any) const || element.function == RPNElement::FUNCTION_IN_RANGE || element.function == RPNElement::FUNCTION_IN_SET || element.function == RPNElement::FUNCTION_NOT_IN_SET + || element.function == RPNElement::FUNCTION_IS_NULL + || element.function == RPNElement::FUNCTION_IS_NOT_NULL || element.function == RPNElement::ALWAYS_FALSE) { rpn_stack.push_back(false); @@ -2205,6 +2260,8 @@ size_t KeyCondition::getMaxKeyColumn() const { if (element.function == RPNElement::FUNCTION_NOT_IN_RANGE || element.function == RPNElement::FUNCTION_IN_RANGE + || element.function == RPNElement::FUNCTION_IS_NULL + || element.function == RPNElement::FUNCTION_IS_NOT_NULL || element.function == RPNElement::FUNCTION_IN_SET || element.function == RPNElement::FUNCTION_NOT_IN_SET) { diff --git a/src/Storages/MergeTree/KeyCondition.h b/src/Storages/MergeTree/KeyCondition.h index c957c65fc40..edae921bfda 100644 --- a/src/Storages/MergeTree/KeyCondition.h +++ b/src/Storages/MergeTree/KeyCondition.h @@ -55,25 +55,24 @@ private: static bool less(const Field & lhs, const Field & rhs); public: - FieldRef left; /// the left border, if any - FieldRef right; /// the right border, if any - bool left_bounded = false; /// bounded at the left - bool right_bounded = false; /// bounded at the right - bool left_included = false; /// includes the left border, if any - bool right_included = false; /// includes the right border, if any + FieldRef left = NegativeInfinity{}; /// the left border + FieldRef right = PositiveInfinity{}; /// the right border + bool left_included = false; /// includes the left border + bool right_included = false; /// includes the right border - /// The whole unversum. + /// The whole universe (not null). Range() {} /// One point. Range(const FieldRef & point) - : left(point), right(point), left_bounded(true), right_bounded(true), left_included(true), right_included(true) {} + : left(point), right(point), left_included(true), right_included(true) {} /// A bounded two-sided range. Range(const FieldRef & left_, bool left_included_, const FieldRef & right_, bool right_included_) - : left(left_), right(right_), - left_bounded(true), right_bounded(true), - left_included(left_included_), right_included(right_included_) + : left(left_) + , right(right_) + , left_included(left_included_) + , right_included(right_included_) { shrinkToIncludedIfPossible(); } @@ -82,9 +81,11 @@ public: { Range r; r.right = right_point; - r.right_bounded = true; r.right_included = right_included; r.shrinkToIncludedIfPossible(); + // Special case for [-Inf, -Inf] + if (r.right.isNegativeInfinity() && right_included) + r.left_included = true; return r; } @@ -92,9 +93,11 @@ public: { Range r; r.left = left_point; - r.left_bounded = true; r.left_included = left_included; r.shrinkToIncludedIfPossible(); + // Special case for [+Inf, +Inf] + if (r.left.isPositiveInfinity() && left_included) + r.right_included = true; return r; } @@ -104,7 +107,7 @@ public: */ void shrinkToIncludedIfPossible() { - if (left.isExplicit() && left_bounded && !left_included) + if (left.isExplicit() && !left_included) { if (left.getType() == Field::Types::UInt64 && left.get() != std::numeric_limits::max()) { @@ -117,7 +120,7 @@ public: left_included = true; } } - if (right.isExplicit() && right_bounded && !right_included) + if (right.isExplicit() && !right_included) { if (right.getType() == Field::Types::UInt64 && right.get() != std::numeric_limits::min()) { @@ -132,12 +135,7 @@ public: } } - bool empty() const - { - return left_bounded && right_bounded - && (less(right, left) - || ((!left_included || !right_included) && !less(left, right))); - } + bool empty() const { return less(right, left) || ((!left_included || !right_included) && !less(left, right)); } /// x contained in the range bool contains(const FieldRef & x) const @@ -148,35 +146,23 @@ public: /// x is to the left bool rightThan(const FieldRef & x) const { - return (left_bounded - ? !(less(left, x) || (left_included && equals(x, left))) - : false); + return less(left, x) || (left_included && equals(x, left)); } /// x is to the right bool leftThan(const FieldRef & x) const { - return (right_bounded - ? !(less(x, right) || (right_included && equals(x, right))) - : false); + return less(x, right) || (right_included && equals(x, right)); } bool intersectsRange(const Range & r) const { /// r to the left of me. - if (r.right_bounded - && left_bounded - && (less(r.right, left) - || ((!left_included || !r.right_included) - && equals(r.right, left)))) + if (less(r.right, left) || ((!left_included || !r.right_included) && equals(r.right, left))) return false; /// r to the right of me. - if (r.left_bounded - && right_bounded - && (less(right, r.left) /// ...} {... - || ((!right_included || !r.left_included) /// ...) [... or ...] (... - && equals(r.left, right)))) + if (less(right, r.left) || ((!right_included || !r.left_included) && equals(r.left, right))) return false; return true; @@ -185,30 +171,23 @@ public: bool containsRange(const Range & r) const { /// r starts to the left of me. - if (left_bounded - && (!r.left_bounded - || less(r.left, left) - || (r.left_included - && !left_included - && equals(r.left, left)))) + if (less(r.left, left) || (r.left_included && !left_included && equals(r.left, left))) return false; /// r ends right of me. - if (right_bounded - && (!r.right_bounded - || less(right, r.right) - || (r.right_included - && !right_included - && equals(r.right, right)))) + if (less(right, r.right) || (r.right_included && !right_included && equals(r.right, right))) return false; return true; } - void swapLeftAndRight() + void invert() { std::swap(left, right); - std::swap(left_bounded, right_bounded); + if (left.isPositiveInfinity()) + left = NegativeInfinity{}; + if (right.isNegativeInfinity()) + right = PositiveInfinity{}; std::swap(left_included, right_included); } @@ -247,16 +226,8 @@ public: /// one of the resulting mask components (see BoolMask::consider_only_can_be_XXX). BoolMask checkInRange( size_t used_key_size, - const FieldRef * left_key, - const FieldRef* right_key, - const DataTypes & data_types, - BoolMask initial_mask = BoolMask(false, false)) const; - - /// Are the condition and its negation valid in a semi-infinite (not limited to the right) key range. - /// left_key must contain all the fields in the sort_descr in the appropriate order. - BoolMask checkAfter( - size_t used_key_size, - const FieldRef * left_key, + const FieldRef * left_keys, + const FieldRef * right_keys, const DataTypes & data_types, BoolMask initial_mask = BoolMask(false, false)) const; @@ -264,15 +235,8 @@ public: /// This is more efficient than checkInRange(...).can_be_true. bool mayBeTrueInRange( size_t used_key_size, - const FieldRef * left_key, - const FieldRef * right_key, - const DataTypes & data_types) const; - - /// Same as checkAfter, but calculate only may_be_true component of a result. - /// This is more efficient than checkAfter(...).can_be_true. - bool mayBeTrueAfter( - size_t used_key_size, - const FieldRef * left_key, + const FieldRef * left_keys, + const FieldRef * right_keys, const DataTypes & data_types) const; /// Checks that the index can not be used @@ -338,6 +302,8 @@ private: FUNCTION_NOT_IN_RANGE, FUNCTION_IN_SET, FUNCTION_NOT_IN_SET, + FUNCTION_IS_NULL, + FUNCTION_IS_NOT_NULL, FUNCTION_UNKNOWN, /// Can take any value. /// Operators of the logical expression. FUNCTION_NOT, diff --git a/src/Storages/MergeTree/MergeTreeBaseSelectProcessor.cpp b/src/Storages/MergeTree/MergeTreeBaseSelectProcessor.cpp index 549a8a4f772..c91d60c5de7 100644 --- a/src/Storages/MergeTree/MergeTreeBaseSelectProcessor.cpp +++ b/src/Storages/MergeTree/MergeTreeBaseSelectProcessor.cpp @@ -465,6 +465,19 @@ Block MergeTreeBaseSelectProcessor::transformHeader( return block; } +std::unique_ptr MergeTreeBaseSelectProcessor::getSizePredictor( + const MergeTreeData::DataPartPtr & data_part, + const MergeTreeReadTaskColumns & task_columns, + const Block & sample_block) +{ + const auto & required_column_names = task_columns.columns.getNames(); + const auto & required_pre_column_names = task_columns.pre_columns.getNames(); + NameSet complete_column_names(required_column_names.begin(), required_column_names.end()); + complete_column_names.insert(required_pre_column_names.begin(), required_pre_column_names.end()); + + return std::make_unique( + data_part, Names(complete_column_names.begin(), complete_column_names.end()), sample_block); +} MergeTreeBaseSelectProcessor::~MergeTreeBaseSelectProcessor() = default; diff --git a/src/Storages/MergeTree/MergeTreeBaseSelectProcessor.h b/src/Storages/MergeTree/MergeTreeBaseSelectProcessor.h index 8da9b002e16..d102e4f07a4 100644 --- a/src/Storages/MergeTree/MergeTreeBaseSelectProcessor.h +++ b/src/Storages/MergeTree/MergeTreeBaseSelectProcessor.h @@ -1,12 +1,12 @@ #pragma once -#include #include #include #include #include + namespace DB { @@ -37,6 +37,11 @@ public: static Block transformHeader( Block block, const PrewhereInfoPtr & prewhere_info, const DataTypePtr & partition_value_type, const Names & virtual_columns); + static std::unique_ptr getSizePredictor( + const MergeTreeData::DataPartPtr & data_part, + const MergeTreeReadTaskColumns & task_columns, + const Block & sample_block); + protected: Chunk generate() final; diff --git a/src/Storages/MergeTree/MergeTreeBlockReadUtils.cpp b/src/Storages/MergeTree/MergeTreeBlockReadUtils.cpp index b8698ae3e01..93594dd4357 100644 --- a/src/Storages/MergeTree/MergeTreeBlockReadUtils.cpp +++ b/src/Storages/MergeTree/MergeTreeBlockReadUtils.cpp @@ -35,16 +35,16 @@ bool injectRequiredColumnsRecursively( /// stages. checkStackSize(); - if (storage_columns.hasPhysicalOrSubcolumn(column_name)) + auto column_in_storage = storage_columns.tryGetColumnOrSubcolumn(ColumnsDescription::AllPhysical, column_name); + if (column_in_storage) { - auto column_in_storage = storage_columns.getPhysicalOrSubcolumn(column_name); - auto column_name_in_part = column_in_storage.getNameInStorage(); + auto column_name_in_part = column_in_storage->getNameInStorage(); if (alter_conversions.isColumnRenamed(column_name_in_part)) column_name_in_part = alter_conversions.getColumnOldName(column_name_in_part); auto column_in_part = NameAndTypePair( - column_name_in_part, column_in_storage.getSubcolumnName(), - column_in_storage.getTypeInStorage(), column_in_storage.type); + column_name_in_part, column_in_storage->getSubcolumnName(), + column_in_storage->getTypeInStorage(), column_in_storage->type); /// column has files and hence does not require evaluation if (part->hasColumnFiles(column_in_part)) @@ -93,7 +93,7 @@ NameSet injectRequiredColumns(const MergeTreeData & storage, const StorageMetada for (size_t i = 0; i < columns.size(); ++i) { /// We are going to fetch only physical columns - if (!storage_columns.hasPhysicalOrSubcolumn(columns[i])) + if (!storage_columns.hasColumnOrSubcolumn(ColumnsDescription::AllPhysical, columns[i])) throw Exception("There is no physical column or subcolumn " + columns[i] + " in table.", ErrorCodes::NO_SUCH_COLUMN_IN_TABLE); have_at_least_one_physical_column |= injectRequiredColumnsRecursively( @@ -310,9 +310,9 @@ MergeTreeReadTaskColumns getReadTaskColumns( if (check_columns) { - const NamesAndTypesList & physical_columns = metadata_snapshot->getColumns().getAllWithSubcolumns(); - result.pre_columns = physical_columns.addTypes(pre_column_names); - result.columns = physical_columns.addTypes(column_names); + const auto & columns = metadata_snapshot->getColumns(); + result.pre_columns = columns.getByNames(ColumnsDescription::All, pre_column_names, true); + result.columns = columns.getByNames(ColumnsDescription::All, column_names, true); } else { diff --git a/src/Storages/MergeTree/MergeTreeBlockReadUtils.h b/src/Storages/MergeTree/MergeTreeBlockReadUtils.h index 31d609e4242..4c4081bd83b 100644 --- a/src/Storages/MergeTree/MergeTreeBlockReadUtils.h +++ b/src/Storages/MergeTree/MergeTreeBlockReadUtils.h @@ -70,7 +70,7 @@ struct MergeTreeReadTaskColumns /// column names to read during PREWHERE NamesAndTypesList pre_columns; /// resulting block may require reordering in accordance with `ordered_names` - bool should_reorder; + bool should_reorder = false; }; MergeTreeReadTaskColumns getReadTaskColumns( diff --git a/src/Storages/MergeTree/MergeTreeData.cpp b/src/Storages/MergeTree/MergeTreeData.cpp index 40b37f5afc4..37309cec5b6 100644 --- a/src/Storages/MergeTree/MergeTreeData.cpp +++ b/src/Storages/MergeTree/MergeTreeData.cpp @@ -104,6 +104,7 @@ namespace ErrorCodes extern const int NO_SUCH_COLUMN_IN_TABLE; extern const int LOGICAL_ERROR; extern const int ILLEGAL_COLUMN; + extern const int ILLEGAL_TYPE_OF_COLUMN_FOR_FILTER; extern const int CORRUPTED_DATA; extern const int BAD_TYPE_OF_FIELD; extern const int BAD_ARGUMENTS; @@ -125,12 +126,46 @@ namespace ErrorCodes extern const int TOO_MANY_SIMULTANEOUS_QUERIES; } - -static void checkSampleExpression(const StorageInMemoryMetadata & metadata, bool allow_sampling_expression_not_in_primary_key) +static void checkSampleExpression(const StorageInMemoryMetadata & metadata, bool allow_sampling_expression_not_in_primary_key, bool check_sample_column_is_correct) { const auto & pk_sample_block = metadata.getPrimaryKey().sample_block; if (!pk_sample_block.has(metadata.sampling_key.column_names[0]) && !allow_sampling_expression_not_in_primary_key) throw Exception("Sampling expression must be present in the primary key", ErrorCodes::BAD_ARGUMENTS); + + if (!check_sample_column_is_correct) + return; + + const auto & sampling_key = metadata.getSamplingKey(); + DataTypePtr sampling_column_type = sampling_key.data_types[0]; + + bool is_correct_sample_condition = false; + if (sampling_key.data_types.size() == 1) + { + if (typeid_cast(sampling_column_type.get())) + is_correct_sample_condition = true; + else if (typeid_cast(sampling_column_type.get())) + is_correct_sample_condition = true; + else if (typeid_cast(sampling_column_type.get())) + is_correct_sample_condition = true; + else if (typeid_cast(sampling_column_type.get())) + is_correct_sample_condition = true; + } + + if (!is_correct_sample_condition) + throw Exception( + "Invalid sampling column type in storage parameters: " + sampling_column_type->getName() + + ". Must be one unsigned integer type", + ErrorCodes::ILLEGAL_TYPE_OF_COLUMN_FOR_FILTER); +} + +inline UInt64 time_in_microseconds(std::chrono::time_point timepoint) +{ + return std::chrono::duration_cast(timepoint.time_since_epoch()).count(); +} + +inline UInt64 time_in_seconds(std::chrono::time_point timepoint) +{ + return std::chrono::duration_cast(timepoint.time_since_epoch()).count(); } MergeTreeData::MergeTreeData( @@ -200,7 +235,8 @@ MergeTreeData::MergeTreeData( if (metadata_.sampling_key.definition_ast != nullptr) { /// This is for backward compatibility. - checkSampleExpression(metadata_, attach || settings->compatibility_allow_sampling_expression_not_in_primary_key); + checkSampleExpression(metadata_, attach || settings->compatibility_allow_sampling_expression_not_in_primary_key, + settings->check_sample_column_is_correct); } checkTTLExpressions(metadata_, metadata_); @@ -270,19 +306,17 @@ StoragePolicyPtr MergeTreeData::getStoragePolicy() const static void checkKeyExpression(const ExpressionActions & expr, const Block & sample_block, const String & key_name, bool allow_nullable_key) { - for (const auto & action : expr.getActions()) - { - if (action.node->type == ActionsDAG::ActionType::ARRAY_JOIN) - throw Exception(key_name + " key cannot contain array joins", ErrorCodes::ILLEGAL_COLUMN); + if (expr.hasArrayJoin()) + throw Exception(key_name + " key cannot contain array joins", ErrorCodes::ILLEGAL_COLUMN); - if (action.node->type == ActionsDAG::ActionType::FUNCTION) - { - IFunctionBase & func = *action.node->function_base; - if (!func.isDeterministic()) - throw Exception(key_name + " key cannot contain non-deterministic functions, " - "but contains function " + func.getName(), - ErrorCodes::BAD_ARGUMENTS); - } + try + { + expr.assertDeterministic(); + } + catch (Exception & e) + { + e.addMessage(fmt::format("for {} key", key_name)); + throw; } for (const ColumnWithTypeAndName & element : sample_block) @@ -418,7 +452,6 @@ void MergeTreeData::checkProperties( } checkKeyExpression(*new_sorting_key.expression, new_sorting_key.sample_block, "Sorting", allow_nullable_key); - } void MergeTreeData::setProperties(const StorageInMemoryMetadata & new_metadata, const StorageInMemoryMetadata & old_metadata, bool attach) @@ -1088,7 +1121,7 @@ static bool isOldPartDirectory(const DiskPtr & disk, const String & directory_pa } -void MergeTreeData::clearOldTemporaryDirectories(ssize_t custom_directories_lifetime_seconds) +void MergeTreeData::clearOldTemporaryDirectories(size_t custom_directories_lifetime_seconds) { /// If the method is already called from another thread, then we don't need to do anything. std::unique_lock lock(clear_old_temporary_directories_mutex, std::defer_lock); @@ -1097,9 +1130,7 @@ void MergeTreeData::clearOldTemporaryDirectories(ssize_t custom_directories_life const auto settings = getSettings(); time_t current_time = time(nullptr); - ssize_t deadline = (custom_directories_lifetime_seconds >= 0) - ? current_time - custom_directories_lifetime_seconds - : current_time - settings->temporary_directories_lifetime.totalSeconds(); + ssize_t deadline = current_time - custom_directories_lifetime_seconds; /// Delete temporary directories older than a day. for (const auto & [path, disk] : getRelativeDataPathsWithDisks()) @@ -1225,7 +1256,11 @@ void MergeTreeData::removePartsFinally(const MergeTreeData::DataPartsVector & pa PartLogElement part_log_elem; part_log_elem.event_type = PartLogElement::REMOVE_PART; - part_log_elem.event_time = time(nullptr); + + const auto time_now = std::chrono::system_clock::now(); + part_log_elem.event_time = time_in_seconds(time_now); + part_log_elem.event_time_microseconds = time_in_microseconds(time_now); + part_log_elem.duration_ms = 0; //-V1048 part_log_elem.database_name = table_id.database_name; @@ -1517,6 +1552,7 @@ void checkVersionColumnTypesConversion(const IDataType * old_type, const IDataTy if ((which_old_type.isInt() && !which_new_type.isInt()) || (which_old_type.isUInt() && !which_new_type.isUInt()) || (which_old_type.isDate() && !which_new_type.isDate()) + || (which_old_type.isDate32() && !which_new_type.isDate32()) || (which_old_type.isDateTime() && !which_new_type.isDateTime()) || (which_old_type.isFloat() && !which_new_type.isFloat())) { @@ -1675,7 +1711,8 @@ void MergeTreeData::checkAlterIsPossible(const AlterCommands & commands, Context "ALTER MODIFY SAMPLE BY is not supported for default-partitioned tables created with the old syntax", ErrorCodes::BAD_ARGUMENTS); - checkSampleExpression(new_metadata, getSettings()->compatibility_allow_sampling_expression_not_in_primary_key); + checkSampleExpression(new_metadata, getSettings()->compatibility_allow_sampling_expression_not_in_primary_key, + getSettings()->check_sample_column_is_correct); } if (command.type == AlterCommand::ADD_INDEX && !is_custom_partitioned) { @@ -1818,11 +1855,10 @@ void MergeTreeData::checkAlterIsPossible(const AlterCommands & commands, Context if (MergeTreeSettings::isPartFormatSetting(setting_name) && !new_value) { /// Use default settings + new and check if doesn't affect part format settings - MergeTreeSettings copy = *getSettings(); - copy.resetToDefault(); - copy.applyChanges(new_changes); + auto copy = getDefaultSettings(); + copy->applyChanges(new_changes); String reason; - if (!canUsePolymorphicParts(copy, &reason) && !reason.empty()) + if (!canUsePolymorphicParts(*copy, &reason) && !reason.empty()) throw Exception("Can't change settings. Reason: " + reason, ErrorCodes::NOT_IMPLEMENTED); } @@ -1984,14 +2020,12 @@ void MergeTreeData::changeSettings( } } - MergeTreeSettings copy = *getSettings(); - /// reset to default settings before applying existing - copy.resetToDefault(); - copy.applyChanges(new_changes); + /// Reset to default settings before applying existing. + auto copy = getDefaultSettings(); + copy->applyChanges(new_changes); + copy->sanityCheck(getContext()->getSettingsRef()); - copy.sanityCheck(getContext()->getSettingsRef()); - - storage_settings.set(std::make_unique(copy)); + storage_settings.set(std::move(copy)); StorageInMemoryMetadata new_metadata = getInMemoryMetadata(); new_metadata.setSettingsChanges(new_settings); setInMemoryMetadata(new_metadata); @@ -2361,7 +2395,7 @@ MergeTreeData::DataPartsVector MergeTreeData::removePartsInRangeFromWorkingSet(c /// It's a DROP PART and it's already executed by fetching some covering part bool is_drop_part = !drop_range.isFakeDropRangePart() && drop_range.min_block; - if (is_drop_part && (part->info.min_block != drop_range.min_block || part->info.max_block != drop_range.max_block)) + if (is_drop_part && (part->info.min_block != drop_range.min_block || part->info.max_block != drop_range.max_block || part->info.getDataVersion() != drop_range.getDataVersion())) { /// Why we check only min and max blocks here without checking merge /// level? It's a tricky situation which can happen on a stale @@ -2378,9 +2412,7 @@ MergeTreeData::DataPartsVector MergeTreeData::removePartsInRangeFromWorkingSet(c /// So here we just check that all_1_3_1 covers blocks from drop /// all_2_2_2. /// - /// NOTE: this helps only to avoid logical error during drop part. - /// We still get intersecting "parts" in queue. - bool is_covered_by_min_max_block = part->info.min_block <= drop_range.min_block && part->info.max_block >= drop_range.max_block; + bool is_covered_by_min_max_block = part->info.min_block <= drop_range.min_block && part->info.max_block >= drop_range.max_block && part->info.getDataVersion() >= drop_range.getDataVersion(); if (is_covered_by_min_max_block) { LOG_INFO(log, "Skipping drop range for part {} because covering part {} already exists", drop_range.getPartName(), part->name); @@ -2753,19 +2785,17 @@ void MergeTreeData::swapActivePart(MergeTreeData::DataPartPtr part_copy) if (active_part_it == data_parts_by_info.end()) throw Exception("Cannot swap part '" + part_copy->name + "', no such active part.", ErrorCodes::NO_SUCH_DATA_PART); - /// We do not check allow_s3_zero_copy_replication here because data may be shared - /// when allow_s3_zero_copy_replication turned on and off again + /// We do not check allow_remote_fs_zero_copy_replication here because data may be shared + /// when allow_remote_fs_zero_copy_replication turned on and off again original_active_part->force_keep_shared_data = false; - if (original_active_part->volume->getDisk()->getType() == DiskType::Type::S3) + if (original_active_part->volume->getDisk()->supportZeroCopyReplication() && + part_copy->volume->getDisk()->supportZeroCopyReplication() && + original_active_part->getUniqueId() == part_copy->getUniqueId()) { - if (part_copy->volume->getDisk()->getType() == DiskType::Type::S3 - && original_active_part->getUniqueId() == part_copy->getUniqueId()) - { - /// May be when several volumes use the same S3 storage - original_active_part->force_keep_shared_data = true; - } + /// May be when several volumes use the same S3/HDFS storage + original_active_part->force_keep_shared_data = true; } modifyPartState(original_active_part, DataPartState::DeleteOnDestroy); @@ -3182,7 +3212,10 @@ String MergeTreeData::getPartitionIDFromQuery(const ASTPtr & ast, ContextPtr loc const auto & partition_ast = ast->as(); if (!partition_ast.value) + { + MergeTreePartInfo::validatePartitionID(partition_ast.id, format_version); return partition_ast.id; + } if (format_version < MERGE_TREE_DATA_MIN_FORMAT_VERSION_WITH_CUSTOM_PARTITIONING) { @@ -3191,10 +3224,7 @@ String MergeTreeData::getPartitionIDFromQuery(const ASTPtr & ast, ContextPtr loc if (partition_lit && partition_lit->value.getType() == Field::Types::String) { String partition_id = partition_lit->value.get(); - if (partition_id.size() != 6 || !std::all_of(partition_id.begin(), partition_id.end(), isNumericASCII)) - throw Exception( - "Invalid partition format: " + partition_id + ". Partition should consist of 6 digits: YYYYMM", - ErrorCodes::INVALID_PARTITION_VALUE); + MergeTreePartInfo::validatePartitionID(partition_id, format_version); return partition_id; } } @@ -3209,6 +3239,21 @@ String MergeTreeData::getPartitionIDFromQuery(const ASTPtr & ast, ContextPtr loc ", must be: " + toString(fields_count), ErrorCodes::INVALID_PARTITION_VALUE); + if (auto * f = partition_ast.value->as()) + { + assert(f->name == "tuple"); + if (f->arguments && !f->arguments->as()->children.empty()) + { + ASTPtr query = partition_ast.value->clone(); + auto syntax_analyzer_result + = TreeRewriter(local_context) + .analyze(query, metadata_snapshot->getPartitionKey().sample_block.getNamesAndTypesList(), {}, {}, false, false); + auto actions = ExpressionAnalyzer(query, syntax_analyzer_result, local_context).getActions(true); + if (actions->hasArrayJoin()) + throw Exception("The partition expression cannot contain array joins", ErrorCodes::INVALID_PARTITION_VALUE); + } + } + const FormatSettings format_settings; Row partition_row(fields_count); @@ -3340,20 +3385,25 @@ MergeTreeData::getAllDataPartsVector(MergeTreeData::DataPartStateVector * out_st return res; } -std::vector -MergeTreeData::getDetachedParts() const +std::vector MergeTreeData::getDetachedParts() const { std::vector res; for (const auto & [path, disk] : getRelativeDataPathsWithDisks()) { - for (auto it = disk->iterateDirectory(fs::path(path) / MergeTreeData::DETACHED_DIR_NAME); it->isValid(); it->next()) - { - res.emplace_back(); - auto & part = res.back(); + String detached_path = fs::path(path) / MergeTreeData::DETACHED_DIR_NAME; - DetachedPartInfo::tryParseDetachedPartName(it->name(), part, format_version); - part.disk = disk->getName(); + /// Note: we don't care about TOCTOU issue here. + if (disk->exists(detached_path)) + { + for (auto it = disk->iterateDirectory(detached_path); it->isValid(); it->next()) + { + res.emplace_back(); + auto & part = res.back(); + + DetachedPartInfo::tryParseDetachedPartName(it->name(), part, format_version); + part.disk = disk->getName(); + } } } return res; @@ -3831,16 +3881,20 @@ bool MergeTreeData::mayBenefitFromIndexForIn( for (const auto & index : metadata_snapshot->getSecondaryIndices()) if (index_wrapper_factory.get(index)->mayBenefitFromIndexForIn(item)) return true; - if (metadata_snapshot->selected_projection - && metadata_snapshot->selected_projection->isPrimaryKeyColumnPossiblyWrappedInFunctions(item)) - return true; + for (const auto & projection : metadata_snapshot->getProjections()) + { + if (projection.isPrimaryKeyColumnPossiblyWrappedInFunctions(item)) + return true; + } } /// The tuple itself may be part of the primary key, so check that as a last resort. if (isPrimaryOrMinMaxKeyColumnPossiblyWrappedInFunctions(left_in_operand, metadata_snapshot)) return true; - if (metadata_snapshot->selected_projection - && metadata_snapshot->selected_projection->isPrimaryKeyColumnPossiblyWrappedInFunctions(left_in_operand)) - return true; + for (const auto & projection : metadata_snapshot->getProjections()) + { + if (projection.isPrimaryKeyColumnPossiblyWrappedInFunctions(left_in_operand)) + return true; + } return false; } else @@ -3849,10 +3903,11 @@ bool MergeTreeData::mayBenefitFromIndexForIn( if (index_wrapper_factory.get(index)->mayBenefitFromIndexForIn(left_in_operand)) return true; - if (metadata_snapshot->selected_projection - && metadata_snapshot->selected_projection->isPrimaryKeyColumnPossiblyWrappedInFunctions(left_in_operand)) - return true; - + for (const auto & projection : metadata_snapshot->getProjections()) + { + if (projection.isPrimaryKeyColumnPossiblyWrappedInFunctions(left_in_operand)) + return true; + } return isPrimaryOrMinMaxKeyColumnPossiblyWrappedInFunctions(left_in_operand, metadata_snapshot); } } @@ -3892,7 +3947,7 @@ static void selectBestProjection( candidate.required_columns, metadata_snapshot, candidate.desc->metadata, - query_info, // TODO syntax_analysis_result set in index + query_info, query_context, settings.max_threads, max_added_blocks); @@ -3910,7 +3965,7 @@ static void selectBestProjection( required_columns, metadata_snapshot, metadata_snapshot, - query_info, // TODO syntax_analysis_result set in index + query_info, query_context, settings.max_threads, max_added_blocks); @@ -3929,7 +3984,7 @@ bool MergeTreeData::getQueryProcessingStageWithAggregateProjection( ContextPtr query_context, const StorageMetadataPtr & metadata_snapshot, SelectQueryInfo & query_info) const { const auto & settings = query_context->getSettingsRef(); - if (!settings.allow_experimental_projection_optimization || query_info.ignore_projections) + if (!settings.allow_experimental_projection_optimization || query_info.ignore_projections || query_info.is_projection_query) return false; const auto & query_ptr = query_info.query; @@ -3980,13 +4035,11 @@ bool MergeTreeData::getQueryProcessingStageWithAggregateProjection( candidate.where_column_name = analysis_result.where_column_name; candidate.remove_where_filter = analysis_result.remove_where_filter; candidate.before_where = analysis_result.before_where->clone(); - // std::cerr << fmt::format("before_where_actions = \n{}", candidate.before_where->dumpDAG()) << std::endl; + required_columns = candidate.before_where->foldActionsByProjection( required_columns, projection.sample_block_for_keys, candidate.where_column_name); - // std::cerr << fmt::format("before_where_actions = \n{}", candidate.before_where->dumpDAG()) << std::endl; - // std::cerr << fmt::format("where_required_columns = \n{}", fmt::join(required_columns, ", ")) << std::endl; if (required_columns.empty()) return false; @@ -4002,12 +4055,11 @@ bool MergeTreeData::getQueryProcessingStageWithAggregateProjection( // required_columns should not contain columns generated by prewhere for (const auto & column : prewhere_actions->getResultColumns()) required_columns.erase(column.name); - // std::cerr << fmt::format("prewhere_actions = \n{}", prewhere_actions->dumpDAG()) << std::endl; + // Prewhere_action should not add missing keys. prewhere_required_columns = prewhere_actions->foldActionsByProjection( prewhere_required_columns, projection.sample_block_for_keys, candidate.prewhere_info->prewhere_column_name, false); - // std::cerr << fmt::format("prewhere_actions = \n{}", prewhere_actions->dumpDAG()) << std::endl; - // std::cerr << fmt::format("prewhere_required_columns = \n{}", fmt::join(prewhere_required_columns, ", ")) << std::endl; + if (prewhere_required_columns.empty()) return false; candidate.prewhere_info->prewhere_actions = prewhere_actions; @@ -4017,7 +4069,7 @@ bool MergeTreeData::getQueryProcessingStageWithAggregateProjection( auto row_level_filter_actions = candidate.prewhere_info->row_level_filter->clone(); prewhere_required_columns = row_level_filter_actions->foldActionsByProjection( prewhere_required_columns, projection.sample_block_for_keys, candidate.prewhere_info->row_level_column_name, false); - // std::cerr << fmt::format("row_level_filter_required_columns = \n{}", fmt::join(prewhere_required_columns, ", ")) << std::endl; + if (prewhere_required_columns.empty()) return false; candidate.prewhere_info->row_level_filter = row_level_filter_actions; @@ -4026,11 +4078,9 @@ bool MergeTreeData::getQueryProcessingStageWithAggregateProjection( if (candidate.prewhere_info->alias_actions) { auto alias_actions = candidate.prewhere_info->alias_actions->clone(); - // std::cerr << fmt::format("alias_actions = \n{}", alias_actions->dumpDAG()) << std::endl; prewhere_required_columns = alias_actions->foldActionsByProjection(prewhere_required_columns, projection.sample_block_for_keys, {}, false); - // std::cerr << fmt::format("alias_actions = \n{}", alias_actions->dumpDAG()) << std::endl; - // std::cerr << fmt::format("alias_required_columns = \n{}", fmt::join(prewhere_required_columns, ", ")) << std::endl; + if (prewhere_required_columns.empty()) return false; candidate.prewhere_info->alias_actions = alias_actions; @@ -4058,7 +4108,6 @@ bool MergeTreeData::getQueryProcessingStageWithAggregateProjection( if (projection.type == ProjectionDescription::Type::Aggregate && analysis_result.need_aggregate && can_use_aggregate_projection) { - // std::cerr << fmt::format("====== aggregate projection analysis: {} ======", projection.name) << std::endl; bool match = true; Block aggregates; // Let's first check if all aggregates are provided by current projection @@ -4084,12 +4133,10 @@ bool MergeTreeData::getQueryProcessingStageWithAggregateProjection( // needs to provide aggregation keys, and certain children DAG might be substituted by // some keys in projection. candidate.before_aggregation = analysis_result.before_aggregation->clone(); - // std::cerr << fmt::format("keys = {}", fmt::join(keys, ", ")) << std::endl; - // std::cerr << fmt::format("before_aggregation = \n{}", candidate.before_aggregation->dumpDAG()) << std::endl; auto required_columns = candidate.before_aggregation->foldActionsByProjection(keys, projection.sample_block_for_keys); - // std::cerr << fmt::format("before_aggregation = \n{}", candidate.before_aggregation->dumpDAG()) << std::endl; - // std::cerr << fmt::format("aggregate_required_columns = \n{}", fmt::join(required_columns, ", ")) << std::endl; - if (required_columns.empty() && !keys.empty()) + + // TODO Let's find out the exact required_columns for keys. + if (required_columns.empty() && (!keys.empty() && !candidate.before_aggregation->getRequiredColumns().empty())) continue; if (analysis_result.optimize_aggregation_in_order) @@ -4113,12 +4160,10 @@ bool MergeTreeData::getQueryProcessingStageWithAggregateProjection( candidate.required_columns.push_back(aggregate.name); candidates.push_back(std::move(candidate)); } - // std::cerr << fmt::format("====== aggregate projection analysis end: {} ======", projection.name) << std::endl; } if (projection.type == ProjectionDescription::Type::Normal && (analysis_result.hasWhere() || analysis_result.hasPrewhere())) { - // std::cerr << fmt::format("====== normal projection analysis: {} ======", projection.name) << std::endl; const auto & actions = analysis_result.before_aggregation ? analysis_result.before_aggregation : analysis_result.before_order_by; NameSet required_columns; @@ -4130,16 +4175,12 @@ bool MergeTreeData::getQueryProcessingStageWithAggregateProjection( candidate.required_columns = {required_columns.begin(), required_columns.end()}; candidates.push_back(std::move(candidate)); } - // std::cerr << fmt::format("====== normal projection analysis end: {} ======", projection.name) << std::endl; } } // Let's select the best projection to execute the query. if (!candidates.empty()) { - // First build a MergeTreeDataSelectCache to check if a projection is indeed better than base - // query_info.merge_tree_data_select_cache = std::make_unique(); - std::shared_ptr max_added_blocks; if (settings.select_sequential_consistency) { @@ -4183,7 +4224,7 @@ bool MergeTreeData::getQueryProcessingStageWithAggregateProjection( analysis_result.required_columns, metadata_snapshot, metadata_snapshot, - query_info, // TODO syntax_analysis_result set in index + query_info, query_context, settings.max_threads, max_added_blocks); @@ -4566,17 +4607,6 @@ bool MergeTreeData::canReplacePartition(const DataPartPtr & src_part) const return true; } -inline UInt64 time_in_microseconds(std::chrono::time_point timepoint) -{ - return std::chrono::duration_cast(timepoint.time_since_epoch()).count(); -} - - -inline UInt64 time_in_seconds(std::chrono::time_point timepoint) -{ - return std::chrono::duration_cast(timepoint.time_since_epoch()).count(); -} - void MergeTreeData::writePartLog( PartLogElement::Type type, const ExecutionStatus & execution_status, diff --git a/src/Storages/MergeTree/MergeTreeData.h b/src/Storages/MergeTree/MergeTreeData.h index da8c7fcbb65..02d1f5e264e 100644 --- a/src/Storages/MergeTree/MergeTreeData.h +++ b/src/Storages/MergeTree/MergeTreeData.h @@ -526,9 +526,8 @@ public: void clearOldWriteAheadLogs(); /// Delete all directories which names begin with "tmp" - /// Set non-negative parameter value to override MergeTreeSettings temporary_directories_lifetime - /// Must be called with locked lockForShare() because use relative_data_path. - void clearOldTemporaryDirectories(ssize_t custom_directories_lifetime_seconds = -1); + /// Must be called with locked lockForShare() because it's using relative_data_path. + void clearOldTemporaryDirectories(size_t custom_directories_lifetime_seconds); void clearEmptyParts(); @@ -814,11 +813,11 @@ public: bool scheduleDataMovingJob(IBackgroundJobExecutor & executor); bool areBackgroundMovesNeeded() const; - /// Lock part in zookeeper for use common S3 data in several nodes + /// Lock part in zookeeper for shared data in several nodes /// Overridden in StorageReplicatedMergeTree virtual void lockSharedData(const IMergeTreeDataPart &) const {} - /// Unlock common S3 data part in zookeeper + /// Unlock shared data part in zookeeper /// Overridden in StorageReplicatedMergeTree virtual bool unlockSharedData(const IMergeTreeDataPart &) const { return true; } @@ -1087,6 +1086,9 @@ private: // Get partition matcher for FREEZE / UNFREEZE queries. MatcherFn getPartitionMatcher(const ASTPtr & partition, ContextPtr context) const; + + /// Returns default settings for storage with possible changes from global config. + virtual std::unique_ptr getDefaultSettings() const = 0; }; /// RAII struct to record big parts that are submerging or emerging. diff --git a/src/Storages/MergeTree/MergeTreeDataMergerMutator.cpp b/src/Storages/MergeTree/MergeTreeDataMergerMutator.cpp index b6ccfc05dc2..b6d55828e85 100644 --- a/src/Storages/MergeTree/MergeTreeDataMergerMutator.cpp +++ b/src/Storages/MergeTree/MergeTreeDataMergerMutator.cpp @@ -752,13 +752,16 @@ MergeTreeData::MutableDataPartPtr MergeTreeDataMergerMutator::mergePartsToTempor bool force_ttl = false; for (const auto & part : parts) { - new_data_part->ttl_infos.update(part->ttl_infos); if (metadata_snapshot->hasAnyTTL() && !part->checkAllTTLCalculated(metadata_snapshot)) { LOG_INFO(log, "Some TTL values were not calculated for part {}. Will calculate them forcefully during merge.", part->name); need_remove_expired_values = true; force_ttl = true; } + else + { + new_data_part->ttl_infos.update(part->ttl_infos); + } } const auto & part_min_ttl = new_data_part->ttl_infos.part_min_ttl; @@ -825,7 +828,7 @@ MergeTreeData::MutableDataPartPtr MergeTreeDataMergerMutator::mergePartsToTempor UInt64 watch_prev_elapsed = 0; /// We count total amount of bytes in parts - /// and use direct_io + aio if there is more than min_merge_bytes_to_use_direct_io + /// and use direct_io if there is more than min_merge_bytes_to_use_direct_io bool read_with_direct_io = false; if (data_settings->min_merge_bytes_to_use_direct_io != 0) { @@ -891,7 +894,7 @@ MergeTreeData::MutableDataPartPtr MergeTreeDataMergerMutator::mergePartsToTempor { case MergeTreeData::MergingParams::Ordinary: merged_transform = std::make_unique( - header, pipes.size(), sort_description, merge_block_size, 0, rows_sources_write_buf.get(), true, blocks_are_granules_size); + header, pipes.size(), sort_description, merge_block_size, 0, false, rows_sources_write_buf.get(), true, blocks_are_granules_size); break; case MergeTreeData::MergingParams::Collapsing: @@ -939,7 +942,10 @@ MergeTreeData::MutableDataPartPtr MergeTreeDataMergerMutator::mergePartsToTempor merged_stream = std::make_shared(merged_stream, sort_description, SizeLimits(), 0 /*limit_hint*/, deduplicate_by_columns); if (need_remove_expired_values) + { + LOG_DEBUG(log, "Outdated rows found in source parts, TTLs processing enabled for merge"); merged_stream = std::make_shared(merged_stream, data, metadata_snapshot, new_data_part, time_of_merge, force_ttl); + } if (metadata_snapshot->hasSecondaryIndices()) { @@ -1326,11 +1332,8 @@ MergeTreeData::MutableDataPartPtr MergeTreeDataMergerMutator::mutatePartToTempor { /// We will modify only some of the columns. Other columns and key values can be copied as-is. NameSet updated_columns; - if (mutation_kind != MutationsInterpreter::MutationKind::MUTATE_INDEX_PROJECTION) - { - for (const auto & name_type : updated_header.getNamesAndTypesList()) - updated_columns.emplace(name_type.name); - } + for (const auto & name_type : updated_header.getNamesAndTypesList()) + updated_columns.emplace(name_type.name); auto indices_to_recalc = getIndicesToRecalculate( in, updated_columns, metadata_snapshot, context, materialized_indices, source_part); @@ -1339,7 +1342,7 @@ MergeTreeData::MutableDataPartPtr MergeTreeDataMergerMutator::mutatePartToTempor NameSet files_to_skip = collectFilesToSkip( source_part, - mutation_kind == MutationsInterpreter::MutationKind::MUTATE_INDEX_PROJECTION ? Block{} : updated_header, + updated_header, indices_to_recalc, mrk_extension, projections_to_recalc); @@ -1407,8 +1410,7 @@ MergeTreeData::MutableDataPartPtr MergeTreeDataMergerMutator::mutatePartToTempor metadata_snapshot, indices_to_recalc, projections_to_recalc, - // If it's an index/projection materialization, we don't write any data columns, thus empty header is used - mutation_kind == MutationsInterpreter::MutationKind::MUTATE_INDEX_PROJECTION ? Block{} : updated_header, + updated_header, new_data_part, in, time_of_mutation, @@ -1657,7 +1659,12 @@ NameToNameVector MergeTreeDataMergerMutator::collectFilesForRenames( { if (command.type == MutationCommand::Type::DROP_INDEX) { - if (source_part->checksums.has(INDEX_FILE_PREFIX + command.column_name + ".idx")) + if (source_part->checksums.has(INDEX_FILE_PREFIX + command.column_name + ".idx2")) + { + rename_vector.emplace_back(INDEX_FILE_PREFIX + command.column_name + ".idx2", ""); + rename_vector.emplace_back(INDEX_FILE_PREFIX + command.column_name + mrk_extension, ""); + } + else if (source_part->checksums.has(INDEX_FILE_PREFIX + command.column_name + ".idx")) { rename_vector.emplace_back(INDEX_FILE_PREFIX + command.column_name + ".idx", ""); rename_vector.emplace_back(INDEX_FILE_PREFIX + command.column_name + mrk_extension, ""); @@ -1743,6 +1750,7 @@ NameSet MergeTreeDataMergerMutator::collectFilesToSkip( for (const auto & index : indices_to_recalc) { files_to_skip.insert(index->getFileName() + ".idx"); + files_to_skip.insert(index->getFileName() + ".idx2"); files_to_skip.insert(index->getFileName() + mrk_extension); } for (const auto & projection : projections_to_recalc) @@ -1887,8 +1895,11 @@ std::set MergeTreeDataMergerMutator::getIndicesToRecalculate( { const auto & index = indices[i]; + bool has_index = + source_part->checksums.has(INDEX_FILE_PREFIX + index.name + ".idx") || + source_part->checksums.has(INDEX_FILE_PREFIX + index.name + ".idx2"); // If we ask to materialize and it already exists - if (!source_part->checksums.has(INDEX_FILE_PREFIX + index.name + ".idx") && materialized_indices.count(index.name)) + if (!has_index && materialized_indices.count(index.name)) { if (indices_to_recalc.insert(index_factory.get(index)).second) { diff --git a/src/Storages/MergeTree/MergeTreeDataPartTTLInfo.cpp b/src/Storages/MergeTree/MergeTreeDataPartTTLInfo.cpp index e130fbc1798..f1beb09c482 100644 --- a/src/Storages/MergeTree/MergeTreeDataPartTTLInfo.cpp +++ b/src/Storages/MergeTree/MergeTreeDataPartTTLInfo.cpp @@ -55,6 +55,10 @@ void MergeTreeDataPartTTLInfos::read(ReadBuffer & in) MergeTreeDataPartTTLInfo ttl_info; ttl_info.min = col["min"].getUInt(); ttl_info.max = col["max"].getUInt(); + + if (col.has("finished")) + ttl_info.finished = col["finished"].getUInt(); + String name = col["name"].getString(); columns_ttl.emplace(name, ttl_info); @@ -67,6 +71,9 @@ void MergeTreeDataPartTTLInfos::read(ReadBuffer & in) table_ttl.min = table["min"].getUInt(); table_ttl.max = table["max"].getUInt(); + if (table.has("finished")) + table_ttl.finished = table["finished"].getUInt(); + updatePartMinMaxTTL(table_ttl.min, table_ttl.max); } @@ -77,6 +84,10 @@ void MergeTreeDataPartTTLInfos::read(ReadBuffer & in) MergeTreeDataPartTTLInfo ttl_info; ttl_info.min = elem["min"].getUInt(); ttl_info.max = elem["max"].getUInt(); + + if (elem.has("finished")) + ttl_info.finished = elem["finished"].getUInt(); + String expression = elem["expression"].getString(); ttl_info_map.emplace(expression, ttl_info); @@ -126,6 +137,8 @@ void MergeTreeDataPartTTLInfos::write(WriteBuffer & out) const writeIntText(it->second.min, out); writeString(",\"max\":", out); writeIntText(it->second.max, out); + writeString(R"(,"finished":)", out); + writeIntText(static_cast(it->second.finished), out); writeString("}", out); } writeString("]", out); @@ -138,6 +151,8 @@ void MergeTreeDataPartTTLInfos::write(WriteBuffer & out) const writeIntText(table_ttl.min, out); writeString(R"(,"max":)", out); writeIntText(table_ttl.max, out); + writeString(R"(,"finished":)", out); + writeIntText(static_cast(table_ttl.finished), out); writeString("}", out); } @@ -159,6 +174,8 @@ void MergeTreeDataPartTTLInfos::write(WriteBuffer & out) const writeIntText(it->second.min, out); writeString(R"(,"max":)", out); writeIntText(it->second.max, out); + writeString(R"(,"finished":)", out); + writeIntText(static_cast(it->second.finished), out); writeString("}", out); } writeString("]", out); @@ -202,6 +219,39 @@ time_t MergeTreeDataPartTTLInfos::getMinimalMaxRecompressionTTL() const return max; } +bool MergeTreeDataPartTTLInfos::hasAnyNonFinishedTTLs() const +{ + auto has_non_finished_ttl = [] (const TTLInfoMap & map) -> bool + { + for (const auto & [name, info] : map) + { + if (!info.finished) + return true; + } + return false; + }; + + if (!table_ttl.finished) + return true; + + if (has_non_finished_ttl(columns_ttl)) + return true; + + if (has_non_finished_ttl(rows_where_ttl)) + return true; + + if (has_non_finished_ttl(moves_ttl)) + return true; + + if (has_non_finished_ttl(recompression_ttl)) + return true; + + if (has_non_finished_ttl(group_by_ttl)) + return true; + + return false; +} + std::optional selectTTLDescriptionForTTLInfos(const TTLDescriptions & descriptions, const TTLInfoMap & ttl_info_map, time_t current_time, bool use_max) { time_t best_ttl_time = 0; @@ -232,4 +282,5 @@ std::optional selectTTLDescriptionForTTLInfos(const TTLDescripti return best_ttl_time ? *best_entry_it : std::optional(); } + } diff --git a/src/Storages/MergeTree/MergeTreeDataPartTTLInfo.h b/src/Storages/MergeTree/MergeTreeDataPartTTLInfo.h index 9d1606ee44a..2b79ad1aac5 100644 --- a/src/Storages/MergeTree/MergeTreeDataPartTTLInfo.h +++ b/src/Storages/MergeTree/MergeTreeDataPartTTLInfo.h @@ -14,6 +14,11 @@ struct MergeTreeDataPartTTLInfo time_t min = 0; time_t max = 0; + /// This TTL was computed on completely expired part. It doesn't make sense + /// to select such parts for TTL again. But make sense to recalcuate TTL + /// again for merge with multiple parts. + bool finished = false; + void update(time_t time) { if (time && (!min || time < min)) @@ -28,6 +33,7 @@ struct MergeTreeDataPartTTLInfo min = other_info.min; max = std::max(other_info.max, max); + finished &= other_info.finished; } }; @@ -60,6 +66,9 @@ struct MergeTreeDataPartTTLInfos void write(WriteBuffer & out) const; void update(const MergeTreeDataPartTTLInfos & other_infos); + /// Has any TTLs which are not calculated on completely expired parts. + bool hasAnyNonFinishedTTLs() const; + void updatePartMinMaxTTL(time_t time_min, time_t time_max) { if (time_min && (!part_min_ttl || time_min < part_min_ttl)) diff --git a/src/Storages/MergeTree/MergeTreeDataPartWriterOnDisk.cpp b/src/Storages/MergeTree/MergeTreeDataPartWriterOnDisk.cpp index 9902add9847..4263640c1e0 100644 --- a/src/Storages/MergeTree/MergeTreeDataPartWriterOnDisk.cpp +++ b/src/Storages/MergeTree/MergeTreeDataPartWriterOnDisk.cpp @@ -9,11 +9,6 @@ namespace ErrorCodes extern const int LOGICAL_ERROR; } -namespace -{ - constexpr auto INDEX_FILE_EXTENSION = ".idx"; -} - void MergeTreeDataPartWriterOnDisk::Stream::finalize() { compressed.next(); @@ -165,7 +160,7 @@ void MergeTreeDataPartWriterOnDisk::initSkipIndices() std::make_unique( stream_name, data_part->volume->getDisk(), - part_path + stream_name, INDEX_FILE_EXTENSION, + part_path + stream_name, index_helper->getSerializedFileExtension(), part_path + stream_name, marks_file_extension, default_codec, settings.max_compress_block_size)); skip_indices_aggregators.push_back(index_helper->createIndexAggregator()); diff --git a/src/Storages/MergeTree/MergeTreeDataPartWriterWide.cpp b/src/Storages/MergeTree/MergeTreeDataPartWriterWide.cpp index 2666ba1518f..8fccfbb1f90 100644 --- a/src/Storages/MergeTree/MergeTreeDataPartWriterWide.cpp +++ b/src/Storages/MergeTree/MergeTreeDataPartWriterWide.cpp @@ -395,10 +395,10 @@ void MergeTreeDataPartWriterWide::validateColumnOfFixedSize(const String & name, auto disk = data_part->volume->getDisk(); String escaped_name = escapeForFileName(name); - String mrk_path = fullPath(disk, part_path + escaped_name + marks_file_extension); - String bin_path = fullPath(disk, part_path + escaped_name + DATA_FILE_EXTENSION); - DB::ReadBufferFromFile mrk_in(mrk_path); - DB::CompressedReadBufferFromFile bin_in(bin_path, 0, 0, 0, nullptr); + String mrk_path = part_path + escaped_name + marks_file_extension; + String bin_path = part_path + escaped_name + DATA_FILE_EXTENSION; + auto mrk_in = disk->readFile(mrk_path); + DB::CompressedReadBufferFromFile bin_in(disk->readFile(bin_path)); bool must_be_last = false; UInt64 offset_in_compressed_file = 0; UInt64 offset_in_decompressed_block = 0; @@ -407,15 +407,15 @@ void MergeTreeDataPartWriterWide::validateColumnOfFixedSize(const String & name, size_t mark_num; const auto & serialization = serializations[name]; - for (mark_num = 0; !mrk_in.eof(); ++mark_num) + for (mark_num = 0; !mrk_in->eof(); ++mark_num) { if (mark_num > index_granularity.getMarksCount()) throw Exception(ErrorCodes::LOGICAL_ERROR, "Incorrect number of marks in memory {}, on disk (at least) {}", index_granularity.getMarksCount(), mark_num + 1); - DB::readBinary(offset_in_compressed_file, mrk_in); - DB::readBinary(offset_in_decompressed_block, mrk_in); + DB::readBinary(offset_in_compressed_file, *mrk_in); + DB::readBinary(offset_in_decompressed_block, *mrk_in); if (settings.can_use_adaptive_granularity) - DB::readBinary(index_granularity_rows, mrk_in); + DB::readBinary(index_granularity_rows, *mrk_in); else index_granularity_rows = data_part->index_granularity_info.fixed_index_granularity; @@ -424,7 +424,7 @@ void MergeTreeDataPartWriterWide::validateColumnOfFixedSize(const String & name, if (index_granularity_rows != 0) throw Exception(ErrorCodes::LOGICAL_ERROR, "We ran out of binary data but still have non empty mark #{} with rows number {}", mark_num, index_granularity_rows); - if (!mrk_in.eof()) + if (!mrk_in->eof()) throw Exception(ErrorCodes::LOGICAL_ERROR, "Mark #{} must be last, but we still have some to read", mark_num); break; @@ -486,7 +486,7 @@ void MergeTreeDataPartWriterWide::validateColumnOfFixedSize(const String & name, } } - if (!mrk_in.eof()) + if (!mrk_in->eof()) throw Exception(ErrorCodes::LOGICAL_ERROR, "Still have something in marks stream, last mark #{} index granularity size {}, last rows {}", mark_num, index_granularity.getMarksCount(), index_granularity_rows); if (!bin_in.eof()) diff --git a/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp b/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp index cffedf44823..c7eb8200957 100644 --- a/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp +++ b/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp @@ -178,7 +178,6 @@ QueryPlanPtr MergeTreeDataSelectExecutor::read( Pipe projection_pipe; Pipe ordinary_pipe; - const auto & given_select = query_info.query->as(); if (!projection_parts.empty()) { LOG_DEBUG(log, "projection required columns: {}", fmt::join(query_info.projection->required_columns, ", ")); @@ -201,7 +200,6 @@ QueryPlanPtr MergeTreeDataSelectExecutor::read( // NOTE: prewhere is executed inside readFromParts if (query_info.projection->before_where) { - // std::cerr << fmt::format("projection before_where: {}", query_info.projection->before_where->dumpDAG()); auto where_step = std::make_unique( plan->getCurrentDataStream(), query_info.projection->before_where, @@ -214,7 +212,6 @@ QueryPlanPtr MergeTreeDataSelectExecutor::read( if (query_info.projection->before_aggregation) { - // std::cerr << fmt::format("projection before_aggregation: {}", query_info.projection->before_aggregation->dumpDAG()); auto expression_before_aggregation = std::make_unique(plan->getCurrentDataStream(), query_info.projection->before_aggregation); expression_before_aggregation->setStepDescription("Before GROUP BY"); @@ -228,22 +225,28 @@ QueryPlanPtr MergeTreeDataSelectExecutor::read( if (!normal_parts.empty()) { auto storage_from_base_parts_of_projection = StorageFromMergeTreeDataPart::create(std::move(normal_parts)); - auto ast = query_info.projection->desc->query_ast->clone(); - auto & select = ast->as(); - if (given_select.where()) - select.setExpression(ASTSelectQuery::Expression::WHERE, given_select.where()->clone()); - if (given_select.prewhere()) - select.setExpression(ASTSelectQuery::Expression::WHERE, given_select.prewhere()->clone()); - - // After overriding the group by clause, we finish the possible aggregations directly - if (processed_stage >= QueryProcessingStage::Enum::WithMergeableState && given_select.groupBy()) - select.setExpression(ASTSelectQuery::Expression::GROUP_BY, given_select.groupBy()->clone()); auto interpreter = InterpreterSelectQuery( - ast, + query_info.query, context, storage_from_base_parts_of_projection, nullptr, - SelectQueryOptions{processed_stage}.ignoreAggregation().ignoreProjections()); + SelectQueryOptions{processed_stage}.projectionQuery()); + + QueryPlan ordinary_query_plan; + interpreter.buildQueryPlan(ordinary_query_plan); + + const auto & expressions = interpreter.getAnalysisResult(); + if (processed_stage == QueryProcessingStage::Enum::FetchColumns && expressions.before_where) + { + auto where_step = std::make_unique( + ordinary_query_plan.getCurrentDataStream(), + expressions.before_where, + expressions.where_column_name, + expressions.remove_where_filter); + where_step->setStepDescription("WHERE"); + ordinary_query_plan.addStep(std::move(where_step)); + } + ordinary_pipe = QueryPipeline::getPipe(interpreter.execute().pipeline); } @@ -268,9 +271,6 @@ QueryPlanPtr MergeTreeDataSelectExecutor::read( { const auto & header_before_aggregation = pipe.getHeader(); - // std::cerr << "============ header before aggregation" << std::endl; - // std::cerr << header_before_aggregation.dumpStructure() << std::endl; - ColumnNumbers keys; for (const auto & key : query_info.projection->aggregation_keys) keys.push_back(header_before_aggregation.getPositionByName(key.name)); @@ -350,9 +350,6 @@ QueryPlanPtr MergeTreeDataSelectExecutor::read( return std::make_shared( header, transform_params, many_data, counter++, merge_threads, temporary_data_merge_threads); }); - - // std::cerr << "============ header after aggregation" << std::endl; - // std::cerr << pipe.getHeader().dumpStructure() << std::endl; }; if (!projection_pipe.empty()) @@ -364,10 +361,11 @@ QueryPlanPtr MergeTreeDataSelectExecutor::read( pipes.emplace_back(std::move(projection_pipe)); pipes.emplace_back(std::move(ordinary_pipe)); auto pipe = Pipe::unitePipes(std::move(pipes)); - // TODO what if pipe is empty? pipe.resize(1); - auto step = std::make_unique(std::move(pipe), "MergeTree(with projection)"); + auto step = std::make_unique( + std::move(pipe), + fmt::format("MergeTree(with {} projection {})", query_info.projection->desc->type, query_info.projection->desc->name)); auto plan = std::make_unique(); plan->addStep(std::move(step)); return plan; @@ -765,7 +763,8 @@ RangesInDataParts MergeTreeDataSelectExecutor::filterPartsByPrimaryKeyAndSkipInd Poco::Logger * log, size_t num_streams, ReadFromMergeTree::IndexStats & index_stats, - bool use_skip_indexes) + bool use_skip_indexes, + bool check_limits) { RangesInDataParts parts_with_ranges(parts.size()); const Settings & settings = context->getSettingsRef(); @@ -893,7 +892,7 @@ RangesInDataParts MergeTreeDataSelectExecutor::filterPartsByPrimaryKeyAndSkipInd if (!ranges.ranges.empty()) { - if (limits.max_rows || leaf_limits.max_rows) + if (check_limits && (limits.max_rows || leaf_limits.max_rows)) { /// Fail fast if estimated number of rows to read exceeds the limit auto current_rows_estimate = ranges.getRowsCount(); @@ -1158,7 +1157,8 @@ size_t MergeTreeDataSelectExecutor::estimateNumMarksToRead( log, num_streams, index_stats, - false); + true /* use_skip_indexes */, + false /* check_limits */); return index_stats.back().num_granules_after; } @@ -1298,6 +1298,9 @@ MarkRanges MergeTreeDataSelectExecutor::markRangesFromPKRange( create_field_ref = [index_columns](size_t row, size_t column, FieldRef & field) { field = {index_columns.get(), row, column}; + // NULL_LAST + if (field.isNull()) + field = PositiveInfinity{}; }; } else @@ -1305,6 +1308,9 @@ MarkRanges MergeTreeDataSelectExecutor::markRangesFromPKRange( create_field_ref = [&index](size_t row, size_t column, FieldRef & field) { index[column]->get(row, field); + // NULL_LAST + if (field.isNull()) + field = PositiveInfinity{}; }; } @@ -1317,21 +1323,22 @@ MarkRanges MergeTreeDataSelectExecutor::markRangesFromPKRange( if (range.end == marks_count && !has_final_mark) { for (size_t i = 0; i < used_key_size; ++i) + { create_field_ref(range.begin, i, index_left[i]); - - return key_condition.mayBeTrueAfter( - used_key_size, index_left.data(), primary_key.data_types); + index_right[i] = PositiveInfinity{}; + } } - - if (has_final_mark && range.end == marks_count) - range.end -= 1; /// Remove final empty mark. It's useful only for primary key condition. - - for (size_t i = 0; i < used_key_size; ++i) + else { - create_field_ref(range.begin, i, index_left[i]); - create_field_ref(range.end, i, index_right[i]); - } + if (has_final_mark && range.end == marks_count) + range.end -= 1; /// Remove final empty mark. It's useful only for primary key condition. + for (size_t i = 0; i < used_key_size; ++i) + { + create_field_ref(range.begin, i, index_left[i]); + create_field_ref(range.end, i, index_right[i]); + } + } return key_condition.mayBeTrueInRange( used_key_size, index_left.data(), index_right.data(), primary_key.data_types); }; @@ -1451,9 +1458,10 @@ MarkRanges MergeTreeDataSelectExecutor::filterMarksUsingIndex( size_t & granules_dropped, Poco::Logger * log) { - if (!part->volume->getDisk()->exists(part->getFullRelativePath() + index_helper->getFileName() + ".idx")) + const std::string & path_prefix = part->getFullRelativePath() + index_helper->getFileName(); + if (!index_helper->getDeserializedFormat(part->volume->getDisk(), path_prefix)) { - LOG_DEBUG(log, "File for index {} does not exist. Skipping it.", backQuote(index_helper->index.name)); + LOG_DEBUG(log, "File for index {} does not exist ({}.*). Skipping it.", backQuote(index_helper->index.name), path_prefix); return ranges; } diff --git a/src/Storages/MergeTree/MergeTreeDataSelectExecutor.h b/src/Storages/MergeTree/MergeTreeDataSelectExecutor.h index bd2a79f0aee..de5ca1f0138 100644 --- a/src/Storages/MergeTree/MergeTreeDataSelectExecutor.h +++ b/src/Storages/MergeTree/MergeTreeDataSelectExecutor.h @@ -174,6 +174,7 @@ public: /// Filter parts using primary key and secondary indexes. /// For every part, select mark ranges to read. + /// If 'check_limits = true' it will throw exception if the amount of data exceed the limits from settings. static RangesInDataParts filterPartsByPrimaryKeyAndSkipIndexes( MergeTreeData::DataPartsVector && parts, StorageMetadataPtr metadata_snapshot, @@ -184,7 +185,8 @@ public: Poco::Logger * log, size_t num_streams, ReadFromMergeTree::IndexStats & index_stats, - bool use_skip_indexes); + bool use_skip_indexes, + bool check_limits); /// Create expression for sampling. /// Also, calculate _sample_factor if needed. diff --git a/src/Storages/MergeTree/MergeTreeInOrderSelectProcessor.cpp b/src/Storages/MergeTree/MergeTreeInOrderSelectProcessor.cpp new file mode 100644 index 00000000000..48a9d62d872 --- /dev/null +++ b/src/Storages/MergeTree/MergeTreeInOrderSelectProcessor.cpp @@ -0,0 +1,54 @@ +#include + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int MEMORY_LIMIT_EXCEEDED; +} + +bool MergeTreeInOrderSelectProcessor::getNewTask() +try +{ + if (all_mark_ranges.empty()) + { + finish(); + return false; + } + + if (!reader) + initializeReaders(); + + MarkRanges mark_ranges_for_task; + /// If we need to read few rows, set one range per task to reduce number of read data. + if (has_limit_below_one_block) + { + mark_ranges_for_task = { std::move(all_mark_ranges.front()) }; + all_mark_ranges.pop_front(); + } + else + { + mark_ranges_for_task = std::move(all_mark_ranges); + all_mark_ranges.clear(); + } + + auto size_predictor = (preferred_block_size_bytes == 0) ? nullptr + : getSizePredictor(data_part, task_columns, sample_block); + + task = std::make_unique( + data_part, mark_ranges_for_task, part_index_in_query, ordered_names, column_name_set, task_columns.columns, + task_columns.pre_columns, prewhere_info && prewhere_info->remove_prewhere_column, + task_columns.should_reorder, std::move(size_predictor)); + + return true; +} +catch (...) +{ + /// Suspicion of the broken part. A part is added to the queue for verification. + if (getCurrentExceptionCode() != ErrorCodes::MEMORY_LIMIT_EXCEEDED) + storage.reportBrokenPart(data_part->name); + throw; +} + +} diff --git a/src/Storages/MergeTree/MergeTreeInOrderSelectProcessor.h b/src/Storages/MergeTree/MergeTreeInOrderSelectProcessor.h new file mode 100644 index 00000000000..ecf648b0291 --- /dev/null +++ b/src/Storages/MergeTree/MergeTreeInOrderSelectProcessor.h @@ -0,0 +1,31 @@ +#pragma once +#include + +namespace DB +{ + + +/// Used to read data from single part with select query in order of primary key. +/// Cares about PREWHERE, virtual columns, indexes etc. +/// To read data from multiple parts, Storage (MergeTree) creates multiple such objects. +class MergeTreeInOrderSelectProcessor final : public MergeTreeSelectProcessor +{ +public: + template + MergeTreeInOrderSelectProcessor(Args &&... args) + : MergeTreeSelectProcessor{std::forward(args)...} + { + LOG_DEBUG(log, "Reading {} ranges in order from part {}, approx. {} rows starting from {}", + all_mark_ranges.size(), data_part->name, total_rows, + data_part->index_granularity.getMarkStartingRow(all_mark_ranges.front().begin)); + } + + String getName() const override { return "MergeTreeInOrder"; } + +private: + bool getNewTask() override; + + Poco::Logger * log = &Poco::Logger::get("MergeTreeInOrderSelectProcessor"); +}; + +} diff --git a/src/Storages/MergeTree/MergeTreeIndexFullText.cpp b/src/Storages/MergeTree/MergeTreeIndexFullText.cpp index 10136cd1069..1c71d77b334 100644 --- a/src/Storages/MergeTree/MergeTreeIndexFullText.cpp +++ b/src/Storages/MergeTree/MergeTreeIndexFullText.cpp @@ -101,14 +101,17 @@ MergeTreeIndexGranuleFullText::MergeTreeIndexGranuleFullText( void MergeTreeIndexGranuleFullText::serializeBinary(WriteBuffer & ostr) const { if (empty()) - throw Exception("Attempt to write empty fulltext index " + backQuote(index_name), ErrorCodes::LOGICAL_ERROR); + throw Exception(ErrorCodes::LOGICAL_ERROR, "Attempt to write empty fulltext index {}.", backQuote(index_name)); for (const auto & bloom_filter : bloom_filters) ostr.write(reinterpret_cast(bloom_filter.getFilter().data()), params.filter_size); } -void MergeTreeIndexGranuleFullText::deserializeBinary(ReadBuffer & istr) +void MergeTreeIndexGranuleFullText::deserializeBinary(ReadBuffer & istr, MergeTreeIndexVersion version) { + if (version != 1) + throw Exception(ErrorCodes::LOGICAL_ERROR, "Unknown index version {}.", version); + for (auto & bloom_filter : bloom_filters) { istr.read(reinterpret_cast( diff --git a/src/Storages/MergeTree/MergeTreeIndexFullText.h b/src/Storages/MergeTree/MergeTreeIndexFullText.h index 1385621f97f..d34cbc61da2 100644 --- a/src/Storages/MergeTree/MergeTreeIndexFullText.h +++ b/src/Storages/MergeTree/MergeTreeIndexFullText.h @@ -45,7 +45,7 @@ struct MergeTreeIndexGranuleFullText final : public IMergeTreeIndexGranule ~MergeTreeIndexGranuleFullText() override = default; void serializeBinary(WriteBuffer & ostr) const override; - void deserializeBinary(ReadBuffer & istr) override; + void deserializeBinary(ReadBuffer & istr, MergeTreeIndexVersion version) override; bool empty() const override { return !has_elems; } diff --git a/src/Storages/MergeTree/MergeTreeIndexGranuleBloomFilter.cpp b/src/Storages/MergeTree/MergeTreeIndexGranuleBloomFilter.cpp index b513437fbe1..6a027b8cb8e 100644 --- a/src/Storages/MergeTree/MergeTreeIndexGranuleBloomFilter.cpp +++ b/src/Storages/MergeTree/MergeTreeIndexGranuleBloomFilter.cpp @@ -84,10 +84,12 @@ bool MergeTreeIndexGranuleBloomFilter::empty() const return !total_rows; } -void MergeTreeIndexGranuleBloomFilter::deserializeBinary(ReadBuffer & istr) +void MergeTreeIndexGranuleBloomFilter::deserializeBinary(ReadBuffer & istr, MergeTreeIndexVersion version) { if (!empty()) - throw Exception("Cannot read data to a non-empty bloom filter index.", ErrorCodes::LOGICAL_ERROR); + throw Exception(ErrorCodes::LOGICAL_ERROR, "Cannot read data to a non-empty bloom filter index."); + if (version != 1) + throw Exception(ErrorCodes::LOGICAL_ERROR, "Unknown index version {}.", version); readVarUInt(total_rows, istr); for (auto & filter : bloom_filters) @@ -102,7 +104,7 @@ void MergeTreeIndexGranuleBloomFilter::deserializeBinary(ReadBuffer & istr) void MergeTreeIndexGranuleBloomFilter::serializeBinary(WriteBuffer & ostr) const { if (empty()) - throw Exception("Attempt to write empty bloom filter index.", ErrorCodes::LOGICAL_ERROR); + throw Exception(ErrorCodes::LOGICAL_ERROR, "Attempt to write empty bloom filter index."); static size_t atom_size = 8; writeVarUInt(total_rows, ostr); diff --git a/src/Storages/MergeTree/MergeTreeIndexGranuleBloomFilter.h b/src/Storages/MergeTree/MergeTreeIndexGranuleBloomFilter.h index cdd4b92f80c..82bd91138a7 100644 --- a/src/Storages/MergeTree/MergeTreeIndexGranuleBloomFilter.h +++ b/src/Storages/MergeTree/MergeTreeIndexGranuleBloomFilter.h @@ -16,8 +16,7 @@ public: bool empty() const override; void serializeBinary(WriteBuffer & ostr) const override; - - void deserializeBinary(ReadBuffer & istr) override; + void deserializeBinary(ReadBuffer & istr, MergeTreeIndexVersion version) override; const std::vector & getFilters() const { return bloom_filters; } diff --git a/src/Storages/MergeTree/MergeTreeIndexMinMax.cpp b/src/Storages/MergeTree/MergeTreeIndexMinMax.cpp index 099d561cf80..3a83afbd280 100644 --- a/src/Storages/MergeTree/MergeTreeIndexMinMax.cpp +++ b/src/Storages/MergeTree/MergeTreeIndexMinMax.cpp @@ -5,6 +5,7 @@ #include #include +#include namespace DB { @@ -39,56 +40,69 @@ void MergeTreeIndexGranuleMinMax::serializeBinary(WriteBuffer & ostr) const const DataTypePtr & type = index_sample_block.getByPosition(i).type; auto serialization = type->getDefaultSerialization(); - if (!type->isNullable()) - { - serialization->serializeBinary(hyperrectangle[i].left, ostr); - serialization->serializeBinary(hyperrectangle[i].right, ostr); - } - else - { - bool is_null = hyperrectangle[i].left.isNull() || hyperrectangle[i].right.isNull(); // one is enough - writeBinary(is_null, ostr); - if (!is_null) - { - serialization->serializeBinary(hyperrectangle[i].left, ostr); - serialization->serializeBinary(hyperrectangle[i].right, ostr); - } - } + serialization->serializeBinary(hyperrectangle[i].left, ostr); + serialization->serializeBinary(hyperrectangle[i].right, ostr); } } -void MergeTreeIndexGranuleMinMax::deserializeBinary(ReadBuffer & istr) +void MergeTreeIndexGranuleMinMax::deserializeBinary(ReadBuffer & istr, MergeTreeIndexVersion version) { hyperrectangle.clear(); Field min_val; Field max_val; - for (size_t i = 0; i < index_sample_block.columns(); ++i) { const DataTypePtr & type = index_sample_block.getByPosition(i).type; auto serialization = type->getDefaultSerialization(); - if (!type->isNullable()) + switch (version) { - serialization->deserializeBinary(min_val, istr); - serialization->deserializeBinary(max_val, istr); - } - else - { - bool is_null; - readBinary(is_null, istr); - if (!is_null) - { + case 1: + if (!type->isNullable()) + { + serialization->deserializeBinary(min_val, istr); + serialization->deserializeBinary(max_val, istr); + } + else + { + /// NOTE: that this serialization differs from + /// IMergeTreeDataPart::MinMaxIndex::load() to preserve + /// backward compatibility. + /// + /// But this is deprecated format, so this is OK. + + bool is_null; + readBinary(is_null, istr); + if (!is_null) + { + serialization->deserializeBinary(min_val, istr); + serialization->deserializeBinary(max_val, istr); + } + else + { + min_val = Null(); + max_val = Null(); + } + } + break; + + /// New format with proper Nullable support for values that includes Null values + case 2: serialization->deserializeBinary(min_val, istr); serialization->deserializeBinary(max_val, istr); - } - else - { - min_val = Null(); - max_val = Null(); - } + + // NULL_LAST + if (min_val.isNull()) + min_val = PositiveInfinity(); + if (max_val.isNull()) + max_val = PositiveInfinity(); + + break; + default: + throw Exception(ErrorCodes::LOGICAL_ERROR, "Unknown index version {}.", version); } + hyperrectangle.emplace_back(min_val, true, max_val, true); } } @@ -117,8 +131,11 @@ void MergeTreeIndexAggregatorMinMax::update(const Block & block, size_t * pos, s for (size_t i = 0; i < index_sample_block.columns(); ++i) { auto index_column_name = index_sample_block.getByPosition(i).name; - const auto & column = block.getByName(index_column_name).column; - column->cut(*pos, rows_read)->getExtremes(field_min, field_max); + const auto & column = block.getByName(index_column_name).column->cut(*pos, rows_read); + if (const auto * column_nullable = typeid_cast(column.get())) + column_nullable->getExtremesNullLast(field_min, field_max); + else + column->getExtremes(field_min, field_max); if (hyperrectangle.size() <= i) { @@ -126,8 +143,10 @@ void MergeTreeIndexAggregatorMinMax::update(const Block & block, size_t * pos, s } else { - hyperrectangle[i].left = std::min(hyperrectangle[i].left, field_min); - hyperrectangle[i].right = std::max(hyperrectangle[i].right, field_max); + hyperrectangle[i].left + = applyVisitor(FieldVisitorAccurateLess(), hyperrectangle[i].left, field_min) ? hyperrectangle[i].left : field_min; + hyperrectangle[i].right + = applyVisitor(FieldVisitorAccurateLess(), hyperrectangle[i].right, field_max) ? field_max : hyperrectangle[i].right; } } @@ -156,9 +175,6 @@ bool MergeTreeIndexConditionMinMax::mayBeTrueOnGranule(MergeTreeIndexGranulePtr if (!granule) throw Exception( "Minmax index condition got a granule with the wrong type.", ErrorCodes::LOGICAL_ERROR); - for (const auto & range : granule->hyperrectangle) - if (range.left.isNull() || range.right.isNull()) - return true; return condition.checkInHyperrectangle(granule->hyperrectangle, index_data_types).can_be_true; } @@ -195,6 +211,15 @@ bool MergeTreeIndexMinMax::mayBenefitFromIndexForIn(const ASTPtr & node) const return false; } +MergeTreeIndexFormat MergeTreeIndexMinMax::getDeserializedFormat(const DiskPtr disk, const std::string & relative_path_prefix) const +{ + if (disk->exists(relative_path_prefix + ".idx2")) + return {2, ".idx2"}; + else if (disk->exists(relative_path_prefix + ".idx")) + return {1, ".idx"}; + return {0 /* unknown */, ""}; +} + MergeTreeIndexPtr minmaxIndexCreator( const IndexDescription & index) { diff --git a/src/Storages/MergeTree/MergeTreeIndexMinMax.h b/src/Storages/MergeTree/MergeTreeIndexMinMax.h index 97b9b874484..0e05e25fb36 100644 --- a/src/Storages/MergeTree/MergeTreeIndexMinMax.h +++ b/src/Storages/MergeTree/MergeTreeIndexMinMax.h @@ -21,7 +21,7 @@ struct MergeTreeIndexGranuleMinMax final : public IMergeTreeIndexGranule ~MergeTreeIndexGranuleMinMax() override = default; void serializeBinary(WriteBuffer & ostr) const override; - void deserializeBinary(ReadBuffer & istr) override; + void deserializeBinary(ReadBuffer & istr, MergeTreeIndexVersion version) override; bool empty() const override { return hyperrectangle.empty(); } @@ -81,6 +81,9 @@ public: const SelectQueryInfo & query, ContextPtr context) const override; bool mayBenefitFromIndexForIn(const ASTPtr & node) const override; + + const char* getSerializedFileExtension() const override { return ".idx2"; } + MergeTreeIndexFormat getDeserializedFormat(const DiskPtr disk, const std::string & path_prefix) const override; }; } diff --git a/src/Storages/MergeTree/MergeTreeIndexReader.cpp b/src/Storages/MergeTree/MergeTreeIndexReader.cpp index eaba247009b..0a0f2511914 100644 --- a/src/Storages/MergeTree/MergeTreeIndexReader.cpp +++ b/src/Storages/MergeTree/MergeTreeIndexReader.cpp @@ -1,5 +1,29 @@ #include +namespace +{ + +using namespace DB; + +std::unique_ptr makeIndexReader( + const std::string & extension, + MergeTreeIndexPtr index, + MergeTreeData::DataPartPtr part, + size_t marks_count, + const MarkRanges & all_mark_ranges, + MergeTreeReaderSettings settings) +{ + return std::make_unique( + part->volume->getDisk(), + part->getFullRelativePath() + index->getFileName(), extension, marks_count, + all_mark_ranges, + std::move(settings), nullptr, nullptr, + part->getFileSizeOrZero(index->getFileName() + extension), + &part->index_granularity_info, + ReadBufferFromFileBase::ProfileCallback{}, CLOCK_MONOTONIC_COARSE); +} + +} namespace DB { @@ -7,27 +31,28 @@ namespace DB MergeTreeIndexReader::MergeTreeIndexReader( MergeTreeIndexPtr index_, MergeTreeData::DataPartPtr part_, size_t marks_count_, const MarkRanges & all_mark_ranges_, MergeTreeReaderSettings settings) - : index(index_), stream( - part_->volume->getDisk(), - part_->getFullRelativePath() + index->getFileName(), ".idx", marks_count_, - all_mark_ranges_, - std::move(settings), nullptr, nullptr, - part_->getFileSizeOrZero(index->getFileName() + ".idx"), - &part_->index_granularity_info, - ReadBufferFromFileBase::ProfileCallback{}, CLOCK_MONOTONIC_COARSE) + : index(index_) { - stream.seekToStart(); + const std::string & path_prefix = part_->getFullRelativePath() + index->getFileName(); + auto index_format = index->getDeserializedFormat(part_->volume->getDisk(), path_prefix); + + stream = makeIndexReader(index_format.extension, index_, part_, marks_count_, all_mark_ranges_, std::move(settings)); + version = index_format.version; + + stream->seekToStart(); } +MergeTreeIndexReader::~MergeTreeIndexReader() = default; + void MergeTreeIndexReader::seek(size_t mark) { - stream.seekToMark(mark); + stream->seekToMark(mark); } MergeTreeIndexGranulePtr MergeTreeIndexReader::read() { auto granule = index->createIndexGranule(); - granule->deserializeBinary(*stream.data_buffer); + granule->deserializeBinary(*stream->data_buffer, version); return granule; } diff --git a/src/Storages/MergeTree/MergeTreeIndexReader.h b/src/Storages/MergeTree/MergeTreeIndexReader.h index 68d681458be..4facd43c175 100644 --- a/src/Storages/MergeTree/MergeTreeIndexReader.h +++ b/src/Storages/MergeTree/MergeTreeIndexReader.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -16,6 +17,7 @@ public: size_t marks_count_, const MarkRanges & all_mark_ranges_, MergeTreeReaderSettings settings); + ~MergeTreeIndexReader(); void seek(size_t mark); @@ -23,7 +25,8 @@ public: private: MergeTreeIndexPtr index; - MergeTreeReaderStream stream; + std::unique_ptr stream; + uint8_t version = 0; }; } diff --git a/src/Storages/MergeTree/MergeTreeIndexSet.cpp b/src/Storages/MergeTree/MergeTreeIndexSet.cpp index 6cee80983d6..024b87c9a3e 100644 --- a/src/Storages/MergeTree/MergeTreeIndexSet.cpp +++ b/src/Storages/MergeTree/MergeTreeIndexSet.cpp @@ -48,8 +48,7 @@ MergeTreeIndexGranuleSet::MergeTreeIndexGranuleSet( void MergeTreeIndexGranuleSet::serializeBinary(WriteBuffer & ostr) const { if (empty()) - throw Exception( - "Attempt to write empty set index " + backQuote(index_name), ErrorCodes::LOGICAL_ERROR); + throw Exception(ErrorCodes::LOGICAL_ERROR, "Attempt to write empty set index {}.", backQuote(index_name)); const auto & size_type = DataTypePtr(std::make_shared()); auto size_serialization = size_type->getDefaultSerialization(); @@ -80,8 +79,11 @@ void MergeTreeIndexGranuleSet::serializeBinary(WriteBuffer & ostr) const } } -void MergeTreeIndexGranuleSet::deserializeBinary(ReadBuffer & istr) +void MergeTreeIndexGranuleSet::deserializeBinary(ReadBuffer & istr, MergeTreeIndexVersion version) { + if (version != 1) + throw Exception(ErrorCodes::LOGICAL_ERROR, "Unknown index version {}.", version); + block.clear(); Field field_rows; diff --git a/src/Storages/MergeTree/MergeTreeIndexSet.h b/src/Storages/MergeTree/MergeTreeIndexSet.h index 28afe4f714d..23b336d274b 100644 --- a/src/Storages/MergeTree/MergeTreeIndexSet.h +++ b/src/Storages/MergeTree/MergeTreeIndexSet.h @@ -28,7 +28,7 @@ struct MergeTreeIndexGranuleSet final : public IMergeTreeIndexGranule MutableColumns && columns_); void serializeBinary(WriteBuffer & ostr) const override; - void deserializeBinary(ReadBuffer & istr) override; + void deserializeBinary(ReadBuffer & istr, MergeTreeIndexVersion version) override; size_t size() const { return block.rows(); } bool empty() const override { return !size(); } diff --git a/src/Storages/MergeTree/MergeTreeIndices.h b/src/Storages/MergeTree/MergeTreeIndices.h index 674daeb480d..557af891b74 100644 --- a/src/Storages/MergeTree/MergeTreeIndices.h +++ b/src/Storages/MergeTree/MergeTreeIndices.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -17,13 +18,37 @@ constexpr auto INDEX_FILE_PREFIX = "skp_idx_"; namespace DB { +using MergeTreeIndexVersion = uint8_t; +struct MergeTreeIndexFormat +{ + MergeTreeIndexVersion version; + const char* extension; + + operator bool() const { return version != 0; } +}; + /// Stores some info about a single block of data. struct IMergeTreeIndexGranule { virtual ~IMergeTreeIndexGranule() = default; + /// Serialize always last version. virtual void serializeBinary(WriteBuffer & ostr) const = 0; - virtual void deserializeBinary(ReadBuffer & istr) = 0; + + /// Version of the index to deserialize: + /// + /// - 2 -- minmax index for proper Nullable support, + /// - 1 -- everything else. + /// + /// Implementation is responsible for version check, + /// and throw LOGICAL_ERROR in case of unsupported version. + /// + /// See also: + /// - IMergeTreeIndex::getSerializedFileExtension() + /// - IMergeTreeIndex::getDeserializedFormat() + /// - MergeTreeDataMergerMutator::collectFilesToSkip() + /// - MergeTreeDataMergerMutator::collectFilesForRenames() + virtual void deserializeBinary(ReadBuffer & istr, MergeTreeIndexVersion version) = 0; virtual bool empty() const = 0; }; @@ -73,9 +98,26 @@ struct IMergeTreeIndex virtual ~IMergeTreeIndex() = default; - /// gets filename without extension + /// Returns filename without extension. String getFileName() const { return INDEX_FILE_PREFIX + index.name; } + /// Returns extension for serialization. + /// Reimplement if you want new index format. + /// + /// NOTE: In case getSerializedFileExtension() is reimplemented, + /// getDeserializedFormat() should be reimplemented too, + /// and check all previous extensions too + /// (to avoid breaking backward compatibility). + virtual const char* getSerializedFileExtension() const { return ".idx"; } + + /// Returns extension for deserialization. + /// + /// Return pair. + virtual MergeTreeIndexFormat getDeserializedFormat(const DiskPtr, const std::string & /* relative_path_prefix */) const + { + return {1, ".idx"}; + } + /// Checks whether the column is in data skipping index. virtual bool mayBenefitFromIndexForIn(const ASTPtr & node) const = 0; diff --git a/src/Storages/MergeTree/MergeTreePartInfo.cpp b/src/Storages/MergeTree/MergeTreePartInfo.cpp index 94430de422e..6a98e666c34 100644 --- a/src/Storages/MergeTree/MergeTreePartInfo.cpp +++ b/src/Storages/MergeTree/MergeTreePartInfo.cpp @@ -9,6 +9,7 @@ namespace DB namespace ErrorCodes { extern const int BAD_DATA_PART_NAME; + extern const int INVALID_PARTITION_VALUE; } @@ -21,6 +22,27 @@ MergeTreePartInfo MergeTreePartInfo::fromPartName(const String & part_name, Merg } +void MergeTreePartInfo::validatePartitionID(const String & partition_id, MergeTreeDataFormatVersion format_version) +{ + if (partition_id.empty()) + throw Exception(ErrorCodes::INVALID_PARTITION_VALUE, "Partition id is empty"); + + if (format_version < MERGE_TREE_DATA_MIN_FORMAT_VERSION_WITH_CUSTOM_PARTITIONING) + { + if (partition_id.size() != 6 || !std::all_of(partition_id.begin(), partition_id.end(), isNumericASCII)) + throw Exception(ErrorCodes::INVALID_PARTITION_VALUE, + "Invalid partition format: {}. Partition should consist of 6 digits: YYYYMM", + partition_id); + } + else + { + auto is_valid_char = [](char c) { return c == '-' || isAlphaNumericASCII(c); }; + if (!std::all_of(partition_id.begin(), partition_id.end(), is_valid_char)) + throw Exception(ErrorCodes::INVALID_PARTITION_VALUE, "Invalid partition format: {}", partition_id); + } + +} + bool MergeTreePartInfo::tryParsePartName(const String & part_name, MergeTreePartInfo * part_info, MergeTreeDataFormatVersion format_version) { ReadBufferFromString in(part_name); @@ -213,13 +235,39 @@ String MergeTreePartInfo::getPartNameV0(DayNum left_date, DayNum right_date) con return wb.str(); } + +const std::vector DetachedPartInfo::DETACH_REASONS = + { + "broken", + "unexpected", + "noquorum", + "ignored", + "broken-on-start", + "clone", + "attaching", + "deleting", + "tmp-fetch", + }; + bool DetachedPartInfo::tryParseDetachedPartName(const String & dir_name, DetachedPartInfo & part_info, MergeTreeDataFormatVersion format_version) { part_info.dir_name = dir_name; - /// First, try to parse as . - // TODO what if tryParsePartName will parse prefix as partition_id? It can happen if dir_name doesn't contain mutation number at the end + /// First, try to find known prefix and parse dir_name as _. + /// Arbitrary strings are not allowed for partition_id, so known_prefix cannot be confused with partition_id. + for (const auto & known_prefix : DETACH_REASONS) + { + if (dir_name.starts_with(known_prefix) && known_prefix.size() < dir_name.size() && dir_name[known_prefix.size()] == '_') + { + part_info.prefix = known_prefix; + String part_name = dir_name.substr(known_prefix.size() + 1); + bool parsed = MergeTreePartInfo::tryParsePartName(part_name, &part_info, format_version); + return part_info.valid_name = parsed; + } + } + + /// Next, try to parse dir_name as . if (MergeTreePartInfo::tryParsePartName(dir_name, &part_info, format_version)) return part_info.valid_name = true; @@ -229,7 +277,6 @@ bool DetachedPartInfo::tryParseDetachedPartName(const String & dir_name, Detache if (first_separator == String::npos) return part_info.valid_name = false; - // TODO what if contains '_'? const auto part_name = dir_name.substr(first_separator + 1, dir_name.size() - first_separator - 1); if (!MergeTreePartInfo::tryParsePartName(part_name, &part_info, format_version)) diff --git a/src/Storages/MergeTree/MergeTreePartInfo.h b/src/Storages/MergeTree/MergeTreePartInfo.h index 8b77442bf8b..be856c1f157 100644 --- a/src/Storages/MergeTree/MergeTreePartInfo.h +++ b/src/Storages/MergeTree/MergeTreePartInfo.h @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -86,6 +87,9 @@ struct MergeTreePartInfo return static_cast(max_block - min_block + 1); } + /// Simple sanity check for partition ID. Checking that it's not too long or too short, doesn't contain a lot of '_'. + static void validatePartitionID(const String & partition_id, MergeTreeDataFormatVersion format_version); + static MergeTreePartInfo fromPartName(const String & part_name, MergeTreeDataFormatVersion format_version); // -V1071 static bool tryParsePartName(const String & part_name, MergeTreePartInfo * part_info, MergeTreeDataFormatVersion format_version); @@ -112,6 +116,10 @@ struct DetachedPartInfo : public MergeTreePartInfo /// If false, MergeTreePartInfo is in invalid state (directory name was not successfully parsed). bool valid_name; + static const std::vector DETACH_REASONS; + + /// NOTE: It may parse part info incorrectly. + /// For example, if prefix contain '_' or if DETACH_REASONS doesn't contain prefix. static bool tryParseDetachedPartName(const String & dir_name, DetachedPartInfo & part_info, MergeTreeDataFormatVersion format_version); }; diff --git a/src/Storages/MergeTree/MergeTreePartition.cpp b/src/Storages/MergeTree/MergeTreePartition.cpp index 8c027eb2089..0d457971dc6 100644 --- a/src/Storages/MergeTree/MergeTreePartition.cpp +++ b/src/Storages/MergeTree/MergeTreePartition.cpp @@ -43,6 +43,16 @@ namespace UInt8 type = Field::Types::Null; hash.update(type); } + void operator() (const NegativeInfinity &) const + { + UInt8 type = Field::Types::NegativeInfinity; + hash.update(type); + } + void operator() (const PositiveInfinity &) const + { + UInt8 type = Field::Types::PositiveInfinity; + hash.update(type); + } void operator() (const UInt64 & x) const { UInt8 type = Field::Types::UInt64; diff --git a/src/Storages/MergeTree/MergeTreePartsMover.cpp b/src/Storages/MergeTree/MergeTreePartsMover.cpp index 5b77ac9ec4a..15e7ed4c1d0 100644 --- a/src/Storages/MergeTree/MergeTreePartsMover.cpp +++ b/src/Storages/MergeTree/MergeTreePartsMover.cpp @@ -195,16 +195,14 @@ MergeTreeData::DataPartPtr MergeTreePartsMover::clonePart(const MergeTreeMoveEnt throw Exception("Cancelled moving parts.", ErrorCodes::ABORTED); auto settings = data->getSettings(); - auto part = moving_part.part; - LOG_TRACE(log, "Cloning part {}", part->name); - auto disk = moving_part.reserved_space->getDisk(); + LOG_DEBUG(log, "Cloning part {} from {} to {}", part->name, part->volume->getDisk()->getName(), disk->getName()); + const String directory_to_move = "moving"; - if (settings->allow_s3_zero_copy_replication) + if (disk->supportZeroCopyReplication() && settings->allow_remote_fs_zero_copy_replication) { - /// Try to fetch part from S3 without copy and fallback to default copy - /// if it's not possible + /// Try zero-copy replication and fallback to default copy if it's not possible moving_part.part->assertOnDisk(); String path_to_clone = fs::path(data->getRelativeDataPath()) / directory_to_move / ""; String relative_path = part->relative_path; diff --git a/src/Storages/MergeTree/MergeTreeRangeReader.cpp b/src/Storages/MergeTree/MergeTreeRangeReader.cpp index 2347280a4a0..7517908feb3 100644 --- a/src/Storages/MergeTree/MergeTreeRangeReader.cpp +++ b/src/Storages/MergeTree/MergeTreeRangeReader.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #ifdef __SSE2__ @@ -835,7 +836,7 @@ Columns MergeTreeRangeReader::continueReadingChain(ReadResult & result, size_t & return columns; } -static void checkCombindeFiltersSize(size_t bytes_in_first_filter, size_t second_filter_size) +static void checkCombinedFiltersSize(size_t bytes_in_first_filter, size_t second_filter_size) { if (bytes_in_first_filter != second_filter_size) throw Exception(ErrorCodes::LOGICAL_ERROR, @@ -845,36 +846,42 @@ static void checkCombindeFiltersSize(size_t bytes_in_first_filter, size_t second static ColumnPtr combineFilters(ColumnPtr first, ColumnPtr second) { - ConstantFilterDescription firsrt_const_descr(*first); + ConstantFilterDescription first_const_descr(*first); - if (firsrt_const_descr.always_true) + if (first_const_descr.always_true) { - checkCombindeFiltersSize(first->size(), second->size()); + checkCombinedFiltersSize(first->size(), second->size()); return second; } - if (firsrt_const_descr.always_false) + if (first_const_descr.always_false) { - checkCombindeFiltersSize(0, second->size()); + checkCombinedFiltersSize(0, second->size()); return first; } - auto mut_first = IColumn::mutate(std::move(first)); - FilterDescription firsrt_descr(*mut_first); + FilterDescription first_descr(*first); - size_t bytes_in_first_filter = countBytesInFilter(*firsrt_descr.data); - checkCombindeFiltersSize(bytes_in_first_filter, second->size()); + size_t bytes_in_first_filter = countBytesInFilter(*first_descr.data); + checkCombinedFiltersSize(bytes_in_first_filter, second->size()); ConstantFilterDescription second_const_descr(*second); if (second_const_descr.always_true) - return mut_first; + return first; if (second_const_descr.always_false) - return second->cloneResized(mut_first->size()); + return second->cloneResized(first->size()); FilterDescription second_descr(*second); - auto & first_data = const_cast(*firsrt_descr.data); + + MutableColumnPtr mut_first; + if (first_descr.data_holder) + mut_first = IColumn::mutate(std::move(first_descr.data_holder)); + else + mut_first = IColumn::mutate(std::move(first)); + + auto & first_data = typeid_cast(mut_first.get())->getData(); const auto * second_data = second_descr.data->data(); for (auto & val : first_data) @@ -968,7 +975,6 @@ void MergeTreeRangeReader::executePrewhereActionsAndFilterColumns(ReadResult & r { row_level_filter = combineFilters(std::move(row_level_filter), filter); result.setFilter(row_level_filter); - } else result.setFilter(filter); @@ -1038,9 +1044,9 @@ void MergeTreeRangeReader::executePrewhereActionsAndFilterColumns(ReadResult & r /// Filter in WHERE instead else { - result.columns[prewhere_column_pos] = result.getFilterHolder()->convertToFullColumnIfConst(); - if (getSampleBlock().getByName(prewhere_info->prewhere_column_name).type->isNullable()) - result.columns[prewhere_column_pos] = makeNullable(std::move(result.columns[prewhere_column_pos])); + auto type = getSampleBlock().getByName(prewhere_info->prewhere_column_name).type; + ColumnWithTypeAndName col(result.getFilterHolder()->convertToFullColumnIfConst(), std::make_shared(), ""); + result.columns[prewhere_column_pos] = castColumn(col, type); result.clearFilter(); // Acting as a flag to not filter in PREWHERE } } diff --git a/src/Storages/MergeTree/MergeTreeReadPool.cpp b/src/Storages/MergeTree/MergeTreeReadPool.cpp index e8ea56b6531..b18f22c3ab1 100644 --- a/src/Storages/MergeTree/MergeTreeReadPool.cpp +++ b/src/Storages/MergeTree/MergeTreeReadPool.cpp @@ -228,26 +228,22 @@ std::vector MergeTreeReadPool::fillPerPartInfo( per_part_sum_marks.push_back(sum_marks); - auto [required_columns, required_pre_columns, should_reorder] = - getReadTaskColumns(data, metadata_snapshot, part.data_part, column_names, prewhere_info, check_columns); + auto task_columns = getReadTaskColumns(data, metadata_snapshot, part.data_part, column_names, prewhere_info, check_columns); + + auto size_predictor = !predict_block_size_bytes ? nullptr + : MergeTreeBaseSelectProcessor::getSizePredictor(part.data_part, task_columns, sample_block); + + per_part_size_predictor.emplace_back(std::move(size_predictor)); /// will be used to distinguish between PREWHERE and WHERE columns when applying filter - const auto & required_column_names = required_columns.getNames(); + const auto & required_column_names = task_columns.columns.getNames(); per_part_column_name_set.emplace_back(required_column_names.begin(), required_column_names.end()); - per_part_pre_columns.push_back(std::move(required_pre_columns)); - per_part_columns.push_back(std::move(required_columns)); - per_part_should_reorder.push_back(should_reorder); + per_part_pre_columns.push_back(std::move(task_columns.pre_columns)); + per_part_columns.push_back(std::move(task_columns.columns)); + per_part_should_reorder.push_back(task_columns.should_reorder); parts_with_idx.push_back({ part.data_part, part.part_index_in_query }); - - if (predict_block_size_bytes) - { - per_part_size_predictor.emplace_back(std::make_unique( - part.data_part, column_names, sample_block)); - } - else - per_part_size_predictor.emplace_back(nullptr); } return per_part_sum_marks; diff --git a/src/Storages/MergeTree/MergeTreeReverseSelectProcessor.cpp b/src/Storages/MergeTree/MergeTreeReverseSelectProcessor.cpp index 81833b76735..16ce9823ebb 100644 --- a/src/Storages/MergeTree/MergeTreeReverseSelectProcessor.cpp +++ b/src/Storages/MergeTree/MergeTreeReverseSelectProcessor.cpp @@ -1,8 +1,4 @@ #include -#include -#include -#include - namespace DB { @@ -12,74 +8,10 @@ namespace ErrorCodes extern const int MEMORY_LIMIT_EXCEEDED; } -MergeTreeReverseSelectProcessor::MergeTreeReverseSelectProcessor( - const MergeTreeData & storage_, - const StorageMetadataPtr & metadata_snapshot_, - const MergeTreeData::DataPartPtr & owned_data_part_, - UInt64 max_block_size_rows_, - size_t preferred_block_size_bytes_, - size_t preferred_max_column_in_block_size_bytes_, - Names required_columns_, - MarkRanges mark_ranges_, - bool use_uncompressed_cache_, - const PrewhereInfoPtr & prewhere_info_, - ExpressionActionsSettings actions_settings, - bool check_columns, - const MergeTreeReaderSettings & reader_settings_, - const Names & virt_column_names_, - size_t part_index_in_query_, - bool quiet) - : - MergeTreeBaseSelectProcessor{ - metadata_snapshot_->getSampleBlockForColumns(required_columns_, storage_.getVirtuals(), storage_.getStorageID()), - storage_, metadata_snapshot_, prewhere_info_, std::move(actions_settings), max_block_size_rows_, - preferred_block_size_bytes_, preferred_max_column_in_block_size_bytes_, - reader_settings_, use_uncompressed_cache_, virt_column_names_}, - required_columns{std::move(required_columns_)}, - data_part{owned_data_part_}, - all_mark_ranges(std::move(mark_ranges_)), - part_index_in_query(part_index_in_query_), - path(data_part->getFullRelativePath()) -{ - /// Let's estimate total number of rows for progress bar. - for (const auto & range : all_mark_ranges) - total_marks_count += range.end - range.begin; - - size_t total_rows = data_part->index_granularity.getRowsCountInRanges(all_mark_ranges); - - if (!quiet) - LOG_DEBUG(log, "Reading {} ranges in reverse order from part {}, approx. {} rows starting from {}", - all_mark_ranges.size(), data_part->name, total_rows, - data_part->index_granularity.getMarkStartingRow(all_mark_ranges.front().begin)); - - addTotalRowsApprox(total_rows); - - ordered_names = header_without_virtual_columns.getNames(); - - task_columns = getReadTaskColumns(storage, metadata_snapshot, data_part, required_columns, prewhere_info, check_columns); - - /// will be used to distinguish between PREWHERE and WHERE columns when applying filter - const auto & column_names = task_columns.columns.getNames(); - column_name_set = NameSet{column_names.begin(), column_names.end()}; - - if (use_uncompressed_cache) - owned_uncompressed_cache = storage.getContext()->getUncompressedCache(); - - owned_mark_cache = storage.getContext()->getMarkCache(); - - reader = data_part->getReader(task_columns.columns, metadata_snapshot, - all_mark_ranges, owned_uncompressed_cache.get(), - owned_mark_cache.get(), reader_settings); - - if (prewhere_info) - pre_reader = data_part->getReader(task_columns.pre_columns, metadata_snapshot, all_mark_ranges, - owned_uncompressed_cache.get(), owned_mark_cache.get(), reader_settings); -} - bool MergeTreeReverseSelectProcessor::getNewTask() try { - if ((chunks.empty() && all_mark_ranges.empty()) || total_marks_count == 0) + if (chunks.empty() && all_mark_ranges.empty()) { finish(); return false; @@ -90,13 +22,15 @@ try if (all_mark_ranges.empty()) return true; + if (!reader) + initializeReaders(); + /// Read ranges from right to left. MarkRanges mark_ranges_for_task = { all_mark_ranges.back() }; all_mark_ranges.pop_back(); - auto size_predictor = (preferred_block_size_bytes == 0) - ? nullptr - : std::make_unique(data_part, ordered_names, metadata_snapshot->getSampleBlock()); + auto size_predictor = (preferred_block_size_bytes == 0) ? nullptr + : getSizePredictor(data_part, task_columns, sample_block); task = std::make_unique( data_part, mark_ranges_for_task, part_index_in_query, ordered_names, column_name_set, @@ -142,17 +76,4 @@ Chunk MergeTreeReverseSelectProcessor::readFromPart() return res; } -void MergeTreeReverseSelectProcessor::finish() -{ - /** Close the files (before destroying the object). - * When many sources are created, but simultaneously reading only a few of them, - * buffers don't waste memory. - */ - reader.reset(); - pre_reader.reset(); - data_part.reset(); -} - -MergeTreeReverseSelectProcessor::~MergeTreeReverseSelectProcessor() = default; - } diff --git a/src/Storages/MergeTree/MergeTreeReverseSelectProcessor.h b/src/Storages/MergeTree/MergeTreeReverseSelectProcessor.h index b807c2d912c..18ab51c03a0 100644 --- a/src/Storages/MergeTree/MergeTreeReverseSelectProcessor.h +++ b/src/Storages/MergeTree/MergeTreeReverseSelectProcessor.h @@ -1,76 +1,33 @@ #pragma once -#include -#include -#include -#include -#include -#include +#include + namespace DB { - /// Used to read data from single part with select query +/// in reverse order of primary key. /// Cares about PREWHERE, virtual columns, indexes etc. /// To read data from multiple parts, Storage (MergeTree) creates multiple such objects. -class MergeTreeReverseSelectProcessor : public MergeTreeBaseSelectProcessor +class MergeTreeReverseSelectProcessor final : public MergeTreeSelectProcessor { public: - MergeTreeReverseSelectProcessor( - const MergeTreeData & storage, - const StorageMetadataPtr & metadata_snapshot, - const MergeTreeData::DataPartPtr & owned_data_part, - UInt64 max_block_size_rows, - size_t preferred_block_size_bytes, - size_t preferred_max_column_in_block_size_bytes, - Names required_columns_, - MarkRanges mark_ranges, - bool use_uncompressed_cache, - const PrewhereInfoPtr & prewhere_info, - ExpressionActionsSettings actions_settings, - bool check_columns, - const MergeTreeReaderSettings & reader_settings, - const Names & virt_column_names = {}, - size_t part_index_in_query = 0, - bool quiet = false); - - ~MergeTreeReverseSelectProcessor() override; + template + MergeTreeReverseSelectProcessor(Args &&... args) + : MergeTreeSelectProcessor{std::forward(args)...} + { + LOG_DEBUG(log, "Reading {} ranges in reverse order from part {}, approx. {} rows starting from {}", + all_mark_ranges.size(), data_part->name, total_rows, + data_part->index_granularity.getMarkStartingRow(all_mark_ranges.front().begin)); + } String getName() const override { return "MergeTreeReverse"; } - /// Closes readers and unlock part locks - void finish(); - -protected: - +private: bool getNewTask() override; Chunk readFromPart() override; -private: - Block header; - - /// Used by Task - Names required_columns; - /// Names from header. Used in order to order columns in read blocks. - Names ordered_names; - NameSet column_name_set; - - MergeTreeReadTaskColumns task_columns; - - /// Data part will not be removed if the pointer owns it - MergeTreeData::DataPartPtr data_part; - - /// Mark ranges we should read (in ascending order) - MarkRanges all_mark_ranges; - /// Total number of marks we should read - size_t total_marks_count = 0; - /// Value of _part_index virtual column (used only in SelectExecutor) - size_t part_index_in_query = 0; - - String path; - Chunks chunks; - Poco::Logger * log = &Poco::Logger::get("MergeTreeReverseSelectProcessor"); }; diff --git a/src/Storages/MergeTree/MergeTreeSelectProcessor.cpp b/src/Storages/MergeTree/MergeTreeSelectProcessor.cpp index ce342a69fe0..98077605f89 100644 --- a/src/Storages/MergeTree/MergeTreeSelectProcessor.cpp +++ b/src/Storages/MergeTree/MergeTreeSelectProcessor.cpp @@ -7,11 +7,6 @@ namespace DB { -namespace ErrorCodes -{ - extern const int MEMORY_LIMIT_EXCEEDED; -} - MergeTreeSelectProcessor::MergeTreeSelectProcessor( const MergeTreeData & storage_, const StorageMetadataPtr & metadata_snapshot_, @@ -28,88 +23,48 @@ MergeTreeSelectProcessor::MergeTreeSelectProcessor( const MergeTreeReaderSettings & reader_settings_, const Names & virt_column_names_, size_t part_index_in_query_, - bool quiet) - : - MergeTreeBaseSelectProcessor{ + bool has_limit_below_one_block_) + : MergeTreeBaseSelectProcessor{ metadata_snapshot_->getSampleBlockForColumns(required_columns_, storage_.getVirtuals(), storage_.getStorageID()), storage_, metadata_snapshot_, prewhere_info_, std::move(actions_settings), max_block_size_rows_, preferred_block_size_bytes_, preferred_max_column_in_block_size_bytes_, reader_settings_, use_uncompressed_cache_, virt_column_names_}, required_columns{std::move(required_columns_)}, data_part{owned_data_part_}, + sample_block(metadata_snapshot_->getSampleBlock()), all_mark_ranges(std::move(mark_ranges_)), part_index_in_query(part_index_in_query_), - check_columns(check_columns_) + has_limit_below_one_block(has_limit_below_one_block_), + check_columns(check_columns_), + total_rows(data_part->index_granularity.getRowsCountInRanges(all_mark_ranges)) { - /// Let's estimate total number of rows for progress bar. - for (const auto & range : all_mark_ranges) - total_marks_count += range.end - range.begin; - - size_t total_rows = data_part->index_granularity.getRowsCountInRanges(all_mark_ranges); - - if (!quiet) - LOG_DEBUG(log, "Reading {} ranges from part {}, approx. {} rows starting from {}", - all_mark_ranges.size(), data_part->name, total_rows, - data_part->index_granularity.getMarkStartingRow(all_mark_ranges.front().begin)); - addTotalRowsApprox(total_rows); ordered_names = header_without_virtual_columns.getNames(); } - -bool MergeTreeSelectProcessor::getNewTask() -try +void MergeTreeSelectProcessor::initializeReaders() { - /// Produce no more than one task - if (!is_first_task || total_marks_count == 0) - { - finish(); - return false; - } - is_first_task = false; - task_columns = getReadTaskColumns( storage, metadata_snapshot, data_part, required_columns, prewhere_info, check_columns); - auto size_predictor = (preferred_block_size_bytes == 0) - ? nullptr - : std::make_unique(data_part, ordered_names, metadata_snapshot->getSampleBlock()); - - /// will be used to distinguish between PREWHERE and WHERE columns when applying filter + /// Will be used to distinguish between PREWHERE and WHERE columns when applying filter const auto & column_names = task_columns.columns.getNames(); column_name_set = NameSet{column_names.begin(), column_names.end()}; - task = std::make_unique( - data_part, all_mark_ranges, part_index_in_query, ordered_names, column_name_set, task_columns.columns, - task_columns.pre_columns, prewhere_info && prewhere_info->remove_prewhere_column, - task_columns.should_reorder, std::move(size_predictor)); + if (use_uncompressed_cache) + owned_uncompressed_cache = storage.getContext()->getUncompressedCache(); - if (!reader) - { - if (use_uncompressed_cache) - owned_uncompressed_cache = storage.getContext()->getUncompressedCache(); + owned_mark_cache = storage.getContext()->getMarkCache(); - owned_mark_cache = storage.getContext()->getMarkCache(); + reader = data_part->getReader(task_columns.columns, metadata_snapshot, all_mark_ranges, + owned_uncompressed_cache.get(), owned_mark_cache.get(), reader_settings); - reader = data_part->getReader(task_columns.columns, metadata_snapshot, all_mark_ranges, + if (prewhere_info) + pre_reader = data_part->getReader(task_columns.pre_columns, metadata_snapshot, all_mark_ranges, owned_uncompressed_cache.get(), owned_mark_cache.get(), reader_settings); - if (prewhere_info) - pre_reader = data_part->getReader(task_columns.pre_columns, metadata_snapshot, all_mark_ranges, - owned_uncompressed_cache.get(), owned_mark_cache.get(), reader_settings); - } - - return true; } -catch (...) -{ - /// Suspicion of the broken part. A part is added to the queue for verification. - if (getCurrentExceptionCode() != ErrorCodes::MEMORY_LIMIT_EXCEEDED) - storage.reportBrokenPart(data_part->name); - throw; -} - void MergeTreeSelectProcessor::finish() { @@ -122,8 +77,6 @@ void MergeTreeSelectProcessor::finish() data_part.reset(); } - MergeTreeSelectProcessor::~MergeTreeSelectProcessor() = default; - } diff --git a/src/Storages/MergeTree/MergeTreeSelectProcessor.h b/src/Storages/MergeTree/MergeTreeSelectProcessor.h index b63107b6dbf..ea4cd349cba 100644 --- a/src/Storages/MergeTree/MergeTreeSelectProcessor.h +++ b/src/Storages/MergeTree/MergeTreeSelectProcessor.h @@ -1,11 +1,11 @@ #pragma once -#include -#include +#include #include #include #include #include + namespace DB { @@ -28,24 +28,21 @@ public: bool use_uncompressed_cache, const PrewhereInfoPtr & prewhere_info, ExpressionActionsSettings actions_settings, - bool check_columns, + bool check_columns_, const MergeTreeReaderSettings & reader_settings, const Names & virt_column_names = {}, - size_t part_index_in_query = 0, - bool quiet = false); + size_t part_index_in_query_ = 0, + bool has_limit_below_one_block_ = false); ~MergeTreeSelectProcessor() override; - String getName() const override { return "MergeTree"; } - /// Closes readers and unlock part locks void finish(); protected: - - bool getNewTask() override; - -private: + /// Defer initialization from constructor, because it may be heavy + /// and it's better to do it lazily in `getNewTask`, which is executing in parallel. + void initializeReaders(); /// Used by Task Names required_columns; @@ -58,17 +55,19 @@ private: /// Data part will not be removed if the pointer owns it MergeTreeData::DataPartPtr data_part; + /// Cache getSampleBlock call, which might be heavy. + Block sample_block; + /// Mark ranges we should read (in ascending order) MarkRanges all_mark_ranges; - /// Total number of marks we should read - size_t total_marks_count = 0; /// Value of _part_index virtual column (used only in SelectExecutor) size_t part_index_in_query = 0; + /// If true, every task will be created only with one range. + /// It reduces amount of read data for queries with small LIMIT. + bool has_limit_below_one_block = false; bool check_columns; - bool is_first_task = true; - - Poco::Logger * log = &Poco::Logger::get("MergeTreeSelectProcessor"); + size_t total_rows = 0; }; } diff --git a/src/Storages/MergeTree/MergeTreeSequentialSource.cpp b/src/Storages/MergeTree/MergeTreeSequentialSource.cpp index e82b1966461..c854ca4e305 100644 --- a/src/Storages/MergeTree/MergeTreeSequentialSource.cpp +++ b/src/Storages/MergeTree/MergeTreeSequentialSource.cpp @@ -43,8 +43,7 @@ MergeTreeSequentialSource::MergeTreeSequentialSource( NamesAndTypesList columns_for_reader; if (take_column_types_from_storage) { - const NamesAndTypesList & physical_columns = metadata_snapshot->getColumns().getAllPhysical(); - columns_for_reader = physical_columns.addTypes(columns_to_read); + columns_for_reader = metadata_snapshot->getColumns().getByNames(ColumnsDescription::AllPhysical, columns_to_read, false); } else { @@ -54,7 +53,7 @@ MergeTreeSequentialSource::MergeTreeSequentialSource( MergeTreeReaderSettings reader_settings = { - /// bytes to use AIO (this is hack) + /// bytes to use direct IO (this is hack) .min_bytes_to_use_direct_io = read_with_direct_io ? 1UL : std::numeric_limits::max(), .max_read_buffer_size = DBMS_DEFAULT_BUFFER_SIZE, .save_marks_in_cache = false diff --git a/src/Storages/MergeTree/MergeTreeSettings.h b/src/Storages/MergeTree/MergeTreeSettings.h index 888ca80e015..531091bb7f9 100644 --- a/src/Storages/MergeTree/MergeTreeSettings.h +++ b/src/Storages/MergeTree/MergeTreeSettings.h @@ -57,6 +57,7 @@ struct Settings; M(Bool, in_memory_parts_insert_sync, false, "If true insert of part with in-memory format will wait for fsync of WAL", 0) \ M(UInt64, non_replicated_deduplication_window, 0, "How many last blocks of hashes should be kept on disk (0 - disabled).", 0) \ M(UInt64, max_parts_to_merge_at_once, 100, "Max amount of parts which can be merged at once (0 - disabled). Doesn't affect OPTIMIZE FINAL query.", 0) \ + M(UInt64, merge_selecting_sleep_ms, 5000, "Sleep time for merge selecting when no part selected, a lower setting will trigger selecting tasks in background_schedule_pool frequently which result in large amount of requests to zookeeper in large-scale clusters", 0) \ \ /** Inserts settings. */ \ M(UInt64, parts_to_delay_insert, 150, "If table contains at least that many active parts in single partition, artificially slow down insert into table.", 0) \ @@ -74,7 +75,7 @@ struct Settings; M(Seconds, prefer_fetch_merged_part_time_threshold, 3600, "If time passed after replication log entry creation exceeds this threshold and sum size of parts is greater than \"prefer_fetch_merged_part_size_threshold\", prefer fetching merged part from replica instead of doing merge locally. To speed up very long merges.", 0) \ M(UInt64, prefer_fetch_merged_part_size_threshold, 10ULL * 1024 * 1024 * 1024, "If sum size of parts exceeds this threshold and time passed after replication log entry creation is greater than \"prefer_fetch_merged_part_time_threshold\", prefer fetching merged part from replica instead of doing merge locally. To speed up very long merges.", 0) \ M(Seconds, execute_merges_on_single_replica_time_threshold, 0, "When greater than zero only a single replica starts the merge immediately, others wait up to that amount of time to download the result instead of doing merges locally. If the chosen replica doesn't finish the merge during that amount of time, fallback to standard behavior happens.", 0) \ - M(Seconds, s3_execute_merges_on_single_replica_time_threshold, 3 * 60 * 60, "When greater than zero only a single replica starts the merge immediatelys when merged part on S3 storage and 'allow_s3_zero_copy_replication' is enabled.", 0) \ + M(Seconds, remote_fs_execute_merges_on_single_replica_time_threshold, 3 * 60 * 60, "When greater than zero only a single replica starts the merge immediatelys when merged part on shared storage and 'allow_remote_fs_zero_copy_replication' is enabled.", 0) \ M(Seconds, try_fetch_recompressed_part_timeout, 7200, "Recompression works slow in most cases, so we don't start merge with recompression until this timeout and trying to fetch recompressed part from replica which assigned this merge with recompression.", 0) \ M(Bool, always_fetch_merged_part, 0, "If true, replica never merge parts and always download merged parts from other replicas.", 0) \ M(UInt64, max_suspicious_broken_parts, 10, "Max broken parts, if more - deny automatic deletion.", 0) \ @@ -123,13 +124,14 @@ struct Settings; M(UInt64, concurrent_part_removal_threshold, 100, "Activate concurrent part removal (see 'max_part_removal_threads') only if the number of inactive data parts is at least this.", 0) \ M(String, storage_policy, "default", "Name of storage disk policy", 0) \ M(Bool, allow_nullable_key, false, "Allow Nullable types as primary keys.", 0) \ - M(Bool, allow_s3_zero_copy_replication, false, "Allow Zero-copy replication over S3", 0) \ + M(Bool, allow_remote_fs_zero_copy_replication, true, "Allow Zero-copy replication over remote fs", 0) \ M(Bool, remove_empty_parts, true, "Remove empty parts after they were pruned by TTL, mutation, or collapsing merge algorithm", 0) \ M(Bool, assign_part_uuids, false, "Generate UUIDs for parts. Before enabling check that all replicas support new format.", 0) \ M(Int64, max_partitions_to_read, -1, "Limit the max number of partitions that can be accessed in one query. <= 0 means unlimited. This setting is the default that can be overridden by the query-level setting with the same name.", 0) \ M(UInt64, max_concurrent_queries, 0, "Max number of concurrently executed queries related to the MergeTree table (0 - disabled). Queries will still be limited by other max_concurrent_queries settings.", 0) \ M(UInt64, min_marks_to_honor_max_concurrent_queries, 0, "Minimal number of marks to honor the MergeTree-level's max_concurrent_queries (0 - disabled). Queries will still be limited by other max_concurrent_queries settings.", 0) \ M(UInt64, min_bytes_to_rebalance_partition_over_jbod, 0, "Minimal amount of bytes to enable part rebalance over JBOD array (0 - disabled).", 0) \ + M(Bool, check_sample_column_is_correct, true, "Check columns or columns by hash for sampling are unsigned integer.", 0) \ \ /** Experimental/work in progress feature. Unsafe for production. */ \ M(UInt64, part_moves_between_shards_enable, 0, "Experimental/Incomplete feature to move parts between shards. Does not take into account sharding expressions.", 0) \ diff --git a/src/Storages/MergeTree/MergeTreeBlockOutputStream.cpp b/src/Storages/MergeTree/MergeTreeSink.cpp similarity index 83% rename from src/Storages/MergeTree/MergeTreeBlockOutputStream.cpp rename to src/Storages/MergeTree/MergeTreeSink.cpp index 11feb905bb6..73c753386a4 100644 --- a/src/Storages/MergeTree/MergeTreeBlockOutputStream.cpp +++ b/src/Storages/MergeTree/MergeTreeSink.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -7,13 +7,7 @@ namespace DB { -Block MergeTreeBlockOutputStream::getHeader() const -{ - return metadata_snapshot->getSampleBlock(); -} - - -void MergeTreeBlockOutputStream::writePrefix() +void MergeTreeSink::onStart() { /// Only check "too many parts" before write, /// because interrupting long-running INSERT query in the middle is not convenient for users. @@ -21,8 +15,10 @@ void MergeTreeBlockOutputStream::writePrefix() } -void MergeTreeBlockOutputStream::write(const Block & block) +void MergeTreeSink::consume(Chunk chunk) { + auto block = getPort().getHeader().cloneWithColumns(chunk.detachColumns()); + auto part_blocks = storage.writer.splitBlockIntoParts(block, max_parts_per_block, metadata_snapshot, context); for (auto & current_block : part_blocks) { diff --git a/src/Storages/MergeTree/MergeTreeBlockOutputStream.h b/src/Storages/MergeTree/MergeTreeSink.h similarity index 63% rename from src/Storages/MergeTree/MergeTreeBlockOutputStream.h rename to src/Storages/MergeTree/MergeTreeSink.h index 32a5b8fccc2..60ac62c7592 100644 --- a/src/Storages/MergeTree/MergeTreeBlockOutputStream.h +++ b/src/Storages/MergeTree/MergeTreeSink.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include @@ -11,24 +11,25 @@ class Block; class StorageMergeTree; -class MergeTreeBlockOutputStream : public IBlockOutputStream +class MergeTreeSink : public SinkToStorage { public: - MergeTreeBlockOutputStream( + MergeTreeSink( StorageMergeTree & storage_, const StorageMetadataPtr metadata_snapshot_, size_t max_parts_per_block_, ContextPtr context_) - : storage(storage_) + : SinkToStorage(metadata_snapshot_->getSampleBlock()) + , storage(storage_) , metadata_snapshot(metadata_snapshot_) , max_parts_per_block(max_parts_per_block_) , context(context_) { } - Block getHeader() const override; - void write(const Block & block) override; - void writePrefix() override; + String getName() const override { return "MergeTreeSink"; } + void consume(Chunk chunk) override; + void onStart() override; private: StorageMergeTree & storage; diff --git a/src/Storages/MergeTree/MergeTreeThreadSelectBlockInputProcessor.cpp b/src/Storages/MergeTree/MergeTreeThreadSelectProcessor.cpp similarity index 93% rename from src/Storages/MergeTree/MergeTreeThreadSelectBlockInputProcessor.cpp rename to src/Storages/MergeTree/MergeTreeThreadSelectProcessor.cpp index daefb17038a..4eb6bc4b2e2 100644 --- a/src/Storages/MergeTree/MergeTreeThreadSelectBlockInputProcessor.cpp +++ b/src/Storages/MergeTree/MergeTreeThreadSelectProcessor.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include #include @@ -8,7 +8,7 @@ namespace DB { -MergeTreeThreadSelectBlockInputProcessor::MergeTreeThreadSelectBlockInputProcessor( +MergeTreeThreadSelectProcessor::MergeTreeThreadSelectProcessor( const size_t thread_, const MergeTreeReadPoolPtr & pool_, const size_t min_marks_to_read_, @@ -46,7 +46,7 @@ MergeTreeThreadSelectBlockInputProcessor::MergeTreeThreadSelectBlockInputProcess } /// Requests read task from MergeTreeReadPool and signals whether it got one -bool MergeTreeThreadSelectBlockInputProcessor::getNewTask() +bool MergeTreeThreadSelectProcessor::getNewTask() { task = pool->getTask(min_marks_to_read, thread, ordered_names); @@ -107,6 +107,6 @@ bool MergeTreeThreadSelectBlockInputProcessor::getNewTask() } -MergeTreeThreadSelectBlockInputProcessor::~MergeTreeThreadSelectBlockInputProcessor() = default; +MergeTreeThreadSelectProcessor::~MergeTreeThreadSelectProcessor() = default; } diff --git a/src/Storages/MergeTree/MergeTreeThreadSelectBlockInputProcessor.h b/src/Storages/MergeTree/MergeTreeThreadSelectProcessor.h similarity index 88% rename from src/Storages/MergeTree/MergeTreeThreadSelectBlockInputProcessor.h rename to src/Storages/MergeTree/MergeTreeThreadSelectProcessor.h index 30c551eede0..d17b15c3635 100644 --- a/src/Storages/MergeTree/MergeTreeThreadSelectBlockInputProcessor.h +++ b/src/Storages/MergeTree/MergeTreeThreadSelectProcessor.h @@ -11,10 +11,10 @@ class MergeTreeReadPool; /** Used in conjunction with MergeTreeReadPool, asking it for more work to do and performing whatever reads it is asked * to perform. */ -class MergeTreeThreadSelectBlockInputProcessor : public MergeTreeBaseSelectProcessor +class MergeTreeThreadSelectProcessor : public MergeTreeBaseSelectProcessor { public: - MergeTreeThreadSelectBlockInputProcessor( + MergeTreeThreadSelectProcessor( const size_t thread_, const std::shared_ptr & pool_, const size_t min_marks_to_read_, @@ -32,7 +32,7 @@ public: String getName() const override { return "MergeTreeThread"; } - ~MergeTreeThreadSelectBlockInputProcessor() override; + ~MergeTreeThreadSelectProcessor() override; protected: /// Requests read task from MergeTreeReadPool and signals whether it got one diff --git a/src/Storages/MergeTree/ReplicatedMergeTreeCleanupThread.cpp b/src/Storages/MergeTree/ReplicatedMergeTreeCleanupThread.cpp index 10e2d77eb27..06856c73888 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreeCleanupThread.cpp +++ b/src/Storages/MergeTree/ReplicatedMergeTreeCleanupThread.cpp @@ -62,7 +62,7 @@ void ReplicatedMergeTreeCleanupThread::iterate() /// Both use relative_data_path which changes during rename, so we /// do it under share lock storage.clearOldWriteAheadLogs(); - storage.clearOldTemporaryDirectories(); + storage.clearOldTemporaryDirectories(storage.getSettings()->temporary_directories_lifetime.totalSeconds()); } /// This is loose condition: no problem if we actually had lost leadership at this moment diff --git a/src/Storages/MergeTree/ReplicatedMergeTreeLogEntry.cpp b/src/Storages/MergeTree/ReplicatedMergeTreeLogEntry.cpp index 0e6ab5e32f7..18e90952721 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreeLogEntry.cpp +++ b/src/Storages/MergeTree/ReplicatedMergeTreeLogEntry.cpp @@ -431,6 +431,16 @@ std::optional ReplicatedMergeTreeLogEntryData::getDropRange(MergeTreeDat return {}; } +bool ReplicatedMergeTreeLogEntryData::isDropPart(MergeTreeDataFormatVersion format_version) const +{ + if (type == DROP_RANGE) + { + auto drop_range_info = MergeTreePartInfo::fromPartName(new_part_name, format_version); + return !drop_range_info.isFakeDropRangePart(); + } + return false; +} + Strings ReplicatedMergeTreeLogEntryData::getVirtualPartNames(MergeTreeDataFormatVersion format_version) const { /// Doesn't produce any part @@ -439,7 +449,30 @@ Strings ReplicatedMergeTreeLogEntryData::getVirtualPartNames(MergeTreeDataFormat /// DROP_RANGE does not add a real part, but we must disable merges in that range if (type == DROP_RANGE) + { + auto drop_range_part_info = MergeTreePartInfo::fromPartName(new_part_name, format_version); + + /// It's DROP PART and we don't want to add it into virtual parts + /// because it can lead to intersecting parts on stale replicas and this + /// problem is fundamental. So we have very weak guarantees for DROP + /// PART. If any concurrent merge will be assigned then DROP PART will + /// delete nothing and part will be successfully merged into bigger part. + /// + /// dropPart used in the following cases: + /// 1) Remove empty parts after TTL. + /// 2) Remove parts after move between shards. + /// 3) User queries: ALTER TABLE DROP PART 'part_name'. + /// + /// In the first case merge of empty part is even better than DROP. In + /// the second case part UUIDs used to forbid merges for moding parts so + /// there is no problem with concurrent merges. The third case is quite + /// rare and we give very weak guarantee: there will be no active part + /// with this name, but possibly it was merged to some other part. + if (!drop_range_part_info.isFakeDropRangePart()) + return {}; + return {new_part_name}; + } if (type == REPLACE_RANGE) { diff --git a/src/Storages/MergeTree/ReplicatedMergeTreeLogEntry.h b/src/Storages/MergeTree/ReplicatedMergeTreeLogEntry.h index eb82572b107..3752c9deb8f 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreeLogEntry.h +++ b/src/Storages/MergeTree/ReplicatedMergeTreeLogEntry.h @@ -143,6 +143,10 @@ struct ReplicatedMergeTreeLogEntryData /// Returns fake part for drop range (for DROP_RANGE and REPLACE_RANGE) std::optional getDropRange(MergeTreeDataFormatVersion format_version) const; + /// This entry is DROP PART, not DROP PARTITION. They both have same + /// DROP_RANGE entry type, but differs in information about drop range. + bool isDropPart(MergeTreeDataFormatVersion format_version) const; + /// Access under queue_mutex, see ReplicatedMergeTreeQueue. bool currently_executing = false; /// Whether the action is executing now. bool removed_by_other_entry = false; diff --git a/src/Storages/MergeTree/ReplicatedMergeTreeMergeStrategyPicker.cpp b/src/Storages/MergeTree/ReplicatedMergeTreeMergeStrategyPicker.cpp index 65da6080e86..4d8261da2ee 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreeMergeStrategyPicker.cpp +++ b/src/Storages/MergeTree/ReplicatedMergeTreeMergeStrategyPicker.cpp @@ -56,9 +56,9 @@ bool ReplicatedMergeTreeMergeStrategyPicker::shouldMergeOnSingleReplica(const Re } -bool ReplicatedMergeTreeMergeStrategyPicker::shouldMergeOnSingleReplicaS3Shared(const ReplicatedMergeTreeLogEntryData & entry) const +bool ReplicatedMergeTreeMergeStrategyPicker::shouldMergeOnSingleReplicaShared(const ReplicatedMergeTreeLogEntryData & entry) const { - time_t threshold = s3_execute_merges_on_single_replica_time_threshold; + time_t threshold = remote_fs_execute_merges_on_single_replica_time_threshold; return ( threshold > 0 /// feature turned on && entry.type == ReplicatedMergeTreeLogEntry::MERGE_PARTS /// it is a merge log entry @@ -100,24 +100,25 @@ std::optional ReplicatedMergeTreeMergeStrategyPicker::pickReplicaToExecu void ReplicatedMergeTreeMergeStrategyPicker::refreshState() { - auto threshold = storage.getSettings()->execute_merges_on_single_replica_time_threshold.totalSeconds(); - auto threshold_s3 = 0; - if (storage.getSettings()->allow_s3_zero_copy_replication) - threshold_s3 = storage.getSettings()->s3_execute_merges_on_single_replica_time_threshold.totalSeconds(); + const auto settings = storage.getSettings(); + auto threshold = settings->execute_merges_on_single_replica_time_threshold.totalSeconds(); + auto threshold_init = 0; + if (settings->allow_remote_fs_zero_copy_replication) + threshold_init = settings->remote_fs_execute_merges_on_single_replica_time_threshold.totalSeconds(); if (threshold == 0) /// we can reset the settings w/o lock (it's atomic) execute_merges_on_single_replica_time_threshold = threshold; - if (threshold_s3 == 0) - s3_execute_merges_on_single_replica_time_threshold = threshold_s3; - if (threshold == 0 && threshold_s3 == 0) + if (threshold_init == 0) + remote_fs_execute_merges_on_single_replica_time_threshold = threshold_init; + if (threshold == 0 && threshold_init == 0) return; auto now = time(nullptr); /// the setting was already enabled, and last state refresh was done recently if (((threshold != 0 && execute_merges_on_single_replica_time_threshold != 0) - || (threshold_s3 != 0 && s3_execute_merges_on_single_replica_time_threshold != 0)) + || (threshold_init != 0 && remote_fs_execute_merges_on_single_replica_time_threshold != 0)) && now - last_refresh_time < REFRESH_STATE_MINIMUM_INTERVAL_SECONDS) return; @@ -143,18 +144,23 @@ void ReplicatedMergeTreeMergeStrategyPicker::refreshState() if (current_replica_index_tmp < 0 || active_replicas_tmp.size() < 2) { - LOG_WARNING(storage.log, "Can't find current replica in the active replicas list, or too few active replicas to use execute_merges_on_single_replica_time_threshold!"); - /// we can reset the settings w/o lock (it's atomic) - execute_merges_on_single_replica_time_threshold = 0; - s3_execute_merges_on_single_replica_time_threshold = 0; + if (execute_merges_on_single_replica_time_threshold > 0) + { + LOG_WARNING(storage.log, "Can't find current replica in the active replicas list, or too few active replicas to use 'execute_merges_on_single_replica_time_threshold'"); + /// we can reset the settings w/o lock (it's atomic) + execute_merges_on_single_replica_time_threshold = 0; + } + /// default value of remote_fs_execute_merges_on_single_replica_time_threshold is not 0 + /// so we write no warning in log here + remote_fs_execute_merges_on_single_replica_time_threshold = 0; return; } std::lock_guard lock(mutex); if (threshold != 0) /// Zeros already reset execute_merges_on_single_replica_time_threshold = threshold; - if (threshold_s3 != 0) - s3_execute_merges_on_single_replica_time_threshold = threshold_s3; + if (threshold_init != 0) + remote_fs_execute_merges_on_single_replica_time_threshold = threshold_init; last_refresh_time = now; current_replica_index = current_replica_index_tmp; active_replicas = active_replicas_tmp; diff --git a/src/Storages/MergeTree/ReplicatedMergeTreeMergeStrategyPicker.h b/src/Storages/MergeTree/ReplicatedMergeTreeMergeStrategyPicker.h index 8adf206676a..f6a19173f77 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreeMergeStrategyPicker.h +++ b/src/Storages/MergeTree/ReplicatedMergeTreeMergeStrategyPicker.h @@ -52,9 +52,9 @@ public: /// and we may need to do a fetch (or postpone) instead of merge bool shouldMergeOnSingleReplica(const ReplicatedMergeTreeLogEntryData & entry) const; - /// return true if s3_execute_merges_on_single_replica_time_threshold feature is active + /// return true if remote_fs_execute_merges_on_single_replica_time_threshold feature is active /// and we may need to do a fetch (or postpone) instead of merge - bool shouldMergeOnSingleReplicaS3Shared(const ReplicatedMergeTreeLogEntryData & entry) const; + bool shouldMergeOnSingleReplicaShared(const ReplicatedMergeTreeLogEntryData & entry) const; /// returns the replica name /// and it's not current replica should do the merge @@ -72,7 +72,7 @@ private: uint64_t getEntryHash(const ReplicatedMergeTreeLogEntryData & entry) const; std::atomic execute_merges_on_single_replica_time_threshold = 0; - std::atomic s3_execute_merges_on_single_replica_time_threshold = 0; + std::atomic remote_fs_execute_merges_on_single_replica_time_threshold = 0; std::atomic last_refresh_time = 0; std::mutex mutex; diff --git a/src/Storages/MergeTree/ReplicatedMergeTreeQueue.cpp b/src/Storages/MergeTree/ReplicatedMergeTreeQueue.cpp index bb4d0888c56..ef276a53df2 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreeQueue.cpp +++ b/src/Storages/MergeTree/ReplicatedMergeTreeQueue.cpp @@ -7,8 +7,14 @@ #include #include #include +#include +namespace CurrentMetrics +{ + extern const Metric BackgroundPoolTask; +} + namespace DB { @@ -26,6 +32,7 @@ ReplicatedMergeTreeQueue::ReplicatedMergeTreeQueue(StorageReplicatedMergeTree & , format_version(storage.format_version) , current_parts(format_version) , virtual_parts(format_version) + , drop_ranges(format_version) { zookeeper_path = storage.zookeeper_path; replica_path = storage.replica_path; @@ -52,8 +59,8 @@ void ReplicatedMergeTreeQueue::initialize(const MergeTreeData::DataParts & parts std::lock_guard lock(state_mutex); for (const auto & part : parts) { - current_parts.add(part->name, nullptr, log); - virtual_parts.add(part->name, nullptr, log); + current_parts.add(part->name, nullptr); + virtual_parts.add(part->name, nullptr); } } @@ -154,7 +161,7 @@ void ReplicatedMergeTreeQueue::insertUnlocked( { for (const String & virtual_part_name : entry->getVirtualPartNames(format_version)) { - virtual_parts.add(virtual_part_name, nullptr, log); + virtual_parts.add(virtual_part_name, nullptr); /// Don't add drop range parts to mutations /// they don't produce any useful parts if (entry->type != LogEntry::DROP_RANGE) @@ -168,6 +175,13 @@ void ReplicatedMergeTreeQueue::insertUnlocked( } else { + drop_ranges.addDropRange(entry); + + /// DROP PART remove parts, so we remove it from virtual parts to + /// preserve invariant virtual_parts = current_parts + queue + if (entry->isDropPart(format_version)) + virtual_parts.removePartAndCoveredParts(*entry->getDropRange(format_version)); + queue.push_front(entry); } @@ -248,7 +262,7 @@ void ReplicatedMergeTreeQueue::updateStateOnQueueEntryRemoval( for (const String & virtual_part_name : entry->getVirtualPartNames(format_version)) { - current_parts.add(virtual_part_name, nullptr, log); + current_parts.add(virtual_part_name, nullptr); /// These parts are already covered by newer part, we don't have to /// mutate it. @@ -257,8 +271,23 @@ void ReplicatedMergeTreeQueue::updateStateOnQueueEntryRemoval( if (auto drop_range_part_name = entry->getDropRange(format_version)) { - current_parts.remove(*drop_range_part_name); + MergeTreePartInfo drop_range_info = MergeTreePartInfo::fromPartName(*drop_range_part_name, format_version); + + /// DROP PART doesn't have virtual parts so remove from current + /// parts all covered parts. + if (entry->isDropPart(format_version)) + current_parts.removePartAndCoveredParts(*drop_range_part_name); + else + current_parts.remove(*drop_range_part_name); + virtual_parts.remove(*drop_range_part_name); + + removeCoveredPartsFromMutations(*drop_range_part_name, /*remove_part = */ true, /*remove_covered_parts = */ false); + } + + if (entry->type == LogEntry::DROP_RANGE) + { + drop_ranges.removeDropRange(entry); } if (entry->type == LogEntry::ALTER_METADATA) @@ -269,8 +298,16 @@ void ReplicatedMergeTreeQueue::updateStateOnQueueEntryRemoval( } else { + if (entry->type == LogEntry::DROP_RANGE) + { + drop_ranges.removeDropRange(entry); + } + for (const String & virtual_part_name : entry->getVirtualPartNames(format_version)) { + /// This part will never appear, so remove it from virtual parts + virtual_parts.remove(virtual_part_name); + /// Because execution of the entry is unsuccessful, /// `virtual_part_name` will never appear so we won't need to mutate /// it. @@ -860,7 +897,6 @@ bool ReplicatedMergeTreeQueue::checkReplaceRangeCanBeRemoved(const MergeTreePart if (entry_ptr->replace_range_entry == current.replace_range_entry) /// same partition, don't want to drop ourselves return false; - if (!part_info.contains(MergeTreePartInfo::fromPartName(entry_ptr->replace_range_entry->drop_range_part_name, format_version))) return false; @@ -976,8 +1012,29 @@ bool ReplicatedMergeTreeQueue::isNotCoveredByFuturePartsImpl(const String & log_ bool ReplicatedMergeTreeQueue::addFuturePartIfNotCoveredByThem(const String & part_name, LogEntry & entry, String & reject_reason) { + /// We have found `part_name` on some replica and are going to fetch it instead of covered `entry->new_part_name`. std::lock_guard lock(state_mutex); + if (virtual_parts.getContainingPart(part_name).empty()) + { + /// We should not fetch any parts that absent in our `virtual_parts` set, + /// because we do not know about such parts according to our replication queue (we know about them from some side-channel). + /// Otherwise, it may break invariants in replication queue reordering, for example: + /// 1. Our queue contains GET_PART all_2_2_0, log contains DROP_RANGE all_2_2_0 and MERGE_PARTS all_1_3_1 + /// 2. We execute GET_PART all_2_2_0, but fetch all_1_3_1 instead + /// (drop_ranges.isAffectedByDropRange(...) is false-negative, because DROP_RANGE all_2_2_0 is not pulled yet). + /// It actually means, that MERGE_PARTS all_1_3_1 is executed too, but it's not even pulled yet. + /// 3. Then we pull log, trying to execute DROP_RANGE all_2_2_0 + /// and reveal that it was incorrectly reordered with MERGE_PARTS all_1_3_1 (drop range intersects merged part). + reject_reason = fmt::format("Log entry for part {} or covering part is not pulled from log to queue yet.", part_name); + return false; + } + + /// FIXME get rid of actual_part_name. + /// If new covering part jumps over DROP_RANGE we should execute drop range first + if (drop_ranges.isAffectedByDropRange(part_name, reject_reason)) + return false; + if (isNotCoveredByFuturePartsImpl(entry.znode_name, part_name, reject_reason, lock)) { CurrentlyExecuting::setActualPartName(entry, part_name, *this); @@ -1003,6 +1060,9 @@ bool ReplicatedMergeTreeQueue::shouldExecuteLogEntry( return false; } + if (entry.type != LogEntry::DROP_RANGE && drop_ranges.isAffectedByDropRange(entry, out_postpone_reason)) + return false; + /// Check that fetches pool is not overloaded if ((entry.type == LogEntry::GET_PART || entry.type == LogEntry::ATTACH_PART) && !storage.canExecuteFetch(entry, out_postpone_reason)) @@ -1106,16 +1166,18 @@ bool ReplicatedMergeTreeQueue::shouldExecuteLogEntry( if (!ignore_max_size && sum_parts_size_in_bytes > max_source_parts_size) { - const char * format_str = "Not executing log entry {} of type {} for part {}" - " because source parts size ({}) is greater than the current maximum ({})."; + size_t busy_threads_in_pool = CurrentMetrics::values[CurrentMetrics::BackgroundPoolTask].load(std::memory_order_relaxed); + size_t thread_pool_size = data.getContext()->getSettingsRef().background_pool_size; + size_t free_threads = thread_pool_size - busy_threads_in_pool; + size_t required_threads = data_settings->number_of_free_entries_in_pool_to_execute_mutation; + out_postpone_reason = fmt::format("Not executing log entry {} of type {} for part {}" + " because source parts size ({}) is greater than the current maximum ({})." + " {} free of {} threads, required {} free threads.", + entry.znode_name, entry.typeToString(), entry.new_part_name, + ReadableSize(sum_parts_size_in_bytes), ReadableSize(max_source_parts_size), + free_threads, thread_pool_size, required_threads); - LOG_DEBUG(log, format_str, entry.znode_name, - entry.typeToString(), entry.new_part_name, - ReadableSize(sum_parts_size_in_bytes), ReadableSize(max_source_parts_size)); - - out_postpone_reason = fmt::format(format_str, entry.znode_name, - entry.typeToString(), entry.new_part_name, - ReadableSize(sum_parts_size_in_bytes), ReadableSize(max_source_parts_size)); + LOG_DEBUG(log, out_postpone_reason); return false; } @@ -2074,6 +2136,12 @@ bool ReplicatedMergeTreeMergePredicate::isMutationFinished(const ReplicatedMerge return true; } +bool ReplicatedMergeTreeMergePredicate::hasDropRange(const MergeTreePartInfo & new_drop_range_info) const +{ + std::lock_guard lock(queue.state_mutex); + return queue.drop_ranges.hasDropRange(new_drop_range_info); +} + ReplicatedMergeTreeQueue::SubscriberHandler ReplicatedMergeTreeQueue::addSubscriber(ReplicatedMergeTreeQueue::SubscriberCallBack && callback) diff --git a/src/Storages/MergeTree/ReplicatedMergeTreeQueue.h b/src/Storages/MergeTree/ReplicatedMergeTreeQueue.h index 820d2794a31..e49d80fc832 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreeQueue.h +++ b/src/Storages/MergeTree/ReplicatedMergeTreeQueue.h @@ -11,6 +11,7 @@ #include #include #include +#include #include @@ -100,6 +101,10 @@ private: */ ActiveDataPartSet virtual_parts; + + /// Dropped ranges inserted into queue + DropPartsRanges drop_ranges; + /// A set of mutations loaded from ZooKeeper. /// mutations_by_partition is an index partition ID -> block ID -> mutation into this set. /// Note that mutations are updated in such a way that they are always more recent than @@ -475,6 +480,8 @@ public: /// The version of "log" node that is used to check that no new merges have appeared. int32_t getVersion() const { return merges_version; } + bool hasDropRange(const MergeTreePartInfo & new_drop_range_info) const; + private: const ReplicatedMergeTreeQueue & queue; diff --git a/src/Storages/MergeTree/ReplicatedMergeTreeRestartingThread.cpp b/src/Storages/MergeTree/ReplicatedMergeTreeRestartingThread.cpp index 1c9921aad1d..25f25480549 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreeRestartingThread.cpp +++ b/src/Storages/MergeTree/ReplicatedMergeTreeRestartingThread.cpp @@ -90,6 +90,8 @@ void ReplicatedMergeTreeRestartingThread::run() /// The exception when you try to zookeeper_init usually happens if DNS does not work. We will try to do it again. tryLogCurrentException(log, __PRETTY_FUNCTION__); + /// Here we're almost sure the table is already readonly, but it doesn't hurt to enforce it. + setReadonly(); if (first_time) storage.startup_event.set(); task->scheduleAfter(retry_period_ms); diff --git a/src/Storages/MergeTree/ReplicatedMergeTreeBlockOutputStream.cpp b/src/Storages/MergeTree/ReplicatedMergeTreeSink.cpp similarity index 97% rename from src/Storages/MergeTree/ReplicatedMergeTreeBlockOutputStream.cpp rename to src/Storages/MergeTree/ReplicatedMergeTreeSink.cpp index 4a73658e8a4..c81f587cbbc 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreeBlockOutputStream.cpp +++ b/src/Storages/MergeTree/ReplicatedMergeTreeSink.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include #include #include #include @@ -33,7 +33,7 @@ namespace ErrorCodes } -ReplicatedMergeTreeBlockOutputStream::ReplicatedMergeTreeBlockOutputStream( +ReplicatedMergeTreeSink::ReplicatedMergeTreeSink( StorageReplicatedMergeTree & storage_, const StorageMetadataPtr & metadata_snapshot_, size_t quorum_, @@ -43,7 +43,8 @@ ReplicatedMergeTreeBlockOutputStream::ReplicatedMergeTreeBlockOutputStream( bool deduplicate_, ContextPtr context_, bool is_attach_) - : storage(storage_) + : SinkToStorage(metadata_snapshot_->getSampleBlock()) + , storage(storage_) , metadata_snapshot(metadata_snapshot_) , quorum(quorum_) , quorum_timeout_ms(quorum_timeout_ms_) @@ -60,12 +61,6 @@ ReplicatedMergeTreeBlockOutputStream::ReplicatedMergeTreeBlockOutputStream( } -Block ReplicatedMergeTreeBlockOutputStream::getHeader() const -{ - return metadata_snapshot->getSampleBlock(); -} - - /// Allow to verify that the session in ZooKeeper is still alive. static void assertSessionIsNotExpired(zkutil::ZooKeeperPtr & zookeeper) { @@ -77,7 +72,7 @@ static void assertSessionIsNotExpired(zkutil::ZooKeeperPtr & zookeeper) } -void ReplicatedMergeTreeBlockOutputStream::checkQuorumPrecondition(zkutil::ZooKeeperPtr & zookeeper) +void ReplicatedMergeTreeSink::checkQuorumPrecondition(zkutil::ZooKeeperPtr & zookeeper) { quorum_info.status_path = storage.zookeeper_path + "/quorum/status"; @@ -121,8 +116,10 @@ void ReplicatedMergeTreeBlockOutputStream::checkQuorumPrecondition(zkutil::ZooKe } -void ReplicatedMergeTreeBlockOutputStream::write(const Block & block) +void ReplicatedMergeTreeSink::consume(Chunk chunk) { + auto block = getPort().getHeader().cloneWithColumns(chunk.detachColumns()); + last_block_is_duplicate = false; auto zookeeper = storage.getZooKeeper(); @@ -183,7 +180,7 @@ void ReplicatedMergeTreeBlockOutputStream::write(const Block & block) } -void ReplicatedMergeTreeBlockOutputStream::writeExistingPart(MergeTreeData::MutableDataPartPtr & part) +void ReplicatedMergeTreeSink::writeExistingPart(MergeTreeData::MutableDataPartPtr & part) { last_block_is_duplicate = false; @@ -210,7 +207,7 @@ void ReplicatedMergeTreeBlockOutputStream::writeExistingPart(MergeTreeData::Muta } -void ReplicatedMergeTreeBlockOutputStream::commitPart( +void ReplicatedMergeTreeSink::commitPart( zkutil::ZooKeeperPtr & zookeeper, MergeTreeData::MutableDataPartPtr & part, const String & block_id) { metadata_snapshot->check(part->getColumns()); @@ -507,7 +504,7 @@ void ReplicatedMergeTreeBlockOutputStream::commitPart( } } -void ReplicatedMergeTreeBlockOutputStream::writePrefix() +void ReplicatedMergeTreeSink::onStart() { /// Only check "too many parts" before write, /// because interrupting long-running INSERT query in the middle is not convenient for users. @@ -515,7 +512,7 @@ void ReplicatedMergeTreeBlockOutputStream::writePrefix() } -void ReplicatedMergeTreeBlockOutputStream::waitForQuorum( +void ReplicatedMergeTreeSink::waitForQuorum( zkutil::ZooKeeperPtr & zookeeper, const std::string & part_name, const std::string & quorum_path, diff --git a/src/Storages/MergeTree/ReplicatedMergeTreeBlockOutputStream.h b/src/Storages/MergeTree/ReplicatedMergeTreeSink.h similarity index 88% rename from src/Storages/MergeTree/ReplicatedMergeTreeBlockOutputStream.h rename to src/Storages/MergeTree/ReplicatedMergeTreeSink.h index a3fce65a840..2a6702736df 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreeBlockOutputStream.h +++ b/src/Storages/MergeTree/ReplicatedMergeTreeSink.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include @@ -19,10 +19,10 @@ namespace DB class StorageReplicatedMergeTree; -class ReplicatedMergeTreeBlockOutputStream : public IBlockOutputStream +class ReplicatedMergeTreeSink : public SinkToStorage { public: - ReplicatedMergeTreeBlockOutputStream( + ReplicatedMergeTreeSink( StorageReplicatedMergeTree & storage_, const StorageMetadataPtr & metadata_snapshot_, size_t quorum_, @@ -35,9 +35,10 @@ public: // needed to set the special LogEntryType::ATTACH_PART bool is_attach_ = false); - Block getHeader() const override; - void writePrefix() override; - void write(const Block & block) override; + void onStart() override; + void consume(Chunk chunk) override; + + String getName() const override { return "ReplicatedMergeTreeSink"; } /// For ATTACHing existing data on filesystem. void writeExistingPart(MergeTreeData::MutableDataPartPtr & part); diff --git a/src/Storages/MergeTree/StorageFromBasePartsOfProjection.h b/src/Storages/MergeTree/StorageFromBasePartsOfProjection.h deleted file mode 100644 index 5d82716af11..00000000000 --- a/src/Storages/MergeTree/StorageFromBasePartsOfProjection.h +++ /dev/null @@ -1,75 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - - -namespace DB -{ -/// A Storage that allows reading from a single MergeTree data part. -class StorageFromBasePartsOfProjection final : public shared_ptr_helper, public IStorage -{ - friend struct shared_ptr_helper; - -public: - String getName() const override { return "FromBasePartsOfProjection"; } - - Pipe read( - const Names & column_names, - const StorageMetadataPtr & metadata_snapshot, - SelectQueryInfo & query_info, - ContextPtr context, - QueryProcessingStage::Enum /*processed_stage*/, - size_t max_block_size, - unsigned num_streams) override - { - // NOTE: It's used to read normal parts only - QueryPlan query_plan = std::move(*MergeTreeDataSelectExecutor(storage).readFromParts( - {}, - column_names, - metadata_snapshot, - metadata_snapshot, - query_info, - context, - max_block_size, - num_streams, - nullptr, - query_info.projection ? query_info.projection->merge_tree_data_select_base_cache.get() - : query_info.merge_tree_data_select_cache.get())); - - return query_plan.convertToPipe( - QueryPlanOptimizationSettings::fromContext(context), BuildQueryPipelineSettings::fromContext(context)); - } - - - bool supportsIndexForIn() const override { return true; } - - bool mayBenefitFromIndexForIn( - const ASTPtr & left_in_operand, ContextPtr query_context, const StorageMetadataPtr & metadata_snapshot) const override - { - return storage.mayBenefitFromIndexForIn(left_in_operand, query_context, metadata_snapshot); - } - - NamesAndTypesList getVirtuals() const override { return storage.getVirtuals(); } - -protected: - StorageFromBasePartsOfProjection(const MergeTreeData & storage_, const StorageMetadataPtr & metadata_snapshot) - : IStorage(storage_.getStorageID()), storage(storage_) - { - setInMemoryMetadata(*metadata_snapshot); - } - - -private: - const MergeTreeData & storage; -}; - -} diff --git a/src/Storages/MergeTree/StorageFromMergeTreeDataPart.h b/src/Storages/MergeTree/StorageFromMergeTreeDataPart.h index 9cc2787697d..15beb94404b 100644 --- a/src/Storages/MergeTree/StorageFromMergeTreeDataPart.h +++ b/src/Storages/MergeTree/StorageFromMergeTreeDataPart.h @@ -47,6 +47,7 @@ public: QueryPlanOptimizationSettings::fromContext(context), BuildQueryPipelineSettings::fromContext(context)); } + bool supportsPrewhere() const override { return true; } bool supportsIndexForIn() const override { return true; } diff --git a/src/Storages/MergeTree/TTLMergeSelector.cpp b/src/Storages/MergeTree/TTLMergeSelector.cpp index fc7aa93e129..6a42ce039ac 100644 --- a/src/Storages/MergeTree/TTLMergeSelector.cpp +++ b/src/Storages/MergeTree/TTLMergeSelector.cpp @@ -111,6 +111,10 @@ bool TTLDeleteMergeSelector::isTTLAlreadySatisfied(const IMergeSelector::Part & if (only_drop_parts) return false; + /// All TTL satisfied + if (!part.ttl_infos->hasAnyNonFinishedTTLs()) + return true; + return !part.shall_participate_in_merges; } diff --git a/src/Storages/MergeTree/registerStorageMergeTree.cpp b/src/Storages/MergeTree/registerStorageMergeTree.cpp index 539f7713320..910492d2467 100644 --- a/src/Storages/MergeTree/registerStorageMergeTree.cpp +++ b/src/Storages/MergeTree/registerStorageMergeTree.cpp @@ -480,7 +480,10 @@ static StoragePtr create(const StorageFactory::Arguments & args) "No replica name in config" + getMergeTreeVerboseHelp(is_extended_storage_def), ErrorCodes::NO_REPLICA_NAME_GIVEN); ++arg_num; } - else if (is_extended_storage_def && (arg_cnt == 0 || !engine_args[arg_num]->as() || (arg_cnt == 1 && merging_params.mode == MergeTreeData::MergingParams::Graphite))) + else if (is_extended_storage_def + && (arg_cnt == 0 + || !engine_args[arg_num]->as() + || (arg_cnt == 1 && merging_params.mode == MergeTreeData::MergingParams::Graphite))) { /// Try use default values if arguments are not specified. /// Note: {uuid} macro works for ON CLUSTER queries when database engine is Atomic. diff --git a/src/Storages/PostgreSQL/PostgreSQLReplicationHandler.cpp b/src/Storages/PostgreSQL/PostgreSQLReplicationHandler.cpp index 4c614d8fd5a..3477397adb7 100644 --- a/src/Storages/PostgreSQL/PostgreSQLReplicationHandler.cpp +++ b/src/Storages/PostgreSQL/PostgreSQLReplicationHandler.cpp @@ -1,6 +1,8 @@ #include "PostgreSQLReplicationHandler.h" -#include +#include +#include +#include #include #include #include @@ -226,9 +228,17 @@ StoragePtr PostgreSQLReplicationHandler::loadFromSnapshot(String & snapshot_name const StorageInMemoryMetadata & storage_metadata = nested_storage->getInMemoryMetadata(); auto sample_block = storage_metadata.getSampleBlockNonMaterialized(); - PostgreSQLTransactionBlockInputStream input(tx, query_str, sample_block, DEFAULT_BLOCK_SIZE); - assertBlocksHaveEqualStructure(input.getHeader(), block_io.out->getHeader(), "postgresql replica load from snapshot"); - copyData(input, *block_io.out); + auto input = std::make_unique>(tx, query_str, sample_block, DEFAULT_BLOCK_SIZE); + QueryPipeline pipeline; + pipeline.init(Pipe(std::move(input))); + assertBlocksHaveEqualStructure(pipeline.getHeader(), block_io.out->getHeader(), "postgresql replica load from snapshot"); + + PullingPipelineExecutor executor(pipeline); + Block block; + block_io.out->writePrefix(); + while (executor.pull(block)) + block_io.out->write(block); + block_io.out->writeSuffix(); nested_storage = materialized_storage->prepare(); auto nested_table_id = nested_storage->getStorageID(); @@ -479,7 +489,7 @@ NameSet PostgreSQLReplicationHandler::fetchRequiredTables(postgres::Connection & "Publication {} already exists and tables list is empty. Assuming publication is correct.", publication_name); - result_tables = fetchPostgreSQLTablesList(tx); + result_tables = fetchPostgreSQLTablesList(tx, postgres_schema); } /// Check tables list from publication is the same as expected tables list. /// If not - drop publication and return expected tables list. @@ -521,7 +531,7 @@ NameSet PostgreSQLReplicationHandler::fetchRequiredTables(postgres::Connection & /// Fetch all tables list from database. Publication does not exist yet, which means /// that no replication took place. Publication will be created in /// startSynchronization method. - result_tables = fetchPostgreSQLTablesList(tx); + result_tables = fetchPostgreSQLTablesList(tx, postgres_schema); } } diff --git a/src/Storages/PostgreSQL/PostgreSQLReplicationHandler.h b/src/Storages/PostgreSQL/PostgreSQLReplicationHandler.h index 95ac12b3786..3a0bedc0852 100644 --- a/src/Storages/PostgreSQL/PostgreSQLReplicationHandler.h +++ b/src/Storages/PostgreSQL/PostgreSQLReplicationHandler.h @@ -124,6 +124,8 @@ private: MaterializedStorages materialized_storages; UInt64 milliseconds_to_wait; + + String postgres_schema; }; } diff --git a/src/Storages/PostgreSQL/StorageMaterializedPostgreSQL.cpp b/src/Storages/PostgreSQL/StorageMaterializedPostgreSQL.cpp index 78f7fefd5dc..e24e252bf01 100644 --- a/src/Storages/PostgreSQL/StorageMaterializedPostgreSQL.cpp +++ b/src/Storages/PostgreSQL/StorageMaterializedPostgreSQL.cpp @@ -226,7 +226,7 @@ void StorageMaterializedPostgreSQL::shutdown() { if (replication_handler) replication_handler->shutdown(); - auto nested = getNested(); + auto nested = tryGetNested(); if (nested) nested->shutdown(); } @@ -256,6 +256,12 @@ NamesAndTypesList StorageMaterializedPostgreSQL::getVirtuals() const } +bool StorageMaterializedPostgreSQL::needRewriteQueryWithFinal(const Names & column_names) const +{ + return needRewriteQueryWithFinalForStorage(column_names, getNested()); +} + + Pipe StorageMaterializedPostgreSQL::read( const Names & column_names, const StorageMetadataPtr & metadata_snapshot, @@ -327,6 +333,16 @@ ASTPtr StorageMaterializedPostgreSQL::getColumnDeclaration(const DataTypePtr & d return make_decimal_expression("Decimal256"); } + if (which.isDateTime64()) + { + auto ast_expression = std::make_shared(); + + ast_expression->name = "DateTime64"; + ast_expression->arguments = std::make_shared(); + ast_expression->arguments->children.emplace_back(std::make_shared(UInt32(6))); + return ast_expression; + } + return std::make_shared(data_type->getName()); } diff --git a/src/Storages/PostgreSQL/StorageMaterializedPostgreSQL.h b/src/Storages/PostgreSQL/StorageMaterializedPostgreSQL.h index 5d18a0b16b7..becb4f6ba10 100644 --- a/src/Storages/PostgreSQL/StorageMaterializedPostgreSQL.h +++ b/src/Storages/PostgreSQL/StorageMaterializedPostgreSQL.h @@ -82,6 +82,8 @@ public: NamesAndTypesList getVirtuals() const override; + bool needRewriteQueryWithFinal(const Names & column_names) const override; + Pipe read( const Names & column_names, const StorageMetadataPtr & metadata_snapshot, @@ -119,6 +121,8 @@ public: /// for current table, set has_nested = true. StoragePtr prepare(); + bool supportsFinal() const override { return true; } + protected: StorageMaterializedPostgreSQL( const StorageID & table_id_, diff --git a/src/Storages/RabbitMQ/RabbitMQBlockOutputStream.h b/src/Storages/RabbitMQ/RabbitMQBlockOutputStream.h deleted file mode 100644 index 3941875ea86..00000000000 --- a/src/Storages/RabbitMQ/RabbitMQBlockOutputStream.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include -#include - - -namespace DB -{ - -class RabbitMQBlockOutputStream : public IBlockOutputStream -{ - -public: - explicit RabbitMQBlockOutputStream(StorageRabbitMQ & storage_, const StorageMetadataPtr & metadata_snapshot_, ContextPtr context_); - - Block getHeader() const override; - - void writePrefix() override; - void write(const Block & block) override; - void writeSuffix() override; - -private: - StorageRabbitMQ & storage; - StorageMetadataPtr metadata_snapshot; - ContextPtr context; - ProducerBufferPtr buffer; - BlockOutputStreamPtr child; -}; -} diff --git a/src/Storages/RabbitMQ/RabbitMQHandler.cpp b/src/Storages/RabbitMQ/RabbitMQHandler.cpp index c994ab22494..85d8063a73f 100644 --- a/src/Storages/RabbitMQ/RabbitMQHandler.cpp +++ b/src/Storages/RabbitMQ/RabbitMQHandler.cpp @@ -57,11 +57,13 @@ void RabbitMQHandler::iterateLoop() /// initial RabbitMQ setup - at this point there is no background loop thread. void RabbitMQHandler::startBlockingLoop() { + LOG_DEBUG(log, "Started blocking loop."); uv_run(loop, UV_RUN_DEFAULT); } void RabbitMQHandler::stopLoop() { + LOG_DEBUG(log, "Implicit loop stop."); uv_stop(loop); } diff --git a/src/Storages/RabbitMQ/RabbitMQBlockOutputStream.cpp b/src/Storages/RabbitMQ/RabbitMQSink.cpp similarity index 68% rename from src/Storages/RabbitMQ/RabbitMQBlockOutputStream.cpp rename to src/Storages/RabbitMQ/RabbitMQSink.cpp index 3c837cb95b1..9c556ee0832 100644 --- a/src/Storages/RabbitMQ/RabbitMQBlockOutputStream.cpp +++ b/src/Storages/RabbitMQ/RabbitMQSink.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -8,24 +8,19 @@ namespace DB { -RabbitMQBlockOutputStream::RabbitMQBlockOutputStream( +RabbitMQSink::RabbitMQSink( StorageRabbitMQ & storage_, const StorageMetadataPtr & metadata_snapshot_, ContextPtr context_) - : storage(storage_) + : SinkToStorage(metadata_snapshot_->getSampleBlockNonMaterialized()) + , storage(storage_) , metadata_snapshot(metadata_snapshot_) , context(context_) { } -Block RabbitMQBlockOutputStream::getHeader() const -{ - return metadata_snapshot->getSampleBlockNonMaterialized(); -} - - -void RabbitMQBlockOutputStream::writePrefix() +void RabbitMQSink::onStart() { if (!storage.exchangeRemoved()) storage.unbindExchange(); @@ -37,7 +32,7 @@ void RabbitMQBlockOutputStream::writePrefix() format_settings.protobuf.allow_multiple_rows_without_delimiter = true; child = FormatFactory::instance().getOutputStream(storage.getFormatName(), *buffer, - getHeader(), context, + getPort().getHeader(), context, [this](const Columns & /* columns */, size_t /* rows */) { buffer->countRow(); @@ -46,13 +41,13 @@ void RabbitMQBlockOutputStream::writePrefix() } -void RabbitMQBlockOutputStream::write(const Block & block) +void RabbitMQSink::consume(Chunk chunk) { - child->write(block); + child->write(getPort().getHeader().cloneWithColumns(chunk.detachColumns())); } -void RabbitMQBlockOutputStream::writeSuffix() +void RabbitMQSink::onFinish() { child->writeSuffix(); diff --git a/src/Storages/RabbitMQ/RabbitMQSink.h b/src/Storages/RabbitMQ/RabbitMQSink.h new file mode 100644 index 00000000000..6222ccdf2ac --- /dev/null +++ b/src/Storages/RabbitMQ/RabbitMQSink.h @@ -0,0 +1,29 @@ +#pragma once + +#include +#include + + +namespace DB +{ + +class RabbitMQSink : public SinkToStorage +{ + +public: + explicit RabbitMQSink(StorageRabbitMQ & storage_, const StorageMetadataPtr & metadata_snapshot_, ContextPtr context_); + + void onStart() override; + void consume(Chunk chunk) override; + void onFinish() override; + + String getName() const override { return "RabbitMQSink"; } + +private: + StorageRabbitMQ & storage; + StorageMetadataPtr metadata_snapshot; + ContextPtr context; + ProducerBufferPtr buffer; + BlockOutputStreamPtr child; +}; +} diff --git a/src/Storages/RabbitMQ/ReadBufferFromRabbitMQConsumer.h b/src/Storages/RabbitMQ/ReadBufferFromRabbitMQConsumer.h index 1a06c5ebf60..ccc8e56db5e 100644 --- a/src/Storages/RabbitMQ/ReadBufferFromRabbitMQConsumer.h +++ b/src/Storages/RabbitMQ/ReadBufferFromRabbitMQConsumer.h @@ -56,7 +56,11 @@ public: ChannelPtr & getChannel() { return consumer_channel; } void setupChannel(); bool needChannelUpdate(); - void closeChannel() { consumer_channel->close(); } + void closeChannel() + { + if (consumer_channel) + consumer_channel->close(); + } void updateQueues(std::vector & queues_) { queues = queues_; } size_t queuesCount() { return queues.size(); } diff --git a/src/Storages/RabbitMQ/StorageRabbitMQ.cpp b/src/Storages/RabbitMQ/StorageRabbitMQ.cpp index 369f4e9eca9..44622f106f4 100644 --- a/src/Storages/RabbitMQ/StorageRabbitMQ.cpp +++ b/src/Storages/RabbitMQ/StorageRabbitMQ.cpp @@ -1,5 +1,4 @@ #include -#include #include #include #include @@ -15,7 +14,7 @@ #include #include #include -#include +#include #include #include #include @@ -265,6 +264,9 @@ size_t StorageRabbitMQ::getMaxBlockSize() const void StorageRabbitMQ::initRabbitMQ() { + if (stream_cancelled) + return; + if (use_user_setup) { queues.emplace_back(queue_base); @@ -642,9 +644,9 @@ Pipe StorageRabbitMQ::read( } -BlockOutputStreamPtr StorageRabbitMQ::write(const ASTPtr &, const StorageMetadataPtr & metadata_snapshot, ContextPtr local_context) +SinkToStoragePtr StorageRabbitMQ::write(const ASTPtr &, const StorageMetadataPtr & metadata_snapshot, ContextPtr local_context) { - return std::make_shared(*this, metadata_snapshot, local_context); + return std::make_shared(*this, metadata_snapshot, local_context); } @@ -704,10 +706,6 @@ void StorageRabbitMQ::shutdown() while (!connection->closed() && cnt_retries++ != RETRIES_MAX) event_handler->iterateLoop(); - /// Should actually force closure, if not yet closed, but it generates distracting error logs - //if (!connection->closed()) - // connection->close(true); - for (size_t i = 0; i < num_created_consumers; ++i) popReadBuffer(); } @@ -720,6 +718,22 @@ void StorageRabbitMQ::cleanupRabbitMQ() const if (use_user_setup) return; + if (!event_handler->connectionRunning()) + { + String queue_names; + for (const auto & queue : queues) + { + if (!queue_names.empty()) + queue_names += ", "; + queue_names += queue; + } + LOG_WARNING(log, + "RabbitMQ clean up not done, because there is no connection in table's shutdown." + "There are {} queues ({}), which might need to be deleted manually. Exchanges will be auto-deleted", + queues.size(), queue_names); + return; + } + AMQP::TcpChannel rabbit_channel(connection.get()); for (const auto & queue : queues) { diff --git a/src/Storages/RabbitMQ/StorageRabbitMQ.h b/src/Storages/RabbitMQ/StorageRabbitMQ.h index 1935dcaee0e..1a2445f3690 100644 --- a/src/Storages/RabbitMQ/StorageRabbitMQ.h +++ b/src/Storages/RabbitMQ/StorageRabbitMQ.h @@ -50,7 +50,7 @@ public: size_t max_block_size, unsigned num_streams) override; - BlockOutputStreamPtr write( + SinkToStoragePtr write( const ASTPtr & query, const StorageMetadataPtr & metadata_snapshot, ContextPtr context) override; diff --git a/src/Storages/ReadFinalForExternalReplicaStorage.cpp b/src/Storages/ReadFinalForExternalReplicaStorage.cpp index fb96bb01936..36a40beca36 100644 --- a/src/Storages/ReadFinalForExternalReplicaStorage.cpp +++ b/src/Storages/ReadFinalForExternalReplicaStorage.cpp @@ -16,6 +16,14 @@ namespace DB { +bool needRewriteQueryWithFinalForStorage(const Names & column_names, const StoragePtr & storage) +{ + const StorageMetadataPtr & metadata = storage->getInMemoryMetadataPtr(); + Block header = metadata->getSampleBlock(); + ColumnWithTypeAndName & version_column = header.getByPosition(header.columns() - 1); + return std::find(column_names.begin(), column_names.end(), version_column.name) == column_names.end(); +} + Pipe readFinalFromNestedStorage( StoragePtr nested_storage, const Names & column_names, @@ -32,20 +40,6 @@ Pipe readFinalFromNestedStorage( Block nested_header = nested_metadata->getSampleBlock(); ColumnWithTypeAndName & sign_column = nested_header.getByPosition(nested_header.columns() - 2); - ColumnWithTypeAndName & version_column = nested_header.getByPosition(nested_header.columns() - 1); - - if (ASTSelectQuery * select_query = query_info.query->as(); select_query && !column_names_set.count(version_column.name)) - { - auto & tables_in_select_query = select_query->tables()->as(); - - if (!tables_in_select_query.children.empty()) - { - auto & tables_element = tables_in_select_query.children[0]->as(); - - if (tables_element.table_expression) - tables_element.table_expression->as().final = true; - } - } String filter_column_name; Names require_columns_name = column_names; @@ -59,9 +53,6 @@ Pipe readFinalFromNestedStorage( expressions->children.emplace_back(makeASTFunction("equals", sign_column_name, fetch_sign_value)); filter_column_name = expressions->children.back()->getColumnName(); - - for (const auto & column_name : column_names) - expressions->children.emplace_back(std::make_shared(column_name)); } Pipe pipe = nested_storage->read(require_columns_name, nested_metadata, query_info, context, processed_stage, max_block_size, num_streams); diff --git a/src/Storages/ReadFinalForExternalReplicaStorage.h b/src/Storages/ReadFinalForExternalReplicaStorage.h index b54592159ef..f09a115919d 100644 --- a/src/Storages/ReadFinalForExternalReplicaStorage.h +++ b/src/Storages/ReadFinalForExternalReplicaStorage.h @@ -13,6 +13,8 @@ namespace DB { +bool needRewriteQueryWithFinalForStorage(const Names & column_names, const StoragePtr & storage); + Pipe readFinalFromNestedStorage( StoragePtr nested_storage, const Names & column_names, diff --git a/src/Storages/ReadInOrderOptimizer.cpp b/src/Storages/ReadInOrderOptimizer.cpp index 87273330b34..912d284bfc0 100644 --- a/src/Storages/ReadInOrderOptimizer.cpp +++ b/src/Storages/ReadInOrderOptimizer.cpp @@ -37,7 +37,7 @@ ReadInOrderOptimizer::ReadInOrderOptimizer( array_join_result_to_source = syntax_result->array_join_result_to_source; } -InputOrderInfoPtr ReadInOrderOptimizer::getInputOrder(const StorageMetadataPtr & metadata_snapshot, ContextPtr context) const +InputOrderInfoPtr ReadInOrderOptimizer::getInputOrder(const StorageMetadataPtr & metadata_snapshot, ContextPtr context, UInt64 limit) const { Names sorting_key_columns = metadata_snapshot->getSortingKeyColumns(); if (!metadata_snapshot->hasSortingKey()) @@ -155,7 +155,8 @@ InputOrderInfoPtr ReadInOrderOptimizer::getInputOrder(const StorageMetadataPtr & if (order_key_prefix_descr.empty()) return {}; - return std::make_shared(std::move(order_key_prefix_descr), read_direction); + + return std::make_shared(std::move(order_key_prefix_descr), read_direction, limit); } } diff --git a/src/Storages/ReadInOrderOptimizer.h b/src/Storages/ReadInOrderOptimizer.h index 0abf2923a98..2686d081855 100644 --- a/src/Storages/ReadInOrderOptimizer.h +++ b/src/Storages/ReadInOrderOptimizer.h @@ -22,7 +22,7 @@ public: const SortDescription & required_sort_description, const TreeRewriterResultPtr & syntax_result); - InputOrderInfoPtr getInputOrder(const StorageMetadataPtr & metadata_snapshot, ContextPtr context) const; + InputOrderInfoPtr getInputOrder(const StorageMetadataPtr & metadata_snapshot, ContextPtr context, UInt64 limit = 0) const; private: /// Actions for every element of order expression to analyze functions for monotonicity diff --git a/src/Storages/RocksDB/EmbeddedRocksDBBlockOutputStream.cpp b/src/Storages/RocksDB/EmbeddedRocksDBSink.cpp similarity index 71% rename from src/Storages/RocksDB/EmbeddedRocksDBBlockOutputStream.cpp rename to src/Storages/RocksDB/EmbeddedRocksDBSink.cpp index d7b125cb41f..ddf839b6427 100644 --- a/src/Storages/RocksDB/EmbeddedRocksDBBlockOutputStream.cpp +++ b/src/Storages/RocksDB/EmbeddedRocksDBSink.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include @@ -13,14 +13,14 @@ namespace ErrorCodes extern const int ROCKSDB_ERROR; } -EmbeddedRocksDBBlockOutputStream::EmbeddedRocksDBBlockOutputStream( +EmbeddedRocksDBSink::EmbeddedRocksDBSink( StorageEmbeddedRocksDB & storage_, const StorageMetadataPtr & metadata_snapshot_) - : storage(storage_) + : SinkToStorage(metadata_snapshot_->getSampleBlock()) + , storage(storage_) , metadata_snapshot(metadata_snapshot_) { - Block sample_block = metadata_snapshot->getSampleBlock(); - for (const auto & elem : sample_block) + for (const auto & elem : getPort().getHeader()) { if (elem.name == storage.primary_key) break; @@ -28,15 +28,10 @@ EmbeddedRocksDBBlockOutputStream::EmbeddedRocksDBBlockOutputStream( } } -Block EmbeddedRocksDBBlockOutputStream::getHeader() const +void EmbeddedRocksDBSink::consume(Chunk chunk) { - return metadata_snapshot->getSampleBlock(); -} - -void EmbeddedRocksDBBlockOutputStream::write(const Block & block) -{ - metadata_snapshot->check(block, true); - auto rows = block.rows(); + auto rows = chunk.getNumRows(); + auto block = getPort().getHeader().cloneWithColumns(chunk.detachColumns()); WriteBufferFromOwnString wb_key; WriteBufferFromOwnString wb_value; diff --git a/src/Storages/RocksDB/EmbeddedRocksDBBlockOutputStream.h b/src/Storages/RocksDB/EmbeddedRocksDBSink.h similarity index 63% rename from src/Storages/RocksDB/EmbeddedRocksDBBlockOutputStream.h rename to src/Storages/RocksDB/EmbeddedRocksDBSink.h index e6229782505..e9e98c7df50 100644 --- a/src/Storages/RocksDB/EmbeddedRocksDBBlockOutputStream.h +++ b/src/Storages/RocksDB/EmbeddedRocksDBSink.h @@ -1,6 +1,6 @@ #pragma once -#include +#include namespace DB @@ -10,15 +10,15 @@ class StorageEmbeddedRocksDB; struct StorageInMemoryMetadata; using StorageMetadataPtr = std::shared_ptr; -class EmbeddedRocksDBBlockOutputStream : public IBlockOutputStream +class EmbeddedRocksDBSink : public SinkToStorage { public: - EmbeddedRocksDBBlockOutputStream( + EmbeddedRocksDBSink( StorageEmbeddedRocksDB & storage_, const StorageMetadataPtr & metadata_snapshot_); - Block getHeader() const override; - void write(const Block & block) override; + void consume(Chunk chunk) override; + String getName() const override { return "EmbeddedRocksDBSink"; } private: StorageEmbeddedRocksDB & storage; diff --git a/src/Storages/RocksDB/StorageEmbeddedRocksDB.cpp b/src/Storages/RocksDB/StorageEmbeddedRocksDB.cpp index 70cc173e38a..459c0879cda 100644 --- a/src/Storages/RocksDB/StorageEmbeddedRocksDB.cpp +++ b/src/Storages/RocksDB/StorageEmbeddedRocksDB.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include @@ -28,10 +28,12 @@ #include #include +#include #include #include #include +#include #include @@ -49,6 +51,24 @@ namespace ErrorCodes } using FieldVectorPtr = std::shared_ptr; +using RocksDBOptions = std::unordered_map; + + +static RocksDBOptions getOptionsFromConfig(const Poco::Util::AbstractConfiguration & config, const std::string & path) +{ + RocksDBOptions options; + + Poco::Util::AbstractConfiguration::Keys keys; + config.keys(path, keys); + + for (const auto & key : keys) + { + const String key_path = path + "." + key; + options[key] = config.getString(key_path); + } + + return options; +} // returns keys may be filter by condition @@ -250,7 +270,9 @@ StorageEmbeddedRocksDB::StorageEmbeddedRocksDB(const StorageID & table_id_, bool attach, ContextPtr context_, const String & primary_key_) - : IStorage(table_id_), primary_key{primary_key_} + : IStorage(table_id_) + , WithContext(context_->getGlobalContext()) + , primary_key{primary_key_} { setInMemoryMetadata(metadata_); rocksdb_dir = context_->getPath() + relative_data_path_; @@ -271,14 +293,86 @@ void StorageEmbeddedRocksDB::truncate(const ASTPtr &, const StorageMetadataPtr & void StorageEmbeddedRocksDB::initDb() { - rocksdb::Options options; + rocksdb::Status status; + rocksdb::Options base; rocksdb::DB * db; - options.create_if_missing = true; - options.compression = rocksdb::CompressionType::kZSTD; - rocksdb::Status status = rocksdb::DB::Open(options, rocksdb_dir, &db); - if (status != rocksdb::Status::OK()) - throw Exception("Fail to open rocksdb path at: " + rocksdb_dir + ": " + status.ToString(), ErrorCodes::ROCKSDB_ERROR); + base.create_if_missing = true; + base.compression = rocksdb::CompressionType::kZSTD; + base.statistics = rocksdb::CreateDBStatistics(); + /// It is too verbose by default, and in fact we don't care about rocksdb logs at all. + base.info_log_level = rocksdb::ERROR_LEVEL; + + rocksdb::Options merged = base; + + const auto & config = getContext()->getConfigRef(); + if (config.has("rocksdb.options")) + { + auto config_options = getOptionsFromConfig(config, "rocksdb.options"); + status = rocksdb::GetDBOptionsFromMap(merged, config_options, &merged); + if (!status.ok()) + { + throw Exception(ErrorCodes::ROCKSDB_ERROR, "Fail to merge rocksdb options from 'rocksdb.options' at: {}: {}", + rocksdb_dir, status.ToString()); + } + } + if (config.has("rocksdb.column_family_options")) + { + auto column_family_options = getOptionsFromConfig(config, "rocksdb.column_family_options"); + status = rocksdb::GetColumnFamilyOptionsFromMap(merged, column_family_options, &merged); + if (!status.ok()) + { + throw Exception(ErrorCodes::ROCKSDB_ERROR, "Fail to merge rocksdb options from 'rocksdb.options' at: {}: {}", + rocksdb_dir, status.ToString()); + } + } + + if (config.has("rocksdb.tables")) + { + auto table_name = getStorageID().getTableName(); + + Poco::Util::AbstractConfiguration::Keys keys; + config.keys("rocksdb.tables", keys); + + for (const auto & key : keys) + { + const String key_prefix = "rocksdb.tables." + key; + if (config.getString(key_prefix + ".name") != table_name) + continue; + + String config_key = key_prefix + ".options"; + if (config.has(config_key)) + { + auto table_config_options = getOptionsFromConfig(config, config_key); + status = rocksdb::GetDBOptionsFromMap(merged, table_config_options, &merged); + if (!status.ok()) + { + throw Exception(ErrorCodes::ROCKSDB_ERROR, "Fail to merge rocksdb options from '{}' at: {}: {}", + config_key, rocksdb_dir, status.ToString()); + } + } + + config_key = key_prefix + ".column_family_options"; + if (config.has(config_key)) + { + auto table_column_family_options = getOptionsFromConfig(config, config_key); + status = rocksdb::GetColumnFamilyOptionsFromMap(merged, table_column_family_options, &merged); + if (!status.ok()) + { + throw Exception(ErrorCodes::ROCKSDB_ERROR, "Fail to merge rocksdb options from '{}' at: {}: {}", + config_key, rocksdb_dir, status.ToString()); + } + } + } + } + + status = rocksdb::DB::Open(merged, rocksdb_dir, &db); + + if (!status.ok()) + { + throw Exception(ErrorCodes::ROCKSDB_ERROR, "Fail to open rocksdb path at: {}: {}", + rocksdb_dir, status.ToString()); + } rocksdb_ptr = std::unique_ptr(db); } @@ -333,10 +427,10 @@ Pipe StorageEmbeddedRocksDB::read( } } -BlockOutputStreamPtr StorageEmbeddedRocksDB::write( +SinkToStoragePtr StorageEmbeddedRocksDB::write( const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr /*context*/) { - return std::make_shared(*this, metadata_snapshot); + return std::make_shared(*this, metadata_snapshot); } @@ -364,6 +458,10 @@ static StoragePtr create(const StorageFactory::Arguments & args) return StorageEmbeddedRocksDB::create(args.table_id, args.relative_data_path, metadata, args.attach, args.getContext(), primary_key_names[0]); } +std::shared_ptr StorageEmbeddedRocksDB::getRocksDBStatistics() const +{ + return rocksdb_ptr->GetOptions().statistics; +} void registerStorageEmbeddedRocksDB(StorageFactory & factory) { diff --git a/src/Storages/RocksDB/StorageEmbeddedRocksDB.h b/src/Storages/RocksDB/StorageEmbeddedRocksDB.h index aa81bc4d35f..3f1b3b49492 100644 --- a/src/Storages/RocksDB/StorageEmbeddedRocksDB.h +++ b/src/Storages/RocksDB/StorageEmbeddedRocksDB.h @@ -8,6 +8,7 @@ namespace rocksdb { class DB; + class Statistics; } @@ -16,11 +17,11 @@ namespace DB class Context; -class StorageEmbeddedRocksDB final : public shared_ptr_helper, public IStorage +class StorageEmbeddedRocksDB final : public shared_ptr_helper, public IStorage, WithContext { friend struct shared_ptr_helper; friend class EmbeddedRocksDBSource; - friend class EmbeddedRocksDBBlockOutputStream; + friend class EmbeddedRocksDBSink; friend class EmbeddedRocksDBBlockInputStream; public: std::string getName() const override { return "EmbeddedRocksDB"; } @@ -34,7 +35,7 @@ public: size_t max_block_size, unsigned num_streams) override; - BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; + SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; void truncate(const ASTPtr &, const StorageMetadataPtr & metadata_snapshot, ContextPtr, TableExclusiveLockHolder &) override; bool supportsParallelInsert() const override { return true; } @@ -48,6 +49,8 @@ public: bool storesDataOnDisk() const override { return true; } Strings getDataPaths() const override { return {rocksdb_dir}; } + std::shared_ptr getRocksDBStatistics() const; + protected: StorageEmbeddedRocksDB(const StorageID & table_id_, const String & relative_data_path_, diff --git a/src/Storages/RocksDB/StorageSystemRocksDB.cpp b/src/Storages/RocksDB/StorageSystemRocksDB.cpp new file mode 100644 index 00000000000..7d31d5ddc21 --- /dev/null +++ b/src/Storages/RocksDB/StorageSystemRocksDB.cpp @@ -0,0 +1,129 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int LOGICAL_ERROR; +} + +} + +namespace DB +{ + + +NamesAndTypesList StorageSystemRocksDB::getNamesAndTypes() +{ + return { + { "database", std::make_shared() }, + { "table", std::make_shared() }, + { "name", std::make_shared() }, + { "value", std::make_shared() }, + }; +} + + +void StorageSystemRocksDB::fillData(MutableColumns & res_columns, ContextPtr context, const SelectQueryInfo & query_info) const +{ + const auto access = context->getAccess(); + const bool check_access_for_databases = !access->isGranted(AccessType::SHOW_TABLES); + + std::map> tables; + for (const auto & db : DatabaseCatalog::instance().getDatabases()) + { + const bool check_access_for_tables = check_access_for_databases && !access->isGranted(AccessType::SHOW_TABLES, db.first); + + for (auto iterator = db.second->getTablesIterator(context); iterator->isValid(); iterator->next()) + { + StoragePtr table = iterator->table(); + if (!table) + continue; + + if (!dynamic_cast(table.get())) + continue; + if (check_access_for_tables && !access->isGranted(AccessType::SHOW_TABLES, db.first, iterator->name())) + continue; + tables[db.first][iterator->name()] = table; + } + } + + + MutableColumnPtr col_database_mut = ColumnString::create(); + MutableColumnPtr col_table_mut = ColumnString::create(); + + for (auto & db : tables) + { + for (auto & table : db.second) + { + col_database_mut->insert(db.first); + col_table_mut->insert(table.first); + } + } + + ColumnPtr col_database_to_filter = std::move(col_database_mut); + ColumnPtr col_table_to_filter = std::move(col_table_mut); + + /// Determine what tables are needed by the conditions in the query. + { + Block filtered_block + { + { col_database_to_filter, std::make_shared(), "database" }, + { col_table_to_filter, std::make_shared(), "table" }, + }; + + VirtualColumnUtils::filterBlockWithQuery(query_info.query, filtered_block, context); + + if (!filtered_block.rows()) + return; + + col_database_to_filter = filtered_block.getByName("database").column; + col_table_to_filter = filtered_block.getByName("table").column; + } + + bool show_zeros = context->getSettingsRef().system_events_show_zero_values; + for (size_t i = 0, tables_size = col_database_to_filter->size(); i < tables_size; ++i) + { + String database = (*col_database_to_filter)[i].safeGet(); + String table = (*col_table_to_filter)[i].safeGet(); + + auto & rocksdb_table = dynamic_cast(*tables[database][table]); + auto statistics = rocksdb_table.getRocksDBStatistics(); + if (!statistics) + throw Exception(ErrorCodes::LOGICAL_ERROR, "rocksdb statistics is not enabled"); + + for (auto [tick, name] : rocksdb::TickersNameMap) + { + UInt64 value = statistics->getTickerCount(tick); + if (!value && !show_zeros) + continue; + + /// trim "rocksdb." + if (startsWith(name, "rocksdb.")) + name = name.substr(strlen("rocksdb.")); + + size_t col_num = 0; + res_columns[col_num++]->insert(database); + res_columns[col_num++]->insert(table); + + res_columns[col_num++]->insert(name); + res_columns[col_num++]->insert(value); + } + } +} + +} diff --git a/src/Storages/RocksDB/StorageSystemRocksDB.h b/src/Storages/RocksDB/StorageSystemRocksDB.h new file mode 100644 index 00000000000..e94bdb06aee --- /dev/null +++ b/src/Storages/RocksDB/StorageSystemRocksDB.h @@ -0,0 +1,29 @@ +#pragma once + +#include +#include + + +namespace DB +{ + +class Context; + + +/** Implements the `rocksdb` system table, which expose various rocksdb metrics. + */ +class StorageSystemRocksDB final : public shared_ptr_helper, public IStorageSystemOneBlock +{ + friend struct shared_ptr_helper; +public: + std::string getName() const override { return "SystemRocksDB"; } + + static NamesAndTypesList getNamesAndTypes(); + +protected: + using IStorageSystemOneBlock::IStorageSystemOneBlock; + + void fillData(MutableColumns & res_columns, ContextPtr context, const SelectQueryInfo & query_info) const override; +}; + +} diff --git a/src/Storages/SelectQueryInfo.h b/src/Storages/SelectQueryInfo.h index a7d2ae3e7dd..3b3c0fa1258 100644 --- a/src/Storages/SelectQueryInfo.h +++ b/src/Storages/SelectQueryInfo.h @@ -83,9 +83,10 @@ struct InputOrderInfo { SortDescription order_key_prefix_descr; int direction; + UInt64 limit; - InputOrderInfo(const SortDescription & order_key_prefix_descr_, int direction_) - : order_key_prefix_descr(order_key_prefix_descr_), direction(direction_) {} + InputOrderInfo(const SortDescription & order_key_prefix_descr_, int direction_, UInt64 limit_) + : order_key_prefix_descr(order_key_prefix_descr_), direction(direction_), limit(limit_) {} bool operator ==(const InputOrderInfo & other) const { @@ -99,8 +100,6 @@ class IMergeTreeDataPart; using ManyExpressionActions = std::vector; -struct MergeTreeDataSelectCache; - // The projection selected to execute current query struct ProjectionCandidate { @@ -119,8 +118,6 @@ struct ProjectionCandidate ReadInOrderOptimizerPtr order_optimizer; InputOrderInfoPtr input_order_info; ManyExpressionActions group_by_elements_actions; - // std::shared_ptr merge_tree_data_select_base_cache; - // std::shared_ptr merge_tree_data_select_projection_cache; }; /** Query along with some additional data, @@ -160,7 +157,7 @@ struct SelectQueryInfo /// If not null, it means we choose a projection to execute current query. std::optional projection; bool ignore_projections = false; - std::shared_ptr merge_tree_data_select_cache; + bool is_projection_query = false; }; } diff --git a/src/Storages/StorageBuffer.cpp b/src/Storages/StorageBuffer.cpp index a433cd248c7..e9136bb5d05 100644 --- a/src/Storages/StorageBuffer.cpp +++ b/src/Storages/StorageBuffer.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include @@ -26,12 +25,14 @@ #include #include #include +#include #include #include #include #include #include + namespace ProfileEvents { extern const Event StorageBufferFlush; @@ -137,7 +138,7 @@ public: BufferSource(const Names & column_names_, StorageBuffer::Buffer & buffer_, const StorageBuffer & storage, const StorageMetadataPtr & metadata_snapshot) : SourceWithProgress( metadata_snapshot->getSampleBlockForColumns(column_names_, storage.getVirtuals(), storage.getStorageID())) - , column_names_and_types(metadata_snapshot->getColumns().getAllWithSubcolumns().addTypes(column_names_)) + , column_names_and_types(metadata_snapshot->getColumns().getByNames(ColumnsDescription::All, column_names_, true)) , buffer(buffer_) {} String getName() const override { return "Buffer"; } @@ -242,8 +243,8 @@ void StorageBuffer::read( { const auto & dest_columns = destination_metadata_snapshot->getColumns(); const auto & our_columns = metadata_snapshot->getColumns(); - return dest_columns.hasPhysicalOrSubcolumn(column_name) && - dest_columns.getPhysicalOrSubcolumn(column_name).type->equals(*our_columns.getPhysicalOrSubcolumn(column_name).type); + auto dest_columm = dest_columns.tryGetColumnOrSubcolumn(ColumnsDescription::AllPhysical, column_name); + return dest_columm && dest_columm->type->equals(*our_columns.getColumnOrSubcolumn(ColumnsDescription::AllPhysical, column_name).type); }); if (dst_has_same_structure) @@ -513,30 +514,30 @@ static void appendBlock(const Block & from, Block & to) } -class BufferBlockOutputStream : public IBlockOutputStream +class BufferSink : public SinkToStorage { public: - explicit BufferBlockOutputStream( + explicit BufferSink( StorageBuffer & storage_, const StorageMetadataPtr & metadata_snapshot_) - : storage(storage_) + : SinkToStorage(metadata_snapshot_->getSampleBlock()) + , storage(storage_) , metadata_snapshot(metadata_snapshot_) - {} - - Block getHeader() const override { return metadata_snapshot->getSampleBlock(); } - - void write(const Block & block) override { - if (!block) - return; - // Check table structure. - metadata_snapshot->check(block, true); + metadata_snapshot->check(getPort().getHeader(), true); + } - size_t rows = block.rows(); + String getName() const override { return "BufferSink"; } + + void consume(Chunk chunk) override + { + size_t rows = chunk.getNumRows(); if (!rows) return; + auto block = getPort().getHeader().cloneWithColumns(chunk.getColumns()); + StoragePtr destination; if (storage.destination_id) { @@ -642,9 +643,9 @@ private: }; -BlockOutputStreamPtr StorageBuffer::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr /*context*/) +SinkToStoragePtr StorageBuffer::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr /*context*/) { - return std::make_shared(*this, metadata_snapshot); + return std::make_shared(*this, metadata_snapshot); } diff --git a/src/Storages/StorageBuffer.h b/src/Storages/StorageBuffer.h index b4fcdf6cbc9..8749cf47eb9 100644 --- a/src/Storages/StorageBuffer.h +++ b/src/Storages/StorageBuffer.h @@ -46,7 +46,7 @@ class StorageBuffer final : public shared_ptr_helper, public ISto { friend struct shared_ptr_helper; friend class BufferSource; -friend class BufferBlockOutputStream; +friend class BufferSink; public: struct Thresholds @@ -84,7 +84,7 @@ public: bool supportsSubcolumns() const override { return true; } - BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; + SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; void startup() override; /// Flush all buffers into the subordinate table and stop background thread. diff --git a/src/Storages/StorageDictionary.cpp b/src/Storages/StorageDictionary.cpp index 4c31f62b21f..c8bbb703999 100644 --- a/src/Storages/StorageDictionary.cpp +++ b/src/Storages/StorageDictionary.cpp @@ -167,10 +167,9 @@ Pipe StorageDictionary::read( const size_t max_block_size, const unsigned /*threads*/) { - auto dictionary = getContext()->getExternalDictionariesLoader().getDictionary(dictionary_name, local_context); - auto stream = dictionary->getBlockInputStream(column_names, max_block_size); - /// TODO: update dictionary interface for processors. - return Pipe(std::make_shared(stream)); + auto registered_dictionary_name = location == Location::SameDatabaseAndNameAsDictionary ? getStorageID().getInternalDictionaryName() : dictionary_name; + auto dictionary = getContext()->getExternalDictionariesLoader().getDictionary(registered_dictionary_name, local_context); + return dictionary->read(column_names, max_block_size); } void StorageDictionary::shutdown() diff --git a/src/Storages/StorageDistributed.cpp b/src/Storages/StorageDistributed.cpp index f4d6ec5c6f7..fcd0e255e5c 100644 --- a/src/Storages/StorageDistributed.cpp +++ b/src/Storages/StorageDistributed.cpp @@ -4,13 +4,13 @@ #include -#include +#include #include #include #include -#include +#include #include #include @@ -57,8 +57,9 @@ #include #include #include +#include #include -#include +#include #include #include @@ -283,85 +284,6 @@ void replaceConstantExpressions( visitor.visit(node); } -/// This is the implementation of optimize_distributed_group_by_sharding_key. -/// It returns up to which stage the query can be processed on a shard, which -/// is one of the following: -/// - QueryProcessingStage::Complete -/// - QueryProcessingStage::WithMergeableStateAfterAggregation -/// - QueryProcessingStage::WithMergeableStateAfterAggregationAndLimit -/// - none (in this case regular WithMergeableState should be used) -std::optional getOptimizedQueryProcessingStage(const SelectQueryInfo & query_info, bool extremes, const Block & sharding_key_block) -{ - const auto & select = query_info.query->as(); - - auto sharding_block_has = [&](const auto & exprs, size_t limit = SIZE_MAX) -> bool - { - size_t i = 0; - for (auto & expr : exprs) - { - ++i; - if (i > limit) - break; - - auto id = expr->template as(); - if (!id) - return false; - /// TODO: if GROUP BY contains multiIf()/if() it should contain only columns from sharding_key - if (!sharding_key_block.has(id->name())) - return false; - } - return true; - }; - - // GROUP BY qualifiers - // - TODO: WITH TOTALS can be implemented - // - TODO: WITH ROLLUP can be implemented (I guess) - if (select.group_by_with_totals || select.group_by_with_rollup || select.group_by_with_cube) - return {}; - - // Window functions are not supported. - if (query_info.has_window) - return {}; - - // TODO: extremes support can be implemented - if (extremes) - return {}; - - // DISTINCT - if (select.distinct) - { - if (!sharding_block_has(select.select()->children)) - return {}; - } - - // GROUP BY - const ASTPtr group_by = select.groupBy(); - if (!group_by) - { - if (!select.distinct) - return {}; - } - else - { - if (!sharding_block_has(group_by->children, 1)) - return {}; - } - - // ORDER BY - const ASTPtr order_by = select.orderBy(); - if (order_by) - return QueryProcessingStage::WithMergeableStateAfterAggregationAndLimit; - - // LIMIT BY - // LIMIT - // OFFSET - if (select.limitBy() || select.limitLength() || select.limitOffset()) - return QueryProcessingStage::WithMergeableStateAfterAggregationAndLimit; - - // Only simple SELECT FROM GROUP BY sharding_key can use Complete state. - return QueryProcessingStage::Complete; -} - size_t getClusterQueriedNodes(const Settings & settings, const ClusterPtr & cluster) { size_t num_local_shards = cluster->getLocalShardCount(); @@ -493,17 +415,22 @@ QueryProcessingStage::Enum StorageDistributed::getQueryProcessingStage( ClusterPtr cluster = getCluster(); query_info.cluster = cluster; + size_t nodes = getClusterQueriedNodes(settings, cluster); + /// Always calculate optimized cluster here, to avoid conditions during read() /// (Anyway it will be calculated in the read()) - if (getClusterQueriedNodes(settings, cluster) > 1 && settings.optimize_skip_unused_shards) + if (nodes > 1 && settings.optimize_skip_unused_shards) { ClusterPtr optimized_cluster = getOptimizedCluster(local_context, metadata_snapshot, query_info.query); if (optimized_cluster) { LOG_DEBUG(log, "Skipping irrelevant shards - the query will be sent to the following shards of the cluster (shard numbers): {}", makeFormattedListOfShards(optimized_cluster)); + cluster = optimized_cluster; query_info.optimized_cluster = cluster; + + nodes = getClusterQueriedNodes(settings, cluster); } else { @@ -525,13 +452,12 @@ QueryProcessingStage::Enum StorageDistributed::getQueryProcessingStage( { /// NOTE: distributed_group_by_no_merge=1 does not respect distributed_push_down_limit /// (since in this case queries processed separately and the initiator is just a proxy in this case). + if (to_stage != QueryProcessingStage::Complete) + throw Exception("Queries with distributed_group_by_no_merge=1 should be processed to Complete stage", ErrorCodes::LOGICAL_ERROR); return QueryProcessingStage::Complete; } } - if (settings.distributed_push_down_limit) - return QueryProcessingStage::WithMergeableStateAfterAggregationAndLimit; - /// Nested distributed query cannot return Complete stage, /// since the parent query need to aggregate the results after. if (to_stage == QueryProcessingStage::WithMergeableState) @@ -539,26 +465,115 @@ QueryProcessingStage::Enum StorageDistributed::getQueryProcessingStage( /// If there is only one node, the query can be fully processed by the /// shard, initiator will work as a proxy only. - if (getClusterQueriedNodes(settings, cluster) == 1) - return QueryProcessingStage::Complete; - - if (settings.optimize_skip_unused_shards && - settings.optimize_distributed_group_by_sharding_key && - has_sharding_key && - (settings.allow_nondeterministic_optimize_skip_unused_shards || sharding_key_is_deterministic)) + if (nodes == 1) { - Block sharding_key_block = sharding_key_expr->getSampleBlock(); - auto stage = getOptimizedQueryProcessingStage(query_info, settings.extremes, sharding_key_block); - if (stage) - { - LOG_DEBUG(log, "Force processing stage to {}", QueryProcessingStage::toString(*stage)); - return *stage; - } + /// In case the query was processed to + /// WithMergeableStateAfterAggregation/WithMergeableStateAfterAggregationAndLimit + /// (which are greater the Complete stage) + /// we cannot return Complete (will break aliases and similar), + /// relevant for Distributed over Distributed + return std::max(to_stage, QueryProcessingStage::Complete); + } + else if (nodes == 0) + { + /// In case of 0 shards, the query should be processed fully on the initiator, + /// since we need to apply aggregations. + /// That's why we need to return FetchColumns. + return QueryProcessingStage::FetchColumns; + } + + auto optimized_stage = getOptimizedQueryProcessingStage(query_info, settings); + if (optimized_stage) + { + if (*optimized_stage == QueryProcessingStage::Complete) + return std::min(to_stage, *optimized_stage); + return *optimized_stage; } return QueryProcessingStage::WithMergeableState; } +std::optional StorageDistributed::getOptimizedQueryProcessingStage(const SelectQueryInfo & query_info, const Settings & settings) const +{ + bool optimize_sharding_key_aggregation = + settings.optimize_skip_unused_shards && + settings.optimize_distributed_group_by_sharding_key && + has_sharding_key && + (settings.allow_nondeterministic_optimize_skip_unused_shards || sharding_key_is_deterministic); + + QueryProcessingStage::Enum default_stage = QueryProcessingStage::WithMergeableStateAfterAggregation; + if (settings.distributed_push_down_limit) + default_stage = QueryProcessingStage::WithMergeableStateAfterAggregationAndLimit; + + const auto & select = query_info.query->as(); + + auto expr_contains_sharding_key = [&](const auto & exprs) -> bool + { + std::unordered_set expr_columns; + for (auto & expr : exprs) + { + auto id = expr->template as(); + if (!id) + continue; + expr_columns.emplace(id->name()); + } + + for (const auto & column : sharding_key_expr->getRequiredColumns()) + { + if (!expr_columns.contains(column)) + return false; + } + + return true; + }; + + // GROUP BY qualifiers + // - TODO: WITH TOTALS can be implemented + // - TODO: WITH ROLLUP can be implemented (I guess) + if (select.group_by_with_totals || select.group_by_with_rollup || select.group_by_with_cube) + return {}; + // Window functions are not supported. + if (query_info.has_window) + return {}; + // TODO: extremes support can be implemented + if (settings.extremes) + return {}; + + // DISTINCT + if (select.distinct) + { + if (!optimize_sharding_key_aggregation || !expr_contains_sharding_key(select.select()->children)) + return {}; + } + + // GROUP BY + const ASTPtr group_by = select.groupBy(); + if (!query_info.syntax_analyzer_result->aggregates.empty() || group_by) + { + if (!optimize_sharding_key_aggregation || !group_by || !expr_contains_sharding_key(group_by->children)) + return {}; + } + + // LIMIT BY + if (const ASTPtr limit_by = select.limitBy()) + { + if (!optimize_sharding_key_aggregation || !expr_contains_sharding_key(limit_by->children)) + return {}; + } + + // ORDER BY + if (const ASTPtr order_by = select.orderBy()) + return default_stage; + + // LIMIT + // OFFSET + if (select.limitLength() || select.limitOffset()) + return default_stage; + + // Only simple SELECT FROM GROUP BY sharding_key can use Complete state. + return QueryProcessingStage::Complete; +} + Pipe StorageDistributed::read( const Names & column_names, const StorageMetadataPtr & metadata_snapshot, @@ -602,25 +617,25 @@ void StorageDistributed::read( return; } - const Scalars & scalars = local_context->hasQueryContext() ? local_context->getQueryContext()->getScalars() : Scalars{}; - bool has_virtual_shard_num_column = std::find(column_names.begin(), column_names.end(), "_shard_num") != column_names.end(); if (has_virtual_shard_num_column && !isVirtualColumn("_shard_num", metadata_snapshot)) has_virtual_shard_num_column = false; - ClusterProxy::SelectStreamFactory select_stream_factory = remote_table_function_ptr - ? ClusterProxy::SelectStreamFactory( - header, processed_stage, remote_table_function_ptr, scalars, has_virtual_shard_num_column, local_context->getExternalTables()) - : ClusterProxy::SelectStreamFactory( + StorageID main_table = StorageID::createEmpty(); + if (!remote_table_function_ptr) + main_table = StorageID{remote_database, remote_table}; + + ClusterProxy::SelectStreamFactory select_stream_factory = + ClusterProxy::SelectStreamFactory( header, processed_stage, - StorageID{remote_database, remote_table}, - scalars, - has_virtual_shard_num_column, - local_context->getExternalTables()); + has_virtual_shard_num_column); - ClusterProxy::executeQuery(query_plan, select_stream_factory, log, - modified_query_ast, local_context, query_info, + ClusterProxy::executeQuery( + query_plan, header, processed_stage, + main_table, remote_table_function_ptr, + select_stream_factory, log, modified_query_ast, + local_context, query_info, sharding_key_expr, sharding_key_column_name, query_info.cluster); @@ -630,7 +645,7 @@ void StorageDistributed::read( } -BlockOutputStreamPtr StorageDistributed::write(const ASTPtr &, const StorageMetadataPtr & metadata_snapshot, ContextPtr local_context) +SinkToStoragePtr StorageDistributed::write(const ASTPtr &, const StorageMetadataPtr & metadata_snapshot, ContextPtr local_context) { auto cluster = getCluster(); const auto & settings = local_context->getSettingsRef(); @@ -668,7 +683,7 @@ BlockOutputStreamPtr StorageDistributed::write(const ASTPtr &, const StorageMeta sample_block = metadata_snapshot->getSampleBlock(); /// DistributedBlockOutputStream will not own cluster, but will own ConnectionPools of the cluster - return std::make_shared( + return std::make_shared( local_context, *this, metadata_snapshot, createInsertToRemoteTableQuery(remote_database, remote_table, sample_block), cluster, insert_sync, timeout, StorageID{remote_database, remote_table}); @@ -739,9 +754,10 @@ QueryPipelinePtr StorageDistributed::distributedWrite(const ASTInsertQuery & que "Expected exactly one connection for shard " + toString(shard_info.shard_num), ErrorCodes::LOGICAL_ERROR); /// INSERT SELECT query returns empty block - auto in_stream = std::make_shared(std::move(connections), new_query_str, Block{}, local_context); + auto remote_query_executor + = std::make_shared(shard_info.pool, std::move(connections), new_query_str, Block{}, local_context); pipelines.emplace_back(std::make_unique()); - pipelines.back()->init(Pipe(std::make_shared(std::move(in_stream)))); + pipelines.back()->init(Pipe(std::make_shared(remote_query_executor, false, settings.async_socket_for_remote))); pipelines.back()->setSinks([](const Block & header, QueryPipeline::StreamType) -> ProcessorPtr { return std::make_shared(header); @@ -1093,7 +1109,7 @@ ClusterPtr StorageDistributed::skipUnusedShards( size_t limit = local_context->getSettingsRef().optimize_skip_unused_shards_limit; if (!limit || limit > SSIZE_MAX) { - throw Exception("optimize_skip_unused_shards_limit out of range (0, {}]", ErrorCodes::ARGUMENT_OUT_OF_BOUND, SSIZE_MAX); + throw Exception(ErrorCodes::ARGUMENT_OUT_OF_BOUND, "optimize_skip_unused_shards_limit out of range (0, {}]", SSIZE_MAX); } // To interpret limit==0 as limit is reached ++limit; @@ -1137,6 +1153,18 @@ ActionLock StorageDistributed::getActionLock(StorageActionBlockType type) return {}; } +void StorageDistributed::flush() +{ + try + { + flushClusterNodesAllData(getContext()); + } + catch (...) + { + tryLogCurrentException(log, "Cannot flush"); + } +} + void StorageDistributed::flushClusterNodesAllData(ContextPtr local_context) { /// Sync SYSTEM FLUSH DISTRIBUTED with TRUNCATE @@ -1292,8 +1320,11 @@ void registerStorageDistributed(StorageFactory & factory) String cluster_name = getClusterNameAndMakeLiteral(engine_args[0]); - engine_args[1] = evaluateConstantExpressionOrIdentifierAsLiteral(engine_args[1], args.getLocalContext()); - engine_args[2] = evaluateConstantExpressionOrIdentifierAsLiteral(engine_args[2], args.getLocalContext()); + const ContextPtr & context = args.getContext(); + const ContextPtr & local_context = args.getLocalContext(); + + engine_args[1] = evaluateConstantExpressionOrIdentifierAsLiteral(engine_args[1], local_context); + engine_args[2] = evaluateConstantExpressionOrIdentifierAsLiteral(engine_args[2], local_context); String remote_database = engine_args[1]->as().value.safeGet(); String remote_table = engine_args[2]->as().value.safeGet(); @@ -1304,7 +1335,7 @@ void registerStorageDistributed(StorageFactory & factory) /// Check that sharding_key exists in the table and has numeric type. if (sharding_key) { - auto sharding_expr = buildShardingKeyExpression(sharding_key, args.getContext(), args.columns.getAllPhysical(), true); + auto sharding_expr = buildShardingKeyExpression(sharding_key, context, args.columns.getAllPhysical(), true); const Block & block = sharding_expr->getSampleBlock(); if (block.columns() != 1) @@ -1335,6 +1366,16 @@ void registerStorageDistributed(StorageFactory & factory) "bytes_to_throw_insert cannot be less or equal to bytes_to_delay_insert (since it is handled first)"); } + /// Set default values from the distributed_directory_monitor_* global context settings. + if (!distributed_settings.monitor_batch_inserts.changed) + distributed_settings.monitor_batch_inserts = context->getSettingsRef().distributed_directory_monitor_batch_inserts; + if (!distributed_settings.monitor_split_batch_on_failure.changed) + distributed_settings.monitor_split_batch_on_failure = context->getSettingsRef().distributed_directory_monitor_split_batch_on_failure; + if (!distributed_settings.monitor_sleep_time_ms.changed) + distributed_settings.monitor_sleep_time_ms = Poco::Timespan(context->getSettingsRef().distributed_directory_monitor_sleep_time_ms); + if (!distributed_settings.monitor_max_sleep_time_ms.changed) + distributed_settings.monitor_max_sleep_time_ms = Poco::Timespan(context->getSettingsRef().distributed_directory_monitor_max_sleep_time_ms); + return StorageDistributed::create( args.table_id, args.columns, @@ -1343,7 +1384,7 @@ void registerStorageDistributed(StorageFactory & factory) remote_database, remote_table, cluster_name, - args.getContext(), + context, sharding_key, storage_policy, args.relative_data_path, diff --git a/src/Storages/StorageDistributed.h b/src/Storages/StorageDistributed.h index c63abbc6aa4..f8b16dec7be 100644 --- a/src/Storages/StorageDistributed.h +++ b/src/Storages/StorageDistributed.h @@ -39,7 +39,7 @@ using ExpressionActionsPtr = std::shared_ptr; class StorageDistributed final : public shared_ptr_helper, public IStorage, WithContext { friend struct shared_ptr_helper; - friend class DistributedBlockOutputStream; + friend class DistributedSink; friend class StorageDistributedDirectoryMonitor; friend class StorageSystemDistributionQueue; @@ -81,7 +81,7 @@ public: bool supportsParallelInsert() const override { return true; } std::optional totalBytes(const Settings &) const override; - BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; + SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; QueryPipelinePtr distributedWrite(const ASTInsertQuery & query, ContextPtr context) override; @@ -98,6 +98,7 @@ public: void startup() override; void shutdown() override; + void flush() override; void drop() override; bool storesDataOnDisk() const override { return true; } @@ -176,6 +177,24 @@ private: ClusterPtr skipUnusedShards(ClusterPtr cluster, const ASTPtr & query_ptr, const StorageMetadataPtr & metadata_snapshot, ContextPtr context) const; + /// This method returns optimal query processing stage. + /// + /// Here is the list of stages (from the less optimal to more optimal): + /// - WithMergeableState + /// - WithMergeableStateAfterAggregation + /// - WithMergeableStateAfterAggregationAndLimit + /// - Complete + /// + /// Some simple queries w/o GROUP BY/DISTINCT can use more optimal stage. + /// + /// Also in case of optimize_distributed_group_by_sharding_key=1 the queries + /// with GROUP BY/DISTINCT sharding_key can also use more optimal stage. + /// (see also optimize_skip_unused_shards/allow_nondeterministic_optimize_skip_unused_shards) + /// + /// @return QueryProcessingStage or empty std::optoinal + /// (in this case regular WithMergeableState should be used) + std::optional getOptimizedQueryProcessingStage(const SelectQueryInfo & query_info, const Settings & settings) const; + size_t getRandomShardIndex(const Cluster::ShardsInfo & shards); const DistributedSettings & getDistributedSettingsRef() const { return distributed_settings; } diff --git a/src/Storages/StorageExternalDistributed.cpp b/src/Storages/StorageExternalDistributed.cpp index 32b9c7e9245..f20e49fe23a 100644 --- a/src/Storages/StorageExternalDistributed.cpp +++ b/src/Storages/StorageExternalDistributed.cpp @@ -98,7 +98,7 @@ StorageExternalDistributed::StorageExternalDistributed( context->getSettingsRef().postgresql_connection_pool_size, context->getSettingsRef().postgresql_connection_pool_wait_timeout); - shard = StoragePostgreSQL::create(table_id_, std::move(pool), remote_table, columns_, constraints_, String{}, context); + shard = StoragePostgreSQL::create(table_id_, std::move(pool), remote_table, columns_, constraints_, String{}); break; } #endif diff --git a/src/Storages/StorageFactory.cpp b/src/Storages/StorageFactory.cpp index 5ca423b449a..cfa50b95487 100644 --- a/src/Storages/StorageFactory.cpp +++ b/src/Storages/StorageFactory.cpp @@ -222,7 +222,7 @@ StoragePtr StorageFactory::get( storage_def->engine->arguments->children = empty_engine_args; } - if (local_context->hasQueryContext() && context->getSettingsRef().log_queries) + if (local_context->hasQueryContext() && local_context->getSettingsRef().log_queries) local_context->getQueryContext()->addQueryFactoriesInfo(Context::QueryLogFactories::Storage, name); return res; diff --git a/src/Storages/StorageFile.cpp b/src/Storages/StorageFile.cpp index efd59255c9e..cc8e397b668 100644 --- a/src/Storages/StorageFile.cpp +++ b/src/Storages/StorageFile.cpp @@ -9,15 +9,16 @@ #include #include +#include #include #include #include #include #include -#include #include -#include +#include +#include #include #include @@ -25,6 +26,7 @@ #include #include +#include #include #include @@ -35,6 +37,7 @@ #include #include #include +#include namespace fs = std::filesystem; @@ -46,7 +49,6 @@ namespace ErrorCodes { extern const int BAD_ARGUMENTS; extern const int NOT_IMPLEMENTED; - extern const int CANNOT_SEEK_THROUGH_FILE; extern const int CANNOT_TRUNCATE_FILE; extern const int DATABASE_ACCESS_DENIED; extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; @@ -55,6 +57,7 @@ namespace ErrorCodes extern const int FILE_DOESNT_EXIST; extern const int TIMEOUT_EXCEEDED; extern const int INCOMPATIBLE_COLUMNS; + extern const int CANNOT_STAT; } namespace @@ -169,10 +172,6 @@ StorageFile::StorageFile(int table_fd_, CommonArguments args) is_db_table = false; use_table_fd = true; table_fd = table_fd_; - - /// Save initial offset, it will be used for repeating SELECTs - /// If FD isn't seekable (lseek returns -1), then the second and subsequent SELECTs will fail. - table_fd_init_offset = lseek(table_fd, 0, SEEK_CUR); } StorageFile::StorageFile(const std::string & table_path_, const std::string & user_files_path, CommonArguments args) @@ -187,7 +186,7 @@ StorageFile::StorageFile(const std::string & table_path_, const std::string & us throw Exception("Cannot get table structure from file, because no files match specified name", ErrorCodes::INCORRECT_FILE_NAME); auto & first_path = paths[0]; - Block header = StorageDistributedDirectoryMonitor::createStreamFromFile(first_path)->getHeader(); + Block header = StorageDistributedDirectoryMonitor::createSourceFromFile(first_path)->getOutputs().front().getHeader(); StorageInMemoryMetadata storage_metadata; auto columns = ColumnsDescription(header.getNamesAndTypesList()); @@ -276,7 +275,8 @@ public: const FilesInfoPtr & files_info) { if (storage->isColumnOriented()) - return metadata_snapshot->getSampleBlockForColumns(columns_description.getNamesOfPhysical(), storage->getVirtuals(), storage->getStorageID()); + return metadata_snapshot->getSampleBlockForColumns( + columns_description.getNamesOfPhysical(), storage->getVirtuals(), storage->getStorageID()); else return getHeader(metadata_snapshot, files_info->need_path_column, files_info->need_file_column); } @@ -296,28 +296,7 @@ public: , context(context_) , max_block_size(max_block_size_) { - if (storage->use_table_fd) - { - unique_lock = std::unique_lock(storage->rwlock, getLockTimeout(context)); - if (!unique_lock) - throw Exception("Lock timeout exceeded", ErrorCodes::TIMEOUT_EXCEEDED); - - /// We could use common ReadBuffer and WriteBuffer in storage to leverage cache - /// and add ability to seek unseekable files, but cache sync isn't supported. - - if (storage->table_fd_was_used) /// We need seek to initial position - { - if (storage->table_fd_init_offset < 0) - throw Exception("File descriptor isn't seekable, inside " + storage->getName(), ErrorCodes::CANNOT_SEEK_THROUGH_FILE); - - /// ReadBuffer's seek() doesn't make sense, since cache is empty - if (lseek(storage->table_fd, storage->table_fd_init_offset, SEEK_SET) < 0) - throwFromErrno("Cannot seek file descriptor, inside " + storage->getName(), ErrorCodes::CANNOT_SEEK_THROUGH_FILE); - } - - storage->table_fd_was_used = true; - } - else + if (!storage->use_table_fd) { shared_lock = std::shared_lock(storage->rwlock, getLockTimeout(context)); if (!shared_lock) @@ -348,7 +327,9 @@ public: /// Special case for distributed format. Defaults are not needed here. if (storage->format_name == "Distributed") { - reader = StorageDistributedDirectoryMonitor::createStreamFromFile(current_path); + pipeline = std::make_unique(); + pipeline->init(Pipe(StorageDistributedDirectoryMonitor::createSourceFromFile(current_path))); + reader = std::make_unique(*pipeline); continue; } } @@ -356,14 +337,32 @@ public: std::unique_ptr nested_buffer; CompressionMethod method; + struct stat file_stat{}; + if (storage->use_table_fd) { - nested_buffer = std::make_unique(storage->table_fd); + /// Check if file descriptor allows random reads (and reading it twice). + if (0 != fstat(storage->table_fd, &file_stat)) + throwFromErrno("Cannot stat table file descriptor, inside " + storage->getName(), ErrorCodes::CANNOT_STAT); + + if (S_ISREG(file_stat.st_mode)) + nested_buffer = std::make_unique(storage->table_fd); + else + nested_buffer = std::make_unique(storage->table_fd); + method = chooseCompressionMethod("", storage->compression_method); } else { - nested_buffer = std::make_unique(current_path); + /// Check if file descriptor allows random reads (and reading it twice). + if (0 != stat(current_path.c_str(), &file_stat)) + throwFromErrno("Cannot stat file " + current_path, ErrorCodes::CANNOT_STAT); + + if (S_ISREG(file_stat.st_mode)) + nested_buffer = std::make_unique(current_path, context->getSettingsRef().max_read_buffer_size); + else + nested_buffer = std::make_unique(current_path, context->getSettingsRef().max_read_buffer_size); + method = chooseCompressionMethod(current_path, storage->compression_method); } @@ -386,24 +385,31 @@ public: auto format = FormatFactory::instance().getInput( storage->format_name, *read_buf, get_block_for_format(), context, max_block_size, storage->format_settings); - reader = std::make_shared(format); + pipeline = std::make_unique(); + pipeline->init(Pipe(format)); if (columns_description.hasDefaults()) - reader = std::make_shared(reader, columns_description, context); + { + pipeline->addSimpleTransform([&](const Block & header) + { + return std::make_shared(header, columns_description, *format, context); + }); + } - reader->readPrefix(); + reader = std::make_unique(*pipeline); } - if (auto res = reader->read()) + Chunk chunk; + if (reader->pull(chunk)) { - Columns columns = res.getColumns(); - UInt64 num_rows = res.rows(); + //Columns columns = res.getColumns(); + UInt64 num_rows = chunk.getNumRows(); /// Enrich with virtual columns. if (files_info->need_path_column) { auto column = DataTypeString().createColumnConst(num_rows, current_path); - columns.push_back(column->convertToFullColumnIfConst()); + chunk.addColumn(column->convertToFullColumnIfConst()); } if (files_info->need_file_column) @@ -412,10 +418,10 @@ public: auto file_name = current_path.substr(last_slash_pos + 1); auto column = DataTypeString().createColumnConst(num_rows, std::move(file_name)); - columns.push_back(column->convertToFullColumnIfConst()); + chunk.addColumn(column->convertToFullColumnIfConst()); } - return Chunk(std::move(columns), num_rows); + return chunk; } /// Read only once for file descriptor. @@ -423,8 +429,8 @@ public: finished_generate = true; /// Close file prematurely if stream was ended. - reader->readSuffix(); reader.reset(); + pipeline.reset(); read_buf.reset(); } @@ -439,7 +445,8 @@ private: String current_path; Block sample_block; std::unique_ptr read_buf; - BlockInputStreamPtr reader; + std::unique_ptr pipeline; + std::unique_ptr reader; ColumnsDescription columns_description; @@ -449,9 +456,9 @@ private: bool finished_generate = false; std::shared_lock shared_lock; - std::unique_lock unique_lock; }; + Pipe StorageFile::read( const Names & column_names, const StorageMetadataPtr & metadata_snapshot, @@ -466,6 +473,7 @@ Pipe StorageFile::read( if (use_table_fd) /// need to call ctr BlockInputStream paths = {""}; /// when use fd, paths are empty else + { if (paths.size() == 1 && !fs::exists(paths[0])) { if (context->getSettingsRef().engine_file_empty_if_not_exists) @@ -473,7 +481,7 @@ Pipe StorageFile::read( else throw Exception("File " + paths[0] + " doesn't exist", ErrorCodes::FILE_DOESNT_EXIST); } - + } auto files_info = std::make_shared(); files_info->files = paths; @@ -509,6 +517,7 @@ Pipe StorageFile::read( else return metadata_snapshot->getColumns(); }; + pipes.emplace_back(std::make_shared( this_ptr, metadata_snapshot, context, max_block_size, files_info, get_columns_for_format())); } @@ -517,10 +526,10 @@ Pipe StorageFile::read( } -class StorageFileBlockOutputStream : public IBlockOutputStream +class StorageFileSink final : public SinkToStorage { public: - explicit StorageFileBlockOutputStream( + explicit StorageFileSink( StorageFile & storage_, const StorageMetadataPtr & metadata_snapshot_, std::unique_lock && lock_, @@ -528,7 +537,8 @@ public: ContextPtr context, const std::optional & format_settings, int & flags) - : storage(storage_) + : SinkToStorage(metadata_snapshot_->getSampleBlock()) + , storage(storage_) , metadata_snapshot(metadata_snapshot_) , lock(std::move(lock_)) { @@ -538,11 +548,6 @@ public: std::unique_ptr naked_buffer = nullptr; if (storage.use_table_fd) { - /** NOTE: Using real file bounded to FD may be misleading: - * SELECT *; INSERT insert_data; SELECT *; last SELECT returns initil_fd_data + insert_data - * INSERT data; SELECT *; last SELECT returns only insert_data - */ - storage.table_fd_was_used = true; naked_buffer = std::make_unique(storage.table_fd, DBMS_DEFAULT_BUFFER_SIZE); } else @@ -564,29 +569,29 @@ public: {}, format_settings); } - Block getHeader() const override { return metadata_snapshot->getSampleBlock(); } + String getName() const override { return "StorageFileSink"; } - void write(const Block & block) override - { - writer->write(block); - } - - void writePrefix() override + void onStart() override { if (!prefix_written) writer->writePrefix(); prefix_written = true; } - void writeSuffix() override + void consume(Chunk chunk) override + { + writer->write(getPort().getHeader().cloneWithColumns(chunk.detachColumns())); + } + + void onFinish() override { writer->writeSuffix(); } - void flush() override - { - writer->flush(); - } + // void flush() override + // { + // writer->flush(); + // } private: StorageFile & storage; @@ -597,7 +602,7 @@ private: bool prefix_written{false}; }; -BlockOutputStreamPtr StorageFile::write( +SinkToStoragePtr StorageFile::write( const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr context) @@ -617,7 +622,7 @@ BlockOutputStreamPtr StorageFile::write( fs::create_directories(fs::path(path).parent_path()); } - return std::make_shared( + return std::make_shared( *this, metadata_snapshot, std::unique_lock{rwlock, getLockTimeout(context)}, diff --git a/src/Storages/StorageFile.h b/src/Storages/StorageFile.h index 843cd405828..b80333e7ba8 100644 --- a/src/Storages/StorageFile.h +++ b/src/Storages/StorageFile.h @@ -29,7 +29,7 @@ public: size_t max_block_size, unsigned num_streams) override; - BlockOutputStreamPtr write( + SinkToStoragePtr write( const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; @@ -68,7 +68,7 @@ public: protected: friend class StorageFileSource; - friend class StorageFileBlockOutputStream; + friend class StorageFileSink; /// From file descriptor StorageFile(int table_fd_, CommonArguments args); @@ -95,10 +95,8 @@ private: std::string base_path; std::vector paths; - bool is_db_table = true; /// Table is stored in real database, not user's file - bool use_table_fd = false; /// Use table_fd instead of path - std::atomic table_fd_was_used{false}; /// To detect repeating reads from stdin - off_t table_fd_init_offset = -1; /// Initial position of fd, used for repeating reads + bool is_db_table = true; /// Table is stored in real database, not user's file + bool use_table_fd = false; /// Use table_fd instead of path mutable std::shared_timed_mutex rwlock; diff --git a/src/Storages/StorageInMemoryMetadata.cpp b/src/Storages/StorageInMemoryMetadata.cpp index 28574d6fdf1..5183b925141 100644 --- a/src/Storages/StorageInMemoryMetadata.cpp +++ b/src/Storages/StorageInMemoryMetadata.cpp @@ -1,7 +1,7 @@ #include -#include -#include +#include +#include #include #include #include @@ -320,23 +320,25 @@ Block StorageInMemoryMetadata::getSampleBlockForColumns( { Block res; - auto all_columns = getColumns().getAllWithSubcolumns(); - std::unordered_map columns_map; - columns_map.reserve(all_columns.size()); - - for (const auto & elem : all_columns) - columns_map.emplace(elem.name, elem.type); + HashMapWithSavedHash virtuals_map; /// Virtual columns must be appended after ordinary, because user can /// override them. for (const auto & column : virtuals) - columns_map.emplace(column.name, column.type); + virtuals_map[column.name] = &column.type; for (const auto & name : column_names) { - auto it = columns_map.find(name); - if (it != columns_map.end()) - res.insert({it->second->createColumn(), it->second, it->first}); + auto column = getColumns().tryGetColumnOrSubcolumn(ColumnsDescription::All, name); + if (column) + { + res.insert({column->type->createColumn(), column->type, column->name}); + } + else if (auto * it = virtuals_map.find(name); it != virtuals_map.end()) + { + const auto & type = *it->getMapped(); + res.insert({type->createColumn(), type, name}); + } else throw Exception( "Column " + backQuote(name) + " not found in table " + (storage_id.empty() ? "" : storage_id.getNameForLogs()), @@ -467,13 +469,8 @@ bool StorageInMemoryMetadata::hasSelectQuery() const namespace { -#if !defined(ARCADIA_BUILD) - using NamesAndTypesMap = google::dense_hash_map; - using UniqueStrings = google::dense_hash_set; -#else - using NamesAndTypesMap = google::sparsehash::dense_hash_map; - using UniqueStrings = google::sparsehash::dense_hash_set; -#endif + using NamesAndTypesMap = HashMapWithSavedHash; + using UniqueStrings = HashSetWithSavedHash; String listOfColumns(const NamesAndTypesList & available_columns) { @@ -490,44 +487,42 @@ namespace NamesAndTypesMap getColumnsMap(const NamesAndTypesList & columns) { NamesAndTypesMap res; - res.set_empty_key(StringRef()); for (const auto & column : columns) res.insert({column.name, column.type.get()}); return res; } - - UniqueStrings initUniqueStrings() - { - UniqueStrings strings; - strings.set_empty_key(StringRef()); - return strings; - } } void StorageInMemoryMetadata::check(const Names & column_names, const NamesAndTypesList & virtuals, const StorageID & storage_id) const { - NamesAndTypesList available_columns = getColumns().getAllPhysicalWithSubcolumns(); - available_columns.insert(available_columns.end(), virtuals.begin(), virtuals.end()); - - const String list_of_columns = listOfColumns(available_columns); - if (column_names.empty()) - throw Exception("Empty list of columns queried. There are columns: " + list_of_columns, ErrorCodes::EMPTY_LIST_OF_COLUMNS_QUERIED); + { + auto list_of_columns = listOfColumns(getColumns().getAllPhysicalWithSubcolumns()); + throw Exception(ErrorCodes::EMPTY_LIST_OF_COLUMNS_QUERIED, + "Empty list of columns queried. There are columns: {}", list_of_columns); + } - const auto columns_map = getColumnsMap(available_columns); + const auto virtuals_map = getColumnsMap(virtuals); + UniqueStrings unique_names; - auto unique_names = initUniqueStrings(); for (const auto & name : column_names) { - if (columns_map.end() == columns_map.find(name)) - throw Exception( - "There is no column with name " + backQuote(name) + " in table " + storage_id.getNameForLogs() + ". There are columns: " + list_of_columns, - ErrorCodes::NO_SUCH_COLUMN_IN_TABLE); + bool has_column = getColumns().hasColumnOrSubcolumn(ColumnsDescription::AllPhysical, name) + || virtuals_map.find(name) != nullptr; + + if (!has_column) + { + auto list_of_columns = listOfColumns(getColumns().getAllPhysicalWithSubcolumns()); + throw Exception(ErrorCodes::NO_SUCH_COLUMN_IN_TABLE, + "There is no column with name {} in table {}. There are columns: {}", + backQuote(name), storage_id.getNameForLogs(), list_of_columns); + } if (unique_names.end() != unique_names.find(name)) - throw Exception("Column " + name + " queried more than once", ErrorCodes::COLUMN_QUERIED_MORE_THAN_ONCE); + throw Exception(ErrorCodes::COLUMN_QUERIED_MORE_THAN_ONCE, "Column {} queried more than once", name); + unique_names.insert(name); } } @@ -537,23 +532,31 @@ void StorageInMemoryMetadata::check(const NamesAndTypesList & provided_columns) const NamesAndTypesList & available_columns = getColumns().getAllPhysical(); const auto columns_map = getColumnsMap(available_columns); - auto unique_names = initUniqueStrings(); + UniqueStrings unique_names; + for (const NameAndTypePair & column : provided_columns) { - auto it = columns_map.find(column.name); + const auto * it = columns_map.find(column.name); if (columns_map.end() == it) throw Exception( - "There is no column with name " + column.name + ". There are columns: " + listOfColumns(available_columns), - ErrorCodes::NO_SUCH_COLUMN_IN_TABLE); + ErrorCodes::NO_SUCH_COLUMN_IN_TABLE, + "There is no column with name {}. There are columns: {}", + column.name, + listOfColumns(available_columns)); - if (!column.type->equals(*it->second)) + if (!column.type->equals(*it->getMapped())) throw Exception( - "Type mismatch for column " + column.name + ". Column has type " + it->second->getName() + ", got type " - + column.type->getName(), - ErrorCodes::TYPE_MISMATCH); + ErrorCodes::TYPE_MISMATCH, + "Type mismatch for column {}. Column has type {}, got type {}", + column.name, + it->getMapped()->getName(), + column.type->getName()); if (unique_names.end() != unique_names.find(column.name)) - throw Exception("Column " + column.name + " queried more than once", ErrorCodes::COLUMN_QUERIED_MORE_THAN_ONCE); + throw Exception(ErrorCodes::COLUMN_QUERIED_MORE_THAN_ONCE, + "Column {} queried more than once", + column.name); + unique_names.insert(column.name); } } @@ -569,26 +572,38 @@ void StorageInMemoryMetadata::check(const NamesAndTypesList & provided_columns, "Empty list of columns queried. There are columns: " + listOfColumns(available_columns), ErrorCodes::EMPTY_LIST_OF_COLUMNS_QUERIED); - auto unique_names = initUniqueStrings(); + UniqueStrings unique_names; + for (const String & name : column_names) { - auto it = provided_columns_map.find(name); + const auto * it = provided_columns_map.find(name); if (provided_columns_map.end() == it) continue; - auto jt = available_columns_map.find(name); + const auto * jt = available_columns_map.find(name); if (available_columns_map.end() == jt) throw Exception( - "There is no column with name " + name + ". There are columns: " + listOfColumns(available_columns), - ErrorCodes::NO_SUCH_COLUMN_IN_TABLE); + ErrorCodes::NO_SUCH_COLUMN_IN_TABLE, + "There is no column with name {}. There are columns: {}", + name, + listOfColumns(available_columns)); - if (!it->second->equals(*jt->second)) + const auto & provided_column_type = *it->getMapped(); + const auto & available_column_type = *jt->getMapped(); + + if (!provided_column_type.equals(available_column_type)) throw Exception( - "Type mismatch for column " + name + ". Column has type " + jt->second->getName() + ", got type " + it->second->getName(), - ErrorCodes::TYPE_MISMATCH); + ErrorCodes::TYPE_MISMATCH, + "Type mismatch for column {}. Column has type {}, got type {}", + name, + provided_column_type.getName(), + available_column_type.getName()); if (unique_names.end() != unique_names.find(name)) - throw Exception("Column " + name + " queried more than once", ErrorCodes::COLUMN_QUERIED_MORE_THAN_ONCE); + throw Exception(ErrorCodes::COLUMN_QUERIED_MORE_THAN_ONCE, + "Column {} queried more than once", + name); + unique_names.insert(name); } } @@ -609,17 +624,21 @@ void StorageInMemoryMetadata::check(const Block & block, bool need_all) const names_in_block.insert(column.name); - auto it = columns_map.find(column.name); + const auto * it = columns_map.find(column.name); if (columns_map.end() == it) throw Exception( - "There is no column with name " + column.name + ". There are columns: " + listOfColumns(available_columns), - ErrorCodes::NO_SUCH_COLUMN_IN_TABLE); + ErrorCodes::NO_SUCH_COLUMN_IN_TABLE, + "There is no column with name {}. There are columns: {}", + column.name, + listOfColumns(available_columns)); - if (!column.type->equals(*it->second)) + if (!column.type->equals(*it->getMapped())) throw Exception( - "Type mismatch for column " + column.name + ". Column has type " + it->second->getName() + ", got type " - + column.type->getName(), - ErrorCodes::TYPE_MISMATCH); + ErrorCodes::TYPE_MISMATCH, + "Type mismatch for column {}. Column has type {}, got type {}", + column.name, + it->getMapped()->getName(), + column.type->getName()); } if (need_all && names_in_block.size() < columns_map.size()) diff --git a/src/Storages/StorageInMemoryMetadata.h b/src/Storages/StorageInMemoryMetadata.h index 861cb5866ee..d0d60f608d7 100644 --- a/src/Storages/StorageInMemoryMetadata.h +++ b/src/Storages/StorageInMemoryMetadata.h @@ -28,7 +28,6 @@ struct StorageInMemoryMetadata ConstraintsDescription constraints; /// Table projections. Currently supported for MergeTree only. ProjectionsDescription projections; - mutable const ProjectionDescription * selected_projection{}; /// PARTITION BY expression. Currently supported for MergeTree only. KeyDescription partition_key; /// PRIMARY KEY expression. If absent, than equal to order_by_ast. diff --git a/src/Storages/StorageInput.cpp b/src/Storages/StorageInput.cpp index 63b440aff08..d707d7a6cdf 100644 --- a/src/Storages/StorageInput.cpp +++ b/src/Storages/StorageInput.cpp @@ -3,7 +3,6 @@ #include -#include #include #include #include @@ -46,9 +45,9 @@ public: }; -void StorageInput::setInputStream(BlockInputStreamPtr input_stream_) +void StorageInput::setPipe(Pipe pipe_) { - input_stream = input_stream_; + pipe = std::move(pipe_); } @@ -71,10 +70,10 @@ Pipe StorageInput::read( return Pipe(std::make_shared(query_context, metadata_snapshot->getSampleBlock())); } - if (!input_stream) + if (pipe.empty()) throw Exception("Input stream is not initialized, input() must be used only in INSERT SELECT query", ErrorCodes::INVALID_USAGE_OF_INPUT); - return Pipe(std::make_shared(input_stream)); + return std::move(pipe); } } diff --git a/src/Storages/StorageInput.h b/src/Storages/StorageInput.h index 4b04907bea2..c3c40cab7a5 100644 --- a/src/Storages/StorageInput.h +++ b/src/Storages/StorageInput.h @@ -2,6 +2,7 @@ #include #include +#include namespace DB { @@ -15,7 +16,7 @@ public: String getName() const override { return "Input"; } /// A table will read from this stream. - void setInputStream(BlockInputStreamPtr input_stream_); + void setPipe(Pipe pipe_); Pipe read( const Names & column_names, @@ -27,7 +28,7 @@ public: unsigned num_streams) override; private: - BlockInputStreamPtr input_stream; + Pipe pipe; protected: StorageInput(const StorageID & table_id, const ColumnsDescription & columns_); diff --git a/src/Storages/StorageJoin.cpp b/src/Storages/StorageJoin.cpp index c3061ce9c51..5c5b12c7475 100644 --- a/src/Storages/StorageJoin.cpp +++ b/src/Storages/StorageJoin.cpp @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include @@ -68,7 +67,7 @@ StorageJoin::StorageJoin( restore(); } -BlockOutputStreamPtr StorageJoin::write(const ASTPtr & query, const StorageMetadataPtr & metadata_snapshot, ContextPtr context) +SinkToStoragePtr StorageJoin::write(const ASTPtr & query, const StorageMetadataPtr & metadata_snapshot, ContextPtr context) { std::lock_guard mutate_lock(mutate_mutex); return StorageSetOrJoinBase::write(query, metadata_snapshot, context); diff --git a/src/Storages/StorageJoin.h b/src/Storages/StorageJoin.h index cf28e9d4dd0..6a08773ecc8 100644 --- a/src/Storages/StorageJoin.h +++ b/src/Storages/StorageJoin.h @@ -45,7 +45,7 @@ public: /// (but not during processing whole query, it's safe for joinGet that doesn't involve `used_flags` from HashJoin) ColumnWithTypeAndName joinGet(const Block & block, const Block & block_with_columns_to_add) const; - BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & metadata_snapshot, ContextPtr context) override; + SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & metadata_snapshot, ContextPtr context) override; Pipe read( const Names & column_names, diff --git a/src/Storages/StorageLog.cpp b/src/Storages/StorageLog.cpp index 61fbbbc3086..0e156f24cc2 100644 --- a/src/Storages/StorageLog.cpp +++ b/src/Storages/StorageLog.cpp @@ -16,7 +16,6 @@ #include -#include #include #include @@ -26,8 +25,10 @@ #include "StorageLogSettings.h" #include #include +#include #include +#include #define DBMS_STORAGE_LOG_DATA_FILE_EXTENSION ".bin" @@ -204,12 +205,13 @@ void LogSource::readData(const NameAndTypePair & name_and_type, ColumnPtr & colu } -class LogBlockOutputStream final : public IBlockOutputStream +class LogSink final : public SinkToStorage { public: - explicit LogBlockOutputStream( + explicit LogSink( StorageLog & storage_, const StorageMetadataPtr & metadata_snapshot_, std::unique_lock && lock_) - : storage(storage_) + : SinkToStorage(metadata_snapshot_->getSampleBlock()) + , storage(storage_) , metadata_snapshot(metadata_snapshot_) , lock(std::move(lock_)) , marks_stream( @@ -227,7 +229,9 @@ public: } } - ~LogBlockOutputStream() override + String getName() const override { return "LogSink"; } + + ~LogSink() override { try { @@ -244,9 +248,8 @@ public: } } - Block getHeader() const override { return metadata_snapshot->getSampleBlock(); } - void write(const Block & block) override; - void writeSuffix() override; + void consume(Chunk chunk) override; + void onFinish() override; private: StorageLog & storage; @@ -301,8 +304,9 @@ private: }; -void LogBlockOutputStream::write(const Block & block) +void LogSink::consume(Chunk chunk) { + auto block = getPort().getHeader().cloneWithColumns(chunk.detachColumns()); metadata_snapshot->check(block, true); /// The set of written offset columns so that you do not write shared offsets of columns for nested structures multiple times @@ -321,14 +325,14 @@ void LogBlockOutputStream::write(const Block & block) } -void LogBlockOutputStream::writeSuffix() +void LogSink::onFinish() { if (done) return; WrittenStreams written_streams; ISerialization::SerializeBinaryBulkSettings settings; - for (const auto & column : getHeader()) + for (const auto & column : getPort().getHeader()) { auto it = serialize_states.find(column.name); if (it != serialize_states.end()) @@ -365,7 +369,7 @@ void LogBlockOutputStream::writeSuffix() } -ISerialization::OutputStreamGetter LogBlockOutputStream::createStreamGetter(const NameAndTypePair & name_and_type, +ISerialization::OutputStreamGetter LogSink::createStreamGetter(const NameAndTypePair & name_and_type, WrittenStreams & written_streams) { return [&] (const ISerialization::SubstreamPath & path) -> WriteBuffer * @@ -383,7 +387,7 @@ ISerialization::OutputStreamGetter LogBlockOutputStream::createStreamGetter(cons } -void LogBlockOutputStream::writeData(const NameAndTypePair & name_and_type, const IColumn & column, +void LogSink::writeData(const NameAndTypePair & name_and_type, const IColumn & column, MarksForColumns & out_marks, WrittenStreams & written_streams) { ISerialization::SerializeBinaryBulkSettings settings; @@ -442,7 +446,7 @@ void LogBlockOutputStream::writeData(const NameAndTypePair & name_and_type, cons } -void LogBlockOutputStream::writeMarks(MarksForColumns && marks) +void LogSink::writeMarks(MarksForColumns && marks) { if (marks.size() != storage.file_count) throw Exception("Wrong number of marks generated from block. Makes no sense.", ErrorCodes::LOGICAL_ERROR); @@ -659,7 +663,7 @@ Pipe StorageLog::read( auto lock_timeout = getLockTimeout(context); loadMarks(lock_timeout); - auto all_columns = metadata_snapshot->getColumns().getAllWithSubcolumns().addTypes(column_names); + auto all_columns = metadata_snapshot->getColumns().getByNames(ColumnsDescription::All, column_names, true); all_columns = Nested::convertToSubcolumns(all_columns); std::shared_lock lock(rwlock, lock_timeout); @@ -697,7 +701,7 @@ Pipe StorageLog::read( return Pipe::unitePipes(std::move(pipes)); } -BlockOutputStreamPtr StorageLog::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr context) +SinkToStoragePtr StorageLog::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr context) { auto lock_timeout = getLockTimeout(context); loadMarks(lock_timeout); @@ -706,7 +710,7 @@ BlockOutputStreamPtr StorageLog::write(const ASTPtr & /*query*/, const StorageMe if (!lock) throw Exception("Lock timeout exceeded", ErrorCodes::TIMEOUT_EXCEEDED); - return std::make_shared(*this, metadata_snapshot, std::move(lock)); + return std::make_shared(*this, metadata_snapshot, std::move(lock)); } CheckResults StorageLog::checkData(const ASTPtr & /* query */, ContextPtr context) @@ -719,6 +723,34 @@ CheckResults StorageLog::checkData(const ASTPtr & /* query */, ContextPtr contex } +IStorage::ColumnSizeByName StorageLog::getColumnSizes() const +{ + std::shared_lock lock(rwlock, std::chrono::seconds(DBMS_DEFAULT_LOCK_ACQUIRE_TIMEOUT_SEC)); + if (!lock) + throw Exception("Lock timeout exceeded", ErrorCodes::TIMEOUT_EXCEEDED); + + ColumnSizeByName column_sizes; + FileChecker::Map file_sizes = file_checker.getFileSizes(); + + for (const auto & column : getInMemoryMetadata().getColumns().getAllPhysical()) + { + ISerialization::StreamCallback stream_callback = [&, this] (const ISerialization::SubstreamPath & substream_path) + { + String stream_name = ISerialization::getFileNameForStream(column, substream_path); + ColumnSize & size = column_sizes[column.name]; + auto it = files.find(stream_name); + if (it != files.end()) + size.data_compressed += file_sizes[fileName(it->second.data_file_path)]; + }; + + ISerialization::SubstreamPath substream_path; + auto serialization = column.type->getDefaultSerialization(); + serialization->enumerateStreams(stream_callback, substream_path); + } + + return column_sizes; +} + void registerStorageLog(StorageFactory & factory) { StorageFactory::StorageFeatures features{ diff --git a/src/Storages/StorageLog.h b/src/Storages/StorageLog.h index 6fea00edefd..116bdc31520 100644 --- a/src/Storages/StorageLog.h +++ b/src/Storages/StorageLog.h @@ -19,7 +19,7 @@ namespace DB class StorageLog final : public shared_ptr_helper, public IStorage { friend class LogSource; - friend class LogBlockOutputStream; + friend class LogSink; friend struct shared_ptr_helper; public: @@ -34,7 +34,7 @@ public: size_t max_block_size, unsigned num_streams) override; - BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; + SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; void rename(const String & new_path_to_table_data, const StorageID & new_table_id) override; @@ -45,6 +45,7 @@ public: bool storesDataOnDisk() const override { return true; } Strings getDataPaths() const override { return {DB::fullPath(disk, table_path)}; } bool supportsSubcolumns() const override { return true; } + ColumnSizeByName getColumnSizes() const override; protected: /** Attach the table with the appropriate name, along the appropriate path (with / at the end), @@ -87,7 +88,7 @@ private: DiskPtr disk; String table_path; - std::shared_timed_mutex rwlock; + mutable std::shared_timed_mutex rwlock; Files files; diff --git a/src/Storages/StorageMaterializeMySQL.cpp b/src/Storages/StorageMaterializedMySQL.cpp similarity index 77% rename from src/Storages/StorageMaterializeMySQL.cpp rename to src/Storages/StorageMaterializedMySQL.cpp index 5b371fe3fb8..52f53b9ceee 100644 --- a/src/Storages/StorageMaterializeMySQL.cpp +++ b/src/Storages/StorageMaterializedMySQL.cpp @@ -4,7 +4,7 @@ #if USE_MYSQL -#include +#include #include #include @@ -21,14 +21,14 @@ #include #include -#include +#include #include #include namespace DB { -StorageMaterializeMySQL::StorageMaterializeMySQL(const StoragePtr & nested_storage_, const IDatabase * database_) +StorageMaterializedMySQL::StorageMaterializedMySQL(const StoragePtr & nested_storage_, const IDatabase * database_) : StorageProxy(nested_storage_->getStorageID()), nested_storage(nested_storage_), database(database_) { StorageInMemoryMetadata in_memory_metadata; @@ -36,7 +36,12 @@ StorageMaterializeMySQL::StorageMaterializeMySQL(const StoragePtr & nested_stora setInMemoryMetadata(in_memory_metadata); } -Pipe StorageMaterializeMySQL::read( +bool StorageMaterializedMySQL::needRewriteQueryWithFinal(const Names & column_names) const +{ + return needRewriteQueryWithFinalForStorage(column_names, nested_storage); +} + +Pipe StorageMaterializedMySQL::read( const Names & column_names, const StorageMetadataPtr & metadata_snapshot, SelectQueryInfo & query_info, @@ -47,18 +52,19 @@ Pipe StorageMaterializeMySQL::read( { /// If the background synchronization thread has exception. rethrowSyncExceptionIfNeed(database); + return readFinalFromNestedStorage(nested_storage, column_names, metadata_snapshot, query_info, context, processed_stage, max_block_size, num_streams); } -NamesAndTypesList StorageMaterializeMySQL::getVirtuals() const +NamesAndTypesList StorageMaterializedMySQL::getVirtuals() const { /// If the background synchronization thread has exception. rethrowSyncExceptionIfNeed(database); return nested_storage->getVirtuals(); } -IStorage::ColumnSizeByName StorageMaterializeMySQL::getColumnSizes() const +IStorage::ColumnSizeByName StorageMaterializedMySQL::getColumnSizes() const { auto sizes = nested_storage->getColumnSizes(); auto nested_header = nested_storage->getInMemoryMetadataPtr()->getSampleBlock(); diff --git a/src/Storages/StorageMaterializeMySQL.h b/src/Storages/StorageMaterializedMySQL.h similarity index 61% rename from src/Storages/StorageMaterializeMySQL.h rename to src/Storages/StorageMaterializedMySQL.h index 45221ed5b76..95ef4ad97fa 100644 --- a/src/Storages/StorageMaterializeMySQL.h +++ b/src/Storages/StorageMaterializedMySQL.h @@ -16,19 +16,21 @@ namespace ErrorCodes extern const int NOT_IMPLEMENTED; } -class StorageMaterializeMySQL final : public shared_ptr_helper, public StorageProxy +class StorageMaterializedMySQL final : public shared_ptr_helper, public StorageProxy { - friend struct shared_ptr_helper; + friend struct shared_ptr_helper; public: - String getName() const override { return "MaterializeMySQL"; } + String getName() const override { return "MaterializedMySQL"; } - StorageMaterializeMySQL(const StoragePtr & nested_storage_, const IDatabase * database_); + StorageMaterializedMySQL(const StoragePtr & nested_storage_, const IDatabase * database_); + + bool needRewriteQueryWithFinal(const Names & column_names) const override; Pipe read( const Names & column_names, const StorageMetadataPtr & metadata_snapshot, SelectQueryInfo & query_info, ContextPtr context, QueryProcessingStage::Enum processed_stage, size_t max_block_size, unsigned num_streams) override; - BlockOutputStreamPtr write(const ASTPtr &, const StorageMetadataPtr &, ContextPtr) override { throwNotAllowed(); } + SinkToStoragePtr write(const ASTPtr &, const StorageMetadataPtr &, ContextPtr) override { throwNotAllowed(); } NamesAndTypesList getVirtuals() const override; ColumnSizeByName getColumnSizes() const override; @@ -40,7 +42,7 @@ public: private: [[noreturn]] void throwNotAllowed() const { - throw Exception("This method is not allowed for MaterializeMySQL", ErrorCodes::NOT_IMPLEMENTED); + throw Exception("This method is not allowed for MaterializedMySQL", ErrorCodes::NOT_IMPLEMENTED); } StoragePtr nested_storage; diff --git a/src/Storages/StorageMaterializedView.cpp b/src/Storages/StorageMaterializedView.cpp index 76fa4b8e20b..f72f6fee180 100644 --- a/src/Storages/StorageMaterializedView.cpp +++ b/src/Storages/StorageMaterializedView.cpp @@ -12,7 +12,6 @@ #include #include #include -#include #include #include @@ -27,6 +26,7 @@ #include #include #include +#include namespace DB { @@ -215,16 +215,16 @@ void StorageMaterializedView::read( } } -BlockOutputStreamPtr StorageMaterializedView::write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr local_context) +SinkToStoragePtr StorageMaterializedView::write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr local_context) { auto storage = getTargetTable(); auto lock = storage->lockForShare(local_context->getCurrentQueryId(), local_context->getSettingsRef().lock_acquire_timeout); auto metadata_snapshot = storage->getInMemoryMetadataPtr(); - auto stream = storage->write(query, metadata_snapshot, local_context); + auto sink = storage->write(query, metadata_snapshot, local_context); - stream->addTableLock(lock); - return stream; + sink->addTableLock(lock); + return sink; } diff --git a/src/Storages/StorageMaterializedView.h b/src/Storages/StorageMaterializedView.h index 1f1729b05f7..d282ece7f56 100644 --- a/src/Storages/StorageMaterializedView.h +++ b/src/Storages/StorageMaterializedView.h @@ -34,7 +34,7 @@ public: return target_table->mayBenefitFromIndexForIn(left_in_operand, query_context, metadata_snapshot); } - BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; + SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; void drop() override; void dropInnerTableIfAny(bool no_delay, ContextPtr local_context) override; diff --git a/src/Storages/StorageMemory.cpp b/src/Storages/StorageMemory.cpp index 9e1ae24fc75..6823f661984 100644 --- a/src/Storages/StorageMemory.cpp +++ b/src/Storages/StorageMemory.cpp @@ -1,8 +1,6 @@ #include #include -#include - #include #include #include @@ -11,6 +9,7 @@ #include #include #include +#include namespace DB @@ -35,7 +34,7 @@ public: std::shared_ptr> parallel_execution_index_, InitializerFunc initializer_func_ = {}) : SourceWithProgress(metadata_snapshot->getSampleBlockForColumns(column_names_, storage.getVirtuals(), storage.getStorageID())) - , column_names_and_types(metadata_snapshot->getColumns().getAllWithSubcolumns().addTypes(std::move(column_names_))) + , column_names_and_types(metadata_snapshot->getColumns().getByNames(ColumnsDescription::All, column_names_, true)) , data(data_) , parallel_execution_index(parallel_execution_index_) , initializer_func(std::move(initializer_func_)) @@ -100,21 +99,23 @@ private: }; -class MemoryBlockOutputStream : public IBlockOutputStream +class MemorySink : public SinkToStorage { public: - MemoryBlockOutputStream( + MemorySink( StorageMemory & storage_, const StorageMetadataPtr & metadata_snapshot_) - : storage(storage_) + : SinkToStorage(metadata_snapshot_->getSampleBlock()) + , storage(storage_) , metadata_snapshot(metadata_snapshot_) { } - Block getHeader() const override { return metadata_snapshot->getSampleBlock(); } + String getName() const override { return "MemorySink"; } - void write(const Block & block) override + void consume(Chunk chunk) override { + auto block = getPort().getHeader().cloneWithColumns(chunk.getColumns()); metadata_snapshot->check(block, true); if (storage.compress) @@ -131,7 +132,7 @@ public: } } - void writeSuffix() override + void onFinish() override { size_t inserted_bytes = 0; size_t inserted_rows = 0; @@ -228,9 +229,9 @@ Pipe StorageMemory::read( } -BlockOutputStreamPtr StorageMemory::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr /*context*/) +SinkToStoragePtr StorageMemory::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr /*context*/) { - return std::make_shared(*this, metadata_snapshot); + return std::make_shared(*this, metadata_snapshot); } diff --git a/src/Storages/StorageMemory.h b/src/Storages/StorageMemory.h index 47f9a942b82..88539d0e731 100644 --- a/src/Storages/StorageMemory.h +++ b/src/Storages/StorageMemory.h @@ -22,7 +22,7 @@ namespace DB */ class StorageMemory final : public shared_ptr_helper, public IStorage { -friend class MemoryBlockOutputStream; +friend class MemorySink; friend struct shared_ptr_helper; public: @@ -47,7 +47,7 @@ public: bool hasEvenlyDistributedRead() const override { return true; } - BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & metadata_snapshot, ContextPtr context) override; + SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & metadata_snapshot, ContextPtr context) override; void drop() override; diff --git a/src/Storages/StorageMerge.cpp b/src/Storages/StorageMerge.cpp index a076393e7e6..243294351f3 100644 --- a/src/Storages/StorageMerge.cpp +++ b/src/Storages/StorageMerge.cpp @@ -47,13 +47,16 @@ StorageMerge::StorageMerge( const StorageID & table_id_, const ColumnsDescription & columns_, const String & comment, - const String & source_database_, - const Strings & source_tables_, + const String & source_database_name_or_regexp_, + bool database_is_regexp_, + const DbToTableSetMap & source_databases_and_tables_, ContextPtr context_) : IStorage(table_id_) , WithContext(context_->getGlobalContext()) - , source_database(source_database_) - , source_tables(std::in_place, source_tables_.begin(), source_tables_.end()) + , source_database_regexp(source_database_name_or_regexp_) + , source_databases_and_tables(source_databases_and_tables_) + , source_database_name_or_regexp(source_database_name_or_regexp_) + , database_is_regexp(database_is_regexp_) { StorageInMemoryMetadata storage_metadata; storage_metadata.setColumns(columns_); @@ -65,13 +68,16 @@ StorageMerge::StorageMerge( const StorageID & table_id_, const ColumnsDescription & columns_, const String & comment, - const String & source_database_, + const String & source_database_name_or_regexp_, + bool database_is_regexp_, const String & source_table_regexp_, ContextPtr context_) : IStorage(table_id_) , WithContext(context_->getGlobalContext()) - , source_database(source_database_) + , source_database_regexp(source_database_name_or_regexp_) , source_table_regexp(source_table_regexp_) + , source_database_name_or_regexp(source_database_name_or_regexp_) + , database_is_regexp(database_is_regexp_) { StorageInMemoryMetadata storage_metadata; storage_metadata.setColumns(columns_); @@ -82,15 +88,18 @@ StorageMerge::StorageMerge( template StoragePtr StorageMerge::getFirstTable(F && predicate) const { - auto iterator = getDatabaseIterator(getContext()); + auto database_table_iterators = getDatabaseIterators(getContext()); - while (iterator->isValid()) + for (auto & iterator : database_table_iterators) { - const auto & table = iterator->table(); - if (table.get() != this && predicate(table)) - return table; + while (iterator->isValid()) + { + const auto & table = iterator->table(); + if (table.get() != this && predicate(table)) + return table; - iterator->next(); + iterator->next(); + } } return {}; @@ -112,7 +121,7 @@ bool StorageMerge::mayBenefitFromIndexForIn(const ASTPtr & left_in_operand, Cont size_t i = 0; for (const auto & table : selected_tables) { - const auto & storage_ptr = std::get<0>(table); + const auto & storage_ptr = std::get<1>(table); auto metadata_snapshot = storage_ptr->getInMemoryMetadataPtr(); if (storage_ptr->mayBenefitFromIndexForIn(left_in_operand, query_context, metadata_snapshot)) return true; @@ -145,22 +154,25 @@ QueryProcessingStage::Enum StorageMerge::getQueryProcessingStage( auto stage_in_source_tables = QueryProcessingStage::FetchColumns; - DatabaseTablesIteratorPtr iterator = getDatabaseIterator(local_context); + DatabaseTablesIterators database_table_iterators = getDatabaseIterators(local_context); size_t selected_table_size = 0; - while (iterator->isValid()) + for (const auto & iterator : database_table_iterators) { - const auto & table = iterator->table(); - if (table && table.get() != this) + while (iterator->isValid()) { - ++selected_table_size; - stage_in_source_tables = std::max( - stage_in_source_tables, - table->getQueryProcessingStage(local_context, to_stage, table->getInMemoryMetadataPtr(), query_info)); - } + const auto & table = iterator->table(); + if (table && table.get() != this) + { + ++selected_table_size; + stage_in_source_tables = std::max( + stage_in_source_tables, + table->getQueryProcessingStage(local_context, to_stage, table->getInMemoryMetadataPtr(), query_info)); + } - iterator->next(); + iterator->next(); + } } return selected_table_size == 1 ? stage_in_source_tables : std::min(stage_in_source_tables, QueryProcessingStage::WithMergeableState); @@ -178,13 +190,16 @@ Pipe StorageMerge::read( { Pipes pipes; + bool has_database_virtual_column = false; bool has_table_virtual_column = false; Names real_column_names; real_column_names.reserve(column_names.size()); for (const auto & column_name : column_names) { - if (column_name == "_table" && isVirtualColumn(column_name, metadata_snapshot)) + if (column_name == "_database" && isVirtualColumn(column_name, metadata_snapshot)) + has_database_virtual_column = true; + else if (column_name == "_table" && isVirtualColumn(column_name, metadata_snapshot)) has_table_virtual_column = true; else real_column_names.push_back(column_name); @@ -202,12 +217,24 @@ Pipe StorageMerge::read( /** First we make list of selected tables to find out its size. * This is necessary to correctly pass the recommended number of threads to each table. */ - StorageListWithLocks selected_tables = getSelectedTables(local_context, query_info.query, has_table_virtual_column); + StorageListWithLocks selected_tables + = getSelectedTables(local_context, query_info.query, has_database_virtual_column, has_table_virtual_column); if (selected_tables.empty()) /// FIXME: do we support sampling in this case? return createSources( - {}, query_info, processed_stage, max_block_size, header, {}, {}, real_column_names, modified_context, 0, has_table_virtual_column); + {}, + query_info, + processed_stage, + max_block_size, + header, + {}, + {}, + real_column_names, + modified_context, + 0, + has_database_virtual_column, + has_table_virtual_column); size_t tables_count = selected_tables.size(); Float64 num_streams_multiplier @@ -220,7 +247,7 @@ Pipe StorageMerge::read( { for (auto it = selected_tables.begin(); it != selected_tables.end(); ++it) { - auto storage_ptr = std::get<0>(*it); + auto storage_ptr = std::get<1>(*it); auto storage_metadata_snapshot = storage_ptr->getInMemoryMetadataPtr(); auto current_info = query_info.order_optimizer->getInputOrder(storage_metadata_snapshot, local_context); if (it == selected_tables.begin()) @@ -245,7 +272,7 @@ Pipe StorageMerge::read( remaining_streams -= current_streams; current_streams = std::max(size_t(1), current_streams); - const auto & storage = std::get<0>(table); + const auto & storage = std::get<1>(table); /// If sampling requested, then check that table supports it. if (query_info.query->as()->sampleSize() && !storage->supportsSampling()) @@ -293,9 +320,18 @@ Pipe StorageMerge::read( } auto source_pipe = createSources( - storage_metadata_snapshot, query_info, processed_stage, - max_block_size, header, aliases, table, required_columns.empty() ? real_column_names : required_columns, - modified_context, current_streams, has_table_virtual_column); + storage_metadata_snapshot, + query_info, + processed_stage, + max_block_size, + header, + aliases, + table, + required_columns.empty() ? real_column_names : required_columns, + modified_context, + current_streams, + has_database_virtual_column, + has_table_virtual_column); pipes.emplace_back(std::move(source_pipe)); } @@ -321,10 +357,11 @@ Pipe StorageMerge::createSources( Names & real_column_names, ContextMutablePtr modified_context, size_t streams_num, + bool has_database_virtual_column, bool has_table_virtual_column, bool concat_streams) { - const auto & [storage, struct_lock, table_name] = storage_with_lock; + const auto & [database_name, storage, struct_lock, table_name] = storage_with_lock; SelectQueryInfo modified_query_info = query_info; modified_query_info.query = query_info.query->clone(); @@ -336,6 +373,7 @@ Pipe StorageMerge::createSources( modified_query_info.syntax_analyzer_result = std::make_shared(std::move(new_analyzer_res)); VirtualColumnUtils::rewriteEntityInAst(modified_query_info.query, "_table", table_name); + VirtualColumnUtils::rewriteEntityInAst(modified_query_info.query, "_database", database_name); Pipe pipe; @@ -350,6 +388,13 @@ Pipe StorageMerge::createSources( return pipe; } + if (!modified_select.final() && storage->needRewriteQueryWithFinal(real_column_names)) + { + /// NOTE: It may not work correctly in some cases, because query was analyzed without final. + /// However, it's needed for MaterializedMySQL and it's unlikely that someone will use it with Merge tables. + modified_select.setFinal(); + } + auto storage_stage = storage->getQueryProcessingStage(modified_context, QueryProcessingStage::Complete, metadata_snapshot, modified_query_info); if (processed_stage <= storage_stage) @@ -369,7 +414,7 @@ Pipe StorageMerge::createSources( } else if (processed_stage > storage_stage) { - modified_select.replaceDatabaseAndTable(source_database, table_name); + modified_select.replaceDatabaseAndTable(database_name, table_name); /// Maximum permissible parallelism is streams_num modified_context->setSetting("max_threads", streams_num); @@ -394,6 +439,24 @@ Pipe StorageMerge::createSources( // Using concat instead. pipe.addTransform(std::make_shared(pipe.getHeader(), pipe.numOutputPorts())); + if (has_database_virtual_column) + { + ColumnWithTypeAndName column; + column.name = "_database"; + column.type = std::make_shared(); + column.column = column.type->createColumnConst(0, Field(database_name)); + + auto adding_column_dag = ActionsDAG::makeAddingColumnActions(std::move(column)); + auto adding_column_actions = std::make_shared( + std::move(adding_column_dag), + ExpressionActionsSettings::fromContext(modified_context, CompileExpressions::yes)); + + pipe.addSimpleTransform([&](const Block & stream_header) + { + return std::make_shared(stream_header, adding_column_actions); + }); + } + if (has_table_virtual_column) { ColumnWithTypeAndName column; @@ -425,41 +488,67 @@ Pipe StorageMerge::createSources( } StorageMerge::StorageListWithLocks StorageMerge::getSelectedTables( - ContextPtr query_context, - const ASTPtr & query /* = nullptr */, - bool filter_by_virtual_column /* = false */) const + ContextPtr query_context, + const ASTPtr & query /* = nullptr */, + bool filter_by_database_virtual_column /* = false */, + bool filter_by_table_virtual_column /* = false */) const { - assert(!filter_by_virtual_column || query); + assert(!filter_by_database_virtual_column || !filter_by_table_virtual_column || query); const Settings & settings = query_context->getSettingsRef(); StorageListWithLocks selected_tables; - DatabaseTablesIteratorPtr iterator = getDatabaseIterator(getContext()); + DatabaseTablesIterators database_table_iterators = getDatabaseIterators(getContext()); + MutableColumnPtr database_name_virtual_column; MutableColumnPtr table_name_virtual_column; - if (filter_by_virtual_column) - table_name_virtual_column = ColumnString::create(); - - while (iterator->isValid()) + if (filter_by_database_virtual_column) { - StoragePtr storage = iterator->table(); - if (!storage) - continue; - - if (query && query->as()->prewhere() && !storage->supportsPrewhere()) - throw Exception("Storage " + storage->getName() + " doesn't support PREWHERE.", ErrorCodes::ILLEGAL_PREWHERE); - - if (storage.get() != this) - { - auto table_lock = storage->lockForShare(query_context->getCurrentQueryId(), settings.lock_acquire_timeout); - selected_tables.emplace_back(storage, std::move(table_lock), iterator->name()); - if (filter_by_virtual_column) - table_name_virtual_column->insert(iterator->name()); - } - - iterator->next(); + database_name_virtual_column = ColumnString::create(); } - if (filter_by_virtual_column) + if (filter_by_table_virtual_column) + { + table_name_virtual_column = ColumnString::create(); + } + + for (const auto & iterator : database_table_iterators) + { + if (filter_by_database_virtual_column) + database_name_virtual_column->insert(iterator->databaseName()); + while (iterator->isValid()) + { + StoragePtr storage = iterator->table(); + if (!storage) + continue; + + if (query && query->as()->prewhere() && !storage->supportsPrewhere()) + throw Exception("Storage " + storage->getName() + " doesn't support PREWHERE.", ErrorCodes::ILLEGAL_PREWHERE); + + if (storage.get() != this) + { + auto table_lock = storage->lockForShare(query_context->getCurrentQueryId(), settings.lock_acquire_timeout); + selected_tables.emplace_back(iterator->databaseName(), storage, std::move(table_lock), iterator->name()); + if (filter_by_table_virtual_column) + table_name_virtual_column->insert(iterator->name()); + } + + iterator->next(); + } + } + + if (filter_by_database_virtual_column) + { + /// Filter names of selected tables if there is a condition on "_database" virtual column in WHERE clause + Block virtual_columns_block + = Block{ColumnWithTypeAndName(std::move(database_name_virtual_column), std::make_shared(), "_database")}; + VirtualColumnUtils::filterBlockWithQuery(query, virtual_columns_block, query_context); + auto values = VirtualColumnUtils::extractSingleValueFromBlock(virtual_columns_block, "_database"); + + /// Remove unused databases from the list + selected_tables.remove_if([&](const auto & elem) { return values.find(std::get<0>(elem)) == values.end(); }); + } + + if (filter_by_table_virtual_column) { /// Filter names of selected tables if there is a condition on "_table" virtual column in WHERE clause Block virtual_columns_block = Block{ColumnWithTypeAndName(std::move(table_name_virtual_column), std::make_shared(), "_table")}; @@ -467,13 +556,30 @@ StorageMerge::StorageListWithLocks StorageMerge::getSelectedTables( auto values = VirtualColumnUtils::extractSingleValueFromBlock(virtual_columns_block, "_table"); /// Remove unused tables from the list - selected_tables.remove_if([&] (const auto & elem) { return values.find(std::get<2>(elem)) == values.end(); }); + selected_tables.remove_if([&](const auto & elem) { return values.find(std::get<3>(elem)) == values.end(); }); } return selected_tables; } -DatabaseTablesIteratorPtr StorageMerge::getDatabaseIterator(ContextPtr local_context) const +DatabaseTablesIteratorPtr StorageMerge::getDatabaseIterator(const String & database_name, ContextPtr local_context) const +{ + auto database = DatabaseCatalog::instance().getDatabase(database_name); + + auto table_name_match = [this, &database_name](const String & table_name_) -> bool { + if (source_databases_and_tables) + { + const auto & source_tables = (*source_databases_and_tables).at(database_name); + return source_tables.count(table_name_); + } + else + return source_table_regexp->match(table_name_); + }; + + return database->getTablesIterator(local_context, table_name_match); +} + +StorageMerge::DatabaseTablesIterators StorageMerge::getDatabaseIterators(ContextPtr local_context) const { try { @@ -485,17 +591,25 @@ DatabaseTablesIteratorPtr StorageMerge::getDatabaseIterator(ContextPtr local_con throw; } - auto database = DatabaseCatalog::instance().getDatabase(source_database); + DatabaseTablesIterators database_table_iterators; - auto table_name_match = [this](const String & table_name_) -> bool + /// database_name argument is not a regexp + if (!database_is_regexp) + database_table_iterators.emplace_back(getDatabaseIterator(source_database_name_or_regexp, local_context)); + + /// database_name argument is a regexp + else { - if (source_tables) - return source_tables->count(table_name_); - else - return source_table_regexp->match(table_name_); - }; + auto databases = DatabaseCatalog::instance().getDatabases(); - return database->getTablesIterator(local_context, table_name_match); + for (const auto & db : databases) + { + if (source_database_regexp->match(db.first)) + database_table_iterators.emplace_back(getDatabaseIterator(db.first, local_context)); + } + } + + return database_table_iterators; } @@ -569,14 +683,16 @@ void StorageMerge::convertingSourceStream( auto convert_actions_dag = ActionsDAG::makeConvertingActions(pipe.getHeader().getColumnsWithTypeAndName(), header.getColumnsWithTypeAndName(), ActionsDAG::MatchColumnsMode::Name); - auto actions = std::make_shared(convert_actions_dag, ExpressionActionsSettings::fromContext(local_context, CompileExpressions::yes)); + auto actions = std::make_shared( + convert_actions_dag, + ExpressionActionsSettings::fromContext(local_context, CompileExpressions::yes)); + pipe.addSimpleTransform([&](const Block & stream_header) { return std::make_shared(stream_header, actions); }); } - auto where_expression = query->as()->where(); if (!where_expression) @@ -611,10 +727,10 @@ void StorageMerge::convertingSourceStream( IStorage::ColumnSizeByName StorageMerge::getColumnSizes() const { - auto first_materialize_mysql = getFirstTable([](const StoragePtr & table) { return table && table->getName() == "MaterializeMySQL"; }); - if (!first_materialize_mysql) + auto first_materialized_mysql = getFirstTable([](const StoragePtr & table) { return table && table->getName() == "MaterializedMySQL"; }); + if (!first_materialized_mysql) return {}; - return first_materialize_mysql->getColumnSizes(); + return first_materialized_mysql->getColumnSizes(); } void registerStorageMerge(StorageFactory & factory) @@ -632,19 +748,23 @@ void registerStorageMerge(StorageFactory & factory) " - name of source database and regexp for table names.", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); - engine_args[0] = evaluateConstantExpressionForDatabaseName(engine_args[0], args.getLocalContext()); - engine_args[1] = evaluateConstantExpressionAsLiteral(engine_args[1], args.getLocalContext()); + auto [is_regexp, database_ast] = evaluateDatabaseNameForMergeEngine(engine_args[0], args.getLocalContext()); - String source_database = engine_args[0]->as().value.safeGet(); + if (!is_regexp) + engine_args[0] = database_ast; + String source_database_name_or_regexp = database_ast->as().value.safeGet(); + + engine_args[1] = evaluateConstantExpressionAsLiteral(engine_args[1], args.getLocalContext()); String table_name_regexp = engine_args[1]->as().value.safeGet(); - return StorageMerge::create(args.table_id, args.columns, args.comment, source_database, table_name_regexp, args.getContext()); + return StorageMerge::create( + args.table_id, args.columns, args.comment, source_database_name_or_regexp, is_regexp, table_name_regexp, args.getContext()); }); } NamesAndTypesList StorageMerge::getVirtuals() const { - NamesAndTypesList virtuals{{"_table", std::make_shared()}}; + NamesAndTypesList virtuals{{"_database", std::make_shared()}, {"_table", std::make_shared()}}; auto first_table = getFirstTable([](auto && table) { return table; }); if (first_table) diff --git a/src/Storages/StorageMerge.h b/src/Storages/StorageMerge.h index 068008170ca..20460e95156 100644 --- a/src/Storages/StorageMerge.h +++ b/src/Storages/StorageMerge.h @@ -49,20 +49,32 @@ public: const ASTPtr & left_in_operand, ContextPtr query_context, const StorageMetadataPtr & metadata_snapshot) const override; private: - String source_database; - std::optional> source_tables; - std::optional source_table_regexp; + using DbToTableSetMap = std::map>; - using StorageWithLockAndName = std::tuple; + std::optional source_database_regexp; + std::optional source_table_regexp; + std::optional source_databases_and_tables; + + String source_database_name_or_regexp; + bool database_is_regexp = false; + + /// (Database, Table, Lock, TableName) + using StorageWithLockAndName = std::tuple; using StorageListWithLocks = std::list; + using DatabaseTablesIterators = std::vector; StorageMerge::StorageListWithLocks getSelectedTables( - ContextPtr query_context, const ASTPtr & query = nullptr, bool filter_by_virtual_column = false) const; + ContextPtr query_context, + const ASTPtr & query = nullptr, + bool filter_by_database_virtual_column = false, + bool filter_by_table_virtual_column = false) const; template StoragePtr getFirstTable(F && predicate) const; - DatabaseTablesIteratorPtr getDatabaseIterator(ContextPtr context) const; + DatabaseTablesIteratorPtr getDatabaseIterator(const String & database_name, ContextPtr context) const; + + DatabaseTablesIterators getDatabaseIterators(ContextPtr context) const; NamesAndTypesList getVirtuals() const override; ColumnSizeByName getColumnSizes() const override; @@ -72,15 +84,17 @@ protected: const StorageID & table_id_, const ColumnsDescription & columns_, const String & comment, - const String & source_database_, - const Strings & source_tables_, + const String & source_database_name_or_regexp_, + bool database_is_regexp_, + const DbToTableSetMap & source_databases_and_tables_, ContextPtr context_); StorageMerge( const StorageID & table_id_, const ColumnsDescription & columns_, const String & comment, - const String & source_database_, + const String & source_database_name_or_regexp_, + bool database_is_regexp_, const String & source_table_regexp_, ContextPtr context_); @@ -104,6 +118,7 @@ protected: Names & real_column_names, ContextMutablePtr modified_context, size_t streams_num, + bool has_database_virtual_column, bool has_table_virtual_column, bool concat_streams = false); diff --git a/src/Storages/StorageMergeTree.cpp b/src/Storages/StorageMergeTree.cpp index 96ccec15e49..32c2c76dd10 100644 --- a/src/Storages/StorageMergeTree.cpp +++ b/src/Storages/StorageMergeTree.cpp @@ -18,7 +18,7 @@ #include #include #include -#include +#include #include #include #include @@ -109,7 +109,8 @@ void StorageMergeTree::startup() clearOldTemporaryDirectories(0); /// NOTE background task will also do the above cleanups periodically. - time_after_previous_cleanup.restart(); + time_after_previous_cleanup_parts.restart(); + time_after_previous_cleanup_temporary_directories.restart(); try { @@ -223,11 +224,11 @@ std::optional StorageMergeTree::totalBytes(const Settings &) const return getTotalActiveSizeInBytes(); } -BlockOutputStreamPtr +SinkToStoragePtr StorageMergeTree::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr local_context) { const auto & settings = local_context->getSettingsRef(); - return std::make_shared( + return std::make_shared( *this, metadata_snapshot, settings.max_partitions_per_insert_block, local_context); } @@ -958,9 +959,19 @@ std::shared_ptr StorageMergeTree::se if (!commands_for_size_validation.empty()) { - MutationsInterpreter interpreter( - shared_from_this(), metadata_snapshot, commands_for_size_validation, getContext(), false); - commands_size += interpreter.evaluateCommandsSize(); + try + { + MutationsInterpreter interpreter( + shared_from_this(), metadata_snapshot, commands_for_size_validation, getContext(), false); + commands_size += interpreter.evaluateCommandsSize(); + } + catch (...) + { + MergeTreeMutationEntry & entry = it->second; + entry.latest_fail_time = time(nullptr); + entry.latest_fail_reason = getCurrentExceptionMessage(false); + continue; + } } if (current_ast_elements + commands_size >= max_ast_elements) @@ -970,17 +981,21 @@ std::shared_ptr StorageMergeTree::se commands.insert(commands.end(), it->second.commands.begin(), it->second.commands.end()); } - auto new_part_info = part->info; - new_part_info.mutation = current_mutations_by_version.rbegin()->first; + if (!commands.empty()) + { + auto new_part_info = part->info; + new_part_info.mutation = current_mutations_by_version.rbegin()->first; - future_part.parts.push_back(part); - future_part.part_info = new_part_info; - future_part.name = part->getNewName(new_part_info); - future_part.type = part->getType(); + future_part.parts.push_back(part); + future_part.part_info = new_part_info; + future_part.name = part->getNewName(new_part_info); + future_part.type = part->getType(); - tagger = std::make_unique(future_part, MergeTreeDataMergerMutator::estimateNeededDiskSpace({part}), *this, metadata_snapshot, true); - return std::make_shared(future_part, std::move(tagger), commands); + tagger = std::make_unique(future_part, MergeTreeDataMergerMutator::estimateNeededDiskSpace({part}), *this, metadata_snapshot, true); + return std::make_shared(future_part, std::move(tagger), commands); + } } + return {}; } @@ -1035,6 +1050,7 @@ bool StorageMergeTree::scheduleDataProcessingJob(IBackgroundJobExecutor & execut auto share_lock = lockForShare(RWLockImpl::NO_QUERY, getSettings()->lock_acquire_timeout_for_background_operations); + bool has_mutations; { std::unique_lock lock(currently_processing_in_background_mutex); if (merger_mutator.merges_blocker.isCancelled()) @@ -1043,6 +1059,15 @@ bool StorageMergeTree::scheduleDataProcessingJob(IBackgroundJobExecutor & execut merge_entry = selectPartsToMerge(metadata_snapshot, false, {}, false, nullptr, share_lock, lock); if (!merge_entry) mutate_entry = selectPartsToMutate(metadata_snapshot, nullptr, share_lock); + + has_mutations = !current_mutations_by_version.empty(); + } + + if (!mutate_entry && has_mutations) + { + /// Notify in case of errors + std::lock_guard lock(mutation_wait_mutex); + mutation_wait_event.notify_all(); } if (merge_entry) @@ -1061,22 +1086,32 @@ bool StorageMergeTree::scheduleDataProcessingJob(IBackgroundJobExecutor & execut }, PoolType::MERGE_MUTATE}); return true; } - else if (auto cmp_lock = time_after_previous_cleanup.compareAndRestartDeferred(1)) + bool executed = false; + if (time_after_previous_cleanup_temporary_directories.compareAndRestartDeferred(getContext()->getSettingsRef().merge_tree_clear_old_temporary_directories_interval_seconds)) + { + executor.execute({[this, share_lock] () + { + clearOldTemporaryDirectories(getSettings()->temporary_directories_lifetime.totalSeconds()); + return true; + }, PoolType::MERGE_MUTATE}); + executed = true; + } + if (time_after_previous_cleanup_parts.compareAndRestartDeferred(getContext()->getSettingsRef().merge_tree_clear_old_parts_interval_seconds)) { executor.execute({[this, share_lock] () { /// All use relative_data_path which changes during rename /// so execute under share lock. clearOldPartsFromFilesystem(); - clearOldTemporaryDirectories(); clearOldWriteAheadLogs(); clearOldMutations(); clearEmptyParts(); return true; }, PoolType::MERGE_MUTATE}); - return true; - } - return false; + executed = true; + } + + return executed; } Int64 StorageMergeTree::getCurrentMutationVersion( @@ -1604,4 +1639,9 @@ void StorageMergeTree::startBackgroundMovesIfNeeded() background_moves_executor.start(); } +std::unique_ptr StorageMergeTree::getDefaultSettings() const +{ + return std::make_unique(getContext()->getMergeTreeSettings()); +} + } diff --git a/src/Storages/StorageMergeTree.h b/src/Storages/StorageMergeTree.h index 57635d38008..681475f7a49 100644 --- a/src/Storages/StorageMergeTree.h +++ b/src/Storages/StorageMergeTree.h @@ -61,7 +61,7 @@ public: std::optional totalRowsByPartitionPredicate(const SelectQueryInfo &, ContextPtr) const override; std::optional totalBytes(const Settings &) const override; - BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; + SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; /** Perform the next step in combining the parts. */ @@ -114,8 +114,10 @@ private: /// For block numbers. SimpleIncrement increment; - /// For clearOldParts, clearOldTemporaryDirectories. - AtomicStopwatch time_after_previous_cleanup; + /// For clearOldParts + AtomicStopwatch time_after_previous_cleanup_parts; + /// For clearOldTemporaryDirectories. + AtomicStopwatch time_after_previous_cleanup_temporary_directories; /// Mutex for parts currently processing in background /// merging (also with TTL), mutating or moving. @@ -236,8 +238,10 @@ private: void startBackgroundMovesIfNeeded() override; + std::unique_ptr getDefaultSettings() const override; + friend class MergeTreeProjectionBlockOutputStream; - friend class MergeTreeBlockOutputStream; + friend class MergeTreeSink; friend class MergeTreeData; diff --git a/src/Storages/StorageMongoDB.cpp b/src/Storages/StorageMongoDB.cpp index e27d16ecc68..3bdef7fd295 100644 --- a/src/Storages/StorageMongoDB.cpp +++ b/src/Storages/StorageMongoDB.cpp @@ -1,4 +1,5 @@ #include "StorageMongoDB.h" +#include "StorageMongoDBSocketFactory.h" #include #include @@ -14,7 +15,7 @@ #include #include #include -#include +#include namespace DB { @@ -33,6 +34,7 @@ StorageMongoDB::StorageMongoDB( const std::string & collection_name_, const std::string & username_, const std::string & password_, + const std::string & options_, const ColumnsDescription & columns_, const ConstraintsDescription & constraints_, const String & comment) @@ -43,6 +45,8 @@ StorageMongoDB::StorageMongoDB( , collection_name(collection_name_) , username(username_) , password(password_) + , options(options_) + , uri("mongodb://" + host_ + ":" + std::to_string(port_) + "/" + database_name_ + "?" + options_) { StorageInMemoryMetadata storage_metadata; storage_metadata.setColumns(columns_); @@ -56,7 +60,10 @@ void StorageMongoDB::connectIfNotConnected() { std::lock_guard lock{connection_mutex}; if (!connection) - connection = std::make_shared(host, port); + { + StorageMongoDBSocketFactory factory; + connection = std::make_shared(uri, factory); + } if (!authenticated) { @@ -92,8 +99,7 @@ Pipe StorageMongoDB::read( sample_block.insert({ column_data.type, column_data.name }); } - return Pipe(std::make_shared( - std::make_shared(connection, createCursor(database_name, collection_name, sample_block), sample_block, max_block_size, true))); + return Pipe(std::make_shared(connection, createCursor(database_name, collection_name, sample_block), sample_block, max_block_size, true)); } void registerStorageMongoDB(StorageFactory & factory) @@ -102,9 +108,9 @@ void registerStorageMongoDB(StorageFactory & factory) { ASTs & engine_args = args.engine_args; - if (engine_args.size() != 5) + if (engine_args.size() < 5 || engine_args.size() > 6) throw Exception( - "Storage MongoDB requires 5 parameters: MongoDB('host:port', database, collection, 'user', 'password').", + "Storage MongoDB requires from 5 to 6 parameters: MongoDB('host:port', database, collection, 'user', 'password' [, 'options']).", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); for (auto & engine_arg : engine_args) @@ -118,6 +124,11 @@ void registerStorageMongoDB(StorageFactory & factory) const String & username = engine_args[3]->as().value.safeGet(); const String & password = engine_args[4]->as().value.safeGet(); + String options; + + if (engine_args.size() >= 6) + options = engine_args[5]->as().value.safeGet(); + return StorageMongoDB::create( args.table_id, parsed_host_port.first, @@ -126,6 +137,7 @@ void registerStorageMongoDB(StorageFactory & factory) collection, username, password, + options, args.columns, args.constraints, args.comment); diff --git a/src/Storages/StorageMongoDB.h b/src/Storages/StorageMongoDB.h index 2553acdd40c..3014b88a9ca 100644 --- a/src/Storages/StorageMongoDB.h +++ b/src/Storages/StorageMongoDB.h @@ -26,6 +26,7 @@ public: const std::string & collection_name_, const std::string & username_, const std::string & password_, + const std::string & options_, const ColumnsDescription & columns_, const ConstraintsDescription & constraints_, const String & comment); @@ -50,6 +51,8 @@ private: const std::string collection_name; const std::string username; const std::string password; + const std::string options; + const std::string uri; std::shared_ptr connection; bool authenticated = false; diff --git a/src/Storages/StorageMongoDBSocketFactory.cpp b/src/Storages/StorageMongoDBSocketFactory.cpp new file mode 100644 index 00000000000..9a2b120e9ed --- /dev/null +++ b/src/Storages/StorageMongoDBSocketFactory.cpp @@ -0,0 +1,55 @@ +#include "StorageMongoDBSocketFactory.h" + +#include + +#if !defined(ARCADIA_BUILD) +# include +#endif + +#include +#include + +#if USE_SSL +# include +#endif + + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int FEATURE_IS_NOT_ENABLED_AT_BUILD_TIME; +} + +Poco::Net::StreamSocket StorageMongoDBSocketFactory::createSocket(const std::string & host, int port, Poco::Timespan connectTimeout, bool secure) +{ + return secure ? createSecureSocket(host, port, connectTimeout) : createPlainSocket(host, port, connectTimeout); +} + +Poco::Net::StreamSocket StorageMongoDBSocketFactory::createPlainSocket(const std::string & host, int port, Poco::Timespan connectTimeout) +{ + Poco::Net::SocketAddress address(host, port); + Poco::Net::StreamSocket socket; + + socket.connect(address, connectTimeout); + + return socket; +} + + +Poco::Net::StreamSocket StorageMongoDBSocketFactory::createSecureSocket(const std::string & host [[maybe_unused]], int port [[maybe_unused]], Poco::Timespan connectTimeout [[maybe_unused]]) +{ +#if USE_SSL + Poco::Net::SocketAddress address(host, port); + Poco::Net::SecureStreamSocket socket; + + socket.connect(address, connectTimeout); + + return socket; +#else + throw Exception("SSL is not enabled at build time.", ErrorCodes::FEATURE_IS_NOT_ENABLED_AT_BUILD_TIME); +#endif +} + +} diff --git a/src/Storages/StorageMongoDBSocketFactory.h b/src/Storages/StorageMongoDBSocketFactory.h new file mode 100644 index 00000000000..5fc423c63cb --- /dev/null +++ b/src/Storages/StorageMongoDBSocketFactory.h @@ -0,0 +1,19 @@ +#pragma once + +#include + + +namespace DB +{ + +class StorageMongoDBSocketFactory : public Poco::MongoDB::Connection::SocketFactory +{ +public: + virtual Poco::Net::StreamSocket createSocket(const std::string & host, int port, Poco::Timespan connectTimeout, bool secure) override; + +private: + static Poco::Net::StreamSocket createPlainSocket(const std::string & host, int port, Poco::Timespan connectTimeout); + static Poco::Net::StreamSocket createSecureSocket(const std::string & host, int port, Poco::Timespan connectTimeout); +}; + +} diff --git a/src/Storages/StorageMySQL.cpp b/src/Storages/StorageMySQL.cpp index 5d37806c9ba..79bb1f59cc7 100644 --- a/src/Storages/StorageMySQL.cpp +++ b/src/Storages/StorageMySQL.cpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include #include #include @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -103,22 +104,22 @@ Pipe StorageMySQL::read( StreamSettings mysql_input_stream_settings(context_->getSettingsRef(), mysql_settings.connection_auto_close); - return Pipe(std::make_shared( - std::make_shared(pool, query, sample_block, mysql_input_stream_settings))); + return Pipe(std::make_shared(pool, query, sample_block, mysql_input_stream_settings)); } -class StorageMySQLBlockOutputStream : public IBlockOutputStream +class StorageMySQLSink : public SinkToStorage { public: - explicit StorageMySQLBlockOutputStream( + explicit StorageMySQLSink( const StorageMySQL & storage_, const StorageMetadataPtr & metadata_snapshot_, const std::string & remote_database_name_, const std::string & remote_table_name_, const mysqlxx::PoolWithFailover::Entry & entry_, const size_t & mysql_max_rows_to_insert) - : storage{storage_} + : SinkToStorage(metadata_snapshot_->getSampleBlock()) + , storage{storage_} , metadata_snapshot{metadata_snapshot_} , remote_database_name{remote_database_name_} , remote_table_name{remote_table_name_} @@ -127,10 +128,11 @@ public: { } - Block getHeader() const override { return metadata_snapshot->getSampleBlock(); } + String getName() const override { return "StorageMySQLSink"; } - void write(const Block & block) override + void consume(Chunk chunk) override { + auto block = getPort().getHeader().cloneWithColumns(chunk.detachColumns()); auto blocks = splitBlocks(block, max_batch_rows); mysqlxx::Transaction trans(entry); try @@ -221,9 +223,9 @@ private: }; -BlockOutputStreamPtr StorageMySQL::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr local_context) +SinkToStoragePtr StorageMySQL::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr local_context) { - return std::make_shared( + return std::make_shared( *this, metadata_snapshot, remote_database_name, diff --git a/src/Storages/StorageMySQL.h b/src/Storages/StorageMySQL.h index 2bcc7af5f2b..70d7a4455b1 100644 --- a/src/Storages/StorageMySQL.h +++ b/src/Storages/StorageMySQL.h @@ -48,10 +48,10 @@ public: size_t max_block_size, unsigned num_streams) override; - BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; + SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; private: - friend class StorageMySQLBlockOutputStream; + friend class StorageMySQLSink; std::string remote_database_name; std::string remote_table_name; diff --git a/src/Storages/StorageNull.h b/src/Storages/StorageNull.h index c20937b2359..fda6faffb1e 100644 --- a/src/Storages/StorageNull.h +++ b/src/Storages/StorageNull.h @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -36,9 +37,9 @@ public: bool supportsParallelInsert() const override { return true; } - BlockOutputStreamPtr write(const ASTPtr &, const StorageMetadataPtr & metadata_snapshot, ContextPtr) override + SinkToStoragePtr write(const ASTPtr &, const StorageMetadataPtr & metadata_snapshot, ContextPtr) override { - return std::make_shared(metadata_snapshot->getSampleBlock()); + return std::make_shared(metadata_snapshot->getSampleBlock()); } void checkAlterIsPossible(const AlterCommands & commands, ContextPtr context) const override; diff --git a/src/Storages/StoragePostgreSQL.cpp b/src/Storages/StoragePostgreSQL.cpp index 211a626e8d4..603a52b2801 100644 --- a/src/Storages/StoragePostgreSQL.cpp +++ b/src/Storages/StoragePostgreSQL.cpp @@ -1,7 +1,7 @@ #include "StoragePostgreSQL.h" #if USE_LIBPQXX -#include +#include #include #include @@ -27,6 +27,7 @@ #include #include #include +#include #include @@ -46,12 +47,10 @@ StoragePostgreSQL::StoragePostgreSQL( const ColumnsDescription & columns_, const ConstraintsDescription & constraints_, const String & comment, - ContextPtr context_, const String & remote_table_schema_) : IStorage(table_id_) , remote_table_name(remote_table_name_) , remote_table_schema(remote_table_schema_) - , global_context(context_) , pool(std::move(pool_)) { StorageInMemoryMetadata storage_metadata; @@ -89,30 +88,31 @@ Pipe StoragePostgreSQL::read( sample_block.insert({ column_data.type, column_data.name }); } - return Pipe(std::make_shared( - std::make_shared>(pool->get(), query, sample_block, max_block_size_))); + return Pipe(std::make_shared>(pool->get(), query, sample_block, max_block_size_)); } -class PostgreSQLBlockOutputStream : public IBlockOutputStream +class PostgreSQLSink : public SinkToStorage { public: - explicit PostgreSQLBlockOutputStream( + explicit PostgreSQLSink( const StorageMetadataPtr & metadata_snapshot_, postgres::ConnectionHolderPtr connection_holder_, const String & remote_table_name_, const String & remote_table_schema_) - : metadata_snapshot(metadata_snapshot_) + : SinkToStorage(metadata_snapshot_->getSampleBlock()) + , metadata_snapshot(metadata_snapshot_) , connection_holder(std::move(connection_holder_)) , remote_table_name(remote_table_name_) , remote_table_schema(remote_table_schema_) { } - Block getHeader() const override { return metadata_snapshot->getSampleBlock(); } + String getName() const override { return "PostgreSQLSink"; } - void write(const Block & block) override + void consume(Chunk chunk) override { + auto block = getPort().getHeader().cloneWithColumns(chunk.detachColumns()); if (!inserter) inserter = std::make_unique(connection_holder->get(), remote_table_schema.empty() ? pqxx::table_path({remote_table_name}) @@ -155,7 +155,7 @@ public: } } - void writeSuffix() override + void onFinish() override { if (inserter) inserter->complete(); @@ -234,6 +234,10 @@ public: else if (which.isFloat64()) nested_column = ColumnFloat64::create(); else if (which.isDate()) nested_column = ColumnUInt16::create(); else if (which.isDateTime()) nested_column = ColumnUInt32::create(); + else if (which.isDateTime64()) + { + nested_column = ColumnDecimal::create(0, 6); + } else if (which.isDecimal32()) { const auto & type = typeid_cast *>(nested.get()); @@ -291,10 +295,10 @@ private: }; -BlockOutputStreamPtr StoragePostgreSQL::write( +SinkToStoragePtr StoragePostgreSQL::write( const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr /* context */) { - return std::make_shared(metadata_snapshot, pool->get(), remote_table_name, remote_table_schema); + return std::make_shared(metadata_snapshot, pool->get(), remote_table_name, remote_table_schema); } @@ -341,7 +345,6 @@ void registerStoragePostgreSQL(StorageFactory & factory) args.columns, args.constraints, args.comment, - args.getContext(), remote_table_schema); }, { diff --git a/src/Storages/StoragePostgreSQL.h b/src/Storages/StoragePostgreSQL.h index 5a8ecf5598f..bd5cd317c3d 100644 --- a/src/Storages/StoragePostgreSQL.h +++ b/src/Storages/StoragePostgreSQL.h @@ -27,7 +27,6 @@ public: const ColumnsDescription & columns_, const ConstraintsDescription & constraints_, const String & comment, - ContextPtr context_, const std::string & remote_table_schema_ = ""); String getName() const override { return "PostgreSQL"; } @@ -41,14 +40,13 @@ public: size_t max_block_size, unsigned num_streams) override; - BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; + SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; private: friend class PostgreSQLBlockOutputStream; String remote_table_name; String remote_table_schema; - ContextPtr global_context; postgres::PoolWithFailoverPtr pool; }; diff --git a/src/Storages/StorageProxy.h b/src/Storages/StorageProxy.h index 60e7bf24046..c81ef6febdc 100644 --- a/src/Storages/StorageProxy.h +++ b/src/Storages/StorageProxy.h @@ -40,7 +40,7 @@ public: return getNested()->getQueryProcessingStage(context, to_stage, getNested()->getInMemoryMetadataPtr(), info); } - BlockInputStreams watch( + Pipe watch( const Names & column_names, const SelectQueryInfo & query_info, ContextPtr context, @@ -63,7 +63,7 @@ public: return getNested()->read(column_names, metadata_snapshot, query_info, context, processed_stage, max_block_size, num_streams); } - BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & metadata_snapshot, ContextPtr context) override + SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & metadata_snapshot, ContextPtr context) override { return getNested()->write(query, metadata_snapshot, context); } diff --git a/src/Storages/StorageReplicatedMergeTree.cpp b/src/Storages/StorageReplicatedMergeTree.cpp index b51b39f7d68..150a71a09e5 100644 --- a/src/Storages/StorageReplicatedMergeTree.cpp +++ b/src/Storages/StorageReplicatedMergeTree.cpp @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include #include @@ -155,7 +155,6 @@ namespace ActionLocks static const auto QUEUE_UPDATE_ERROR_SLEEP_MS = 1 * 1000; -static const auto MERGE_SELECTING_SLEEP_MS = 5 * 1000; static const auto MUTATIONS_FINALIZING_SLEEP_MS = 1 * 1000; static const auto MUTATIONS_FINALIZING_IDLE_SLEEP_MS = 5 * 1000; @@ -552,6 +551,10 @@ void StorageReplicatedMergeTree::waitMutationToFinishOnReplicas( break; } + /// This replica inactive, don't check anything + if (!inactive_replicas.empty() && inactive_replicas.count(replica)) + break; + /// It maybe already removed from zk, but local in-memory mutations /// state was not updated. if (!getZooKeeper()->exists(fs::path(zookeeper_path) / "mutations" / mutation_id)) @@ -603,11 +606,14 @@ void StorageReplicatedMergeTree::createNewZooKeeperNodes() zookeeper->createIfNotExists(zookeeper_path + "/mutations", String()); zookeeper->createIfNotExists(replica_path + "/mutation_pointer", String()); - /// Nodes for zero-copy S3 replication - if (storage_settings.get()->allow_s3_zero_copy_replication) + /// Nodes for remote fs zero-copy replication + const auto settings = getSettings(); + if (settings->allow_remote_fs_zero_copy_replication) { zookeeper->createIfNotExists(zookeeper_path + "/zero_copy_s3", String()); zookeeper->createIfNotExists(zookeeper_path + "/zero_copy_s3/shared", String()); + zookeeper->createIfNotExists(zookeeper_path + "/zero_copy_hdfs", String()); + zookeeper->createIfNotExists(zookeeper_path + "/zero_copy_hdfs/shared", String()); } /// Part movement. @@ -1724,23 +1730,19 @@ bool StorageReplicatedMergeTree::tryExecuteMerge(const LogEntry & entry) future_merged_part.updatePath(*this, reserved_space); future_merged_part.merge_type = entry.merge_type; - if (storage_settings_ptr->allow_s3_zero_copy_replication) + if (reserved_space->getDisk()->supportZeroCopyReplication() + && storage_settings_ptr->allow_remote_fs_zero_copy_replication + && merge_strategy_picker.shouldMergeOnSingleReplicaShared(entry)) { - if (auto disk = reserved_space->getDisk(); disk->getType() == DB::DiskType::Type::S3) - { - if (merge_strategy_picker.shouldMergeOnSingleReplicaS3Shared(entry)) - { - if (!replica_to_execute_merge_picked) - replica_to_execute_merge = merge_strategy_picker.pickReplicaToExecuteMerge(entry); + if (!replica_to_execute_merge_picked) + replica_to_execute_merge = merge_strategy_picker.pickReplicaToExecuteMerge(entry); - if (replica_to_execute_merge) - { - LOG_DEBUG(log, - "Prefer fetching part {} from replica {} due s3_execute_merges_on_single_replica_time_threshold", - entry.new_part_name, replica_to_execute_merge.value()); - return false; - } - } + if (replica_to_execute_merge) + { + LOG_DEBUG(log, + "Prefer fetching part {} from replica {} due to remote_fs_execute_merges_on_single_replica_time_threshold", + entry.new_part_name, replica_to_execute_merge.value()); + return false; } } @@ -2104,6 +2106,10 @@ bool StorageReplicatedMergeTree::executeFetch(LogEntry & entry) try { String part_name = entry.actual_new_part_name.empty() ? entry.new_part_name : entry.actual_new_part_name; + + if (!entry.actual_new_part_name.empty()) + LOG_DEBUG(log, "Will fetch part {} instead of {}", entry.actual_new_part_name, entry.new_part_name); + if (!fetchPart(part_name, metadata_snapshot, fs::path(zookeeper_path) / "replicas" / replica, false, entry.quorum)) return false; } @@ -2160,7 +2166,7 @@ bool StorageReplicatedMergeTree::executeFetchShared( { if (source_replica.empty()) { - LOG_INFO(log, "No active replica has part {} on S3.", new_part_name); + LOG_INFO(log, "No active replica has part {} on shared storage.", new_part_name); return false; } @@ -2775,6 +2781,16 @@ void StorageReplicatedMergeTree::cloneReplica(const String & source_replica, Coo } } + { + /// Check "is_lost" version after retrieving queue and parts. + /// If version has changed, then replica most likely has been dropped and parts set is inconsistent, + /// so throw exception and retry cloning. + Coordination::Stat is_lost_stat_new; + zookeeper->get(fs::path(source_path) / "is_lost", &is_lost_stat_new); + if (is_lost_stat_new.version != source_is_lost_stat.version) + throw Exception(ErrorCodes::REPLICA_STATUS_CHANGED, "Cannot clone {}, because it suddenly become lost", source_replica); + } + tryRemovePartsFromZooKeeperWithRetries(parts_to_remove_from_zk); auto local_active_parts = getDataParts(); @@ -3339,7 +3355,7 @@ void StorageReplicatedMergeTree::mergeSelectingTask() if (create_result != CreateMergeEntryResult::Ok && create_result != CreateMergeEntryResult::LogUpdated) { - merge_selecting_task->scheduleAfter(MERGE_SELECTING_SLEEP_MS); + merge_selecting_task->scheduleAfter(storage_settings_ptr->merge_selecting_sleep_ms); } else { @@ -4361,12 +4377,6 @@ void StorageReplicatedMergeTree::shutdown() /// Wait for all of them std::unique_lock lock(data_parts_exchange_ptr->rwlock); } - - /// We clear all old parts after stopping all background operations. It's - /// important, because background operations can produce temporary parts - /// which will remove themselves in their destructors. If so, we may have - /// race condition between our remove call and background process. - clearOldPartsFromFilesystem(true); } @@ -4538,7 +4548,7 @@ void StorageReplicatedMergeTree::assertNotReadonly() const } -BlockOutputStreamPtr StorageReplicatedMergeTree::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr local_context) +SinkToStoragePtr StorageReplicatedMergeTree::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr local_context) { const auto storage_settings_ptr = getSettings(); assertNotReadonly(); @@ -4547,7 +4557,7 @@ BlockOutputStreamPtr StorageReplicatedMergeTree::write(const ASTPtr & /*query*/, bool deduplicate = storage_settings_ptr->replicated_deduplication_window != 0 && query_settings.insert_deduplicate; // TODO: should we also somehow pass list of columns to deduplicate on to the ReplicatedMergeTreeBlockOutputStream ? - return std::make_shared( + return std::make_shared( *this, metadata_snapshot, query_settings.insert_quorum, query_settings.insert_quorum_timeout.totalMilliseconds(), query_settings.max_partitions_per_insert_block, @@ -4962,6 +4972,8 @@ void StorageReplicatedMergeTree::alter( if (auto txn = query_context->getZooKeeperMetadataTransaction()) { + /// It would be better to clone ops instead of moving, so we could retry on ZBADVERSION, + /// but clone() is not implemented for Coordination::Request. txn->moveOpsTo(ops); /// NOTE: IDatabase::alterTable(...) is called when executing ALTER_METADATA queue entry without query context, /// so we have to update metadata of DatabaseReplicated here. @@ -5005,6 +5017,11 @@ void StorageReplicatedMergeTree::alter( throw Exception("Metadata on replica is not up to date with common metadata in Zookeeper. Cannot alter", ErrorCodes::CANNOT_ASSIGN_ALTER); + /// Cannot retry automatically, because some zookeeper ops were lost on the first attempt. Will retry on DDLWorker-level. + if (query_context->getZooKeeperMetadataTransaction()) + throw Exception("Cannot execute alter, because mutations version was suddenly changed due to concurrent alter", + ErrorCodes::CANNOT_ASSIGN_ALTER); + continue; } else @@ -5247,7 +5264,7 @@ PartitionCommandsResultInfo StorageReplicatedMergeTree::attachPartition( MutableDataPartsVector loaded_parts = tryLoadPartsToAttach(partition, attach_part, query_context, renamed_parts); /// TODO Allow to use quorum here. - ReplicatedMergeTreeBlockOutputStream output(*this, metadata_snapshot, 0, 0, 0, false, false, query_context, + ReplicatedMergeTreeSink output(*this, metadata_snapshot, 0, 0, 0, false, false, query_context, /*is_attach*/true); for (size_t i = 0; i < loaded_parts.size(); ++i) @@ -5565,8 +5582,11 @@ void StorageReplicatedMergeTree::getStatus(Status & res, bool with_zk_fields) res.total_replicas = all_replicas.size(); for (const String & replica : all_replicas) - if (zookeeper->exists(fs::path(zookeeper_path) / "replicas" / replica / "is_active")) - ++res.active_replicas; + { + bool is_replica_active = zookeeper->exists(fs::path(zookeeper_path) / "replicas" / replica / "is_active"); + res.active_replicas += static_cast(is_replica_active); + res.replica_is_active.emplace(replica, is_replica_active); + } } catch (const Coordination::Exception &) { @@ -5997,6 +6017,10 @@ void StorageReplicatedMergeTree::mutate(const MutationCommands & commands, Conte } else if (rc == Coordination::Error::ZBADVERSION) { + /// Cannot retry automatically, because some zookeeper ops were lost on the first attempt. Will retry on DDLWorker-level. + if (query_context->getZooKeeperMetadataTransaction()) + throw Exception("Cannot execute alter, because mutations version was suddenly changed due to concurrent alter", + ErrorCodes::CANNOT_ASSIGN_ALTER); LOG_TRACE(log, "Version conflict when trying to create a mutation node, retrying..."); continue; } @@ -6986,6 +7010,14 @@ bool StorageReplicatedMergeTree::dropPartImpl( return false; } + if (merge_pred.hasDropRange(part->info)) + { + if (throw_if_noop) + throw Exception("Already has DROP RANGE for part " + part_name + " in queue.", ErrorCodes::PART_IS_TEMPORARILY_LOCKED); + + return false; + } + /// There isn't a lot we can do otherwise. Can't cancel merges because it is possible that a replica already /// finished the merge. if (partIsAssignedToBackgroundOperation(part)) @@ -7174,16 +7206,20 @@ void StorageReplicatedMergeTree::startBackgroundMovesIfNeeded() background_moves_executor.start(); } +std::unique_ptr StorageReplicatedMergeTree::getDefaultSettings() const +{ + return std::make_unique(getContext()->getReplicatedMergeTreeSettings()); +} + void StorageReplicatedMergeTree::lockSharedData(const IMergeTreeDataPart & part) const { if (!part.volume) return; DiskPtr disk = part.volume->getDisk(); - if (!disk) - return; - if (disk->getType() != DB::DiskType::Type::S3) + if (!disk || !disk->supportZeroCopyReplication()) return; + String zero_copy = fmt::format("zero_copy_{}", DiskType::toString(disk->getType())); zkutil::ZooKeeperPtr zookeeper = tryGetZooKeeper(); if (!zookeeper) @@ -7192,7 +7228,7 @@ void StorageReplicatedMergeTree::lockSharedData(const IMergeTreeDataPart & part) String id = part.getUniqueId(); boost::replace_all(id, "/", "_"); - String zookeeper_node = fs::path(zookeeper_path) / "zero_copy_s3" / "shared" / part.name / id / replica_name; + String zookeeper_node = fs::path(zookeeper_path) / zero_copy / "shared" / part.name / id / replica_name; LOG_TRACE(log, "Set zookeeper lock {}", zookeeper_node); @@ -7221,10 +7257,9 @@ bool StorageReplicatedMergeTree::unlockSharedData(const IMergeTreeDataPart & par if (!part.volume) return true; DiskPtr disk = part.volume->getDisk(); - if (!disk) - return true; - if (disk->getType() != DB::DiskType::Type::S3) + if (!disk || !disk->supportZeroCopyReplication()) return true; + String zero_copy = fmt::format("zero_copy_{}", DiskType::toString(disk->getType())); zkutil::ZooKeeperPtr zookeeper = tryGetZooKeeper(); if (!zookeeper) @@ -7233,7 +7268,7 @@ bool StorageReplicatedMergeTree::unlockSharedData(const IMergeTreeDataPart & par String id = part.getUniqueId(); boost::replace_all(id, "/", "_"); - String zookeeper_part_node = fs::path(zookeeper_path) / "zero_copy_s3" / "shared" / part.name; + String zookeeper_part_node = fs::path(zookeeper_path) / zero_copy / "shared" / part.name; String zookeeper_part_uniq_node = fs::path(zookeeper_part_node) / id; String zookeeper_node = fs::path(zookeeper_part_uniq_node) / replica_name; @@ -7268,16 +7303,14 @@ bool StorageReplicatedMergeTree::tryToFetchIfShared( const DiskPtr & disk, const String & path) { - const auto data_settings = getSettings(); - if (!data_settings->allow_s3_zero_copy_replication) + const auto settings = getSettings(); + auto disk_type = disk->getType(); + if (!(disk->supportZeroCopyReplication() && settings->allow_remote_fs_zero_copy_replication)) return false; - if (disk->getType() != DB::DiskType::Type::S3) - return false; + String replica = getSharedDataReplica(part, disk_type); - String replica = getSharedDataReplica(part); - - /// We can't fetch part when none replicas have this part on S3 + /// We can't fetch part when none replicas have this part on a same type remote disk if (replica.empty()) return false; @@ -7286,7 +7319,7 @@ bool StorageReplicatedMergeTree::tryToFetchIfShared( String StorageReplicatedMergeTree::getSharedDataReplica( - const IMergeTreeDataPart & part) const + const IMergeTreeDataPart & part, DiskType::Type disk_type) const { String best_replica; @@ -7294,7 +7327,8 @@ String StorageReplicatedMergeTree::getSharedDataReplica( if (!zookeeper) return best_replica; - String zookeeper_part_node = fs::path(zookeeper_path) / "zero_copy_s3" / "shared" / part.name; + String zero_copy = fmt::format("zero_copy_{}", DiskType::toString(disk_type)); + String zookeeper_part_node = fs::path(zookeeper_path) / zero_copy / "shared" / part.name; Strings ids; zookeeper->tryGetChildren(zookeeper_part_node, ids); diff --git a/src/Storages/StorageReplicatedMergeTree.h b/src/Storages/StorageReplicatedMergeTree.h index 6f717b7c450..3d2727d7bb9 100644 --- a/src/Storages/StorageReplicatedMergeTree.h +++ b/src/Storages/StorageReplicatedMergeTree.h @@ -116,7 +116,7 @@ public: std::optional totalRowsByPartitionPredicate(const SelectQueryInfo & query_info, ContextPtr context) const override; std::optional totalBytes(const Settings & settings) const override; - BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; + SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; bool optimize( const ASTPtr & query, @@ -176,6 +176,7 @@ public: UInt8 active_replicas; /// If the error has happened fetching the info from ZooKeeper, this field will be set. String zookeeper_exception; + std::unordered_map replica_is_active; }; /// Get the status of the table. If with_zk_fields = false - do not fill in the fields that require queries to ZK. @@ -225,10 +226,10 @@ public: /// Fetch part only when it stored on shared storage like S3 bool executeFetchShared(const String & source_replica, const String & new_part_name, const DiskPtr & disk, const String & path); - /// Lock part in zookeeper for use common S3 data in several nodes + /// Lock part in zookeeper for use shared data in several nodes void lockSharedData(const IMergeTreeDataPart & part) const override; - /// Unlock common S3 data part in zookeeper + /// Unlock shared data part in zookeeper /// Return true if data unlocked /// Return false if data is still used by another node bool unlockSharedData(const IMergeTreeDataPart & part) const override; @@ -236,8 +237,8 @@ public: /// Fetch part only if some replica has it on shared storage like S3 bool tryToFetchIfShared(const IMergeTreeDataPart & part, const DiskPtr & disk, const String & path) override; - /// Get best replica having this partition on S3 - String getSharedDataReplica(const IMergeTreeDataPart & part) const; + /// Get best replica having this partition on a same type remote disk + String getSharedDataReplica(const IMergeTreeDataPart & part, DiskType::Type disk_type) const; inline String getReplicaName() const { return replica_name; } @@ -269,7 +270,7 @@ private: /// Delete old parts from disk and from ZooKeeper. void clearOldPartsAndRemoveFromZK(); - friend class ReplicatedMergeTreeBlockOutputStream; + friend class ReplicatedMergeTreeSink; friend class ReplicatedMergeTreePartCheckThread; friend class ReplicatedMergeTreeCleanupThread; friend class ReplicatedMergeTreeAlterThread; @@ -688,6 +689,24 @@ private: bool fetch_part, ContextPtr query_context) override; + /// NOTE: there are no guarantees for concurrent merges. Dropping part can + /// be concurrently merged into some covering part and dropPart will do + /// nothing. There are some fundamental problems with it. But this is OK + /// because: + /// + /// dropPart used in the following cases: + /// 1) Remove empty parts after TTL. + /// 2) Remove parts after move between shards. + /// 3) User queries: ALTER TABLE DROP PART 'part_name'. + /// + /// In the first case merge of empty part is even better than DROP. In the + /// second case part UUIDs used to forbid merges for moving parts so there + /// is no problem with concurrent merges. The third case is quite rare and + /// we give very weak guarantee: there will be no active part with this + /// name, but possibly it was merged to some other part. + /// + /// NOTE: don't rely on dropPart if you 100% need to remove non-empty part + /// and don't use any explicit locking mechanism for merges. bool dropPartImpl(zkutil::ZooKeeperPtr & zookeeper, String part_name, LogEntry & entry, bool detach, bool throw_if_noop); /// Check granularity of already existing replicated table in zookeeper if it exists @@ -702,6 +721,8 @@ private: void startBackgroundMovesIfNeeded() override; + std::unique_ptr getDefaultSettings() const override; + std::set getPartitionIdsAffectedByCommands(const MutationCommands & commands, ContextPtr query_context) const; PartitionBlockNumbersHolder allocateBlockNumbersInAffectedPartitions( const MutationCommands & commands, ContextPtr query_context, const zkutil::ZooKeeperPtr & zookeeper) const; diff --git a/src/Storages/StorageS3.cpp b/src/Storages/StorageS3.cpp index 0661081bc5a..fc3ce3a10ed 100644 --- a/src/Storages/StorageS3.cpp +++ b/src/Storages/StorageS3.cpp @@ -19,20 +19,26 @@ #include #include -#include +#include #include +#include +#include + #include #include #include #include +#include +#include #include #include #include #include +#include #include #include #include @@ -202,12 +208,21 @@ bool StorageS3Source::initialize() file_path = fs::path(bucket) / current_key; read_buf = wrapReadBufferWithCompressionMethod( - std::make_unique(client, bucket, current_key, max_single_read_retries), chooseCompressionMethod(current_key, compression_hint)); + std::make_unique(client, bucket, current_key, max_single_read_retries, DBMS_DEFAULT_BUFFER_SIZE), + chooseCompressionMethod(current_key, compression_hint)); auto input_format = FormatFactory::instance().getInput(format, *read_buf, sample_block, getContext(), max_block_size); - reader = std::make_shared(input_format); + pipeline = std::make_unique(); + pipeline->init(Pipe(input_format)); if (columns_desc.hasDefaults()) - reader = std::make_shared(reader, columns_desc, getContext()); + { + pipeline->addSimpleTransform([&](const Block & header) + { + return std::make_shared(header, columns_desc, *input_format, getContext()); + }); + } + + reader = std::make_unique(*pipeline); initialized = false; return true; @@ -223,31 +238,25 @@ Chunk StorageS3Source::generate() if (!reader) return {}; - if (!initialized) + Chunk chunk; + if (reader->pull(chunk)) { - reader->readPrefix(); - initialized = true; - } - - if (auto block = reader->read()) - { - auto columns = block.getColumns(); - UInt64 num_rows = block.rows(); + UInt64 num_rows = chunk.getNumRows(); if (with_path_column) - columns.push_back(DataTypeString().createColumnConst(num_rows, file_path)->convertToFullColumnIfConst()); + chunk.addColumn(DataTypeString().createColumnConst(num_rows, file_path)->convertToFullColumnIfConst()); if (with_file_column) { size_t last_slash_pos = file_path.find_last_of('/'); - columns.push_back(DataTypeString().createColumnConst(num_rows, file_path.substr( + chunk.addColumn(DataTypeString().createColumnConst(num_rows, file_path.substr( last_slash_pos + 1))->convertToFullColumnIfConst()); } - return Chunk(std::move(columns), num_rows); + return chunk; } - reader->readSuffix(); reader.reset(); + pipeline.reset(); read_buf.reset(); if (!initialize()) @@ -257,10 +266,10 @@ Chunk StorageS3Source::generate() } -class StorageS3BlockOutputStream : public IBlockOutputStream +class StorageS3Sink : public SinkToStorage { public: - StorageS3BlockOutputStream( + StorageS3Sink( const String & format, const Block & sample_block_, ContextPtr context, @@ -270,34 +279,32 @@ public: const String & key, size_t min_upload_part_size, size_t max_single_part_upload_size) - : sample_block(sample_block_) + : SinkToStorage(sample_block_) + , sample_block(sample_block_) { write_buf = wrapWriteBufferWithCompressionMethod( std::make_unique(client, bucket, key, min_upload_part_size, max_single_part_upload_size), compression_method, 3); writer = FormatFactory::instance().getOutputStreamParallelIfPossible(format, *write_buf, sample_block, context); } - Block getHeader() const override + String getName() const override { return "StorageS3Sink"; } + + void consume(Chunk chunk) override { - return sample_block; + if (is_first_chunk) + { + writer->writePrefix(); + is_first_chunk = false; + } + writer->write(getPort().getHeader().cloneWithColumns(chunk.detachColumns())); } - void write(const Block & block) override - { - writer->write(block); - } + // void flush() override + // { + // writer->flush(); + // } - void writePrefix() override - { - writer->writePrefix(); - } - - void flush() override - { - writer->flush(); - } - - void writeSuffix() override + void onFinish() override { try { @@ -317,6 +324,7 @@ private: Block sample_block; std::unique_ptr write_buf; BlockOutputStreamPtr writer; + bool is_first_chunk = true; }; @@ -419,10 +427,10 @@ Pipe StorageS3::read( return pipe; } -BlockOutputStreamPtr StorageS3::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr local_context) +SinkToStoragePtr StorageS3::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr local_context) { updateClientAndAuthSettings(local_context, client_auth); - return std::make_shared( + return std::make_shared( format_name, metadata_snapshot->getSampleBlock(), local_context, @@ -434,6 +442,30 @@ BlockOutputStreamPtr StorageS3::write(const ASTPtr & /*query*/, const StorageMet max_single_part_upload_size); } + +void StorageS3::truncate(const ASTPtr & /* query */, const StorageMetadataPtr &, ContextPtr local_context, TableExclusiveLockHolder &) +{ + updateClientAndAuthSettings(local_context, client_auth); + + Aws::S3::Model::ObjectIdentifier obj; + obj.SetKey(client_auth.uri.key); + + Aws::S3::Model::Delete delkeys; + delkeys.AddObjects(std::move(obj)); + + Aws::S3::Model::DeleteObjectsRequest request; + request.SetBucket(client_auth.uri.bucket); + request.SetDelete(delkeys); + + auto response = client_auth.client->DeleteObjects(request); + if (!response.IsSuccess()) + { + const auto & err = response.GetError(); + throw Exception(std::to_string(static_cast(err.GetErrorType())) + ": " + err.GetMessage(), ErrorCodes::S3_ERROR); + } +} + + void StorageS3::updateClientAndAuthSettings(ContextPtr ctx, StorageS3::ClientAuthentication & upd) { auto settings = ctx->getStorageS3Settings().getSettings(upd.uri.uri.toString()); diff --git a/src/Storages/StorageS3.h b/src/Storages/StorageS3.h index e33c5d83198..a0089578947 100644 --- a/src/Storages/StorageS3.h +++ b/src/Storages/StorageS3.h @@ -27,6 +27,7 @@ namespace Aws::S3 namespace DB { +class PullingPipelineExecutor; class StorageS3SequentialSource; class StorageS3Source : public SourceWithProgress, WithContext { @@ -79,7 +80,8 @@ private: std::unique_ptr read_buf; - BlockInputStreamPtr reader; + std::unique_ptr pipeline; + std::unique_ptr reader; bool initialized = false; bool with_file_column = false; bool with_path_column = false; @@ -128,7 +130,9 @@ public: size_t max_block_size, unsigned num_streams) override; - BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; + SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; + + void truncate(const ASTPtr & query, const StorageMetadataPtr & metadata_snapshot, ContextPtr local_context, TableExclusiveLockHolder &) override; NamesAndTypesList getVirtuals() const override; diff --git a/src/Storages/StorageS3Cluster.cpp b/src/Storages/StorageS3Cluster.cpp index 8a320190036..ba2ed4c55cd 100644 --- a/src/Storages/StorageS3Cluster.cpp +++ b/src/Storages/StorageS3Cluster.cpp @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include #include #include @@ -106,7 +106,6 @@ Pipe StorageS3Cluster::read( const Scalars & scalars = context->hasQueryContext() ? context->getQueryContext()->getScalars() : Scalars{}; Pipes pipes; - connections.reserve(cluster->getShardCount()); const bool add_agg_info = processed_stage == QueryProcessingStage::WithMergeableState; @@ -115,19 +114,27 @@ Pipe StorageS3Cluster::read( /// There will be only one replica, because we consider each replica as a shard for (const auto & node : replicas) { - connections.emplace_back(std::make_shared( + auto connection = std::make_shared( node.host_name, node.port, context->getGlobalContext()->getCurrentDatabase(), node.user, node.password, node.cluster, node.cluster_secret, "S3ClusterInititiator", node.compression, node.secure - )); + ); + /// For unknown reason global context is passed to IStorage::read() method /// So, task_identifier is passed as constructor argument. It is more obvious. auto remote_query_executor = std::make_shared( - *connections.back(), queryToString(query_info.query), header, context, - /*throttler=*/nullptr, scalars, Tables(), processed_stage, callback); + connection, + queryToString(query_info.query), + header, + context, + /*throttler=*/nullptr, + scalars, + Tables(), + processed_stage, + callback); pipes.emplace_back(std::make_shared(remote_query_executor, add_agg_info, false)); } diff --git a/src/Storages/StorageS3Cluster.h b/src/Storages/StorageS3Cluster.h index 821765a3780..81d82052d4d 100644 --- a/src/Storages/StorageS3Cluster.h +++ b/src/Storages/StorageS3Cluster.h @@ -50,8 +50,6 @@ protected: const String & compression_method_); private: - /// Connections from initiator to other nodes - std::vector> connections; StorageS3::ClientAuthentication client_auth; String filename; diff --git a/src/Storages/StorageSQLite.cpp b/src/Storages/StorageSQLite.cpp new file mode 100644 index 00000000000..758284e8d50 --- /dev/null +++ b/src/Storages/StorageSQLite.cpp @@ -0,0 +1,183 @@ +#include "StorageSQLite.h" + +#if USE_SQLITE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; + extern const int SQLITE_ENGINE_ERROR; +} + +StorageSQLite::StorageSQLite( + const StorageID & table_id_, + SQLitePtr sqlite_db_, + const String & database_path_, + const String & remote_table_name_, + const ColumnsDescription & columns_, + const ConstraintsDescription & constraints_, + ContextPtr context_) + : IStorage(table_id_) + , WithContext(context_->getGlobalContext()) + , remote_table_name(remote_table_name_) + , database_path(database_path_) + , global_context(context_) + , sqlite_db(sqlite_db_) +{ + StorageInMemoryMetadata storage_metadata; + storage_metadata.setColumns(columns_); + storage_metadata.setConstraints(constraints_); + setInMemoryMetadata(storage_metadata); +} + + +Pipe StorageSQLite::read( + const Names & column_names, + const StorageMetadataPtr & metadata_snapshot, + SelectQueryInfo & query_info, + ContextPtr context_, + QueryProcessingStage::Enum, + size_t max_block_size, + unsigned int) +{ + if (!sqlite_db) + sqlite_db = openSQLiteDB(database_path, getContext(), /* throw_on_error */true); + + metadata_snapshot->check(column_names, getVirtuals(), getStorageID()); + + String query = transformQueryForExternalDatabase( + query_info, + metadata_snapshot->getColumns().getOrdinary(), + IdentifierQuotingStyle::DoubleQuotes, + "", + remote_table_name, + context_); + + Block sample_block; + for (const String & column_name : column_names) + { + auto column_data = metadata_snapshot->getColumns().getPhysical(column_name); + sample_block.insert({column_data.type, column_data.name}); + } + + return Pipe(std::make_shared(sqlite_db, query, sample_block, max_block_size)); +} + + +class SQLiteSink : public SinkToStorage +{ +public: + explicit SQLiteSink( + const StorageSQLite & storage_, + const StorageMetadataPtr & metadata_snapshot_, + StorageSQLite::SQLitePtr sqlite_db_, + const String & remote_table_name_) + : SinkToStorage(metadata_snapshot_->getSampleBlock()) + , storage{storage_} + , metadata_snapshot(metadata_snapshot_) + , sqlite_db(sqlite_db_) + , remote_table_name(remote_table_name_) + { + } + + String getName() const override { return "SQLiteSink"; } + + void consume(Chunk chunk) override + { + auto block = getPort().getHeader().cloneWithColumns(chunk.getColumns()); + WriteBufferFromOwnString sqlbuf; + + sqlbuf << "INSERT INTO "; + sqlbuf << doubleQuoteString(remote_table_name); + sqlbuf << " ("; + + for (auto it = block.begin(); it != block.end(); ++it) + { + if (it != block.begin()) + sqlbuf << ", "; + sqlbuf << quoteString(it->name); + } + + sqlbuf << ") VALUES "; + + auto writer = FormatFactory::instance().getOutputStream("Values", sqlbuf, metadata_snapshot->getSampleBlock(), storage.getContext()); + writer->write(block); + + sqlbuf << ";"; + + char * err_message = nullptr; + int status = sqlite3_exec(sqlite_db.get(), sqlbuf.str().c_str(), nullptr, nullptr, &err_message); + + if (status != SQLITE_OK) + { + String err_msg(err_message); + sqlite3_free(err_message); + throw Exception(ErrorCodes::SQLITE_ENGINE_ERROR, + "Failed to execute sqlite INSERT query. Status: {}. Message: {}", + status, err_msg); + } + } + +private: + const StorageSQLite & storage; + StorageMetadataPtr metadata_snapshot; + StorageSQLite::SQLitePtr sqlite_db; + String remote_table_name; +}; + + +SinkToStoragePtr StorageSQLite::write(const ASTPtr & /* query */, const StorageMetadataPtr & metadata_snapshot, ContextPtr) +{ + if (!sqlite_db) + sqlite_db = openSQLiteDB(database_path, getContext(), /* throw_on_error */true); + return std::make_shared(*this, metadata_snapshot, sqlite_db, remote_table_name); +} + + +void registerStorageSQLite(StorageFactory & factory) +{ + factory.registerStorage("SQLite", [](const StorageFactory::Arguments & args) -> StoragePtr + { + ASTs & engine_args = args.engine_args; + + if (engine_args.size() != 2) + throw Exception("SQLite database requires 2 arguments: database path, table name", + ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); + + for (auto & engine_arg : engine_args) + engine_arg = evaluateConstantExpressionOrIdentifierAsLiteral(engine_arg, args.getLocalContext()); + + const auto database_path = engine_args[0]->as().value.safeGet(); + const auto table_name = engine_args[1]->as().value.safeGet(); + + auto sqlite_db = openSQLiteDB(database_path, args.getContext(), /* throw_on_error */!args.attach); + + return StorageSQLite::create(args.table_id, sqlite_db, database_path, + table_name, args.columns, args.constraints, args.getContext()); + }, + { + .source_access_type = AccessType::SQLITE, + }); +} + +} + +#endif diff --git a/src/Storages/StorageSQLite.h b/src/Storages/StorageSQLite.h new file mode 100644 index 00000000000..ccb807a4e47 --- /dev/null +++ b/src/Storages/StorageSQLite.h @@ -0,0 +1,55 @@ +#pragma once + +#if !defined(ARCADIA_BUILD) +#include "config_core.h" +#endif + +#if USE_SQLITE +#include +#include + +#include // Y_IGNORE + + +namespace DB +{ + +class StorageSQLite final : public shared_ptr_helper, public IStorage, public WithContext +{ +friend struct shared_ptr_helper; + +public: + using SQLitePtr = std::shared_ptr; + + StorageSQLite( + const StorageID & table_id_, + SQLitePtr sqlite_db_, + const String & database_path_, + const String & remote_table_name_, + const ColumnsDescription & columns_, + const ConstraintsDescription & constraints_, + ContextPtr context_); + + std::string getName() const override { return "SQLite"; } + + Pipe read( + const Names & column_names, + const StorageMetadataPtr & /*metadata_snapshot*/, + SelectQueryInfo & query_info, + ContextPtr context, + QueryProcessingStage::Enum processed_stage, + size_t max_block_size, + unsigned num_streams) override; + + SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; + +private: + String remote_table_name; + String database_path; + ContextPtr global_context; + SQLitePtr sqlite_db; +}; + +} + +#endif diff --git a/src/Storages/StorageSet.cpp b/src/Storages/StorageSet.cpp index f585a5747b8..67fd89f5098 100644 --- a/src/Storages/StorageSet.cpp +++ b/src/Storages/StorageSet.cpp @@ -13,6 +13,7 @@ #include #include #include +#include namespace DB @@ -30,17 +31,17 @@ namespace ErrorCodes } -class SetOrJoinBlockOutputStream : public IBlockOutputStream +class SetOrJoinSink : public SinkToStorage { public: - SetOrJoinBlockOutputStream( + SetOrJoinSink( StorageSetOrJoinBase & table_, const StorageMetadataPtr & metadata_snapshot_, const String & backup_path_, const String & backup_tmp_path_, const String & backup_file_name_, bool persistent_); - Block getHeader() const override { return metadata_snapshot->getSampleBlock(); } - void write(const Block & block) override; - void writeSuffix() override; + String getName() const override { return "SetOrJoinSink"; } + void consume(Chunk chunk) override; + void onFinish() override; private: StorageSetOrJoinBase & table; @@ -55,14 +56,15 @@ private: }; -SetOrJoinBlockOutputStream::SetOrJoinBlockOutputStream( +SetOrJoinSink::SetOrJoinSink( StorageSetOrJoinBase & table_, const StorageMetadataPtr & metadata_snapshot_, const String & backup_path_, const String & backup_tmp_path_, const String & backup_file_name_, bool persistent_) - : table(table_) + : SinkToStorage(metadata_snapshot_->getSampleBlock()) + , table(table_) , metadata_snapshot(metadata_snapshot_) , backup_path(backup_path_) , backup_tmp_path(backup_tmp_path_) @@ -74,17 +76,17 @@ SetOrJoinBlockOutputStream::SetOrJoinBlockOutputStream( { } -void SetOrJoinBlockOutputStream::write(const Block & block) +void SetOrJoinSink::consume(Chunk chunk) { /// Sort columns in the block. This is necessary, since Set and Join count on the same column order in different blocks. - Block sorted_block = block.sortColumns(); + Block sorted_block = getPort().getHeader().cloneWithColumns(chunk.detachColumns()).sortColumns(); table.insertBlock(sorted_block); if (persistent) backup_stream.write(sorted_block); } -void SetOrJoinBlockOutputStream::writeSuffix() +void SetOrJoinSink::onFinish() { table.finishInsert(); if (persistent) @@ -99,10 +101,10 @@ void SetOrJoinBlockOutputStream::writeSuffix() } -BlockOutputStreamPtr StorageSetOrJoinBase::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr /*context*/) +SinkToStoragePtr StorageSetOrJoinBase::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr /*context*/) { UInt64 id = ++increment; - return std::make_shared(*this, metadata_snapshot, path, path + "tmp/", toString(id) + ".bin", persistent); + return std::make_shared(*this, metadata_snapshot, path, path + "tmp/", toString(id) + ".bin", persistent); } diff --git a/src/Storages/StorageSet.h b/src/Storages/StorageSet.h index 90b4a00d915..1166557ec8e 100644 --- a/src/Storages/StorageSet.h +++ b/src/Storages/StorageSet.h @@ -18,12 +18,12 @@ using SetPtr = std::shared_ptr; */ class StorageSetOrJoinBase : public IStorage { - friend class SetOrJoinBlockOutputStream; + friend class SetOrJoinSink; public: void rename(const String & new_path_to_table_data, const StorageID & new_table_id) override; - BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; + SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; bool storesDataOnDisk() const override { return true; } Strings getDataPaths() const override { return {path}; } diff --git a/src/Storages/StorageStripeLog.cpp b/src/Storages/StorageStripeLog.cpp index 36b10dfd2bb..6bf91a145ed 100644 --- a/src/Storages/StorageStripeLog.cpp +++ b/src/Storages/StorageStripeLog.cpp @@ -14,7 +14,6 @@ #include #include -#include #include #include #include @@ -32,6 +31,7 @@ #include "StorageLogSettings.h" #include #include +#include #include #include @@ -154,12 +154,13 @@ private: }; -class StripeLogBlockOutputStream final : public IBlockOutputStream +class StripeLogSink final : public SinkToStorage { public: - explicit StripeLogBlockOutputStream( + explicit StripeLogSink( StorageStripeLog & storage_, const StorageMetadataPtr & metadata_snapshot_, std::unique_lock && lock_) - : storage(storage_) + : SinkToStorage(metadata_snapshot_->getSampleBlock()) + , storage(storage_) , metadata_snapshot(metadata_snapshot_) , lock(std::move(lock_)) , data_out_file(storage.table_path + "data.bin") @@ -182,7 +183,9 @@ public: } } - ~StripeLogBlockOutputStream() override + String getName() const override { return "StripeLogSink"; } + + ~StripeLogSink() override { try { @@ -203,14 +206,12 @@ public: } } - Block getHeader() const override { return metadata_snapshot->getSampleBlock(); } - - void write(const Block & block) override + void consume(Chunk chunk) override { - block_out.write(block); + block_out.write(getPort().getHeader().cloneWithColumns(chunk.detachColumns())); } - void writeSuffix() override + void onFinish() override { if (done) return; @@ -369,13 +370,13 @@ Pipe StorageStripeLog::read( } -BlockOutputStreamPtr StorageStripeLog::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr context) +SinkToStoragePtr StorageStripeLog::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr context) { std::unique_lock lock(rwlock, getLockTimeout(context)); if (!lock) throw Exception("Lock timeout exceeded", ErrorCodes::TIMEOUT_EXCEEDED); - return std::make_shared(*this, metadata_snapshot, std::move(lock)); + return std::make_shared(*this, metadata_snapshot, std::move(lock)); } diff --git a/src/Storages/StorageStripeLog.h b/src/Storages/StorageStripeLog.h index 0749273043f..73d46b1e617 100644 --- a/src/Storages/StorageStripeLog.h +++ b/src/Storages/StorageStripeLog.h @@ -19,7 +19,7 @@ namespace DB class StorageStripeLog final : public shared_ptr_helper, public IStorage { friend class StripeLogSource; - friend class StripeLogBlockOutputStream; + friend class StripeLogSink; friend struct shared_ptr_helper; public: @@ -34,7 +34,7 @@ public: size_t max_block_size, unsigned num_streams) override; - BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; + SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; void rename(const String & new_path_to_table_data, const StorageID & new_table_id) override; diff --git a/src/Storages/StorageTableFunction.h b/src/Storages/StorageTableFunction.h index 859735fec5b..75480db7ef3 100644 --- a/src/Storages/StorageTableFunction.h +++ b/src/Storages/StorageTableFunction.h @@ -113,7 +113,7 @@ public: return pipe; } - BlockOutputStreamPtr write( + SinkToStoragePtr write( const ASTPtr & query, const StorageMetadataPtr & metadata_snapshot, ContextPtr context) override diff --git a/src/Storages/StorageTinyLog.cpp b/src/Storages/StorageTinyLog.cpp index 689b1307f4d..53ae74c4e00 100644 --- a/src/Storages/StorageTinyLog.cpp +++ b/src/Storages/StorageTinyLog.cpp @@ -4,6 +4,7 @@ #include #include +#include #include @@ -22,9 +23,6 @@ #include -#include -#include - #include #include @@ -37,6 +35,7 @@ #include "StorageLogSettings.h" #include +#include #include #define DBMS_STORAGE_LOG_DATA_FILE_EXTENSION ".bin" @@ -192,14 +191,15 @@ void TinyLogSource::readData(const NameAndTypePair & name_and_type, } -class TinyLogBlockOutputStream final : public IBlockOutputStream +class TinyLogSink final : public SinkToStorage { public: - explicit TinyLogBlockOutputStream( + explicit TinyLogSink( StorageTinyLog & storage_, const StorageMetadataPtr & metadata_snapshot_, std::unique_lock && lock_) - : storage(storage_), metadata_snapshot(metadata_snapshot_), lock(std::move(lock_)) + : SinkToStorage(metadata_snapshot_->getSampleBlock()) + , storage(storage_), metadata_snapshot(metadata_snapshot_), lock(std::move(lock_)) { if (!lock) throw Exception("Lock timeout exceeded", ErrorCodes::TIMEOUT_EXCEEDED); @@ -213,7 +213,7 @@ public: } } - ~TinyLogBlockOutputStream() override + ~TinyLogSink() override { try { @@ -231,10 +231,10 @@ public: } } - Block getHeader() const override { return metadata_snapshot->getSampleBlock(); } + String getName() const override { return "TinyLogSink"; } - void write(const Block & block) override; - void writeSuffix() override; + void consume(Chunk chunk) override; + void onFinish() override; private: StorageTinyLog & storage; @@ -274,7 +274,7 @@ private: }; -ISerialization::OutputStreamGetter TinyLogBlockOutputStream::createStreamGetter( +ISerialization::OutputStreamGetter TinyLogSink::createStreamGetter( const NameAndTypePair & column, WrittenStreams & written_streams) { @@ -298,7 +298,7 @@ ISerialization::OutputStreamGetter TinyLogBlockOutputStream::createStreamGetter( } -void TinyLogBlockOutputStream::writeData(const NameAndTypePair & name_and_type, const IColumn & column, WrittenStreams & written_streams) +void TinyLogSink::writeData(const NameAndTypePair & name_and_type, const IColumn & column, WrittenStreams & written_streams) { ISerialization::SerializeBinaryBulkSettings settings; const auto & [name, type] = name_and_type; @@ -318,7 +318,7 @@ void TinyLogBlockOutputStream::writeData(const NameAndTypePair & name_and_type, } -void TinyLogBlockOutputStream::writeSuffix() +void TinyLogSink::onFinish() { if (done) return; @@ -332,7 +332,7 @@ void TinyLogBlockOutputStream::writeSuffix() WrittenStreams written_streams; ISerialization::SerializeBinaryBulkSettings settings; - for (const auto & column : getHeader()) + for (const auto & column : getPort().getHeader()) { auto it = serialize_states.find(column.name); if (it != serialize_states.end()) @@ -365,8 +365,9 @@ void TinyLogBlockOutputStream::writeSuffix() } -void TinyLogBlockOutputStream::write(const Block & block) +void TinyLogSink::consume(Chunk chunk) { + auto block = getPort().getHeader().cloneWithColumns(chunk.detachColumns()); metadata_snapshot->check(block, true); /// The set of written offset columns so that you do not write shared columns for nested structures multiple times @@ -488,7 +489,7 @@ Pipe StorageTinyLog::read( { metadata_snapshot->check(column_names, getVirtuals(), getStorageID()); - auto all_columns = metadata_snapshot->getColumns().getAllWithSubcolumns().addTypes(column_names); + auto all_columns = metadata_snapshot->getColumns().getByNames(ColumnsDescription::All, column_names, true); // When reading, we lock the entire storage, because we only have one file // per column and can't modify it concurrently. @@ -508,9 +509,9 @@ Pipe StorageTinyLog::read( } -BlockOutputStreamPtr StorageTinyLog::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr context) +SinkToStoragePtr StorageTinyLog::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr context) { - return std::make_shared(*this, metadata_snapshot, std::unique_lock{rwlock, getLockTimeout(context)}); + return std::make_shared(*this, metadata_snapshot, std::unique_lock{rwlock, getLockTimeout(context)}); } @@ -523,6 +524,34 @@ CheckResults StorageTinyLog::checkData(const ASTPtr & /* query */, ContextPtr co return file_checker.check(); } +IStorage::ColumnSizeByName StorageTinyLog::getColumnSizes() const +{ + std::shared_lock lock(rwlock, std::chrono::seconds(DBMS_DEFAULT_LOCK_ACQUIRE_TIMEOUT_SEC)); + if (!lock) + throw Exception("Lock timeout exceeded", ErrorCodes::TIMEOUT_EXCEEDED); + + ColumnSizeByName column_sizes; + FileChecker::Map file_sizes = file_checker.getFileSizes(); + + for (const auto & column : getInMemoryMetadata().getColumns().getAllPhysical()) + { + ISerialization::StreamCallback stream_callback = [&, this] (const ISerialization::SubstreamPath & substream_path) + { + String stream_name = ISerialization::getFileNameForStream(column, substream_path); + ColumnSize & size = column_sizes[column.name]; + auto it = files.find(stream_name); + if (it != files.end()) + size.data_compressed += file_sizes[fileName(it->second.data_file_path)]; + }; + + ISerialization::SubstreamPath substream_path; + auto serialization = column.type->getDefaultSerialization(); + serialization->enumerateStreams(stream_callback, substream_path); + } + + return column_sizes; +} + void StorageTinyLog::truncate( const ASTPtr &, const StorageMetadataPtr & metadata_snapshot, ContextPtr, TableExclusiveLockHolder &) { diff --git a/src/Storages/StorageTinyLog.h b/src/Storages/StorageTinyLog.h index 71763a6403e..ef45e9fb74d 100644 --- a/src/Storages/StorageTinyLog.h +++ b/src/Storages/StorageTinyLog.h @@ -18,7 +18,7 @@ namespace DB class StorageTinyLog final : public shared_ptr_helper, public IStorage { friend class TinyLogSource; - friend class TinyLogBlockOutputStream; + friend class TinyLogSink; friend struct shared_ptr_helper; public: @@ -33,7 +33,7 @@ public: size_t max_block_size, unsigned num_streams) override; - BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; + SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; void rename(const String & new_path_to_table_data, const StorageID & new_table_id) override; @@ -45,6 +45,7 @@ public: void truncate(const ASTPtr &, const StorageMetadataPtr & metadata_snapshot, ContextPtr, TableExclusiveLockHolder &) override; + ColumnSizeByName getColumnSizes() const override; protected: StorageTinyLog( DiskPtr disk_, @@ -71,7 +72,7 @@ private: Files files; FileChecker file_checker; - std::shared_timed_mutex rwlock; + mutable std::shared_timed_mutex rwlock; Poco::Logger * log; diff --git a/src/Storages/StorageURL.cpp b/src/Storages/StorageURL.cpp index fd9453e632c..1aa5ac7f236 100644 --- a/src/Storages/StorageURL.cpp +++ b/src/Storages/StorageURL.cpp @@ -16,11 +16,12 @@ #include #include -#include +#include #include #include -#include +#include +#include #include #include @@ -104,8 +105,15 @@ namespace compression_method); auto input_format = FormatFactory::instance().getInput(format, *read_buf, sample_block, context, max_block_size, format_settings); - reader = std::make_shared(input_format); - reader = std::make_shared(reader, columns, context); + pipeline = std::make_unique(); + pipeline->init(Pipe(input_format)); + + pipeline->addSimpleTransform([&](const Block & cur_header) + { + return std::make_shared(cur_header, columns, *input_format, context); + }); + + reader = std::make_unique(*pipeline); } String getName() const override @@ -118,15 +126,11 @@ namespace if (!reader) return {}; - if (!initialized) - reader->readPrefix(); + Chunk chunk; + if (reader->pull(chunk)) + return chunk; - initialized = true; - - if (auto block = reader->read()) - return Chunk(block.getColumns(), block.rows()); - - reader->readSuffix(); + pipeline->reset(); reader.reset(); return {}; @@ -135,19 +139,20 @@ namespace private: String name; std::unique_ptr read_buf; - BlockInputStreamPtr reader; - bool initialized = false; + std::unique_ptr pipeline; + std::unique_ptr reader; }; } -StorageURLBlockOutputStream::StorageURLBlockOutputStream(const Poco::URI & uri, - const String & format, - const std::optional & format_settings, - const Block & sample_block_, - ContextPtr context, - const ConnectionTimeouts & timeouts, - const CompressionMethod compression_method) - : sample_block(sample_block_) +StorageURLSink::StorageURLSink( + const Poco::URI & uri, + const String & format, + const std::optional & format_settings, + const Block & sample_block, + ContextPtr context, + const ConnectionTimeouts & timeouts, + const CompressionMethod compression_method) + : SinkToStorage(sample_block) { write_buf = wrapWriteBufferWithCompressionMethod( std::make_unique(uri, Poco::Net::HTTPRequest::HTTP_POST, timeouts), @@ -157,17 +162,18 @@ StorageURLBlockOutputStream::StorageURLBlockOutputStream(const Poco::URI & uri, } -void StorageURLBlockOutputStream::write(const Block & block) +void StorageURLSink::consume(Chunk chunk) { - writer->write(block); + if (is_first_chunk) + { + writer->writePrefix(); + is_first_chunk = false; + } + + writer->write(getPort().getHeader().cloneWithColumns(chunk.detachColumns())); } -void StorageURLBlockOutputStream::writePrefix() -{ - writer->writePrefix(); -} - -void StorageURLBlockOutputStream::writeSuffix() +void StorageURLSink::onFinish() { writer->writeSuffix(); writer->flush(); @@ -289,9 +295,9 @@ Pipe StorageURLWithFailover::read( } -BlockOutputStreamPtr IStorageURLBase::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr context) +SinkToStoragePtr IStorageURLBase::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr context) { - return std::make_shared(uri, format_name, + return std::make_shared(uri, format_name, format_settings, metadata_snapshot->getSampleBlock(), context, ConnectionTimeouts::getHTTPTimeouts(context), chooseCompressionMethod(uri.toString(), compression_method)); diff --git a/src/Storages/StorageURL.h b/src/Storages/StorageURL.h index 78306292044..7d61661b68d 100644 --- a/src/Storages/StorageURL.h +++ b/src/Storages/StorageURL.h @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include #include @@ -32,7 +32,7 @@ public: size_t max_block_size, unsigned num_streams) override; - BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; + SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; protected: IStorageURLBase( @@ -77,31 +77,27 @@ private: virtual Block getHeaderBlock(const Names & column_names, const StorageMetadataPtr & metadata_snapshot) const = 0; }; -class StorageURLBlockOutputStream : public IBlockOutputStream +class StorageURLSink : public SinkToStorage { public: - StorageURLBlockOutputStream( + StorageURLSink( const Poco::URI & uri, const String & format, const std::optional & format_settings, - const Block & sample_block_, + const Block & sample_block, ContextPtr context, const ConnectionTimeouts & timeouts, CompressionMethod compression_method); - Block getHeader() const override - { - return sample_block; - } - - void write(const Block & block) override; - void writePrefix() override; - void writeSuffix() override; + std::string getName() const override { return "StorageURLSink"; } + void consume(Chunk chunk) override; + void onFinish() override; private: - Block sample_block; std::unique_ptr write_buf; BlockOutputStreamPtr writer; + + bool is_first_chunk = true; }; class StorageURL : public shared_ptr_helper, public IStorageURLBase diff --git a/src/Storages/StorageView.cpp b/src/Storages/StorageView.cpp index 5119c5b121d..790b925f891 100644 --- a/src/Storages/StorageView.cpp +++ b/src/Storages/StorageView.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include @@ -29,6 +30,56 @@ namespace ErrorCodes extern const int LOGICAL_ERROR; } +namespace +{ + +bool isNullableOrLcNullable(DataTypePtr type) +{ + if (type->isNullable()) + return true; + + if (const auto * lc_type = typeid_cast(type.get())) + return lc_type->getDictionaryType()->isNullable(); + + return false; +} + +/// Returns `true` if there are nullable column in src but corresponding column in dst is not +bool changedNullabilityOneWay(const Block & src_block, const Block & dst_block) +{ + std::unordered_map src_nullable; + for (const auto & col : src_block) + src_nullable[col.name] = isNullableOrLcNullable(col.type); + + for (const auto & col : dst_block) + { + if (!isNullableOrLcNullable(col.type) && src_nullable[col.name]) + return true; + } + return false; +} + +bool hasJoin(const ASTSelectQuery & select) +{ + const auto & tables = select.tables(); + if (!tables || tables->children.size() < 2) + return false; + + const auto & joined_table = tables->children[1]->as(); + return joined_table.table_join != nullptr; +} + +bool hasJoin(const ASTSelectWithUnionQuery & ast) +{ + for (const auto & child : ast.list_of_selects->children) + { + if (const auto * select = child->as(); select && hasJoin(*select)) + return true; + } + return false; +} + +} StorageView::StorageView( const StorageID & table_id_, @@ -86,12 +137,7 @@ void StorageView::read( current_inner_query = query_info.view_query->clone(); } - auto modified_context = Context::createCopy(context); - /// Use settings from global context, - /// because difference between settings set on VIEW creation and query execution can break queries - modified_context->setSettings(context->getGlobalContext()->getSettingsRef()); - - InterpreterSelectWithUnionQuery interpreter(current_inner_query, modified_context, {}, column_names); + InterpreterSelectWithUnionQuery interpreter(current_inner_query, context, {}, column_names); interpreter.buildQueryPlan(query_plan); /// It's expected that the columns read from storage are not constant. @@ -104,10 +150,22 @@ void StorageView::read( query_plan.addStep(std::move(materializing)); /// And also convert to expected structure. - auto header = metadata_snapshot->getSampleBlockForColumns(column_names, getVirtuals(), getStorageID()); + const auto & expected_header = metadata_snapshot->getSampleBlockForColumns(column_names, getVirtuals(), getStorageID()); + const auto & header = query_plan.getCurrentDataStream().header; + + const auto * select_with_union = current_inner_query->as(); + if (select_with_union && hasJoin(*select_with_union) && changedNullabilityOneWay(header, expected_header)) + { + throw DB::Exception(ErrorCodes::INCORRECT_QUERY, + "Query from view {} returned Nullable column having not Nullable type in structure. " + "If query from view has JOIN, it may be cause by different values of 'json_use_nulls' setting. " + "You may explicitly specify 'json_use_nulls' in 'CREATE VIEW' query to avoid this error", + getStorageID().getFullTableName()); + } + auto convert_actions_dag = ActionsDAG::makeConvertingActions( - query_plan.getCurrentDataStream().header.getColumnsWithTypeAndName(), header.getColumnsWithTypeAndName(), + expected_header.getColumnsWithTypeAndName(), ActionsDAG::MatchColumnsMode::Name); auto converting = std::make_unique(query_plan.getCurrentDataStream(), convert_actions_dag); diff --git a/src/Storages/StorageXDBC.cpp b/src/Storages/StorageXDBC.cpp index 9cffc32fda1..123e6cfdec1 100644 --- a/src/Storages/StorageXDBC.cpp +++ b/src/Storages/StorageXDBC.cpp @@ -114,7 +114,7 @@ Pipe StorageXDBC::read( return IStorageURLBase::read(column_names, metadata_snapshot, query_info, local_context, processed_stage, max_block_size, num_streams); } -BlockOutputStreamPtr StorageXDBC::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr local_context) +SinkToStoragePtr StorageXDBC::write(const ASTPtr & /*query*/, const StorageMetadataPtr & metadata_snapshot, ContextPtr local_context) { bridge_helper->startBridgeSync(); @@ -130,7 +130,7 @@ BlockOutputStreamPtr StorageXDBC::write(const ASTPtr & /*query*/, const StorageM request_uri.addQueryParameter("format_name", format_name); request_uri.addQueryParameter("sample_block", metadata_snapshot->getSampleBlock().getNamesAndTypesList().toString()); - return std::make_shared( + return std::make_shared( request_uri, format_name, getFormatSettings(local_context), diff --git a/src/Storages/StorageXDBC.h b/src/Storages/StorageXDBC.h index db0b506546d..1a50f0461e6 100644 --- a/src/Storages/StorageXDBC.h +++ b/src/Storages/StorageXDBC.h @@ -33,7 +33,7 @@ public: ContextPtr context_, BridgeHelperPtr bridge_helper_); - BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; + SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; std::string getName() const override; private: diff --git a/src/Storages/System/StorageSystemBuildOptions.generated.cpp.in b/src/Storages/System/StorageSystemBuildOptions.generated.cpp.in index 8fe574da643..6bb97355151 100644 --- a/src/Storages/System/StorageSystemBuildOptions.generated.cpp.in +++ b/src/Storages/System/StorageSystemBuildOptions.generated.cpp.in @@ -50,6 +50,7 @@ const char * auto_config_build[] "USE_LDAP", "@USE_LDAP@", "TZDATA_VERSION", "@TZDATA_VERSION@", "USE_KRB5", "@USE_KRB5@", + "USE_BZIP2", "@USE_BZIP2@", nullptr, nullptr }; diff --git a/src/Storages/System/StorageSystemColumns.cpp b/src/Storages/System/StorageSystemColumns.cpp index 8f65147bb11..0058b58f537 100644 --- a/src/Storages/System/StorageSystemColumns.cpp +++ b/src/Storages/System/StorageSystemColumns.cpp @@ -98,7 +98,7 @@ protected: Names cols_required_for_sorting_key; Names cols_required_for_primary_key; Names cols_required_for_sampling; - MergeTreeData::ColumnSizeByName column_sizes; + IStorage::ColumnSizeByName column_sizes; { StoragePtr storage = storages.at(std::make_pair(database_name, table_name)); diff --git a/src/Storages/System/StorageSystemContributors.generated.cpp b/src/Storages/System/StorageSystemContributors.generated.cpp index f45acb0efd9..bed8eadc19c 100644 --- a/src/Storages/System/StorageSystemContributors.generated.cpp +++ b/src/Storages/System/StorageSystemContributors.generated.cpp @@ -95,6 +95,7 @@ const char * auto_contributors[] { "Anatoly Pugachev", "ana-uvarova", "AnaUvarova", + "Andreas Hunkeler", "AndreevDm", "Andrei Bodrov", "Andrei Chulkov", @@ -280,6 +281,7 @@ const char * auto_contributors[] { "Dongdong Yang", "DoomzD", "Dr. Strange Looker", + "d.v.semenov", "eaxdev", "eejoin", "egatov", @@ -290,6 +292,7 @@ const char * auto_contributors[] { "Eldar Zaitov", "Elena Baskakova", "elenaspb2019", + "elevankoff", "Elghazal Ahmed", "Elizaveta Mironyuk", "emakarov", @@ -434,6 +437,7 @@ const char * auto_contributors[] { "Ivan Starkov", "ivanzhukov", "Ivan Zhukov", + "Jack Song", "JackyWoo", "Jacob Hayes", "jakalletti", @@ -476,6 +480,7 @@ const char * auto_contributors[] { "Konstantin Lebedev", "Konstantin Malanchev", "Konstantin Podshumok", + "Konstantin Rudenskii", "Korenevskiy Denis", "Korviakov Andrey", "koshachy", @@ -488,6 +493,7 @@ const char * auto_contributors[] { "kshvakov", "kssenii", "l", + "l1tsolaiki", "lalex", "Latysheva Alexandra", "lehasm", @@ -515,6 +521,7 @@ const char * auto_contributors[] { "long2ice", "Lopatin Konstantin", "Loud_Scream", + "ltybc-coder", "luc1ph3r", "Lucid Dreams", "Luis Bosque", @@ -633,6 +640,7 @@ const char * auto_contributors[] { "nicelulu", "Nickita", "Nickolay Yastrebov", + "nickzhwang", "Nicolae Vartolomei", "Nico Mandery", "Nico Piderman", @@ -871,6 +879,7 @@ const char * auto_contributors[] { "Veselkov Konstantin", "vic", "vicdashkov", + "Victor", "Victor Tarnavsky", "Viktor Taranenko", "vinity", @@ -947,6 +956,7 @@ const char * auto_contributors[] { "Yuriy Korzhenevskiy", "Yury Karpovich", "Yury Stankevich", + "ywill3", "zamulla", "zhang2014", "zhangshengyu", @@ -957,11 +967,13 @@ const char * auto_contributors[] { "Zhichun Wu", "Zhipeng", "zhukai", + "Zijie Lu", "zlx19950903", "Zoran Pandovski", "zvonand", "zvrr", "zvvr", + "zxc111", "zzsmdfj", "Артем Стрельцов", "Владислав Тихонов", @@ -980,6 +992,7 @@ const char * auto_contributors[] { "张风啸", "徐炘", "曲正鹏", + "未来星___费", "极客青年", "谢磊", "贾顺名(Jarvis)", diff --git a/src/Storages/System/StorageSystemNumbers.cpp b/src/Storages/System/StorageSystemNumbers.cpp index 545f2c8be9a..3a88cc96639 100644 --- a/src/Storages/System/StorageSystemNumbers.cpp +++ b/src/Storages/System/StorageSystemNumbers.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #include #include diff --git a/src/Storages/System/StorageSystemPartsBase.cpp b/src/Storages/System/StorageSystemPartsBase.cpp index 7243e5aa3ba..c730d5a95c9 100644 --- a/src/Storages/System/StorageSystemPartsBase.cpp +++ b/src/Storages/System/StorageSystemPartsBase.cpp @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include #include #include @@ -124,7 +124,7 @@ StoragesInfoStream::StoragesInfoStream(const SelectQueryInfo & query_info, Conte String engine_name = storage->getName(); #if USE_MYSQL - if (auto * proxy = dynamic_cast(storage.get())) + if (auto * proxy = dynamic_cast(storage.get())) { auto nested = proxy->getNested(); storage.swap(nested); diff --git a/src/Storages/System/StorageSystemReplicas.cpp b/src/Storages/System/StorageSystemReplicas.cpp index fc33c6b421b..5c22d3c2fae 100644 --- a/src/Storages/System/StorageSystemReplicas.cpp +++ b/src/Storages/System/StorageSystemReplicas.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -51,6 +52,7 @@ StorageSystemReplicas::StorageSystemReplicas(const StorageID & table_id_) { "total_replicas", std::make_shared() }, { "active_replicas", std::make_shared() }, { "zookeeper_exception", std::make_shared() }, + { "replica_is_active", std::make_shared(std::make_shared(), std::make_shared()) } })); setInMemoryMetadata(storage_metadata); } @@ -101,7 +103,8 @@ Pipe StorageSystemReplicas::read( || column_name == "log_pointer" || column_name == "total_replicas" || column_name == "active_replicas" - || column_name == "zookeeper_exception") + || column_name == "zookeeper_exception" + || column_name == "replica_is_active") { with_zk_fields = true; break; @@ -184,6 +187,18 @@ Pipe StorageSystemReplicas::read( res_columns[col_num++]->insert(status.total_replicas); res_columns[col_num++]->insert(status.active_replicas); res_columns[col_num++]->insert(status.zookeeper_exception); + + Map replica_is_active_values; + for (const auto & [name, is_active] : status.replica_is_active) + { + Tuple is_replica_active_value; + is_replica_active_value.emplace_back(name); + is_replica_active_value.emplace_back(is_active); + + replica_is_active_values.emplace_back(std::move(is_replica_active_value)); + } + + res_columns[col_num++]->insert(std::move(replica_is_active_values)); } Block header = metadata_snapshot->getSampleBlock(); diff --git a/src/Storages/System/StorageSystemSettings.cpp b/src/Storages/System/StorageSystemSettings.cpp index 1aca7e45190..e1f1e4985b4 100644 --- a/src/Storages/System/StorageSystemSettings.cpp +++ b/src/Storages/System/StorageSystemSettings.cpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include namespace DB @@ -29,7 +29,8 @@ NamesAndTypesList StorageSystemSettings::getNamesAndTypes() void StorageSystemSettings::fillData(MutableColumns & res_columns, ContextPtr context, const SelectQueryInfo &) const { const Settings & settings = context->getSettingsRef(); - auto settings_constraints = context->getSettingsConstraints(); + auto constraints_and_current_profiles = context->getSettingsConstraintsAndCurrentProfiles(); + const auto & constraints = constraints_and_current_profiles->constraints; for (const auto & setting : settings.all()) { const auto & setting_name = setting.getName(); @@ -40,8 +41,7 @@ void StorageSystemSettings::fillData(MutableColumns & res_columns, ContextPtr co Field min, max; bool read_only = false; - if (settings_constraints) - settings_constraints->get(setting_name, min, max, read_only); + constraints.get(setting_name, min, max, read_only); /// These two columns can accept strings only. if (!min.isNull()) diff --git a/src/Storages/System/StorageSystemStackTrace.cpp b/src/Storages/System/StorageSystemStackTrace.cpp index 8b119492340..7a8ee75803f 100644 --- a/src/Storages/System/StorageSystemStackTrace.cpp +++ b/src/Storages/System/StorageSystemStackTrace.cpp @@ -223,7 +223,7 @@ void StorageSystemStackTrace::fillData(MutableColumns & res_columns, ContextPtr, { constexpr size_t comm_buf_size = 32; /// More than enough for thread name ReadBufferFromFile comm(thread_name_path.string(), comm_buf_size); - readStringUntilEOF(thread_name, comm); + readEscapedStringUntilEOL(thread_name, comm); comm.close(); } diff --git a/src/Storages/System/StorageSystemUsers.cpp b/src/Storages/System/StorageSystemUsers.cpp index 90b0a914d58..a48e12a1476 100644 --- a/src/Storages/System/StorageSystemUsers.cpp +++ b/src/Storages/System/StorageSystemUsers.cpp @@ -50,6 +50,7 @@ NamesAndTypesList StorageSystemUsers::getNamesAndTypes() {"grantees_any", std::make_shared()}, {"grantees_list", std::make_shared(std::make_shared())}, {"grantees_except", std::make_shared(std::make_shared())}, + {"default_database", std::make_shared()}, }; return names_and_types; } @@ -85,6 +86,7 @@ void StorageSystemUsers::fillData(MutableColumns & res_columns, ContextPtr conte auto & column_grantees_list_offsets = assert_cast(*res_columns[column_index++]).getOffsets(); auto & column_grantees_except = assert_cast(assert_cast(*res_columns[column_index]).getData()); auto & column_grantees_except_offsets = assert_cast(*res_columns[column_index++]).getOffsets(); + auto & column_default_database = assert_cast(*res_columns[column_index++]); auto add_row = [&](const String & name, const UUID & id, @@ -92,7 +94,8 @@ void StorageSystemUsers::fillData(MutableColumns & res_columns, ContextPtr conte const Authentication & authentication, const AllowedClientHosts & allowed_hosts, const RolesOrUsersSet & default_roles, - const RolesOrUsersSet & grantees) + const RolesOrUsersSet & grantees, + const String default_database) { column_name.insertData(name.data(), name.length()); column_id.push_back(id.toUnderType()); @@ -180,6 +183,8 @@ void StorageSystemUsers::fillData(MutableColumns & res_columns, ContextPtr conte for (const auto & except_name : grantees_ast->except_names) column_grantees_except.insertData(except_name.data(), except_name.length()); column_grantees_except_offsets.push_back(column_grantees_except.size()); + + column_default_database.insertData(default_database.data(),default_database.length()); }; for (const auto & id : ids) @@ -192,7 +197,8 @@ void StorageSystemUsers::fillData(MutableColumns & res_columns, ContextPtr conte if (!storage) continue; - add_row(user->getName(), id, storage->getStorageName(), user->authentication, user->allowed_client_hosts, user->default_roles, user->grantees); + add_row(user->getName(), id, storage->getStorageName(), user->authentication, user->allowed_client_hosts, + user->default_roles, user->grantees, user->default_database); } } diff --git a/src/Storages/System/StorageSystemWarnings.cpp b/src/Storages/System/StorageSystemWarnings.cpp new file mode 100644 index 00000000000..76b35e9b555 --- /dev/null +++ b/src/Storages/System/StorageSystemWarnings.cpp @@ -0,0 +1,21 @@ +#include +#include + + +namespace DB +{ + +NamesAndTypesList StorageSystemWarnings::getNamesAndTypes() +{ + return { + {"message", std::make_shared()}, + }; +} + +void StorageSystemWarnings::fillData(MutableColumns & res_columns, ContextPtr context, const SelectQueryInfo &) const +{ + for (const auto & warning : context->getWarnings()) + res_columns[0]->insert(warning); +} + +} diff --git a/src/Storages/System/StorageSystemWarnings.h b/src/Storages/System/StorageSystemWarnings.h new file mode 100644 index 00000000000..087c4016aff --- /dev/null +++ b/src/Storages/System/StorageSystemWarnings.h @@ -0,0 +1,27 @@ +#pragma once + +#include + + +namespace DB +{ + +class Context; + +/** Implements system.warnings table that contains warnings about server configuration + * to be displayed in clickhouse-client. + */ +class StorageSystemWarnings final : public shared_ptr_helper, + public IStorageSystemOneBlock { +public: + std::string getName() const override { return "SystemWarnings"; } + + static NamesAndTypesList getNamesAndTypes(); + +protected: + friend struct shared_ptr_helper; + using IStorageSystemOneBlock::IStorageSystemOneBlock; + + void fillData(MutableColumns & res_columns, ContextPtr, const SelectQueryInfo &) const override; +}; +} diff --git a/src/Storages/System/StorageSystemZooKeeper.cpp b/src/Storages/System/StorageSystemZooKeeper.cpp index 1a8aac3b277..d19aef47616 100644 --- a/src/Storages/System/StorageSystemZooKeeper.cpp +++ b/src/Storages/System/StorageSystemZooKeeper.cpp @@ -15,6 +15,7 @@ #include #include #include +#include namespace DB diff --git a/src/Storages/System/attachSystemTables.cpp b/src/Storages/System/attachSystemTables.cpp index 7da65b09d6d..95e86487073 100644 --- a/src/Storages/System/attachSystemTables.cpp +++ b/src/Storages/System/attachSystemTables.cpp @@ -1,3 +1,7 @@ +#if !defined(ARCADIA_BUILD) +# include "config_core.h" +#endif + #include #include #include @@ -43,6 +47,7 @@ #include #include #include +#include #include #if !defined(ARCADIA_BUILD) @@ -73,6 +78,10 @@ #include #endif +#if USE_ROCKSDB +#include +#endif + namespace DB { @@ -116,6 +125,7 @@ void attachSystemTablesLocal(IDatabase & system_database) attach(system_database, "user_directories"); attach(system_database, "privileges"); attach(system_database, "errors"); + attach(system_database, "warnings"); attach(system_database, "data_skipping_indices"); #if !defined(ARCADIA_BUILD) attach(system_database, "licenses"); @@ -124,6 +134,9 @@ void attachSystemTablesLocal(IDatabase & system_database) #ifdef OS_LINUX attach(system_database, "stack_trace"); #endif +#if USE_ROCKSDB + attach(system_database, "rocksdb"); +#endif } void attachSystemTablesServer(IDatabase & system_database, bool has_zookeeper) diff --git a/src/Storages/examples/get_abandonable_lock_in_all_partitions.cpp b/src/Storages/examples/get_abandonable_lock_in_all_partitions.cpp index 9027ba53708..0c20d2ed4c8 100644 --- a/src/Storages/examples/get_abandonable_lock_in_all_partitions.cpp +++ b/src/Storages/examples/get_abandonable_lock_in_all_partitions.cpp @@ -26,7 +26,7 @@ try auto config = processor.loadConfig().configuration; String root_path = argv[2]; - zkutil::ZooKeeper zk(*config, "zookeeper"); + zkutil::ZooKeeper zk(*config, "zookeeper", nullptr); String temp_path = root_path + "/temp"; String blocks_path = root_path + "/block_numbers"; diff --git a/src/Storages/examples/get_current_inserts_in_replicated.cpp b/src/Storages/examples/get_current_inserts_in_replicated.cpp index aa9e31792c1..94e63e49b19 100644 --- a/src/Storages/examples/get_current_inserts_in_replicated.cpp +++ b/src/Storages/examples/get_current_inserts_in_replicated.cpp @@ -29,7 +29,7 @@ try auto config = processor.loadConfig().configuration; String zookeeper_path = argv[2]; - auto zookeeper = std::make_shared(*config, "zookeeper"); + auto zookeeper = std::make_shared(*config, "zookeeper", nullptr); std::unordered_map> current_inserts; diff --git a/src/Storages/registerStorages.cpp b/src/Storages/registerStorages.cpp index 0b302ee437a..333f35774e2 100644 --- a/src/Storages/registerStorages.cpp +++ b/src/Storages/registerStorages.cpp @@ -67,6 +67,11 @@ void registerStorageMaterializedPostgreSQL(StorageFactory & factory); void registerStorageExternalDistributed(StorageFactory & factory); #endif +#if USE_SQLITE +void registerStorageSQLite(StorageFactory & factory); +#endif + + void registerStorages() { auto & factory = StorageFactory::instance(); @@ -128,6 +133,10 @@ void registerStorages() #if USE_MYSQL || USE_LIBPQXX registerStorageExternalDistributed(factory); #endif + + #if USE_SQLITE + registerStorageSQLite(factory); + #endif } } diff --git a/src/Storages/tests/gtest_storage_log.cpp b/src/Storages/tests/gtest_storage_log.cpp index e8057c54a0f..16902eafc98 100644 --- a/src/Storages/tests/gtest_storage_log.cpp +++ b/src/Storages/tests/gtest_storage_log.cpp @@ -1,7 +1,7 @@ #include #include -#include +#include #include #include #include @@ -100,7 +100,7 @@ std::string writeData(int rows, DB::StoragePtr & table, const DB::ContextPtr con block.insert(column); } - BlockOutputStreamPtr out = table->write({}, metadata_snapshot, context); + auto out = std::make_shared(table->write({}, metadata_snapshot, context)); out->write(block); out->writeSuffix(); diff --git a/src/Storages/ya.make b/src/Storages/ya.make index 6e412cddba7..b3494849441 100644 --- a/src/Storages/ya.make +++ b/src/Storages/ya.make @@ -16,8 +16,8 @@ SRCS( ColumnsDescription.cpp ConstraintsDescription.cpp Distributed/DirectoryMonitor.cpp - Distributed/DistributedBlockOutputStream.cpp Distributed/DistributedSettings.cpp + Distributed/DistributedSink.cpp IStorage.cpp IndicesDescription.cpp JoinSettings.cpp @@ -30,6 +30,7 @@ SRCS( MergeTree/BackgroundJobsExecutor.cpp MergeTree/BoolMask.cpp MergeTree/DataPartsExchange.cpp + MergeTree/DropPartsRanges.cpp MergeTree/EphemeralLockInZooKeeper.cpp MergeTree/IMergeTreeDataPart.cpp MergeTree/IMergeTreeDataPartWriter.cpp @@ -40,7 +41,6 @@ SRCS( MergeTree/MergeAlgorithm.cpp MergeTree/MergeList.cpp MergeTree/MergeTreeBaseSelectProcessor.cpp - MergeTree/MergeTreeBlockOutputStream.cpp MergeTree/MergeTreeBlockReadUtils.cpp MergeTree/MergeTreeData.cpp MergeTree/MergeTreeDataMergerMutator.cpp @@ -58,6 +58,7 @@ SRCS( MergeTree/MergeTreeDataSelectExecutor.cpp MergeTree/MergeTreeDataWriter.cpp MergeTree/MergeTreeDeduplicationLog.cpp + MergeTree/MergeTreeInOrderSelectProcessor.cpp MergeTree/MergeTreeIndexAggregatorBloomFilter.cpp MergeTree/MergeTreeIndexBloomFilter.cpp MergeTree/MergeTreeIndexConditionBloomFilter.cpp @@ -86,7 +87,8 @@ SRCS( MergeTree/MergeTreeSelectProcessor.cpp MergeTree/MergeTreeSequentialSource.cpp MergeTree/MergeTreeSettings.cpp - MergeTree/MergeTreeThreadSelectBlockInputProcessor.cpp + MergeTree/MergeTreeSink.cpp + MergeTree/MergeTreeThreadSelectProcessor.cpp MergeTree/MergeTreeWhereOptimizer.cpp MergeTree/MergeTreeWriteAheadLog.cpp MergeTree/MergeType.cpp @@ -98,7 +100,6 @@ SRCS( MergeTree/ReplicatedFetchList.cpp MergeTree/ReplicatedMergeTreeAddress.cpp MergeTree/ReplicatedMergeTreeAltersSequence.cpp - MergeTree/ReplicatedMergeTreeBlockOutputStream.cpp MergeTree/ReplicatedMergeTreeCleanupThread.cpp MergeTree/ReplicatedMergeTreeLogEntry.cpp MergeTree/ReplicatedMergeTreeMergeStrategyPicker.cpp @@ -107,6 +108,7 @@ SRCS( MergeTree/ReplicatedMergeTreePartHeader.cpp MergeTree/ReplicatedMergeTreeQueue.cpp MergeTree/ReplicatedMergeTreeRestartingThread.cpp + MergeTree/ReplicatedMergeTreeSink.cpp MergeTree/ReplicatedMergeTreeTableMetadata.cpp MergeTree/SimpleMergeSelector.cpp MergeTree/TTLMergeSelector.cpp @@ -117,6 +119,7 @@ SRCS( MySQL/MySQLSettings.cpp PartitionCommands.cpp ProjectionsDescription.cpp + ReadFinalForExternalReplicaStorage.cpp ReadInOrderOptimizer.cpp SelectQueryDescription.cpp SetSettings.cpp @@ -132,15 +135,17 @@ SRCS( StorageJoin.cpp StorageLog.cpp StorageLogSettings.cpp - StorageMaterializeMySQL.cpp + StorageMaterializedMySQL.cpp StorageMaterializedView.cpp StorageMemory.cpp StorageMerge.cpp StorageMergeTree.cpp StorageMongoDB.cpp + StorageMongoDBSocketFactory.cpp StorageMySQL.cpp StorageNull.cpp StorageReplicatedMergeTree.cpp + StorageSQLite.cpp StorageSet.cpp StorageStripeLog.cpp StorageTinyLog.cpp @@ -208,6 +213,7 @@ SRCS( System/StorageSystemTables.cpp System/StorageSystemUserDirectories.cpp System/StorageSystemUsers.cpp + System/StorageSystemWarnings.cpp System/StorageSystemZeros.cpp System/StorageSystemZooKeeper.cpp System/attachSystemTables.cpp diff --git a/src/TableFunctions/ITableFunctionFileLike.cpp b/src/TableFunctions/ITableFunctionFileLike.cpp index 3c4ab0edbab..1b96a0fe713 100644 --- a/src/TableFunctions/ITableFunctionFileLike.cpp +++ b/src/TableFunctions/ITableFunctionFileLike.cpp @@ -10,11 +10,13 @@ #include #include -#include #include #include +#include + + namespace DB { @@ -83,8 +85,8 @@ ColumnsDescription ITableFunctionFileLike::getActualTableStructure(ContextPtr co Strings paths = StorageFile::getPathsList(filename, context->getUserFilesPath(), context, total_bytes_to_read); if (paths.empty()) throw Exception("Cannot get table structure from file, because no files match specified name", ErrorCodes::INCORRECT_FILE_NAME); - auto read_stream = StorageDistributedDirectoryMonitor::createStreamFromFile(paths[0]); - return ColumnsDescription{read_stream->getHeader().getNamesAndTypesList()}; + auto read_stream = StorageDistributedDirectoryMonitor::createSourceFromFile(paths[0]); + return ColumnsDescription{read_stream->getOutputs().front().getHeader().getNamesAndTypesList()}; } return parseColumnsListFromString(structure, context); } diff --git a/src/TableFunctions/TableFunctionMerge.cpp b/src/TableFunctions/TableFunctionMerge.cpp index 051aa38398f..81dde4a12a4 100644 --- a/src/TableFunctions/TableFunctionMerge.cpp +++ b/src/TableFunctions/TableFunctionMerge.cpp @@ -18,17 +18,20 @@ namespace DB namespace ErrorCodes { extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; - extern const int UNKNOWN_TABLE; + extern const int BAD_ARGUMENTS; } namespace { - [[noreturn]] void throwNoTablesMatchRegexp(const String & source_database, const String & source_table_regexp) + [[noreturn]] void throwNoTablesMatchRegexp(const String & source_database_regexp, const String & source_table_regexp) { throw Exception( - "Error while executing table function merge. In database " + source_database - + " no one matches regular expression: " + source_table_regexp, - ErrorCodes::UNKNOWN_TABLE); + ErrorCodes::BAD_ARGUMENTS, + "Error while executing table function merge. Either there is no database, which matches regular expression `{}`, or there are " + "no tables in database matches `{}`, which fit tables expression: {}", + source_database_regexp, + source_database_regexp, + source_table_regexp); } } @@ -49,58 +52,72 @@ void TableFunctionMerge::parseArguments(const ASTPtr & ast_function, ContextPtr " - name of source database and regexp for table names.", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); - args[0] = evaluateConstantExpressionForDatabaseName(args[0], context); - args[1] = evaluateConstantExpressionAsLiteral(args[1], context); + auto [is_regexp, database_ast] = evaluateDatabaseNameForMergeEngine(args[0], context); - source_database = args[0]->as().value.safeGet(); + database_is_regexp = is_regexp; + + if (!is_regexp) + args[0] = database_ast; + source_database_name_or_regexp = database_ast->as().value.safeGet(); + + args[1] = evaluateConstantExpressionAsLiteral(args[1], context); source_table_regexp = args[1]->as().value.safeGet(); } -const Strings & TableFunctionMerge::getSourceTables(ContextPtr context) const +const TableFunctionMerge::DbToTableSetMap & TableFunctionMerge::getSourceDatabasesAndTables(ContextPtr context) const { - if (source_tables) - return *source_tables; + if (source_databases_and_tables) + return *source_databases_and_tables; - auto database = DatabaseCatalog::instance().getDatabase(source_database); + source_databases_and_tables.emplace(); - OptimizedRegularExpression re(source_table_regexp); - auto table_name_match = [&](const String & table_name_) { return re.match(table_name_); }; - - auto access = context->getAccess(); - bool granted_show_on_all_tables = access->isGranted(AccessType::SHOW_TABLES, source_database); - bool granted_select_on_all_tables = access->isGranted(AccessType::SELECT, source_database); - - source_tables.emplace(); - for (auto it = database->getTablesIterator(context, table_name_match); it->isValid(); it->next()) + /// database_name is not a regexp + if (!database_is_regexp) { - if (!it->table()) - continue; - bool granted_show = granted_show_on_all_tables || access->isGranted(AccessType::SHOW_TABLES, source_database, it->name()); - if (!granted_show) - continue; - if (!granted_select_on_all_tables) - access->checkAccess(AccessType::SELECT, source_database, it->name()); - source_tables->emplace_back(it->name()); + auto source_tables = getMatchedTablesWithAccess(source_database_name_or_regexp, source_table_regexp, context); + if (source_tables.empty()) + throwNoTablesMatchRegexp(source_database_name_or_regexp, source_table_regexp); + (*source_databases_and_tables)[source_database_name_or_regexp] = source_tables; } - if (source_tables->empty()) - throwNoTablesMatchRegexp(source_database, source_table_regexp); + /// database_name is a regexp + else + { + OptimizedRegularExpression database_re(source_database_name_or_regexp); + auto databases = DatabaseCatalog::instance().getDatabases(); - return *source_tables; + for (const auto & db : databases) + { + if (database_re.match(db.first)) + { + auto source_tables = getMatchedTablesWithAccess(db.first, source_table_regexp, context); + + if (!source_tables.empty()) + (*source_databases_and_tables)[db.first] = source_tables; + } + } + + if ((*source_databases_and_tables).empty()) + throwNoTablesMatchRegexp(source_database_name_or_regexp, source_table_regexp); + } + + return *source_databases_and_tables; } - ColumnsDescription TableFunctionMerge::getActualTableStructure(ContextPtr context) const { - for (const auto & table_name : getSourceTables(context)) + for (const auto & db_with_tables : getSourceDatabasesAndTables(context)) { - auto storage = DatabaseCatalog::instance().tryGetTable(StorageID{source_database, table_name}, context); - if (storage) - return ColumnsDescription{storage->getInMemoryMetadataPtr()->getColumns().getAllPhysical()}; + for (const auto & table : db_with_tables.second) + { + auto storage = DatabaseCatalog::instance().tryGetTable(StorageID{db_with_tables.first, table}, context); + if (storage) + return ColumnsDescription{storage->getInMemoryMetadataPtr()->getColumns().getAllPhysical()}; + } } - throwNoTablesMatchRegexp(source_database, source_table_regexp); + throwNoTablesMatchRegexp(source_database_name_or_regexp, source_table_regexp); } @@ -110,14 +127,44 @@ StoragePtr TableFunctionMerge::executeImpl(const ASTPtr & /*ast_function*/, Cont StorageID(getDatabaseName(), table_name), getActualTableStructure(context), String{}, - source_database, - getSourceTables(context), + source_database_name_or_regexp, + database_is_regexp, + getSourceDatabasesAndTables(context), context); res->startup(); return res; } +TableFunctionMerge::TableSet +TableFunctionMerge::getMatchedTablesWithAccess(const String & database_name, const String & table_regexp, const ContextPtr & context) +{ + OptimizedRegularExpression table_re(table_regexp); + + auto table_name_match = [&](const String & table_name) { return table_re.match(table_name); }; + + auto access = context->getAccess(); + + auto database = DatabaseCatalog::instance().getDatabase(database_name); + + bool granted_show_on_all_tables = access->isGranted(AccessType::SHOW_TABLES, database_name); + bool granted_select_on_all_tables = access->isGranted(AccessType::SELECT, database_name); + + TableSet tables; + + for (auto it = database->getTablesIterator(context, table_name_match); it->isValid(); it->next()) + { + if (!it->table()) + continue; + bool granted_show = granted_show_on_all_tables || access->isGranted(AccessType::SHOW_TABLES, database_name, it->name()); + if (!granted_show) + continue; + if (!granted_select_on_all_tables) + access->checkAccess(AccessType::SELECT, database_name, it->name()); + tables.emplace(it->name()); + } + return tables; +} void registerTableFunctionMerge(TableFunctionFactory & factory) { diff --git a/src/TableFunctions/TableFunctionMerge.h b/src/TableFunctions/TableFunctionMerge.h index 04027b9d76a..73b61f8eb79 100644 --- a/src/TableFunctions/TableFunctionMerge.h +++ b/src/TableFunctions/TableFunctionMerge.h @@ -15,17 +15,22 @@ class TableFunctionMerge : public ITableFunction public: static constexpr auto name = "merge"; std::string getName() const override { return name; } + private: StoragePtr executeImpl(const ASTPtr & ast_function, ContextPtr context, const std::string & table_name, ColumnsDescription cached_columns) const override; const char * getStorageTypeName() const override { return "Merge"; } - const Strings & getSourceTables(ContextPtr context) const; + using TableSet = std::set; + using DbToTableSetMap = std::map; + const DbToTableSetMap & getSourceDatabasesAndTables(ContextPtr context) const; ColumnsDescription getActualTableStructure(ContextPtr context) const override; void parseArguments(const ASTPtr & ast_function, ContextPtr context) override; + static TableSet getMatchedTablesWithAccess(const String & database_name, const String & table_regexp, const ContextPtr & context); - String source_database; + String source_database_name_or_regexp; String source_table_regexp; - mutable std::optional source_tables; + bool database_is_regexp = false; + mutable std::optional source_databases_and_tables; }; diff --git a/src/TableFunctions/TableFunctionMySQL.cpp b/src/TableFunctions/TableFunctionMySQL.cpp index f8e0c41634b..09f9cf8b1f5 100644 --- a/src/TableFunctions/TableFunctionMySQL.cpp +++ b/src/TableFunctions/TableFunctionMySQL.cpp @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/TableFunctions/TableFunctionPostgreSQL.cpp b/src/TableFunctions/TableFunctionPostgreSQL.cpp index ceea29b335b..d701728479b 100644 --- a/src/TableFunctions/TableFunctionPostgreSQL.cpp +++ b/src/TableFunctions/TableFunctionPostgreSQL.cpp @@ -37,7 +37,6 @@ StoragePtr TableFunctionPostgreSQL::executeImpl(const ASTPtr & /*ast_function*/, columns, ConstraintsDescription{}, String{}, - context, remote_table_schema); result->startup(); diff --git a/src/TableFunctions/TableFunctionRemote.cpp b/src/TableFunctions/TableFunctionRemote.cpp index 4d3524c7563..08f61a49fa5 100644 --- a/src/TableFunctions/TableFunctionRemote.cpp +++ b/src/TableFunctions/TableFunctionRemote.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -153,18 +154,14 @@ void TableFunctionRemote::parseArguments(const ASTPtr & ast_function, ContextPtr if (arg_num < args.size()) throw Exception(help_message, ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); - /// ExpressionAnalyzer will be created in InterpreterSelectQuery that will meet these `Identifier` when processing the request. - /// We need to mark them as the name of the database or table, because the default value is column. - for (auto ast : args) - setIdentifierSpecial(ast); - if (!cluster_name.empty()) { /// Use an existing cluster from the main config + String cluster_name_expanded = context->getMacros()->expand(cluster_name); if (name != "clusterAllReplicas") - cluster = context->getCluster(cluster_name); + cluster = context->getCluster(cluster_name_expanded); else - cluster = context->getCluster(cluster_name)->getClusterWithReplicasAsShards(context->getSettings()); + cluster = context->getCluster(cluster_name_expanded)->getClusterWithReplicasAsShards(context->getSettings()); } else { @@ -197,13 +194,16 @@ void TableFunctionRemote::parseArguments(const ASTPtr & ast_function, ContextPtr } } + bool treat_local_as_remote = false; + bool treat_local_port_as_remote = context->getApplicationType() == Context::ApplicationType::LOCAL; cluster = std::make_shared( context->getSettings(), names, username, password, (secure ? (maybe_secure_port ? *maybe_secure_port : DBMS_DEFAULT_SECURE_PORT) : context->getTCPPort()), - false, + treat_local_as_remote, + treat_local_port_as_remote, secure); } diff --git a/src/TableFunctions/TableFunctionSQLite.cpp b/src/TableFunctions/TableFunctionSQLite.cpp new file mode 100644 index 00000000000..a2038725d07 --- /dev/null +++ b/src/TableFunctions/TableFunctionSQLite.cpp @@ -0,0 +1,90 @@ +#include + +#if USE_SQLITE + +#include +#include + +#include +#include +#include "registerTableFunctions.h" + +#include +#include + +#include +#include + +#include +#include + + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; + extern const int BAD_ARGUMENTS; + extern const int SQLITE_ENGINE_ERROR; +} + + +StoragePtr TableFunctionSQLite::executeImpl(const ASTPtr & /*ast_function*/, + ContextPtr context, const String & table_name, ColumnsDescription /*cached_columns*/) const +{ + auto columns = getActualTableStructure(context); + + auto storage = StorageSQLite::create(StorageID(getDatabaseName(), table_name), + sqlite_db, + database_path, + remote_table_name, + columns, ConstraintsDescription{}, context); + + storage->startup(); + return storage; +} + + +ColumnsDescription TableFunctionSQLite::getActualTableStructure(ContextPtr /* context */) const +{ + auto columns = fetchSQLiteTableStructure(sqlite_db.get(), remote_table_name); + + if (!columns) + throw Exception(ErrorCodes::SQLITE_ENGINE_ERROR, "Failed to fetch table structure for {}", remote_table_name); + + return ColumnsDescription{*columns}; +} + + +void TableFunctionSQLite::parseArguments(const ASTPtr & ast_function, ContextPtr context) +{ + const auto & func_args = ast_function->as(); + + if (!func_args.arguments) + throw Exception("Table function 'sqlite' must have arguments.", ErrorCodes::BAD_ARGUMENTS); + + ASTs & args = func_args.arguments->children; + + if (args.size() != 2) + throw Exception("SQLite database requires 2 arguments: database path, table name", + ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); + + for (auto & arg : args) + arg = evaluateConstantExpressionOrIdentifierAsLiteral(arg, context); + + database_path = args[0]->as().value.safeGet(); + remote_table_name = args[1]->as().value.safeGet(); + + sqlite_db = openSQLiteDB(database_path, context); +} + + +void registerTableFunctionSQLite(TableFunctionFactory & factory) +{ + factory.registerFunction(); +} + +} + +#endif diff --git a/src/TableFunctions/TableFunctionSQLite.h b/src/TableFunctions/TableFunctionSQLite.h new file mode 100644 index 00000000000..4649dac016f --- /dev/null +++ b/src/TableFunctions/TableFunctionSQLite.h @@ -0,0 +1,36 @@ +#pragma once +#if !defined(ARCADIA_BUILD) +#include "config_core.h" +#endif + +#if USE_SQLITE +#include +#include + + +namespace DB +{ + +class TableFunctionSQLite : public ITableFunction +{ +public: + static constexpr auto name = "sqlite"; + std::string getName() const override { return name; } + +private: + StoragePtr executeImpl( + const ASTPtr & ast_function, ContextPtr context, + const std::string & table_name, ColumnsDescription cached_columns) const override; + + const char * getStorageTypeName() const override { return "SQLite"; } + + ColumnsDescription getActualTableStructure(ContextPtr context) const override; + void parseArguments(const ASTPtr & ast_function, ContextPtr context) override; + + String database_path, remote_table_name; + std::shared_ptr sqlite_db; +}; + +} + +#endif diff --git a/src/TableFunctions/registerTableFunctions.cpp b/src/TableFunctions/registerTableFunctions.cpp index 6cf40c4f090..2aee91997b0 100644 --- a/src/TableFunctions/registerTableFunctions.cpp +++ b/src/TableFunctions/registerTableFunctions.cpp @@ -42,6 +42,10 @@ void registerTableFunctions() registerTableFunctionPostgreSQL(factory); #endif +#if USE_SQLITE + registerTableFunctionSQLite(factory); +#endif + registerTableFunctionDictionary(factory); } diff --git a/src/TableFunctions/registerTableFunctions.h b/src/TableFunctions/registerTableFunctions.h index c49fafc5f86..6a13c82caba 100644 --- a/src/TableFunctions/registerTableFunctions.h +++ b/src/TableFunctions/registerTableFunctions.h @@ -42,6 +42,10 @@ void registerTableFunctionMySQL(TableFunctionFactory & factory); void registerTableFunctionPostgreSQL(TableFunctionFactory & factory); #endif +#if USE_SQLITE +void registerTableFunctionSQLite(TableFunctionFactory & factory); +#endif + void registerTableFunctionDictionary(TableFunctionFactory & factory); void registerTableFunctions(); diff --git a/src/TableFunctions/ya.make b/src/TableFunctions/ya.make index f50e345f2d8..e957c923423 100644 --- a/src/TableFunctions/ya.make +++ b/src/TableFunctions/ya.make @@ -22,6 +22,7 @@ SRCS( TableFunctionNull.cpp TableFunctionNumbers.cpp TableFunctionRemote.cpp + TableFunctionSQLite.cpp TableFunctionURL.cpp TableFunctionValues.cpp TableFunctionView.cpp diff --git a/tests/.gitignore b/tests/.gitignore index ac05cdced53..6604360fe12 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -3,3 +3,6 @@ *.error *.dump test_data + +/queries/0_stateless/*.gen.sql +/queries/0_stateless/*.gen.reference diff --git a/tests/clickhouse-test b/tests/clickhouse-test index 63624246190..c627810a550 100755 --- a/tests/clickhouse-test +++ b/tests/clickhouse-test @@ -11,6 +11,7 @@ import copy import traceback from argparse import ArgumentParser +from typing import Tuple, Union, Optional, TextIO import shlex import subprocess from subprocess import Popen @@ -20,16 +21,26 @@ from subprocess import TimeoutExpired from datetime import datetime from time import time, sleep from errno import ESRCH + try: import termcolor except ImportError: termcolor = None + import random import string import multiprocessing +import socket from contextlib import closing -DISTRIBUTED_DDL_TIMEOUT_MSG = "is executing longer than distributed_ddl_task_timeout (=120)" +USE_JINJA = True +try: + import jinja2 +except ImportError: + USE_JINJA = False + print('WARNING: jinja2 not installed! Template tests will be skipped.') + +DISTRIBUTED_DDL_TIMEOUT_MSG = "is executing longer than distributed_ddl_task_timeout" MESSAGES_TO_RETRY = [ "DB::Exception: ZooKeeper session has been expired", @@ -41,27 +52,39 @@ MESSAGES_TO_RETRY = [ "Operation timed out", "ConnectionPoolWithFailover: Connection failed at try", "DB::Exception: New table appeared in database being dropped or detached. Try again", - DISTRIBUTED_DDL_TIMEOUT_MSG # FIXME + "is already started to be removing by another replica right now", + "Shutdown is called for table", # It happens in SYSTEM SYNC REPLICA query if session with ZooKeeper is being reinitialized. + DISTRIBUTED_DDL_TIMEOUT_MSG # FIXME ] MAX_RETRIES = 3 +TEST_FILE_EXTENSIONS = ['.sql', '.sql.j2', '.sh', '.py', '.expect'] + class Terminated(KeyboardInterrupt): pass + def signal_handler(sig, frame): raise Terminated(f'Terminated with {sig} signal') def stop_tests(): - # send signal to all processes in group to avoid hung check triggering - # (to avoid terminating clickhouse-test itself, the signal should be ignored) - signal.signal(signal.SIGTERM, signal.SIG_IGN) - os.killpg(os.getpgid(os.getpid()), signal.SIGTERM) - signal.signal(signal.SIGTERM, signal.SIG_DFL) + global stop_tests_triggered_lock + global stop_tests_triggered + + with stop_tests_triggered_lock: + if not stop_tests_triggered.is_set(): + stop_tests_triggered.set() + + # send signal to all processes in group to avoid hung check triggering + # (to avoid terminating clickhouse-test itself, the signal should be ignored) + signal.signal(signal.SIGTERM, signal.SIG_IGN) + os.killpg(os.getpgid(os.getpid()), signal.SIGTERM) + signal.signal(signal.SIGTERM, signal.SIG_DFL) def json_minify(string): """ Removes all js-style comments from json string. Allows to have comments in skip_list.json. - The code taken from https://github.com/getify/JSON.minify/tree/python under the MIT license. + The code was taken from https://github.com/getify/JSON.minify/tree/python under the MIT license. """ tokenizer = re.compile(r'"|(/\*)|(\*/)|(//)|\n|\r') @@ -128,13 +151,17 @@ def remove_control_characters(s): s = re.sub(r"[\x00-\x08\x0b\x0e-\x1f\x7f]", "", s) return s + def get_db_engine(args, database_name): if args.replicated_database: - return " ON CLUSTER test_cluster_database_replicated ENGINE=Replicated('/test/clickhouse/db/{}', '{{shard}}', '{{replica}}')".format(database_name) + return f" ON CLUSTER test_cluster_database_replicated \ + ENGINE=Replicated('/test/clickhouse/db/{database_name}', \ + '{{shard}}', '{{replica}}')" if args.db_engine: return " ENGINE=" + args.db_engine return "" # Will use default engine + def configure_testcase_args(args, case_file, suite_tmp_dir, stderr_file): testcase_args = copy.deepcopy(args) @@ -146,7 +173,6 @@ def configure_testcase_args(args, case_file, suite_tmp_dir, stderr_file): database = testcase_args.database os.environ.setdefault("CLICKHOUSE_DATABASE", database) os.environ.setdefault("CLICKHOUSE_TMP", suite_tmp_dir) - else: # If --database is not specified, we will create temporary database with unique name # And we will recreate and drop it for each test @@ -156,7 +182,14 @@ def configure_testcase_args(args, case_file, suite_tmp_dir, stderr_file): database = 'test_{suffix}'.format(suffix=random_str()) with open(stderr_file, 'w') as stderr: - clickhouse_proc_create = Popen(shlex.split(testcase_args.testcase_client), stdin=PIPE, stdout=PIPE, stderr=stderr, universal_newlines=True) + client_cmd = testcase_args.testcase_client + " " \ + + get_additional_client_options(args) + + clickhouse_proc_create = open_client_process( + universal_newlines=True, + client_args=client_cmd, + stderr_file=stderr) + try: clickhouse_proc_create.communicate(("CREATE DATABASE " + database + get_db_engine(testcase_args, database)), timeout=testcase_args.timeout) except TimeoutExpired: @@ -216,8 +249,10 @@ def run_single_test(args, ext, server_logs_level, client_options, case_file, std if need_drop_database: with open(stderr_file, 'a') as stderr: - clickhouse_proc_create = Popen(shlex.split(client), stdin=PIPE, stdout=PIPE, stderr=stderr, universal_newlines=True) + clickhouse_proc_create = open_client_process(client, universal_newlines=True, stderr_file=stderr) + seconds_left = max(args.timeout - (datetime.now() - start_time).total_seconds(), 20) + try: drop_database_query = "DROP DATABASE " + database if args.replicated_database: @@ -233,7 +268,7 @@ def run_single_test(args, ext, server_logs_level, client_options, case_file, std raise total_time = (datetime.now() - start_time).total_seconds() - return clickhouse_proc_create, "", "Timeout dropping database {} after test".format(database), total_time + return clickhouse_proc_create, "", f"Timeout dropping database {database} after test", total_time shutil.rmtree(args.test_tmp_dir) @@ -247,6 +282,9 @@ def run_single_test(args, ext, server_logs_level, client_options, case_file, std os.system("LC_ALL=C sed -i -e 's|/auto_{{shard}}||g' {file}".format(file=stdout_file)) os.system("LC_ALL=C sed -i -e 's|auto_{{replica}}||g' {file}".format(file=stdout_file)) + # Normalize hostname in stdout file. + os.system("LC_ALL=C sed -i -e 's/{hostname}/localhost/g' {file}".format(hostname=socket.gethostname(), file=stdout_file)) + stdout = open(stdout_file, 'rb').read() if os.path.exists(stdout_file) else b'' stdout = str(stdout, errors='replace', encoding='utf-8') stderr = open(stderr_file, 'rb').read() if os.path.exists(stderr_file) else b'' @@ -255,19 +293,23 @@ def run_single_test(args, ext, server_logs_level, client_options, case_file, std return proc, stdout, stderr, total_time -def need_retry(stderr): - return any(msg in stderr for msg in MESSAGES_TO_RETRY) +def need_retry(stdout, stderr): + return any(msg in stdout for msg in MESSAGES_TO_RETRY) or any(msg in stderr for msg in MESSAGES_TO_RETRY) def get_processlist(args): try: query = b"SHOW PROCESSLIST FORMAT Vertical" + if args.replicated_database: query = b"SELECT materialize((hostName(), tcpPort())) as host, * " \ b"FROM clusterAllReplicas('test_cluster_database_replicated', system.processes) " \ b"WHERE query NOT LIKE '%system.processes%' FORMAT Vertical" - clickhouse_proc = Popen(shlex.split(args.client), stdin=PIPE, stdout=PIPE, stderr=PIPE) + + clickhouse_proc = open_client_process(args.client) + (stdout, _) = clickhouse_proc.communicate((query), timeout=20) + return False, stdout.decode('utf-8') except Exception as ex: print("Exception", ex) @@ -277,47 +319,90 @@ def get_processlist(args): # collect server stacktraces using gdb def get_stacktraces_from_gdb(server_pid): try: - cmd = "gdb -batch -ex 'thread apply all backtrace' -p {}".format(server_pid) + cmd = f"gdb -batch -ex 'thread apply all backtrace' -p {server_pid}" return subprocess.check_output(cmd, shell=True).decode('utf-8') - except Exception as ex: - print("Error occured while receiving stack traces from gdb: {}".format(str(ex))) + except Exception as e: + print(f"Error occurred while receiving stack traces from gdb: {e}") return None # collect server stacktraces from system.stack_trace table # it does not work in Sandbox def get_stacktraces_from_clickhouse(client, replicated_database=False): - try: - if replicated_database: - return subprocess.check_output("{} --allow_introspection_functions=1 --skip_unavailable_shards=1 --query " - "\"SELECT materialize((hostName(), tcpPort())) as host, thread_id, " - "arrayStringConcat(arrayMap(x, y -> concat(x, ': ', y), arrayMap(x -> addressToLine(x), trace), " - "arrayMap(x -> demangle(addressToSymbol(x)), trace)), '\n') as trace " - "FROM clusterAllReplicas('test_cluster_database_replicated', 'system.stack_trace') " - "ORDER BY host, thread_id format Vertical\"".format(client), shell=True, stderr=subprocess.STDOUT).decode('utf-8') + replicated_msg = \ + "{} --allow_introspection_functions=1 --skip_unavailable_shards=1 --query \ + \"SELECT materialize((hostName(), tcpPort())) as host, thread_id, \ + arrayStringConcat(arrayMap(x, y -> concat(x, ': ', y), \ + arrayMap(x -> addressToLine(x), trace), \ + arrayMap(x -> demangle(addressToSymbol(x)), trace)), '\n') as trace \ + FROM clusterAllReplicas('test_cluster_database_replicated', 'system.stack_trace') \ + ORDER BY host, thread_id FORMAT Vertical\"".format(client) - return subprocess.check_output("{} --allow_introspection_functions=1 --query " - "\"SELECT arrayStringConcat(arrayMap(x, y -> concat(x, ': ', y), arrayMap(x -> addressToLine(x), trace), " - "arrayMap(x -> demangle(addressToSymbol(x)), trace)), '\n') as trace " - "FROM system.stack_trace format Vertical\"".format(client), shell=True, stderr=subprocess.STDOUT).decode('utf-8') - except Exception as ex: - print("Error occured while receiving stack traces from client: {}".format(str(ex))) + msg = \ + "{} --allow_introspection_functions=1 --query \ + \"SELECT arrayStringConcat(arrayMap(x, y -> concat(x, ': ', y), \ + arrayMap(x -> addressToLine(x), trace), \ + arrayMap(x -> demangle(addressToSymbol(x)), trace)), '\n') as trace \ + FROM system.stack_trace FORMAT Vertical\"".format(client) + + try: + return subprocess.check_output( + replicated_msg if replicated_database else msg, + shell=True, stderr=subprocess.STDOUT).decode('utf-8') + except Exception as e: + print(f"Error occurred while receiving stack traces from client: {e}") return None -def get_server_pid(server_tcp_port): + +def print_stacktraces() -> None: + server_pid = get_server_pid() + + bt = None + + if server_pid and not args.replicated_database: + print("") + print(f"Located ClickHouse server process {server_pid} listening at TCP port {args.tcp_port}") + print("Collecting stacktraces from all running threads with gdb:") + + bt = get_stacktraces_from_gdb(server_pid) + + if len(bt) < 1000: + print("Got suspiciously small stacktraces: ", bt) + bt = None + + if bt is None: + print("\nCollecting stacktraces from system.stacktraces table:") + + bt = get_stacktraces_from_clickhouse( + args.client, args.replicated_database) + + if bt is not None: + print(bt) + return + + print(colored( + f"\nUnable to locate ClickHouse server process listening at TCP port {args.tcp_port}. " + "It must have crashed or exited prematurely!", + args, "red", attrs=["bold"])) + + +def get_server_pid(): # lsof does not work in stress tests for some reason - cmd_lsof = "lsof -i tcp:{port} -s tcp:LISTEN -Fp | awk '/^p[0-9]+$/{{print substr($0, 2)}}'".format(port=server_tcp_port) + cmd_lsof = f"lsof -i tcp:{args.tcp_port} -s tcp:LISTEN -Fp | awk '/^p[0-9]+$/{{print substr($0, 2)}}'" cmd_pidof = "pidof -s clickhouse-server" + commands = [cmd_lsof, cmd_pidof] output = None + for cmd in commands: try: output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True) if output: return int(output) except Exception as e: - print("Cannot get server pid with {}, got {}: {}".format(cmd, output, e)) - return None # most likely server dead + print(f"Cannot get server pid with {cmd}, got {output}: {e}") + + return None # most likely server is dead def colored(text, args, color=None, on_color=None, attrs=None): @@ -327,18 +412,89 @@ def colored(text, args, color=None, on_color=None, attrs=None): return text -SERVER_DIED = False -exit_code = 0 stop_time = None +exit_code = multiprocessing.Value("i", 0) +server_died = multiprocessing.Event() +stop_tests_triggered_lock = multiprocessing.Lock() +stop_tests_triggered = multiprocessing.Event() queue = multiprocessing.Queue(maxsize=1) + + +def print_test_time(test_time) -> str: + if args.print_time: + return " {0:.2f} sec.".format(test_time) + else: + return '' + + +def should_skip_test_by_name(name: str, test_ext: str) -> Tuple[bool, str]: + if args.skip and any(s in name for s in args.skip): + return True, "skip" + + if not args.zookeeper and ('zookeeper' in name or 'replica' in name): + return True, "no zookeeper" + + if not args.shard and \ + ('shard' in name or 'distributed' in name or 'global' in name): + return True, "no shard" + + # Tests for races and deadlocks usually are run in a loop for a significant + # amount of time + if args.no_long and \ + ('long' in name or 'deadlock' in name or 'race' in name): + return True, "no long" + + if not USE_JINJA and test_ext.endswith("j2"): + return True, "no jinja" + + return False, "" + + +def should_skip_disabled_test(name: str, suite_dir: str) -> Tuple[bool, str]: + disabled_file = os.path.join(suite_dir, name) + '.disabled' + + if os.path.exists(disabled_file) and not args.disabled: + return True, open(disabled_file, 'r').read() + + return False, "" + + +# should skip test, should increment skipped_total, skip reason +def should_skip_test(name: str, test_ext: str, suite_dir: str) -> Tuple[bool, bool, str]: + should_skip, skip_reason = should_skip_test_by_name(name, test_ext) + + if should_skip: + return True, True, skip_reason + + should_skip, skip_reason = should_skip_disabled_test(name, suite_dir) + + return should_skip, False, skip_reason + + +def send_test_name_failed(suite: str, case: str) -> bool: + clickhouse_proc = open_client_process(args.client, universal_newlines=True) + + failed_to_check = False + + pid = os.getpid() + query = f"SELECT 'Running test {suite}/{case} from pid={pid}';" + + try: + clickhouse_proc.communicate((query), timeout=20) + except: + failed_to_check = True + + return failed_to_check or clickhouse_proc.returncode != 0 + + restarted_tests = [] # (test, stderr) # def run_tests_array(all_tests, suite, suite_dir, suite_tmp_dir, run_total): def run_tests_array(all_tests_with_params): all_tests, num_tests, suite, suite_dir, suite_tmp_dir = all_tests_with_params - global exit_code - global SERVER_DIED global stop_time + global exit_code + global server_died OP_SQUARE_BRACKET = colored("[", args, attrs=['bold']) CL_SQUARE_BRACKET = colored("]", args, attrs=['bold']) @@ -359,15 +515,10 @@ def run_tests_array(all_tests_with_params): client_options = get_additional_client_options(args) - def print_test_time(test_time): - if args.print_time: - return " {0:.2f} sec.".format(test_time) - else: - return '' - if num_tests > 0: about = 'about ' if is_concurrent else '' - print(f"\nRunning {about}{num_tests} {suite} tests ({multiprocessing.current_process().name}).\n") + proc_name = multiprocessing.current_process().name + print(f"\nRunning {about}{num_tests} {suite} tests ({proc_name}).\n") while True: if is_concurrent: @@ -380,7 +531,7 @@ def run_tests_array(all_tests_with_params): else: break - if SERVER_DIED: + if server_died.is_set(): stop_tests() break @@ -396,168 +547,147 @@ def run_tests_array(all_tests_with_params): status = '' if not is_concurrent: sys.stdout.flush() - sys.stdout.write("{0:72}".format(name + ": ")) + sys.stdout.write("{0:72}".format(removesuffix(name, ".gen", ".sql") + ": ")) # This flush is needed so you can see the test name of the long # running test before it will finish. But don't do it in parallel # mode, so that the lines don't mix. sys.stdout.flush() else: - status = "{0:72}".format(name + ": ") + status = "{0:72}".format(removesuffix(name, ".gen", ".sql") + ": ") - if args.skip and any(s in name for s in args.skip): - status += MSG_SKIPPED + " - skip\n" - skipped_total += 1 - elif not args.zookeeper and ('zookeeper' in name - or 'replica' in name): - status += MSG_SKIPPED + " - no zookeeper\n" - skipped_total += 1 - elif not args.shard and ('shard' in name - or 'distributed' in name - or 'global' in name): - status += MSG_SKIPPED + " - no shard\n" - skipped_total += 1 - elif not args.no_long and ('long' in name - # Tests for races and deadlocks usually are runned in loop - # for significant amount of time - or 'deadlock' in name - or 'race' in name): - status += MSG_SKIPPED + " - no long\n" - skipped_total += 1 + skip_test, increment_skip_count, skip_reason = \ + should_skip_test(name, ext, suite_dir) + + if skip_test: + status += MSG_SKIPPED + f" - {skip_reason}\n" + + if increment_skip_count: + skipped_total += 1 else: - disabled_file = os.path.join(suite_dir, name) + '.disabled' + if args.testname and send_test_name_failed(suite, case): + failures += 1 + print("Server does not respond to health check") + server_died.set() + stop_tests() + break - if os.path.exists(disabled_file) and not args.disabled: - message = open(disabled_file, 'r').read() - status += MSG_SKIPPED + " - " + message + "\n" + file_suffix = ('.' + str(os.getpid())) if is_concurrent and args.test_runs > 1 else '' + reference_file = get_reference_file(suite_dir, name) + stdout_file = os.path.join(suite_tmp_dir, name) + file_suffix + '.stdout' + stderr_file = os.path.join(suite_tmp_dir, name) + file_suffix + '.stderr' + + testcase_args = configure_testcase_args(args, case_file, suite_tmp_dir, stderr_file) + proc, stdout, stderr, total_time = run_single_test(testcase_args, ext, server_logs_level, client_options, case_file, stdout_file, stderr_file) + + if proc.returncode is None: + try: + proc.kill() + except OSError as e: + if e.errno != ESRCH: + raise + + failures += 1 + status += MSG_FAIL + status += print_test_time(total_time) + status += " - Timeout!\n" + if stderr: + status += stderr + status += 'Database: ' + testcase_args.testcase_database else: - - if args.testname: - clickhouse_proc = Popen(shlex.split(args.client), stdin=PIPE, stdout=PIPE, stderr=PIPE, universal_newlines=True) - failed_to_check = False - try: - clickhouse_proc.communicate(("SELECT 'Running test {suite}/{case} from pid={pid}';".format(pid = os.getpid(), case = case, suite = suite)), timeout=20) - except: - failed_to_check = True - - if failed_to_check or clickhouse_proc.returncode != 0: - failures += 1 - print("Server does not respond to health check") - SERVER_DIED = True - stop_tests() + counter = 1 + while need_retry(stdout, stderr): + restarted_tests.append((case_file, stderr)) + testcase_args = configure_testcase_args(args, case_file, suite_tmp_dir, stderr_file) + proc, stdout, stderr, total_time = run_single_test(testcase_args, ext, server_logs_level, client_options, case_file, stdout_file, stderr_file) + sleep(2**counter) + counter += 1 + if MAX_RETRIES < counter: + if args.replicated_database: + if DISTRIBUTED_DDL_TIMEOUT_MSG in stderr: + server_died.set() break - file_suffix = ('.' + str(os.getpid())) if is_concurrent and args.test_runs > 1 else '' - reference_file = os.path.join(suite_dir, name) + '.reference' - stdout_file = os.path.join(suite_tmp_dir, name) + file_suffix + '.stdout' - stderr_file = os.path.join(suite_tmp_dir, name) + file_suffix + '.stderr' - - - testcase_args = configure_testcase_args(args, case_file, suite_tmp_dir, stderr_file) - proc, stdout, stderr, total_time = run_single_test(testcase_args, ext, server_logs_level, client_options, case_file, stdout_file, stderr_file) - - if proc.returncode is None: - try: - proc.kill() - except OSError as e: - if e.errno != ESRCH: - raise - + if proc.returncode != 0: failures += 1 + failures_chain += 1 status += MSG_FAIL status += print_test_time(total_time) - status += " - Timeout!\n" + status += ' - return code {}\n'.format(proc.returncode) + if stderr: status += stderr + + # Stop on fatal errors like segmentation fault. They are sent to client via logs. + if ' ' in stderr: + server_died.set() + + if testcase_args.stop \ + and ('Connection refused' in stderr or 'Attempt to read after eof' in stderr) \ + and 'Received exception from server' not in stderr: + server_died.set() + + if os.path.isfile(stdout_file): + status += ", result:\n\n" + status += '\n'.join( + open(stdout_file).read().split('\n')[:100]) + status += '\n' + + status += 'Database: ' + testcase_args.testcase_database + + elif stderr: + failures += 1 + failures_chain += 1 + status += MSG_FAIL + status += print_test_time(total_time) + status += " - having stderror:\n{}\n".format( + '\n'.join(stderr.split('\n')[:100])) + status += 'Database: ' + testcase_args.testcase_database + elif 'Exception' in stdout: + failures += 1 + failures_chain += 1 + status += MSG_FAIL + status += print_test_time(total_time) + status += " - having exception in stdout:\n{}\n".format( + '\n'.join(stdout.split('\n')[:100])) + status += 'Database: ' + testcase_args.testcase_database + elif '@@SKIP@@' in stdout: + skipped_total += 1 + skip_reason = stdout.replace('@@SKIP@@', '').rstrip("\n") + status += MSG_SKIPPED + f" - {skip_reason}\n" + elif reference_file is None: + status += MSG_UNKNOWN + status += print_test_time(total_time) + status += " - no reference file\n" status += 'Database: ' + testcase_args.testcase_database else: - counter = 1 - while need_retry(stderr): - restarted_tests.append((case_file, stderr)) - testcase_args = configure_testcase_args(args, case_file, suite_tmp_dir, stderr_file) - proc, stdout, stderr, total_time = run_single_test(testcase_args, ext, server_logs_level, client_options, case_file, stdout_file, stderr_file) - sleep(2**counter) - counter += 1 - if MAX_RETRIES < counter: - if args.replicated_database: - if DISTRIBUTED_DDL_TIMEOUT_MSG in stderr: - SERVER_DIED = True - break + result_is_different = subprocess.call(['diff', '-q', reference_file, stdout_file], stdout=PIPE) - if proc.returncode != 0: + if result_is_different: + diff = Popen(['diff', '-U', str(testcase_args.unified), reference_file, stdout_file], stdout=PIPE, universal_newlines=True).communicate()[0] failures += 1 - failures_chain += 1 status += MSG_FAIL status += print_test_time(total_time) - status += ' - return code {}\n'.format(proc.returncode) - - if stderr: - status += stderr - - # Stop on fatal errors like segmentation fault. They are sent to client via logs. - if ' ' in stderr: - SERVER_DIED = True - - if testcase_args.stop and ('Connection refused' in stderr or 'Attempt to read after eof' in stderr) and not 'Received exception from server' in stderr: - SERVER_DIED = True - - if os.path.isfile(stdout_file): - status += ", result:\n\n" - status += '\n'.join( - open(stdout_file).read().split('\n')[:100]) - status += '\n' - - status += 'Database: ' + testcase_args.testcase_database - - elif stderr: - failures += 1 - failures_chain += 1 - status += MSG_FAIL - status += print_test_time(total_time) - status += " - having stderror:\n{}\n".format( - '\n'.join(stderr.split('\n')[:100])) - status += 'Database: ' + testcase_args.testcase_database - elif 'Exception' in stdout: - failures += 1 - failures_chain += 1 - status += MSG_FAIL - status += print_test_time(total_time) - status += " - having exception:\n{}\n".format( - '\n'.join(stdout.split('\n')[:100])) - status += 'Database: ' + testcase_args.testcase_database - elif not os.path.isfile(reference_file): - status += MSG_UNKNOWN - status += print_test_time(total_time) - status += " - no reference file\n" + status += " - result differs with reference:\n{}\n".format(diff) status += 'Database: ' + testcase_args.testcase_database else: - result_is_different = subprocess.call(['diff', '-q', reference_file, stdout_file], stdout=PIPE) - - if result_is_different: - diff = Popen(['diff', '-U', str(testcase_args.unified), reference_file, stdout_file], stdout=PIPE, universal_newlines=True).communicate()[0] + if testcase_args.test_runs > 1 and total_time > 60 and 'long' not in name: + # We're in Flaky Check mode, check the run time as well while we're at it. failures += 1 + failures_chain += 1 status += MSG_FAIL status += print_test_time(total_time) - status += " - result differs with reference:\n{}\n".format(diff) + status += " - Test runs too long (> 60s). Make it faster.\n" status += 'Database: ' + testcase_args.testcase_database else: - if testcase_args.test_runs > 1 and total_time > 60 and 'long' not in name: - # We're in Flaky Check mode, check the run time as well while we're at it. - failures += 1 - failures_chain += 1 - status += MSG_FAIL - status += print_test_time(total_time) - status += " - Test runs too long (> 60s). Make it faster.\n" - status += 'Database: ' + testcase_args.testcase_database - else: - passed_total += 1 - failures_chain = 0 - status += MSG_OK - status += print_test_time(total_time) - status += "\n" - if os.path.exists(stdout_file): - os.remove(stdout_file) - if os.path.exists(stderr_file): - os.remove(stderr_file) + passed_total += 1 + failures_chain = 0 + status += MSG_OK + status += print_test_time(total_time) + status += "\n" + if os.path.exists(stdout_file): + os.remove(stdout_file) + if os.path.exists(stderr_file): + os.remove(stderr_file) if status and not status.endswith('\n'): status += '\n' @@ -571,7 +701,12 @@ def run_tests_array(all_tests_with_params): except: exc_type, exc_value, tb = sys.exc_info() failures += 1 - print("{0} - Test internal error: {1}\n{2}\n{3}".format(MSG_FAIL, exc_type.__name__, exc_value, "\n".join(traceback.format_tb(tb, 10)))) + + exc_name = exc_type.__name__ + traceback_str = "\n".join(traceback.format_tb(tb, 10)) + + print(f"{MSG_FAIL} - Test internal error: {exc_name}") + print(f"{exc_value}\n{traceback_str}") if failures_chain >= 20: stop_tests() @@ -584,7 +719,7 @@ def run_tests_array(all_tests_with_params): f" {skipped_total} tests skipped. {(datetime.now() - start_time).total_seconds():.2f} s elapsed" f' ({multiprocessing.current_process().name}).', args, "red", attrs=["bold"])) - exit_code = 1 + exit_code.value = 1 else: print(colored(f"\n{passed_total} tests passed. {skipped_total} tests skipped." f" {(datetime.now() - start_time).total_seconds():.2f} s elapsed" @@ -599,9 +734,11 @@ server_logs_level = "warning" def check_server_started(client, retry_count): print("Connecting to ClickHouse server...", end='') + sys.stdout.flush() + while retry_count > 0: - clickhouse_proc = Popen(shlex.split(client), stdin=PIPE, stdout=PIPE, stderr=PIPE) + clickhouse_proc = open_client_process(client) (stdout, stderr) = clickhouse_proc.communicate(b"SELECT 1") if clickhouse_proc.returncode == 0 and stdout.startswith(b"1"): @@ -611,27 +748,30 @@ def check_server_started(client, retry_count): if clickhouse_proc.returncode == 210: # Connection refused, retry - print('.', end = '') + print('.', end='') sys.stdout.flush() retry_count -= 1 sleep(0.5) continue - # Other kind of error, fail. - print('') - print("Client invocation failed with code ", clickhouse_proc.returncode, ": ") + # FIXME Some old comment, maybe now CH supports Python3 ? # We can't print this, because for some reason this is python 2, # and args appeared in 3.3. To hell with it. # print(''.join(clickhouse_proc.args)) - print("stdout: ") - print(stdout) - print("stderr: ") - print(stderr) + + # Other kind of error, fail. + + code: int = clickhouse_proc.returncode + + print(f"\nClient invocation failed with code {code}:\n\ + stdout: {stdout}\n\ + stderr: {stderr}") + sys.stdout.flush() + return False - print('') - print('All connection tries failed') + print('\nAll connection tries failed') sys.stdout.flush() return False @@ -651,7 +791,7 @@ class BuildFlags(): def collect_build_flags(client): - clickhouse_proc = Popen(shlex.split(client), stdin=PIPE, stdout=PIPE, stderr=PIPE) + clickhouse_proc = open_client_process(client) (stdout, stderr) = clickhouse_proc.communicate(b"SELECT value FROM system.build_options WHERE name = 'CXX_FLAGS'") result = [] @@ -667,7 +807,7 @@ def collect_build_flags(client): else: raise Exception("Cannot get information about build from server errorcode {}, stderr {}".format(clickhouse_proc.returncode, stderr)) - clickhouse_proc = Popen(shlex.split(client), stdin=PIPE, stdout=PIPE, stderr=PIPE) + clickhouse_proc = open_client_process(client) (stdout, stderr) = clickhouse_proc.communicate(b"SELECT value FROM system.build_options WHERE name = 'BUILD_TYPE'") if clickhouse_proc.returncode == 0: @@ -678,7 +818,7 @@ def collect_build_flags(client): else: raise Exception("Cannot get information about build from server errorcode {}, stderr {}".format(clickhouse_proc.returncode, stderr)) - clickhouse_proc = Popen(shlex.split(client), stdin=PIPE, stdout=PIPE, stderr=PIPE) + clickhouse_proc = open_client_process(client) (stdout, stderr) = clickhouse_proc.communicate(b"SELECT value FROM system.build_options WHERE name = 'UNBUNDLED'") if clickhouse_proc.returncode == 0: @@ -687,7 +827,7 @@ def collect_build_flags(client): else: raise Exception("Cannot get information about build from server errorcode {}, stderr {}".format(clickhouse_proc.returncode, stderr)) - clickhouse_proc = Popen(shlex.split(client), stdin=PIPE, stdout=PIPE, stderr=PIPE) + clickhouse_proc = open_client_process(client) (stdout, stderr) = clickhouse_proc.communicate(b"SELECT value FROM system.settings WHERE name = 'default_database_engine'") if clickhouse_proc.returncode == 0: @@ -696,7 +836,7 @@ def collect_build_flags(client): else: raise Exception("Cannot get information about build from server errorcode {}, stderr {}".format(clickhouse_proc.returncode, stderr)) - clickhouse_proc = Popen(shlex.split(client), stdin=PIPE, stdout=PIPE, stderr=PIPE) + clickhouse_proc = open_client_process(client) (stdout, stderr) = clickhouse_proc.communicate(b"SELECT value FROM system.merge_tree_settings WHERE name = 'min_bytes_for_wide_part'") if clickhouse_proc.returncode == 0: @@ -708,6 +848,56 @@ def collect_build_flags(client): return result +def suite_key_func(item: str) -> Union[int, Tuple[int, str]]: + if args.order == 'random': + return random.random() + + if -1 == item.find('_'): + return 99998, '' + + prefix, suffix = item.split('_', 1) + + try: + return int(prefix), suffix + except ValueError: + return 99997, '' + + +def tests_in_suite_key_func(item: str) -> int: + if args.order == 'random': + return random.random() + + reverse = 1 if args.order == 'asc' else -1 + + if -1 == item.find('_'): + return 99998 + + prefix, _ = item.split('_', 1) + + try: + return reverse * int(prefix) + except ValueError: + return 99997 + + +def extract_key(key: str) -> str: + return subprocess.getstatusoutput( + args.extract_from_config + + " --try --config " + + args.configserver + key)[1] + + +def open_client_process( + client_args: str, + universal_newlines: bool = False, + stderr_file: Optional[TextIO] = None): + return Popen( + shlex.split(client_args), stdin=PIPE, stdout=PIPE, + stderr=stderr_file if stderr_file is not None else PIPE, + universal_newlines=True if universal_newlines else None) + + + def do_run_tests(jobs, suite, suite_dir, suite_tmp_dir, all_tests, parallel_tests, sequential_tests, parallel): if jobs > 1 and len(parallel_tests) > 0: print("Found", len(parallel_tests), "parallel tests and", len(sequential_tests), "sequential tests") @@ -749,14 +939,105 @@ def do_run_tests(jobs, suite, suite_dir, suite_tmp_dir, all_tests, parallel_test return num_tests +def is_test_from_dir(suite_dir, case): + case_file = os.path.join(suite_dir, case) + # We could also test for executable files (os.access(case_file, os.X_OK), + # but it interferes with 01610_client_spawn_editor.editor, which is invoked + # as a query editor in the test, and must be marked as executable. + return os.path.isfile(case_file) and any(case_file.endswith(suppotred_ext) for suppotred_ext in TEST_FILE_EXTENSIONS) + + +def removesuffix(text, *suffixes): + """ + Added in python 3.9 + https://www.python.org/dev/peps/pep-0616/ + + This version can work with several possible suffixes + """ + for suffix in suffixes: + if suffix and text.endswith(suffix): + return text[:-len(suffix)] + return text + + +def render_test_template(j2env, suite_dir, test_name): + """ + Render template for test and reference file if needed + """ + + if j2env is None: + return test_name + + test_base_name = removesuffix(test_name, ".sql.j2", ".sql") + + reference_file_name = test_base_name + ".reference.j2" + reference_file_path = os.path.join(suite_dir, reference_file_name) + if os.path.isfile(reference_file_path): + tpl = j2env.get_template(reference_file_name) + tpl.stream().dump(os.path.join(suite_dir, test_base_name) + ".gen.reference") + + if test_name.endswith(".sql.j2"): + tpl = j2env.get_template(test_name) + generated_test_name = test_base_name + ".gen.sql" + tpl.stream().dump(os.path.join(suite_dir, generated_test_name)) + return generated_test_name + + return test_name + + +def get_selected_tests(suite_dir, patterns): + """ + Find all files with tests, filter, render templates + """ + + j2env = jinja2.Environment( + loader=jinja2.FileSystemLoader(suite_dir), + keep_trailing_newline=True, + ) if USE_JINJA else None + + for test_name in os.listdir(suite_dir): + if not is_test_from_dir(suite_dir, test_name): + continue + if patterns and not any(re.search(pattern, test_name) for pattern in patterns): + continue + if USE_JINJA and test_name.endswith(".gen.sql"): + continue + test_name = render_test_template(j2env, suite_dir, test_name) + yield test_name + + +def get_tests_list(suite_dir, patterns, test_runs, sort_key): + """ + Return list of tests file names to run + """ + + all_tests = list(get_selected_tests(suite_dir, patterns)) + all_tests = all_tests * test_runs + all_tests.sort(key=sort_key) + return all_tests + + +def get_reference_file(suite_dir, name): + """ + Returns reference file name for specified test + """ + + name = removesuffix(name, ".gen") + for ext in ['.reference', '.gen.reference']: + reference_file = os.path.join(suite_dir, name) + ext + if os.path.isfile(reference_file): + return reference_file + return None + + def main(args): - global SERVER_DIED + global server_died global stop_time global exit_code global server_logs_level def is_data_present(): - clickhouse_proc = Popen(shlex.split(args.client), stdin=PIPE, stdout=PIPE, stderr=PIPE) + clickhouse_proc = open_client_process(args.client) (stdout, stderr) = clickhouse_proc.communicate(b"EXISTS TABLE test.hits") if clickhouse_proc.returncode != 0: raise CalledProcessError(clickhouse_proc.returncode, args.client, stderr) @@ -766,16 +1047,17 @@ def main(args): if not check_server_started(args.client, args.server_check_retries): raise Exception( "Server is not responding. Cannot execute 'SELECT 1' query. \ - Note: if you are using split build, you may have to specify -c option.") + If you are using split build, you have to specify -c option.") build_flags = collect_build_flags(args.client) + if args.replicated_database: build_flags.append(BuildFlags.DATABASE_REPLICATED) if args.use_skip_list: tests_to_skip_from_list = collect_tests_to_skip(args.skip_list_path, build_flags) else: - tests_to_skip_from_list = set([]) + tests_to_skip_from_list = set() if args.skip: args.skip = set(args.skip) | tests_to_skip_from_list @@ -790,8 +1072,9 @@ def main(args): # Keep same default values as in queries/shell_config.sh os.environ.setdefault("CLICKHOUSE_BINARY", args.binary) - #os.environ.setdefault("CLICKHOUSE_CLIENT", args.client) + # os.environ.setdefault("CLICKHOUSE_CLIENT", args.client) os.environ.setdefault("CLICKHOUSE_CONFIG", args.configserver) + if args.configclient: os.environ.setdefault("CLICKHOUSE_CONFIG_CLIENT", args.configclient) @@ -804,65 +1087,41 @@ def main(args): stop_time = time() + args.global_time_limit if args.zookeeper is None: - _, out = subprocess.getstatusoutput(args.extract_from_config + " --try --config " + args.configserver + ' --key zookeeper | grep . | wc -l') try: - if int(out) > 0: - args.zookeeper = True - else: - args.zookeeper = False + args.zookeeper = int(extract_key(" --key zookeeper | grep . | wc -l")) > 0 except ValueError: args.zookeeper = False if args.shard is None: - _, out = subprocess.getstatusoutput(args.extract_from_config + " --try --config " + args.configserver + ' --key listen_host | grep -E "127.0.0.2|::"') - if out: - args.shard = True - else: - args.shard = False + args.shard = bool(extract_key(' --key listen_host | grep -E "127.0.0.2|::"')) def create_common_database(args, db_name): create_database_retries = 0 while create_database_retries < MAX_RETRIES: - clickhouse_proc_create = Popen(shlex.split(args.client), stdin=PIPE, stdout=PIPE, stderr=PIPE, universal_newlines=True) - (_, stderr) = clickhouse_proc_create.communicate(("CREATE DATABASE IF NOT EXISTS " + db_name + get_db_engine(args, db_name))) - if not need_retry(stderr): + client_cmd = args.client + " " + get_additional_client_options(args) + + clickhouse_proc_create = open_client_process(client_cmd, universal_newlines=True) + + (stdout, stderr) = clickhouse_proc_create.communicate(("CREATE DATABASE IF NOT EXISTS " + db_name + get_db_engine(args, db_name))) + + if not need_retry(stdout, stderr): break create_database_retries += 1 if args.database and args.database != "test": create_common_database(args, args.database) + create_common_database(args, "test") - def is_test_from_dir(suite_dir, case): - case_file = os.path.join(suite_dir, case) - (_, ext) = os.path.splitext(case) - # We could also test for executable files (os.access(case_file, os.X_OK), - # but it interferes with 01610_client_spawn_editor.editor, which is invoked - # as a query editor in the test, and must be marked as executable. - return os.path.isfile(case_file) and (ext in ['.sql', '.sh', '.py', '.expect']) - - def sute_key_func(item): - if args.order == 'random': - return random.random() - - if -1 == item.find('_'): - return 99998, '' - - prefix, suffix = item.split('_', 1) - - try: - return int(prefix), suffix - except ValueError: - return 99997, '' - total_tests_run = 0 - for suite in sorted(os.listdir(base_dir), key=sute_key_func): - if SERVER_DIED: + + for suite in sorted(os.listdir(base_dir), key=suite_key_func): + if server_died.is_set(): break suite_dir = os.path.join(base_dir, suite) suite_re_obj = re.search('^[0-9]+_(.*)$', suite) - if not suite_re_obj: #skip .gitignore and so on + if not suite_re_obj: # skip .gitignore and so on continue suite_tmp_dir = os.path.join(tmp_dir, suite) @@ -870,8 +1129,8 @@ def main(args): os.makedirs(suite_tmp_dir) suite = suite_re_obj.group(1) - if os.path.isdir(suite_dir): + if os.path.isdir(suite_dir): if 'stateful' in suite and not args.no_stateful and not is_data_present(): print("Won't run stateful tests because test data wasn't loaded.") continue @@ -882,34 +1141,14 @@ def main(args): print("Won't run stateful tests because they were manually disabled.") continue - # Reverse sort order: we want run newest test first. - # And not reverse subtests - def key_func(item): - if args.order == 'random': - return random.random() - - reverse = 1 if args.order == 'asc' else -1 - - if -1 == item.find('_'): - return 99998 - - prefix, _ = item.split('_', 1) - - try: - return reverse * int(prefix) - except ValueError: - return 99997 - - all_tests = os.listdir(suite_dir) - all_tests = [case for case in all_tests if is_test_from_dir(suite_dir, case)] - if args.test: - all_tests = [t for t in all_tests if any(re.search(r, t) for r in args.test)] - all_tests = all_tests * args.test_runs - all_tests.sort(key=key_func) + all_tests = get_tests_list( + suite_dir, args.test, args.test_runs, tests_in_suite_key_func) jobs = args.jobs + parallel_tests = [] sequential_tests = [] + for test in all_tests: if any(s in test for s in args.sequential): sequential_tests.append(test) @@ -935,39 +1174,17 @@ def main(args): else: print(colored("Seems like server hung and cannot respond to queries", args, "red", attrs=["bold"])) - clickhouse_tcp_port = os.getenv("CLICKHOUSE_PORT_TCP", '9000') - server_pid = get_server_pid(clickhouse_tcp_port) - bt = None - if server_pid and not args.replicated_database: - print("\nLocated ClickHouse server process {} listening at TCP port {}".format(server_pid, clickhouse_tcp_port)) - print("\nCollecting stacktraces from all running threads with gdb:") - bt = get_stacktraces_from_gdb(server_pid) - if len(bt) < 1000: - print("Got suspiciously small stacktraces: ", bt) - bt = None - if bt is None: - print("\nCollecting stacktraces from system.stacktraces table:") - bt = get_stacktraces_from_clickhouse(args.client, args.replicated_database) - if bt is None: - print( - colored( - "\nUnable to locate ClickHouse server process listening at TCP port {}. " - "It must have crashed or exited prematurely!".format(clickhouse_tcp_port), - args, "red", attrs=["bold"])) - else: - print(bt) - - exit_code = 1 + print_stacktraces() + exit_code.value = 1 else: print(colored("\nNo queries hung.", args, "green", attrs=["bold"])) if len(restarted_tests) > 0: print("\nSome tests were restarted:\n") + for (test_case, stderr) in restarted_tests: - print(test_case) - print(stderr) - print("\n") + print(test_case + "\n" + stderr + "\n") if total_tests_run == 0: print("No tests were run.") @@ -975,7 +1192,7 @@ def main(args): else: print("All tests have finished.") - sys.exit(exit_code) + sys.exit(exit_code.value) def find_binary(name): @@ -1010,18 +1227,23 @@ def get_additional_client_options_url(args): def collect_tests_to_skip(skip_list_path, build_flags): result = set([]) + if not os.path.exists(skip_list_path): return result with open(skip_list_path, 'r') as skip_list_file: content = skip_list_file.read() + # allows to have comments in skip_list.json skip_dict = json.loads(json_minify(content)) + for build_flag in build_flags: result |= set(skip_dict[build_flag]) - if len(result) > 0: - print("Found file with skip-list {}, {} test will be skipped".format(skip_list_path, len(result))) + count = len(result) + + if count > 0: + print(f"Found file with skip-list {skip_list_path}, {count} test will be skipped") return result @@ -1048,7 +1270,7 @@ if __name__ == '__main__': signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGHUP, signal_handler) - parser=ArgumentParser(description='ClickHouse functional tests') + parser = ArgumentParser(description='ClickHouse functional tests') parser.add_argument('-q', '--queries', help='Path to queries dir') parser.add_argument('--tmp', help='Path to tmp dir') @@ -1060,7 +1282,7 @@ if __name__ == '__main__': parser.add_argument('--extract_from_config', help='extract-from-config program') parser.add_argument('--configclient', help='Client config (if you use not default ports)') - parser.add_argument('--configserver', default= '/etc/clickhouse-server/config.xml', help='Preprocessed server config') + parser.add_argument('--configserver', default='/etc/clickhouse-server/config.xml', help='Preprocessed server config') parser.add_argument('-o', '--output', help='Output xUnit compliant test report directory') parser.add_argument('-t', '--timeout', type=int, default=600, help='Timeout for each test case in seconds') parser.add_argument('--global_time_limit', type=int, help='Stop if executing more than specified time (after current test finished)') @@ -1087,20 +1309,22 @@ if __name__ == '__main__': parser.add_argument('--no-stateful', action='store_true', help='Disable all stateful tests') parser.add_argument('--skip', nargs='+', help="Skip these tests") parser.add_argument('--sequential', nargs='+', help="Run these tests sequentially even if --parallel specified") - parser.add_argument('--no-long', action='store_false', dest='no_long', help='Do not run long tests') + parser.add_argument('--no-long', action='store_true', dest='no_long', help='Do not run long tests') parser.add_argument('--client-option', nargs='+', help='Specify additional client argument') parser.add_argument('--print-time', action='store_true', dest='print_time', help='Print test time') - group=parser.add_mutually_exclusive_group(required=False) + + group = parser.add_mutually_exclusive_group(required=False) group.add_argument('--zookeeper', action='store_true', default=None, dest='zookeeper', help='Run zookeeper related tests') group.add_argument('--no-zookeeper', action='store_false', default=None, dest='zookeeper', help='Do not run zookeeper related tests') - group=parser.add_mutually_exclusive_group(required=False) + + group = parser.add_mutually_exclusive_group(required=False) group.add_argument('--shard', action='store_true', default=None, dest='shard', help='Run sharding related tests (required to clickhouse-server listen 127.0.0.2 127.0.0.3)') group.add_argument('--no-shard', action='store_false', default=None, dest='shard', help='Do not run shard related tests') args = parser.parse_args() if args.queries and not os.path.isdir(args.queries): - print("Cannot access the specified directory with queries (" + args.queries + ")", file=sys.stderr) + print(f"Cannot access the specified directory with queries ({args.queries})", file=sys.stderr) sys.exit(1) # Autodetect the directory with queries if not specified @@ -1109,7 +1333,7 @@ if __name__ == '__main__': if not os.path.isdir(args.queries): # If we're running from the repo - args.queries = os.path.join(os.path.dirname(os.path.abspath( __file__ )), 'queries') + args.queries = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'queries') if not os.path.isdir(args.queries): # Next we're going to try some system directories, don't write 'stdout' files into them. @@ -1151,10 +1375,13 @@ if __name__ == '__main__': if args.configclient: args.client += ' --config-file=' + args.configclient + if os.getenv("CLICKHOUSE_HOST"): args.client += ' --host=' + os.getenv("CLICKHOUSE_HOST") - if os.getenv("CLICKHOUSE_PORT_TCP"): - args.client += ' --port=' + os.getenv("CLICKHOUSE_PORT_TCP") + + args.tcp_port = int(os.getenv("CLICKHOUSE_PORT_TCP", "9000")) + args.client += f" --port={args.tcp_port}" + if os.getenv("CLICKHOUSE_DATABASE"): args.client += ' --database=' + os.getenv("CLICKHOUSE_DATABASE") diff --git a/tests/clickhouse-test-server b/tests/clickhouse-test-server deleted file mode 100755 index 4087468b597..00000000000 --- a/tests/clickhouse-test-server +++ /dev/null @@ -1,167 +0,0 @@ -#!/usr/bin/env bash - -set -x -set -o errexit -set -o pipefail - -CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) -ROOT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && cd ../.. && pwd) -DATA_DIR=${DATA_DIR:=`mktemp -d /tmp/clickhouse.test..XXXXX`} -DATA_DIR_PATTERN=${DATA_DIR_PATTERN:=/tmp/clickhouse} # path from config file, will be replaced to temporary -LOG_DIR=${LOG_DIR:=$DATA_DIR/log} -export CLICKHOUSE_BINARY_NAME=${CLICKHOUSE_BINARY_NAME:="clickhouse"} -( [ -x "$ROOT_DIR/programs/${CLICKHOUSE_BINARY_NAME}-server" ] || [ -x "$ROOT_DIR/programs/${CLICKHOUSE_BINARY_NAME}" ] ) && BUILD_DIR=${BUILD_DIR:=$ROOT_DIR} # Build without separate build dir -[ -d "$ROOT_DIR/build${BUILD_TYPE}" ] && BUILD_DIR=${BUILD_DIR:=$ROOT_DIR/build${BUILD_TYPE}} -BUILD_DIR=${BUILD_DIR:=$ROOT_DIR} -[ -x ${CLICKHOUSE_BINARY_NAME}-server" ] && [ -x ${CLICKHOUSE_BINARY_NAME}-client" ] && BIN_DIR= # Allow run in /usr/bin -( [ -x "$BUILD_DIR/programs/${CLICKHOUSE_BINARY_NAME}" ] || [ -x "$BUILD_DIR/programs/${CLICKHOUSE_BINARY_NAME}-server" ] ) && BIN_DIR=${BIN_DIR:=$BUILD_DIR/programs/} -[ -x "$BIN_DIR/${CLICKHOUSE_BINARY_NAME}-server" ] && CLICKHOUSE_SERVER=${CLICKHOUSE_SERVER:=$BIN_DIR/${CLICKHOUSE_BINARY_NAME}-server} -[ -x "$BIN_DIR/${CLICKHOUSE_BINARY_NAME}" ] && CLICKHOUSE_SERVER=${CLICKHOUSE_SERVER:=$BIN_DIR/${CLICKHOUSE_BINARY_NAME} server} -[ -x "$BIN_DIR/${CLICKHOUSE_BINARY_NAME}-client" ] && CLICKHOUSE_CLIENT=${CLICKHOUSE_CLIENT:=$BIN_DIR/${CLICKHOUSE_BINARY_NAME}-client} -[ -x "$BIN_DIR/${CLICKHOUSE_BINARY_NAME}" ] && CLICKHOUSE_CLIENT=${CLICKHOUSE_CLIENT:=$BIN_DIR/${CLICKHOUSE_BINARY_NAME} client} -[ -x "$BIN_DIR/${CLICKHOUSE_BINARY_NAME}-extract-from-config" ] && CLICKHOUSE_EXTRACT=${CLICKHOUSE_EXTRACT:=$BIN_DIR/${CLICKHOUSE_BINARY_NAME}-extract-from-config} -[ -x "$BIN_DIR/${CLICKHOUSE_BINARY_NAME}" ] && CLICKHOUSE_EXTRACT=${CLICKHOUSE_EXTRACT:=$BIN_DIR/${CLICKHOUSE_BINARY_NAME} extract-from-config} - -[ -f "$CUR_DIR/server-test.xml" ] && CONFIG_DIR=${CONFIG_DIR=$CUR_DIR}/ -CONFIG_CLIENT_DIR=${CONFIG_CLIENT_DIR=$CONFIG_DIR} -CONFIG_SERVER_DIR=${CONFIG_SERVER_DIR=$CONFIG_DIR} -[ ! -f "${CONFIG_CLIENT_DIR}client-test.xml" ] && CONFIG_CLIENT_DIR=${CONFIG_CLIENT_DIR:=/etc/clickhouse-client/} -[ ! -f "${CONFIG_SERVER_DIR}server-test.xml" ] && CONFIG_SERVER_DIR=${CONFIG_SERVER_DIR:=/etc/clickhouse-server/} -export CLICKHOUSE_CONFIG_CLIENT=${CLICKHOUSE_CONFIG_CLIENT:=${CONFIG_CLIENT_DIR}client-test.xml} -export CLICKHOUSE_CONFIG=${CLICKHOUSE_CONFIG:=${CONFIG_SERVER_DIR}server-test.xml} -CLICKHOUSE_CONFIG_USERS=${CONFIG_SERVER_DIR}users.xml -[ ! -f "$CLICKHOUSE_CONFIG_USERS" ] && CLICKHOUSE_CONFIG_USERS=$CUR_DIR/../programs/server/users.xml -CLICKHOUSE_CONFIG_USERS_D=${CONFIG_SERVER_DIR}users.d -[ ! -d "$CLICKHOUSE_CONFIG_USERS_D" ] && CLICKHOUSE_CONFIG_USERS_D=$CUR_DIR/../programs/server/users.d -[ -x "$CUR_DIR/clickhouse-test" ] && TEST_DIR=${TEST_DIR=$CUR_DIR/} -[ -d "$CUR_DIR/queries" ] && QUERIES_DIR=${QUERIES_DIR=$CUR_DIR/queries} -[ ! -d "$QUERIES_DIR" ] && [ -d "/usr/local/share/clickhouse-test/queries" ] && QUERIES_DIR=${QUERIES_DIR=/usr/local/share/clickhouse-test/queries} -[ ! -d "$QUERIES_DIR" ] && [ -d "/usr/share/clickhouse-test/queries" ] && QUERIES_DIR=${QUERIES_DIR=/usr/share/clickhouse-test/queries} - -TEST_PORT_RANDOM=${TEST_PORT_RANDOM=1} -if [ "${TEST_PORT_RANDOM}" ]; then - CLICKHOUSE_PORT_BASE=${CLICKHOUSE_PORT_BASE:=$(( ( RANDOM % 50000 ) + 10000 ))} - CLICKHOUSE_PORT_TCP=${CLICKHOUSE_PORT_TCP:=$(($CLICKHOUSE_PORT_BASE + 1))} - CLICKHOUSE_PORT_HTTP=${CLICKHOUSE_PORT_HTTP:=$(($CLICKHOUSE_PORT_BASE + 2))} - CLICKHOUSE_PORT_INTERSERVER=${CLICKHOUSE_PORT_INTERSERVER:=$(($CLICKHOUSE_PORT_BASE + 3))} - CLICKHOUSE_PORT_TCP_SECURE=${CLICKHOUSE_PORT_TCP_SECURE:=$(($CLICKHOUSE_PORT_BASE + 4))} - CLICKHOUSE_PORT_HTTPS=${CLICKHOUSE_PORT_HTTPS:=$(($CLICKHOUSE_PORT_BASE + 5))} - CLICKHOUSE_PORT_ODBC_BRIDGE=${CLICKHOUSE_ODBC_BRIDGE:=$(($CLICKHOUSE_PORT_BASE + 6))} -fi - -rm -rf $DATA_DIR || true -mkdir -p $LOG_DIR $DATA_DIR/etc || true - -if [ "$DATA_DIR_PATTERN" != "$DATA_DIR" ]; then - cat $CLICKHOUSE_CONFIG | sed -e s!$DATA_DIR_PATTERN!$DATA_DIR! > $DATA_DIR/etc/server-config.xml - export CLICKHOUSE_CONFIG=$DATA_DIR/etc/server-config.xml - cp $CLICKHOUSE_CONFIG_USERS $DATA_DIR/etc - cp -R -L $CLICKHOUSE_CONFIG_USERS_D $DATA_DIR/etc - cat ${CONFIG_SERVER_DIR}/ints_dictionary.xml | sed -e s!9000!$CLICKHOUSE_PORT_TCP! > $DATA_DIR/etc/ints_dictionary.xml - cat ${CONFIG_SERVER_DIR}/strings_dictionary.xml | sed -e s!9000!$CLICKHOUSE_PORT_TCP! > $DATA_DIR/etc/strings_dictionary.xml - cat ${CONFIG_SERVER_DIR}/decimals_dictionary.xml | sed -e s!9000!$CLICKHOUSE_PORT_TCP! > $DATA_DIR/etc/decimals_dictionary.xml - cat ${CONFIG_SERVER_DIR}/executable_pool_dictionary.xml | sed -e s!9000!$CLICKHOUSE_PORT_TCP! > $DATA_DIR/etc/executable_pool_dictionary.xml -fi - -CLICKHOUSE_EXTRACT_CONFIG=${CLICKHOUSE_EXTRACT_CONFIG:="${CLICKHOUSE_EXTRACT} --config=$CLICKHOUSE_CONFIG"} -CLICKHOUSE_LOG=${CLICKHOUSE_LOG:=${LOG_DIR}clickhouse-server.log} -export CLICKHOUSE_PORT_TCP=${CLICKHOUSE_PORT_TCP:=`$CLICKHOUSE_EXTRACT_CONFIG --key=tcp_port || echo 9000`} -export CLICKHOUSE_PORT_HTTP=${CLICKHOUSE_PORT_HTTP:=`$CLICKHOUSE_EXTRACT_CONFIG --key=http_port || echo 8123`} -export CLICKHOUSE_PORT_INTERSERVER=${CLICKHOUSE_PORT_INTERSERVER:=`$CLICKHOUSE_EXTRACT_CONFIG --key=interserver_http_port || echo 9009`} -export CLICKHOUSE_PORT_TCP_SECURE=${CLICKHOUSE_PORT_TCP_SECURE:=`$CLICKHOUSE_EXTRACT_CONFIG --key=tcp_port_secure`} -export CLICKHOUSE_PORT_HTTPS=${CLICKHOUSE_PORT_HTTPS:=`$CLICKHOUSE_EXTRACT_CONFIG --key=https_port`} -export CLICKHOUSE_ODBC_BRIDGE=${CLICKHOUSE_ODBC_BRIDGE:=`$CLICKHOUSE_EXTRACT_CONFIG --key=odbc_bridge.port || echo 9018`} - -DHPARAM=`$CLICKHOUSE_EXTRACT_CONFIG --key=openSSL.server.dhParamsFile` -PRIVATEKEY=`$CLICKHOUSE_EXTRACT_CONFIG --key=openSSL.server.privateKeyFile` -CERT=`$CLICKHOUSE_EXTRACT_CONFIG --key=openSSL.server.certificateFile` -# Do not generate in case broken extract-config -[ -n "$DHPARAM" ] && openssl dhparam -out $DHPARAM 256 -[ -n "$PRIVATEKEY" ] && [ -n "$CERT" ] && openssl req -subj "/CN=localhost" -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout $PRIVATEKEY -out $CERT - -if [ "$TEST_GDB" ] || [ "$GDB" ]; then - echo -e "run \nset pagination off \nset logging file $LOG_DIR/server.gdb.log \nset logging on \nbacktrace \nthread apply all backtrace \nbacktrace \ndetach \nquit " > $DATA_DIR/gdb.cmd - GDB=${GDB:="gdb -x $DATA_DIR/gdb.cmd --args "} -fi - -# Start a local clickhouse server which will be used to run tests - -# TODO: fix change shard ports: -# --remote_servers.test_shard_localhost_secure.shard.replica.port=$CLICKHOUSE_PORT_TCP_SECURE \ -# --remote_servers.test_shard_localhost.shard.replica.port=$CLICKHOUSE_PORT_TCP \ - -VERSION=`$CLICKHOUSE_CLIENT --version-clean` -# If run from compile dir - use in-place compile binary and headers -[ -n "$BIN_DIR" ] && INTERNAL_COMPILER_PARAMS="--compiler_executable_root=${INTERNAL_COMPILER_BIN_ROOT:=$BUILD_DIR/programs/} --compiler_headers=$BUILD_DIR/programs/clang/headers/$VERSION/ --compiler_headers_root=$BUILD_DIR/programs/clang/headers/$VERSION/" - -$GDB $CLICKHOUSE_SERVER --config-file=$CLICKHOUSE_CONFIG --log=$CLICKHOUSE_LOG $TEST_SERVER_PARAMS -- \ - --http_port=$CLICKHOUSE_PORT_HTTP \ - --tcp_port=$CLICKHOUSE_PORT_TCP \ - --https_port=$CLICKHOUSE_PORT_HTTPS \ - --tcp_port_secure=$CLICKHOUSE_PORT_TCP_SECURE \ - --interserver_http_port=$CLICKHOUSE_PORT_INTERSERVER \ - --odbc_bridge.port=$CLICKHOUSE_ODBC_BRIDGE \ - $INTERNAL_COMPILER_PARAMS \ - $TEST_SERVER_CONFIG_PARAMS \ - 2>&1 > $LOG_DIR/server.stdout.log & -CH_PID=$! -sleep ${TEST_SERVER_STARTUP_WAIT:=5} - -if [ "$GDB" ]; then - # Long symbols read - sleep ${TEST_GDB_SLEEP:=60} -fi - -tail -n50 $LOG_DIR/*.log || true - -# Define needed stuff to kill test clickhouse server after tests completion -function finish { - kill $CH_PID || true - wait - tail -n 50 $LOG_DIR/*.log || true - if [ "$GDB" ]; then - cat $LOG_DIR/server.gdb.log || true - fi - rm -rf $DATA_DIR -} -trap finish EXIT SIGINT SIGQUIT SIGTERM - -# Do tests -if [ -n "$*" ]; then - $* -else - TEST_RUN=${TEST_RUN=1} - TEST_DICT=${TEST_DICT=1} - CLICKHOUSE_CLIENT_QUERY="${CLICKHOUSE_CLIENT} --config ${CLICKHOUSE_CONFIG_CLIENT} --port $CLICKHOUSE_PORT_TCP -m -n -q" - $CLICKHOUSE_CLIENT_QUERY 'SELECT * from system.build_options; SELECT * FROM system.clusters;' - CLICKHOUSE_TEST="env ${TEST_DIR}clickhouse-test --force-color --binary ${BIN_DIR}${CLICKHOUSE_BINARY_NAME} --configclient $CLICKHOUSE_CONFIG_CLIENT --configserver $CLICKHOUSE_CONFIG --tmp $DATA_DIR/tmp --queries $QUERIES_DIR $TEST_OPT0 $TEST_OPT" - if [ "${TEST_RUN_STRESS}" ]; then - # Running test in parallel will fail some results (tests can create/fill/drop same tables) - TEST_NPROC=${TEST_NPROC:=$(( `nproc || sysctl -n hw.ncpu || echo 2` * 2))} - for i in `seq 1 ${TEST_NPROC}`; do - $CLICKHOUSE_TEST --order=random --testname --tmp=$DATA_DIR/tmp/tmp${i} & - done - fi - - if [ "${TEST_RUN_PARALLEL}" ]; then - # Running test in parallel will fail some results (tests can create/fill/drop same tables) - TEST_NPROC=${TEST_NPROC:=$(( `nproc || sysctl -n hw.ncpu || echo 2` * 2))} - for i in `seq 1 ${TEST_NPROC}`; do - $CLICKHOUSE_TEST --testname --tmp=$DATA_DIR/tmp/tmp${i} --database=test${i} --parallel=${i}/${TEST_NPROC} & - done - for job in `jobs -p`; do - #echo wait $job - wait $job || let "FAIL+=1" - done - - #echo $FAIL - if [ "$FAIL" != "0" ]; then - return $FAIL - fi - else - ( [ "$TEST_RUN" ] && $CLICKHOUSE_TEST ) || ${TEST_TRUE:=false} - fi - - $CLICKHOUSE_CLIENT_QUERY "SELECT event, value FROM system.events; SELECT metric, value FROM system.metrics; SELECT metric, value FROM system.asynchronous_metrics;" - $CLICKHOUSE_CLIENT_QUERY "SELECT 'Still alive'" -fi \ No newline at end of file diff --git a/tests/config/config.d/encryption.xml b/tests/config/config.d/encryption.xml new file mode 100644 index 00000000000..216021ae744 --- /dev/null +++ b/tests/config/config.d/encryption.xml @@ -0,0 +1,6 @@ + + + + echo "U29tZSBmaXhlZCBrZXkgdGhhdCBpcyBhdCBsZWFzdCAxNiBieXRlcyBsb25n" + + diff --git a/tests/config/config.d/macros.xml b/tests/config/config.d/macros.xml index 4902b12bc81..b17eb40099d 100644 --- a/tests/config/config.d/macros.xml +++ b/tests/config/config.d/macros.xml @@ -1,6 +1,7 @@ Hello, world! + test_shard_localhost s1 r1 /clickhouse/tables/{database}/{shard}/ diff --git a/tests/config/config.d/secure_ports.xml b/tests/config/config.d/secure_ports.xml index d915daaf743..e832dce5526 100644 --- a/tests/config/config.d/secure_ports.xml +++ b/tests/config/config.d/secure_ports.xml @@ -5,7 +5,7 @@ - AcceptCertificateHandler + AcceptCertificateHandler diff --git a/tests/config/config.d/zookeeper_log.xml b/tests/config/config.d/zookeeper_log.xml new file mode 100644 index 00000000000..2ec1f2446ed --- /dev/null +++ b/tests/config/config.d/zookeeper_log.xml @@ -0,0 +1,7 @@ + + + system + zookeeper_log
+ 7500 +
+
diff --git a/tests/config/executable_dictionary.xml b/tests/config/executable_dictionary.xml index c5a4a0947bc..6089f57a3d7 100644 --- a/tests/config/executable_dictionary.xml +++ b/tests/config/executable_dictionary.xml @@ -123,7 +123,7 @@ - echo "1\tValue" + printf "1\tValue\n" TabSeparated false @@ -197,7 +197,7 @@ - echo "1\tFirstKey\tValue" + printf "1\tFirstKey\tValue\n" TabSeparated false diff --git a/tests/config/install.sh b/tests/config/install.sh index 08add810cbf..571dff34018 100755 --- a/tests/config/install.sh +++ b/tests/config/install.sh @@ -34,6 +34,8 @@ ln -sf $SRC_PATH/config.d/logging_no_rotate.xml $DEST_SERVER_PATH/config.d/ ln -sf $SRC_PATH/config.d/tcp_with_proxy.xml $DEST_SERVER_PATH/config.d/ ln -sf $SRC_PATH/config.d/top_level_domains_lists.xml $DEST_SERVER_PATH/config.d/ ln -sf $SRC_PATH/config.d/top_level_domains_path.xml $DEST_SERVER_PATH/config.d/ +ln -sf $SRC_PATH/config.d/encryption.xml $DEST_SERVER_PATH/config.d/ +ln -sf $SRC_PATH/config.d/zookeeper_log.xml $DEST_SERVER_PATH/config.d/ ln -sf $SRC_PATH/users.d/log_queries.xml $DEST_SERVER_PATH/users.d/ ln -sf $SRC_PATH/users.d/readonly.xml $DEST_SERVER_PATH/users.d/ ln -sf $SRC_PATH/users.d/access_management.xml $DEST_SERVER_PATH/users.d/ diff --git a/tests/config/users.d/timeouts.xml b/tests/config/users.d/timeouts.xml index 583caca36a4..60b24cfdef8 100644 --- a/tests/config/users.d/timeouts.xml +++ b/tests/config/users.d/timeouts.xml @@ -4,6 +4,8 @@ 60 60 + + 60000
diff --git a/tests/integration/README.md b/tests/integration/README.md index cc504f01f82..8c353658705 100644 --- a/tests/integration/README.md +++ b/tests/integration/README.md @@ -5,14 +5,14 @@ This directory contains tests that involve several ClickHouse instances, custom ### Running natively Prerequisites: -* Ubuntu 14.04 (Trusty) or higher. +* Ubuntu 20.04 (Focal) or higher. * [docker](https://www.docker.com/community-edition#/download). Minimum required API version: 1.25, check with `docker version`. You must install latest Docker from https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#set-up-the-repository Don't use Docker from your system repository. -* [pip](https://pypi.python.org/pypi/pip) and `libpq-dev`. To install: `sudo apt-get install python3-pip libpq-dev zlib1g-dev libcrypto++-dev libssl-dev libkrb5-dev` +* [pip](https://pypi.python.org/pypi/pip) and `libpq-dev`. To install: `sudo apt-get install python3-pip libpq-dev zlib1g-dev libcrypto++-dev libssl-dev libkrb5-dev python3-dev` * [py.test](https://docs.pytest.org/) testing framework. To install: `sudo -H pip install pytest` * [docker-compose](https://docs.docker.com/compose/) and additional python libraries. To install: @@ -25,25 +25,29 @@ sudo -H pip install \ confluent-kafka \ dicttoxml \ docker \ - docker-compose==1.22.0 \ + docker-compose \ grpcio \ grpcio-tools \ kafka-python \ kazoo \ minio \ protobuf \ - psycopg2-binary==2.7.5 \ + psycopg2-binary \ pymongo \ + pytz \ pytest \ pytest-timeout \ redis \ tzlocal \ urllib3 \ requests-kerberos \ - dict2xml + dict2xml \ + hypothesis \ + pyhdfs \ + pika ``` -(highly not recommended) If you really want to use OS packages on modern debian/ubuntu instead of "pip": `sudo apt install -y docker docker-compose python3-pytest python3-dicttoxml python3-docker python3-pymysql python3-pymongo python3-tzlocal python3-kazoo python3-psycopg2 kafka-python python3-pytest-timeout python3-minio` +(highly not recommended) If you really want to use OS packages on modern debian/ubuntu instead of "pip": `sudo apt install -y docker docker-compose python3-pytest python3-dicttoxml python3-docker python3-pymysql python3-protobuf python3-pymongo python3-tzlocal python3-kazoo python3-psycopg2 kafka-python python3-pytest-timeout python3-minio` If you want to run the tests under a non-privileged user, you must add this user to `docker` group: `sudo usermod -aG docker $USER` and re-login. (You must close all your sessions (for example, restart your computer)) diff --git a/tests/integration/ci-runner.py b/tests/integration/ci-runner.py index 0af76fe2648..bf7549a83c4 100755 --- a/tests/integration/ci-runner.py +++ b/tests/integration/ci-runner.py @@ -3,6 +3,7 @@ import logging import subprocess import os +import glob import time import shutil from collections import defaultdict @@ -17,7 +18,6 @@ SLEEP_BETWEEN_RETRIES = 5 PARALLEL_GROUP_SIZE = 100 CLICKHOUSE_BINARY_PATH = "/usr/bin/clickhouse" CLICKHOUSE_ODBC_BRIDGE_BINARY_PATH = "/usr/bin/clickhouse-odbc-bridge" -DOCKERD_LOGS_PATH = "/ClickHouse/tests/integration/dockerd.log" CLICKHOUSE_LIBRARY_BRIDGE_BINARY_PATH = "/usr/bin/clickhouse-library-bridge" TRIES_COUNT = 10 @@ -125,13 +125,13 @@ def clear_ip_tables_and_restart_daemons(): logging.info("Dump iptables after run %s", subprocess.check_output("iptables -L", shell=True)) try: logging.info("Killing all alive docker containers") - subprocess.check_output("docker kill $(docker ps -q)", shell=True) + subprocess.check_output("timeout -s 9 10m docker kill $(docker ps -q)", shell=True) except subprocess.CalledProcessError as err: logging.info("docker kill excepted: " + str(err)) try: logging.info("Removing all docker containers") - subprocess.check_output("docker rm $(docker ps -a -q) --force", shell=True) + subprocess.check_output("timeout -s 9 10m docker rm $(docker ps -a -q) --force", shell=True) except subprocess.CalledProcessError as err: logging.info("docker rm excepted: " + str(err)) @@ -256,17 +256,36 @@ class ClickhouseIntegrationTestsRunner: shutil.copy(CLICKHOUSE_LIBRARY_BRIDGE_BINARY_PATH, result_path_library_bridge) return None, None - def _compress_logs(self, path, result_path): - subprocess.check_call("tar czf {} -C {} .".format(result_path, path), shell=True) # STYLE_CHECK_ALLOW_SUBPROCESS_CHECK_CALL + def _compress_logs(self, dir, relpaths, result_path): + subprocess.check_call("tar czf {} -C {} {}".format(result_path, dir, ' '.join(relpaths)), shell=True) # STYLE_CHECK_ALLOW_SUBPROCESS_CHECK_CALL def _get_all_tests(self, repo_path): image_cmd = self._get_runner_image_cmd(repo_path) - cmd = "cd {}/tests/integration && ./runner --tmpfs {} ' --setup-plan' | grep '::' | sed 's/ (fixtures used:.*//g' | sed 's/^ *//g' | sed 's/ *$//g' | grep -v 'SKIPPED' | sort -u > all_tests.txt".format(repo_path, image_cmd) + out_file = "all_tests.txt" + out_file_full = "all_tests_full.txt" + cmd = "cd {repo_path}/tests/integration && " \ + "timeout -s 9 1h ./runner --tmpfs {image_cmd} ' --setup-plan' " \ + "| tee {out_file_full} | grep '::' | sed 's/ (fixtures used:.*//g' | sed 's/^ *//g' | sed 's/ *$//g' " \ + "| grep -v 'SKIPPED' | sort -u > {out_file}".format( + repo_path=repo_path, image_cmd=image_cmd, out_file=out_file, out_file_full=out_file_full) + logging.info("Getting all tests with cmd '%s'", cmd) subprocess.check_call(cmd, shell=True) # STYLE_CHECK_ALLOW_SUBPROCESS_CHECK_CALL - all_tests_file_path = "{}/tests/integration/all_tests.txt".format(repo_path) + all_tests_file_path = "{repo_path}/tests/integration/{out_file}".format(repo_path=repo_path, out_file=out_file) if not os.path.isfile(all_tests_file_path) or os.path.getsize(all_tests_file_path) == 0: + all_tests_full_file_path = "{repo_path}/tests/integration/{out_file}".format(repo_path=repo_path, out_file=out_file_full) + if os.path.isfile(all_tests_full_file_path): + # log runner output + logging.info("runner output:") + with open(all_tests_full_file_path, 'r') as all_tests_full_file: + for line in all_tests_full_file: + line = line.rstrip() + if line: + logging.info("runner output: %s", line) + else: + logging.info("runner output '%s' is empty", all_tests_full_file_path) + raise Exception("There is something wrong with getting all tests list: file '{}' is empty or does not exist.".format(all_tests_file_path)) all_tests = [] @@ -336,6 +355,45 @@ class ClickhouseIntegrationTestsRunner: logging.info("Cannot run with custom docker image version :(") return image_cmd + def _find_test_data_dirs(self, repo_path, test_names): + relpaths = {} + for test_name in test_names: + if '/' in test_name: + test_dir = test_name[:test_name.find('/')] + else: + test_dir = test_name + if os.path.isdir(os.path.join(repo_path, "tests/integration", test_dir)): + for name in os.listdir(os.path.join(repo_path, "tests/integration", test_dir)): + relpath = os.path.join(os.path.join(test_dir, name)) + mtime = os.path.getmtime(os.path.join(repo_path, "tests/integration", relpath)) + relpaths[relpath] = mtime + return relpaths + + def _get_test_data_dirs_difference(self, new_snapshot, old_snapshot): + res = set() + for path in new_snapshot: + if (not path in old_snapshot) or (old_snapshot[path] != new_snapshot[path]): + res.add(path) + return res + + def try_run_test_group(self, repo_path, test_group, tests_in_group, num_tries, num_workers): + try: + return self.run_test_group(repo_path, test_group, tests_in_group, num_tries, num_workers) + except Exception as e: + logging.info("Failed to run {}:\n{}".format(str(test_group), str(e))) + counters = { + "ERROR": [], + "PASSED": [], + "FAILED": [], + "SKIPPED": [], + "FLAKY": [], + } + tests_times = defaultdict(float) + for test in tests_in_group: + counters["ERROR"].append(test) + tests_times[test] = 0 + return counters, tests_times, [] + def run_test_group(self, repo_path, test_group, tests_in_group, num_tries, num_workers): counters = { "ERROR": [], @@ -355,18 +413,14 @@ class ClickhouseIntegrationTestsRunner: image_cmd = self._get_runner_image_cmd(repo_path) test_group_str = test_group.replace('/', '_').replace('.', '_') + log_paths = [] + test_data_dirs = {} for i in range(num_tries): logging.info("Running test group %s for the %s retry", test_group, i) clear_ip_tables_and_restart_daemons() - output_path = os.path.join(str(self.path()), "test_output_" + test_group_str + "_" + str(i) + ".log") - log_name = "integration_run_" + test_group_str + "_" + str(i) + ".txt" - log_path = os.path.join(str(self.path()), log_name) - log_paths.append(log_path) - logging.info("Will wait output inside %s", output_path) - test_names = set([]) for test_name in tests_in_group: if test_name not in counters["PASSED"]: @@ -375,11 +429,19 @@ class ClickhouseIntegrationTestsRunner: else: test_names.add(test_name) + if i == 0: + test_data_dirs = self._find_test_data_dirs(repo_path, test_names) + + info_basename = test_group_str + "_" + str(i) + ".nfo" + info_path = os.path.join(repo_path, "tests/integration", info_basename) + test_cmd = ' '.join([test for test in sorted(test_names)]) parallel_cmd = " --parallel {} ".format(num_workers) if num_workers > 0 else "" - cmd = "cd {}/tests/integration && ./runner --tmpfs {} -t {} {} '-ss -rfEp --run-id={} --color=no --durations=0 {}' | tee {}".format( - repo_path, image_cmd, test_cmd, parallel_cmd, i, _get_deselect_option(self.should_skip_tests()), output_path) + cmd = "cd {}/tests/integration && timeout -s 9 1h ./runner --tmpfs {} -t {} {} '-rfEp --run-id={} --color=no --durations=0 {}' | tee {}".format( + repo_path, image_cmd, test_cmd, parallel_cmd, i, _get_deselect_option(self.should_skip_tests()), info_path) + log_basename = test_group_str + "_" + str(i) + ".log" + log_path = os.path.join(repo_path, "tests/integration", log_basename) with open(log_path, 'w') as log: logging.info("Executing cmd: %s", cmd) retcode = subprocess.Popen(cmd, shell=True, stderr=log, stdout=log).wait() @@ -388,15 +450,41 @@ class ClickhouseIntegrationTestsRunner: else: logging.info("Some tests failed") - if os.path.exists(output_path): - lines = parse_test_results_output(output_path) + extra_logs_names = [log_basename] + log_result_path = os.path.join(str(self.path()), 'integration_run_' + log_basename) + shutil.copy(log_path, log_result_path) + log_paths.append(log_result_path) + + for pytest_log_path in glob.glob(os.path.join(repo_path, "tests/integration/pytest*.log")): + new_name = test_group_str + "_" + str(i) + "_" + os.path.basename(pytest_log_path) + os.rename(pytest_log_path, os.path.join(repo_path, "tests/integration", new_name)) + extra_logs_names.append(new_name) + + dockerd_log_path = os.path.join(repo_path, "tests/integration/dockerd.log") + if os.path.exists(dockerd_log_path): + new_name = test_group_str + "_" + str(i) + "_" + os.path.basename(dockerd_log_path) + os.rename(dockerd_log_path, os.path.join(repo_path, "tests/integration", new_name)) + extra_logs_names.append(new_name) + + if os.path.exists(info_path): + extra_logs_names.append(info_basename) + lines = parse_test_results_output(info_path) new_counters = get_counters(lines) - times_lines = parse_test_times(output_path) + times_lines = parse_test_times(info_path) new_tests_times = get_test_times(times_lines) self._update_counters(counters, new_counters) for test_name, test_time in new_tests_times.items(): tests_times[test_name] = test_time - os.remove(output_path) + + test_data_dirs_new = self._find_test_data_dirs(repo_path, test_names) + test_data_dirs_diff = self._get_test_data_dirs_difference(test_data_dirs_new, test_data_dirs) + test_data_dirs = test_data_dirs_new + + if extra_logs_names or test_data_dirs_diff: + extras_result_path = os.path.join(str(self.path()), "integration_run_" + test_group_str + "_" + str(i) + ".tar.gz") + self._compress_logs(os.path.join(repo_path, "tests/integration"), extra_logs_names + list(test_data_dirs_diff), extras_result_path) + log_paths.append(extras_result_path) + if len(counters["PASSED"]) + len(counters["FLAKY"]) == len(tests_in_group): logging.info("All tests from group %s passed", test_group) break @@ -437,7 +525,7 @@ class ClickhouseIntegrationTestsRunner: for i in range(TRIES_COUNT): final_retry += 1 logging.info("Running tests for the %s time", i) - counters, tests_times, log_paths = self.run_test_group(repo_path, "flaky", tests_to_run, 1, 1) + counters, tests_times, log_paths = self.try_run_test_group(repo_path, "flaky", tests_to_run, 1, 1) logs += log_paths if counters["FAILED"]: logging.info("Found failed tests: %s", ' '.join(counters["FAILED"])) @@ -459,15 +547,6 @@ class ClickhouseIntegrationTestsRunner: break time.sleep(5) - logging.info("Finally all tests done, going to compress test dir") - test_logs = os.path.join(str(self.path()), "./test_dir.tar.gz") - self._compress_logs("{}/tests/integration".format(repo_path), test_logs) - logging.info("Compression finished") - - result_path_dockerd_logs = os.path.join(str(self.path()), "dockerd.log") - if os.path.exists(result_path_dockerd_logs): - shutil.copy(DOCKERD_LOGS_PATH, result_path_dockerd_logs) - test_result = [] for state in ("ERROR", "FAILED", "PASSED", "SKIPPED", "FLAKY"): if state == "PASSED": @@ -479,7 +558,7 @@ class ClickhouseIntegrationTestsRunner: test_result += [(c + ' (✕' + str(final_retry) + ')', text_state, "{:.2f}".format(tests_times[c])) for c in counters[state]] status_text = description_prefix + ', '.join([str(n).lower().replace('failed', 'fail') + ': ' + str(len(c)) for n, c in counters.items()]) - return result_state, status_text, test_result, [test_logs] + logs + return result_state, status_text, test_result, logs def run_impl(self, repo_path, build_path): if self.flaky_check: @@ -522,7 +601,7 @@ class ClickhouseIntegrationTestsRunner: for group, tests in items_to_run: logging.info("Running test group %s countaining %s tests", group, len(tests)) - group_counters, group_test_times, log_paths = self.run_test_group(repo_path, group, tests, MAX_RETRY, NUM_WORKERS) + group_counters, group_test_times, log_paths = self.try_run_test_group(repo_path, group, tests, MAX_RETRY, NUM_WORKERS) total_tests = 0 for counter, value in group_counters.items(): logging.info("Tests from group %s stats, %s count %s", group, counter, len(value)) @@ -539,15 +618,6 @@ class ClickhouseIntegrationTestsRunner: logging.info("Collected more than 20 failed/error tests, stopping") break - logging.info("Finally all tests done, going to compress test dir") - test_logs = os.path.join(str(self.path()), "./test_dir.tar.gz") - self._compress_logs("{}/tests/integration".format(repo_path), test_logs) - logging.info("Compression finished") - - result_path_dockerd_logs = os.path.join(str(self.path()), "dockerd.log") - if os.path.exists(result_path_dockerd_logs): - shutil.copy(DOCKERD_LOGS_PATH, result_path_dockerd_logs) - if counters["FAILED"] or counters["ERROR"]: logging.info("Overall status failure, because we have tests in FAILED or ERROR state") result_state = "failure" @@ -580,7 +650,7 @@ class ClickhouseIntegrationTestsRunner: if '(memory)' in self.params['context_name']: result_state = "success" - return result_state, status_text, test_result, [test_logs] + return result_state, status_text, test_result, [] def write_results(results_file, status_file, results, status): with open(results_file, 'w') as f: diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index 993e7a6e973..bcd47899ca0 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -1,4 +1,3 @@ -import subprocess from helpers.cluster import run_and_check import pytest import logging diff --git a/tests/integration/helpers/cluster.py b/tests/integration/helpers/cluster.py index 162ffc53e20..6fe01b5df03 100644 --- a/tests/integration/helpers/cluster.py +++ b/tests/integration/helpers/cluster.py @@ -29,7 +29,10 @@ from dict2xml import dict2xml from kazoo.client import KazooClient from kazoo.exceptions import KazooException from minio import Minio +from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT + from helpers.test_tools import assert_eq_with_retry +from helpers import pytest_xdist_logging_to_separate_files import docker @@ -56,22 +59,22 @@ def run_and_check(args, env=None, shell=False, stdout=subprocess.PIPE, stderr=su subprocess.Popen(args, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, env=env, shell=shell) return + logging.debug(f"Command:{args}") res = subprocess.run(args, stdout=stdout, stderr=stderr, env=env, shell=shell, timeout=timeout) out = res.stdout.decode('utf-8') err = res.stderr.decode('utf-8') + # check_call(...) from subprocess does not print stderr, so we do it manually + for outline in out.splitlines(): + logging.debug(f"Stdout:{outline}") + for errline in err.splitlines(): + logging.debug(f"Stderr:{errline}") if res.returncode != 0: - # check_call(...) from subprocess does not print stderr, so we do it manually - logging.debug(f"Command:{args}") - logging.debug(f"Stderr:{err}") - logging.debug(f"Stdout:{out}") - logging.debug(f"Env: {env}") + logging.debug(f"Exitcode:{res.returncode}") + if env: + logging.debug(f"Env:{env}") if not nothrow: raise Exception(f"Command {args} return non-zero code {res.returncode}: {res.stderr.decode('utf-8')}") - else: - logging.debug(f"Command:{args}") - logging.debug(f"Stderr: {err}") - logging.debug(f"Stdout: {out}") - return out + return out # Based on https://stackoverflow.com/questions/2838244/get-open-tcp-port-in-python/2838309#2838309 def get_free_port(): @@ -107,6 +110,7 @@ def subprocess_check_call(args, detach=False, nothrow=False): #logging.info('run:' + ' '.join(args)) return run_and_check(args, detach=detach, nothrow=nothrow) + def get_odbc_bridge_path(): path = os.environ.get('CLICKHOUSE_TESTS_ODBC_BRIDGE_BIN_PATH') if path is None: @@ -192,6 +196,7 @@ class ClickHouseCluster: zookeeper_keyfile=None, zookeeper_certfile=None): for param in list(os.environ.keys()): logging.debug("ENV %40s %s" % (param, os.environ[param])) + self.base_path = base_path self.base_dir = p.dirname(base_path) self.name = name if name is not None else '' @@ -257,6 +262,7 @@ class ClickHouseCluster: self.with_hdfs = False self.with_kerberized_hdfs = False self.with_mongo = False + self.with_mongo_secure = False self.with_net_trics = False self.with_redis = False self.with_cassandra = False @@ -330,12 +336,16 @@ class ClickHouseCluster: # available when with_postgres == True self.postgres_host = "postgres1" self.postgres_ip = None + self.postgres_conn = None self.postgres2_host = "postgres2" self.postgres2_ip = None + self.postgres2_conn = None self.postgres3_host = "postgres3" self.postgres3_ip = None + self.postgres3_conn = None self.postgres4_host = "postgres4" self.postgres4_ip = None + self.postgres4_conn = None self.postgres_port = 5432 self.postgres_dir = p.abspath(p.join(self.instances_dir, "postgres")) self.postgres_logs_dir = os.path.join(self.postgres_dir, "postgres1") @@ -384,6 +394,13 @@ class ClickHouseCluster: self.zookeeper_instance_dir_prefix = p.join(self.instances_dir, "zk") self.zookeeper_dirs_to_create = [] + # available when with_jdbc_bridge == True + self.jdbc_bridge_host = "bridge1" + self.jdbc_bridge_ip = None + self.jdbc_bridge_port = 9019 + self.jdbc_driver_dir = p.abspath(p.join(self.instances_dir, "jdbc_driver")) + self.jdbc_driver_logs_dir = os.path.join(self.jdbc_driver_dir, "logs") + self.docker_client = None self.is_up = False self.env = os.environ.copy() @@ -392,13 +409,20 @@ class ClickHouseCluster: def cleanup(self): # Just in case kill unstopped containers from previous launch try: - result = run_and_check(f'docker container list --all --filter name={self.project_name} | wc -l', shell=True) - if int(result) > 1: - logging.debug(f"Trying to kill unstopped containers for project{self.project_name}...") - run_and_check(f'docker kill $(docker container list --all --quiet --filter name={self.project_name})', shell=True) - run_and_check(f'docker rm $(docker container list --all --quiet --filter name={self.project_name})', shell=True) + # docker-compose names containers using the following formula: + # container_name = project_name + '_' + instance_name + '_1' + # We need to have "^/" and "$" in the "--filter name" option below to filter by exact name of the container, see + # https://stackoverflow.com/questions/48767760/how-to-make-docker-container-ls-f-name-filter-by-exact-name + filter_name = f'^/{self.project_name}_.*_1$' + if int(run_and_check(f'docker container list --all --filter name={filter_name} | wc -l', shell=True)) > 1: + logging.debug(f"Trying to kill unstopped containers for project {self.project_name}:") + unstopped_containers = run_and_check(f'docker container list --all --filter name={filter_name}', shell=True) + unstopped_containers_ids = [line.split()[0] for line in unstopped_containers.splitlines()[1:]] + for id in unstopped_containers_ids: + run_and_check(f'docker kill {id}', shell=True, nothrow=True) + run_and_check(f'docker rm {id}', shell=True, nothrow=True) logging.debug("Unstopped containers killed") - run_and_check(['docker-compose', 'ps', '--services', '--all']) + run_and_check(f'docker container list --all --filter name={filter_name}', shell=True) else: logging.debug(f"No running containers for project: {self.project_name}") except: @@ -526,7 +550,6 @@ class ClickHouseCluster: return self.base_mysql_client_cmd - def setup_mysql_cmd(self, instance, env_variables, docker_compose_yml_dir): self.with_mysql = True env_variables['MYSQL_HOST'] = self.mysql_host @@ -658,6 +681,17 @@ class ClickHouseCluster: '--file', p.join(docker_compose_yml_dir, 'docker_compose_rabbitmq.yml')] return self.base_rabbitmq_cmd + def setup_mongo_secure_cmd(self, instance, env_variables, docker_compose_yml_dir): + self.with_mongo = self.with_mongo_secure = True + env_variables['MONGO_HOST'] = self.mongo_host + env_variables['MONGO_EXTERNAL_PORT'] = str(self.mongo_port) + env_variables['MONGO_INTERNAL_PORT'] = "27017" + env_variables['MONGO_CONFIG_PATH'] = HELPERS_DIR + self.base_cmd.extend(['--file', p.join(docker_compose_yml_dir, 'docker_compose_mongo_secure.yml')]) + self.base_mongo_cmd = ['docker-compose', '--env-file', instance.env_file, '--project-name', self.project_name, + '--file', p.join(docker_compose_yml_dir, 'docker_compose_mongo_secure.yml')] + return self.base_mongo_cmd + def setup_mongo_cmd(self, instance, env_variables, docker_compose_yml_dir): self.with_mongo = True env_variables['MONGO_HOST'] = self.mongo_host @@ -690,6 +724,8 @@ class ClickHouseCluster: def setup_jdbc_bridge_cmd(self, instance, env_variables, docker_compose_yml_dir): self.with_jdbc_bridge = True + env_variables['JDBC_DRIVER_LOGS'] = self.jdbc_driver_logs_dir + env_variables['JDBC_DRIVER_FS'] = "bind" self.base_cmd.extend(['--file', p.join(docker_compose_yml_dir, 'docker_compose_jdbc_bridge.yml')]) self.base_jdbc_bridge_cmd = ['docker-compose', '--env-file', instance.env_file, '--project-name', self.project_name, '--file', p.join(docker_compose_yml_dir, 'docker_compose_jdbc_bridge.yml')] @@ -699,7 +735,8 @@ class ClickHouseCluster: macros=None, with_zookeeper=False, with_zookeeper_secure=False, with_mysql_client=False, with_mysql=False, with_mysql8=False, with_mysql_cluster=False, with_kafka=False, with_kerberized_kafka=False, with_rabbitmq=False, clickhouse_path_dir=None, - with_odbc_drivers=False, with_postgres=False, with_postgres_cluster=False, with_hdfs=False, with_kerberized_hdfs=False, with_mongo=False, + with_odbc_drivers=False, with_postgres=False, with_postgres_cluster=False, with_hdfs=False, + with_kerberized_hdfs=False, with_mongo=False, with_mongo_secure=False, with_redis=False, with_minio=False, with_cassandra=False, with_jdbc_bridge=False, hostname=None, env_variables=None, image="yandex/clickhouse-integration-test", tag=None, stay_alive=False, ipv4_address=None, ipv6_address=None, with_installed_binary=False, tmpfs=None, @@ -752,7 +789,7 @@ class ClickHouseCluster: with_kerberized_kafka=with_kerberized_kafka, with_rabbitmq=with_rabbitmq, with_kerberized_hdfs=with_kerberized_hdfs, - with_mongo=with_mongo, + with_mongo=with_mongo or with_mongo_secure, with_redis=with_redis, with_minio=with_minio, with_cassandra=with_cassandra, @@ -837,8 +874,11 @@ class ClickHouseCluster: if with_kerberized_hdfs and not self.with_kerberized_hdfs: cmds.append(self.setup_kerberized_hdfs_cmd(instance, env_variables, docker_compose_yml_dir)) - if with_mongo and not self.with_mongo: - cmds.append(self.setup_mongo_cmd(instance, env_variables, docker_compose_yml_dir)) + if (with_mongo or with_mongo_secure) and not (self.with_mongo or self.with_mongo_secure): + if with_mongo_secure: + cmds.append(self.setup_mongo_secure_cmd(instance, env_variables, docker_compose_yml_dir)) + else: + cmds.append(self.setup_mongo_cmd(instance, env_variables, docker_compose_yml_dir)) if self.with_net_trics: for cmd in cmds: @@ -1073,8 +1113,9 @@ class ClickHouseCluster: start = time.time() while time.time() - start < timeout: try: - conn = psycopg2.connect(host=self.postgres_ip, port=self.postgres_port, user='postgres', password='mysecretpassword') - conn.close() + self.postgres_conn = psycopg2.connect(host=self.postgres_ip, port=self.postgres_port, database='postgres', user='postgres', password='mysecretpassword') + self.postgres_conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) + self.postgres_conn.autocommit = True logging.debug("Postgres Started") return except Exception as ex: @@ -1088,20 +1129,40 @@ class ClickHouseCluster: self.postgres3_ip = self.get_instance_ip(self.postgres3_host) self.postgres4_ip = self.get_instance_ip(self.postgres4_host) start = time.time() - for ip in [self.postgres2_ip, self.postgres3_ip, self.postgres4_ip]: - while time.time() - start < timeout: - try: - conn = psycopg2.connect(host=ip, port=self.postgres_port, user='postgres', password='mysecretpassword') - conn.close() - logging.debug("Postgres Cluster Started") - return - except Exception as ex: - logging.debug("Can't connect to Postgres " + str(ex)) - time.sleep(0.5) + while time.time() - start < timeout: + try: + self.postgres2_conn = psycopg2.connect(host=self.postgres2_ip, port=self.postgres_port, database='postgres', user='postgres', password='mysecretpassword') + self.postgres2_conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) + self.postgres2_conn.autocommit = True + logging.debug("Postgres Cluster host 2 started") + break + except Exception as ex: + logging.debug("Can't connect to Postgres host 2" + str(ex)) + time.sleep(0.5) + while time.time() - start < timeout: + try: + self.postgres3_conn = psycopg2.connect(host=self.postgres3_ip, port=self.postgres_port, database='postgres', user='postgres', password='mysecretpassword') + self.postgres3_conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) + self.postgres3_conn.autocommit = True + logging.debug("Postgres Cluster host 3 started") + break + except Exception as ex: + logging.debug("Can't connect to Postgres host 3" + str(ex)) + time.sleep(0.5) + while time.time() - start < timeout: + try: + self.postgres4_conn = psycopg2.connect(host=self.postgres4_ip, port=self.postgres_port, database='postgres', user='postgres', password='mysecretpassword') + self.postgres4_conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) + self.postgres4_conn.autocommit = True + logging.debug("Postgres Cluster host 4 started") + return + except Exception as ex: + logging.debug("Can't connect to Postgres host 4" + str(ex)) + time.sleep(0.5) raise Exception("Cannot wait Postgres container") - def wait_rabbitmq_to_start(self, timeout=180): + def wait_rabbitmq_to_start(self, timeout=180, throw=True): self.rabbitmq_ip = self.get_instance_ip(self.rabbitmq_host) start = time.time() @@ -1111,13 +1172,15 @@ class ClickHouseCluster: logging.debug("RabbitMQ is available") if enable_consistent_hash_plugin(self.rabbitmq_docker_id): logging.debug("RabbitMQ consistent hash plugin is available") - return + return True time.sleep(0.5) except Exception as ex: logging.debug("Can't connect to RabbitMQ " + str(ex)) time.sleep(0.5) - raise Exception("Cannot wait RabbitMQ container") + if throw: + raise Exception("Cannot wait RabbitMQ container") + return False def wait_zookeeper_secure_to_start(self, timeout=20): logging.debug("Wait ZooKeeper Secure to start") @@ -1187,7 +1250,6 @@ class ClickHouseCluster: logging.debug("Waiting for Kafka to start up") time.sleep(1) - def wait_hdfs_to_start(self, timeout=300, check_marker=False): start = time.time() while time.time() - start < timeout: @@ -1204,9 +1266,11 @@ class ClickHouseCluster: raise Exception("Can't wait HDFS to start") - def wait_mongo_to_start(self, timeout=180): + def wait_mongo_to_start(self, timeout=30, secure=False): connection_str = 'mongodb://{user}:{password}@{host}:{port}'.format( host='localhost', port=self.mongo_port, user='root', password='clickhouse') + if secure: + connection_str += '/?tls=true&tlsAllowInvalidCertificates=true' connection = pymongo.MongoClient(connection_str) start = time.time() while time.time() - start < timeout: @@ -1273,7 +1337,6 @@ class ClickHouseCluster: raise Exception("Can't wait Schema Registry to start") - def wait_cassandra_to_start(self, timeout=180): self.cassandra_ip = self.get_instance_ip(self.cassandra_host) cass_client = cassandra.cluster.Cluster([self.cassandra_ip], port=self.cassandra_port, load_balancing_policy=RoundRobinPolicy()) @@ -1293,6 +1356,9 @@ class ClickHouseCluster: raise Exception("Can't wait Cassandra to start") def start(self, destroy_dirs=True): + pytest_xdist_logging_to_separate_files.setup() + logging.info("Running tests in {}".format(self.base_path)) + logging.debug("Cluster start called. is_up={}, destroy_dirs={}".format(self.is_up, destroy_dirs)) if self.is_up: return @@ -1428,9 +1494,13 @@ class ClickHouseCluster: logging.debug('Setup RabbitMQ') os.makedirs(self.rabbitmq_logs_dir) os.chmod(self.rabbitmq_logs_dir, stat.S_IRWXO) - subprocess_check_call(self.base_rabbitmq_cmd + common_opts + ['--renew-anon-volumes']) - self.rabbitmq_docker_id = self.get_instance_docker_id('rabbitmq1') - self.wait_rabbitmq_to_start() + + for i in range(5): + subprocess_check_call(self.base_rabbitmq_cmd + common_opts + ['--renew-anon-volumes']) + self.rabbitmq_docker_id = self.get_instance_docker_id('rabbitmq1') + logging.debug(f"RabbitMQ checking container try: {i}") + if self.wait_rabbitmq_to_start(throw=(i==4)): + break if self.with_hdfs and self.base_hdfs_cmd: logging.debug('Setup HDFS') @@ -1451,7 +1521,7 @@ class ClickHouseCluster: if self.with_mongo and self.base_mongo_cmd: logging.debug('Setup Mongo') run_and_check(self.base_mongo_cmd + common_opts) - self.wait_mongo_to_start(30) + self.wait_mongo_to_start(30, secure=self.with_mongo_secure) if self.with_redis and self.base_redis_cmd: logging.debug('Setup Redis') @@ -1478,8 +1548,12 @@ class ClickHouseCluster: self.wait_cassandra_to_start() if self.with_jdbc_bridge and self.base_jdbc_bridge_cmd: + os.makedirs(self.jdbc_driver_logs_dir) + os.chmod(self.jdbc_driver_logs_dir, stat.S_IRWXO) + subprocess_check_call(self.base_jdbc_bridge_cmd + ['up', '-d']) - self.wait_for_url("http://localhost:9020/ping") + self.jdbc_bridge_ip = self.get_instance_ip(self.jdbc_bridge_host) + self.wait_for_url(f"http://{self.jdbc_bridge_ip}:{self.jdbc_bridge_port}/ping") clickhouse_start_cmd = self.base_cmd + ['up', '-d', '--no-recreate'] logging.debug(("Trying to create ClickHouse instance by command %s", ' '.join(map(str, clickhouse_start_cmd)))) @@ -1774,12 +1848,14 @@ class ClickHouseInstance: # Connects to the instance via clickhouse-client, sends a query (1st argument) and returns the answer def query(self, sql, stdin=None, timeout=None, settings=None, user=None, password=None, database=None, ignore_error=False): + logging.debug(f"Executing query {sql} on {self.name}") return self.client.query(sql, stdin=stdin, timeout=timeout, settings=settings, user=user, password=password, database=database, ignore_error=ignore_error) def query_with_retry(self, sql, stdin=None, timeout=None, settings=None, user=None, password=None, database=None, ignore_error=False, retry_count=20, sleep_time=0.5, check_callback=lambda x: True): + logging.debug(f"Executing query {sql} on {self.name}") result = None for i in range(retry_count): try: @@ -1797,23 +1873,27 @@ class ClickHouseInstance: raise Exception("Can't execute query {}".format(sql)) # As query() but doesn't wait response and returns response handler - def get_query_request(self, *args, **kwargs): - return self.client.get_query_request(*args, **kwargs) + def get_query_request(self, sql, *args, **kwargs): + logging.debug(f"Executing query {sql} on {self.name}") + return self.client.get_query_request(sql, *args, **kwargs) # Connects to the instance via clickhouse-client, sends a query (1st argument), expects an error and return its code def query_and_get_error(self, sql, stdin=None, timeout=None, settings=None, user=None, password=None, database=None): + logging.debug(f"Executing query {sql} on {self.name}") return self.client.query_and_get_error(sql, stdin=stdin, timeout=timeout, settings=settings, user=user, password=password, database=database) # The same as query_and_get_error but ignores successful query. def query_and_get_answer_with_error(self, sql, stdin=None, timeout=None, settings=None, user=None, password=None, database=None): + logging.debug(f"Executing query {sql} on {self.name}") return self.client.query_and_get_answer_with_error(sql, stdin=stdin, timeout=timeout, settings=settings, user=user, password=password, database=database) # Connects to the instance via HTTP interface, sends a query and returns the answer def http_query(self, sql, data=None, params=None, user=None, password=None, expect_fail_and_get_error=False): + logging.debug(f"Executing query {sql} on {self.name} via HTTP interface") if params is None: params = {} else: @@ -1848,11 +1928,13 @@ class ClickHouseInstance: # Connects to the instance via HTTP interface, sends a query and returns the answer def http_request(self, url, method='GET', params=None, data=None, headers=None): + logging.debug(f"Sending HTTP request {url} to {self.name}") url = "http://" + self.ip_address + ":8123/" + url return requests.request(method=method, url=url, params=params, data=data, headers=headers) # Connects to the instance via HTTP interface, sends a query, expects an error and return the error message def http_query_and_get_error(self, sql, data=None, params=None, user=None, password=None): + logging.debug(f"Executing query {sql} on {self.name} via HTTP interface") return self.http_query(sql=sql, data=data, params=params, user=user, password=password, expect_fail_and_get_error=True) diff --git a/tests/integration/helpers/hdfs_api.py b/tests/integration/helpers/hdfs_api.py index 2000de8c36a..3d2d647d0ed 100644 --- a/tests/integration/helpers/hdfs_api.py +++ b/tests/integration/helpers/hdfs_api.py @@ -102,6 +102,7 @@ class HDFSApi(object): return response_data else: logging.error(f"unexpected response_data.status_code {response_data.status_code} != {expected_code}") + time.sleep(1) response_data.raise_for_status() diff --git a/tests/integration/helpers/mongo_cert.pem b/tests/integration/helpers/mongo_cert.pem new file mode 100644 index 00000000000..9e18b1d4469 --- /dev/null +++ b/tests/integration/helpers/mongo_cert.pem @@ -0,0 +1,44 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEAtz2fpa8hyUff8u8jYlh20HbkOO8hQi64Ke2Prack2Br0lhOr +1MI6I8nVk5iDrt+7ix2Cnt+2aZKb6HJv0CG1V25yWg+jgsXeIT1KHTJf8rTmYxhb +t+ye+S1Z0h/Rt+xqSd9XXfzOLPGHYfyx6ZQ4AumO/HoEFD4IH/qiREjwtOfRXuhz +CohqtUTyYR7pJmZqBSuGac461WVRisnjfKRxeVa3itc84/RgktgYej2x4PQBFk13 +xAXKrWmHkwdgWklTuuK8Gtoqz65Y4/J9CSl+Bd08QDdRnaVvq1u1eNTZg1BVyeRv +jFYBMSathKASrng5nK66Fdilw6tO/9khaP0SDQIDAQABAoIBAAm/5qGrKtIJ1/mW +Dbzq1g+Lc+MvngZmc/gPIsjrjsNM09y0WT0txGgpEgsTX1ZLoy/otw16+7qsSU1Z +4WcilAJ95umx0VJg8suz9iCNkJtaUrPNFPw5Q9AgQJo0hTUTCCi8EGr4y4OKqlhl +WJYEA+LryGbYmyT0k/wXmtClTOFjKS09mK4deQ1DqbBxayR9MUZgRJzEODA8eGXs +Rc6fJUenMVNMzIVLgpossRtKImoZNcf5UtCKL3HECunndQeMu4zuqLMU+EzL1F/o +iHKF7v3CVmsK0OxNJfOfT0abN3XaJttFwTJyghQjgP8OX1IKjlj3vo9xwEDfVUEf +GVIER0UCgYEA2j+kjaT3Dw2lNlBEsA8uvVlLJHBc9JBtMGduGYsIEgsL/iStqXv4 +xoA9N3CwkN/rrQpDfi/16DMXAAYdjGulPwiMNFBY22TCzhtPC2mAnfaSForxwZCs +lwc3KkIloo3N5XvN78AuZf8ewiS+bOEj+HHHqqSb1+u/csuaXO9neesCgYEA1u/I +Mlt/pxJkH+c3yOskwCh/CNhq9szi8G9LXROIQ58BT2ydJSEPpt7AhUTtQGimQQTW +KLiffJSkjuVaFckR1GjCoAmFGYw9wUb+TmFNScz5pJ2dXse8aBysAMIQfEIcRAEa +gKnkLBH6nw3+/Hm3xwoBc35t8Pa2ek7LsWDfbecCgYBhilQW4gVw+t49uf4Y2ZBA +G+pTbMx+mRXTrkYssFB5D+raOLZMqxVyUdoKLxkahpkkCxRDD1hN4JeE8Ta/jVSb +KUzQDKDJ3OybhOT86rgK4SpFXO/TXL9l+FmVT17WmZ3N1Fkjr7aM60pp5lYc/zo+ +TUu5XjwwcjJsMcbZhj2u5QKBgQCDNuUn4PYAP9kCJPzIWs0XxmEvPDeorZIJqFgA +3XC9n2+EVlFlHlbYz3oGofqY7Io6fUJkn7k1q+T+G4QwcozA+KeAXe90lkoJGVcc +8IfnewwYc+RjvVoG0SIsYE0CHrX0yhus2oqiYON4gGnfJkuMZk5WfKOPjH4AEuSF +SBd+lwKBgQCHG/DA6u2mYmezPF9hebWFoyAVSr2PDXDhu8cNNHCpx9GewJXhuK/P +tW8mazHzUuJKBvmaUXDIXFh4K6FNhjH16p5jR1w3hsPE7NEZhjfVRaUYPmBqaOYR +jp8H+Sh5g4Rwbtfp6Qhu6UAKi/y6Vozs5GkJtSiNrjNDVrD+sGGrXA== +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIICqDCCAZACFBdaMnuT0pWhmrh05UT3HXJ+kI0yMA0GCSqGSIb3DQEBCwUAMA0x +CzAJBgNVBAMMAmNhMB4XDTIxMDQwNjE3MDQxNVoXDTIyMDQwNjE3MDQxNVowFDES +MBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtz2fpa8hyUff8u8jYlh20HbkOO8hQi64Ke2Prack2Br0lhOr1MI6I8nVk5iD +rt+7ix2Cnt+2aZKb6HJv0CG1V25yWg+jgsXeIT1KHTJf8rTmYxhbt+ye+S1Z0h/R +t+xqSd9XXfzOLPGHYfyx6ZQ4AumO/HoEFD4IH/qiREjwtOfRXuhzCohqtUTyYR7p +JmZqBSuGac461WVRisnjfKRxeVa3itc84/RgktgYej2x4PQBFk13xAXKrWmHkwdg +WklTuuK8Gtoqz65Y4/J9CSl+Bd08QDdRnaVvq1u1eNTZg1BVyeRvjFYBMSathKAS +rng5nK66Fdilw6tO/9khaP0SDQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAct2If +isMLHIqyL9GjY4b0xcxF4svFU/DUwNanStmoFMW1ifPf1cCqeMzyQOxBCDdMs0RT +hBbDYHW0BMXDqYIr3Ktbu38/3iVyr3pb56YOCKy8yHXpmKEaUBhCknSLcQyvNfeS +tM+DWsKFTZfyR5px+WwXbGKVMYwLaTON+/wcv1MeKMig3CxluaCpEJVYYwAiUc4K +sgvQNAunwGmPLPoXtUnpR2ZWiQA5R6yjS1oIe+8vpryFP6kjhWs0HR0jZEtLulV5 +WXUuxkqTXiBIvYpsmusoR44e9rptwLbV1wL/LUScRt9ttqFM3N5/Pof+2UwkSjGB +GAyPmw0Pkqtt+lva +-----END CERTIFICATE----- diff --git a/tests/integration/helpers/mongo_secure.conf b/tests/integration/helpers/mongo_secure.conf new file mode 100644 index 00000000000..1128b16b546 --- /dev/null +++ b/tests/integration/helpers/mongo_secure.conf @@ -0,0 +1,5 @@ +net: + ssl: + mode: requireSSL + PEMKeyFile: /mongo/mongo_cert.pem + allowConnectionsWithoutCertificates: true diff --git a/tests/integration/helpers/pytest_xdist_logging_to_separate_files.py b/tests/integration/helpers/pytest_xdist_logging_to_separate_files.py new file mode 100644 index 00000000000..ee9a52e042c --- /dev/null +++ b/tests/integration/helpers/pytest_xdist_logging_to_separate_files.py @@ -0,0 +1,28 @@ +import logging +import os.path + +# Makes the parallel workers of pytest-xdist to log to separate files. +# Without this function all workers will log to the same log file +# and mix everything together making it much more difficult for troubleshooting. +def setup(): + worker_name = os.environ.get('PYTEST_XDIST_WORKER', 'master') + if worker_name == 'master': + return + logger = logging.getLogger('') + new_handlers = [] + handlers_to_remove = [] + for handler in logger.handlers: + if isinstance(handler, logging.FileHandler): + filename, ext = os.path.splitext(handler.baseFilename) + if not filename.endswith('-' + worker_name): + new_filename = filename + '-' + worker_name + new_handler = logging.FileHandler(new_filename + ext) + new_handler.setFormatter(handler.formatter) + new_handler.setLevel(handler.level) + new_handlers.append(new_handler) + handlers_to_remove.append(handler) + for new_handler in new_handlers: + logger.addHandler(new_handler) + for handler in handlers_to_remove: + handler.flush() + logger.removeHandler(handler) diff --git a/tests/integration/helpers/test_tools.py b/tests/integration/helpers/test_tools.py index ef530c4836b..b5d40659629 100644 --- a/tests/integration/helpers/test_tools.py +++ b/tests/integration/helpers/test_tools.py @@ -39,6 +39,9 @@ class TSV: def __str__(self): return '\n'.join(self.lines) + def __repr__(self): + return self.__str__() + def __len__(self): return len(self.lines) diff --git a/tests/integration/parallel.json b/tests/integration/parallel.json index 2879f258406..6a630bf251f 100644 --- a/tests/integration/parallel.json +++ b/tests/integration/parallel.json @@ -127,60 +127,60 @@ "test_keeper_multinode_simple/test.py::test_simple_replicated_table", "test_keeper_multinode_simple/test.py::test_watch_on_follower", "test_limited_replicated_fetches/test.py::test_limited_fetches", - "test_materialize_mysql_database/test.py::test_clickhouse_killed_while_insert_5_7[atomic]", - "test_materialize_mysql_database/test.py::test_clickhouse_killed_while_insert_5_7[ordinary]", - "test_materialize_mysql_database/test.py::test_clickhouse_killed_while_insert_8_0[atomic]", - "test_materialize_mysql_database/test.py::test_clickhouse_killed_while_insert_8_0[ordinary]", - "test_materialize_mysql_database/test.py::test_insert_with_modify_binlog_checksum_5_7[atomic]", - "test_materialize_mysql_database/test.py::test_insert_with_modify_binlog_checksum_5_7[ordinary]", - "test_materialize_mysql_database/test.py::test_insert_with_modify_binlog_checksum_8_0[atomic]", - "test_materialize_mysql_database/test.py::test_insert_with_modify_binlog_checksum_8_0[ordinary]", - "test_materialize_mysql_database/test.py::test_materialize_database_ddl_with_empty_transaction_5_7[atomic]", - "test_materialize_mysql_database/test.py::test_materialize_database_ddl_with_empty_transaction_5_7[ordinary]", - "test_materialize_mysql_database/test.py::test_materialize_database_ddl_with_empty_transaction_8_0[atomic]", - "test_materialize_mysql_database/test.py::test_materialize_database_ddl_with_empty_transaction_8_0[ordinary]", - "test_materialize_mysql_database/test.py::test_materialize_database_ddl_with_mysql_5_7[atomic]", - "test_materialize_mysql_database/test.py::test_materialize_database_ddl_with_mysql_5_7[ordinary]", - "test_materialize_mysql_database/test.py::test_materialize_database_ddl_with_mysql_8_0[atomic]", - "test_materialize_mysql_database/test.py::test_materialize_database_ddl_with_mysql_8_0[ordinary]", - "test_materialize_mysql_database/test.py::test_materialize_database_dml_with_mysql_5_7[atomic]", - "test_materialize_mysql_database/test.py::test_materialize_database_dml_with_mysql_5_7[ordinary]", - "test_materialize_mysql_database/test.py::test_materialize_database_dml_with_mysql_8_0[atomic]", - "test_materialize_mysql_database/test.py::test_materialize_database_dml_with_mysql_8_0[ordinary]", - "test_materialize_mysql_database/test.py::test_materialize_database_err_sync_user_privs_5_7[atomic]", - "test_materialize_mysql_database/test.py::test_materialize_database_err_sync_user_privs_5_7[ordinary]", - "test_materialize_mysql_database/test.py::test_materialize_database_err_sync_user_privs_8_0[atomic]", - "test_materialize_mysql_database/test.py::test_materialize_database_err_sync_user_privs_8_0[ordinary]", - "test_materialize_mysql_database/test.py::test_multi_table_update[clickhouse_node0]", - "test_materialize_mysql_database/test.py::test_multi_table_update[clickhouse_node1]", - "test_materialize_mysql_database/test.py::test_mysql_killed_while_insert_5_7[atomic]", - "test_materialize_mysql_database/test.py::test_mysql_killed_while_insert_5_7[ordinary]", - "test_materialize_mysql_database/test.py::test_mysql_killed_while_insert_8_0[atomic]", - "test_materialize_mysql_database/test.py::test_mysql_killed_while_insert_8_0[ordinary]", - "test_materialize_mysql_database/test.py::test_mysql_kill_sync_thread_restore_5_7[atomic]", - "test_materialize_mysql_database/test.py::test_mysql_kill_sync_thread_restore_5_7[ordinary]", - "test_materialize_mysql_database/test.py::test_mysql_kill_sync_thread_restore_8_0[atomic]", - "test_materialize_mysql_database/test.py::test_mysql_kill_sync_thread_restore_8_0[ordinary]", - "test_materialize_mysql_database/test.py::test_mysql_settings[clickhouse_node0]", - "test_materialize_mysql_database/test.py::test_mysql_settings[clickhouse_node1]", - "test_materialize_mysql_database/test.py::test_network_partition_5_7[atomic]", - "test_materialize_mysql_database/test.py::test_network_partition_5_7[ordinary]", - "test_materialize_mysql_database/test.py::test_network_partition_8_0[atomic]", - "test_materialize_mysql_database/test.py::test_network_partition_8_0[ordinary]", - "test_materialize_mysql_database/test.py::test_select_without_columns_5_7[atomic]", - "test_materialize_mysql_database/test.py::test_select_without_columns_5_7[ordinary]", - "test_materialize_mysql_database/test.py::test_select_without_columns_8_0[atomic]", - "test_materialize_mysql_database/test.py::test_select_without_columns_8_0[ordinary]", - "test_materialize_mysql_database/test.py::test_system_parts_table[clickhouse_node0]", - "test_materialize_mysql_database/test.py::test_system_parts_table[clickhouse_node1]", - "test_materialize_mysql_database/test.py::test_system_tables_table[clickhouse_node0]", - "test_materialize_mysql_database/test.py::test_system_tables_table[clickhouse_node1]", - "test_materialize_mysql_database/test.py::test_materialize_with_column_comments[clickhouse_node0]", - "test_materialize_mysql_database/test.py::test_materialize_with_column_comments[clickhouse_node1]", - "test_materialize_mysql_database/test.py::test_materialize_with_enum[clickhouse_node0]", - "test_materialize_mysql_database/test.py::test_materialize_with_enum[clickhouse_node1]", - "test_materialize_mysql_database/test.py::test_utf8mb4[clickhouse_node0]", - "test_materialize_mysql_database/test.py::test_utf8mb4[clickhouse_node1]", + "test_materialized_mysql_database/test.py::test_clickhouse_killed_while_insert_5_7[atomic]", + "test_materialized_mysql_database/test.py::test_clickhouse_killed_while_insert_5_7[ordinary]", + "test_materialized_mysql_database/test.py::test_clickhouse_killed_while_insert_8_0[atomic]", + "test_materialized_mysql_database/test.py::test_clickhouse_killed_while_insert_8_0[ordinary]", + "test_materialized_mysql_database/test.py::test_insert_with_modify_binlog_checksum_5_7[atomic]", + "test_materialized_mysql_database/test.py::test_insert_with_modify_binlog_checksum_5_7[ordinary]", + "test_materialized_mysql_database/test.py::test_insert_with_modify_binlog_checksum_8_0[atomic]", + "test_materialized_mysql_database/test.py::test_insert_with_modify_binlog_checksum_8_0[ordinary]", + "test_materialized_mysql_database/test.py::test_materialize_database_ddl_with_empty_transaction_5_7[atomic]", + "test_materialized_mysql_database/test.py::test_materialize_database_ddl_with_empty_transaction_5_7[ordinary]", + "test_materialized_mysql_database/test.py::test_materialize_database_ddl_with_empty_transaction_8_0[atomic]", + "test_materialized_mysql_database/test.py::test_materialize_database_ddl_with_empty_transaction_8_0[ordinary]", + "test_materialized_mysql_database/test.py::test_materialize_database_ddl_with_mysql_5_7[atomic]", + "test_materialized_mysql_database/test.py::test_materialize_database_ddl_with_mysql_5_7[ordinary]", + "test_materialized_mysql_database/test.py::test_materialize_database_ddl_with_mysql_8_0[atomic]", + "test_materialized_mysql_database/test.py::test_materialize_database_ddl_with_mysql_8_0[ordinary]", + "test_materialized_mysql_database/test.py::test_materialize_database_dml_with_mysql_5_7[atomic]", + "test_materialized_mysql_database/test.py::test_materialize_database_dml_with_mysql_5_7[ordinary]", + "test_materialized_mysql_database/test.py::test_materialize_database_dml_with_mysql_8_0[atomic]", + "test_materialized_mysql_database/test.py::test_materialize_database_dml_with_mysql_8_0[ordinary]", + "test_materialized_mysql_database/test.py::test_materialize_database_err_sync_user_privs_5_7[atomic]", + "test_materialized_mysql_database/test.py::test_materialize_database_err_sync_user_privs_5_7[ordinary]", + "test_materialized_mysql_database/test.py::test_materialize_database_err_sync_user_privs_8_0[atomic]", + "test_materialized_mysql_database/test.py::test_materialize_database_err_sync_user_privs_8_0[ordinary]", + "test_materialized_mysql_database/test.py::test_multi_table_update[clickhouse_node0]", + "test_materialized_mysql_database/test.py::test_multi_table_update[clickhouse_node1]", + "test_materialized_mysql_database/test.py::test_mysql_killed_while_insert_5_7[atomic]", + "test_materialized_mysql_database/test.py::test_mysql_killed_while_insert_5_7[ordinary]", + "test_materialized_mysql_database/test.py::test_mysql_killed_while_insert_8_0[atomic]", + "test_materialized_mysql_database/test.py::test_mysql_killed_while_insert_8_0[ordinary]", + "test_materialized_mysql_database/test.py::test_mysql_kill_sync_thread_restore_5_7[atomic]", + "test_materialized_mysql_database/test.py::test_mysql_kill_sync_thread_restore_5_7[ordinary]", + "test_materialized_mysql_database/test.py::test_mysql_kill_sync_thread_restore_8_0[atomic]", + "test_materialized_mysql_database/test.py::test_mysql_kill_sync_thread_restore_8_0[ordinary]", + "test_materialized_mysql_database/test.py::test_mysql_settings[clickhouse_node0]", + "test_materialized_mysql_database/test.py::test_mysql_settings[clickhouse_node1]", + "test_materialized_mysql_database/test.py::test_network_partition_5_7[atomic]", + "test_materialized_mysql_database/test.py::test_network_partition_5_7[ordinary]", + "test_materialized_mysql_database/test.py::test_network_partition_8_0[atomic]", + "test_materialized_mysql_database/test.py::test_network_partition_8_0[ordinary]", + "test_materialized_mysql_database/test.py::test_select_without_columns_5_7[atomic]", + "test_materialized_mysql_database/test.py::test_select_without_columns_5_7[ordinary]", + "test_materialized_mysql_database/test.py::test_select_without_columns_8_0[atomic]", + "test_materialized_mysql_database/test.py::test_select_without_columns_8_0[ordinary]", + "test_materialized_mysql_database/test.py::test_system_parts_table[clickhouse_node0]", + "test_materialized_mysql_database/test.py::test_system_parts_table[clickhouse_node1]", + "test_materialized_mysql_database/test.py::test_system_tables_table[clickhouse_node0]", + "test_materialized_mysql_database/test.py::test_system_tables_table[clickhouse_node1]", + "test_materialized_mysql_database/test.py::test_materialize_with_column_comments[clickhouse_node0]", + "test_materialized_mysql_database/test.py::test_materialize_with_column_comments[clickhouse_node1]", + "test_materialized_mysql_database/test.py::test_materialize_with_enum[clickhouse_node0]", + "test_materialized_mysql_database/test.py::test_materialize_with_enum[clickhouse_node1]", + "test_materialized_mysql_database/test.py::test_utf8mb4[clickhouse_node0]", + "test_materialized_mysql_database/test.py::test_utf8mb4[clickhouse_node1]", "test_parts_delete_zookeeper/test.py::test_merge_doesnt_work_without_zookeeper", "test_polymorphic_parts/test.py::test_compact_parts_only", "test_polymorphic_parts/test.py::test_different_part_types_on_replicas[polymorphic_table_compact-Compact]", diff --git a/tests/integration/parallel.readme b/tests/integration/parallel.readme index ac4f897482c..5533ab8b84d 100644 --- a/tests/integration/parallel.readme +++ b/tests/integration/parallel.readme @@ -3,4 +3,4 @@ # 1. Generate all tests list as in CI run ./runner ' --setup-plan' | grep '::' | sed 's/ (fixtures used:.*//g' | sed 's/^ *//g' | sed 's/ *$//g' | sort -u > all_tests.txt # 2. Filter known tests that are currently not run in parallel -cat all_tests.txt | grep '^test_replicated_database\|^test_disabled_mysql_server\|^test_distributed_ddl\|^test_distributed_ddl\|^test_quorum_inserts_parallel\|^test_ddl_worker_non_leader\|^test_consistent_parts_after_clone_replica\|^test_materialize_mysql_database\|^test_atomic_drop_table\|^test_distributed_respect_user_timeouts\|^test_storage_kafka\|^test_replace_partition\|^test_replicated_fetches_timeouts\|^test_system_clusters_actual_information\|^test_delayed_replica_failover\|^test_limited_replicated_fetches\|^test_hedged_requests\|^test_insert_into_distributed\|^test_insert_into_distributed_through_materialized_view\|^test_drop_replica\|^test_attach_without_fetching\|^test_system_replicated_fetches\|^test_cross_replication\|^test_dictionary_allow_read_expired_keys\|^test_dictionary_allow_read_expired_keys\|^test_dictionary_allow_read_expired_keys\|^test_insert_into_distributed_sync_async\|^test_hedged_requests_parallel\|^test_dictionaries_update_field\|^test_broken_part_during_merge\|^test_random_inserts\|^test_reload_clusters_config\|^test_parts_delete_zookeeper\|^test_polymorphic_parts\|^test_keeper_multinode_simple\|^test_https_replication\|^test_storage_kerberized_kafka\|^test_cleanup_dir_after_bad_zk_conn\|^test_system_metrics\|^test_keeper_multinode_blocade_leader' | awk '{$1=$1;print}' | jq -R -n '[inputs] | .' > parallel_skip.json +cat all_tests.txt | grep '^test_replicated_database\|^test_disabled_mysql_server\|^test_distributed_ddl\|^test_distributed_ddl\|^test_quorum_inserts_parallel\|^test_ddl_worker_non_leader\|^test_consistent_parts_after_clone_replica\|^test_materialized_mysql_database\|^test_atomic_drop_table\|^test_distributed_respect_user_timeouts\|^test_storage_kafka\|^test_replace_partition\|^test_replicated_fetches_timeouts\|^test_system_clusters_actual_information\|^test_delayed_replica_failover\|^test_limited_replicated_fetches\|^test_hedged_requests\|^test_insert_into_distributed\|^test_insert_into_distributed_through_materialized_view\|^test_drop_replica\|^test_attach_without_fetching\|^test_system_replicated_fetches\|^test_cross_replication\|^test_dictionary_allow_read_expired_keys\|^test_dictionary_allow_read_expired_keys\|^test_dictionary_allow_read_expired_keys\|^test_insert_into_distributed_sync_async\|^test_hedged_requests_parallel\|^test_dictionaries_update_field\|^test_broken_part_during_merge\|^test_random_inserts\|^test_reload_clusters_config\|^test_parts_delete_zookeeper\|^test_polymorphic_parts\|^test_keeper_multinode_simple\|^test_https_replication\|^test_storage_kerberized_kafka\|^test_cleanup_dir_after_bad_zk_conn\|^test_system_metrics\|^test_keeper_multinode_blocade_leader' | awk '{$1=$1;print}' | jq -R -n '[inputs] | .' > parallel_skip.json diff --git a/tests/integration/parallel_skip.json b/tests/integration/parallel_skip.json index 2c993691d78..b4f368abb8e 100644 --- a/tests/integration/parallel_skip.json +++ b/tests/integration/parallel_skip.json @@ -131,60 +131,60 @@ "test_keeper_multinode_simple/test.py::test_simple_replicated_table", "test_keeper_multinode_simple/test.py::test_watch_on_follower", "test_limited_replicated_fetches/test.py::test_limited_fetches", - "test_materialize_mysql_database/test.py::test_clickhouse_killed_while_insert_5_7[atomic]", - "test_materialize_mysql_database/test.py::test_clickhouse_killed_while_insert_5_7[ordinary]", - "test_materialize_mysql_database/test.py::test_clickhouse_killed_while_insert_8_0[atomic]", - "test_materialize_mysql_database/test.py::test_clickhouse_killed_while_insert_8_0[ordinary]", - "test_materialize_mysql_database/test.py::test_insert_with_modify_binlog_checksum_5_7[atomic]", - "test_materialize_mysql_database/test.py::test_insert_with_modify_binlog_checksum_5_7[ordinary]", - "test_materialize_mysql_database/test.py::test_insert_with_modify_binlog_checksum_8_0[atomic]", - "test_materialize_mysql_database/test.py::test_insert_with_modify_binlog_checksum_8_0[ordinary]", - "test_materialize_mysql_database/test.py::test_materialize_database_ddl_with_empty_transaction_5_7[atomic]", - "test_materialize_mysql_database/test.py::test_materialize_database_ddl_with_empty_transaction_5_7[ordinary]", - "test_materialize_mysql_database/test.py::test_materialize_database_ddl_with_empty_transaction_8_0[atomic]", - "test_materialize_mysql_database/test.py::test_materialize_database_ddl_with_empty_transaction_8_0[ordinary]", - "test_materialize_mysql_database/test.py::test_materialize_database_ddl_with_mysql_5_7[atomic]", - "test_materialize_mysql_database/test.py::test_materialize_database_ddl_with_mysql_5_7[ordinary]", - "test_materialize_mysql_database/test.py::test_materialize_database_ddl_with_mysql_8_0[atomic]", - "test_materialize_mysql_database/test.py::test_materialize_database_ddl_with_mysql_8_0[ordinary]", - "test_materialize_mysql_database/test.py::test_materialize_database_dml_with_mysql_5_7[atomic]", - "test_materialize_mysql_database/test.py::test_materialize_database_dml_with_mysql_5_7[ordinary]", - "test_materialize_mysql_database/test.py::test_materialize_database_dml_with_mysql_8_0[atomic]", - "test_materialize_mysql_database/test.py::test_materialize_database_dml_with_mysql_8_0[ordinary]", - "test_materialize_mysql_database/test.py::test_materialize_database_err_sync_user_privs_5_7[atomic]", - "test_materialize_mysql_database/test.py::test_materialize_database_err_sync_user_privs_5_7[ordinary]", - "test_materialize_mysql_database/test.py::test_materialize_database_err_sync_user_privs_8_0[atomic]", - "test_materialize_mysql_database/test.py::test_materialize_database_err_sync_user_privs_8_0[ordinary]", - "test_materialize_mysql_database/test.py::test_multi_table_update[clickhouse_node0]", - "test_materialize_mysql_database/test.py::test_multi_table_update[clickhouse_node1]", - "test_materialize_mysql_database/test.py::test_mysql_killed_while_insert_5_7[atomic]", - "test_materialize_mysql_database/test.py::test_mysql_killed_while_insert_5_7[ordinary]", - "test_materialize_mysql_database/test.py::test_mysql_killed_while_insert_8_0[atomic]", - "test_materialize_mysql_database/test.py::test_mysql_killed_while_insert_8_0[ordinary]", - "test_materialize_mysql_database/test.py::test_mysql_kill_sync_thread_restore_5_7[atomic]", - "test_materialize_mysql_database/test.py::test_mysql_kill_sync_thread_restore_5_7[ordinary]", - "test_materialize_mysql_database/test.py::test_mysql_kill_sync_thread_restore_8_0[atomic]", - "test_materialize_mysql_database/test.py::test_mysql_kill_sync_thread_restore_8_0[ordinary]", - "test_materialize_mysql_database/test.py::test_mysql_settings[clickhouse_node0]", - "test_materialize_mysql_database/test.py::test_mysql_settings[clickhouse_node1]", - "test_materialize_mysql_database/test.py::test_network_partition_5_7[atomic]", - "test_materialize_mysql_database/test.py::test_network_partition_5_7[ordinary]", - "test_materialize_mysql_database/test.py::test_network_partition_8_0[atomic]", - "test_materialize_mysql_database/test.py::test_network_partition_8_0[ordinary]", - "test_materialize_mysql_database/test.py::test_select_without_columns_5_7[atomic]", - "test_materialize_mysql_database/test.py::test_select_without_columns_5_7[ordinary]", - "test_materialize_mysql_database/test.py::test_select_without_columns_8_0[atomic]", - "test_materialize_mysql_database/test.py::test_select_without_columns_8_0[ordinary]", - "test_materialize_mysql_database/test.py::test_system_parts_table[clickhouse_node0]", - "test_materialize_mysql_database/test.py::test_system_parts_table[clickhouse_node1]", - "test_materialize_mysql_database/test.py::test_system_tables_table[clickhouse_node0]", - "test_materialize_mysql_database/test.py::test_system_tables_table[clickhouse_node1]", - "test_materialize_mysql_database/test.py::test_materialize_with_column_comments[clickhouse_node0]", - "test_materialize_mysql_database/test.py::test_materialize_with_column_comments[clickhouse_node1]", - "test_materialize_mysql_database/test.py::test_materialize_with_enum[clickhouse_node0]", - "test_materialize_mysql_database/test.py::test_materialize_with_enum[clickhouse_node1]", - "test_materialize_mysql_database/test.py::test_utf8mb4[clickhouse_node0]", - "test_materialize_mysql_database/test.py::test_utf8mb4[clickhouse_node1]", + "test_materialized_mysql_database/test.py::test_clickhouse_killed_while_insert_5_7[atomic]", + "test_materialized_mysql_database/test.py::test_clickhouse_killed_while_insert_5_7[ordinary]", + "test_materialized_mysql_database/test.py::test_clickhouse_killed_while_insert_8_0[atomic]", + "test_materialized_mysql_database/test.py::test_clickhouse_killed_while_insert_8_0[ordinary]", + "test_materialized_mysql_database/test.py::test_insert_with_modify_binlog_checksum_5_7[atomic]", + "test_materialized_mysql_database/test.py::test_insert_with_modify_binlog_checksum_5_7[ordinary]", + "test_materialized_mysql_database/test.py::test_insert_with_modify_binlog_checksum_8_0[atomic]", + "test_materialized_mysql_database/test.py::test_insert_with_modify_binlog_checksum_8_0[ordinary]", + "test_materialized_mysql_database/test.py::test_materialize_database_ddl_with_empty_transaction_5_7[atomic]", + "test_materialized_mysql_database/test.py::test_materialize_database_ddl_with_empty_transaction_5_7[ordinary]", + "test_materialized_mysql_database/test.py::test_materialize_database_ddl_with_empty_transaction_8_0[atomic]", + "test_materialized_mysql_database/test.py::test_materialize_database_ddl_with_empty_transaction_8_0[ordinary]", + "test_materialized_mysql_database/test.py::test_materialize_database_ddl_with_mysql_5_7[atomic]", + "test_materialized_mysql_database/test.py::test_materialize_database_ddl_with_mysql_5_7[ordinary]", + "test_materialized_mysql_database/test.py::test_materialize_database_ddl_with_mysql_8_0[atomic]", + "test_materialized_mysql_database/test.py::test_materialize_database_ddl_with_mysql_8_0[ordinary]", + "test_materialized_mysql_database/test.py::test_materialize_database_dml_with_mysql_5_7[atomic]", + "test_materialized_mysql_database/test.py::test_materialize_database_dml_with_mysql_5_7[ordinary]", + "test_materialized_mysql_database/test.py::test_materialize_database_dml_with_mysql_8_0[atomic]", + "test_materialized_mysql_database/test.py::test_materialize_database_dml_with_mysql_8_0[ordinary]", + "test_materialized_mysql_database/test.py::test_materialize_database_err_sync_user_privs_5_7[atomic]", + "test_materialized_mysql_database/test.py::test_materialize_database_err_sync_user_privs_5_7[ordinary]", + "test_materialized_mysql_database/test.py::test_materialize_database_err_sync_user_privs_8_0[atomic]", + "test_materialized_mysql_database/test.py::test_materialize_database_err_sync_user_privs_8_0[ordinary]", + "test_materialized_mysql_database/test.py::test_multi_table_update[clickhouse_node0]", + "test_materialized_mysql_database/test.py::test_multi_table_update[clickhouse_node1]", + "test_materialized_mysql_database/test.py::test_mysql_killed_while_insert_5_7[atomic]", + "test_materialized_mysql_database/test.py::test_mysql_killed_while_insert_5_7[ordinary]", + "test_materialized_mysql_database/test.py::test_mysql_killed_while_insert_8_0[atomic]", + "test_materialized_mysql_database/test.py::test_mysql_killed_while_insert_8_0[ordinary]", + "test_materialized_mysql_database/test.py::test_mysql_kill_sync_thread_restore_5_7[atomic]", + "test_materialized_mysql_database/test.py::test_mysql_kill_sync_thread_restore_5_7[ordinary]", + "test_materialized_mysql_database/test.py::test_mysql_kill_sync_thread_restore_8_0[atomic]", + "test_materialized_mysql_database/test.py::test_mysql_kill_sync_thread_restore_8_0[ordinary]", + "test_materialized_mysql_database/test.py::test_mysql_settings[clickhouse_node0]", + "test_materialized_mysql_database/test.py::test_mysql_settings[clickhouse_node1]", + "test_materialized_mysql_database/test.py::test_network_partition_5_7[atomic]", + "test_materialized_mysql_database/test.py::test_network_partition_5_7[ordinary]", + "test_materialized_mysql_database/test.py::test_network_partition_8_0[atomic]", + "test_materialized_mysql_database/test.py::test_network_partition_8_0[ordinary]", + "test_materialized_mysql_database/test.py::test_select_without_columns_5_7[atomic]", + "test_materialized_mysql_database/test.py::test_select_without_columns_5_7[ordinary]", + "test_materialized_mysql_database/test.py::test_select_without_columns_8_0[atomic]", + "test_materialized_mysql_database/test.py::test_select_without_columns_8_0[ordinary]", + "test_materialized_mysql_database/test.py::test_system_parts_table[clickhouse_node0]", + "test_materialized_mysql_database/test.py::test_system_parts_table[clickhouse_node1]", + "test_materialized_mysql_database/test.py::test_system_tables_table[clickhouse_node0]", + "test_materialized_mysql_database/test.py::test_system_tables_table[clickhouse_node1]", + "test_materialized_mysql_database/test.py::test_materialize_with_column_comments[clickhouse_node0]", + "test_materialized_mysql_database/test.py::test_materialize_with_column_comments[clickhouse_node1]", + "test_materialized_mysql_database/test.py::test_materialize_with_enum[clickhouse_node0]", + "test_materialized_mysql_database/test.py::test_materialize_with_enum[clickhouse_node1]", + "test_materialized_mysql_database/test.py::test_utf8mb4[clickhouse_node0]", + "test_materialized_mysql_database/test.py::test_utf8mb4[clickhouse_node1]", "test_parts_delete_zookeeper/test.py::test_merge_doesnt_work_without_zookeeper", "test_polymorphic_parts/test.py::test_compact_parts_only", "test_polymorphic_parts/test.py::test_different_part_types_on_replicas[polymorphic_table_compact-Compact]", diff --git a/tests/integration/pytest.ini b/tests/integration/pytest.ini index 6d451adf7eb..4593fc8c4d8 100644 --- a/tests/integration/pytest.ini +++ b/tests/integration/pytest.ini @@ -4,10 +4,14 @@ norecursedirs = _instances* timeout = 1800 junit_duration_report = call junit_suite_name = integration -log_cli = 1 +log_level = DEBUG +log_format = %(asctime)s [ %(process)d ] %(levelname)s : %(message)s (%(filename)s:%(lineno)s, %(funcName)s) +log_date_format=%Y-%m-%d %H:%M:%S +log_cli = true log_cli_level = CRITICAL -log_cli_format = %%(asctime)s [%(levelname)8s] %(funcName)s %(message)s (%(filename)s:%(lineno)s) +log_cli_format = %(asctime)s [ %(process)d ] %(levelname)s : %(message)s (%(filename)s:%(lineno)s, %(funcName)s) +log_cli_date_format=%Y-%m-%d %H:%M:%S log_file = pytest.log log_file_level = DEBUG -log_file_format = %(asctime)s [%(levelname)8s] %(funcName)s %(message)s (%(filename)s:%(lineno)s) -log_file_date_format=%Y-%m-%d %H:%M:%S +log_file_format = %(asctime)s [ %(process)d ] %(levelname)s : %(message)s (%(filename)s:%(lineno)s, %(funcName)s) +log_file_date_format = %Y-%m-%d %H:%M:%S diff --git a/tests/integration/runner b/tests/integration/runner index 160c4a23652..2143d7ebf29 100755 --- a/tests/integration/runner +++ b/tests/integration/runner @@ -3,6 +3,7 @@ import subprocess import os import getpass +import glob import argparse import logging import signal @@ -99,7 +100,7 @@ signal.signal(signal.SIGINT, docker_kill_handler_handler) # 2) path of runner script is used to determine paths for trivial case, when we run it from repository if __name__ == "__main__": - logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s') + logging.basicConfig(level=logging.INFO, format='%(asctime)s [ %(process)d ] %(levelname)s : %(message)s (%(filename)s:%(lineno)s, %(funcName)s)') parser = argparse.ArgumentParser(description="ClickHouse integration tests runner") parser.add_argument( @@ -176,6 +177,12 @@ if __name__ == "__main__": dest="tests_list", help="List of tests to run") + parser.add_argument( + "-k", "--keyword_expression", + action="store", + dest="keyword_expression", + help="pytest keyword expression") + parser.add_argument( "--tmpfs", action='store_true', @@ -257,6 +264,12 @@ if __name__ == "__main__": if sys.stdout.isatty() and sys.stdin.isatty(): tty = "-it" + # Remove old logs. + for old_log_path in glob.glob(args.cases_dir + "/pytest*.log"): + os.remove(old_log_path) + + if args.keyword_expression: + args.pytest_args += ['-k', args.keyword_expression] cmd = "docker run {net} {tty} --rm --name {name} --privileged \ --volume={odbc_bridge_bin}:/clickhouse-odbc-bridge --volume={bin}:/clickhouse \ @@ -264,7 +277,7 @@ if __name__ == "__main__": --volume={base_cfg}:/clickhouse-config --volume={cases_dir}:/ClickHouse/tests/integration \ --volume={src_dir}/Server/grpc_protos:/ClickHouse/src/Server/grpc_protos \ {dockerd_internal_volume} -e DOCKER_CLIENT_TIMEOUT=300 -e COMPOSE_HTTP_TIMEOUT=600 \ - {env_tags} {env_cleanup} -e PYTEST_OPTS='{parallel} {opts} {tests_list}' {img} {command}".format( + {env_tags} {env_cleanup} -e PYTEST_OPTS='{parallel} {opts} {tests_list} -vvv' {img} {command}".format( net=net, tty=tty, bin=args.binary, @@ -276,7 +289,7 @@ if __name__ == "__main__": env_tags=env_tags, env_cleanup=env_cleanup, parallel=parallel_args, - opts=' '.join(args.pytest_args), + opts=' '.join(args.pytest_args).replace('\'', '\\\''), tests_list=' '.join(args.tests_list), dockerd_internal_volume=dockerd_internal_volume, img=DIND_INTEGRATION_TESTS_IMAGE_NAME + ":" + args.docker_image_version, diff --git a/tests/queries/0_stateless/00925_zookeeper_empty_replicated_merge_tree_optimize_final.reference b/tests/integration/test_alter_update_cast_keep_nullable/__init__.py similarity index 100% rename from tests/queries/0_stateless/00925_zookeeper_empty_replicated_merge_tree_optimize_final.reference rename to tests/integration/test_alter_update_cast_keep_nullable/__init__.py diff --git a/tests/integration/test_alter_update_cast_keep_nullable/configs/users.xml b/tests/integration/test_alter_update_cast_keep_nullable/configs/users.xml new file mode 100644 index 00000000000..aa2f240b831 --- /dev/null +++ b/tests/integration/test_alter_update_cast_keep_nullable/configs/users.xml @@ -0,0 +1,8 @@ + + + + + 1 + + + diff --git a/tests/integration/test_alter_update_cast_keep_nullable/test.py b/tests/integration/test_alter_update_cast_keep_nullable/test.py new file mode 100644 index 00000000000..497a9e21d94 --- /dev/null +++ b/tests/integration/test_alter_update_cast_keep_nullable/test.py @@ -0,0 +1,36 @@ +import pytest +from helpers.cluster import ClickHouseCluster + +cluster = ClickHouseCluster(__file__) + +node1 = cluster.add_instance('node1', user_configs=['configs/users.xml'], with_zookeeper=True) + +@pytest.fixture(scope="module") +def started_cluster(): + try: + cluster.start() + yield cluster + finally: + cluster.shutdown() + +def test_cast_keep_nullable(started_cluster): + setting = node1.query("SELECT value FROM system.settings WHERE name='cast_keep_nullable'") + assert(setting.strip() == "1") + + result = node1.query(""" + DROP TABLE IF EXISTS t; + CREATE TABLE t (x UInt64) ENGINE = MergeTree ORDER BY tuple(); + INSERT INTO t SELECT number FROM numbers(10); + SELECT * FROM t; + """) + assert(result.strip() == "0\n1\n2\n3\n4\n5\n6\n7\n8\n9") + + error = node1.query_and_get_error(""" + SET mutations_sync = 1; + ALTER TABLE t UPDATE x = x % 3 = 0 ? NULL : x WHERE x % 2 = 1;  + """) + assert("DB::Exception: Cannot convert NULL value to non-Nullable type" in error) + + result = node1.query("SELECT * FROM t;") + assert(result.strip() == "0\n1\n2\n3\n4\n5\n6\n7\n8\n9") + diff --git a/tests/queries/0_stateless/00988_constraints_replication_zookeeper.reference b/tests/integration/test_async_drain_connection/__init__.py similarity index 100% rename from tests/queries/0_stateless/00988_constraints_replication_zookeeper.reference rename to tests/integration/test_async_drain_connection/__init__.py diff --git a/tests/integration/test_async_drain_connection/configs/config.xml b/tests/integration/test_async_drain_connection/configs/config.xml new file mode 100644 index 00000000000..0c42ac84d31 --- /dev/null +++ b/tests/integration/test_async_drain_connection/configs/config.xml @@ -0,0 +1,4 @@ + + + 10000 + diff --git a/tests/integration/test_async_drain_connection/test.py b/tests/integration/test_async_drain_connection/test.py new file mode 100644 index 00000000000..21f9b142e7a --- /dev/null +++ b/tests/integration/test_async_drain_connection/test.py @@ -0,0 +1,36 @@ +import os +import sys +import time +from multiprocessing.dummy import Pool +import pytest +from helpers.cluster import ClickHouseCluster + +cluster = ClickHouseCluster(__file__) +node = cluster.add_instance("node", main_configs=["configs/config.xml"]) + + +@pytest.fixture(scope="module") +def started_cluster(): + try: + cluster.start() + node.query( + 'create table t (number UInt64) engine = Distributed(test_cluster_two_shards, system, numbers);' + ) + yield cluster + + finally: + cluster.shutdown() + + +def test_filled_async_drain_connection_pool(started_cluster): + busy_pool = Pool(10) + + def execute_query(i): + for _ in range(100): + node.query('select * from t where number = 0 limit 2;', + settings={ + "sleep_in_receive_cancel_ms": 10000000, + "max_execution_time": 5 + }) + + p = busy_pool.map(execute_query, range(10)) diff --git a/tests/integration/test_backward_compatibility/test_cte_distributed.py b/tests/integration/test_backward_compatibility/test_cte_distributed.py new file mode 100644 index 00000000000..3aec527524b --- /dev/null +++ b/tests/integration/test_backward_compatibility/test_cte_distributed.py @@ -0,0 +1,54 @@ +import pytest + +from helpers.cluster import ClickHouseCluster + +cluster = ClickHouseCluster(__file__, name="cte_distributed") +node1 = cluster.add_instance('node1', with_zookeeper=False) +node2 = cluster.add_instance('node2', + with_zookeeper=False, image='yandex/clickhouse-server', tag='21.7.3.14', stay_alive=True, + with_installed_binary=True) + + +@pytest.fixture(scope="module") +def start_cluster(): + try: + cluster.start() + yield cluster + + finally: + cluster.shutdown() + + + +def test_cte_distributed(start_cluster): + node2.query(""" +WITH + quantile(0.05)(cnt) as p05, + quantile(0.95)(cnt) as p95, + p95 - p05 as inter_percentile_range +SELECT + sum(cnt) as total_requests, + count() as data_points, + inter_percentile_range +FROM ( + SELECT + count() as cnt + FROM remote('node{1,2}', numbers(10)) + GROUP BY number +)""") + + node1.query(""" +WITH + quantile(0.05)(cnt) as p05, + quantile(0.95)(cnt) as p95, + p95 - p05 as inter_percentile_range +SELECT + sum(cnt) as total_requests, + count() as data_points, + inter_percentile_range +FROM ( + SELECT + count() as cnt + FROM remote('node{1,2}', numbers(10)) + GROUP BY number +)""") diff --git a/tests/integration/test_backward_compatibility/test_data_skipping_indices.py b/tests/integration/test_backward_compatibility/test_data_skipping_indices.py new file mode 100644 index 00000000000..45b85897798 --- /dev/null +++ b/tests/integration/test_backward_compatibility/test_data_skipping_indices.py @@ -0,0 +1,44 @@ +# pylint: disable=line-too-long +# pylint: disable=unused-argument +# pylint: disable=redefined-outer-name + +import pytest +from helpers.cluster import ClickHouseCluster + +cluster = ClickHouseCluster(__file__) +node = cluster.add_instance('node', image='yandex/clickhouse-server', tag='21.6', stay_alive=True, with_installed_binary=True) + + +@pytest.fixture(scope="module") +def start_cluster(): + try: + cluster.start() + yield cluster + + finally: + cluster.shutdown() + + +# TODO: cover other types too, but for this we need to add something like +# restart_with_tagged_version(), since right now it is not possible to +# switch to old tagged clickhouse version. +def test_index(start_cluster): + node.query(""" + CREATE TABLE data + ( + key Int, + value Nullable(Int), + INDEX value_index value TYPE minmax GRANULARITY 1 + ) + ENGINE = MergeTree + ORDER BY key; + + INSERT INTO data SELECT number, number FROM numbers(10000); + + SELECT * FROM data WHERE value = 20000 SETTINGS force_data_skipping_indices = 'value_index' SETTINGS force_data_skipping_indices = 'value_index', max_rows_to_read=1; + """) + node.restart_with_latest_version() + node.query(""" + SELECT * FROM data WHERE value = 20000 SETTINGS force_data_skipping_indices = 'value_index' SETTINGS force_data_skipping_indices = 'value_index', max_rows_to_read=1; + DROP TABLE data; + """) diff --git a/tests/integration/test_backward_compatibility/test_detach_part_wrong_partition_id.py b/tests/integration/test_backward_compatibility/test_detach_part_wrong_partition_id.py index a4f976cc62d..7c20b3c2476 100644 --- a/tests/integration/test_backward_compatibility/test_detach_part_wrong_partition_id.py +++ b/tests/integration/test_backward_compatibility/test_detach_part_wrong_partition_id.py @@ -2,7 +2,7 @@ import pytest from helpers.cluster import ClickHouseCluster -cluster = ClickHouseCluster(__file__) +cluster = ClickHouseCluster(__file__, name="detach") # Version 21.6.3.14 has incompatible partition id for tables with UUID in partition key. node_21_6 = cluster.add_instance('node_21_6', image='yandex/clickhouse-server', tag='21.6.3.14', stay_alive=True, with_installed_binary=True) diff --git a/tests/integration/test_backward_compatibility/test_select_aggregate_alias_column.py b/tests/integration/test_backward_compatibility/test_select_aggregate_alias_column.py new file mode 100644 index 00000000000..b3f5c68cf68 --- /dev/null +++ b/tests/integration/test_backward_compatibility/test_select_aggregate_alias_column.py @@ -0,0 +1,29 @@ +import pytest + +from helpers.cluster import ClickHouseCluster + +cluster = ClickHouseCluster(__file__, name="aggregate_alias_column") +node1 = cluster.add_instance('node1', with_zookeeper=False) +node2 = cluster.add_instance('node2', + with_zookeeper=False, image='yandex/clickhouse-server', tag='21.7.2.7', stay_alive=True, + with_installed_binary=True) + + +@pytest.fixture(scope="module") +def start_cluster(): + try: + cluster.start() + yield cluster + + finally: + cluster.shutdown() + + +def test_select_aggregate_alias_column(start_cluster): + node1.query("create table tab (x UInt64, x_alias UInt64 ALIAS x) engine = Memory") + node2.query("create table tab (x UInt64, x_alias UInt64 ALIAS x) engine = Memory") + node1.query('insert into tab values (1)') + node2.query('insert into tab values (1)') + + node1.query("select sum(x_alias) from remote('node{1,2}', default, tab)") + node2.query("select sum(x_alias) from remote('node{1,2}', default, tab)") diff --git a/tests/integration/test_cluster_copier/test.py b/tests/integration/test_cluster_copier/test.py index 7fe1d8c9d29..3d28295d40e 100644 --- a/tests/integration/test_cluster_copier/test.py +++ b/tests/integration/test_cluster_copier/test.py @@ -89,9 +89,9 @@ class Task1: instance = cluster.instances['s0_0_0'] for cluster_num in ["0", "1"]: - ddl_check_query(instance, "DROP DATABASE IF EXISTS default ON CLUSTER cluster{}".format(cluster_num)) + ddl_check_query(instance, "DROP DATABASE IF EXISTS default ON CLUSTER cluster{} SYNC".format(cluster_num)) ddl_check_query(instance, - "CREATE DATABASE IF NOT EXISTS default ON CLUSTER cluster{}".format( + "CREATE DATABASE default ON CLUSTER cluster{} ".format( cluster_num)) ddl_check_query(instance, "CREATE TABLE hits ON CLUSTER cluster0 (d UInt64, d1 UInt64 MATERIALIZED d+1) " + @@ -105,11 +105,11 @@ class Task1: settings={"insert_distributed_sync": 1}) def check(self): - assert TSV(self.cluster.instances['s0_0_0'].query("SELECT count() FROM hits_all")) == TSV("1002\n") - assert TSV(self.cluster.instances['s1_0_0'].query("SELECT count() FROM hits_all")) == TSV("1002\n") + assert self.cluster.instances['s0_0_0'].query("SELECT count() FROM hits_all").strip() == "1002" + assert self.cluster.instances['s1_0_0'].query("SELECT count() FROM hits_all").strip() == "1002" - assert TSV(self.cluster.instances['s1_0_0'].query("SELECT DISTINCT d % 2 FROM hits")) == TSV("1\n") - assert TSV(self.cluster.instances['s1_1_0'].query("SELECT DISTINCT d % 2 FROM hits")) == TSV("0\n") + assert self.cluster.instances['s1_0_0'].query("SELECT DISTINCT d % 2 FROM hits").strip() == "1" + assert self.cluster.instances['s1_1_0'].query("SELECT DISTINCT d % 2 FROM hits").strip() == "0" instance = self.cluster.instances['s0_0_0'] ddl_check_query(instance, "DROP TABLE hits_all ON CLUSTER cluster0") diff --git a/tests/integration/test_cluster_copier/test_two_nodes.py b/tests/integration/test_cluster_copier/test_two_nodes.py index 817c3571833..255af13213a 100644 --- a/tests/integration/test_cluster_copier/test_two_nodes.py +++ b/tests/integration/test_cluster_copier/test_two_nodes.py @@ -473,17 +473,17 @@ def execute_task(started_cluster, task, cmd_options): # Tests -@pytest.mark.timeout(600) +@pytest.mark.skip(reason="Too flaky :(") def test_different_schema(started_cluster): execute_task(started_cluster, TaskWithDifferentSchema(started_cluster), []) -@pytest.mark.timeout(600) +@pytest.mark.skip(reason="Too flaky :(") def test_ttl_columns(started_cluster): execute_task(started_cluster, TaskTTL(started_cluster), []) -@pytest.mark.timeout(600) +@pytest.mark.skip(reason="Too flaky :(") def test_skip_index(started_cluster): execute_task(started_cluster, TaskSkipIndex(started_cluster), []) diff --git a/tests/integration/test_config_corresponding_root/configs/config.xml b/tests/integration/test_config_corresponding_root/configs/config.xml index 4e130afa84d..a518bd88b2e 100644 --- a/tests/integration/test_config_corresponding_root/configs/config.xml +++ b/tests/integration/test_config_corresponding_root/configs/config.xml @@ -304,14 +304,13 @@ system part_log
+ toYYYYMM(event_date) 7500
- --> - - + @@ -838,13 +838,13 @@ system part_log
+ toYYYYMM(event_date) 7500
- --> + none + + + diff --git a/tests/integration/test_storage_mongodb/test.py b/tests/integration/test_storage_mongodb/test.py index 75af909faec..415f1c1cb33 100644 --- a/tests/integration/test_storage_mongodb/test.py +++ b/tests/integration/test_storage_mongodb/test.py @@ -5,24 +5,29 @@ from helpers.client import QueryRuntimeException from helpers.cluster import ClickHouseCluster -cluster = ClickHouseCluster(__file__) -node = cluster.add_instance('node', with_mongo=True) - @pytest.fixture(scope="module") -def started_cluster(): +def started_cluster(request): try: + cluster = ClickHouseCluster(__file__) + node = cluster.add_instance('node', + main_configs=["configs_secure/config.d/ssl_conf.xml"], + with_mongo=True, + with_mongo_secure=request.param) cluster.start() yield cluster finally: cluster.shutdown() -def get_mongo_connection(started_cluster): +def get_mongo_connection(started_cluster, secure=False): connection_str = 'mongodb://root:clickhouse@localhost:{}'.format(started_cluster.mongo_port) + if secure: + connection_str += '/?tls=true&tlsAllowInvalidCertificates=true' return pymongo.MongoClient(connection_str) +@pytest.mark.parametrize('started_cluster', [False], indirect=['started_cluster']) def test_simple_select(started_cluster): mongo_connection = get_mongo_connection(started_cluster) db = mongo_connection['test'] @@ -33,6 +38,7 @@ def test_simple_select(started_cluster): data.append({'key': i, 'data': hex(i * i)}) simple_mongo_table.insert_many(data) + node = started_cluster.instances['node'] node.query( "CREATE TABLE simple_mongo_table(key UInt64, data String) ENGINE = MongoDB('mongo1:27017', 'test', 'simple_table', 'root', 'clickhouse')") @@ -42,6 +48,7 @@ def test_simple_select(started_cluster): assert node.query("SELECT data from simple_mongo_table where key = 42") == hex(42 * 42) + '\n' +@pytest.mark.parametrize('started_cluster', [False], indirect=['started_cluster']) def test_complex_data_type(started_cluster): mongo_connection = get_mongo_connection(started_cluster) db = mongo_connection['test'] @@ -52,6 +59,7 @@ def test_complex_data_type(started_cluster): data.append({'key': i, 'data': hex(i * i), 'dict': {'a': i, 'b': str(i)}}) incomplete_mongo_table.insert_many(data) + node = started_cluster.instances['node'] node.query( "CREATE TABLE incomplete_mongo_table(key UInt64, data String) ENGINE = MongoDB('mongo1:27017', 'test', 'complex_table', 'root', 'clickhouse')") @@ -61,6 +69,7 @@ def test_complex_data_type(started_cluster): assert node.query("SELECT data from incomplete_mongo_table where key = 42") == hex(42 * 42) + '\n' +@pytest.mark.parametrize('started_cluster', [False], indirect=['started_cluster']) def test_incorrect_data_type(started_cluster): mongo_connection = get_mongo_connection(started_cluster) db = mongo_connection['test'] @@ -71,6 +80,7 @@ def test_incorrect_data_type(started_cluster): data.append({'key': i, 'data': hex(i * i), 'aaaa': 'Hello'}) strange_mongo_table.insert_many(data) + node = started_cluster.instances['node'] node.query( "CREATE TABLE strange_mongo_table(key String, data String) ENGINE = MongoDB('mongo1:27017', 'test', 'strange_table', 'root', 'clickhouse')") @@ -85,3 +95,24 @@ def test_incorrect_data_type(started_cluster): with pytest.raises(QueryRuntimeException): node.query("SELECT bbbb FROM strange_mongo_table2") + + +@pytest.mark.parametrize('started_cluster', [True], indirect=['started_cluster']) +def test_secure_connection(started_cluster): + mongo_connection = get_mongo_connection(started_cluster, secure=True) + db = mongo_connection['test'] + db.add_user('root', 'clickhouse') + simple_mongo_table = db['simple_table'] + data = [] + for i in range(0, 100): + data.append({'key': i, 'data': hex(i * i)}) + simple_mongo_table.insert_many(data) + + node = started_cluster.instances['node'] + node.query( + "CREATE TABLE simple_mongo_table(key UInt64, data String) ENGINE = MongoDB('mongo1:27017', 'test', 'simple_table', 'root', 'clickhouse', 'ssl=true')") + + assert node.query("SELECT COUNT() FROM simple_mongo_table") == '100\n' + assert node.query("SELECT sum(key) FROM simple_mongo_table") == str(sum(range(0, 100))) + '\n' + + assert node.query("SELECT data from simple_mongo_table where key = 42") == hex(42 * 42) + '\n' diff --git a/tests/integration/test_storage_postgresql/test.py b/tests/integration/test_storage_postgresql/test.py index 307879265df..28a76631c0f 100644 --- a/tests/integration/test_storage_postgresql/test.py +++ b/tests/integration/test_storage_postgresql/test.py @@ -1,55 +1,18 @@ -import time - +import logging import pytest -import psycopg2 from multiprocessing.dummy import Pool from helpers.cluster import ClickHouseCluster -from helpers.test_tools import assert_eq_with_retry -from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT cluster = ClickHouseCluster(__file__) node1 = cluster.add_instance('node1', with_postgres=True) node2 = cluster.add_instance('node2', with_postgres_cluster=True) -def get_postgres_conn(cluster, ip, database=False): - if database == True: - conn_string = f"host={ip} port='{cluster.postgres_port}' dbname='clickhouse' user='postgres' password='mysecretpassword'" - else: - conn_string = f"host={ip} port='{cluster.postgres_port}' user='postgres' password='mysecretpassword'" - - conn = psycopg2.connect(conn_string) - conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) - conn.autocommit = True - return conn - -def create_postgres_db(conn, name): - cursor = conn.cursor() - cursor.execute("DROP DATABASE IF EXISTS {}".format(name)) - cursor.execute("CREATE DATABASE {}".format(name)) - @pytest.fixture(scope="module") def started_cluster(): try: cluster.start() - postgres_conn = get_postgres_conn(cluster, ip=cluster.postgres_ip) - print("postgres connected") - create_postgres_db(postgres_conn, 'clickhouse') - - postgres_conn = get_postgres_conn(cluster, ip=cluster.postgres2_ip) - print("postgres2 connected") - create_postgres_db(postgres_conn, 'clickhouse') - - postgres_conn = get_postgres_conn(cluster, ip=cluster.postgres3_ip) - print("postgres2 connected") - create_postgres_db(postgres_conn, 'clickhouse') - - postgres_conn = get_postgres_conn(cluster, ip=cluster.postgres4_ip) - print("postgres2 connected") - create_postgres_db(postgres_conn, 'clickhouse') - - print("postgres connected") yield cluster finally: @@ -57,50 +20,58 @@ def started_cluster(): def test_postgres_select_insert(started_cluster): - conn = get_postgres_conn(started_cluster, started_cluster.postgres_ip, True) - cursor = conn.cursor() + cursor = started_cluster.postgres_conn.cursor() table_name = 'test_many' - table = f'''postgresql('{started_cluster.postgres_ip}:{started_cluster.postgres_port}', 'clickhouse', '{table_name}', 'postgres', 'mysecretpassword')''' - cursor.execute('CREATE TABLE IF NOT EXISTS {} (a integer, b text, c integer)'.format(table_name)) + table = f'''postgresql('{started_cluster.postgres_ip}:{started_cluster.postgres_port}', 'postgres', '{table_name}', 'postgres', 'mysecretpassword')''' + cursor.execute(f'DROP TABLE IF EXISTS {table_name}') + cursor.execute(f'CREATE TABLE {table_name} (a integer, b text, c integer)') - result = node1.query(''' - INSERT INTO TABLE FUNCTION {} - SELECT number, concat('name_', toString(number)), 3 from numbers(10000)'''.format(table)) - check1 = "SELECT count() FROM {}".format(table) - check2 = "SELECT Sum(c) FROM {}".format(table) - check3 = "SELECT count(c) FROM {} WHERE a % 2 == 0".format(table) - check4 = "SELECT count() FROM {} WHERE b LIKE concat('name_', toString(1))".format(table) + result = node1.query(f''' + INSERT INTO TABLE FUNCTION {table} + SELECT number, concat('name_', toString(number)), 3 from numbers(10000)''') + check1 = f"SELECT count() FROM {table}" + check2 = f"SELECT Sum(c) FROM {table}" + check3 = f"SELECT count(c) FROM {table} WHERE a % 2 == 0" + check4 = f"SELECT count() FROM {table} WHERE b LIKE concat('name_', toString(1))" assert (node1.query(check1)).rstrip() == '10000' assert (node1.query(check2)).rstrip() == '30000' assert (node1.query(check3)).rstrip() == '5000' assert (node1.query(check4)).rstrip() == '1' + # Triggers issue https://github.com/ClickHouse/ClickHouse/issues/26088 + # for i in range(1, 1000): + # assert (node1.query(check1)).rstrip() == '10000', f"Failed on {i}" + + cursor.execute(f'DROP TABLE {table_name} ') + def test_postgres_conversions(started_cluster): - conn = get_postgres_conn(started_cluster, started_cluster.postgres_ip, True) - cursor = conn.cursor() + cursor = started_cluster.postgres_conn.cursor() + cursor.execute(f'DROP TABLE IF EXISTS test_types') + cursor.execute(f'DROP TABLE IF EXISTS test_array_dimensions') + cursor.execute( - '''CREATE TABLE IF NOT EXISTS test_types ( + '''CREATE TABLE test_types ( a smallint, b integer, c bigint, d real, e double precision, f serial, g bigserial, h timestamp, i date, j decimal(5, 3), k numeric, l boolean)''') 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', 22.222, 22.222, 1)''') + INSERT INTO TABLE FUNCTION postgresql('postgres1:5432', 'postgres', 'test_types', 'postgres', 'mysecretpassword') VALUES + (-32768, -2147483648, -9223372036854775808, 1.12345, 1.1234567890, 2147483647, 9223372036854775807, '2000-05-12 12:12:12.012345', '2000-05-12', 22.222, 22.222, 1)''') result = node1.query(''' - SELECT a, b, c, d, e, f, g, h, i, j, toDecimal128(k, 3), l 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\t1\n') + SELECT a, b, c, d, e, f, g, h, i, j, toDecimal128(k, 3), l FROM postgresql('postgres1:5432', 'postgres', 'test_types', 'postgres', 'mysecretpassword')''') + assert(result == '-32768\t-2147483648\t-9223372036854775808\t1.12345\t1.123456789\t2147483647\t9223372036854775807\t2000-05-12 12:12:12.012345\t2000-05-12\t22.222\t22.222\t1\n') cursor.execute("INSERT INTO test_types (l) VALUES (TRUE), (true), ('yes'), ('y'), ('1');") cursor.execute("INSERT INTO test_types (l) VALUES (FALSE), (false), ('no'), ('off'), ('0');") expected = "1\n1\n1\n1\n1\n1\n0\n0\n0\n0\n0\n" - result = node1.query('''SELECT l FROM postgresql('postgres1:5432', 'clickhouse', 'test_types', 'postgres', 'mysecretpassword')''') + result = node1.query('''SELECT l FROM postgresql('postgres1:5432', 'postgres', 'test_types', 'postgres', 'mysecretpassword')''') assert(result == expected) cursor.execute( '''CREATE TABLE IF NOT EXISTS test_array_dimensions ( a Date[] NOT NULL, -- Date - b Timestamp[] NOT NULL, -- DateTime + b Timestamp[] NOT NULL, -- DateTime64(6) c real[][] NOT NULL, -- Float32 d double precision[][] NOT NULL, -- Float64 e decimal(5, 5)[][][] NOT NULL, -- Decimal32 @@ -112,9 +83,9 @@ def test_postgres_conversions(started_cluster): )''') result = node1.query(''' - DESCRIBE TABLE postgresql('postgres1:5432', 'clickhouse', 'test_array_dimensions', 'postgres', 'mysecretpassword')''') + DESCRIBE TABLE postgresql('postgres1:5432', 'postgres', 'test_array_dimensions', 'postgres', 'mysecretpassword')''') expected = ('a\tArray(Date)\t\t\t\t\t\n' + - 'b\tArray(DateTime)\t\t\t\t\t\n' + + 'b\tArray(DateTime64(6))\t\t\t\t\t\n' + 'c\tArray(Array(Float32))\t\t\t\t\t\n' + 'd\tArray(Array(Float64))\t\t\t\t\t\n' + 'e\tArray(Array(Array(Decimal(5, 5))))\t\t\t\t\t\n' + @@ -126,10 +97,10 @@ def test_postgres_conversions(started_cluster): ) assert(result.rstrip() == expected) - node1.query("INSERT INTO TABLE FUNCTION postgresql('postgres1:5432', 'clickhouse', 'test_array_dimensions', 'postgres', 'mysecretpassword') " + node1.query("INSERT INTO TABLE FUNCTION postgresql('postgres1:5432', 'postgres', 'test_array_dimensions', 'postgres', 'mysecretpassword') " "VALUES (" "['2000-05-12', '2000-05-12'], " - "['2000-05-12 12:12:12', '2000-05-12 12:12:12'], " + "['2000-05-12 12:12:12.012345', '2000-05-12 12:12:12.012345'], " "[[1.12345], [1.12345], [1.12345]], " "[[1.1234567891], [1.1234567891], [1.1234567891]], " "[[[0.11111, 0.11111]], [[0.22222, 0.22222]], [[0.33333, 0.33333]]], " @@ -141,10 +112,10 @@ def test_postgres_conversions(started_cluster): ")") result = node1.query(''' - SELECT * FROM postgresql('postgres1:5432', 'clickhouse', 'test_array_dimensions', 'postgres', 'mysecretpassword')''') + SELECT * FROM postgresql('postgres1:5432', 'postgres', 'test_array_dimensions', 'postgres', 'mysecretpassword')''') expected = ( "['2000-05-12','2000-05-12']\t" + - "['2000-05-12 12:12:12','2000-05-12 12:12:12']\t" + + "['2000-05-12 12:12:12.012345','2000-05-12 12:12:12.012345']\t" + "[[1.12345],[1.12345],[1.12345]]\t" + "[[1.1234567891],[1.1234567891],[1.1234567891]]\t" + "[[[0.11111,0.11111]],[[0.22222,0.22222]],[[0.33333,0.33333]]]\t" @@ -156,25 +127,33 @@ def test_postgres_conversions(started_cluster): ) assert(result == expected) + cursor.execute(f'DROP TABLE test_types') + cursor.execute(f'DROP TABLE test_array_dimensions') + def test_non_default_scema(started_cluster): - conn = get_postgres_conn(started_cluster, started_cluster.postgres_ip, True) - cursor = conn.cursor() + node1.query('DROP TABLE IF EXISTS test_pg_table_schema') + node1.query('DROP TABLE IF EXISTS test_pg_table_schema_with_dots') + + cursor = started_cluster.postgres_conn.cursor() + cursor.execute('DROP SCHEMA IF EXISTS test_schema CASCADE') + cursor.execute('DROP SCHEMA IF EXISTS "test.nice.schema" CASCADE') + cursor.execute('CREATE SCHEMA test_schema') cursor.execute('CREATE TABLE test_schema.test_table (a integer)') cursor.execute('INSERT INTO test_schema.test_table SELECT i FROM generate_series(0, 99) as t(i)') node1.query(''' CREATE TABLE test_pg_table_schema (a UInt32) - ENGINE PostgreSQL('postgres1:5432', 'clickhouse', 'test_table', 'postgres', 'mysecretpassword', 'test_schema'); + ENGINE PostgreSQL('postgres1:5432', 'postgres', 'test_table', 'postgres', 'mysecretpassword', 'test_schema'); ''') result = node1.query('SELECT * FROM test_pg_table_schema') expected = node1.query('SELECT number FROM numbers(100)') assert(result == expected) - table_function = '''postgresql('postgres1:5432', 'clickhouse', 'test_table', 'postgres', 'mysecretpassword', 'test_schema')''' - result = node1.query('SELECT * FROM {}'.format(table_function)) + table_function = '''postgresql('postgres1:5432', 'postgres', 'test_table', 'postgres', 'mysecretpassword', 'test_schema')''' + result = node1.query(f'SELECT * FROM {table_function}') assert(result == expected) cursor.execute('''CREATE SCHEMA "test.nice.schema"''') @@ -183,24 +162,28 @@ def test_non_default_scema(started_cluster): node1.query(''' CREATE TABLE test_pg_table_schema_with_dots (a UInt32) - ENGINE PostgreSQL('postgres1:5432', 'clickhouse', 'test.nice.table', 'postgres', 'mysecretpassword', 'test.nice.schema'); + ENGINE PostgreSQL('postgres1:5432', 'postgres', 'test.nice.table', 'postgres', 'mysecretpassword', 'test.nice.schema'); ''') result = node1.query('SELECT * FROM test_pg_table_schema_with_dots') assert(result == expected) cursor.execute('INSERT INTO "test_schema"."test_table" SELECT i FROM generate_series(100, 199) as t(i)') - result = node1.query('SELECT * FROM {}'.format(table_function)) + result = node1.query(f'SELECT * FROM {table_function}') expected = node1.query('SELECT number FROM numbers(200)') assert(result == expected) + cursor.execute('DROP SCHEMA test_schema CASCADE') + cursor.execute('DROP SCHEMA "test.nice.schema" CASCADE') + node1.query('DROP TABLE test_pg_table_schema') + node1.query('DROP TABLE test_pg_table_schema_with_dots') + def test_concurrent_queries(started_cluster): - conn = get_postgres_conn(started_cluster, started_cluster.postgres_ip, True) - cursor = conn.cursor() + cursor = started_cluster.postgres_conn.cursor() node1.query(''' CREATE TABLE test_table (key UInt32, value UInt32) - ENGINE = PostgreSQL('postgres1:5432', 'clickhouse', 'test_table', 'postgres', 'mysecretpassword')''') + ENGINE = PostgreSQL('postgres1:5432', 'postgres', 'test_table', 'postgres', 'mysecretpassword')''') cursor.execute('CREATE TABLE test_table (key integer, value integer)') @@ -212,7 +195,7 @@ def test_concurrent_queries(started_cluster): p = busy_pool.map_async(node_select, range(20)) p.wait() count = node1.count_in_log('New connection to postgres1:5432') - print(count, prev_count) + logging.debug(f'count {count}, prev_count {prev_count}') # 16 is default size for connection pool assert(int(count) <= int(prev_count) + 16) @@ -224,7 +207,7 @@ def test_concurrent_queries(started_cluster): p = busy_pool.map_async(node_insert, range(5)) p.wait() result = node1.query("SELECT count() FROM test_table", user='default') - print(result) + logging.debug(result) assert(int(result) == 5 * 5 * 1000) def node_insert_select(_): @@ -236,44 +219,41 @@ def test_concurrent_queries(started_cluster): p = busy_pool.map_async(node_insert_select, range(5)) p.wait() result = node1.query("SELECT count() FROM test_table", user='default') - print(result) + logging.debug(result) assert(int(result) == 5 * 5 * 1000 * 2) node1.query('DROP TABLE test_table;') cursor.execute('DROP TABLE test_table;') count = node1.count_in_log('New connection to postgres1:5432') - print(count, prev_count) + logging.debug(f'count {count}, prev_count {prev_count}') assert(int(count) <= int(prev_count) + 16) def test_postgres_distributed(started_cluster): - conn0 = get_postgres_conn(started_cluster, started_cluster.postgres_ip, database=True) - conn1 = get_postgres_conn(started_cluster, started_cluster.postgres2_ip, database=True) - conn2 = get_postgres_conn(started_cluster, started_cluster.postgres3_ip, database=True) - conn3 = get_postgres_conn(started_cluster, started_cluster.postgres4_ip, database=True) - - cursor0 = conn0.cursor() - cursor1 = conn1.cursor() - cursor2 = conn2.cursor() - cursor3 = conn3.cursor() + cursor0 = started_cluster.postgres_conn.cursor() + cursor1 = started_cluster.postgres2_conn.cursor() + cursor2 = started_cluster.postgres3_conn.cursor() + cursor3 = started_cluster.postgres4_conn.cursor() cursors = [cursor0, cursor1, cursor2, cursor3] for i in range(4): + cursors[i].execute('DROP TABLE IF EXISTS test_replicas') cursors[i].execute('CREATE TABLE test_replicas (id Integer, name Text)') - cursors[i].execute("""INSERT INTO test_replicas select i, 'host{}' from generate_series(0, 99) as t(i);""".format(i + 1)); + cursors[i].execute(f"""INSERT INTO test_replicas select i, 'host{i+1}' from generate_series(0, 99) as t(i);"""); # test multiple ports parsing - result = node2.query('''SELECT DISTINCT(name) FROM postgresql(`postgres{1|2|3}:5432`, 'clickhouse', 'test_replicas', 'postgres', 'mysecretpassword'); ''') + result = node2.query('''SELECT DISTINCT(name) FROM postgresql(`postgres{1|2|3}:5432`, 'postgres', 'test_replicas', 'postgres', 'mysecretpassword'); ''') assert(result == 'host1\n' or result == 'host2\n' or result == 'host3\n') - result = node2.query('''SELECT DISTINCT(name) FROM postgresql(`postgres2:5431|postgres3:5432`, 'clickhouse', 'test_replicas', 'postgres', 'mysecretpassword'); ''') + result = node2.query('''SELECT DISTINCT(name) FROM postgresql(`postgres2:5431|postgres3:5432`, 'postgres', 'test_replicas', 'postgres', 'mysecretpassword'); ''') assert(result == 'host3\n' or result == 'host2\n') # Create storage with with 3 replicas + node2.query('DROP TABLE IF EXISTS test_replicas') node2.query(''' CREATE TABLE test_replicas (id UInt32, name String) - ENGINE = PostgreSQL(`postgres{2|3|4}:5432`, 'clickhouse', 'test_replicas', 'postgres', 'mysecretpassword'); ''') + ENGINE = PostgreSQL(`postgres{2|3|4}:5432`, 'postgres', 'test_replicas', 'postgres', 'mysecretpassword'); ''') # Check all replicas are traversed query = "SELECT name FROM (" @@ -284,10 +264,12 @@ def test_postgres_distributed(started_cluster): assert(result == 'host2\nhost3\nhost4\n') # Create storage with with two two shards, each has 2 replicas + node2.query('DROP TABLE IF EXISTS test_shards') + node2.query(''' CREATE TABLE test_shards (id UInt32, name String, age UInt32, money UInt32) - ENGINE = ExternalDistributed('PostgreSQL', `postgres{1|2}:5432,postgres{3|4}:5432`, 'clickhouse', 'test_replicas', 'postgres', 'mysecretpassword'); ''') + ENGINE = ExternalDistributed('PostgreSQL', `postgres{1|2}:5432,postgres{3|4}:5432`, 'postgres', 'test_replicas', 'postgres', 'mysecretpassword'); ''') # Check only one replica in each shard is used result = node2.query("SELECT DISTINCT(name) FROM test_shards ORDER BY name") @@ -306,26 +288,32 @@ def test_postgres_distributed(started_cluster): result = node2.query("SELECT DISTINCT(name) FROM test_shards ORDER BY name") started_cluster.unpause_container('postgres1') assert(result == 'host2\nhost4\n' or result == 'host3\nhost4\n') + node2.query('DROP TABLE test_shards') + node2.query('DROP TABLE test_replicas') def test_datetime_with_timezone(started_cluster): - conn = get_postgres_conn(started_cluster, started_cluster.postgres_ip, True) - cursor = conn.cursor() + cursor = started_cluster.postgres_conn.cursor() + cursor.execute("DROP TABLE IF EXISTS test_timezone") + node1.query("DROP TABLE IF EXISTS test_timezone") cursor.execute("CREATE TABLE test_timezone (ts timestamp without time zone, ts_z timestamp with time zone)") cursor.execute("insert into test_timezone select '2014-04-04 20:00:00', '2014-04-04 20:00:00'::timestamptz at time zone 'America/New_York';") cursor.execute("select * from test_timezone") result = cursor.fetchall()[0] - print(result[0], str(result[1])[:-6]) - node1.query("create table test_timezone ( ts DateTime, ts_z DateTime('America/New_York')) ENGINE PostgreSQL('postgres1:5432', 'clickhouse', 'test_timezone', 'postgres', 'mysecretpassword');") + logging.debug(f'{result[0]}, {str(result[1])[:-6]}') + node1.query("create table test_timezone ( ts DateTime, ts_z DateTime('America/New_York')) ENGINE PostgreSQL('postgres1:5432', 'postgres', 'test_timezone', 'postgres', 'mysecretpassword');") assert(node1.query("select ts from test_timezone").strip() == str(result[0])) # [:-6] because 2014-04-04 16:00:00+00:00 -> 2014-04-04 16:00:00 assert(node1.query("select ts_z from test_timezone").strip() == str(result[1])[:-6]) assert(node1.query("select * from test_timezone") == "2014-04-04 20:00:00\t2014-04-04 16:00:00\n") + cursor.execute("DROP TABLE test_timezone") + node1.query("DROP TABLE test_timezone") def test_postgres_ndim(started_cluster): - conn = get_postgres_conn(started_cluster, started_cluster.postgres_ip, True) - cursor = conn.cursor() + cursor = started_cluster.postgres_conn.cursor() + cursor.execute("DROP TABLE IF EXISTS arr1, arr2") + cursor.execute('CREATE TABLE arr1 (a Integer[])') cursor.execute("INSERT INTO arr1 SELECT '{{1}, {2}}'") @@ -335,8 +323,9 @@ def test_postgres_ndim(started_cluster): result = cursor.fetchall()[0] assert(int(result[0]) == 0) - result = node1.query('''SELECT toTypeName(a) FROM postgresql('postgres1:5432', 'clickhouse', 'arr2', 'postgres', 'mysecretpassword')''') + result = node1.query('''SELECT toTypeName(a) FROM postgresql('postgres1:5432', 'postgres', 'arr2', 'postgres', 'mysecretpassword')''') assert(result.strip() == "Array(Array(Nullable(Int32)))") + cursor.execute("DROP TABLE arr1, arr2") if __name__ == '__main__': diff --git a/tests/integration/test_storage_rabbitmq/test.py b/tests/integration/test_storage_rabbitmq/test.py index 38c823cd52f..a8efea1c5d6 100644 --- a/tests/integration/test_storage_rabbitmq/test.py +++ b/tests/integration/test_storage_rabbitmq/test.py @@ -2032,6 +2032,20 @@ def test_rabbitmq_queue_consume(rabbitmq_cluster): instance.query('DROP TABLE test.rabbitmq_queue') +def test_rabbitmq_drop_table_with_unfinished_setup(rabbitmq_cluster): + rabbitmq_cluster.pause_container('rabbitmq1') + instance.query(''' + CREATE TABLE test.drop (key UInt64, value UInt64) + ENGINE = RabbitMQ + SETTINGS rabbitmq_host_port = 'rabbitmq1:5672', + rabbitmq_exchange_name = 'drop', + rabbitmq_format = 'JSONEachRow'; + ''') + time.sleep(5) + instance.query('DROP TABLE test.drop;') + rabbitmq_cluster.unpause_container('rabbitmq1') + + if __name__ == '__main__': cluster.start() input("Cluster created, press any key to destroy...") diff --git a/tests/integration/test_storage_s3/test.py b/tests/integration/test_storage_s3/test.py index 52b021a07c5..5908def8297 100644 --- a/tests/integration/test_storage_s3/test.py +++ b/tests/integration/test_storage_s3/test.py @@ -198,12 +198,14 @@ def test_empty_put(started_cluster, auth): instance = started_cluster.instances["dummy"] # type: ClickHouseInstance table_format = "column1 UInt32, column2 UInt32, column3 UInt32" + drop_empty_table_query = "DROP TABLE IF EXISTS empty_table" create_empty_table_query = """ CREATE TABLE empty_table ( {} ) ENGINE = Null() """.format(table_format) + run_query(instance, drop_empty_table_query) run_query(instance, create_empty_table_query) filename = "empty_put_test.csv" @@ -305,22 +307,22 @@ def test_put_with_zero_redirect(started_cluster): def test_put_get_with_globs(started_cluster): # type: (ClickHouseCluster) -> None - + unique_prefix = random.randint(1,10000) bucket = started_cluster.minio_bucket instance = started_cluster.instances["dummy"] # type: ClickHouseInstance table_format = "column1 UInt32, column2 UInt32, column3 UInt32" max_path = "" for i in range(10): for j in range(10): - path = "{}_{}/{}.csv".format(i, random.choice(['a', 'b', 'c', 'd']), j) + path = "{}/{}_{}/{}.csv".format(unique_prefix, i, random.choice(['a', 'b', 'c', 'd']), j) max_path = max(path, max_path) values = "({},{},{})".format(i, j, i + j) query = "insert into table function s3('http://{}:{}/{}/{}', 'CSV', '{}') values {}".format( started_cluster.minio_ip, MINIO_INTERNAL_PORT, bucket, path, table_format, values) run_query(instance, query) - query = "select sum(column1), sum(column2), sum(column3), min(_file), max(_path) from s3('http://{}:{}/{}/*_{{a,b,c,d}}/%3f.csv', 'CSV', '{}')".format( - started_cluster.minio_redirect_host, started_cluster.minio_redirect_port, bucket, table_format) + query = "select sum(column1), sum(column2), sum(column3), min(_file), max(_path) from s3('http://{}:{}/{}/{}/*_{{a,b,c,d}}/%3f.csv', 'CSV', '{}')".format( + started_cluster.minio_redirect_host, started_cluster.minio_redirect_port, bucket, unique_prefix, table_format) assert run_query(instance, query).splitlines() == [ "450\t450\t900\t0.csv\t{bucket}/{max_path}".format(bucket=bucket, max_path=max_path)] @@ -479,6 +481,7 @@ def test_custom_auth_headers(started_cluster): result = run_query(instance, get_query) assert result == '1\t2\t3\n' + instance.query("DROP TABLE IF EXISTS test") instance.query( "CREATE TABLE test ({table_format}) ENGINE = S3('http://resolver:8080/{bucket}/{file}', 'CSV')".format( bucket=started_cluster.minio_restricted_bucket, @@ -494,6 +497,7 @@ def test_custom_auth_headers(started_cluster): replace_config("
Authorization: Bearer INVALID_TOKEN", "
Authorization: Bearer TOKEN") instance.query("SYSTEM RELOAD CONFIG") assert run_query(instance, "SELECT * FROM test") == '1\t2\t3\n' + instance.query("DROP TABLE test") def test_custom_auth_headers_exclusion(started_cluster): @@ -551,6 +555,8 @@ def test_storage_s3_get_gzip(started_cluster, extension, method): "Norman Ortega,33", "" ] + run_query(instance, f"DROP TABLE IF EXISTS {name}") + buf = io.BytesIO() compressed = gzip.GzipFile(fileobj=buf, mode="wb") compressed.write(("\n".join(data)).encode()) @@ -562,7 +568,8 @@ def test_storage_s3_get_gzip(started_cluster, extension, method): 'CSV', '{method}')""") - run_query(instance, "SELECT sum(id) FROM {}".format(name)).splitlines() == ["565"] + run_query(instance, f"SELECT sum(id) FROM {name}").splitlines() == ["565"] + run_query(instance, f"DROP TABLE {name}") def test_storage_s3_get_unstable(started_cluster): @@ -646,3 +653,28 @@ def test_storage_s3_put_gzip(started_cluster, extension, method): f = gzip.GzipFile(fileobj=buf, mode="rb") uncompressed_content = f.read().decode() assert sum([ int(i.split(',')[1]) for i in uncompressed_content.splitlines() ]) == 708 + + +def test_truncate_table(started_cluster): + bucket = started_cluster.minio_bucket + instance = started_cluster.instances["dummy"] # type: ClickHouseInstance + name = "truncate" + + instance.query("CREATE TABLE {} (id UInt32) ENGINE = S3('http://{}:{}/{}/{}', 'CSV')".format( + name, started_cluster.minio_ip, MINIO_INTERNAL_PORT, bucket, name)) + + instance.query("INSERT INTO {} SELECT number FROM numbers(10)".format(name)) + result = instance.query("SELECT * FROM {}".format(name)) + assert result == instance.query("SELECT number FROM numbers(10)") + instance.query("TRUNCATE TABLE {}".format(name)) + + minio = started_cluster.minio_client + timeout = 30 + while timeout > 0: + if len(list(minio.list_objects(started_cluster.minio_bucket, 'truncate/'))) == 0: + return + timeout -= 1 + time.sleep(1) + assert(len(list(minio.list_objects(started_cluster.minio_bucket, 'truncate/'))) == 0) + assert instance.query("SELECT * FROM {}".format(name)) == "" + diff --git a/tests/integration/test_system_flush_logs/test.py b/tests/integration/test_system_flush_logs/test.py index b69105710fb..a4d70339c09 100644 --- a/tests/integration/test_system_flush_logs/test.py +++ b/tests/integration/test_system_flush_logs/test.py @@ -10,12 +10,12 @@ node = cluster.add_instance('node_default') system_logs = [ # disabled by default - ('system.part_log', 0), ('system.text_log', 0), # enabled by default ('system.query_log', 1), ('system.query_thread_log', 1), + ('system.part_log', 1), ('system.trace_log', 1), ('system.metric_log', 1), ] diff --git a/tests/integration/test_table_functions_access_rights/test.py b/tests/integration/test_table_functions_access_rights/test.py index bd2f767413a..16f18407960 100644 --- a/tests/integration/test_table_functions_access_rights/test.py +++ b/tests/integration/test_table_functions_access_rights/test.py @@ -38,7 +38,7 @@ def test_merge(): assert "it's necessary to have grant CREATE TEMPORARY TABLE ON *.*" in instance.query_and_get_error(select_query, user = 'A') instance.query("GRANT CREATE TEMPORARY TABLE ON *.* TO A") - assert "no one matches regular expression" in instance.query_and_get_error(select_query, user = 'A') + assert "no tables in database matches" in instance.query_and_get_error(select_query, user = 'A') instance.query("GRANT SELECT ON default.table1 TO A") assert instance.query(select_query, user = 'A') == "1\n" diff --git a/tests/integration/test_tcp_handler_http_responses/__init__.py b/tests/integration/test_tcp_handler_http_responses/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/integration/test_tcp_handler_http_responses/configs/config.d/http-port-31337.xml b/tests/integration/test_tcp_handler_http_responses/configs/config.d/http-port-31337.xml new file mode 100644 index 00000000000..23ce561b5b2 --- /dev/null +++ b/tests/integration/test_tcp_handler_http_responses/configs/config.d/http-port-31337.xml @@ -0,0 +1,3 @@ + + 31337 + diff --git a/tests/integration/test_tcp_handler_http_responses/configs/config.d/no-http-port.xml b/tests/integration/test_tcp_handler_http_responses/configs/config.d/no-http-port.xml new file mode 100644 index 00000000000..86dab92bd91 --- /dev/null +++ b/tests/integration/test_tcp_handler_http_responses/configs/config.d/no-http-port.xml @@ -0,0 +1,3 @@ + + + diff --git a/tests/integration/test_tcp_handler_http_responses/test_case.py b/tests/integration/test_tcp_handler_http_responses/test_case.py new file mode 100644 index 00000000000..38b5ba909a7 --- /dev/null +++ b/tests/integration/test_tcp_handler_http_responses/test_case.py @@ -0,0 +1,42 @@ +"""Test HTTP responses given by the TCP Handler.""" +from pathlib import Path +import pytest +from helpers.cluster import ClickHouseCluster +import requests + +cluster = ClickHouseCluster(__file__) + +node_with_http = cluster.add_instance( + 'node_with_http', + main_configs=["configs/config.d/http-port-31337.xml"] +) +HTTP_PORT = 31337 + +node_without_http = cluster.add_instance( + 'node_without_http', + main_configs=["configs/config.d/no-http-port.xml"] +) + +@pytest.fixture(scope="module") +def start_cluster(): + try: + cluster.start() + yield cluster + + finally: + cluster.shutdown() + +def test_request_to_http_full_instance(start_cluster): + response = requests.get( + f'http://{node_with_http.ip_address}:9000' + ) + assert response.status_code == 400 + assert str(HTTP_PORT) in response.text + +def test_request_to_http_less_instance(start_cluster): + response = requests.post( + f'http://{node_without_http.ip_address}:9000' + ) + assert response.status_code == 400 + assert str(HTTP_PORT) not in response.text + assert "8123" not in response.text diff --git a/tests/integration/test_ttl_replicated/test.py b/tests/integration/test_ttl_replicated/test.py index de5e5984082..f37c28b2a80 100644 --- a/tests/integration/test_ttl_replicated/test.py +++ b/tests/integration/test_ttl_replicated/test.py @@ -351,6 +351,7 @@ def test_ttl_compatibility(started_cluster, node_left, node_right, num_run): ENGINE = ReplicatedMergeTree('/clickhouse/tables/test/test_ttl_delete_{suff}', '{replica}') ORDER BY id PARTITION BY toDayOfMonth(date) TTL date + INTERVAL 3 SECOND + SETTINGS max_number_of_merges_with_ttl_in_pool=100, max_replicated_merges_with_ttl_in_queue=100 '''.format(suff=num_run, replica=node.name)) node.query( @@ -359,6 +360,7 @@ def test_ttl_compatibility(started_cluster, node_left, node_right, num_run): ENGINE = ReplicatedMergeTree('/clickhouse/tables/test/test_ttl_group_by_{suff}', '{replica}') ORDER BY id PARTITION BY toDayOfMonth(date) TTL date + INTERVAL 3 SECOND GROUP BY id SET val = sum(val) + SETTINGS max_number_of_merges_with_ttl_in_pool=100, max_replicated_merges_with_ttl_in_queue=100 '''.format(suff=num_run, replica=node.name)) node.query( @@ -367,6 +369,7 @@ def test_ttl_compatibility(started_cluster, node_left, node_right, num_run): ENGINE = ReplicatedMergeTree('/clickhouse/tables/test/test_ttl_where_{suff}', '{replica}') ORDER BY id PARTITION BY toDayOfMonth(date) TTL date + INTERVAL 3 SECOND DELETE WHERE id % 2 = 1 + SETTINGS max_number_of_merges_with_ttl_in_pool=100, max_replicated_merges_with_ttl_in_queue=100 '''.format(suff=num_run, replica=node.name)) node_left.query("INSERT INTO test_ttl_delete VALUES (now(), 1)") @@ -397,9 +400,9 @@ def test_ttl_compatibility(started_cluster, node_left, node_right, num_run): node_right.query("OPTIMIZE TABLE test_ttl_group_by FINAL") node_right.query("OPTIMIZE TABLE test_ttl_where FINAL") - exec_query_with_retry(node_left, "SYSTEM SYNC REPLICA test_ttl_delete") - node_left.query("SYSTEM SYNC REPLICA test_ttl_group_by", timeout=20) - node_left.query("SYSTEM SYNC REPLICA test_ttl_where", timeout=20) + exec_query_with_retry(node_left, "OPTIMIZE TABLE test_ttl_delete FINAL") + node_left.query("OPTIMIZE TABLE test_ttl_group_by FINAL", timeout=20) + node_left.query("OPTIMIZE TABLE test_ttl_where FINAL", timeout=20) # After OPTIMIZE TABLE, it is not guaranteed that everything is merged. # Possible scenario (for test_ttl_group_by): @@ -414,6 +417,10 @@ def test_ttl_compatibility(started_cluster, node_left, node_right, num_run): node_right.query("SYSTEM SYNC REPLICA test_ttl_group_by", timeout=20) node_right.query("SYSTEM SYNC REPLICA test_ttl_where", timeout=20) + exec_query_with_retry(node_left, "SYSTEM SYNC REPLICA test_ttl_delete") + node_left.query("SYSTEM SYNC REPLICA test_ttl_group_by", timeout=20) + node_left.query("SYSTEM SYNC REPLICA test_ttl_where", timeout=20) + assert node_left.query("SELECT id FROM test_ttl_delete ORDER BY id") == "2\n4\n" assert node_right.query("SELECT id FROM test_ttl_delete ORDER BY id") == "2\n4\n" diff --git a/tests/integration/test_version_update_after_mutation/test.py b/tests/integration/test_version_update_after_mutation/test.py index 4f8a61a5bf0..8d38234ccdd 100644 --- a/tests/integration/test_version_update_after_mutation/test.py +++ b/tests/integration/test_version_update_after_mutation/test.py @@ -26,6 +26,7 @@ def start_cluster(): def test_mutate_and_upgrade(start_cluster): for node in [node1, node2]: + node.query("DROP TABLE IF EXISTS mt") node.query( "CREATE TABLE mt (EventDate Date, id UInt64) ENGINE ReplicatedMergeTree('/clickhouse/tables/t', '{}') ORDER BY tuple()".format( node.name)) @@ -67,8 +68,13 @@ def test_mutate_and_upgrade(start_cluster): assert node1.query("SELECT id FROM mt") == "1\n4\n" assert node2.query("SELECT id FROM mt") == "1\n4\n" + for node in [node1, node2]: + node.query("DROP TABLE mt") + def test_upgrade_while_mutation(start_cluster): + node3.query("DROP TABLE IF EXISTS mt1") + node3.query( "CREATE TABLE mt1 (EventDate Date, id UInt64) ENGINE ReplicatedMergeTree('/clickhouse/tables/t1', 'node3') ORDER BY tuple()") @@ -80,9 +86,11 @@ def test_upgrade_while_mutation(start_cluster): node3.restart_with_latest_version(signal=9) # checks for readonly - exec_query_with_retry(node3, "OPTIMIZE TABLE mt1", retry_count=60) + exec_query_with_retry(node3, "OPTIMIZE TABLE mt1", sleep_time=5, retry_count=60) node3.query("ALTER TABLE mt1 DELETE WHERE id > 100000", settings={"mutations_sync": "2"}) # will delete nothing, but previous async mutation will finish with this query assert_eq_with_retry(node3, "SELECT COUNT() from mt1", "50000\n") + + node3.query("DROP TABLE mt1") diff --git a/tests/performance/datetime_comparison.xml b/tests/performance/datetime_comparison.xml index 2d47ded0b1a..8d7b0c8c4de 100644 --- a/tests/performance/datetime_comparison.xml +++ b/tests/performance/datetime_comparison.xml @@ -2,4 +2,5 @@ SELECT count() FROM numbers(1000000000) WHERE materialize(now()) > toString(toDateTime('2020-09-30 00:00:00')) SELECT count() FROM numbers(1000000000) WHERE materialize(now()) > toUInt32(toDateTime('2020-09-30 00:00:00')) SELECT count() FROM numbers(1000000000) WHERE materialize(now()) > toDateTime('2020-09-30 00:00:00') + SELECT count() FROM numbers(1000000000) WHERE materialize(now()) > toDate('2020-09-30 00:00:00') diff --git a/tests/performance/decimal_format.xml b/tests/performance/decimal_format.xml new file mode 100644 index 00000000000..6841ea93d12 --- /dev/null +++ b/tests/performance/decimal_format.xml @@ -0,0 +1,3 @@ + + SELECT count() FROM zeros(10000000) WHERE NOT ignore(toString((rand() / 1000000)::Decimal64(6))) + diff --git a/tests/performance/jit_aggregate_functions.xml b/tests/performance/jit_aggregate_functions.xml index 31b621f7258..3e99f6d9615 100644 --- a/tests/performance/jit_aggregate_functions.xml +++ b/tests/performance/jit_aggregate_functions.xml @@ -3,6 +3,11 @@ hits_100m_single + + 1 + 0 + + CREATE TABLE jit_test_memory ( key UInt64, @@ -64,6 +69,9 @@ any anyLast count + groupBitOr + groupBitAnd + groupBitXor @@ -114,7 +122,7 @@ SELECT {function}(value_1), {function}(value_2), - groupBitAnd(value_3), + sum(toUInt256(value_3)), {function}(value_3) FROM {table} GROUP BY key @@ -135,7 +143,7 @@ SELECT {function}If(value_1, predicate), {function}If(value_2, predicate), - groupBitAndIf(value_3, predicate), + sumIf(toUInt256(value_3), predicate), {function}If(value_3, predicate) FROM {table} GROUP BY key @@ -158,7 +166,7 @@ SELECT {function}(value_1), {function}(value_2), - groupBitAnd(value_3), + sum(toUInt256(value_3)), {function}(value_3), {function}(value_4), {function}(value_5) @@ -183,7 +191,7 @@ SELECT {function}If(value_1, predicate), {function}If(value_2, predicate), - groupBitAndIf(value_3, predicate), + sumIf(toUInt256(value_3), predicate), {function}If(value_3, predicate), {function}If(value_4, predicate), {function}If(value_5, predicate) @@ -207,7 +215,7 @@ SELECT {function}(WatchID), {function}(CounterID), - groupBitAnd(ClientIP), + sum(toUInt256(ClientIP)), {function}(ClientIP) FROM hits_100m_single GROUP BY intHash32(UserID) % {group_scale} @@ -219,8 +227,8 @@ {function}(WatchID), {function}(CounterID), {function}(ClientIP), - {function}(GoodEvent), - {function}(CounterClass) + {function}(IPNetworkID), + {function}(SearchEngineID) FROM hits_100m_single GROUP BY intHash32(UserID) % {group_scale} FORMAT Null @@ -230,10 +238,10 @@ SELECT {function}(WatchID), {function}(CounterID), - groupBitAnd(ClientIP), + sum(toUInt256(ClientIP)), {function}(ClientIP), - {function}(GoodEvent), - {function}(CounterClass) + {function}(IPNetworkID), + {function}(SearchEngineID) FROM hits_100m_single GROUP BY intHash32(UserID) % {group_scale} FORMAT Null @@ -255,7 +263,7 @@ SELECT {function}If(WatchID, predicate), {function}If(CounterID, predicate), - groupBitAndIf(ClientIP, predicate), + sumIf(toUInt256(ClientIP), predicate), {function}If(ClientIP, predicate) FROM hits_100m_single GROUP BY intHash32(UserID) % {group_scale} @@ -268,8 +276,8 @@ {function}If(WatchID, predicate), {function}If(CounterID, predicate), {function}If(ClientIP, predicate), - {function}If(GoodEvent, predicate), - {function}If(CounterClass, predicate) + {function}If(IPNetworkID, predicate), + {function}If(SearchEngineID, predicate) FROM hits_100m_single GROUP BY intHash32(UserID) % {group_scale} FORMAT Null @@ -280,10 +288,10 @@ SELECT {function}If(WatchID, predicate), {function}If(CounterID, predicate), - groupBitAndIf(ClientIP, predicate), + sumIf(toUInt256(ClientIP), predicate), {function}If(ClientIP, predicate), - {function}If(GoodEvent, predicate), - {function}If(CounterClass, predicate) + {function}If(IPNetworkID, predicate), + {function}If(SearchEngineID, predicate) FROM hits_100m_single GROUP BY intHash32(UserID) % {group_scale} FORMAT Null diff --git a/tests/performance/join_max_streams.xml b/tests/performance/join_max_streams.xml new file mode 100644 index 00000000000..1505e1d6e6e --- /dev/null +++ b/tests/performance/join_max_streams.xml @@ -0,0 +1,5 @@ + + SELECT * FROM (SELECT 1 AS k FROM numbers_mt(1)) t1 LEFT JOIN (SELECT 1 AS k FROM numbers_mt(10000000000) WHERE number = 1) t2 USING k + SELECT * FROM (SELECT 1 AS k FROM numbers_mt(1)) t1 LEFT JOIN (SELECT 1 AS k FROM numbers_mt(10000000000) GROUP BY k) t2 USING k + SELECT * FROM (SELECT 1 AS k FROM numbers_mt(1)) t1 LEFT JOIN (SELECT 1 AS k FROM numbers_mt(10000000000) WHERE number = 1) t2 ON t1.k = t2.k + diff --git a/tests/performance/lot_of_subcolumns.xml b/tests/performance/lot_of_subcolumns.xml new file mode 100644 index 00000000000..d33a7704d70 --- /dev/null +++ b/tests/performance/lot_of_subcolumns.xml @@ -0,0 +1,23 @@ + + + CREATE TABLE lot_of_arrays(id UInt64, + `nested.arr0` Array(UInt64), `nested.arr1` Array(UInt64), `nested.arr2` Array(UInt64), `nested.arr3` Array(UInt64), `nested.arr4` Array(UInt64), `nested.arr5` Array(UInt64), `nested.arr6` Array(UInt64), `nested.arr7` Array(UInt64), `nested.arr8` Array(UInt64), `nested.arr9` Array(UInt64), `nested.arr10` Array(UInt64), `nested.arr11` Array(UInt64), `nested.arr12` Array(UInt64), `nested.arr13` Array(UInt64), `nested.arr14` Array(UInt64), `nested.arr15` Array(UInt64), `nested.arr16` Array(UInt64), `nested.arr17` Array(UInt64), `nested.arr18` Array(UInt64), `nested.arr19` Array(UInt64), `nested.arr20` Array(UInt64), `nested.arr21` Array(UInt64), `nested.arr22` Array(UInt64), `nested.arr23` Array(UInt64), `nested.arr24` Array(UInt64), `nested.arr25` Array(UInt64), `nested.arr26` Array(UInt64), `nested.arr27` Array(UInt64), `nested.arr28` Array(UInt64), `nested.arr29` Array(UInt64), `nested.arr30` Array(UInt64), `nested.arr31` Array(UInt64), `nested.arr32` Array(UInt64), `nested.arr33` Array(UInt64), `nested.arr34` Array(UInt64), `nested.arr35` Array(UInt64), `nested.arr36` Array(UInt64), `nested.arr37` Array(UInt64), `nested.arr38` Array(UInt64), `nested.arr39` Array(UInt64), `nested.arr40` Array(UInt64), `nested.arr41` Array(UInt64), `nested.arr42` Array(UInt64), `nested.arr43` Array(UInt64), `nested.arr44` Array(UInt64), `nested.arr45` Array(UInt64), `nested.arr46` Array(UInt64), `nested.arr47` Array(UInt64), `nested.arr48` Array(UInt64), `nested.arr49` Array(UInt64), `nested.arr50` Array(UInt64), `nested.arr51` Array(UInt64), `nested.arr52` Array(UInt64), `nested.arr53` Array(UInt64), `nested.arr54` Array(UInt64), `nested.arr55` Array(UInt64), `nested.arr56` Array(UInt64), `nested.arr57` Array(UInt64), `nested.arr58` Array(UInt64), `nested.arr59` Array(UInt64), `nested.arr60` Array(UInt64), `nested.arr61` Array(UInt64), `nested.arr62` Array(UInt64), `nested.arr63` Array(UInt64), `nested.arr64` Array(UInt64), `nested.arr65` Array(UInt64), `nested.arr66` Array(UInt64), `nested.arr67` Array(UInt64), `nested.arr68` Array(UInt64), `nested.arr69` Array(UInt64), `nested.arr70` Array(UInt64), `nested.arr71` Array(UInt64), `nested.arr72` Array(UInt64), `nested.arr73` Array(UInt64), `nested.arr74` Array(UInt64), `nested.arr75` Array(UInt64), `nested.arr76` Array(UInt64), `nested.arr77` Array(UInt64), `nested.arr78` Array(UInt64), `nested.arr79` Array(UInt64), `nested.arr80` Array(UInt64), `nested.arr81` Array(UInt64), `nested.arr82` Array(UInt64), `nested.arr83` Array(UInt64), `nested.arr84` Array(UInt64), `nested.arr85` Array(UInt64), `nested.arr86` Array(UInt64), `nested.arr87` Array(UInt64), `nested.arr88` Array(UInt64), `nested.arr89` Array(UInt64), `nested.arr90` Array(UInt64), `nested.arr91` Array(UInt64), `nested.arr92` Array(UInt64), `nested.arr93` Array(UInt64), `nested.arr94` Array(UInt64), `nested.arr95` Array(UInt64), `nested.arr96` Array(UInt64), `nested.arr97` Array(UInt64), `nested.arr98` Array(UInt64), `nested.arr99` Array(UInt64), + `nested.arr100` Array(UInt64), `nested.arr101` Array(UInt64), `nested.arr102` Array(UInt64), `nested.arr103` Array(UInt64), `nested.arr104` Array(UInt64), `nested.arr105` Array(UInt64), `nested.arr106` Array(UInt64), `nested.arr107` Array(UInt64), `nested.arr108` Array(UInt64), `nested.arr109` Array(UInt64), `nested.arr110` Array(UInt64), `nested.arr111` Array(UInt64), `nested.arr112` Array(UInt64), `nested.arr113` Array(UInt64), `nested.arr114` Array(UInt64), `nested.arr115` Array(UInt64), `nested.arr116` Array(UInt64), `nested.arr117` Array(UInt64), `nested.arr118` Array(UInt64), `nested.arr119` Array(UInt64), `nested.arr120` Array(UInt64), `nested.arr121` Array(UInt64), `nested.arr122` Array(UInt64), `nested.arr123` Array(UInt64), `nested.arr124` Array(UInt64), `nested.arr125` Array(UInt64), `nested.arr126` Array(UInt64), `nested.arr127` Array(UInt64), `nested.arr128` Array(UInt64), `nested.arr129` Array(UInt64), `nested.arr130` Array(UInt64), `nested.arr131` Array(UInt64), `nested.arr132` Array(UInt64), `nested.arr133` Array(UInt64), `nested.arr134` Array(UInt64), `nested.arr135` Array(UInt64), `nested.arr136` Array(UInt64), `nested.arr137` Array(UInt64), `nested.arr138` Array(UInt64), `nested.arr139` Array(UInt64), `nested.arr140` Array(UInt64), `nested.arr141` Array(UInt64), `nested.arr142` Array(UInt64), `nested.arr143` Array(UInt64), `nested.arr144` Array(UInt64), `nested.arr145` Array(UInt64), `nested.arr146` Array(UInt64), `nested.arr147` Array(UInt64), `nested.arr148` Array(UInt64), `nested.arr149` Array(UInt64), `nested.arr150` Array(UInt64), `nested.arr151` Array(UInt64), `nested.arr152` Array(UInt64), `nested.arr153` Array(UInt64), `nested.arr154` Array(UInt64), `nested.arr155` Array(UInt64), `nested.arr156` Array(UInt64), `nested.arr157` Array(UInt64), `nested.arr158` Array(UInt64), `nested.arr159` Array(UInt64), `nested.arr160` Array(UInt64), `nested.arr161` Array(UInt64), `nested.arr162` Array(UInt64), `nested.arr163` Array(UInt64), `nested.arr164` Array(UInt64), `nested.arr165` Array(UInt64), `nested.arr166` Array(UInt64), `nested.arr167` Array(UInt64), `nested.arr168` Array(UInt64), `nested.arr169` Array(UInt64), `nested.arr170` Array(UInt64), `nested.arr171` Array(UInt64), `nested.arr172` Array(UInt64), `nested.arr173` Array(UInt64), `nested.arr174` Array(UInt64), `nested.arr175` Array(UInt64), `nested.arr176` Array(UInt64), `nested.arr177` Array(UInt64), `nested.arr178` Array(UInt64), `nested.arr179` Array(UInt64), `nested.arr180` Array(UInt64), `nested.arr181` Array(UInt64), `nested.arr182` Array(UInt64), `nested.arr183` Array(UInt64), `nested.arr184` Array(UInt64), `nested.arr185` Array(UInt64), `nested.arr186` Array(UInt64), `nested.arr187` Array(UInt64), `nested.arr188` Array(UInt64), `nested.arr189` Array(UInt64), `nested.arr190` Array(UInt64), `nested.arr191` Array(UInt64), `nested.arr192` Array(UInt64), `nested.arr193` Array(UInt64), `nested.arr194` Array(UInt64), `nested.arr195` Array(UInt64), `nested.arr196` Array(UInt64), `nested.arr197` Array(UInt64), `nested.arr198` Array(UInt64), `nested.arr199` Array(UInt64), + `nested.arr200` Array(UInt64), `nested.arr201` Array(UInt64), `nested.arr202` Array(UInt64), `nested.arr203` Array(UInt64), `nested.arr204` Array(UInt64), `nested.arr205` Array(UInt64), `nested.arr206` Array(UInt64), `nested.arr207` Array(UInt64), `nested.arr208` Array(UInt64), `nested.arr209` Array(UInt64), `nested.arr210` Array(UInt64), `nested.arr211` Array(UInt64), `nested.arr212` Array(UInt64), `nested.arr213` Array(UInt64), `nested.arr214` Array(UInt64), `nested.arr215` Array(UInt64), `nested.arr216` Array(UInt64), `nested.arr217` Array(UInt64), `nested.arr218` Array(UInt64), `nested.arr219` Array(UInt64), `nested.arr220` Array(UInt64), `nested.arr221` Array(UInt64), `nested.arr222` Array(UInt64), `nested.arr223` Array(UInt64), `nested.arr224` Array(UInt64), `nested.arr225` Array(UInt64), `nested.arr226` Array(UInt64), `nested.arr227` Array(UInt64), `nested.arr228` Array(UInt64), `nested.arr229` Array(UInt64), `nested.arr230` Array(UInt64), `nested.arr231` Array(UInt64), `nested.arr232` Array(UInt64), `nested.arr233` Array(UInt64), `nested.arr234` Array(UInt64), `nested.arr235` Array(UInt64), `nested.arr236` Array(UInt64), `nested.arr237` Array(UInt64), `nested.arr238` Array(UInt64), `nested.arr239` Array(UInt64), `nested.arr240` Array(UInt64), `nested.arr241` Array(UInt64), `nested.arr242` Array(UInt64), `nested.arr243` Array(UInt64), `nested.arr244` Array(UInt64), `nested.arr245` Array(UInt64), `nested.arr246` Array(UInt64), `nested.arr247` Array(UInt64), `nested.arr248` Array(UInt64), `nested.arr249` Array(UInt64), `nested.arr250` Array(UInt64), `nested.arr251` Array(UInt64), `nested.arr252` Array(UInt64), `nested.arr253` Array(UInt64), `nested.arr254` Array(UInt64), `nested.arr255` Array(UInt64), `nested.arr256` Array(UInt64), `nested.arr257` Array(UInt64), `nested.arr258` Array(UInt64), `nested.arr259` Array(UInt64), `nested.arr260` Array(UInt64), `nested.arr261` Array(UInt64), `nested.arr262` Array(UInt64), `nested.arr263` Array(UInt64), `nested.arr264` Array(UInt64), `nested.arr265` Array(UInt64), `nested.arr266` Array(UInt64), `nested.arr267` Array(UInt64), `nested.arr268` Array(UInt64), `nested.arr269` Array(UInt64), `nested.arr270` Array(UInt64), `nested.arr271` Array(UInt64), `nested.arr272` Array(UInt64), `nested.arr273` Array(UInt64), `nested.arr274` Array(UInt64), `nested.arr275` Array(UInt64), `nested.arr276` Array(UInt64), `nested.arr277` Array(UInt64), `nested.arr278` Array(UInt64), `nested.arr279` Array(UInt64), `nested.arr280` Array(UInt64), `nested.arr281` Array(UInt64), `nested.arr282` Array(UInt64), `nested.arr283` Array(UInt64), `nested.arr284` Array(UInt64), `nested.arr285` Array(UInt64), `nested.arr286` Array(UInt64), `nested.arr287` Array(UInt64), `nested.arr288` Array(UInt64), `nested.arr289` Array(UInt64), `nested.arr290` Array(UInt64), `nested.arr291` Array(UInt64), `nested.arr292` Array(UInt64), `nested.arr293` Array(UInt64), `nested.arr294` Array(UInt64), `nested.arr295` Array(UInt64), `nested.arr296` Array(UInt64), `nested.arr297` Array(UInt64), `nested.arr298` Array(UInt64), `nested.arr299` Array(UInt64), + `nested.arr300` Array(UInt64), `nested.arr301` Array(UInt64), `nested.arr302` Array(UInt64), `nested.arr303` Array(UInt64), `nested.arr304` Array(UInt64), `nested.arr305` Array(UInt64), `nested.arr306` Array(UInt64), `nested.arr307` Array(UInt64), `nested.arr308` Array(UInt64), `nested.arr309` Array(UInt64), `nested.arr310` Array(UInt64), `nested.arr311` Array(UInt64), `nested.arr312` Array(UInt64), `nested.arr313` Array(UInt64), `nested.arr314` Array(UInt64), `nested.arr315` Array(UInt64), `nested.arr316` Array(UInt64), `nested.arr317` Array(UInt64), `nested.arr318` Array(UInt64), `nested.arr319` Array(UInt64), `nested.arr320` Array(UInt64), `nested.arr321` Array(UInt64), `nested.arr322` Array(UInt64), `nested.arr323` Array(UInt64), `nested.arr324` Array(UInt64), `nested.arr325` Array(UInt64), `nested.arr326` Array(UInt64), `nested.arr327` Array(UInt64), `nested.arr328` Array(UInt64), `nested.arr329` Array(UInt64), `nested.arr330` Array(UInt64), `nested.arr331` Array(UInt64), `nested.arr332` Array(UInt64), `nested.arr333` Array(UInt64), `nested.arr334` Array(UInt64), `nested.arr335` Array(UInt64), `nested.arr336` Array(UInt64), `nested.arr337` Array(UInt64), `nested.arr338` Array(UInt64), `nested.arr339` Array(UInt64), `nested.arr340` Array(UInt64), `nested.arr341` Array(UInt64), `nested.arr342` Array(UInt64), `nested.arr343` Array(UInt64), `nested.arr344` Array(UInt64), `nested.arr345` Array(UInt64), `nested.arr346` Array(UInt64), `nested.arr347` Array(UInt64), `nested.arr348` Array(UInt64), `nested.arr349` Array(UInt64), `nested.arr350` Array(UInt64), `nested.arr351` Array(UInt64), `nested.arr352` Array(UInt64), `nested.arr353` Array(UInt64), `nested.arr354` Array(UInt64), `nested.arr355` Array(UInt64), `nested.arr356` Array(UInt64), `nested.arr357` Array(UInt64), `nested.arr358` Array(UInt64), `nested.arr359` Array(UInt64), `nested.arr360` Array(UInt64), `nested.arr361` Array(UInt64), `nested.arr362` Array(UInt64), `nested.arr363` Array(UInt64), `nested.arr364` Array(UInt64), `nested.arr365` Array(UInt64), `nested.arr366` Array(UInt64), `nested.arr367` Array(UInt64), `nested.arr368` Array(UInt64), `nested.arr369` Array(UInt64), `nested.arr370` Array(UInt64), `nested.arr371` Array(UInt64), `nested.arr372` Array(UInt64), `nested.arr373` Array(UInt64), `nested.arr374` Array(UInt64), `nested.arr375` Array(UInt64), `nested.arr376` Array(UInt64), `nested.arr377` Array(UInt64), `nested.arr378` Array(UInt64), `nested.arr379` Array(UInt64), `nested.arr380` Array(UInt64), `nested.arr381` Array(UInt64), `nested.arr382` Array(UInt64), `nested.arr383` Array(UInt64), `nested.arr384` Array(UInt64), `nested.arr385` Array(UInt64), `nested.arr386` Array(UInt64), `nested.arr387` Array(UInt64), `nested.arr388` Array(UInt64), `nested.arr389` Array(UInt64), `nested.arr390` Array(UInt64), `nested.arr391` Array(UInt64), `nested.arr392` Array(UInt64), `nested.arr393` Array(UInt64), `nested.arr394` Array(UInt64), `nested.arr395` Array(UInt64), `nested.arr396` Array(UInt64), `nested.arr397` Array(UInt64), `nested.arr398` Array(UInt64), `nested.arr399` Array(UInt64), + `nested.arr400` Array(UInt64), `nested.arr401` Array(UInt64), `nested.arr402` Array(UInt64), `nested.arr403` Array(UInt64), `nested.arr404` Array(UInt64), `nested.arr405` Array(UInt64), `nested.arr406` Array(UInt64), `nested.arr407` Array(UInt64), `nested.arr408` Array(UInt64), `nested.arr409` Array(UInt64), `nested.arr410` Array(UInt64), `nested.arr411` Array(UInt64), `nested.arr412` Array(UInt64), `nested.arr413` Array(UInt64), `nested.arr414` Array(UInt64), `nested.arr415` Array(UInt64), `nested.arr416` Array(UInt64), `nested.arr417` Array(UInt64), `nested.arr418` Array(UInt64), `nested.arr419` Array(UInt64), `nested.arr420` Array(UInt64), `nested.arr421` Array(UInt64), `nested.arr422` Array(UInt64), `nested.arr423` Array(UInt64), `nested.arr424` Array(UInt64), `nested.arr425` Array(UInt64), `nested.arr426` Array(UInt64), `nested.arr427` Array(UInt64), `nested.arr428` Array(UInt64), `nested.arr429` Array(UInt64), `nested.arr430` Array(UInt64), `nested.arr431` Array(UInt64), `nested.arr432` Array(UInt64), `nested.arr433` Array(UInt64), `nested.arr434` Array(UInt64), `nested.arr435` Array(UInt64), `nested.arr436` Array(UInt64), `nested.arr437` Array(UInt64), `nested.arr438` Array(UInt64), `nested.arr439` Array(UInt64), `nested.arr440` Array(UInt64), `nested.arr441` Array(UInt64), `nested.arr442` Array(UInt64), `nested.arr443` Array(UInt64), `nested.arr444` Array(UInt64), `nested.arr445` Array(UInt64), `nested.arr446` Array(UInt64), `nested.arr447` Array(UInt64), `nested.arr448` Array(UInt64), `nested.arr449` Array(UInt64), `nested.arr450` Array(UInt64), `nested.arr451` Array(UInt64), `nested.arr452` Array(UInt64), `nested.arr453` Array(UInt64), `nested.arr454` Array(UInt64), `nested.arr455` Array(UInt64), `nested.arr456` Array(UInt64), `nested.arr457` Array(UInt64), `nested.arr458` Array(UInt64), `nested.arr459` Array(UInt64), `nested.arr460` Array(UInt64), `nested.arr461` Array(UInt64), `nested.arr462` Array(UInt64), `nested.arr463` Array(UInt64), `nested.arr464` Array(UInt64), `nested.arr465` Array(UInt64), `nested.arr466` Array(UInt64), `nested.arr467` Array(UInt64), `nested.arr468` Array(UInt64), `nested.arr469` Array(UInt64), `nested.arr470` Array(UInt64), `nested.arr471` Array(UInt64), `nested.arr472` Array(UInt64), `nested.arr473` Array(UInt64), `nested.arr474` Array(UInt64), `nested.arr475` Array(UInt64), `nested.arr476` Array(UInt64), `nested.arr477` Array(UInt64), `nested.arr478` Array(UInt64), `nested.arr479` Array(UInt64), `nested.arr480` Array(UInt64), `nested.arr481` Array(UInt64), `nested.arr482` Array(UInt64), `nested.arr483` Array(UInt64), `nested.arr484` Array(UInt64), `nested.arr485` Array(UInt64), `nested.arr486` Array(UInt64), `nested.arr487` Array(UInt64), `nested.arr488` Array(UInt64), `nested.arr489` Array(UInt64), `nested.arr490` Array(UInt64), `nested.arr491` Array(UInt64), `nested.arr492` Array(UInt64), `nested.arr493` Array(UInt64), `nested.arr494` Array(UInt64), `nested.arr495` Array(UInt64), `nested.arr496` Array(UInt64), `nested.arr497` Array(UInt64), `nested.arr498` Array(UInt64), `nested.arr499` Array(UInt64), + arr500 Array(Array(Nullable(UInt64))), arr501 Array(Array(Nullable(UInt64))), arr502 Array(Array(Nullable(UInt64))), arr503 Array(Array(Nullable(UInt64))), arr504 Array(Array(Nullable(UInt64))), arr505 Array(Array(Nullable(UInt64))), arr506 Array(Array(Nullable(UInt64))), arr507 Array(Array(Nullable(UInt64))), arr508 Array(Array(Nullable(UInt64))), arr509 Array(Array(Nullable(UInt64))), arr510 Array(Array(Nullable(UInt64))), arr511 Array(Array(Nullable(UInt64))), arr512 Array(Array(Nullable(UInt64))), arr513 Array(Array(Nullable(UInt64))), arr514 Array(Array(Nullable(UInt64))), arr515 Array(Array(Nullable(UInt64))), arr516 Array(Array(Nullable(UInt64))), arr517 Array(Array(Nullable(UInt64))), arr518 Array(Array(Nullable(UInt64))), arr519 Array(Array(Nullable(UInt64))), arr520 Array(Array(Nullable(UInt64))), arr521 Array(Array(Nullable(UInt64))), arr522 Array(Array(Nullable(UInt64))), arr523 Array(Array(Nullable(UInt64))), arr524 Array(Array(Nullable(UInt64))), arr525 Array(Array(Nullable(UInt64))), arr526 Array(Array(Nullable(UInt64))), arr527 Array(Array(Nullable(UInt64))), arr528 Array(Array(Nullable(UInt64))), arr529 Array(Array(Nullable(UInt64))), arr530 Array(Array(Nullable(UInt64))), arr531 Array(Array(Nullable(UInt64))), arr532 Array(Array(Nullable(UInt64))), arr533 Array(Array(Nullable(UInt64))), arr534 Array(Array(Nullable(UInt64))), arr535 Array(Array(Nullable(UInt64))), arr536 Array(Array(Nullable(UInt64))), arr537 Array(Array(Nullable(UInt64))), arr538 Array(Array(Nullable(UInt64))), arr539 Array(Array(Nullable(UInt64))), arr540 Array(Array(Nullable(UInt64))), arr541 Array(Array(Nullable(UInt64))), arr542 Array(Array(Nullable(UInt64))), arr543 Array(Array(Nullable(UInt64))), arr544 Array(Array(Nullable(UInt64))), arr545 Array(Array(Nullable(UInt64))), arr546 Array(Array(Nullable(UInt64))), arr547 Array(Array(Nullable(UInt64))), arr548 Array(Array(Nullable(UInt64))), arr549 Array(Array(Nullable(UInt64))), arr550 Array(Array(Nullable(UInt64))), arr551 Array(Array(Nullable(UInt64))), arr552 Array(Array(Nullable(UInt64))), arr553 Array(Array(Nullable(UInt64))), arr554 Array(Array(Nullable(UInt64))), arr555 Array(Array(Nullable(UInt64))), arr556 Array(Array(Nullable(UInt64))), arr557 Array(Array(Nullable(UInt64))), arr558 Array(Array(Nullable(UInt64))), arr559 Array(Array(Nullable(UInt64))), arr560 Array(Array(Nullable(UInt64))), arr561 Array(Array(Nullable(UInt64))), arr562 Array(Array(Nullable(UInt64))), arr563 Array(Array(Nullable(UInt64))), arr564 Array(Array(Nullable(UInt64))), arr565 Array(Array(Nullable(UInt64))), arr566 Array(Array(Nullable(UInt64))), arr567 Array(Array(Nullable(UInt64))), arr568 Array(Array(Nullable(UInt64))), arr569 Array(Array(Nullable(UInt64))), arr570 Array(Array(Nullable(UInt64))), arr571 Array(Array(Nullable(UInt64))), arr572 Array(Array(Nullable(UInt64))), arr573 Array(Array(Nullable(UInt64))), arr574 Array(Array(Nullable(UInt64))), arr575 Array(Array(Nullable(UInt64))), arr576 Array(Array(Nullable(UInt64))), arr577 Array(Array(Nullable(UInt64))), arr578 Array(Array(Nullable(UInt64))), arr579 Array(Array(Nullable(UInt64))), arr580 Array(Array(Nullable(UInt64))), arr581 Array(Array(Nullable(UInt64))), arr582 Array(Array(Nullable(UInt64))), arr583 Array(Array(Nullable(UInt64))), arr584 Array(Array(Nullable(UInt64))), arr585 Array(Array(Nullable(UInt64))), arr586 Array(Array(Nullable(UInt64))), arr587 Array(Array(Nullable(UInt64))), arr588 Array(Array(Nullable(UInt64))), arr589 Array(Array(Nullable(UInt64))), arr590 Array(Array(Nullable(UInt64))), arr591 Array(Array(Nullable(UInt64))), arr592 Array(Array(Nullable(UInt64))), arr593 Array(Array(Nullable(UInt64))), arr594 Array(Array(Nullable(UInt64))), arr595 Array(Array(Nullable(UInt64))), arr596 Array(Array(Nullable(UInt64))), arr597 Array(Array(Nullable(UInt64))), arr598 Array(Array(Nullable(UInt64))), arr599 Array(Array(Nullable(UInt64))), + arr600 Array(Array(Nullable(UInt64))), arr601 Array(Array(Nullable(UInt64))), arr602 Array(Array(Nullable(UInt64))), arr603 Array(Array(Nullable(UInt64))), arr604 Array(Array(Nullable(UInt64))), arr605 Array(Array(Nullable(UInt64))), arr606 Array(Array(Nullable(UInt64))), arr607 Array(Array(Nullable(UInt64))), arr608 Array(Array(Nullable(UInt64))), arr609 Array(Array(Nullable(UInt64))), arr610 Array(Array(Nullable(UInt64))), arr611 Array(Array(Nullable(UInt64))), arr612 Array(Array(Nullable(UInt64))), arr613 Array(Array(Nullable(UInt64))), arr614 Array(Array(Nullable(UInt64))), arr615 Array(Array(Nullable(UInt64))), arr616 Array(Array(Nullable(UInt64))), arr617 Array(Array(Nullable(UInt64))), arr618 Array(Array(Nullable(UInt64))), arr619 Array(Array(Nullable(UInt64))), arr620 Array(Array(Nullable(UInt64))), arr621 Array(Array(Nullable(UInt64))), arr622 Array(Array(Nullable(UInt64))), arr623 Array(Array(Nullable(UInt64))), arr624 Array(Array(Nullable(UInt64))), arr625 Array(Array(Nullable(UInt64))), arr626 Array(Array(Nullable(UInt64))), arr627 Array(Array(Nullable(UInt64))), arr628 Array(Array(Nullable(UInt64))), arr629 Array(Array(Nullable(UInt64))), arr630 Array(Array(Nullable(UInt64))), arr631 Array(Array(Nullable(UInt64))), arr632 Array(Array(Nullable(UInt64))), arr633 Array(Array(Nullable(UInt64))), arr634 Array(Array(Nullable(UInt64))), arr635 Array(Array(Nullable(UInt64))), arr636 Array(Array(Nullable(UInt64))), arr637 Array(Array(Nullable(UInt64))), arr638 Array(Array(Nullable(UInt64))), arr639 Array(Array(Nullable(UInt64))), arr640 Array(Array(Nullable(UInt64))), arr641 Array(Array(Nullable(UInt64))), arr642 Array(Array(Nullable(UInt64))), arr643 Array(Array(Nullable(UInt64))), arr644 Array(Array(Nullable(UInt64))), arr645 Array(Array(Nullable(UInt64))), arr646 Array(Array(Nullable(UInt64))), arr647 Array(Array(Nullable(UInt64))), arr648 Array(Array(Nullable(UInt64))), arr649 Array(Array(Nullable(UInt64))), arr650 Array(Array(Nullable(UInt64))), arr651 Array(Array(Nullable(UInt64))), arr652 Array(Array(Nullable(UInt64))), arr653 Array(Array(Nullable(UInt64))), arr654 Array(Array(Nullable(UInt64))), arr655 Array(Array(Nullable(UInt64))), arr656 Array(Array(Nullable(UInt64))), arr657 Array(Array(Nullable(UInt64))), arr658 Array(Array(Nullable(UInt64))), arr659 Array(Array(Nullable(UInt64))), arr660 Array(Array(Nullable(UInt64))), arr661 Array(Array(Nullable(UInt64))), arr662 Array(Array(Nullable(UInt64))), arr663 Array(Array(Nullable(UInt64))), arr664 Array(Array(Nullable(UInt64))), arr665 Array(Array(Nullable(UInt64))), arr666 Array(Array(Nullable(UInt64))), arr667 Array(Array(Nullable(UInt64))), arr668 Array(Array(Nullable(UInt64))), arr669 Array(Array(Nullable(UInt64))), arr670 Array(Array(Nullable(UInt64))), arr671 Array(Array(Nullable(UInt64))), arr672 Array(Array(Nullable(UInt64))), arr673 Array(Array(Nullable(UInt64))), arr674 Array(Array(Nullable(UInt64))), arr675 Array(Array(Nullable(UInt64))), arr676 Array(Array(Nullable(UInt64))), arr677 Array(Array(Nullable(UInt64))), arr678 Array(Array(Nullable(UInt64))), arr679 Array(Array(Nullable(UInt64))), arr680 Array(Array(Nullable(UInt64))), arr681 Array(Array(Nullable(UInt64))), arr682 Array(Array(Nullable(UInt64))), arr683 Array(Array(Nullable(UInt64))), arr684 Array(Array(Nullable(UInt64))), arr685 Array(Array(Nullable(UInt64))), arr686 Array(Array(Nullable(UInt64))), arr687 Array(Array(Nullable(UInt64))), arr688 Array(Array(Nullable(UInt64))), arr689 Array(Array(Nullable(UInt64))), arr690 Array(Array(Nullable(UInt64))), arr691 Array(Array(Nullable(UInt64))), arr692 Array(Array(Nullable(UInt64))), arr693 Array(Array(Nullable(UInt64))), arr694 Array(Array(Nullable(UInt64))), arr695 Array(Array(Nullable(UInt64))), arr696 Array(Array(Nullable(UInt64))), arr697 Array(Array(Nullable(UInt64))), arr698 Array(Array(Nullable(UInt64))), arr699 Array(Array(Nullable(UInt64))), + arr700 Array(Array(Nullable(UInt64))), arr701 Array(Array(Nullable(UInt64))), arr702 Array(Array(Nullable(UInt64))), arr703 Array(Array(Nullable(UInt64))), arr704 Array(Array(Nullable(UInt64))), arr705 Array(Array(Nullable(UInt64))), arr706 Array(Array(Nullable(UInt64))), arr707 Array(Array(Nullable(UInt64))), arr708 Array(Array(Nullable(UInt64))), arr709 Array(Array(Nullable(UInt64))), arr710 Array(Array(Nullable(UInt64))), arr711 Array(Array(Nullable(UInt64))), arr712 Array(Array(Nullable(UInt64))), arr713 Array(Array(Nullable(UInt64))), arr714 Array(Array(Nullable(UInt64))), arr715 Array(Array(Nullable(UInt64))), arr716 Array(Array(Nullable(UInt64))), arr717 Array(Array(Nullable(UInt64))), arr718 Array(Array(Nullable(UInt64))), arr719 Array(Array(Nullable(UInt64))), arr720 Array(Array(Nullable(UInt64))), arr721 Array(Array(Nullable(UInt64))), arr722 Array(Array(Nullable(UInt64))), arr723 Array(Array(Nullable(UInt64))), arr724 Array(Array(Nullable(UInt64))), arr725 Array(Array(Nullable(UInt64))), arr726 Array(Array(Nullable(UInt64))), arr727 Array(Array(Nullable(UInt64))), arr728 Array(Array(Nullable(UInt64))), arr729 Array(Array(Nullable(UInt64))), arr730 Array(Array(Nullable(UInt64))), arr731 Array(Array(Nullable(UInt64))), arr732 Array(Array(Nullable(UInt64))), arr733 Array(Array(Nullable(UInt64))), arr734 Array(Array(Nullable(UInt64))), arr735 Array(Array(Nullable(UInt64))), arr736 Array(Array(Nullable(UInt64))), arr737 Array(Array(Nullable(UInt64))), arr738 Array(Array(Nullable(UInt64))), arr739 Array(Array(Nullable(UInt64))), arr740 Array(Array(Nullable(UInt64))), arr741 Array(Array(Nullable(UInt64))), arr742 Array(Array(Nullable(UInt64))), arr743 Array(Array(Nullable(UInt64))), arr744 Array(Array(Nullable(UInt64))), arr745 Array(Array(Nullable(UInt64))), arr746 Array(Array(Nullable(UInt64))), arr747 Array(Array(Nullable(UInt64))), arr748 Array(Array(Nullable(UInt64))), arr749 Array(Array(Nullable(UInt64))), arr750 Array(Array(Nullable(UInt64))), arr751 Array(Array(Nullable(UInt64))), arr752 Array(Array(Nullable(UInt64))), arr753 Array(Array(Nullable(UInt64))), arr754 Array(Array(Nullable(UInt64))), arr755 Array(Array(Nullable(UInt64))), arr756 Array(Array(Nullable(UInt64))), arr757 Array(Array(Nullable(UInt64))), arr758 Array(Array(Nullable(UInt64))), arr759 Array(Array(Nullable(UInt64))), arr760 Array(Array(Nullable(UInt64))), arr761 Array(Array(Nullable(UInt64))), arr762 Array(Array(Nullable(UInt64))), arr763 Array(Array(Nullable(UInt64))), arr764 Array(Array(Nullable(UInt64))), arr765 Array(Array(Nullable(UInt64))), arr766 Array(Array(Nullable(UInt64))), arr767 Array(Array(Nullable(UInt64))), arr768 Array(Array(Nullable(UInt64))), arr769 Array(Array(Nullable(UInt64))), arr770 Array(Array(Nullable(UInt64))), arr771 Array(Array(Nullable(UInt64))), arr772 Array(Array(Nullable(UInt64))), arr773 Array(Array(Nullable(UInt64))), arr774 Array(Array(Nullable(UInt64))), arr775 Array(Array(Nullable(UInt64))), arr776 Array(Array(Nullable(UInt64))), arr777 Array(Array(Nullable(UInt64))), arr778 Array(Array(Nullable(UInt64))), arr779 Array(Array(Nullable(UInt64))), arr780 Array(Array(Nullable(UInt64))), arr781 Array(Array(Nullable(UInt64))), arr782 Array(Array(Nullable(UInt64))), arr783 Array(Array(Nullable(UInt64))), arr784 Array(Array(Nullable(UInt64))), arr785 Array(Array(Nullable(UInt64))), arr786 Array(Array(Nullable(UInt64))), arr787 Array(Array(Nullable(UInt64))), arr788 Array(Array(Nullable(UInt64))), arr789 Array(Array(Nullable(UInt64))), arr790 Array(Array(Nullable(UInt64))), arr791 Array(Array(Nullable(UInt64))), arr792 Array(Array(Nullable(UInt64))), arr793 Array(Array(Nullable(UInt64))), arr794 Array(Array(Nullable(UInt64))), arr795 Array(Array(Nullable(UInt64))), arr796 Array(Array(Nullable(UInt64))), arr797 Array(Array(Nullable(UInt64))), arr798 Array(Array(Nullable(UInt64))), arr799 Array(Array(Nullable(UInt64))), + arr800 Array(Array(Nullable(UInt64))), arr801 Array(Array(Nullable(UInt64))), arr802 Array(Array(Nullable(UInt64))), arr803 Array(Array(Nullable(UInt64))), arr804 Array(Array(Nullable(UInt64))), arr805 Array(Array(Nullable(UInt64))), arr806 Array(Array(Nullable(UInt64))), arr807 Array(Array(Nullable(UInt64))), arr808 Array(Array(Nullable(UInt64))), arr809 Array(Array(Nullable(UInt64))), arr810 Array(Array(Nullable(UInt64))), arr811 Array(Array(Nullable(UInt64))), arr812 Array(Array(Nullable(UInt64))), arr813 Array(Array(Nullable(UInt64))), arr814 Array(Array(Nullable(UInt64))), arr815 Array(Array(Nullable(UInt64))), arr816 Array(Array(Nullable(UInt64))), arr817 Array(Array(Nullable(UInt64))), arr818 Array(Array(Nullable(UInt64))), arr819 Array(Array(Nullable(UInt64))), arr820 Array(Array(Nullable(UInt64))), arr821 Array(Array(Nullable(UInt64))), arr822 Array(Array(Nullable(UInt64))), arr823 Array(Array(Nullable(UInt64))), arr824 Array(Array(Nullable(UInt64))), arr825 Array(Array(Nullable(UInt64))), arr826 Array(Array(Nullable(UInt64))), arr827 Array(Array(Nullable(UInt64))), arr828 Array(Array(Nullable(UInt64))), arr829 Array(Array(Nullable(UInt64))), arr830 Array(Array(Nullable(UInt64))), arr831 Array(Array(Nullable(UInt64))), arr832 Array(Array(Nullable(UInt64))), arr833 Array(Array(Nullable(UInt64))), arr834 Array(Array(Nullable(UInt64))), arr835 Array(Array(Nullable(UInt64))), arr836 Array(Array(Nullable(UInt64))), arr837 Array(Array(Nullable(UInt64))), arr838 Array(Array(Nullable(UInt64))), arr839 Array(Array(Nullable(UInt64))), arr840 Array(Array(Nullable(UInt64))), arr841 Array(Array(Nullable(UInt64))), arr842 Array(Array(Nullable(UInt64))), arr843 Array(Array(Nullable(UInt64))), arr844 Array(Array(Nullable(UInt64))), arr845 Array(Array(Nullable(UInt64))), arr846 Array(Array(Nullable(UInt64))), arr847 Array(Array(Nullable(UInt64))), arr848 Array(Array(Nullable(UInt64))), arr849 Array(Array(Nullable(UInt64))), arr850 Array(Array(Nullable(UInt64))), arr851 Array(Array(Nullable(UInt64))), arr852 Array(Array(Nullable(UInt64))), arr853 Array(Array(Nullable(UInt64))), arr854 Array(Array(Nullable(UInt64))), arr855 Array(Array(Nullable(UInt64))), arr856 Array(Array(Nullable(UInt64))), arr857 Array(Array(Nullable(UInt64))), arr858 Array(Array(Nullable(UInt64))), arr859 Array(Array(Nullable(UInt64))), arr860 Array(Array(Nullable(UInt64))), arr861 Array(Array(Nullable(UInt64))), arr862 Array(Array(Nullable(UInt64))), arr863 Array(Array(Nullable(UInt64))), arr864 Array(Array(Nullable(UInt64))), arr865 Array(Array(Nullable(UInt64))), arr866 Array(Array(Nullable(UInt64))), arr867 Array(Array(Nullable(UInt64))), arr868 Array(Array(Nullable(UInt64))), arr869 Array(Array(Nullable(UInt64))), arr870 Array(Array(Nullable(UInt64))), arr871 Array(Array(Nullable(UInt64))), arr872 Array(Array(Nullable(UInt64))), arr873 Array(Array(Nullable(UInt64))), arr874 Array(Array(Nullable(UInt64))), arr875 Array(Array(Nullable(UInt64))), arr876 Array(Array(Nullable(UInt64))), arr877 Array(Array(Nullable(UInt64))), arr878 Array(Array(Nullable(UInt64))), arr879 Array(Array(Nullable(UInt64))), arr880 Array(Array(Nullable(UInt64))), arr881 Array(Array(Nullable(UInt64))), arr882 Array(Array(Nullable(UInt64))), arr883 Array(Array(Nullable(UInt64))), arr884 Array(Array(Nullable(UInt64))), arr885 Array(Array(Nullable(UInt64))), arr886 Array(Array(Nullable(UInt64))), arr887 Array(Array(Nullable(UInt64))), arr888 Array(Array(Nullable(UInt64))), arr889 Array(Array(Nullable(UInt64))), arr890 Array(Array(Nullable(UInt64))), arr891 Array(Array(Nullable(UInt64))), arr892 Array(Array(Nullable(UInt64))), arr893 Array(Array(Nullable(UInt64))), arr894 Array(Array(Nullable(UInt64))), arr895 Array(Array(Nullable(UInt64))), arr896 Array(Array(Nullable(UInt64))), arr897 Array(Array(Nullable(UInt64))), arr898 Array(Array(Nullable(UInt64))), arr899 Array(Array(Nullable(UInt64))), + arr900 Array(Array(Nullable(UInt64))), arr901 Array(Array(Nullable(UInt64))), arr902 Array(Array(Nullable(UInt64))), arr903 Array(Array(Nullable(UInt64))), arr904 Array(Array(Nullable(UInt64))), arr905 Array(Array(Nullable(UInt64))), arr906 Array(Array(Nullable(UInt64))), arr907 Array(Array(Nullable(UInt64))), arr908 Array(Array(Nullable(UInt64))), arr909 Array(Array(Nullable(UInt64))), arr910 Array(Array(Nullable(UInt64))), arr911 Array(Array(Nullable(UInt64))), arr912 Array(Array(Nullable(UInt64))), arr913 Array(Array(Nullable(UInt64))), arr914 Array(Array(Nullable(UInt64))), arr915 Array(Array(Nullable(UInt64))), arr916 Array(Array(Nullable(UInt64))), arr917 Array(Array(Nullable(UInt64))), arr918 Array(Array(Nullable(UInt64))), arr919 Array(Array(Nullable(UInt64))), arr920 Array(Array(Nullable(UInt64))), arr921 Array(Array(Nullable(UInt64))), arr922 Array(Array(Nullable(UInt64))), arr923 Array(Array(Nullable(UInt64))), arr924 Array(Array(Nullable(UInt64))), arr925 Array(Array(Nullable(UInt64))), arr926 Array(Array(Nullable(UInt64))), arr927 Array(Array(Nullable(UInt64))), arr928 Array(Array(Nullable(UInt64))), arr929 Array(Array(Nullable(UInt64))), arr930 Array(Array(Nullable(UInt64))), arr931 Array(Array(Nullable(UInt64))), arr932 Array(Array(Nullable(UInt64))), arr933 Array(Array(Nullable(UInt64))), arr934 Array(Array(Nullable(UInt64))), arr935 Array(Array(Nullable(UInt64))), arr936 Array(Array(Nullable(UInt64))), arr937 Array(Array(Nullable(UInt64))), arr938 Array(Array(Nullable(UInt64))), arr939 Array(Array(Nullable(UInt64))), arr940 Array(Array(Nullable(UInt64))), arr941 Array(Array(Nullable(UInt64))), arr942 Array(Array(Nullable(UInt64))), arr943 Array(Array(Nullable(UInt64))), arr944 Array(Array(Nullable(UInt64))), arr945 Array(Array(Nullable(UInt64))), arr946 Array(Array(Nullable(UInt64))), arr947 Array(Array(Nullable(UInt64))), arr948 Array(Array(Nullable(UInt64))), arr949 Array(Array(Nullable(UInt64))), arr950 Array(Array(Nullable(UInt64))), arr951 Array(Array(Nullable(UInt64))), arr952 Array(Array(Nullable(UInt64))), arr953 Array(Array(Nullable(UInt64))), arr954 Array(Array(Nullable(UInt64))), arr955 Array(Array(Nullable(UInt64))), arr956 Array(Array(Nullable(UInt64))), arr957 Array(Array(Nullable(UInt64))), arr958 Array(Array(Nullable(UInt64))), arr959 Array(Array(Nullable(UInt64))), arr960 Array(Array(Nullable(UInt64))), arr961 Array(Array(Nullable(UInt64))), arr962 Array(Array(Nullable(UInt64))), arr963 Array(Array(Nullable(UInt64))), arr964 Array(Array(Nullable(UInt64))), arr965 Array(Array(Nullable(UInt64))), arr966 Array(Array(Nullable(UInt64))), arr967 Array(Array(Nullable(UInt64))), arr968 Array(Array(Nullable(UInt64))), arr969 Array(Array(Nullable(UInt64))), arr970 Array(Array(Nullable(UInt64))), arr971 Array(Array(Nullable(UInt64))), arr972 Array(Array(Nullable(UInt64))), arr973 Array(Array(Nullable(UInt64))), arr974 Array(Array(Nullable(UInt64))), arr975 Array(Array(Nullable(UInt64))), arr976 Array(Array(Nullable(UInt64))), arr977 Array(Array(Nullable(UInt64))), arr978 Array(Array(Nullable(UInt64))), arr979 Array(Array(Nullable(UInt64))), arr980 Array(Array(Nullable(UInt64))), arr981 Array(Array(Nullable(UInt64))), arr982 Array(Array(Nullable(UInt64))), arr983 Array(Array(Nullable(UInt64))), arr984 Array(Array(Nullable(UInt64))), arr985 Array(Array(Nullable(UInt64))), arr986 Array(Array(Nullable(UInt64))), arr987 Array(Array(Nullable(UInt64))), arr988 Array(Array(Nullable(UInt64))), arr989 Array(Array(Nullable(UInt64))), arr990 Array(Array(Nullable(UInt64))), arr991 Array(Array(Nullable(UInt64))), arr992 Array(Array(Nullable(UInt64))), arr993 Array(Array(Nullable(UInt64))), arr994 Array(Array(Nullable(UInt64))), arr995 Array(Array(Nullable(UInt64))), arr996 Array(Array(Nullable(UInt64))), arr997 Array(Array(Nullable(UInt64))), arr998 Array(Array(Nullable(UInt64))), arr999 Array(Array(Nullable(UInt64)))) + ENGINE = MergeTree ORDER BY id PARTITION BY id % 100 + + + INSERT INTO lot_of_arrays(id) SELECT number FROM numbers(1000) + OPTIMIZE TABLE lot_of_arrays FINAL + + SELECT nested.arr0 FROM lot_of_arrays WHERE id > 10 FORMAT Null + + DROP TABLE IF EXISTS lot_of_arrays + diff --git a/tests/performance/nlp.xml b/tests/performance/nlp.xml new file mode 100644 index 00000000000..07eda93c686 --- /dev/null +++ b/tests/performance/nlp.xml @@ -0,0 +1,20 @@ + + + 1 + + + + hits_100m_single + + + CREATE TABLE hits_100m_words (words Array(String), UserID UInt64) ENGINE Memory + INSERT INTO hits_100m_words SELECT splitByNonAlpha(SearchPhrase) AS words, UserID FROM hits_100m_single WHERE length(words) > 0 + + SELECT splitByNonAlpha(SearchPhrase) FROM hits_100m_single FORMAT Null + SELECT splitByWhitespace(SearchPhrase) FROM hits_100m_single FORMAT Null + + SELECT arrayMap(x -> stem('ru', x), words) FROM hits_100m_words FORMAT Null + + DROP TABLE IF EXISTS hits_100m_words + DROP TABLE IF EXISTS hits_100m_words_ws + diff --git a/tests/performance/short_circuit_functions.xml b/tests/performance/short_circuit_functions.xml new file mode 100644 index 00000000000..eaac76538dc --- /dev/null +++ b/tests/performance/short_circuit_functions.xml @@ -0,0 +1,29 @@ + + SELECT if(number % 100, number, isValidUTF8(repeat(toString(number + 10), 100))) FROM numbers(10000000) FORMAT Null + SELECT multiIf(number % 100, number, isValidUTF8(repeat(toString(number + 10), 100))) FROM numbers(10000000) FORMAT Null + SELECT and(number % 100 == 0, isValidUTF8(repeat(toString(number + 10), 100))) FROM numbers(10000000) FORMAT Null + SELECT or(number % 100, isValidUTF8(repeat(toString(number + 10), 100))) FROM numbers(10000000) FORMAT Null + + SELECT if(number % 2, isValidUTF8(repeat(toString(number), 100)), isValidUTF8(repeat(toString(number + 10), 100))) FROM numbers(1000000) FORMAT Null + SELECT and(not isValidUTF8(repeat(toString(number), 100)), isValidUTF8(repeat(toString(number + 10), 100)), isValidUTF8(repeat(toString(number + 20), 100))) FROM numbers(1000000) FORMAT Null + SELECT isValidUTF8(repeat(toString(number), 100)) or isValidUTF8(repeat(toString(number + 10), 100)) or isValidUTF8(repeat(toString(number + 20), 100)) FROM numbers(1000000) FORMAT Null + SELECT multiIf(number >= 500000, isValidUTF8(repeat(toString(number), 100)), less(number, 50000), number * 2, isValidUTF8(repeat(toString(number + 10), 100))) FROM numbers(1000000) FORMAT Null + + SELECT toTypeName(isValidUTF8(repeat(toString(number), 100))) FROM numbers(1000000) FORMAT Null + SELECT toColumnTypeName(isValidUTF8(repeat(toString(number), 100))) FROM numbers(1000000) FORMAT Null + + SELECT if(isValidUTF8(repeat(toString(number), 10)), isValidUTF8(repeat(toString(number), 100)), isValidUTF8(repeat(toString(number + 10), 100))) FROM numbers(1000000) FORMAT Null + SELECT and(isValidUTF8(repeat(toString(number), 10)), not isValidUTF8(repeat(toString(number), 100)), isValidUTF8(repeat(toString(number + 10), 100))) FROM numbers(1000000) FORMAT Null + SELECT or(not isValidUTF8(repeat(toString(number), 100)), isValidUTF8(repeat(toString(number), 100)), isValidUTF8(repeat(toString(number + 10), 100))) FROM numbers(1000000) FORMAT Null + SELECT multiIf(isValidUTF8(repeat(toString(number), 100)), isValidUTF8(repeat(toString(number), 100)), isValidUTF8(repeat(toString(number + 10), 100))) FROM numbers(1000000) FORMAT Null + + SELECT if(number % 2, isValidUTF8(repeat(toString(number), 100)), isValidUTF8(repeat(toString(number), 100))) FROM numbers(1000000) FORMAT Null + SELECT multiIf(number % 2, isValidUTF8(repeat(toString(number), 100)), isValidUTF8(repeat(toString(number), 100))) FROM numbers(1000000) FORMAT Null + SELECT and(isValidUTF8(repeat(toString(number), 100)), isValidUTF8(repeat(toString(number), 10)), isValidUTF8(repeat(toString(number), 100))) from numbers(1000000) FORMAT Null + SELECT or(not isValidUTF8(repeat(toString(number), 100)), not isValidUTF8(repeat(toString(number), 100)), isValidUTF8(repeat(toString(number), 100))) from numbers(1000000) FORMAT Null + + SELECT if(number % 2, arraySum(bitPositionsToArray(number)), arraySum(bitPositionsToArray(number + 1))) FROM numbers(10000000) FORMAT Null + SELECT if(number % 5 == 0, arraySum(bitPositionsToArray(number)), 0) from numbers(10000000) FORMAT Null + SELECT if(number % 2, number + intDiv(number, number + 1), 3 + intDiv(number, number + 1)), if(number % 3 = 0, number, 4 + intDiv(number, number + 1)) FROM numbers(10000000) FORMAT Null + SELECT if(number % 5 == 0, toInt8OrZero(toString(number)), Null) FROM numbers(100000000) FORMAT Null + diff --git a/tests/performance/window_functions.xml b/tests/performance/window_functions.xml index 6be3d59e2b0..e3d30d96ec3 100644 --- a/tests/performance/window_functions.xml +++ b/tests/performance/window_functions.xml @@ -3,10 +3,6 @@ hits_100m_single - - 1 - - ... SELECT sum(n) from rich_syntax; + +-- Clear cache to avoid future errors in the logs +SYSTEM DROP DNS CACHE diff --git a/tests/queries/0_stateless/01087_storage_generate.reference b/tests/queries/0_stateless/01087_storage_generate.reference index 3680d8d943d..78c6784f7d2 100644 --- a/tests/queries/0_stateless/01087_storage_generate.reference +++ b/tests/queries/0_stateless/01087_storage_generate.reference @@ -4,7 +4,7 @@ [88] 34528.4014 ('2031-12-09 00:40:39.898','9ef777c8-de0e-d25e-e16c-5b624f88523c') [-1] 121968.7945 ('2060-02-05 09:18:12.011','7655e515-d2ca-2f06-0950-e4f44f69aca7') [-103,75] -135033.4349 ('2038-12-19 20:38:58.695','86b57d15-292d-2517-9acf-47cd053e7a3a') -[110] -202668.6900 ('2009-06-18 01:53:29.808','bc630f78-7d58-0c46-dd4b-27fc35625e96') +[110] -202668.69 ('2009-06-18 01:53:29.808','bc630f78-7d58-0c46-dd4b-27fc35625e96') [-22,2] 168636.9728 ('2074-09-03 09:20:20.936','7624ce27-9bff-4e9d-3f18-6851a97dd0ca') [-22,-62] -75192.4989 ('2085-10-11 21:51:12.855','a4c4d0ed-f448-244e-1723-ca1bba816f2b') [-2,-90] 133592.5064 ('2010-10-28 21:18:04.633','8ba9103b-f90c-b49b-38c1-223ae5f42bf7') @@ -25,23 +25,23 @@ [95,38] -65083.7371 ('2015-03-10 13:33:16.429','47bd199c-f99e-51ea-84e9-b65cce9d167c') [91,110,72] 130908.9643 ('2036-03-16 15:17:53.679','0dd4ca31-1e09-d7e0-f3df-60cad3cfa805') [] 208972.3779 ('2034-03-05 22:29:21.994','1069d77c-dfd2-912e-60b8-3c5b964f7e11') -[-32] 167938.5050 ('2093-09-10 20:39:39.050','9d1025b6-2d0c-1d84-dafd-02668eb29270') +[-32] 167938.505 ('2093-09-10 20:39:39.050','9d1025b6-2d0c-1d84-dafd-02668eb29270') [] 153744.6987 ('2088-10-02 11:02:11.024','a88e6cb7-2210-5ce5-6bcf-24afc0eca5b6') -[67] -74220.6650 ('2074-12-30 18:43:40.817','68096065-18c8-8aca-fd21-15330ead669d') +[67] -74220.665 ('2074-12-30 18:43:40.817','68096065-18c8-8aca-fd21-15330ead669d') [6] 66759.8938 ('2091-09-01 19:07:18.219','bb14f4cc-0b54-9a8c-e835-71333b28c03b') [-28,-82,9] 168625.3131 ('2002-03-20 21:02:30.321','405bb877-6e28-8b91-cb62-bd82a3fa797c') -[] -19760.1670 ('2044-11-08 07:52:03.325','13769348-9e58-0e75-3972-8bbadc150715') +[] -19760.167 ('2044-11-08 07:52:03.325','13769348-9e58-0e75-3972-8bbadc150715') [] 160663.7797 ('2025-04-12 13:17:53.501','e6370321-94f5-97e6-0348-a84e72ff5b42') [-17,18] 99105.9856 ('1972-05-01 12:23:11.688','02618b9e-97cd-4698-d2e8-3f52f4c5a09a') [86,77] -116990.3914 ('1981-12-31 05:06:54.198','3ac42bb4-8652-b1a8-10bb-98f0337261f8') [-109,69,-63] -151527.3587 ('2001-01-17 11:19:56.504','77fe7ee2-f279-2855-bfd2-a7d7cee678cc') [] -57762.3928 ('1978-08-16 18:47:37.660','ab9a110a-fd8d-3c4c-5a49-34c2005536ce') [-77] 107274.6407 ('2017-01-12 12:03:02.657','c1ad4f17-cc54-45f3-9410-9c1011653f6d') -[] 107133.6410 ('2050-10-05 06:29:27.154','36e576aa-c77f-994e-1925-4a4c40da3a0f') +[] 107133.641 ('2050-10-05 06:29:27.154','36e576aa-c77f-994e-1925-4a4c40da3a0f') [] 46672.2176 ('2094-01-21 20:25:39.144','e9ba850d-604e-bc7d-417c-1078e89d4615') [-87,-122,-65] -86258.4663 ('2081-06-17 03:37:45.498','64795221-9719-7937-b4d2-be5f30065ece') [-53] -48672.1424 ('1992-06-27 17:27:23.602','7c67bc31-c7bb-6197-fdca-f73329b976f2') -[34] -108954.7820 ('2096-07-03 23:06:30.632','9c1b37d7-4ced-9428-a0ae-34c5436b14c4') +[34] -108954.782 ('2096-07-03 23:06:30.632','9c1b37d7-4ced-9428-a0ae-34c5436b14c4') [] -168124.2364 ('1987-06-03 06:47:12.945','d1c39af4-f920-5095-b8e2-0f878950167b') [] -112431.4799 ('2021-07-26 07:04:58.527','da07a72d-7e1f-8890-4c4b-326835d11b39') [-35,-95,58] -181254.9139 ('2086-11-12 17:17:14.473','22f74d0b-dfc0-3f7a-33f4-8055d8fa7846') @@ -61,10 +61,10 @@ [-35,-58,-101] -9101.5369 ('2023-08-24 20:56:11.695','87fbe3f9-b1f0-c030-a4c0-8662045923b4') [-58,87] 122510.9099 ('2019-08-09 17:40:29.849','c1d3a2cc-878f-c2c3-4a0b-10e98cda8b4a') [4,19,58] -13496.8672 ('2027-05-01 09:11:48.659','8996ae31-d670-cbfe-b735-b16b7c3b3476') -[23,-75,-89] -51218.2860 ('2010-06-02 02:49:03.396','d32b8b61-cc3e-31fa-2a2a-abefa60bfcee') +[23,-75,-89] -51218.286 ('2010-06-02 02:49:03.396','d32b8b61-cc3e-31fa-2a2a-abefa60bfcee') [50] -45297.4315 ('2087-04-15 06:46:08.247','04fe9603-97fc-07a4-6248-0f21e408c884') [-23,17,63] 89185.9462 ('2065-10-26 08:27:12.817','a5fbf764-70b4-8b65-4a8f-7550abca3859') -[-6] -129925.3690 ('2013-11-05 07:44:45.233','11db26b3-e2b5-b9fa-6b0e-79c43a2e67ab') +[-6] -129925.369 ('2013-11-05 07:44:45.233','11db26b3-e2b5-b9fa-6b0e-79c43a2e67ab') [-72,-108] 203171.5475 ('2000-01-28 09:34:58.032','14d5399e-7949-20c7-0e47-85e2fce5836c') [-73,34,-27] 2676.7265 ('2057-10-25 14:37:10.049','00049a92-4350-badb-3764-dd7f019b9b31') [65,-7] -153472.9461 ('1973-04-12 02:34:41.245','e0a0324d-1552-d11e-f3a5-fbd822d206c5') @@ -73,13 +73,13 @@ [107] 9694.1102 ('1984-11-02 13:11:34.034','e973db18-07b7-2117-f3ba-e7002adfa939') [] -76460.9664 ('2051-02-10 09:54:42.143','b8344c22-9e8a-7052-c644-9c3e5989cdf1') [59,59,0] 27041.7606 ('2083-02-17 18:21:22.547','4d6b137b-a3e1-f36d-2c0c-c8d718dda388') -[-114] 133673.9630 ('2005-10-02 20:34:27.452','04785b75-30e5-af8b-547e-d15bcb7f49fb') -[43] -169861.2000 ('2006-12-13 09:26:13.923','cb865d38-d961-d7f9-acbb-583b9f31252f') +[-114] 133673.963 ('2005-10-02 20:34:27.452','04785b75-30e5-af8b-547e-d15bcb7f49fb') +[43] -169861.2 ('2006-12-13 09:26:13.923','cb865d38-d961-d7f9-acbb-583b9f31252f') [] 197115.2174 ('2060-04-08 04:17:00.488','0f26c4b4-b24c-1fd5-c619-31bcf71a4831') [-25] -200081.9506 ('2055-12-25 02:30:16.276','0b32ad69-2c84-4269-9718-e3171482878a') [14,110] -40196.4463 ('2084-08-13 19:37:07.588','ed882071-acba-b3ab-5d77-d79a9544a834') [-62,-71,-82] -154958.9747 ('2100-07-08 02:32:53.741','7711c7c1-0d22-e302-fc86-61ef5e68db96') -[96,-114,-101] 78910.3320 ('2100-07-19 15:02:27.109','756bfd26-c4b3-94b8-e991-c7ab7a833b76') +[96,-114,-101] 78910.332 ('2100-07-19 15:02:27.109','756bfd26-c4b3-94b8-e991-c7ab7a833b76') [49] 80117.2267 ('1970-07-04 03:50:56.748','aebac019-9054-4a77-2ccd-8801fc4a7496') [] 102078.4801 ('2055-01-07 01:22:33.624','21f2e59a-a1ca-5df3-27fd-aa95456cfbe5') [-106] -108728.4237 ('2020-05-27 11:56:18.121','6b7b6674-9342-2360-4cc0-f7ef8a2404de') @@ -91,13 +91,13 @@ [] 212557.3762 ('2069-03-03 07:21:08.439','9e676cac-36e6-2962-f7b1-578214f0dfbd') [-128,55] 80471.0777 ('1970-04-01 18:54:40.257','ca358854-416b-9c95-0b9b-c7fed7bb7cb5') [-30,-54] -132205.4512 ('2017-12-15 22:54:15.750','3558faa4-2d2f-c533-437f-1e03d3600f1d') -[-116,-72] -91499.6670 ('2105-09-23 21:06:17.755','07bb6e47-3234-c268-40d7-332388dc06f8') +[-116,-72] -91499.667 ('2105-09-23 21:06:17.755','07bb6e47-3234-c268-40d7-332388dc06f8') [] -201636.5228 ('2085-01-27 07:54:42.717','86c3bdc3-ff0f-1723-07c2-845aa3c02370') [-103,-39] 44330.7722 ('2064-07-02 11:08:28.068','0869c79d-6bdd-5d2d-a3d1-ffe13f6aa810') [99] -31035.5391 ('2093-07-26 01:50:23.026','aeb59338-254f-dc09-fbd7-263da415e211') [101] 157961.4729 ('2036-05-04 02:35:07.845','8b6221a9-8dad-4655-7460-6b3031b06893') [111] 84732.4403 ('1997-04-06 16:10:18.624','08806a79-59f4-c833-eedc-a200bb851767') -[9,-48] -190491.5590 ('2031-11-03 19:47:03.757','914e6166-c96e-e0e4-101a-0bb516cf5a2f') +[9,-48] -190491.559 ('2031-11-03 19:47:03.757','914e6166-c96e-e0e4-101a-0bb516cf5a2f') [-41] -132501.8311 ('2089-11-21 21:38:28.848','6de6cc8d-3c49-641e-fb12-87ed5ecb97b0') [77] 64903.6579 ('1985-04-17 17:08:03.998','26484b8a-f3f1-587f-7777-bc7a57a689c3') - diff --git a/tests/queries/0_stateless/01087_storage_generate.sql b/tests/queries/0_stateless/01087_storage_generate.sql index bc69e8abbac..a16ad55832c 100644 --- a/tests/queries/0_stateless/01087_storage_generate.sql +++ b/tests/queries/0_stateless/01087_storage_generate.sql @@ -7,7 +7,7 @@ DROP TABLE IF EXISTS test_table; SELECT '-'; DROP TABLE IF EXISTS test_table_2; -CREATE TABLE test_table_2(a Array(Int8), d Decimal32(4), c Tuple(DateTime64(3), UUID)) ENGINE=GenerateRandom(10, 5, 3); +CREATE TABLE test_table_2(a Array(Int8), d Decimal32(4), c Tuple(DateTime64(3, 'Europe/Moscow'), UUID)) ENGINE=GenerateRandom(10, 5, 3); SELECT * FROM test_table_2 LIMIT 100; diff --git a/tests/queries/0_stateless/01087_table_function_generate.reference b/tests/queries/0_stateless/01087_table_function_generate.reference index c04fa831328..ea4162e4840 100644 --- a/tests/queries/0_stateless/01087_table_function_generate.reference +++ b/tests/queries/0_stateless/01087_table_function_generate.reference @@ -46,7 +46,7 @@ h \N o - -Date DateTime DateTime(\'Europe/Moscow\') +Date DateTime(\'Europe/Moscow\') DateTime(\'Europe/Moscow\') 2113-06-12 2050-12-17 02:46:35 2096-02-16 22:18:22 2141-08-09 2013-10-17 23:35:26 1976-01-24 12:52:48 2039-08-16 1974-11-17 23:22:46 1980-03-04 21:02:50 @@ -58,7 +58,7 @@ Date DateTime DateTime(\'Europe/Moscow\') 2008-03-16 2047-05-16 23:28:36 2103-02-11 16:44:39 2000-07-07 2105-07-19 19:29:06 1980-01-02 05:18:22 - -DateTime64(3) DateTime64(6) DateTime64(6, \'Europe/Moscow\') +DateTime64(3, \'Europe/Moscow\') DateTime64(6, \'Europe/Moscow\') DateTime64(6, \'Europe/Moscow\') 1978-06-07 23:50:57.320 2013-08-28 10:21:54.010758 1991-08-25 16:23:26.140215 1978-08-25 17:07:25.427 2034-05-02 20:49:42.148578 2015-08-26 15:26:31.783160 2037-04-04 10:50:56.898 2055-05-28 11:12:48.819271 2068-12-26 09:58:49.635722 @@ -86,7 +86,7 @@ Decimal(9, 4) Decimal(18, 8) Decimal(18, 8) -18731.5032 81241713112.39967992 -10576027963457111164764.0798899532879521 65289.5061 -27889310937.24180887 5807515838469365530027.7612329616030438 -197586.1517 -751754543.85331084 3835903211857734974086.0358362773591932 -183596.0063 8217353434.41964030 13633006218585943284268.9826084812209912 +183596.0063 8217353434.4196403 13633006218585943284268.9826084812209912 73041.2674 -88881500366.49430454 -148702703925022894263.3187064158377476 101454.4494 -27768337.71540858 -634829280961262229789.4961995996929358 -174012.0101 -13636289325.35403038 -3611949395160064991369.2765012316944096 @@ -226,12 +226,12 @@ RL,{Xs\\tw [124] -114719.5228 ('2010-11-11 22:57:23.722','c1046ffb-3415-cc3a-509a-e0005856d7d7') - [] 1900051923 { -189530.5846 h -5.6279699579452485e47 ('1984-12-06','2028-08-17 06:05:01','2036-04-02 23:52:28.468','4b3d498c-dd44-95c1-5b75-921504ec5d8d') F743 -[-102,-118] 392272782 Eb -14818.0200 o -2.664492247169164e59 ('2082-12-26','2052-09-09 06:50:50','2088-04-21 05:07:08.245','aeb9c26e-0ee7-2b8e-802b-2a96319b8e60') CBF4 +[-102,-118] 392272782 Eb -14818.02 o -2.664492247169164e59 ('2082-12-26','2052-09-09 06:50:50','2088-04-21 05:07:08.245','aeb9c26e-0ee7-2b8e-802b-2a96319b8e60') CBF4 [-71] 775049089 \N -158115.1178 w 4.1323844687113747e-305 ('2108-04-19','2090-07-31 16:45:26','2076-07-10 09:11:06.385','57c69bc6-dddd-0975-e932-a7b5173a1304') EB1D [-28,100] 3675466147 { -146685.1749 h 3.6676044396877755e142 ('2017-10-25','2100-02-28 18:07:18','2055-10-14 06:36:20.056','14949dae-dfa8-a124-af83-887348b2f609') 6D88 [-23] 2514120753 (`u, -119659.6174 w 1.3231258347475906e34 ('2141-04-06','2074-08-10 06:25:12','1976-12-04 18:31:55.745','86a9b3c1-4593-4d56-7762-3aa1dd22cbbf') AD43 [11,-36] 3308237300 \N 171205.1896 \N 5.634708707075817e195 ('1974-10-31','1993-12-24 09:38:45','2038-07-15 05:22:51.805','63d999b8-8cca-e237-c4a4-4dd7d0096f65') 609E -[39] 1614362420 `4A8P 157144.0630 o -1.1843143253872814e-255 ('2147-08-18','2072-09-28 18:27:27','2073-07-10 12:19:58.146','6483f5c0-8733-364c-4fa0-9948d32e8903') A886 +[39] 1614362420 `4A8P 157144.063 o -1.1843143253872814e-255 ('2147-08-18','2072-09-28 18:27:27','2073-07-10 12:19:58.146','6483f5c0-8733-364c-4fa0-9948d32e8903') A886 [48,-120] 3848918261 1/dev/null; then + echo "@@SKIP@@: No qemu-x86_64-static" + exit 0 +fi + function run_with_cpu() { qemu-x86_64-static -cpu "$@" "$command" --query "SELECT 1" 2>&1 | grep -v -F "warning: TCG doesn't support requested feature" ||: diff --git a/tests/queries/0_stateless/01107_join_right_table_totals.reference b/tests/queries/0_stateless/01107_join_right_table_totals.reference index f71d3b0d05f..daf503b776d 100644 --- a/tests/queries/0_stateless/01107_join_right_table_totals.reference +++ b/tests/queries/0_stateless/01107_join_right_table_totals.reference @@ -18,3 +18,31 @@ 0 0 0 0 +1 1 +1 1 + +0 0 +1 1 +1 1 + +0 0 +1 1 +1 1 + +0 0 +1 1 +1 1 + +0 0 +1 1 + +0 0 +1 foo 1 1 300 + +0 foo 1 0 300 +1 100 1970-01-01 1 100 1970-01-01 +1 100 1970-01-01 1 200 1970-01-02 +1 200 1970-01-02 1 100 1970-01-01 +1 200 1970-01-02 1 200 1970-01-02 + +0 0 1970-01-01 0 0 1970-01-01 diff --git a/tests/queries/0_stateless/01107_join_right_table_totals.sql b/tests/queries/0_stateless/01107_join_right_table_totals.sql index a4f284e5e2d..f894b6bf8bb 100644 --- a/tests/queries/0_stateless/01107_join_right_table_totals.sql +++ b/tests/queries/0_stateless/01107_join_right_table_totals.sql @@ -35,29 +35,66 @@ FULL JOIN ) rr USING (id); -SELECT id, yago +SELECT id, yago FROM ( SELECT item_id AS id FROM t GROUP BY id ) AS ll -FULL OUTER JOIN ( SELECT item_id AS id, arrayJoin([111, 222, 333, 444]), SUM(price_sold) AS yago FROM t GROUP BY id WITH TOTALS ) AS rr +FULL OUTER JOIN ( SELECT item_id AS id, arrayJoin([111, 222, 333, 444]), SUM(price_sold) AS yago FROM t GROUP BY id WITH TOTALS ) AS rr USING (id); -SELECT id, yago +SELECT id, yago FROM ( SELECT item_id AS id, arrayJoin([111, 222, 333]) FROM t GROUP BY id WITH TOTALS ) AS ll -FULL OUTER JOIN ( SELECT item_id AS id, SUM(price_sold) AS yago FROM t GROUP BY id ) AS rr +FULL OUTER JOIN ( SELECT item_id AS id, SUM(price_sold) AS yago FROM t GROUP BY id ) AS rr USING (id); -SELECT id, yago +SELECT id, yago FROM ( SELECT item_id AS id, arrayJoin(emptyArrayInt32()) FROM t GROUP BY id WITH TOTALS ) AS ll -FULL OUTER JOIN ( SELECT item_id AS id, SUM(price_sold) AS yago FROM t GROUP BY id ) AS rr +FULL OUTER JOIN ( SELECT item_id AS id, SUM(price_sold) AS yago FROM t GROUP BY id ) AS rr USING (id); -SELECT id, yago +SELECT id, yago FROM ( SELECT item_id AS id FROM t GROUP BY id ) AS ll -FULL OUTER JOIN ( SELECT item_id AS id, arrayJoin(emptyArrayInt32()), SUM(price_sold) AS yago FROM t GROUP BY id WITH TOTALS ) AS rr +FULL OUTER JOIN ( SELECT item_id AS id, arrayJoin(emptyArrayInt32()), SUM(price_sold) AS yago FROM t GROUP BY id WITH TOTALS ) AS rr USING (id); -SELECT id, yago +SELECT id, yago FROM ( SELECT item_id AS id, arrayJoin([111, 222, 333]) FROM t GROUP BY id WITH TOTALS ) AS ll -FULL OUTER JOIN ( SELECT item_id AS id, arrayJoin([111, 222, 333, 444]), SUM(price_sold) AS yago FROM t GROUP BY id WITH TOTALS ) AS rr +FULL OUTER JOIN ( SELECT item_id AS id, arrayJoin([111, 222, 333, 444]), SUM(price_sold) AS yago FROM t GROUP BY id WITH TOTALS ) AS rr USING (id); +INSERT INTO t VALUES (1, 100, '1970-01-01'), (1, 200, '1970-01-02'); + +SELECT * +FROM (SELECT item_id FROM t GROUP BY item_id WITH TOTALS) l +LEFT JOIN (SELECT item_id FROM t ) r +ON l.item_id = r.item_id; + +SELECT * +FROM (SELECT item_id FROM t GROUP BY item_id WITH TOTALS) l +RIGHT JOIN (SELECT item_id FROM t ) r +ON l.item_id = r.item_id; + +SELECT * +FROM (SELECT item_id FROM t) l +LEFT JOIN (SELECT item_id FROM t GROUP BY item_id WITH TOTALS ) r +ON l.item_id = r.item_id; + +SELECT * +FROM (SELECT item_id FROM t) l +RIGHT JOIN (SELECT item_id FROM t GROUP BY item_id WITH TOTALS ) r +ON l.item_id = r.item_id; + +SELECT * +FROM (SELECT item_id FROM t GROUP BY item_id WITH TOTALS) l +LEFT JOIN (SELECT item_id FROM t GROUP BY item_id WITH TOTALS ) r +ON l.item_id = r.item_id; + +SELECT * +FROM (SELECT item_id, 'foo' AS key, 1 AS val FROM t GROUP BY item_id WITH TOTALS) l +LEFT JOIN (SELECT item_id, sum(price_sold) AS val FROM t GROUP BY item_id WITH TOTALS ) r +ON l.item_id = r.item_id; + +SELECT * +FROM (SELECT * FROM t GROUP BY item_id, price_sold, date WITH TOTALS) l +LEFT JOIN (SELECT * FROM t GROUP BY item_id, price_sold, date WITH TOTALS ) r +ON l.item_id = r.item_id; + DROP TABLE t; diff --git a/tests/queries/0_stateless/01135_default_and_alter_zookeeper.reference b/tests/queries/0_stateless/01135_default_and_alter_zookeeper.reference index cf69f1c5896..30cdc08e87d 100644 --- a/tests/queries/0_stateless/01135_default_and_alter_zookeeper.reference +++ b/tests/queries/0_stateless/01135_default_and_alter_zookeeper.reference @@ -1,2 +1,2 @@ 4 -CREATE TABLE default.default_table\n(\n `id` UInt64,\n `enum_column` Enum8(\'undefined\' = 0, \'fox\' = 1, \'index\' = 2) DEFAULT \'fox\'\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/test_01135/default_table\', \'1\')\nORDER BY tuple()\nSETTINGS index_granularity = 8192 +CREATE TABLE default.default_table\n(\n `id` UInt64,\n `enum_column` Enum8(\'undefined\' = 0, \'fox\' = 1, \'index\' = 2) DEFAULT \'fox\'\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/default/test_01135/default_table\', \'1\')\nORDER BY tuple()\nSETTINGS index_granularity = 8192 diff --git a/tests/queries/0_stateless/01135_default_and_alter_zookeeper.sql b/tests/queries/0_stateless/01135_default_and_alter_zookeeper.sql index 982c72eb333..ea8c943b9a4 100644 --- a/tests/queries/0_stateless/01135_default_and_alter_zookeeper.sql +++ b/tests/queries/0_stateless/01135_default_and_alter_zookeeper.sql @@ -5,7 +5,7 @@ CREATE TABLE default_table id UInt64, enum_column Enum8('undefined' = 0, 'fox' = 1, 'index' = 2) ) -ENGINE ReplicatedMergeTree('/clickhouse/test_01135/default_table', '1') +ENGINE ReplicatedMergeTree('/clickhouse/{database}/test_01135/default_table', '1') ORDER BY tuple(); INSERT INTO default_table VALUES(1, 'index'), (2, 'fox'); diff --git a/tests/queries/0_stateless/01149_zookeeper_mutation_stuck_after_replace_partition.reference b/tests/queries/0_stateless/01149_zookeeper_mutation_stuck_after_replace_partition.reference index edf8a7e391c..f60cf551ce9 100644 --- a/tests/queries/0_stateless/01149_zookeeper_mutation_stuck_after_replace_partition.reference +++ b/tests/queries/0_stateless/01149_zookeeper_mutation_stuck_after_replace_partition.reference @@ -4,8 +4,8 @@ 4 4 mt 0 0_1_1_0 2 rmt 0 0_0_0_0 2 -1 1 -2 2 +1 s1 +2 s2 mt 0 0_1_1_0 2 rmt 0 0_3_3_0 2 0000000000 UPDATE s = concat(\'s\', toString(n)) WHERE 1 [] 0 1 diff --git a/tests/queries/0_stateless/01149_zookeeper_mutation_stuck_after_replace_partition.sql b/tests/queries/0_stateless/01149_zookeeper_mutation_stuck_after_replace_partition.sql index fd3f1f3fcfe..ca8f70b3cf4 100644 --- a/tests/queries/0_stateless/01149_zookeeper_mutation_stuck_after_replace_partition.sql +++ b/tests/queries/0_stateless/01149_zookeeper_mutation_stuck_after_replace_partition.sql @@ -1,3 +1,4 @@ +set send_logs_level='error'; drop table if exists mt; drop table if exists rmt sync; @@ -5,12 +6,13 @@ create table mt (n UInt64, s String) engine = MergeTree partition by intDiv(n, 1 insert into mt values (3, '3'), (4, '4'); create table rmt (n UInt64, s String) engine = ReplicatedMergeTree('/clickhouse/test_01149_{database}/rmt', 'r1') partition by intDiv(n, 10) order by n; -insert into rmt values (1,'1'), (2, '2'); +insert into rmt values (1, '1'), (2, '2'); select * from rmt; select * from mt; select table, partition_id, name, rows from system.parts where database=currentDatabase() and table in ('mt', 'rmt') and active=1 order by table, name; +SET mutations_sync = 1; alter table rmt update s = 's'||toString(n) where 1; select * from rmt; diff --git a/tests/queries/0_stateless/01154_move_partition_long.sh b/tests/queries/0_stateless/01154_move_partition_long.sh index 1ce40770e46..1b5985b9942 100755 --- a/tests/queries/0_stateless/01154_move_partition_long.sh +++ b/tests/queries/0_stateless/01154_move_partition_long.sh @@ -85,12 +85,23 @@ function optimize_thread() done } +function drop_part_thread() +{ + while true; do + REPLICA=$(($RANDOM % 16)) + part=$($CLICKHOUSE_CLIENT -q "SELECT name FROM system.parts WHERE active AND database='$CLICKHOUSE_DATABASE' and table='dst_$REPLICA' ORDER BY rand() LIMIT 1") + $CLICKHOUSE_CLIENT -q "ALTER TABLE dst_$REPLICA DROP PART '$part'" 2>/dev/null + sleep 0.$RANDOM; + done +} + #export -f create_drop_thread; export -f insert_thread; export -f move_partition_src_dst_thread; export -f replace_partition_src_src_thread; export -f drop_partition_thread; export -f optimize_thread; +export -f drop_part_thread; TIMEOUT=60 @@ -102,17 +113,19 @@ timeout $TIMEOUT bash -c move_partition_src_dst_thread & timeout $TIMEOUT bash -c replace_partition_src_src_thread & timeout $TIMEOUT bash -c drop_partition_thread & timeout $TIMEOUT bash -c optimize_thread & +timeout $TIMEOUT bash -c drop_part_thread & wait for ((i=0; i<16; i++)) do - $CLICKHOUSE_CLIENT -q "SYSTEM SYNC REPLICA dst_$i" & - $CLICKHOUSE_CLIENT -q "SYSTEM SYNC REPLICA src_$i" 2>/dev/null & + # The size of log is big, so increase timeout. + $CLICKHOUSE_CLIENT --receive_timeout 600 -q "SYSTEM SYNC REPLICA dst_$i" & + $CLICKHOUSE_CLIENT --receive_timeout 600 -q "SYSTEM SYNC REPLICA src_$i" 2>/dev/null & done wait echo "Replication did not hang" for ((i=0; i<16; i++)) do - $CLICKHOUSE_CLIENT -q "DROP TABLE dst_$i" & - $CLICKHOUSE_CLIENT -q "DROP TABLE IF EXISTS src_$i" & + $CLICKHOUSE_CLIENT -q "DROP TABLE dst_$i" 2>&1| grep -Fv "is already started to be removing" & + $CLICKHOUSE_CLIENT -q "DROP TABLE IF EXISTS src_$i" 2>&1| grep -Fv "is already started to be removing" & done wait diff --git a/tests/queries/0_stateless/01156_pcg_deserialization.reference b/tests/queries/0_stateless/01156_pcg_deserialization.reference index e43b7ca3ceb..a41bc53d840 100644 --- a/tests/queries/0_stateless/01156_pcg_deserialization.reference +++ b/tests/queries/0_stateless/01156_pcg_deserialization.reference @@ -1,3 +1,6 @@ 5 5 5 5 5 5 +5 5 +5 5 +5 5 diff --git a/tests/queries/0_stateless/01156_pcg_deserialization.sh b/tests/queries/0_stateless/01156_pcg_deserialization.sh index 9c8ac29f32e..00ef86dce9c 100755 --- a/tests/queries/0_stateless/01156_pcg_deserialization.sh +++ b/tests/queries/0_stateless/01156_pcg_deserialization.sh @@ -4,16 +4,20 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # shellcheck source=../shell_config.sh . "$CURDIR"/../shell_config.sh +declare -a functions=("groupArraySample" "groupUniqArray") declare -a engines=("Memory" "MergeTree order by n" "Log") -for engine in "${engines[@]}" +for func in "${functions[@]}" do - $CLICKHOUSE_CLIENT -q "drop table if exists t"; - $CLICKHOUSE_CLIENT -q "create table t (n UInt8, a1 AggregateFunction(groupArraySample(1), UInt8)) engine=$engine" - $CLICKHOUSE_CLIENT -q "insert into t select number % 5 as n, groupArraySampleState(1)(toUInt8(number)) from numbers(10) group by n" + for engine in "${engines[@]}" + do + $CLICKHOUSE_CLIENT -q "drop table if exists t"; + $CLICKHOUSE_CLIENT -q "create table t (n UInt8, a1 AggregateFunction($func(1), UInt8)) engine=$engine" + $CLICKHOUSE_CLIENT -q "insert into t select number % 5 as n, ${func}State(1)(toUInt8(number)) from numbers(10) group by n" - $CLICKHOUSE_CLIENT -q "select * from t format TSV" | $CLICKHOUSE_CLIENT -q "insert into t format TSV" - $CLICKHOUSE_CLIENT -q "select countDistinct(n), countDistinct(a1) from t" + $CLICKHOUSE_CLIENT -q "select * from t format TSV" | $CLICKHOUSE_CLIENT -q "insert into t format TSV" + $CLICKHOUSE_CLIENT -q "select countDistinct(n), countDistinct(a1) from t" - $CLICKHOUSE_CLIENT -q "drop table t"; + $CLICKHOUSE_CLIENT -q "drop table t"; + done done diff --git a/tests/queries/0_stateless/01157_replace_table.reference b/tests/queries/0_stateless/01157_replace_table.reference new file mode 100644 index 00000000000..9fddaf99847 --- /dev/null +++ b/tests/queries/0_stateless/01157_replace_table.reference @@ -0,0 +1,20 @@ +test flush on replace +1 s1 +2 s2 +3 s3 +exception on create and fill +0 +1 1 s1 +2 2 s2 +3 3 s3 +1 1 s1 +2 2 s2 +3 3 s3 +1 1 s1 +2 2 s2 +3 3 s3 +4 4 s4 +buf +dist +join +t diff --git a/tests/queries/0_stateless/01157_replace_table.sql b/tests/queries/0_stateless/01157_replace_table.sql new file mode 100644 index 00000000000..a29b381a522 --- /dev/null +++ b/tests/queries/0_stateless/01157_replace_table.sql @@ -0,0 +1,51 @@ +drop table if exists t; +drop table if exists dist; +drop table if exists buf; +drop table if exists join; + +select 'test flush on replace'; +create table t (n UInt64, s String default 's' || toString(n)) engine=Memory; +create table dist (n int) engine=Distributed(test_shard_localhost, currentDatabase(), t); +create table buf (n int) engine=Buffer(currentDatabase(), dist, 1, 10, 100, 10, 100, 1000, 1000); + +system stop distributed sends dist; +insert into buf values (1); +replace table buf (n int) engine=Distributed(test_shard_localhost, currentDatabase(), dist); +replace table dist (n int) engine=Buffer(currentDatabase(), t, 1, 10, 100, 10, 100, 1000, 1000); + +system stop distributed sends buf; +insert into buf values (2); +replace table buf (n int) engine=Buffer(currentDatabase(), dist, 1, 10, 100, 10, 100, 1000, 1000); +replace table dist (n int) engine=Distributed(test_shard_localhost, currentDatabase(), t); + +system stop distributed sends dist; +insert into buf values (3); +replace table buf (n int) engine=Null; +replace table dist (n int) engine=Null; + +select * from t order by n; + +select 'exception on create and fill'; +-- table is not created if select fails +create or replace table join engine=Join(ANY, INNER, n) as select * from t where throwIf(n); -- { serverError 395 } +select count() from system.tables where database=currentDatabase() and name='join'; + +-- table is created and filled +create or replace table join engine=Join(ANY, INNER, n) as select * from t; +select * from numbers(10) as t any join join on t.number=join.n order by n; + +-- table is not replaced if select fails +insert into t(n) values (4); +replace table join engine=Join(ANY, INNER, n) as select * from t where throwIf(n); -- { serverError 395 } +select * from numbers(10) as t any join join on t.number=join.n order by n; + +-- table is replaced +replace table join engine=Join(ANY, INNER, n) as select * from t; +select * from numbers(10) as t any join join on t.number=join.n order by n; + +select name from system.tables where database=currentDatabase() order by name; + +drop table t; +drop table dist; +drop table buf; +drop table join; diff --git a/tests/queries/0_stateless/01158_zookeeper_log.reference b/tests/queries/0_stateless/01158_zookeeper_log.reference new file mode 100644 index 00000000000..35a30ee04e3 --- /dev/null +++ b/tests/queries/0_stateless/01158_zookeeper_log.reference @@ -0,0 +1,40 @@ +log +Response 0 Watch /test/01158/default/rmt/log 0 0 \N 0 0 ZOK CHILD CONNECTED 0 0 0 0 +Request 0 Create /test/01158/default/rmt/log 0 0 \N 0 4 \N \N \N 0 0 0 0 +Response 0 Create /test/01158/default/rmt/log 0 0 \N 0 4 ZOK \N \N /test/01158/default/rmt/log 0 0 0 0 +Request 0 Create /test/01158/default/rmt/log/log- 0 1 \N 0 1 \N \N \N 0 0 0 0 +Response 0 Create /test/01158/default/rmt/log/log- 0 1 \N 0 1 ZOK \N \N /test/01158/default/rmt/log/log-0000000000 0 0 0 0 +parts +Request 0 Multi 0 0 \N 5 0 \N \N \N 0 0 0 0 +Request 0 Create /test/01158/default/rmt/log/log- 0 1 \N 0 1 \N \N \N 0 0 0 0 +Request 0 Remove /test/01158/default/rmt/block_numbers/all/block-0000000000 0 0 -1 0 2 \N \N \N 0 0 0 0 +Request 0 Remove /test/01158/default/rmt/temp/abandonable_lock-0000000000 0 0 -1 0 3 \N \N \N 0 0 0 0 +Request 0 Create /test/01158/default/rmt/blocks/all_6308706741995381342_2495791770474910886 0 0 \N 0 4 \N \N \N 0 0 0 0 +Request 0 Create /test/01158/default/rmt/replicas/1/parts/all_0_0_0 0 0 \N 0 5 \N \N \N 0 0 0 0 +Response 0 Multi 0 0 \N 5 0 ZOK \N \N 0 0 0 0 +Response 0 Create /test/01158/default/rmt/log/log- 0 1 \N 0 1 ZOK \N \N /test/01158/default/rmt/log/log-0000000000 0 0 0 0 +Response 0 Remove /test/01158/default/rmt/block_numbers/all/block-0000000000 0 0 -1 0 2 ZOK \N \N 0 0 0 0 +Response 0 Remove /test/01158/default/rmt/temp/abandonable_lock-0000000000 0 0 -1 0 3 ZOK \N \N 0 0 0 0 +Response 0 Create /test/01158/default/rmt/blocks/all_6308706741995381342_2495791770474910886 0 0 \N 0 4 ZOK \N \N /test/01158/default/rmt/blocks/all_6308706741995381342_2495791770474910886 0 0 0 0 +Response 0 Create /test/01158/default/rmt/replicas/1/parts/all_0_0_0 0 0 \N 0 5 ZOK \N \N /test/01158/default/rmt/replicas/1/parts/all_0_0_0 0 0 0 0 +Request 0 Exists /test/01158/default/rmt/replicas/1/parts/all_0_0_0 0 0 \N 0 0 \N \N \N 0 0 0 0 +Response 0 Exists /test/01158/default/rmt/replicas/1/parts/all_0_0_0 0 0 \N 0 0 ZOK \N \N 0 0 96 0 +blocks +Request 0 Multi 0 0 \N 3 0 \N \N \N 0 0 0 0 +Request 0 Create /test/01158/default/rmt/blocks/all_6308706741995381342_2495791770474910886 0 0 \N 0 1 \N \N \N 0 0 0 0 +Request 0 Remove /test/01158/default/rmt/blocks/all_6308706741995381342_2495791770474910886 0 0 -1 0 2 \N \N \N 0 0 0 0 +Request 0 Create /test/01158/default/rmt/temp/abandonable_lock- 1 1 \N 0 3 \N \N \N 0 0 0 0 +Response 0 Multi 0 0 \N 3 0 ZOK \N \N 0 0 0 0 +Response 0 Create /test/01158/default/rmt/blocks/all_6308706741995381342_2495791770474910886 0 0 \N 0 1 ZOK \N \N /test/01158/default/rmt/blocks/all_6308706741995381342_2495791770474910886 0 0 0 0 +Response 0 Remove /test/01158/default/rmt/blocks/all_6308706741995381342_2495791770474910886 0 0 -1 0 2 ZOK \N \N 0 0 0 0 +Response 0 Create /test/01158/default/rmt/temp/abandonable_lock- 1 1 \N 0 3 ZOK \N \N /test/01158/default/rmt/temp/abandonable_lock-0000000000 0 0 0 0 +Request 0 Multi 0 0 \N 3 0 \N \N \N 0 0 0 0 +Request 0 Create /test/01158/default/rmt/blocks/all_6308706741995381342_2495791770474910886 0 0 \N 0 1 \N \N \N 0 0 0 0 +Request 0 Remove /test/01158/default/rmt/blocks/all_6308706741995381342_2495791770474910886 0 0 -1 0 2 \N \N \N 0 0 0 0 +Request 0 Create /test/01158/default/rmt/temp/abandonable_lock- 1 1 \N 0 3 \N \N \N 0 0 0 0 +Response 0 Multi 0 0 \N 3 0 ZNODEEXISTS \N \N 0 0 0 0 +Response 0 Error /test/01158/default/rmt/blocks/all_6308706741995381342_2495791770474910886 0 0 \N 0 1 ZNODEEXISTS \N \N 0 0 0 0 +Response 0 Error /test/01158/default/rmt/blocks/all_6308706741995381342_2495791770474910886 0 0 -1 0 2 ZRUNTIMEINCONSISTENCY \N \N 0 0 0 0 +Response 0 Error /test/01158/default/rmt/temp/abandonable_lock- 1 1 \N 0 3 ZRUNTIMEINCONSISTENCY \N \N 0 0 0 0 +Request 0 Get /test/01158/default/rmt/blocks/all_6308706741995381342_2495791770474910886 0 0 \N 0 0 \N \N \N 0 0 0 0 +Response 0 Get /test/01158/default/rmt/blocks/all_6308706741995381342_2495791770474910886 0 0 \N 0 0 ZOK \N \N 0 0 9 0 diff --git a/tests/queries/0_stateless/01158_zookeeper_log.sql b/tests/queries/0_stateless/01158_zookeeper_log.sql new file mode 100644 index 00000000000..f3f1980b5a2 --- /dev/null +++ b/tests/queries/0_stateless/01158_zookeeper_log.sql @@ -0,0 +1,28 @@ +drop table if exists rmt; +create table rmt (n int) engine=ReplicatedMergeTree('/test/01158/{database}/rmt', '1') order by n; +system sync replica rmt; +insert into rmt values (1); +insert into rmt values (1); +system flush logs; + +select 'log'; +select type, has_watch, op_num, path, is_ephemeral, is_sequential, version, requests_size, request_idx, error, watch_type, + watch_state, path_created, stat_version, stat_cversion, stat_dataLength, stat_numChildren +from system.zookeeper_log where path like '/test/01158/' || currentDatabase() || '/rmt/log%' and op_num not in (3, 4, 12) +order by xid, type, request_idx; + +select 'parts'; +select type, has_watch, op_num, path, is_ephemeral, is_sequential, version, requests_size, request_idx, error, watch_type, + watch_state, path_created, stat_version, stat_cversion, stat_dataLength, stat_numChildren +from system.zookeeper_log +where (session_id, xid) in (select session_id, xid from system.zookeeper_log where path='/test/01158/' || currentDatabase() || '/rmt/replicas/1/parts/all_0_0_0') +order by xid, type, request_idx; + +select 'blocks'; +select type, has_watch, op_num, path, is_ephemeral, is_sequential, version, requests_size, request_idx, error, watch_type, + watch_state, path_created, stat_version, stat_cversion, stat_dataLength, stat_numChildren +from system.zookeeper_log +where (session_id, xid) in (select session_id, xid from system.zookeeper_log where path like '/test/01158/' || currentDatabase() || '/rmt/blocks%' and op_num not in (1, 12)) +order by xid, type, request_idx; + +drop table rmt; diff --git a/tests/queries/0_stateless/01159_combinators_with_parameters.reference b/tests/queries/0_stateless/01159_combinators_with_parameters.reference new file mode 100644 index 00000000000..cc0cb604bf3 --- /dev/null +++ b/tests/queries/0_stateless/01159_combinators_with_parameters.reference @@ -0,0 +1,20 @@ +AggregateFunction(topKArray(10), Array(String)) +AggregateFunction(topKDistinct(10), String) +AggregateFunction(topKForEach(10), Array(String)) +AggregateFunction(topKIf(10), String, UInt8) +AggregateFunction(topK(10), String) +AggregateFunction(topKOrNull(10), String) +AggregateFunction(topKOrDefault(10), String) +AggregateFunction(topKResample(10, 1, 2, 42), String, UInt64) +AggregateFunction(topK(10), String) +AggregateFunction(topKArrayResampleOrDefaultIf(10, 1, 2, 42), Array(String), UInt64, UInt8) +10 +10 +[10] +11 +10 +10 +10 +[1] +10 +[1] diff --git a/tests/queries/0_stateless/01159_combinators_with_parameters.sql b/tests/queries/0_stateless/01159_combinators_with_parameters.sql new file mode 100644 index 00000000000..69508d8e304 --- /dev/null +++ b/tests/queries/0_stateless/01159_combinators_with_parameters.sql @@ -0,0 +1,43 @@ +SELECT toTypeName(topKArrayState(10)([toString(number)])) FROM numbers(100); +SELECT toTypeName(topKDistinctState(10)(toString(number))) FROM numbers(100); +SELECT toTypeName(topKForEachState(10)([toString(number)])) FROM numbers(100); +SELECT toTypeName(topKIfState(10)(toString(number), number % 2)) FROM numbers(100); +SELECT toTypeName(topKMergeState(10)(state)) FROM (SELECT topKState(10)(toString(number)) as state FROM numbers(100)); +SELECT toTypeName(topKOrNullState(10)(toString(number))) FROM numbers(100); +SELECT toTypeName(topKOrDefaultState(10)(toString(number))) FROM numbers(100); +SELECT toTypeName(topKResampleState(10, 1, 2, 42)(toString(number), number)) FROM numbers(100); +SELECT toTypeName(topKState(10)(toString(number))) FROM numbers(100); +SELECT toTypeName(topKArrayResampleOrDefaultIfState(10, 1, 2, 42)([toString(number)], number, number % 2)) FROM numbers(100); + +CREATE TEMPORARY TABLE t0 AS SELECT quantileArrayState(0.10)([number]) FROM numbers(100); +CREATE TEMPORARY TABLE t1 AS SELECT quantileDistinctState(0.10)(number) FROM numbers(100); +CREATE TEMPORARY TABLE t2 AS SELECT quantileForEachState(0.10)([number]) FROM numbers(100); +CREATE TEMPORARY TABLE t3 AS SELECT quantileIfState(0.10)(number, number % 2) FROM numbers(100); +CREATE TEMPORARY TABLE t4 AS SELECT quantileMergeState(0.10)(state) FROM (SELECT quantileState(0.10)(number) as state FROM numbers(100)); +CREATE TEMPORARY TABLE t5 AS SELECT quantileOrNullState(0.10)(number) FROM numbers(100); +CREATE TEMPORARY TABLE t6 AS SELECT quantileOrDefaultState(0.10)(number) FROM numbers(100); +CREATE TEMPORARY TABLE t7 AS SELECT quantileResampleState(0.10, 1, 2, 42)(number, number) FROM numbers(100); +CREATE TEMPORARY TABLE t8 AS SELECT quantileState(0.10)(number) FROM numbers(100); +CREATE TEMPORARY TABLE t9 AS SELECT quantileArrayResampleOrDefaultIfState(0.10, 1, 2, 42)([number], number, number % 2) FROM numbers(100); + +INSERT INTO t0 SELECT quantileArrayState(0.10)([number]) FROM numbers(100); +INSERT INTO t1 SELECT quantileDistinctState(0.10)(number) FROM numbers(100); +INSERT INTO t2 SELECT quantileForEachState(0.10)([number]) FROM numbers(100); +INSERT INTO t3 SELECT quantileIfState(0.10)(number, number % 2) FROM numbers(100); +INSERT INTO t4 SELECT quantileMergeState(0.10)(state) FROM (SELECT quantileState(0.10)(number) as state FROM numbers(100)); +INSERT INTO t5 SELECT quantileOrNullState(0.10)(number) FROM numbers(100); +INSERT INTO t6 SELECT quantileOrDefaultState(0.10)(number) FROM numbers(100); +INSERT INTO t7 SELECT quantileResampleState(0.10, 1, 2, 42)(number, number) FROM numbers(100); +INSERT INTO t8 SELECT quantileState(0.10)(number) FROM numbers(100); +INSERT INTO t9 SELECT quantileArrayResampleOrDefaultIfState(0.10, 1, 2, 42)([number], number, number % 2) FROM numbers(100); + +SELECT round(quantileArrayMerge(0.10)((*,).1)) FROM t0; +SELECT round(quantileDistinctMerge(0.10)((*,).1)) FROM t1; +SELECT arrayMap(x -> round(x), quantileForEachMerge(0.10)((*,).1)) FROM t2; +SELECT round(quantileIfMerge(0.10)((*,).1)) FROM t3; +SELECT round(quantileMerge(0.10)((*,).1)) FROM t4; +SELECT round(quantileOrNullMerge(0.10)((*,).1)) FROM t5; +SELECT round(quantileOrDefaultMerge(0.10)((*,).1)) FROM t6; +SELECT arrayMap(x -> round(x), quantileResampleMerge(0.10, 1, 2, 42)((*,).1)) FROM t7; +SELECT round(quantileMerge(0.10)((*,).1)) FROM t8; +SELECT arrayMap(x -> round(x), quantileArrayResampleOrDefaultIfMerge(0.10, 1, 2, 42)((*,).1)) FROM t9; diff --git a/tests/queries/0_stateless/01175_distributed_ddl_output_mode_long.reference b/tests/queries/0_stateless/01175_distributed_ddl_output_mode_long.reference index 0cc8c788fed..29f6f801044 100644 --- a/tests/queries/0_stateless/01175_distributed_ddl_output_mode_long.reference +++ b/tests/queries/0_stateless/01175_distributed_ddl_output_mode_long.reference @@ -1,25 +1,23 @@ none Received exception from server: -Code: 57. Error: Received from localhost:9000. Error: There was an error on [localhost:9000]: Code: 57, e.displayText() = Error: Table default.throw already exists +Code: 57. Error: Received from localhost:9000. Error: There was an error on [localhost:9000]: Code: 57. Error: Table default.none already exists. (TABLE_ALREADY_EXISTS) Received exception from server: -Code: 159. Error: Received from localhost:9000. Error: Watching task is executing longer than distributed_ddl_task_timeout (=8) seconds. There are 1 unfinished hosts (0 of them are currently active), they are going to execute the query in background. +Code: 159. Error: Received from localhost:9000. Error: Watching task is executing longer than distributed_ddl_task_timeout (=1) seconds. There are 1 unfinished hosts (0 of them are currently active), they are going to execute the query in background. (TIMEOUT_EXCEEDED) throw localhost 9000 0 0 0 -localhost 9000 57 Code: 57, e.displayText() = Error: Table default.throw already exists. 0 0 Received exception from server: -Code: 57. Error: Received from localhost:9000. Error: There was an error on [localhost:9000]: Code: 57, e.displayText() = Error: Table default.throw already exists +Code: 57. Error: Received from localhost:9000. Error: There was an error on [localhost:9000]: Code: 57. Error: Table default.throw already exists. (TABLE_ALREADY_EXISTS) localhost 9000 0 1 0 Received exception from server: -Code: 159. Error: Received from localhost:9000. Error: Watching task is executing longer than distributed_ddl_task_timeout (=8) seconds. There are 1 unfinished hosts (0 of them are currently active), they are going to execute the query in background. +Code: 159. Error: Received from localhost:9000. Error: Watching task is executing longer than distributed_ddl_task_timeout (=1) seconds. There are 1 unfinished hosts (0 of them are currently active), they are going to execute the query in background. (TIMEOUT_EXCEEDED) null_status_on_timeout localhost 9000 0 0 0 -localhost 9000 57 Code: 57, e.displayText() = Error: Table default.null_status already exists. 0 0 Received exception from server: -Code: 57. Error: Received from localhost:9000. Error: There was an error on [localhost:9000]: Code: 57, e.displayText() = Error: Table default.null_status already exists +Code: 57. Error: Received from localhost:9000. Error: There was an error on [localhost:9000]: Code: 57. Error: Table default.null_status already exists. (TABLE_ALREADY_EXISTS) localhost 9000 0 1 0 localhost 1 \N \N 1 0 never_throw localhost 9000 0 0 0 -localhost 9000 57 Code: 57, e.displayText() = Error: Table default.never_throw already exists. 0 0 +localhost 9000 57 Code: 57. Error: Table default.never_throw already exists. (TABLE_ALREADY_EXISTS) 0 0 localhost 9000 0 1 0 localhost 1 \N \N 1 0 diff --git a/tests/queries/0_stateless/01175_distributed_ddl_output_mode_long.sh b/tests/queries/0_stateless/01175_distributed_ddl_output_mode_long.sh index 66ceef21682..483979d00db 100755 --- a/tests/queries/0_stateless/01175_distributed_ddl_output_mode_long.sh +++ b/tests/queries/0_stateless/01175_distributed_ddl_output_mode_long.sh @@ -1,39 +1,68 @@ #!/usr/bin/env bash +CLICKHOUSE_CLIENT_SERVER_LOGS_LEVEL=fatal + CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # shellcheck source=../shell_config.sh . "$CURDIR"/../shell_config.sh +# We execute a distributed DDL query with timeout 1 to check that one host is unavailable and will time out and other complete successfully. +# But sometimes one second is not enough even for healthy host to succeed. Repeat the test in this case. +function run_until_out_contains() +{ + PATTERN=$1 + shift + + for _ in {1..20} + do + "$@" > "${CLICKHOUSE_TMP}/out" 2>&1 + if grep -q "$PATTERN" "${CLICKHOUSE_TMP}/out" + then + cat "${CLICKHOUSE_TMP}/out" + break; + fi + done +} + + +$CLICKHOUSE_CLIENT -q "drop table if exists none;" $CLICKHOUSE_CLIENT -q "drop table if exists throw;" $CLICKHOUSE_CLIENT -q "drop table if exists null_status;" $CLICKHOUSE_CLIENT -q "drop table if exists never_throw;" -CLICKHOUSE_CLIENT_OPT=$(echo ${CLICKHOUSE_CLIENT_OPT} | sed 's/'"--send_logs_level=${CLICKHOUSE_CLIENT_SERVER_LOGS_LEVEL}"'/--send_logs_level=fatal/g') - -CLIENT="$CLICKHOUSE_CLIENT_BINARY $CLICKHOUSE_CLIENT_OPT --distributed_ddl_task_timeout=8 --distributed_ddl_output_mode=none" -$CLIENT -q "select value from system.settings where name='distributed_ddl_output_mode';" +$CLICKHOUSE_CLIENT --output_format_parallel_formatting=0 --distributed_ddl_task_timeout=600 --distributed_ddl_output_mode=none -q "select value from system.settings where name='distributed_ddl_output_mode';" # Ok -$CLIENT -q "create table throw on cluster test_shard_localhost (n int) engine=Memory;" +$CLICKHOUSE_CLIENT --output_format_parallel_formatting=0 --distributed_ddl_task_timeout=600 --distributed_ddl_output_mode=none -q "create table none on cluster test_shard_localhost (n int) engine=Memory;" # Table exists -$CLIENT -q "create table throw on cluster test_shard_localhost (n int) engine=Memory;" 2>&1| grep -Fv "@ 0x" | sed "s/DB::Exception/Error/g" | sed "s/ (version.*)//" | sed "s/exists.. /exists/" +$CLICKHOUSE_CLIENT --output_format_parallel_formatting=0 --distributed_ddl_task_timeout=600 --distributed_ddl_output_mode=none -q "create table none on cluster test_shard_localhost (n int) engine=Memory;" 2>&1 | sed "s/DB::Exception/Error/g" | sed "s/ (version.*)//" # Timeout -$CLIENT -q "drop table throw on cluster test_unavailable_shard;" 2>&1| grep -Fv "@ 0x" | sed "s/DB::Exception/Error/g" | sed "s/ (version.*)//" | sed "s/Watching task .* is executing longer/Watching task is executing longer/" | sed "s/background. /background./" -CLIENT="$CLICKHOUSE_CLIENT_BINARY $CLICKHOUSE_CLIENT_OPT --distributed_ddl_task_timeout=8 --distributed_ddl_output_mode=throw" -$CLIENT -q "select value from system.settings where name='distributed_ddl_output_mode';" -$CLIENT -q "create table throw on cluster test_shard_localhost (n int) engine=Memory;" -$CLIENT -q "create table throw on cluster test_shard_localhost (n int) engine=Memory;" 2>&1| grep -Fv "@ 0x" | sed "s/DB::Exception/Error/g" | sed "s/ (version.*)//" | sed "s/exists.. /exists/" -$CLIENT -q "drop table throw on cluster test_unavailable_shard;" 2>&1| grep -Fv "@ 0x" | sed "s/DB::Exception/Error/g" | sed "s/ (version.*)//" | sed "s/Watching task .* is executing longer/Watching task is executing longer/" | sed "s/background. /background./" +run_until_out_contains 'There are 1 unfinished hosts' $CLICKHOUSE_CLIENT --output_format_parallel_formatting=0 --distributed_ddl_task_timeout=1 --distributed_ddl_output_mode=none -q "drop table if exists none on cluster test_unavailable_shard;" 2>&1 | sed "s/DB::Exception/Error/g" | sed "s/ (version.*)//" | sed "s/Watching task .* is executing longer/Watching task is executing longer/" -CLIENT="$CLICKHOUSE_CLIENT_BINARY $CLICKHOUSE_CLIENT_OPT --distributed_ddl_task_timeout=8 --distributed_ddl_output_mode=null_status_on_timeout" -$CLIENT -q "select value from system.settings where name='distributed_ddl_output_mode';" -$CLIENT -q "create table null_status on cluster test_shard_localhost (n int) engine=Memory;" -$CLIENT -q "create table null_status on cluster test_shard_localhost (n int) engine=Memory;" 2>&1| grep -Fv "@ 0x" | sed "s/DB::Exception/Error/g" | sed "s/ (version.*)//" | sed "s/exists.. /exists/" -$CLIENT -q "drop table null_status on cluster test_unavailable_shard;" -CLIENT="$CLICKHOUSE_CLIENT_BINARY $CLICKHOUSE_CLIENT_OPT --distributed_ddl_task_timeout=8 --distributed_ddl_output_mode=never_throw" -$CLIENT -q "select value from system.settings where name='distributed_ddl_output_mode';" -$CLIENT -q "create table never_throw on cluster test_shard_localhost (n int) engine=Memory;" -$CLIENT -q "create table never_throw on cluster test_shard_localhost (n int) engine=Memory;" 2>&1| sed "s/DB::Exception/Error/g" | sed "s/ (version.*)//" -$CLIENT -q "drop table never_throw on cluster test_unavailable_shard;" +$CLICKHOUSE_CLIENT --output_format_parallel_formatting=0 --distributed_ddl_task_timeout=600 --distributed_ddl_output_mode=throw -q "select value from system.settings where name='distributed_ddl_output_mode';" +$CLICKHOUSE_CLIENT --output_format_parallel_formatting=0 --distributed_ddl_task_timeout=600 --distributed_ddl_output_mode=throw -q "create table throw on cluster test_shard_localhost (n int) engine=Memory;" +$CLICKHOUSE_CLIENT --output_format_parallel_formatting=0 --distributed_ddl_task_timeout=600 --distributed_ddl_output_mode=throw -q "create table throw on cluster test_shard_localhost (n int) engine=Memory format Null;" 2>&1 | sed "s/DB::Exception/Error/g" | sed "s/ (version.*)//" + +run_until_out_contains 'There are 1 unfinished hosts' $CLICKHOUSE_CLIENT --output_format_parallel_formatting=0 --distributed_ddl_task_timeout=1 --distributed_ddl_output_mode=throw -q "drop table if exists throw on cluster test_unavailable_shard;" 2>&1 | sed "s/DB::Exception/Error/g" | sed "s/ (version.*)//" | sed "s/Watching task .* is executing longer/Watching task is executing longer/" + + +$CLICKHOUSE_CLIENT --output_format_parallel_formatting=0 --distributed_ddl_task_timeout=600 --distributed_ddl_output_mode=null_status_on_timeout -q "select value from system.settings where name='distributed_ddl_output_mode';" +$CLICKHOUSE_CLIENT --output_format_parallel_formatting=0 --distributed_ddl_task_timeout=600 --distributed_ddl_output_mode=null_status_on_timeout -q "create table null_status on cluster test_shard_localhost (n int) engine=Memory;" +$CLICKHOUSE_CLIENT --output_format_parallel_formatting=0 --distributed_ddl_task_timeout=600 --distributed_ddl_output_mode=null_status_on_timeout -q "create table null_status on cluster test_shard_localhost (n int) engine=Memory format Null;" 2>&1 | sed "s/DB::Exception/Error/g" | sed "s/ (version.*)//" + +run_until_out_contains '9000 0 ' $CLICKHOUSE_CLIENT --output_format_parallel_formatting=0 --distributed_ddl_task_timeout=1 --distributed_ddl_output_mode=null_status_on_timeout -q "drop table if exists null_status on cluster test_unavailable_shard;" + + +$CLICKHOUSE_CLIENT --output_format_parallel_formatting=0 --distributed_ddl_task_timeout=600 --distributed_ddl_output_mode=never_throw -q "select value from system.settings where name='distributed_ddl_output_mode';" +$CLICKHOUSE_CLIENT --output_format_parallel_formatting=0 --distributed_ddl_task_timeout=600 --distributed_ddl_output_mode=never_throw -q "create table never_throw on cluster test_shard_localhost (n int) engine=Memory;" +$CLICKHOUSE_CLIENT --output_format_parallel_formatting=0 --distributed_ddl_task_timeout=600 --distributed_ddl_output_mode=never_throw -q "create table never_throw on cluster test_shard_localhost (n int) engine=Memory;" 2>&1 | sed "s/DB::Exception/Error/g" | sed "s/ (version.*)//" + +run_until_out_contains '9000 0 ' $CLICKHOUSE_CLIENT --output_format_parallel_formatting=0 --distributed_ddl_task_timeout=1 --distributed_ddl_output_mode=never_throw -q "drop table if exists never_throw on cluster test_unavailable_shard;" + + +$CLICKHOUSE_CLIENT -q "drop table if exists none;" +$CLICKHOUSE_CLIENT -q "drop table if exists throw;" +$CLICKHOUSE_CLIENT -q "drop table if exists null_status;" +$CLICKHOUSE_CLIENT -q "drop table if exists never_throw;" diff --git a/tests/queries/0_stateless/01176_mysql_client_interactive.expect b/tests/queries/0_stateless/01176_mysql_client_interactive.expect index b2dc88a7795..8f56d047e8e 100755 --- a/tests/queries/0_stateless/01176_mysql_client_interactive.expect +++ b/tests/queries/0_stateless/01176_mysql_client_interactive.expect @@ -12,7 +12,7 @@ expect_after { set basedir [file dirname $argv0] spawn bash -c "source $basedir/../shell_config.sh ; \$MYSQL_CLIENT_BINARY \$MYSQL_CLIENT_OPT" -expect "mysql> " +expect -nocase -re "mysql.*> " send -- "USE system;\r" expect "Database changed" @@ -22,5 +22,34 @@ expect "| dummy |" expect "| 0 |" expect "1 row in set" +# exception before start +send -- "select * from table_that_does_not_exist;\r" +expect "ERROR 60 (00000): Code: 60" + +# exception after start +send -- "select throwIf(number) from numbers(2) settings max_block_size=1;\r" +expect "ERROR 395 (00000): Code: 395" + +# other formats +send -- "select * from system.one format TSV;\r" +expect "ERROR 1 (00000): Code: 1" + +send -- "select * from system.one format JSON;\r" +expect "ERROR 1 (00000): Code: 1" + +send -- "select * from system.one format MySQLWire;\r" +expect "| dummy |" +expect "| 0 |" +expect "1 row in set" + +send -- "select count(number), sum(number) from numbers(10);\r" +expect "+---------------+-------------+" +expect "| count(number) | sum(number) |" +expect "+---------------+-------------+" +expect "| 10 | 45 |" +expect "+---------------+-------------+" +expect "1 row in set" +expect -nocase -re "mysql.*> " + send -- "quit;\r" expect eof diff --git a/tests/queries/0_stateless/01178_int_field_to_decimal.reference b/tests/queries/0_stateless/01178_int_field_to_decimal.reference index 6c256ba2032..80fd8dfc496 100644 --- a/tests/queries/0_stateless/01178_int_field_to_decimal.reference +++ b/tests/queries/0_stateless/01178_int_field_to_decimal.reference @@ -1,2 +1,2 @@ -9.00000000 -10.00000000 +9 +10 diff --git a/tests/queries/0_stateless/01182_materialized_view_different_structure.reference b/tests/queries/0_stateless/01182_materialized_view_different_structure.reference index a1f113394b2..c0201d4a35f 100644 --- a/tests/queries/0_stateless/01182_materialized_view_different_structure.reference +++ b/tests/queries/0_stateless/01182_materialized_view_different_structure.reference @@ -1,4 +1,4 @@ -4999950000.000000 +4999950000 4999950000 1000 499500 499500 999 0 1000 124716 499500 255 0 diff --git a/tests/queries/0_stateless/01185_create_or_replace_table.reference b/tests/queries/0_stateless/01185_create_or_replace_table.reference index 84df5f0f5b5..be187d9dcd4 100644 --- a/tests/queries/0_stateless/01185_create_or_replace_table.reference +++ b/tests/queries/0_stateless/01185_create_or_replace_table.reference @@ -1,8 +1,8 @@ t1 -CREATE TABLE test_01185.t1\n(\n `n` UInt64,\n `s` String\n)\nENGINE = MergeTree\nORDER BY n\nSETTINGS index_granularity = 8192 +CREATE TABLE default.t1\n(\n `n` UInt64,\n `s` String\n)\nENGINE = MergeTree\nORDER BY n\nSETTINGS index_granularity = 8192 t1 -CREATE TABLE test_01185.t1\n(\n `n` UInt64,\n `s` Nullable(String)\n)\nENGINE = MergeTree\nORDER BY n\nSETTINGS index_granularity = 8192 +CREATE TABLE default.t1\n(\n `n` UInt64,\n `s` Nullable(String)\n)\nENGINE = MergeTree\nORDER BY n\nSETTINGS index_granularity = 8192 2 \N t1 -CREATE TABLE test_01185.t1\n(\n `n` UInt64\n)\nENGINE = MergeTree\nORDER BY n\nSETTINGS index_granularity = 8192 +CREATE TABLE default.t1\n(\n `n` UInt64\n)\nENGINE = MergeTree\nORDER BY n\nSETTINGS index_granularity = 8192 3 diff --git a/tests/queries/0_stateless/01185_create_or_replace_table.sql b/tests/queries/0_stateless/01185_create_or_replace_table.sql index fe408cc7ac6..45900329b2c 100644 --- a/tests/queries/0_stateless/01185_create_or_replace_table.sql +++ b/tests/queries/0_stateless/01185_create_or_replace_table.sql @@ -1,23 +1,22 @@ -drop database if exists test_01185; -create database test_01185 engine=Atomic; +drop table if exists t1; -replace table test_01185.t1 (n UInt64, s String) engine=MergeTree order by n; -- { serverError 60 } -show tables from test_01185; -create or replace table test_01185.t1 (n UInt64, s String) engine=MergeTree order by n; -show tables from test_01185; -show create table test_01185.t1; +replace table t1 (n UInt64, s String) engine=MergeTree order by n; -- { serverError 60 } +show tables; +create or replace table t1 (n UInt64, s String) engine=MergeTree order by n; +show tables; +show create table t1; -insert into test_01185.t1 values (1, 'test'); -create or replace table test_01185.t1 (n UInt64, s Nullable(String)) engine=MergeTree order by n; -insert into test_01185.t1 values (2, null); -show tables from test_01185; -show create table test_01185.t1; -select * from test_01185.t1; +insert into t1 values (1, 'test'); +create or replace table t1 (n UInt64, s Nullable(String)) engine=MergeTree order by n; +insert into t1 values (2, null); +show tables; +show create table t1; +select * from t1; -replace table test_01185.t1 (n UInt64) engine=MergeTree order by n; -insert into test_01185.t1 values (3); -show tables from test_01185; -show create table test_01185.t1; -select * from test_01185.t1; +replace table t1 (n UInt64) engine=MergeTree order by n; +insert into t1 values (3); +show tables; +show create table t1; +select * from t1; -drop database test_01185; +drop table t1; diff --git a/tests/queries/0_stateless/01186_conversion_to_nullable.reference b/tests/queries/0_stateless/01186_conversion_to_nullable.reference index 04146644154..7a690240eb5 100644 --- a/tests/queries/0_stateless/01186_conversion_to_nullable.reference +++ b/tests/queries/0_stateless/01186_conversion_to_nullable.reference @@ -24,12 +24,12 @@ 946721532 \N \N -42.00 +42 \N \N -42.00000000 +42 \N -3.14159000 +3.14159 42 \N test diff --git a/tests/queries/0_stateless/01186_conversion_to_nullable.sql b/tests/queries/0_stateless/01186_conversion_to_nullable.sql index bf7df6234d2..828d3cac05b 100644 --- a/tests/queries/0_stateless/01186_conversion_to_nullable.sql +++ b/tests/queries/0_stateless/01186_conversion_to_nullable.sql @@ -2,9 +2,9 @@ select toUInt8(x) from values('x Nullable(String)', '42', NULL, '0', '', '256'); select toInt64(x) from values('x Nullable(String)', '42', NULL, '0', '', '256'); select toDate(x) from values('x Nullable(String)', '2020-12-24', NULL, '0000-00-00', '', '9999-01-01'); -select toDateTime(x) from values('x Nullable(String)', '2020-12-24 01:02:03', NULL, '0000-00-00 00:00:00', ''); -select toDateTime64(x, 2) from values('x Nullable(String)', '2020-12-24 01:02:03', NULL, '0000-00-00 00:00:00', ''); -select toUnixTimestamp(x) from values ('x Nullable(String)', '2000-01-01 13:12:12', NULL, ''); +select toDateTime(x, 'Europe/Moscow') from values('x Nullable(String)', '2020-12-24 01:02:03', NULL, '0000-00-00 00:00:00', ''); +select toDateTime64(x, 2, 'Europe/Moscow') from values('x Nullable(String)', '2020-12-24 01:02:03', NULL, '0000-00-00 00:00:00', ''); +select toUnixTimestamp(x, 'Europe/Moscow') from values ('x Nullable(String)', '2000-01-01 13:12:12', NULL, ''); select toDecimal32(x, 2) from values ('x Nullable(String)', '42', NULL, '3.14159'); select toDecimal64(x, 8) from values ('x Nullable(String)', '42', NULL, '3.14159'); diff --git a/tests/queries/0_stateless/01201_drop_column_compact_part_replicated_zookeeper.reference b/tests/queries/0_stateless/01201_drop_column_compact_part_replicated_zookeeper_long.reference similarity index 100% rename from tests/queries/0_stateless/01201_drop_column_compact_part_replicated_zookeeper.reference rename to tests/queries/0_stateless/01201_drop_column_compact_part_replicated_zookeeper_long.reference diff --git a/tests/queries/0_stateless/01201_drop_column_compact_part_replicated_zookeeper.sql b/tests/queries/0_stateless/01201_drop_column_compact_part_replicated_zookeeper_long.sql similarity index 92% rename from tests/queries/0_stateless/01201_drop_column_compact_part_replicated_zookeeper.sql rename to tests/queries/0_stateless/01201_drop_column_compact_part_replicated_zookeeper_long.sql index 2aa903d99f0..9464ac24dff 100644 --- a/tests/queries/0_stateless/01201_drop_column_compact_part_replicated_zookeeper.sql +++ b/tests/queries/0_stateless/01201_drop_column_compact_part_replicated_zookeeper_long.sql @@ -3,7 +3,7 @@ set replication_alter_partitions_sync = 2; drop table if exists mt_compact; create table mt_compact(a UInt64, b UInt64 DEFAULT a * a, s String, n Nested(x UInt32, y String), lc LowCardinality(String)) -engine = ReplicatedMergeTree('/clickhouse/test_01201/mt_compact_replicated', '1') +engine = ReplicatedMergeTree('/clickhouse/{database}/test_01201/mt_compact_replicated', '1') order by a partition by a % 10 settings index_granularity = 8, min_rows_for_wide_part = 10; diff --git a/tests/queries/0_stateless/01213_alter_rename_primary_key_zookeeper.reference b/tests/queries/0_stateless/01213_alter_rename_primary_key_zookeeper_long.reference similarity index 100% rename from tests/queries/0_stateless/01213_alter_rename_primary_key_zookeeper.reference rename to tests/queries/0_stateless/01213_alter_rename_primary_key_zookeeper_long.reference diff --git a/tests/queries/0_stateless/01213_alter_rename_primary_key_zookeeper.sql b/tests/queries/0_stateless/01213_alter_rename_primary_key_zookeeper_long.sql similarity index 89% rename from tests/queries/0_stateless/01213_alter_rename_primary_key_zookeeper.sql rename to tests/queries/0_stateless/01213_alter_rename_primary_key_zookeeper_long.sql index 616a213e46c..91dd6e67512 100644 --- a/tests/queries/0_stateless/01213_alter_rename_primary_key_zookeeper.sql +++ b/tests/queries/0_stateless/01213_alter_rename_primary_key_zookeeper_long.sql @@ -9,7 +9,7 @@ CREATE TABLE table_for_rename_pk value1 String, value2 String ) -ENGINE = ReplicatedMergeTree('/clickhouse/tables/test_01213/table_for_rename_pk1', '1') +ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/test_01213/table_for_rename_pk1', '1') PARTITION BY date ORDER BY (key1, pow(key2, 2), key3); @@ -37,7 +37,7 @@ CREATE TABLE table_for_rename_with_primary_key value2 String, INDEX idx (value1) TYPE set(1) GRANULARITY 1 ) -ENGINE = ReplicatedMergeTree('/clickhouse/tables/test_01213/table_for_rename_pk2', '1') +ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/test_01213/table_for_rename_pk2', '1') PARTITION BY date ORDER BY (key1, key2, key3) PRIMARY KEY (key1, key2); diff --git a/tests/queries/0_stateless/01213_alter_rename_with_default_zookeeper.reference b/tests/queries/0_stateless/01213_alter_rename_with_default_zookeeper_long.reference similarity index 74% rename from tests/queries/0_stateless/01213_alter_rename_with_default_zookeeper.reference rename to tests/queries/0_stateless/01213_alter_rename_with_default_zookeeper_long.reference index da3dad5cb16..2a6b00cdddb 100644 --- a/tests/queries/0_stateless/01213_alter_rename_with_default_zookeeper.reference +++ b/tests/queries/0_stateless/01213_alter_rename_with_default_zookeeper_long.reference @@ -8,10 +8,10 @@ Hello 1 Word 1 date1 date2 value1 value2 2019-10-02 2018-10-02 1 1 -CREATE TABLE default.table_rename_with_ttl\n(\n `date1` Date,\n `date2` Date,\n `value1` String,\n `value2` String TTL date1 + toIntervalMonth(10000)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/test_01213/table_rename_with_ttl\', \'1\')\nORDER BY tuple()\nTTL date2 + toIntervalMonth(10000)\nSETTINGS index_granularity = 8192 +CREATE TABLE default.table_rename_with_ttl\n(\n `date1` Date,\n `date2` Date,\n `value1` String,\n `value2` String TTL date1 + toIntervalMonth(10000)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/default/test_01213/table_rename_with_ttl\', \'1\')\nORDER BY tuple()\nTTL date2 + toIntervalMonth(10000)\nSETTINGS index_granularity = 8192 renamed_date1 date2 value1 value2 2019-10-02 2018-10-02 1 1 -CREATE TABLE default.table_rename_with_ttl\n(\n `renamed_date1` Date,\n `date2` Date,\n `value1` String,\n `value2` String TTL renamed_date1 + toIntervalMonth(10000)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/test_01213/table_rename_with_ttl\', \'1\')\nORDER BY tuple()\nTTL date2 + toIntervalMonth(10000)\nSETTINGS index_granularity = 8192 +CREATE TABLE default.table_rename_with_ttl\n(\n `renamed_date1` Date,\n `date2` Date,\n `value1` String,\n `value2` String TTL renamed_date1 + toIntervalMonth(10000)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/default/test_01213/table_rename_with_ttl\', \'1\')\nORDER BY tuple()\nTTL date2 + toIntervalMonth(10000)\nSETTINGS index_granularity = 8192 renamed_date1 renamed_date2 value1 value2 2019-10-02 2018-10-02 1 1 -CREATE TABLE default.table_rename_with_ttl\n(\n `renamed_date1` Date,\n `renamed_date2` Date,\n `value1` String,\n `value2` String TTL renamed_date1 + toIntervalMonth(10000)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/test_01213/table_rename_with_ttl\', \'1\')\nORDER BY tuple()\nTTL renamed_date2 + toIntervalMonth(10000)\nSETTINGS index_granularity = 8192 +CREATE TABLE default.table_rename_with_ttl\n(\n `renamed_date1` Date,\n `renamed_date2` Date,\n `value1` String,\n `value2` String TTL renamed_date1 + toIntervalMonth(10000)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/default/test_01213/table_rename_with_ttl\', \'1\')\nORDER BY tuple()\nTTL renamed_date2 + toIntervalMonth(10000)\nSETTINGS index_granularity = 8192 diff --git a/tests/queries/0_stateless/01213_alter_rename_with_default_zookeeper.sql b/tests/queries/0_stateless/01213_alter_rename_with_default_zookeeper_long.sql similarity index 79% rename from tests/queries/0_stateless/01213_alter_rename_with_default_zookeeper.sql rename to tests/queries/0_stateless/01213_alter_rename_with_default_zookeeper_long.sql index d3f83c0cbb0..cb9e918e335 100644 --- a/tests/queries/0_stateless/01213_alter_rename_with_default_zookeeper.sql +++ b/tests/queries/0_stateless/01213_alter_rename_with_default_zookeeper_long.sql @@ -12,7 +12,7 @@ ENGINE = MergeTree() PARTITION BY date ORDER BY key; -INSERT INTO table_rename_with_default (date, key, value1) SELECT toDate('2019-10-01') + number % 3, number, toString(number) from numbers(9); +INSERT INTO table_rename_with_default (date, key, value1) SELECT toDateTime(toDate('2019-10-01') + number % 3, 'Europe/Moscow'), number, toString(number) from numbers(9); SELECT * FROM table_rename_with_default WHERE key = 1 FORMAT TSVWithNames; @@ -38,11 +38,11 @@ CREATE TABLE table_rename_with_ttl value1 String, value2 String TTL date1 + INTERVAL 10000 MONTH ) -ENGINE = ReplicatedMergeTree('/clickhouse/test_01213/table_rename_with_ttl', '1') +ENGINE = ReplicatedMergeTree('/clickhouse/{database}/test_01213/table_rename_with_ttl', '1') ORDER BY tuple() TTL date2 + INTERVAL 10000 MONTH; -INSERT INTO table_rename_with_ttl SELECT toDate('2019-10-01') + number % 3, toDate('2018-10-01') + number % 3, toString(number), toString(number) from numbers(9); +INSERT INTO table_rename_with_ttl SELECT toDateTime(toDate('2019-10-01') + number % 3, 'Europe/Moscow'), toDateTime(toDate('2018-10-01') + number % 3, 'Europe/Moscow'), toString(number), toString(number) from numbers(9); SELECT * FROM table_rename_with_ttl WHERE value1 = '1' FORMAT TSVWithNames; diff --git a/tests/queries/0_stateless/01226_dist_on_dist_global_in.reference b/tests/queries/0_stateless/01226_dist_on_dist_global_in.reference index 3d8d7fb770d..e7d4ea81714 100644 --- a/tests/queries/0_stateless/01226_dist_on_dist_global_in.reference +++ b/tests/queries/0_stateless/01226_dist_on_dist_global_in.reference @@ -2,5 +2,4 @@ GLOBAL IN 0 0 0 -0 GLOBAL NOT IN diff --git a/tests/queries/0_stateless/01226_dist_on_dist_global_in.sql b/tests/queries/0_stateless/01226_dist_on_dist_global_in.sql index 588ea9c1048..ca9b28a14f4 100644 --- a/tests/queries/0_stateless/01226_dist_on_dist_global_in.sql +++ b/tests/queries/0_stateless/01226_dist_on_dist_global_in.sql @@ -1,10 +1,8 @@ SELECT 'GLOBAL IN'; select * from remote('localhost', system.one) where dummy global in (0); -select * from remote('localhost', system.one) where toUInt64(dummy) global in numbers(1); select * from remote('localhost', system.one) where dummy global in system.one; select * from remote('localhost', system.one) where dummy global in (select 0); SELECT 'GLOBAL NOT IN'; select * from remote('localhost', system.one) where dummy global not in (0); -select * from remote('localhost', system.one) where toUInt64(dummy) global not in numbers(1); select * from remote('localhost', system.one) where dummy global not in system.one; select * from remote('localhost', system.one) where dummy global not in (select 0); diff --git a/tests/queries/0_stateless/01231_markdown_format.reference b/tests/queries/0_stateless/01231_markdown_format.reference index 55cf44381ad..9fb9901a053 100644 --- a/tests/queries/0_stateless/01231_markdown_format.reference +++ b/tests/queries/0_stateless/01231_markdown_format.reference @@ -1,5 +1,5 @@ | id | name | array | nullable | low_cardinality | decimal | |-:|:-|:-|:-|:-|-:| -| 1 | name1 | [1,2,3] | Some long string | name1 | 1.110000 | +| 1 | name1 | [1,2,3] | Some long string | name1 | 1.11 | | 2 | name2 | [4,5,60000] | \N | Another long string | 222.222222 | -| 30000 | One more long string | [7,8,9] | name3 | name3 | 3.330000 | +| 30000 | One more long string | [7,8,9] | name3 | name3 | 3.33 | diff --git a/tests/queries/0_stateless/01232_untuple.reference b/tests/queries/0_stateless/01232_untuple.reference index 44f96e1decd..21fd0c4a8a5 100644 --- a/tests/queries/0_stateless/01232_untuple.reference +++ b/tests/queries/0_stateless/01232_untuple.reference @@ -2,7 +2,7 @@ hello 1 3 world 9 9 (0,1) -key v1 v2 v3 v4 v5 +key tupleElement(argMax(tuple(v1, v2, v3, v4, v5), v1), 1) tupleElement(argMax(tuple(v1, v2, v3, v4, v5), v1), 2) tupleElement(argMax(tuple(v1, v2, v3, v4, v5), v1), 3) tupleElement(argMax(tuple(v1, v2, v3, v4, v5), v1), 4) tupleElement(argMax(tuple(v1, v2, v3, v4, v5), v1), 5) 4 10 20 10 20 30 3 70 20 10 20 30 2 11 20 10 20 30 diff --git a/tests/queries/0_stateless/01236_graphite_mt.sql b/tests/queries/0_stateless/01236_graphite_mt.sql index f3f1905b901..ccf7c066e75 100644 --- a/tests/queries/0_stateless/01236_graphite_mt.sql +++ b/tests/queries/0_stateless/01236_graphite_mt.sql @@ -1,27 +1,38 @@ + +-- Use DateTime('UTC') to have a common rollup window drop table if exists test_graphite; -create table test_graphite (key UInt32, Path String, Time DateTime, Value Float64, Version UInt32, col UInt64) engine = GraphiteMergeTree('graphite_rollup') order by key settings index_granularity=10; +create table test_graphite (key UInt32, Path String, Time DateTime('UTC'), Value Float64, Version UInt32, col UInt64) + engine = GraphiteMergeTree('graphite_rollup') order by key settings index_granularity=10; -insert into test_graphite -select 1, 'sum_1', toDateTime(today()) - number * 60 - 30, number, 1, number from numbers(300) union all -select 2, 'sum_1', toDateTime(today()) - number * 60 - 30, number, 1, number from numbers(300) union all -select 1, 'sum_2', toDateTime(today()) - number * 60 - 30, number, 1, number from numbers(300) union all -select 2, 'sum_2', toDateTime(today()) - number * 60 - 30, number, 1, number from numbers(300) union all -select 1, 'max_1', toDateTime(today()) - number * 60 - 30, number, 1, number from numbers(300) union all -select 2, 'max_1', toDateTime(today()) - number * 60 - 30, number, 1, number from numbers(300) union all -select 1, 'max_2', toDateTime(today()) - number * 60 - 30, number, 1, number from numbers(300) union all -select 2, 'max_2', toDateTime(today()) - number * 60 - 30, number, 1, number from numbers(300); +SET joined_subquery_requires_alias = 0; -insert into test_graphite -select 1, 'sum_1', toDateTime(today() - 3) - number * 60 - 30, number, 1, number from numbers(1200) union all -select 2, 'sum_1', toDateTime(today() - 3) - number * 60 - 30, number, 1, number from numbers(1200) union all -select 1, 'sum_2', toDateTime(today() - 3) - number * 60 - 30, number, 1, number from numbers(1200) union all -select 2, 'sum_2', toDateTime(today() - 3) - number * 60 - 30, number, 1, number from numbers(1200) union all -select 1, 'max_1', toDateTime(today() - 3) - number * 60 - 30, number, 1, number from numbers(1200) union all -select 2, 'max_1', toDateTime(today() - 3) - number * 60 - 30, number, 1, number from numbers(1200) union all -select 1, 'max_2', toDateTime(today() - 3) - number * 60 - 30, number, 1, number from numbers(1200) union all -select 2, 'max_2', toDateTime(today() - 3) - number * 60 - 30, number, 1, number from numbers(1200); +INSERT into test_graphite +WITH dates AS + ( + SELECT toStartOfDay(toDateTime(now('UTC'), 'UTC')) as today, + today - INTERVAL 3 day as older_date + ) + -- Newer than 2 days are kept in windows of 600 seconds + select 1, 'sum_1', today - number * 60 - 30, number, 1, number from dates, numbers(300) union all + select 2, 'sum_1', today - number * 60 - 30, number, 1, number from dates, numbers(300) union all + select 1, 'sum_2', today - number * 60 - 30, number, 1, number from dates, numbers(300) union all + select 2, 'sum_2', today - number * 60 - 30, number, 1, number from dates, numbers(300) union all + select 1, 'max_1', today - number * 60 - 30, number, 1, number from dates, numbers(300) union all + select 2, 'max_1', today - number * 60 - 30, number, 1, number from dates, numbers(300) union all + select 1, 'max_2', today - number * 60 - 30, number, 1, number from dates, numbers(300) union all + select 2, 'max_2', today - number * 60 - 30, number, 1, number from dates, numbers(300) union all -optimize table test_graphite; + -- Older than 2 days use 6000 second windows + select 1, 'sum_1', older_date - number * 60 - 30, number, 1, number from dates, numbers(1200) union all + select 2, 'sum_1', older_date - number * 60 - 30, number, 1, number from dates, numbers(1200) union all + select 1, 'sum_2', older_date - number * 60 - 30, number, 1, number from dates, numbers(1200) union all + select 2, 'sum_2', older_date - number * 60 - 30, number, 1, number from dates, numbers(1200) union all + select 1, 'max_1', older_date - number * 60 - 30, number, 1, number from dates, numbers(1200) union all + select 2, 'max_1', older_date - number * 60 - 30, number, 1, number from dates, numbers(1200) union all + select 1, 'max_2', older_date - number * 60 - 30, number, 1, number from dates, numbers(1200) union all + select 2, 'max_2', older_date - number * 60 - 30, number, 1, number from dates, numbers(1200); + +optimize table test_graphite final; select key, Path, Value, Version, col from test_graphite order by key, Path, Time desc; diff --git a/tests/queries/0_stateless/01244_optimize_distributed_group_by_sharding_key.reference b/tests/queries/0_stateless/01244_optimize_distributed_group_by_sharding_key.reference index acaf6531101..a4a6b87de25 100644 --- a/tests/queries/0_stateless/01244_optimize_distributed_group_by_sharding_key.reference +++ b/tests/queries/0_stateless/01244_optimize_distributed_group_by_sharding_key.reference @@ -57,7 +57,9 @@ LIMIT 1 0 LIMIT OFFSET 1 1 -OFFSET +OFFSET distributed_push_down_limit=0 +1 1 +OFFSET distributed_push_down_limit=1 1 1 1 0 1 1 @@ -65,6 +67,8 @@ WHERE LIMIT OFFSET 1 1 LIMIT BY 1 1 0 +1 0 +1 1 1 1 GROUP BY (Distributed-over-Distributed) 4 0 @@ -115,6 +119,7 @@ GROUP BY WITH TOTALS LIMIT 2 0 4 0 +GROUP BY (compound) GROUP BY sharding_key, ... 0 0 1 0 @@ -123,6 +128,15 @@ GROUP BY sharding_key, ... GROUP BY ..., sharding_key 0 0 1 0 +0 0 +1 0 +sharding_key (compound) +1 2 3 +1 2 3 +1 2 6 +1 2 +1 2 +2 window functions 0 0 1 0 diff --git a/tests/queries/0_stateless/01244_optimize_distributed_group_by_sharding_key.sql b/tests/queries/0_stateless/01244_optimize_distributed_group_by_sharding_key.sql index 6b6300a4871..a8dc0d91c37 100644 --- a/tests/queries/0_stateless/01244_optimize_distributed_group_by_sharding_key.sql +++ b/tests/queries/0_stateless/01244_optimize_distributed_group_by_sharding_key.sql @@ -60,8 +60,10 @@ select 'LIMIT'; select count(), * from dist_01247 group by number limit 1; select 'LIMIT OFFSET'; select count(), * from dist_01247 group by number limit 1 offset 1; -select 'OFFSET'; -select count(), * from dist_01247 group by number offset 1; +select 'OFFSET distributed_push_down_limit=0'; +select count(), * from dist_01247 group by number offset 1 settings distributed_push_down_limit=0; +select 'OFFSET distributed_push_down_limit=1'; +select count(), * from dist_01247 group by number offset 1 settings distributed_push_down_limit=1; -- this will emulate different data on for different shards select 'WHERE LIMIT OFFSET'; select count(), * from dist_01247 where number = _shard_num-1 group by number order by number limit 1 offset 1; @@ -97,6 +99,7 @@ select 'GROUP BY WITH TOTALS LIMIT'; select count(), * from dist_01247 group by number with totals limit 1; -- GROUP BY (compound) +select 'GROUP BY (compound)'; drop table if exists dist_01247; drop table if exists data_01247; create table data_01247 engine=Memory() as select number key, 0 value from numbers(2); @@ -106,9 +109,16 @@ select * from dist_01247 group by key, value; select 'GROUP BY ..., sharding_key'; select * from dist_01247 group by value, key; +-- sharding_key (compound) +select 'sharding_key (compound)'; +select k1, k2, sum(v) from remote('127.{1,2}', view(select 1 k1, 2 k2, 3 v), cityHash64(k1, k2)) group by k1, k2; -- optimization applied +select k1, any(k2), sum(v) from remote('127.{1,2}', view(select 1 k1, 2 k2, 3 v), cityHash64(k1, k2)) group by k1; -- optimization does not applied +select distinct k1, k2 from remote('127.{1,2}', view(select 1 k1, 2 k2, 3 v), cityHash64(k1, k2)); -- optimization applied +select distinct on (k1) k2 from remote('127.{1,2}', view(select 1 k1, 2 k2, 3 v), cityHash64(k1, k2)); -- optimization does not applied + -- window functions select 'window functions'; -select key, sum(sum(value)) over (rows unbounded preceding) from dist_01247 group by key settings allow_experimental_window_functions=1; +select key, sum(sum(value)) over (rows unbounded preceding) from dist_01247 group by key; drop table dist_01247; drop table data_01247; diff --git a/tests/queries/0_stateless/01246_extractAllGroupsHorizontal.reference b/tests/queries/0_stateless/01246_extractAllGroupsHorizontal.reference index 13e717485d8..2aed6b7a3c0 100644 --- a/tests/queries/0_stateless/01246_extractAllGroupsHorizontal.reference +++ b/tests/queries/0_stateless/01246_extractAllGroupsHorizontal.reference @@ -1,4 +1,3 @@ -0 groups, zero matches 1 group, multiple matches, String and FixedString [['hello','world']] [['hello','world']] diff --git a/tests/queries/0_stateless/01246_extractAllGroupsHorizontal.sql b/tests/queries/0_stateless/01246_extractAllGroupsHorizontal.sql index b7a71415a9d..d28402056d3 100644 --- a/tests/queries/0_stateless/01246_extractAllGroupsHorizontal.sql +++ b/tests/queries/0_stateless/01246_extractAllGroupsHorizontal.sql @@ -5,9 +5,11 @@ SELECT extractAllGroupsHorizontal('hello', 123); --{serverError 43} invalid arg SELECT extractAllGroupsHorizontal(123, 'world'); --{serverError 43} invalid argument type SELECT extractAllGroupsHorizontal('hello world', '((('); --{serverError 427} invalid re SELECT extractAllGroupsHorizontal('hello world', materialize('\\w+')); --{serverError 44} non-cons needle +SELECT extractAllGroupsHorizontal('hello world', '\\w+'); -- { serverError 36 } 0 groups +SELECT extractAllGroupsHorizontal('hello world', '(\\w+)') SETTINGS regexp_max_matches_per_row = 0; -- { serverError 128 } to many groups matched per row +SELECT extractAllGroupsHorizontal('hello world', '(\\w+)') SETTINGS regexp_max_matches_per_row = 1; -- { serverError 128 } to many groups matched per row -SELECT '0 groups, zero matches'; -SELECT extractAllGroupsHorizontal('hello world', '\\w+'); -- { serverError 36 } +SELECT extractAllGroupsHorizontal('hello world', '(\\w+)') SETTINGS regexp_max_matches_per_row = 1000000 FORMAT Null; -- users now can set limit bigger than previous 1000 matches per row SELECT '1 group, multiple matches, String and FixedString'; SELECT extractAllGroupsHorizontal('hello world', '(\\w+)'); diff --git a/tests/queries/0_stateless/01246_extractAllGroupsVertical.reference b/tests/queries/0_stateless/01246_extractAllGroupsVertical.reference index 983e3838ee5..80b0bf2884d 100644 --- a/tests/queries/0_stateless/01246_extractAllGroupsVertical.reference +++ b/tests/queries/0_stateless/01246_extractAllGroupsVertical.reference @@ -1,4 +1,3 @@ -0 groups, zero matches 1 group, multiple matches, String and FixedString [['hello'],['world']] [['hello'],['world']] diff --git a/tests/queries/0_stateless/01246_extractAllGroupsVertical.sql b/tests/queries/0_stateless/01246_extractAllGroupsVertical.sql index 8edc3f3e741..65ddbfe411b 100644 --- a/tests/queries/0_stateless/01246_extractAllGroupsVertical.sql +++ b/tests/queries/0_stateless/01246_extractAllGroupsVertical.sql @@ -5,9 +5,7 @@ SELECT extractAllGroupsVertical('hello', 123); --{serverError 43} invalid argum SELECT extractAllGroupsVertical(123, 'world'); --{serverError 43} invalid argument type SELECT extractAllGroupsVertical('hello world', '((('); --{serverError 427} invalid re SELECT extractAllGroupsVertical('hello world', materialize('\\w+')); --{serverError 44} non-const needle - -SELECT '0 groups, zero matches'; -SELECT extractAllGroupsVertical('hello world', '\\w+'); -- { serverError 36 } +SELECT extractAllGroupsVertical('hello world', '\\w+'); -- { serverError 36 } 0 groups SELECT '1 group, multiple matches, String and FixedString'; SELECT extractAllGroupsVertical('hello world', '(\\w+)'); diff --git a/tests/queries/0_stateless/01247_some_msan_crashs_from_22517.reference b/tests/queries/0_stateless/01247_some_msan_crashs_from_22517.reference new file mode 100644 index 00000000000..573541ac970 --- /dev/null +++ b/tests/queries/0_stateless/01247_some_msan_crashs_from_22517.reference @@ -0,0 +1 @@ +0 diff --git a/tests/queries/0_stateless/01247_some_msan_crashs_from_22517.sql b/tests/queries/0_stateless/01247_some_msan_crashs_from_22517.sql new file mode 100644 index 00000000000..8bcbbde63d6 --- /dev/null +++ b/tests/queries/0_stateless/01247_some_msan_crashs_from_22517.sql @@ -0,0 +1,3 @@ +SELECT a FROM (SELECT ignore((SELECT 1)) AS a, a AS b); + +SELECT x FROM (SELECT dummy AS x, plus(ignore(ignore(ignore(ignore('-922337203.6854775808', ignore(NULL)), ArrLen = 256, ignore(100, Arr.C3, ignore(NULL), (SELECT 10.000100135803223, count(*) FROM system.time_zones) > NULL)))), dummy, 65535) AS dummy ORDER BY ignore(-2) ASC, identity(x) DESC NULLS FIRST) FORMAT Null; -- { serverError 47 } diff --git a/tests/queries/0_stateless/01260_ubsan_decimal_parse.reference b/tests/queries/0_stateless/01260_ubsan_decimal_parse.reference index 945da8ffd36..573541ac970 100644 --- a/tests/queries/0_stateless/01260_ubsan_decimal_parse.reference +++ b/tests/queries/0_stateless/01260_ubsan_decimal_parse.reference @@ -1 +1 @@ -0.000000 +0 diff --git a/tests/queries/0_stateless/01267_alter_default_key_columns_zookeeper.reference b/tests/queries/0_stateless/01267_alter_default_key_columns_zookeeper_long.reference similarity index 100% rename from tests/queries/0_stateless/01267_alter_default_key_columns_zookeeper.reference rename to tests/queries/0_stateless/01267_alter_default_key_columns_zookeeper_long.reference diff --git a/tests/queries/0_stateless/01267_alter_default_key_columns_zookeeper.sql b/tests/queries/0_stateless/01267_alter_default_key_columns_zookeeper_long.sql similarity index 83% rename from tests/queries/0_stateless/01267_alter_default_key_columns_zookeeper.sql rename to tests/queries/0_stateless/01267_alter_default_key_columns_zookeeper_long.sql index d96085bc086..6e7f4d55a53 100644 --- a/tests/queries/0_stateless/01267_alter_default_key_columns_zookeeper.sql +++ b/tests/queries/0_stateless/01267_alter_default_key_columns_zookeeper_long.sql @@ -8,8 +8,8 @@ DROP TABLE test_alter; DROP TABLE IF EXISTS test_alter_r1; DROP TABLE IF EXISTS test_alter_r2; -CREATE TABLE test_alter_r1 (x Date, s String) ENGINE = ReplicatedMergeTree('/clickhouse/tables/test_01267/alter', 'r1') ORDER BY s PARTITION BY x; -CREATE TABLE test_alter_r2 (x Date, s String) ENGINE = ReplicatedMergeTree('/clickhouse/tables/test_01267/alter', 'r2') ORDER BY s PARTITION BY x; +CREATE TABLE test_alter_r1 (x Date, s String) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/test_01267/alter', 'r1') ORDER BY s PARTITION BY x; +CREATE TABLE test_alter_r2 (x Date, s String) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/test_01267/alter', 'r2') ORDER BY s PARTITION BY x; ALTER TABLE test_alter_r1 MODIFY COLUMN s DEFAULT 'Hello' SETTINGS replication_alter_partitions_sync = 2; ALTER TABLE test_alter_r2 MODIFY COLUMN x DEFAULT '2000-01-01' SETTINGS replication_alter_partitions_sync = 2; diff --git a/tests/queries/0_stateless/01269_toStartOfSecond.sql b/tests/queries/0_stateless/01269_toStartOfSecond.sql index 5fe6aa9602f..b74eaabf351 100644 --- a/tests/queries/0_stateless/01269_toStartOfSecond.sql +++ b/tests/queries/0_stateless/01269_toStartOfSecond.sql @@ -4,10 +4,10 @@ SELECT toStartOfSecond(now()); -- {serverError 43} SELECT toStartOfSecond(); -- {serverError 42} SELECT toStartOfSecond(now64(), 123); -- {serverError 43} -WITH toDateTime64('2019-09-16 19:20:11', 3) AS dt64 SELECT toStartOfSecond(dt64, 'UTC') AS res, toTypeName(res); +WITH toDateTime64('2019-09-16 19:20:11', 3, 'Europe/Moscow') AS dt64 SELECT toStartOfSecond(dt64, 'UTC') AS res, toTypeName(res); WITH toDateTime64('2019-09-16 19:20:11', 0, 'UTC') AS dt64 SELECT toStartOfSecond(dt64) AS res, toTypeName(res); WITH toDateTime64('2019-09-16 19:20:11.123', 3, 'UTC') AS dt64 SELECT toStartOfSecond(dt64) AS res, toTypeName(res); WITH toDateTime64('2019-09-16 19:20:11.123', 9, 'UTC') AS dt64 SELECT toStartOfSecond(dt64) AS res, toTypeName(res); SELECT 'non-const column'; -WITH toDateTime64('2019-09-16 19:20:11.123', 3, 'UTC') AS dt64 SELECT toStartOfSecond(materialize(dt64)) AS res, toTypeName(res); \ No newline at end of file +WITH toDateTime64('2019-09-16 19:20:11.123', 3, 'UTC') AS dt64 SELECT toStartOfSecond(materialize(dt64)) AS res, toTypeName(res); diff --git a/tests/queries/0_stateless/01271_show_privileges.reference b/tests/queries/0_stateless/01271_show_privileges.reference index 035cb902bff..95f9e407f21 100644 --- a/tests/queries/0_stateless/01271_show_privileges.reference +++ b/tests/queries/0_stateless/01271_show_privileges.reference @@ -119,6 +119,7 @@ REMOTE [] GLOBAL SOURCES MONGO [] GLOBAL SOURCES MYSQL [] GLOBAL SOURCES POSTGRES [] GLOBAL SOURCES +SQLITE [] GLOBAL SOURCES ODBC [] GLOBAL SOURCES JDBC [] GLOBAL SOURCES HDFS [] GLOBAL SOURCES diff --git a/tests/queries/0_stateless/01271_show_privileges.sql b/tests/queries/0_stateless/01271_show_privileges.sql index efd6ddb200c..e3210a7ae00 100644 --- a/tests/queries/0_stateless/01271_show_privileges.sql +++ b/tests/queries/0_stateless/01271_show_privileges.sql @@ -1 +1 @@ -SHOW PRIVILEGES; \ No newline at end of file +SHOW PRIVILEGES; diff --git a/tests/queries/0_stateless/01273_arrow.reference b/tests/queries/0_stateless/01273_arrow.reference index 0dc503f65e4..89eca82f8ef 100644 --- a/tests/queries/0_stateless/01273_arrow.reference +++ b/tests/queries/0_stateless/01273_arrow.reference @@ -41,7 +41,7 @@ converted: 127 255 32767 65535 2147483647 4294967295 9223372036854775807 9223372036854775807 -1.032 -1.064 string-2 fixedstring-2\0\0 2004-06-07 2004-02-03 04:05:06 diff: dest: -79 81 82 83 84 85 86 87 88 89 str01\0\0\0\0\0\0\0\0\0\0 fstr1\0\0\0\0\0\0\0\0\0\0 2003-03-04 1970-01-01 06:29:04 +79 81 82 83 84 85 86 87 88 89 str01\0\0\0\0\0\0\0\0\0\0 fstr1\0\0\0\0\0\0\0\0\0\0 2003-03-04 2004-05-06 00:00:00 80 81 82 83 84 85 86 87 88 89 str02 fstr2\0\0\0\0\0\0\0\0\0\0 2005-03-04 2006-08-09 10:11:12 min: -128 0 0 0 0 0 0 0 -1 -1 string-1\0\0\0\0\0\0\0 fixedstring-1\0\0 2003-04-05 2003-02-03 @@ -49,10 +49,10 @@ min: 79 81 82 83 84 85 86 87 88 89 str01\0\0\0\0\0\0\0\0\0\0 fstr1\0\0\0\0\0\0\0\0\0\0 2003-03-04 2004-05-06 127 -1 -1 -1 -1 -1 -1 -1 -1 -1 string-2\0\0\0\0\0\0\0 fixedstring-2\0\0 2004-06-07 2004-02-03 max: --128 0 -32768 0 -2147483648 0 -9223372036854775808 0 -1 -1 string-1 fixedstring-1\0\0 1970-01-01 06:22:27 2003-02-03 04:05:06 --108 108 -1016 1116 -1032 1132 -1064 1164 -1 -1 string-0 fixedstring\0\0\0\0 1970-01-01 06:09:16 2002-02-03 04:05:06 +-128 0 -32768 0 -2147483648 0 -9223372036854775808 0 -1 -1 string-1 fixedstring-1\0\0 2003-04-05 00:00:00 2003-02-03 04:05:06 +-108 108 -1016 1116 -1032 1132 -1064 1164 -1 -1 string-0 fixedstring\0\0\0\0 2001-02-03 00:00:00 2002-02-03 04:05:06 80 81 82 83 84 85 86 87 88 89 str02 fstr2 2005-03-04 05:06:07 2006-08-09 10:11:12 -127 255 32767 65535 2147483647 4294967295 9223372036854775807 9223372036854775807 -1 -1 string-2 fixedstring-2\0\0 1970-01-01 06:29:36 2004-02-03 04:05:06 +127 255 32767 65535 2147483647 4294967295 9223372036854775807 9223372036854775807 -1 -1 string-2 fixedstring-2\0\0 2004-06-07 00:00:00 2004-02-03 04:05:06 dest from null: -128 0 -32768 0 -2147483648 0 -9223372036854775808 0 -1.032 -1.064 string-1 fixedstring-1\0\0 2003-04-05 2003-02-03 04:05:06 -108 108 -1016 1116 -1032 1132 -1064 1164 -1.032 -1.064 string-0 fixedstring\0\0\0\0 2001-02-03 2002-02-03 04:05:06 diff --git a/tests/queries/0_stateless/01273_arrow_decimal.reference b/tests/queries/0_stateless/01273_arrow_decimal.reference index a512796de07..1358d3fa841 100644 --- a/tests/queries/0_stateless/01273_arrow_decimal.reference +++ b/tests/queries/0_stateless/01273_arrow_decimal.reference @@ -1,2 +1,2 @@ -0.1230 0.12312312 0.1231231231230000 0.12312312312312312300000000000000 -0.1230 0.12312312 0.1231231231230000 0.12312312312312312300000000000000 +0.123 0.12312312 0.123123123123 0.123123123123123123 +0.123 0.12312312 0.123123123123 0.123123123123123123 diff --git a/tests/queries/0_stateless/01273_arrow_dictionaries_load.reference b/tests/queries/0_stateless/01273_arrow_dictionaries_load.reference index 7321c396a59..99f5e505d82 100644 --- a/tests/queries/0_stateless/01273_arrow_dictionaries_load.reference +++ b/tests/queries/0_stateless/01273_arrow_dictionaries_load.reference @@ -1,2 +1,5 @@ 1 ['a','b','c'] ('z','6') 2 ['d','e'] ('x','9') +1 ['a','b','c'] ('z','6') +2 ['d','e'] ('x','9') +20000000 diff --git a/tests/queries/0_stateless/01273_arrow_dictionaries_load.sh b/tests/queries/0_stateless/01273_arrow_dictionaries_load.sh index 38e6c2c1b01..3f6fcff3dcc 100755 --- a/tests/queries/0_stateless/01273_arrow_dictionaries_load.sh +++ b/tests/queries/0_stateless/01273_arrow_dictionaries_load.sh @@ -20,5 +20,7 @@ ${CLICKHOUSE_CLIENT} --query="SELECT * FROM arrow_dicts FORMAT Arrow SETTINGS ou cat "${CLICKHOUSE_TMP}"/dicts.arrow | ${CLICKHOUSE_CLIENT} -q "INSERT INTO arrow_dicts FORMAT Arrow" +${CLICKHOUSE_CLIENT} --query="SELECT count() FROM arrow_dicts" + ${CLICKHOUSE_CLIENT} --query="DROP TABLE arrow_dicts" diff --git a/tests/queries/0_stateless/01273_arrow_load.sh b/tests/queries/0_stateless/01273_arrow_load.sh index b2ca0e32af1..bc5588a905b 100755 --- a/tests/queries/0_stateless/01273_arrow_load.sh +++ b/tests/queries/0_stateless/01273_arrow_load.sh @@ -11,7 +11,7 @@ CB_DIR=$(dirname "$CLICKHOUSE_CLIENT_BINARY") DATA_FILE=$CUR_DIR/data_arrow/test.arrow ${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS arrow_load" -${CLICKHOUSE_CLIENT} --query="CREATE TABLE arrow_load (bool UInt8, int8 Int8, int16 Int16, int32 Int32, int64 Int64, uint8 UInt8, uint16 UInt16, uint32 UInt32, uint64 UInt64, halffloat Float32, float Float32, double Float64, string String, date32 Date, date64 DateTime, timestamp DateTime) ENGINE = Memory" +${CLICKHOUSE_CLIENT} --query="CREATE TABLE arrow_load (bool UInt8, int8 Int8, int16 Int16, int32 Int32, int64 Int64, uint8 UInt8, uint16 UInt16, uint32 UInt32, uint64 UInt64, halffloat Float32, float Float32, double Float64, string String, date32 Date, date64 DateTime('Europe/Moscow'), timestamp DateTime('Europe/Moscow')) ENGINE = Memory" cat "$DATA_FILE" | ${CLICKHOUSE_CLIENT} -q "insert into arrow_load format Arrow" ${CLICKHOUSE_CLIENT} --query="select * from arrow_load" diff --git a/tests/queries/0_stateless/01273_arrow_stream.reference b/tests/queries/0_stateless/01273_arrow_stream.reference index 0dc503f65e4..89eca82f8ef 100644 --- a/tests/queries/0_stateless/01273_arrow_stream.reference +++ b/tests/queries/0_stateless/01273_arrow_stream.reference @@ -41,7 +41,7 @@ converted: 127 255 32767 65535 2147483647 4294967295 9223372036854775807 9223372036854775807 -1.032 -1.064 string-2 fixedstring-2\0\0 2004-06-07 2004-02-03 04:05:06 diff: dest: -79 81 82 83 84 85 86 87 88 89 str01\0\0\0\0\0\0\0\0\0\0 fstr1\0\0\0\0\0\0\0\0\0\0 2003-03-04 1970-01-01 06:29:04 +79 81 82 83 84 85 86 87 88 89 str01\0\0\0\0\0\0\0\0\0\0 fstr1\0\0\0\0\0\0\0\0\0\0 2003-03-04 2004-05-06 00:00:00 80 81 82 83 84 85 86 87 88 89 str02 fstr2\0\0\0\0\0\0\0\0\0\0 2005-03-04 2006-08-09 10:11:12 min: -128 0 0 0 0 0 0 0 -1 -1 string-1\0\0\0\0\0\0\0 fixedstring-1\0\0 2003-04-05 2003-02-03 @@ -49,10 +49,10 @@ min: 79 81 82 83 84 85 86 87 88 89 str01\0\0\0\0\0\0\0\0\0\0 fstr1\0\0\0\0\0\0\0\0\0\0 2003-03-04 2004-05-06 127 -1 -1 -1 -1 -1 -1 -1 -1 -1 string-2\0\0\0\0\0\0\0 fixedstring-2\0\0 2004-06-07 2004-02-03 max: --128 0 -32768 0 -2147483648 0 -9223372036854775808 0 -1 -1 string-1 fixedstring-1\0\0 1970-01-01 06:22:27 2003-02-03 04:05:06 --108 108 -1016 1116 -1032 1132 -1064 1164 -1 -1 string-0 fixedstring\0\0\0\0 1970-01-01 06:09:16 2002-02-03 04:05:06 +-128 0 -32768 0 -2147483648 0 -9223372036854775808 0 -1 -1 string-1 fixedstring-1\0\0 2003-04-05 00:00:00 2003-02-03 04:05:06 +-108 108 -1016 1116 -1032 1132 -1064 1164 -1 -1 string-0 fixedstring\0\0\0\0 2001-02-03 00:00:00 2002-02-03 04:05:06 80 81 82 83 84 85 86 87 88 89 str02 fstr2 2005-03-04 05:06:07 2006-08-09 10:11:12 -127 255 32767 65535 2147483647 4294967295 9223372036854775807 9223372036854775807 -1 -1 string-2 fixedstring-2\0\0 1970-01-01 06:29:36 2004-02-03 04:05:06 +127 255 32767 65535 2147483647 4294967295 9223372036854775807 9223372036854775807 -1 -1 string-2 fixedstring-2\0\0 2004-06-07 00:00:00 2004-02-03 04:05:06 dest from null: -128 0 -32768 0 -2147483648 0 -9223372036854775808 0 -1.032 -1.064 string-1 fixedstring-1\0\0 2003-04-05 2003-02-03 04:05:06 -108 108 -1016 1116 -1032 1132 -1064 1164 -1.032 -1.064 string-0 fixedstring\0\0\0\0 2001-02-03 2002-02-03 04:05:06 diff --git a/tests/queries/0_stateless/01277_alter_rename_column_constraint_zookeeper.reference b/tests/queries/0_stateless/01277_alter_rename_column_constraint_zookeeper_long.reference similarity index 90% rename from tests/queries/0_stateless/01277_alter_rename_column_constraint_zookeeper.reference rename to tests/queries/0_stateless/01277_alter_rename_column_constraint_zookeeper_long.reference index 84ca8273128..382ccb592af 100644 --- a/tests/queries/0_stateless/01277_alter_rename_column_constraint_zookeeper.reference +++ b/tests/queries/0_stateless/01277_alter_rename_column_constraint_zookeeper_long.reference @@ -7,7 +7,7 @@ 2019-10-01 6 6 7 8 2019-10-02 7 7 8 9 2019-10-03 8 8 9 10 -CREATE TABLE default.table_for_rename1\n(\n `date` Date,\n `key` UInt64,\n `value4` String,\n `value5` String,\n `value3` String,\n CONSTRAINT cs_value1 CHECK toInt64(value4) < toInt64(value5),\n CONSTRAINT cs_value2 CHECK toInt64(value5) < toInt64(value3)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/tables/test_01277/test_for_rename\', \'1\')\nPARTITION BY date\nORDER BY key\nSETTINGS index_granularity = 8192 +CREATE TABLE default.table_for_rename1\n(\n `date` Date,\n `key` UInt64,\n `value4` String,\n `value5` String,\n `value3` String,\n CONSTRAINT cs_value1 CHECK toInt64(value4) < toInt64(value5),\n CONSTRAINT cs_value2 CHECK toInt64(value5) < toInt64(value3)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/tables/default/test_01277/test_for_rename\', \'1\')\nPARTITION BY date\nORDER BY key\nSETTINGS index_granularity = 8192 2019-10-01 0 0 1 2 2019-10-02 1 1 2 3 2019-10-03 2 2 3 4 @@ -38,7 +38,7 @@ CREATE TABLE default.table_for_rename1\n(\n `date` Date,\n `key` UInt64,\n 2019-10-01 18 18 19 20 2019-10-02 19 19 20 21 -- rename columns back -- -CREATE TABLE default.table_for_rename1\n(\n `date` Date,\n `key` UInt64,\n `value1` String,\n `value2` String,\n `value3` String,\n CONSTRAINT cs_value1 CHECK toInt64(value1) < toInt64(value2),\n CONSTRAINT cs_value2 CHECK toInt64(value2) < toInt64(value3)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/tables/test_01277/test_for_rename\', \'1\')\nPARTITION BY date\nORDER BY key\nSETTINGS index_granularity = 8192 +CREATE TABLE default.table_for_rename1\n(\n `date` Date,\n `key` UInt64,\n `value1` String,\n `value2` String,\n `value3` String,\n CONSTRAINT cs_value1 CHECK toInt64(value1) < toInt64(value2),\n CONSTRAINT cs_value2 CHECK toInt64(value2) < toInt64(value3)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/tables/default/test_01277/test_for_rename\', \'1\')\nPARTITION BY date\nORDER BY key\nSETTINGS index_granularity = 8192 2019-10-01 0 0 1 2 2019-10-02 1 1 2 3 2019-10-03 2 2 3 4 diff --git a/tests/queries/0_stateless/01277_alter_rename_column_constraint_zookeeper.sql b/tests/queries/0_stateless/01277_alter_rename_column_constraint_zookeeper_long.sql similarity index 95% rename from tests/queries/0_stateless/01277_alter_rename_column_constraint_zookeeper.sql rename to tests/queries/0_stateless/01277_alter_rename_column_constraint_zookeeper_long.sql index 28f17dced97..10ab75e42bd 100644 --- a/tests/queries/0_stateless/01277_alter_rename_column_constraint_zookeeper.sql +++ b/tests/queries/0_stateless/01277_alter_rename_column_constraint_zookeeper_long.sql @@ -10,7 +10,7 @@ CREATE TABLE table_for_rename1 CONSTRAINT cs_value1 CHECK toInt64(value1) < toInt64(value2), CONSTRAINT cs_value2 CHECK toInt64(value2) < toInt64(value3) ) -ENGINE = ReplicatedMergeTree('/clickhouse/tables/test_01277/test_for_rename', '1') +ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/test_01277/test_for_rename', '1') PARTITION BY date ORDER BY key; diff --git a/tests/queries/0_stateless/01277_toUnixTimestamp64.sql b/tests/queries/0_stateless/01277_toUnixTimestamp64.sql index de2b132a2dc..eb3e8c612ed 100644 --- a/tests/queries/0_stateless/01277_toUnixTimestamp64.sql +++ b/tests/queries/0_stateless/01277_toUnixTimestamp64.sql @@ -12,22 +12,22 @@ SELECT toUnixTimestamp64Micro('abc', 123); -- {serverError 42} SELECT toUnixTimestamp64Nano('abc', 123); -- {serverError 42} SELECT 'const column'; -WITH toDateTime64('2019-09-16 19:20:12.345678910', 3) AS dt64 +WITH toDateTime64('2019-09-16 19:20:12.345678910', 3, 'Europe/Moscow') AS dt64 SELECT dt64, toUnixTimestamp64Milli(dt64), toUnixTimestamp64Micro(dt64), toUnixTimestamp64Nano(dt64); -WITH toDateTime64('2019-09-16 19:20:12.345678910', 6) AS dt64 +WITH toDateTime64('2019-09-16 19:20:12.345678910', 6, 'Europe/Moscow') AS dt64 SELECT dt64, toUnixTimestamp64Milli(dt64), toUnixTimestamp64Micro(dt64), toUnixTimestamp64Nano(dt64); -WITH toDateTime64('2019-09-16 19:20:12.345678910', 9) AS dt64 +WITH toDateTime64('2019-09-16 19:20:12.345678910', 9, 'Europe/Moscow') AS dt64 SELECT dt64, toUnixTimestamp64Milli(dt64), toUnixTimestamp64Micro(dt64), toUnixTimestamp64Nano(dt64); SELECT 'non-const column'; -WITH toDateTime64('2019-09-16 19:20:12.345678910', 3) AS x +WITH toDateTime64('2019-09-16 19:20:12.345678910', 3, 'Europe/Moscow') AS x SELECT materialize(x) as dt64, toUnixTimestamp64Milli(dt64), toUnixTimestamp64Micro(dt64), toUnixTimestamp64Nano(dt64); -WITH toDateTime64('2019-09-16 19:20:12.345678910', 6) AS x +WITH toDateTime64('2019-09-16 19:20:12.345678910', 6, 'Europe/Moscow') AS x SELECT materialize(x) as dt64, toUnixTimestamp64Milli(dt64), toUnixTimestamp64Micro(dt64), toUnixTimestamp64Nano(dt64); -WITH toDateTime64('2019-09-16 19:20:12.345678910', 9) AS x +WITH toDateTime64('2019-09-16 19:20:12.345678910', 9, 'Europe/Moscow') AS x SELECT materialize(x) as dt64, toUnixTimestamp64Milli(dt64), toUnixTimestamp64Micro(dt64), toUnixTimestamp64Nano(dt64); diff --git a/tests/queries/0_stateless/01278_min_insert_block_size_rows_for_materialized_views.reference b/tests/queries/0_stateless/01278_min_insert_block_size_rows_for_materialized_views.reference index e4872ddeddd..d21c1e74770 100644 --- a/tests/queries/0_stateless/01278_min_insert_block_size_rows_for_materialized_views.reference +++ b/tests/queries/0_stateless/01278_min_insert_block_size_rows_for_materialized_views.reference @@ -1,4 +1,8 @@ -0 -0 -800000 -1600000 +Should throw 1 + KO(241) +Should throw 2 + KO(241) +Should pass 1 + OK +Should pass 2 + OK diff --git a/tests/queries/0_stateless/01278_min_insert_block_size_rows_for_materialized_views.sh b/tests/queries/0_stateless/01278_min_insert_block_size_rows_for_materialized_views.sh index 80af1b2c17f..dde6b8ccadb 100755 --- a/tests/queries/0_stateless/01278_min_insert_block_size_rows_for_materialized_views.sh +++ b/tests/queries/0_stateless/01278_min_insert_block_size_rows_for_materialized_views.sh @@ -7,6 +7,7 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # just in case set -o pipefail +# shellcheck disable=SC2120 function execute() { ${CLICKHOUSE_CLIENT} -n "$@" @@ -64,8 +65,7 @@ echo "create table out_01278 as data_01278 Engine=Merge('$CLICKHOUSE_DATABASE', # function execute_insert() { - { - cat < /dev/null 2>&1 + local ret_code=$? + if [[ $ret_code -eq 0 ]]; + then + echo " OK" + else + echo " KO($ret_code)" + fi } # fails +echo "Should throw 1" execute_insert --testmode +echo "Should throw 2" execute_insert --testmode --min_insert_block_size_rows=1 --min_insert_block_size_rows_for_materialized_views=$((1<<20)) # passes +echo "Should pass 1" execute_insert --min_insert_block_size_rows=1 +echo "Should pass 2" execute_insert --min_insert_block_size_rows_for_materialized_views=1 diff --git a/tests/queries/0_stateless/01280_min_map_max_map.reference b/tests/queries/0_stateless/01280_min_map_max_map.reference index 37a8bfcc643..7bd7fb8d74a 100644 --- a/tests/queries/0_stateless/01280_min_map_max_map.reference +++ b/tests/queries/0_stateless/01280_min_map_max_map.reference @@ -1,9 +1,9 @@ ([0,1,2,3,4,5,6,7,8,9,10],[10,1,1,1,1,1,1,1,1,1,1]) Tuple(Array(Int32), Array(UInt64)) ([1],[-49]) -([1.00],[-49.00]) +([1],[-49]) ([0,1,2,3,4,5,6,7,8,9,10],[100,91,92,93,94,95,96,97,98,99,1]) Tuple(Array(Int32), Array(UInt64)) ([1],[50]) -([1.00],[50.00]) +([1],[50]) (['01234567-89ab-cdef-0123-456789abcdef'],['01111111-89ab-cdef-0123-456789abcdef']) (['1'],['1']) (['1'],['1']) diff --git a/tests/queries/0_stateless/01280_ttl_where_group_by.reference b/tests/queries/0_stateless/01280_ttl_where_group_by.reference index 7fe00709dee..65e7e5b158f 100644 --- a/tests/queries/0_stateless/01280_ttl_where_group_by.reference +++ b/tests/queries/0_stateless/01280_ttl_where_group_by.reference @@ -16,11 +16,11 @@ ttl_01280_3 2 1 0 3 3 1 8 2 ttl_01280_4 -1 1 0 4 -10 2 13 9 +0 4 +13 9 ttl_01280_5 1 2 7 5 2 3 6 5 ttl_01280_6 -1 5 3 5 -2 10 3 5 +1 3 5 +2 3 5 diff --git a/tests/queries/0_stateless/01280_ttl_where_group_by.sh b/tests/queries/0_stateless/01280_ttl_where_group_by.sh index 9f30c7c5872..c9936ce7afd 100755 --- a/tests/queries/0_stateless/01280_ttl_where_group_by.sh +++ b/tests/queries/0_stateless/01280_ttl_where_group_by.sh @@ -80,7 +80,7 @@ insert into ttl_01280_4 values (1, 5, 4, 9, now())" sleep 2 optimize "ttl_01280_4" -$CLICKHOUSE_CLIENT --query "select a, b, x, y from ttl_01280_4 ORDER BY a, b, x, y" +$CLICKHOUSE_CLIENT --query "select x, y from ttl_01280_4 ORDER BY a, b, x, y" $CLICKHOUSE_CLIENT --query "drop table if exists ttl_01280_5" @@ -107,7 +107,7 @@ insert into ttl_01280_6 values (1, 5, 3, 5, now())" sleep 2 optimize "ttl_01280_6" -$CLICKHOUSE_CLIENT --query "select a, b, x, y from ttl_01280_6 ORDER BY a, b, x, y" +$CLICKHOUSE_CLIENT --query "select a, x, y from ttl_01280_6 ORDER BY a, b, x, y" $CLICKHOUSE_CLIENT -q "DROP TABLE ttl_01280_1" $CLICKHOUSE_CLIENT -q "DROP TABLE ttl_01280_2" diff --git a/tests/queries/0_stateless/01293_client_interactive_vertical_multiline_long.expect b/tests/queries/0_stateless/01293_client_interactive_vertical_multiline.expect similarity index 95% rename from tests/queries/0_stateless/01293_client_interactive_vertical_multiline_long.expect rename to tests/queries/0_stateless/01293_client_interactive_vertical_multiline.expect index 85eb97fb6f2..5e845754402 100755 --- a/tests/queries/0_stateless/01293_client_interactive_vertical_multiline_long.expect +++ b/tests/queries/0_stateless/01293_client_interactive_vertical_multiline.expect @@ -41,7 +41,7 @@ expect ":) " send -- "" expect eof -spawn bash -c "source $basedir/../shell_config.sh ; \$CLICKHOUSE_CLIENT_BINARY \$CLICKHOUSE_CLIENT_OPT" +spawn bash -c "source $basedir/../shell_config.sh ; \$CLICKHOUSE_CLIENT_BINARY \$CLICKHOUSE_CLIENT_OPT --disable_suggestion --multiline" expect ":) " send -- "SELECT 1;\r" diff --git a/tests/queries/0_stateless/01293_client_interactive_vertical_multiline.reference b/tests/queries/0_stateless/01293_client_interactive_vertical_multiline.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/01294_lazy_database_concurrent_recreate_reattach_and_show_tables_long.sh b/tests/queries/0_stateless/01294_lazy_database_concurrent_recreate_reattach_and_show_tables_long.sh index f5a4a1adac0..6b89e7a5a8a 100755 --- a/tests/queries/0_stateless/01294_lazy_database_concurrent_recreate_reattach_and_show_tables_long.sh +++ b/tests/queries/0_stateless/01294_lazy_database_concurrent_recreate_reattach_and_show_tables_long.sh @@ -101,14 +101,12 @@ timeout $TIMEOUT bash -c test_func 2> /dev/null & wait sleep 1 -${CLICKHOUSE_CLIENT} -n -q " - DROP TABLE IF EXISTS $CURR_DATABASE.log; - DROP TABLE IF EXISTS $CURR_DATABASE.slog; - DROP TABLE IF EXISTS $CURR_DATABASE.tlog; - DROP TABLE IF EXISTS $CURR_DATABASE.tlog2; -" +for table in log tlog slog tlog2; do + $CLICKHOUSE_CLIENT -q "SYSTEM STOP TTL MERGES $CURR_DATABASE.$table" >& /dev/null + ${CLICKHOUSE_CLIENT} -q "ATTACH TABLE $CURR_DATABASE.$table;" 2>/dev/null +done + +${CLICKHOUSE_CLIENT} -q "DROP DATABASE $CURR_DATABASE" -$CLICKHOUSE_CLIENT -q "SYSTEM START TTL MERGES"; echo "Test OK" -# TODO: doesn't work! $CLICKHOUSE_CLIENT -q "DROP DATABASE $CURR_DATABASE" diff --git a/tests/queries/0_stateless/01294_system_distributed_on_cluster.sql b/tests/queries/0_stateless/01294_system_distributed_on_cluster.sql index d56bddba3c6..e5cd3ea362f 100644 --- a/tests/queries/0_stateless/01294_system_distributed_on_cluster.sql +++ b/tests/queries/0_stateless/01294_system_distributed_on_cluster.sql @@ -3,6 +3,7 @@ -- quirk for ON CLUSTER does not uses currentDatabase() drop database if exists db_01294; create database db_01294; +set distributed_ddl_output_mode='throw'; drop table if exists db_01294.dist_01294; create table db_01294.dist_01294 as system.one engine=Distributed(test_shard_localhost, system, one); @@ -10,11 +11,9 @@ create table db_01294.dist_01294 as system.one engine=Distributed(test_shard_loc system flush distributed db_01294.dist_01294; system flush distributed on cluster test_shard_localhost db_01294.dist_01294; -- stop -system stop distributed sends; system stop distributed sends db_01294.dist_01294; system stop distributed sends on cluster test_shard_localhost db_01294.dist_01294; -- start -system start distributed sends; system start distributed sends db_01294.dist_01294; system start distributed sends on cluster test_shard_localhost db_01294.dist_01294; diff --git a/tests/queries/0_stateless/01300_client_save_history_when_terminated_long.expect b/tests/queries/0_stateless/01300_client_save_history_when_terminated_long.expect index 7fed383dc38..0c53f5658d1 100755 --- a/tests/queries/0_stateless/01300_client_save_history_when_terminated_long.expect +++ b/tests/queries/0_stateless/01300_client_save_history_when_terminated_long.expect @@ -27,7 +27,7 @@ close spawn bash -c "source $basedir/../shell_config.sh ; \$CLICKHOUSE_CLIENT_BINARY \$CLICKHOUSE_CLIENT_OPT" expect ":) " send -- "\[A" -expect "SELECT 'for the history'" +expect "for the history" # Will check that Ctrl+C clears current line. send -- "\3" diff --git a/tests/queries/0_stateless/01307_orc_output_format.reference b/tests/queries/0_stateless/01307_orc_output_format.reference index da719072eb2..e185c02a3e5 100644 --- a/tests/queries/0_stateless/01307_orc_output_format.reference +++ b/tests/queries/0_stateless/01307_orc_output_format.reference @@ -1,6 +1,6 @@ -255 65535 4294967295 100000000000 -128 -32768 -2147483648 -100000000000 2.02 10000.0000001 String 2020 2021-12-19 2021-12-19 03:00:00 1.0001 1.0000000100 100000.00000000000001000000 1 -4 1234 3244467295 500000000000 -1 -256 -14741221 -7000000000 100.1 14321.032141201 Another string 2000 2024-10-04 2028-04-21 01:20:00 34.1234 123123.1231231230 123123123.12312312312312300000 \N -42 42 42 42 42 42 42 42 42.42 42.42 42 4242 1970-02-12 1970-01-01 03:00:42 42.4200 42.4242424200 424242.42424242424242000000 42 -255 65535 4294967295 100000000000 -128 -32768 -2147483648 -100000000000 2.02 10000.0000001 String 2020 2021-12-19 2021-12-19 03:00:00 1.0001 1.0000000100 100000.00000000000001000000 1 -4 1234 3244467295 500000000000 -1 -256 -14741221 -7000000000 100.1 14321.032141201 Another string 2000 2024-10-04 2028-04-21 01:20:00 34.1234 123123.1231231230 123123123.12312312312312300000 \N -42 42 42 42 42 42 42 42 42.42 42.42 42 4242 1970-02-12 1970-01-01 03:00:42 42.4200 42.4242424200 424242.42424242424242000000 42 +255 65535 4294967295 100000000000 -128 -32768 -2147483648 -100000000000 2.02 10000.0000001 String 2020 2021-12-19 2021-12-19 03:00:00 1.0001 1.00000001 100000.00000000000001 1 +4 1234 3244467295 500000000000 -1 -256 -14741221 -7000000000 100.1 14321.032141201 Another string 2000 2024-10-04 2028-04-21 01:20:00 34.1234 123123.123123123 123123123.123123123123123 \N +42 42 42 42 42 42 42 42 42.42 42.42 42 4242 1970-02-12 1970-01-01 03:00:42 42.42 42.42424242 424242.42424242424242 42 +255 65535 4294967295 100000000000 -128 -32768 -2147483648 -100000000000 2.02 10000.0000001 String 2020 2021-12-19 2021-12-19 03:00:00 1.0001 1.00000001 100000.00000000000001 1 +4 1234 3244467295 500000000000 -1 -256 -14741221 -7000000000 100.1 14321.032141201 Another string 2000 2024-10-04 2028-04-21 01:20:00 34.1234 123123.123123123 123123123.123123123123123 \N +42 42 42 42 42 42 42 42 42.42 42.42 42 4242 1970-02-12 1970-01-01 03:00:42 42.42 42.42424242 424242.42424242424242 42 diff --git a/tests/queries/0_stateless/01307_orc_output_format.sh b/tests/queries/0_stateless/01307_orc_output_format.sh index 26c7db5ad1b..b5000bfd3fc 100755 --- a/tests/queries/0_stateless/01307_orc_output_format.sh +++ b/tests/queries/0_stateless/01307_orc_output_format.sh @@ -6,7 +6,7 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) $CLICKHOUSE_CLIENT --query="DROP TABLE IF EXISTS orc"; -$CLICKHOUSE_CLIENT --query="CREATE TABLE orc (uint8 UInt8, uint16 UInt16, uint32 UInt32, uint64 UInt64, int8 Int8, int16 Int16, int32 Int32, int64 Int64, float Float32, double Float64, string String, fixed FixedString(4), date Date, datetime DateTime, decimal32 Decimal32(4), decimal64 Decimal64(10), decimal128 Decimal128(20), nullable Nullable(Int32)) ENGINE = Memory"; +$CLICKHOUSE_CLIENT --query="CREATE TABLE orc (uint8 UInt8, uint16 UInt16, uint32 UInt32, uint64 UInt64, int8 Int8, int16 Int16, int32 Int32, int64 Int64, float Float32, double Float64, string String, fixed FixedString(4), date Date, datetime DateTime('Europe/Moscow'), decimal32 Decimal32(4), decimal64 Decimal64(10), decimal128 Decimal128(20), nullable Nullable(Int32)) ENGINE = Memory"; $CLICKHOUSE_CLIENT --query="INSERT INTO orc VALUES (255, 65535, 4294967295, 100000000000, -128, -32768, -2147483648, -100000000000, 2.02, 10000.0000001, 'String', '2020', 18980, 1639872000, 1.0001, 1.00000001, 100000.00000000000001, 1), (4, 1234, 3244467295, 500000000000, -1, -256, -14741221, -7000000000, 100.1, 14321.032141201, 'Another string', '2000', 20000, 1839882000, 34.1234, 123123.123123123, 123123123.123123123123123, NULL), (42, 42, 42, 42, 42, 42, 42, 42, 42.42, 42.42, '42', '4242', 42, 42, 42.42, 42.42424242, 424242.42424242424242, 42)"; diff --git a/tests/queries/0_stateless/01318_map_add_map_subtract_on_map_type.reference b/tests/queries/0_stateless/01318_map_add_map_subtract_on_map_type.reference index 96bafc2c79c..de34b856130 100644 --- a/tests/queries/0_stateless/01318_map_add_map_subtract_on_map_type.reference +++ b/tests/queries/0_stateless/01318_map_add_map_subtract_on_map_type.reference @@ -18,38 +18,38 @@ {1:3,2:2,8:2} {1:3,2:2,9:2} {1:3,2:2,10:2} -{1:2,2:2} Map(UInt8,UInt64) -{1:2,2:2} Map(UInt16,UInt64) -{1:2,2:2} Map(UInt32,UInt64) -{1:2,2:2} Map(UInt64,UInt64) -{1:2,2:2} Map(UInt128,UInt128) -{1:2,2:2} Map(UInt256,UInt256) -{1:2,2:2} Map(Int16,UInt64) -{1:2,2:2} Map(Int16,Int64) -{1:2,2:2} Map(Int32,Int64) -{1:2,2:2} Map(Int64,Int64) -{1:2,2:2} Map(Int128,Int128) -{1:2,2:2} Map(Int256,Int256) -{1:3.300000023841858,2:2} Map(UInt8,Float64) -{1:3.3000000000000003,2:2} Map(UInt8,Float64) +{1:2,2:2} Map(UInt8, UInt64) +{1:2,2:2} Map(UInt16, UInt64) +{1:2,2:2} Map(UInt32, UInt64) +{1:2,2:2} Map(UInt64, UInt64) +{1:2,2:2} Map(UInt128, UInt128) +{1:2,2:2} Map(UInt256, UInt256) +{1:2,2:2} Map(Int16, UInt64) +{1:2,2:2} Map(Int16, Int64) +{1:2,2:2} Map(Int32, Int64) +{1:2,2:2} Map(Int64, Int64) +{1:2,2:2} Map(Int128, Int128) +{1:2,2:2} Map(Int256, Int256) +{1:3.300000023841858,2:2} Map(UInt8, Float64) +{1:3.3000000000000003,2:2} Map(UInt8, Float64) {'a':1,'b':2} {'a':1,'b':1,'c':1} {'a':1,'b':1,'d':1} -{'a':1,'b':2} Map(String,UInt64) -{'a':1,'b':1,'c':1} Map(String,UInt64) -{'a':1,'b':1,'d':1} Map(String,UInt64) +{'a':1,'b':2} Map(String, UInt64) +{'a':1,'b':1,'c':1} Map(String, UInt64) +{'a':1,'b':1,'d':1} Map(String, UInt64) {'a':1,'b':2} {'a':1,'b':1,'c':1} {'a':1,'b':1,'d':1} -{'a':2} Map(Enum16(\'a\' = 1, \'b\' = 2),Int64) -{'b':2} Map(Enum16(\'a\' = 1, \'b\' = 2),Int64) -{'a':2} Map(Enum8(\'a\' = 1, \'b\' = 2),Int64) -{'b':2} Map(Enum8(\'a\' = 1, \'b\' = 2),Int64) -{'00000000-89ab-cdef-0123-456789abcdef':2} Map(UUID,Int64) -{'11111111-89ab-cdef-0123-456789abcdef':4} Map(UUID,Int64) -{1:0,2:0} Map(UInt8,UInt64) -{1:18446744073709551615,2:18446744073709551615} Map(UInt8,UInt64) -{1:-1,2:-1} Map(UInt8,Int64) -{1:-1.0999999761581423,2:0} Map(UInt8,Float64) -{1:-1,2:-1} Map(UInt8,Int64) -{1:-2,2:-2,3:1} Map(UInt8,Int64) +{'a':2} Map(Enum16(\'a\' = 1, \'b\' = 2), Int64) +{'b':2} Map(Enum16(\'a\' = 1, \'b\' = 2), Int64) +{'a':2} Map(Enum8(\'a\' = 1, \'b\' = 2), Int64) +{'b':2} Map(Enum8(\'a\' = 1, \'b\' = 2), Int64) +{'00000000-89ab-cdef-0123-456789abcdef':2} Map(UUID, Int64) +{'11111111-89ab-cdef-0123-456789abcdef':4} Map(UUID, Int64) +{1:0,2:0} Map(UInt8, UInt64) +{1:18446744073709551615,2:18446744073709551615} Map(UInt8, UInt64) +{1:-1,2:-1} Map(UInt8, Int64) +{1:-1.0999999761581423,2:0} Map(UInt8, Float64) +{1:-1,2:-1} Map(UInt8, Int64) +{1:-2,2:-2,3:1} Map(UInt8, Int64) diff --git a/tests/queries/0_stateless/01319_manual_write_to_replicas.reference b/tests/queries/0_stateless/01319_manual_write_to_replicas_long.reference similarity index 100% rename from tests/queries/0_stateless/01319_manual_write_to_replicas.reference rename to tests/queries/0_stateless/01319_manual_write_to_replicas_long.reference diff --git a/tests/queries/0_stateless/01319_manual_write_to_replicas.sql b/tests/queries/0_stateless/01319_manual_write_to_replicas_long.sql similarity index 67% rename from tests/queries/0_stateless/01319_manual_write_to_replicas.sql rename to tests/queries/0_stateless/01319_manual_write_to_replicas_long.sql index 5388f0017c0..cec75ac1b23 100644 --- a/tests/queries/0_stateless/01319_manual_write_to_replicas.sql +++ b/tests/queries/0_stateless/01319_manual_write_to_replicas_long.sql @@ -1,10 +1,11 @@ DROP TABLE IF EXISTS r1; DROP TABLE IF EXISTS r2; -CREATE TABLE r1 (x String) ENGINE = ReplicatedMergeTree('/clickhouse/tables/r', 'r1') ORDER BY x; -CREATE TABLE r2 (x String) ENGINE = ReplicatedMergeTree('/clickhouse/tables/r', 'r2') ORDER BY x; +CREATE TABLE r1 (x String) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/r', 'r1') ORDER BY x; +CREATE TABLE r2 (x String) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/r', 'r2') ORDER BY x; -SYSTEM STOP REPLICATED SENDS; +SYSTEM STOP REPLICATED SENDS r1; +SYSTEM STOP REPLICATED SENDS r2; INSERT INTO r1 VALUES ('Hello, world'); SELECT * FROM r1; @@ -14,7 +15,8 @@ SELECT '---'; SELECT * FROM r1; SELECT * FROM r2; -SYSTEM START REPLICATED SENDS; +SYSTEM START REPLICATED SENDS r1; +SYSTEM START REPLICATED SENDS r2; SYSTEM SYNC REPLICA r1; SYSTEM SYNC REPLICA r2; diff --git a/tests/queries/0_stateless/01324_if_transform_strings_to_enum.reference b/tests/queries/0_stateless/01324_if_transform_strings_to_enum.reference index 99298d28bad..994e3f24aaf 100644 --- a/tests/queries/0_stateless/01324_if_transform_strings_to_enum.reference +++ b/tests/queries/0_stateless/01324_if_transform_strings_to_enum.reference @@ -8,7 +8,7 @@ yahoo other other other -SELECT transform(number, [2, 4, 6], CAST([\'google\', \'yandex\', \'yahoo\'], \'Array(Enum8(\\\'google\\\' = 1, \\\'other\\\' = 2, \\\'yahoo\\\' = 3, \\\'yandex\\\' = 4))\'), CAST(\'other\', \'Enum8(\\\'google\\\' = 1, \\\'other\\\' = 2, \\\'yahoo\\\' = 3, \\\'yandex\\\' = 4)\')) +SELECT transform(number, [2, 4, 6], _CAST([\'google\', \'yandex\', \'yahoo\'], \'Array(Enum8(\\\'google\\\' = 1, \\\'other\\\' = 2, \\\'yahoo\\\' = 3, \\\'yandex\\\' = 4))\'), _CAST(\'other\', \'Enum8(\\\'google\\\' = 1, \\\'other\\\' = 2, \\\'yahoo\\\' = 3, \\\'yandex\\\' = 4)\')) FROM system.numbers LIMIT 10 google diff --git a/tests/queries/0_stateless/01327_decimal_cut_extra_digits_after_point.reference b/tests/queries/0_stateless/01327_decimal_cut_extra_digits_after_point.reference index 6006f9981b4..5a96c81b0a8 100644 --- a/tests/queries/0_stateless/01327_decimal_cut_extra_digits_after_point.reference +++ b/tests/queries/0_stateless/01327_decimal_cut_extra_digits_after_point.reference @@ -1,12 +1,12 @@ -1.10000 +1.1 1.12345 1.12345 1.12345 1.12345 1.12345 -12345.10000 -123456789123.10000 -1234567891234.10000 +12345.1 +123456789123.1 +1234567891234.1 1234567891234.12345 1.12345 1.12345 diff --git a/tests/queries/0_stateless/01346_alter_enum_partition_key_replicated_zookeeper.reference b/tests/queries/0_stateless/01346_alter_enum_partition_key_replicated_zookeeper_long.reference similarity index 100% rename from tests/queries/0_stateless/01346_alter_enum_partition_key_replicated_zookeeper.reference rename to tests/queries/0_stateless/01346_alter_enum_partition_key_replicated_zookeeper_long.reference diff --git a/tests/queries/0_stateless/01346_alter_enum_partition_key_replicated_zookeeper.sql b/tests/queries/0_stateless/01346_alter_enum_partition_key_replicated_zookeeper_long.sql similarity index 92% rename from tests/queries/0_stateless/01346_alter_enum_partition_key_replicated_zookeeper.sql rename to tests/queries/0_stateless/01346_alter_enum_partition_key_replicated_zookeeper_long.sql index d185973f564..d0b6fbe3dde 100644 --- a/tests/queries/0_stateless/01346_alter_enum_partition_key_replicated_zookeeper.sql +++ b/tests/queries/0_stateless/01346_alter_enum_partition_key_replicated_zookeeper_long.sql @@ -1,8 +1,8 @@ DROP TABLE IF EXISTS test; DROP TABLE IF EXISTS test2; -CREATE TABLE test (x Enum('hello' = 1, 'world' = 2), y String) ENGINE = ReplicatedMergeTree('/clickhouse/test_01346/table', 'r1') PARTITION BY x ORDER BY y; -CREATE TABLE test2 (x Enum('hello' = 1, 'world' = 2), y String) ENGINE = ReplicatedMergeTree('/clickhouse/test_01346/table', 'r2') PARTITION BY x ORDER BY y; +CREATE TABLE test (x Enum('hello' = 1, 'world' = 2), y String) ENGINE = ReplicatedMergeTree('/clickhouse/{database}/test_01346/table', 'r1') PARTITION BY x ORDER BY y; +CREATE TABLE test2 (x Enum('hello' = 1, 'world' = 2), y String) ENGINE = ReplicatedMergeTree('/clickhouse/{database}/test_01346/table', 'r2') PARTITION BY x ORDER BY y; INSERT INTO test VALUES ('hello', 'test'); SELECT * FROM test; diff --git a/tests/queries/0_stateless/01372_remote_table_function_empty_table.sql b/tests/queries/0_stateless/01372_remote_table_function_empty_table.sql index 698c323d73f..4153dc632f3 100644 --- a/tests/queries/0_stateless/01372_remote_table_function_empty_table.sql +++ b/tests/queries/0_stateless/01372_remote_table_function_empty_table.sql @@ -1 +1,4 @@ SELECT * FROM remote('127..2', 'a.'); -- { serverError 36 } + +-- Clear cache to avoid future errors in the logs +SYSTEM DROP DNS CACHE diff --git a/tests/queries/0_stateless/01378_alter_rename_with_ttl_zookeeper.sql b/tests/queries/0_stateless/01378_alter_rename_with_ttl_zookeeper.sql index 0cd6feb9da1..79d1276ae61 100644 --- a/tests/queries/0_stateless/01378_alter_rename_with_ttl_zookeeper.sql +++ b/tests/queries/0_stateless/01378_alter_rename_with_ttl_zookeeper.sql @@ -5,7 +5,7 @@ CREATE TABLE table_rename_with_ttl date1 Date, value1 String ) -ENGINE = ReplicatedMergeTree('/clickhouse/test/table_rename_with_ttl_01378', '1') +ENGINE = ReplicatedMergeTree('/clickhouse/{database}/test/table_rename_with_ttl_01378', '1') ORDER BY tuple(); INSERT INTO table_rename_with_ttl SELECT toDate('2018-10-01') + number % 3, toString(number) from numbers(9); diff --git a/tests/queries/0_stateless/01379_with_fill_several_columns.sql b/tests/queries/0_stateless/01379_with_fill_several_columns.sql index f98431b61b9..505b9e0f8e1 100644 --- a/tests/queries/0_stateless/01379_with_fill_several_columns.sql +++ b/tests/queries/0_stateless/01379_with_fill_several_columns.sql @@ -1,6 +1,6 @@ SELECT - toDate((number * 10) * 86400) AS d1, - toDate(number * 86400) AS d2, + toDate(toDateTime((number * 10) * 86400, 'Europe/Moscow')) AS d1, + toDate(toDateTime(number * 86400, 'Europe/Moscow')) AS d2, 'original' AS source FROM numbers(10) WHERE (number % 3) = 1 @@ -11,11 +11,11 @@ ORDER BY SELECT '==============='; SELECT - toDate((number * 10) * 86400) AS d1, - toDate(number * 86400) AS d2, + toDate(toDateTime((number * 10) * 86400, 'Europe/Moscow')) AS d1, + toDate(toDateTime(number * 86400, 'Europe/Moscow')) AS d2, 'original' AS source FROM numbers(10) WHERE (number % 3) = 1 ORDER BY d1 WITH FILL STEP 5, - d2 WITH FILL; \ No newline at end of file + d2 WITH FILL; diff --git a/tests/queries/0_stateless/01402_cast_nullable_string_to_enum.sql b/tests/queries/0_stateless/01402_cast_nullable_string_to_enum.sql index aa8e8be6673..3b53e593095 100644 --- a/tests/queries/0_stateless/01402_cast_nullable_string_to_enum.sql +++ b/tests/queries/0_stateless/01402_cast_nullable_string_to_enum.sql @@ -1,3 +1,5 @@ +SET cast_keep_nullable = 0; + -- https://github.com/ClickHouse/ClickHouse/issues/5818#issuecomment-619628445 SELECT CAST(CAST(NULL AS Nullable(String)) AS Nullable(Enum8('Hello' = 1))); SELECT CAST(CAST(NULL AS Nullable(FixedString(1))) AS Nullable(Enum8('Hello' = 1))); diff --git a/tests/queries/0_stateless/01410_nullable_key.reference b/tests/queries/0_stateless/01410_nullable_key.reference deleted file mode 100644 index 75163f1bf41..00000000000 --- a/tests/queries/0_stateless/01410_nullable_key.reference +++ /dev/null @@ -1,35 +0,0 @@ -0 0 -2 3 -4 6 -6 9 -8 12 -10 15 -12 18 -14 21 -16 24 -18 27 -\N 0 -\N -1 -\N -2 -\N 0 -\N -1 -\N -2 -0 0 -2 3 -4 6 -6 9 -8 12 -10 15 -12 18 -14 21 -16 24 -18 27 -12 18 -14 21 -16 24 -18 27 -0 0 -2 3 -4 6 -6 9 -8 12 diff --git a/tests/queries/0_stateless/01410_nullable_key.sql b/tests/queries/0_stateless/01410_nullable_key.sql deleted file mode 100644 index 4a3701cf46d..00000000000 --- a/tests/queries/0_stateless/01410_nullable_key.sql +++ /dev/null @@ -1,13 +0,0 @@ -DROP TABLE IF EXISTS nullable_key; -CREATE TABLE nullable_key (k Nullable(int), v int) ENGINE MergeTree ORDER BY k SETTINGS allow_nullable_key = 1; - -INSERT INTO nullable_key SELECT number * 2, number * 3 FROM numbers(10); -INSERT INTO nullable_key SELECT NULL, -number FROM numbers(3); - -SELECT * FROM nullable_key ORDER BY k; -SELECT * FROM nullable_key WHERE k IS NULL; -SELECT * FROM nullable_key WHERE k IS NOT NULL; -SELECT * FROM nullable_key WHERE k > 10; -SELECT * FROM nullable_key WHERE k < 10; - -DROP TABLE nullable_key; diff --git a/tests/queries/0_stateless/01410_nullable_key_and_index.reference b/tests/queries/0_stateless/01410_nullable_key_and_index.reference new file mode 100644 index 00000000000..1fc2cf91e62 --- /dev/null +++ b/tests/queries/0_stateless/01410_nullable_key_and_index.reference @@ -0,0 +1,81 @@ +0 0 +2 3 +4 6 +6 9 +8 12 +10 15 +12 18 +14 21 +16 24 +18 27 +\N 0 +\N -1 +\N -2 +\N 0 +\N -1 +\N -2 +0 0 +2 3 +4 6 +6 9 +8 12 +10 15 +12 18 +14 21 +16 24 +18 27 +12 18 +14 21 +16 24 +18 27 +0 0 +2 3 +4 6 +6 9 +8 12 +\N 0 +\N -1 +\N -2 +0 0 +2 3 +4 6 +6 9 +8 12 +10 15 +12 18 +14 21 +16 24 +18 27 +10 15 +\N 0 +\N -1 +\N -2 +\N +123 +1 1 +1 3 +2 \N +2 2 +2 1 +2 7 +2 \N +3 \N +3 2 +3 4 +2 \N +2 \N +3 \N +1 3 +2 7 +3 4 +1 1 +2 2 +2 1 +3 2 +1 3 +2 7 +3 4 +1 1 +2 2 +2 1 +3 2 diff --git a/tests/queries/0_stateless/01410_nullable_key_and_index.sql b/tests/queries/0_stateless/01410_nullable_key_and_index.sql new file mode 100644 index 00000000000..ba473b5c29a --- /dev/null +++ b/tests/queries/0_stateless/01410_nullable_key_and_index.sql @@ -0,0 +1,61 @@ +DROP TABLE IF EXISTS nullable_key; +DROP TABLE IF EXISTS nullable_key_without_final_mark; +DROP TABLE IF EXISTS nullable_minmax_index; + +SET max_threads = 1; + +CREATE TABLE nullable_key (k Nullable(int), v int) ENGINE MergeTree ORDER BY k SETTINGS allow_nullable_key = 1, index_granularity = 1; + +INSERT INTO nullable_key SELECT number * 2, number * 3 FROM numbers(10); +INSERT INTO nullable_key SELECT NULL, -number FROM numbers(3); + +SELECT * FROM nullable_key ORDER BY k; + +SET force_primary_key = 1; +SET max_rows_to_read = 3; +SELECT * FROM nullable_key WHERE k IS NULL; +SET max_rows_to_read = 10; +SELECT * FROM nullable_key WHERE k IS NOT NULL; +SET max_rows_to_read = 5; +SELECT * FROM nullable_key WHERE k > 10; +SELECT * FROM nullable_key WHERE k < 10; + +OPTIMIZE TABLE nullable_key FINAL; + +SET max_rows_to_read = 4; -- one additional left mark needs to be read +SELECT * FROM nullable_key WHERE k IS NULL; +SET max_rows_to_read = 10; +SELECT * FROM nullable_key WHERE k IS NOT NULL; + +-- Nullable in set and with transform_null_in = 1 +SET max_rows_to_read = 3; +SELECT * FROM nullable_key WHERE k IN (10, 20) SETTINGS transform_null_in = 1; +SET max_rows_to_read = 5; +SELECT * FROM nullable_key WHERE k IN (3, NULL) SETTINGS transform_null_in = 1; + +CREATE TABLE nullable_key_without_final_mark (s Nullable(String)) ENGINE MergeTree ORDER BY s SETTINGS allow_nullable_key = 1, write_final_mark = 0; +INSERT INTO nullable_key_without_final_mark VALUES ('123'), (NULL); +SET max_rows_to_read = 0; +SELECT * FROM nullable_key_without_final_mark WHERE s IS NULL; +SELECT * FROM nullable_key_without_final_mark WHERE s IS NOT NULL; + +CREATE TABLE nullable_minmax_index (k int, v Nullable(int), INDEX v_minmax v TYPE minmax GRANULARITY 4) ENGINE MergeTree ORDER BY k SETTINGS index_granularity = 1; + +INSERT INTO nullable_minmax_index VALUES (1, 3), (2, 7), (3, 4), (2, NULL); -- [3, +Inf] +INSERT INTO nullable_minmax_index VALUES (1, 1), (2, 2), (3, 2), (2, 1); -- [1, 2] +INSERT INTO nullable_minmax_index VALUES (2, NULL), (3, NULL); -- [+Inf, +Inf] + +SET force_primary_key = 0; +SELECT * FROM nullable_minmax_index ORDER BY k; +SET max_rows_to_read = 6; +SELECT * FROM nullable_minmax_index WHERE v IS NULL; +SET max_rows_to_read = 8; +SELECT * FROM nullable_minmax_index WHERE v IS NOT NULL; +SET max_rows_to_read = 6; +SELECT * FROM nullable_minmax_index WHERE v > 2; +SET max_rows_to_read = 4; +SELECT * FROM nullable_minmax_index WHERE v <= 2; + +DROP TABLE nullable_key; +DROP TABLE nullable_key_without_final_mark; +DROP TABLE nullable_minmax_index; diff --git a/tests/queries/0_stateless/01412_group_array_moving_shard.reference b/tests/queries/0_stateless/01412_group_array_moving_shard.reference index 603951ee3d4..866971435e2 100644 --- a/tests/queries/0_stateless/01412_group_array_moving_shard.reference +++ b/tests/queries/0_stateless/01412_group_array_moving_shard.reference @@ -3,20 +3,20 @@ [-1,-2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,-23,-24,-25,-26,-27,-28,-29,-30,-31,-32,-33,-34,-35,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-48,-49,-50,-51,-52,-53,-54,-55,-56,-57,-58,-59,-60,-61,-62,-63,-64,-65,-66,-67,-68,-69,-70,-71,-72,-73,-74,-75,-76,-77,-78,-79,-80,-81,-82,-83,-84,-85,-86,-87,-88,-89,-90,-91,-92,-93,-94,-95,-96,-97,-98,-99,-100,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-125,-126,-127,-128,-129,-130,-131,-132,-133,-134,-135,-136,-137,-138,-139,-140,-141,-142,-143,-144,-145,-146,-147,-148,-149,-150,-151,-152,-153,-154,-155,-156,-157,-158,-159,-160,-161,-162,-163,-164,-165,-166,-167,-168,-169,-170,-171,-172,-173,-174,-175,-176,-177,-178,-179,-180,-181,-182,-183,-184,-185,-186,-187,-188,-189,-190,-191,-192,-193,-194,-195,-196,-197,-198,-199,-200,-201,-202,-203,-204,-205,-206,-207,-208,-209,-210,-211,-212,-213,-214,-215,-216,-217,-218,-219,-220,-221,-222,-223,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,-235,-236,-237,-238,-239,-240,-241,-242,-243,-244,-245,-246,-247,-248,-249,-250,-251,-252,-253,-254,-255,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256] [-1,-2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,-23,-24,-25,-26,-27,-28,-29,-30,-31,-32,-33,-34,-35,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-48,-49,-50,-51,-52,-53,-54,-55,-56,-57,-58,-59,-60,-61,-62,-63,-64,-65,-66,-67,-68,-69,-70,-71,-72,-73,-74,-75,-76,-77,-78,-79,-80,-81,-82,-83,-84,-85,-86,-87,-88,-89,-90,-91,-92,-93,-94,-95,-96,-97,-98,-99,-100,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-125,-126,-127,-128,-129,-130,-131,-132,-133,-134,-135,-136,-137,-138,-139,-140,-141,-142,-143,-144,-145,-146,-147,-148,-149,-150,-151,-152,-153,-154,-155,-156,-157,-158,-159,-160,-161,-162,-163,-164,-165,-166,-167,-168,-169,-170,-171,-172,-173,-174,-175,-176,-177,-178,-179,-180,-181,-182,-183,-184,-185,-186,-187,-188,-189,-190,-191,-192,-193,-194,-195,-196,-197,-198,-199,-200,-201,-202,-203,-204,-205,-206,-207,-208,-209,-210,-211,-212,-213,-214,-215,-216,-217,-218,-219,-220,-221,-222,-223,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,-235,-236,-237,-238,-239,-240,-241,-242,-243,-244,-245,-246,-247,-248,-249,-250,-251,-252,-253,-254,-255,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256] [0.00390625,0.0078125,0.01171875,0.015625,0.01953125,0.0234375,0.02734375,0.03125,0.03515625,0.0390625,0.04296875,0.046875,0.05078125,0.0546875,0.05859375,0.0625,0.06640625,0.0703125,0.07421875,0.078125,0.08203125,0.0859375,0.08984375,0.09375,0.09765625,0.1015625,0.10546875,0.109375,0.11328125,0.1171875,0.12109375,0.125,0.12890625,0.1328125,0.13671875,0.140625,0.14453125,0.1484375,0.15234375,0.15625,0.16015625,0.1640625,0.16796875,0.171875,0.17578125,0.1796875,0.18359375,0.1875,0.19140625,0.1953125,0.19921875,0.203125,0.20703125,0.2109375,0.21484375,0.21875,0.22265625,0.2265625,0.23046875,0.234375,0.23828125,0.2421875,0.24609375,0.25,0.25390625,0.2578125,0.26171875,0.265625,0.26953125,0.2734375,0.27734375,0.28125,0.28515625,0.2890625,0.29296875,0.296875,0.30078125,0.3046875,0.30859375,0.3125,0.31640625,0.3203125,0.32421875,0.328125,0.33203125,0.3359375,0.33984375,0.34375,0.34765625,0.3515625,0.35546875,0.359375,0.36328125,0.3671875,0.37109375,0.375,0.37890625,0.3828125,0.38671875,0.390625,0.39453125,0.3984375,0.40234375,0.40625,0.41015625,0.4140625,0.41796875,0.421875,0.42578125,0.4296875,0.43359375,0.4375,0.44140625,0.4453125,0.44921875,0.453125,0.45703125,0.4609375,0.46484375,0.46875,0.47265625,0.4765625,0.48046875,0.484375,0.48828125,0.4921875,0.49609375,0.5,0.50390625,0.5078125,0.51171875,0.515625,0.51953125,0.5234375,0.52734375,0.53125,0.53515625,0.5390625,0.54296875,0.546875,0.55078125,0.5546875,0.55859375,0.5625,0.56640625,0.5703125,0.57421875,0.578125,0.58203125,0.5859375,0.58984375,0.59375,0.59765625,0.6015625,0.60546875,0.609375,0.61328125,0.6171875,0.62109375,0.625,0.62890625,0.6328125,0.63671875,0.640625,0.64453125,0.6484375,0.65234375,0.65625,0.66015625,0.6640625,0.66796875,0.671875,0.67578125,0.6796875,0.68359375,0.6875,0.69140625,0.6953125,0.69921875,0.703125,0.70703125,0.7109375,0.71484375,0.71875,0.72265625,0.7265625,0.73046875,0.734375,0.73828125,0.7421875,0.74609375,0.75,0.75390625,0.7578125,0.76171875,0.765625,0.76953125,0.7734375,0.77734375,0.78125,0.78515625,0.7890625,0.79296875,0.796875,0.80078125,0.8046875,0.80859375,0.8125,0.81640625,0.8203125,0.82421875,0.828125,0.83203125,0.8359375,0.83984375,0.84375,0.84765625,0.8515625,0.85546875,0.859375,0.86328125,0.8671875,0.87109375,0.875,0.87890625,0.8828125,0.88671875,0.890625,0.89453125,0.8984375,0.90234375,0.90625,0.91015625,0.9140625,0.91796875,0.921875,0.92578125,0.9296875,0.93359375,0.9375,0.94140625,0.9453125,0.94921875,0.953125,0.95703125,0.9609375,0.96484375,0.96875,0.97265625,0.9765625,0.98046875,0.984375,0.98828125,0.9921875,0.99609375,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] -[100000000.0,200000000.0,300000000.0,400000000.0,500000000.0,600000000.0,700000000.0,800000000.0,900000000.0,1000000000.0,1100000000.0,1200000000.0,1300000000.0,1400000000.0,1500000000.0,1600000000.0,1700000000.0,1800000000.0,1900000000.0,2000000000.0,2100000000.0,2200000000.0,2300000000.0,2400000000.0,2500000000.0,2600000000.0,2700000000.0,2800000000.0,2900000000.0,3000000000.0,3100000000.0,3200000000.0,3300000000.0,3400000000.0,3500000000.0,3600000000.0,3700000000.0,3800000000.0,3900000000.0,4000000000.0,4100000000.0,4200000000.0,4300000000.0,4400000000.0,4500000000.0,4600000000.0,4700000000.0,4800000000.0,4900000000.0,5000000000.0,5100000000.0,5200000000.0,5300000000.0,5400000000.0,5500000000.0,5600000000.0,5700000000.0,5800000000.0,5900000000.0,6000000000.0,6100000000.0,6200000000.0,6300000000.0,6400000000.0,6500000000.0,6600000000.0,6700000000.0,6800000000.0,6900000000.0,7000000000.0,7100000000.0,7200000000.0,7300000000.0,7400000000.0,7500000000.0,7600000000.0,7700000000.0,7800000000.0,7900000000.0,8000000000.0,8100000000.0,8200000000.0,8300000000.0,8400000000.0,8500000000.0,8600000000.0,8700000000.0,8800000000.0,8900000000.0,9000000000.0,9100000000.0,9200000000.0,9300000000.0,9400000000.0,9500000000.0,9600000000.0,9700000000.0,9800000000.0,9900000000.0,10000000000.0,10100000000.0,10200000000.0,10300000000.0,10400000000.0,10500000000.0,10600000000.0,10700000000.0,10800000000.0,10900000000.0,11000000000.0,11100000000.0,11200000000.0,11300000000.0,11400000000.0,11500000000.0,11600000000.0,11700000000.0,11800000000.0,11900000000.0,12000000000.0,12100000000.0,12200000000.0,12300000000.0,12400000000.0,12500000000.0,12600000000.0,12700000000.0,12800000000.0,12900000000.0,13000000000.0,13100000000.0,13200000000.0,13300000000.0,13400000000.0,13500000000.0,13600000000.0,13700000000.0,13800000000.0,13900000000.0,14000000000.0,14100000000.0,14200000000.0,14300000000.0,14400000000.0,14500000000.0,14600000000.0,14700000000.0,14800000000.0,14900000000.0,15000000000.0,15100000000.0,15200000000.0,15300000000.0,15400000000.0,15500000000.0,15600000000.0,15700000000.0,15800000000.0,15900000000.0,16000000000.0,16100000000.0,16200000000.0,16300000000.0,16400000000.0,16500000000.0,16600000000.0,16700000000.0,16800000000.0,16900000000.0,17000000000.0,17100000000.0,17200000000.0,17300000000.0,17400000000.0,17500000000.0,17600000000.0,17700000000.0,17800000000.0,17900000000.0,18000000000.0,18100000000.0,18200000000.0,18300000000.0,18400000000.0,18500000000.0,18600000000.0,18700000000.0,18800000000.0,18900000000.0,19000000000.0,19100000000.0,19200000000.0,19300000000.0,19400000000.0,19500000000.0,19600000000.0,19700000000.0,19800000000.0,19900000000.0,20000000000.0,20100000000.0,20200000000.0,20300000000.0,20400000000.0,20500000000.0,20600000000.0,20700000000.0,20800000000.0,20900000000.0,21000000000.0,21100000000.0,21200000000.0,21300000000.0,21400000000.0,21500000000.0,21600000000.0,21700000000.0,21800000000.0,21900000000.0,22000000000.0,22100000000.0,22200000000.0,22300000000.0,22400000000.0,22500000000.0,22600000000.0,22700000000.0,22800000000.0,22900000000.0,23000000000.0,23100000000.0,23200000000.0,23300000000.0,23400000000.0,23500000000.0,23600000000.0,23700000000.0,23800000000.0,23900000000.0,24000000000.0,24100000000.0,24200000000.0,24300000000.0,24400000000.0,24500000000.0,24600000000.0,24700000000.0,24800000000.0,24900000000.0,25000000000.0,25100000000.0,25200000000.0,25300000000.0,25400000000.0,25500000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0] -[-1.0,-2.0,-3.0,-4.0,-5.0,-6.0,-7.0,-8.0,-9.0,-10.0,-11.0,-12.0,-13.0,-14.0,-15.0,-16.0,-17.0,-18.0,-19.0,-20.0,-21.0,-22.0,-23.0,-24.0,-25.0,-26.0,-27.0,-28.0,-29.0,-30.0,-31.0,-32.0,-33.0,-34.0,-35.0,-36.0,-37.0,-38.0,-39.0,-40.0,-41.0,-42.0,-43.0,-44.0,-45.0,-46.0,-47.0,-48.0,-49.0,-50.0,-51.0,-52.0,-53.0,-54.0,-55.0,-56.0,-57.0,-58.0,-59.0,-60.0,-61.0,-62.0,-63.0,-64.0,-65.0,-66.0,-67.0,-68.0,-69.0,-70.0,-71.0,-72.0,-73.0,-74.0,-75.0,-76.0,-77.0,-78.0,-79.0,-80.0,-81.0,-82.0,-83.0,-84.0,-85.0,-86.0,-87.0,-88.0,-89.0,-90.0,-91.0,-92.0,-93.0,-94.0,-95.0,-96.0,-97.0,-98.0,-99.0,-100.0,-101.0,-102.0,-103.0,-104.0,-105.0,-106.0,-107.0,-108.0,-109.0,-110.0,-111.0,-112.0,-113.0,-114.0,-115.0,-116.0,-117.0,-118.0,-119.0,-120.0,-121.0,-122.0,-123.0,-124.0,-125.0,-126.0,-127.0,-128.0,-129.0,-130.0,-131.0,-132.0,-133.0,-134.0,-135.0,-136.0,-137.0,-138.0,-139.0,-140.0,-141.0,-142.0,-143.0,-144.0,-145.0,-146.0,-147.0,-148.0,-149.0,-150.0,-151.0,-152.0,-153.0,-154.0,-155.0,-156.0,-157.0,-158.0,-159.0,-160.0,-161.0,-162.0,-163.0,-164.0,-165.0,-166.0,-167.0,-168.0,-169.0,-170.0,-171.0,-172.0,-173.0,-174.0,-175.0,-176.0,-177.0,-178.0,-179.0,-180.0,-181.0,-182.0,-183.0,-184.0,-185.0,-186.0,-187.0,-188.0,-189.0,-190.0,-191.0,-192.0,-193.0,-194.0,-195.0,-196.0,-197.0,-198.0,-199.0,-200.0,-201.0,-202.0,-203.0,-204.0,-205.0,-206.0,-207.0,-208.0,-209.0,-210.0,-211.0,-212.0,-213.0,-214.0,-215.0,-216.0,-217.0,-218.0,-219.0,-220.0,-221.0,-222.0,-223.0,-224.0,-225.0,-226.0,-227.0,-228.0,-229.0,-230.0,-231.0,-232.0,-233.0,-234.0,-235.0,-236.0,-237.0,-238.0,-239.0,-240.0,-241.0,-242.0,-243.0,-244.0,-245.0,-246.0,-247.0,-248.0,-249.0,-250.0,-251.0,-252.0,-253.0,-254.0,-255.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0,-256.0] -[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0] +[100000000,200000000,300000000,400000000,500000000,600000000,700000000,800000000,900000000,1000000000,1100000000,1200000000,1300000000,1400000000,1500000000,1600000000,1700000000,1800000000,1900000000,2000000000,2100000000,2200000000,2300000000,2400000000,2500000000,2600000000,2700000000,2800000000,2900000000,3000000000,3100000000,3200000000,3300000000,3400000000,3500000000,3600000000,3700000000,3800000000,3900000000,4000000000,4100000000,4200000000,4300000000,4400000000,4500000000,4600000000,4700000000,4800000000,4900000000,5000000000,5100000000,5200000000,5300000000,5400000000,5500000000,5600000000,5700000000,5800000000,5900000000,6000000000,6100000000,6200000000,6300000000,6400000000,6500000000,6600000000,6700000000,6800000000,6900000000,7000000000,7100000000,7200000000,7300000000,7400000000,7500000000,7600000000,7700000000,7800000000,7900000000,8000000000,8100000000,8200000000,8300000000,8400000000,8500000000,8600000000,8700000000,8800000000,8900000000,9000000000,9100000000,9200000000,9300000000,9400000000,9500000000,9600000000,9700000000,9800000000,9900000000,10000000000,10100000000,10200000000,10300000000,10400000000,10500000000,10600000000,10700000000,10800000000,10900000000,11000000000,11100000000,11200000000,11300000000,11400000000,11500000000,11600000000,11700000000,11800000000,11900000000,12000000000,12100000000,12200000000,12300000000,12400000000,12500000000,12600000000,12700000000,12800000000,12900000000,13000000000,13100000000,13200000000,13300000000,13400000000,13500000000,13600000000,13700000000,13800000000,13900000000,14000000000,14100000000,14200000000,14300000000,14400000000,14500000000,14600000000,14700000000,14800000000,14900000000,15000000000,15100000000,15200000000,15300000000,15400000000,15500000000,15600000000,15700000000,15800000000,15900000000,16000000000,16100000000,16200000000,16300000000,16400000000,16500000000,16600000000,16700000000,16800000000,16900000000,17000000000,17100000000,17200000000,17300000000,17400000000,17500000000,17600000000,17700000000,17800000000,17900000000,18000000000,18100000000,18200000000,18300000000,18400000000,18500000000,18600000000,18700000000,18800000000,18900000000,19000000000,19100000000,19200000000,19300000000,19400000000,19500000000,19600000000,19700000000,19800000000,19900000000,20000000000,20100000000,20200000000,20300000000,20400000000,20500000000,20600000000,20700000000,20800000000,20900000000,21000000000,21100000000,21200000000,21300000000,21400000000,21500000000,21600000000,21700000000,21800000000,21900000000,22000000000,22100000000,22200000000,22300000000,22400000000,22500000000,22600000000,22700000000,22800000000,22900000000,23000000000,23100000000,23200000000,23300000000,23400000000,23500000000,23600000000,23700000000,23800000000,23900000000,24000000000,24100000000,24200000000,24300000000,24400000000,24500000000,24600000000,24700000000,24800000000,24900000000,25000000000,25100000000,25200000000,25300000000,25400000000,25500000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000] +[-1,-2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,-23,-24,-25,-26,-27,-28,-29,-30,-31,-32,-33,-34,-35,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-48,-49,-50,-51,-52,-53,-54,-55,-56,-57,-58,-59,-60,-61,-62,-63,-64,-65,-66,-67,-68,-69,-70,-71,-72,-73,-74,-75,-76,-77,-78,-79,-80,-81,-82,-83,-84,-85,-86,-87,-88,-89,-90,-91,-92,-93,-94,-95,-96,-97,-98,-99,-100,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-125,-126,-127,-128,-129,-130,-131,-132,-133,-134,-135,-136,-137,-138,-139,-140,-141,-142,-143,-144,-145,-146,-147,-148,-149,-150,-151,-152,-153,-154,-155,-156,-157,-158,-159,-160,-161,-162,-163,-164,-165,-166,-167,-168,-169,-170,-171,-172,-173,-174,-175,-176,-177,-178,-179,-180,-181,-182,-183,-184,-185,-186,-187,-188,-189,-190,-191,-192,-193,-194,-195,-196,-197,-198,-199,-200,-201,-202,-203,-204,-205,-206,-207,-208,-209,-210,-211,-212,-213,-214,-215,-216,-217,-218,-219,-220,-221,-222,-223,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,-235,-236,-237,-238,-239,-240,-241,-242,-243,-244,-245,-246,-247,-248,-249,-250,-251,-252,-253,-254,-255,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256] +[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.3,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.4,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.6,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.7,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1] [0,1,3,6,10,15,21,28,36,45,55,65,75,85,95,105,115,125,135,145,155,165,175,185,195,205,215,225,235,245,255,265,275,285,295,305,315,325,335,345,355,365,375,385,395,405,415,425,435,445,455,465,475,485,495,505,515,525,535,545,555,565,575,585,595,605,615,625,635,645,655,665,675,685,695,705,715,725,735,745,755,765,775,785,795,805,815,825,835,845,855,865,875,885,895,905,915,925,935,945] [1,2,3,4,5,6,7,8,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10] [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200] [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256] Array(Int64) -[1.000000000,2.000000000,3.000000000,4.000000000,5.000000000,6.000000000,7.000000000,8.000000000,9.000000000,10.000000000,11.000000000,12.000000000,13.000000000,14.000000000,15.000000000,16.000000000,17.000000000,18.000000000,19.000000000,20.000000000,21.000000000,22.000000000,23.000000000,24.000000000,25.000000000,26.000000000,27.000000000,28.000000000,29.000000000,30.000000000,31.000000000,32.000000000,33.000000000,34.000000000,35.000000000,36.000000000,37.000000000,38.000000000,39.000000000,40.000000000,41.000000000,42.000000000,43.000000000,44.000000000,45.000000000,46.000000000,47.000000000,48.000000000,49.000000000,50.000000000,51.000000000,52.000000000,53.000000000,54.000000000,55.000000000,56.000000000,57.000000000,58.000000000,59.000000000,60.000000000,61.000000000,62.000000000,63.000000000,64.000000000,65.000000000,66.000000000,67.000000000,68.000000000,69.000000000,70.000000000,71.000000000,72.000000000,73.000000000,74.000000000,75.000000000,76.000000000,77.000000000,78.000000000,79.000000000,80.000000000,81.000000000,82.000000000,83.000000000,84.000000000,85.000000000,86.000000000,87.000000000,88.000000000,89.000000000,90.000000000,91.000000000,92.000000000,93.000000000,94.000000000,95.000000000,96.000000000,97.000000000,98.000000000,99.000000000,100.000000000,101.000000000,102.000000000,103.000000000,104.000000000,105.000000000,106.000000000,107.000000000,108.000000000,109.000000000,110.000000000,111.000000000,112.000000000,113.000000000,114.000000000,115.000000000,116.000000000,117.000000000,118.000000000,119.000000000,120.000000000,121.000000000,122.000000000,123.000000000,124.000000000,125.000000000,126.000000000,127.000000000,128.000000000,129.000000000,130.000000000,131.000000000,132.000000000,133.000000000,134.000000000,135.000000000,136.000000000,137.000000000,138.000000000,139.000000000,140.000000000,141.000000000,142.000000000,143.000000000,144.000000000,145.000000000,146.000000000,147.000000000,148.000000000,149.000000000,150.000000000,151.000000000,152.000000000,153.000000000,154.000000000,155.000000000,156.000000000,157.000000000,158.000000000,159.000000000,160.000000000,161.000000000,162.000000000,163.000000000,164.000000000,165.000000000,166.000000000,167.000000000,168.000000000,169.000000000,170.000000000,171.000000000,172.000000000,173.000000000,174.000000000,175.000000000,176.000000000,177.000000000,178.000000000,179.000000000,180.000000000,181.000000000,182.000000000,183.000000000,184.000000000,185.000000000,186.000000000,187.000000000,188.000000000,189.000000000,190.000000000,191.000000000,192.000000000,193.000000000,194.000000000,195.000000000,196.000000000,197.000000000,198.000000000,199.000000000,200.000000000,201.000000000,202.000000000,203.000000000,204.000000000,205.000000000,206.000000000,207.000000000,208.000000000,209.000000000,210.000000000,211.000000000,212.000000000,213.000000000,214.000000000,215.000000000,216.000000000,217.000000000,218.000000000,219.000000000,220.000000000,221.000000000,222.000000000,223.000000000,224.000000000,225.000000000,226.000000000,227.000000000,228.000000000,229.000000000,230.000000000,231.000000000,232.000000000,233.000000000,234.000000000,235.000000000,236.000000000,237.000000000,238.000000000,239.000000000,240.000000000,241.000000000,242.000000000,243.000000000,244.000000000,245.000000000,246.000000000,247.000000000,248.000000000,249.000000000,250.000000000,251.000000000,252.000000000,253.000000000,254.000000000,255.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000,256.000000000] -[100000000.0,200000000.0,300000000.0,400000000.0,500000000.0,600000000.0,700000000.0,800000000.0,900000000.0,1000000000.0,1100000000.0,1200000000.0,1300000000.0,1400000000.0,1500000000.0,1600000000.0,1700000000.0,1800000000.0,1900000000.0,2000000000.0,2100000000.0,2200000000.0,2300000000.0,2400000000.0,2500000000.0,2600000000.0,2700000000.0,2800000000.0,2900000000.0,3000000000.0,3100000000.0,3200000000.0,3300000000.0,3400000000.0,3500000000.0,3600000000.0,3700000000.0,3800000000.0,3900000000.0,4000000000.0,4100000000.0,4200000000.0,4300000000.0,4400000000.0,4500000000.0,4600000000.0,4700000000.0,4800000000.0,4900000000.0,5000000000.0,5100000000.0,5200000000.0,5300000000.0,5400000000.0,5500000000.0,5600000000.0,5700000000.0,5800000000.0,5900000000.0,6000000000.0,6100000000.0,6200000000.0,6300000000.0,6400000000.0,6500000000.0,6600000000.0,6700000000.0,6800000000.0,6900000000.0,7000000000.0,7100000000.0,7200000000.0,7300000000.0,7400000000.0,7500000000.0,7600000000.0,7700000000.0,7800000000.0,7900000000.0,8000000000.0,8100000000.0,8200000000.0,8300000000.0,8400000000.0,8500000000.0,8600000000.0,8700000000.0,8800000000.0,8900000000.0,9000000000.0,9100000000.0,9200000000.0,9300000000.0,9400000000.0,9500000000.0,9600000000.0,9700000000.0,9800000000.0,9900000000.0,10000000000.0,10100000000.0,10200000000.0,10300000000.0,10400000000.0,10500000000.0,10600000000.0,10700000000.0,10800000000.0,10900000000.0,11000000000.0,11100000000.0,11200000000.0,11300000000.0,11400000000.0,11500000000.0,11600000000.0,11700000000.0,11800000000.0,11900000000.0,12000000000.0,12100000000.0,12200000000.0,12300000000.0,12400000000.0,12500000000.0,12600000000.0,12700000000.0,12800000000.0,12900000000.0,13000000000.0,13100000000.0,13200000000.0,13300000000.0,13400000000.0,13500000000.0,13600000000.0,13700000000.0,13800000000.0,13900000000.0,14000000000.0,14100000000.0,14200000000.0,14300000000.0,14400000000.0,14500000000.0,14600000000.0,14700000000.0,14800000000.0,14900000000.0,15000000000.0,15100000000.0,15200000000.0,15300000000.0,15400000000.0,15500000000.0,15600000000.0,15700000000.0,15800000000.0,15900000000.0,16000000000.0,16100000000.0,16200000000.0,16300000000.0,16400000000.0,16500000000.0,16600000000.0,16700000000.0,16800000000.0,16900000000.0,17000000000.0,17100000000.0,17200000000.0,17300000000.0,17400000000.0,17500000000.0,17600000000.0,17700000000.0,17800000000.0,17900000000.0,18000000000.0,18100000000.0,18200000000.0,18300000000.0,18400000000.0,18500000000.0,18600000000.0,18700000000.0,18800000000.0,18900000000.0,19000000000.0,19100000000.0,19200000000.0,19300000000.0,19400000000.0,19500000000.0,19600000000.0,19700000000.0,19800000000.0,19900000000.0,20000000000.0,20100000000.0,20200000000.0,20300000000.0,20400000000.0,20500000000.0,20600000000.0,20700000000.0,20800000000.0,20900000000.0,21000000000.0,21100000000.0,21200000000.0,21300000000.0,21400000000.0,21500000000.0,21600000000.0,21700000000.0,21800000000.0,21900000000.0,22000000000.0,22100000000.0,22200000000.0,22300000000.0,22400000000.0,22500000000.0,22600000000.0,22700000000.0,22800000000.0,22900000000.0,23000000000.0,23100000000.0,23200000000.0,23300000000.0,23400000000.0,23500000000.0,23600000000.0,23700000000.0,23800000000.0,23900000000.0,24000000000.0,24100000000.0,24200000000.0,24300000000.0,24400000000.0,24500000000.0,24600000000.0,24700000000.0,24800000000.0,24900000000.0,25000000000.0,25100000000.0,25200000000.0,25300000000.0,25400000000.0,25500000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0,25600000000.0] -[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0,24.0,25.0,26.0,27.0,28.0,29.0,30.0,31.0,32.0,33.0,34.0,35.0,36.0,37.0,38.0,39.0,40.0,41.0,42.0,43.0,44.0,45.0,46.0,47.0,48.0,49.0,50.0,51.0,52.0,53.0,54.0,55.0,56.0,57.0,58.0,59.0,60.0,61.0,62.0,63.0,64.0,65.0,66.0,67.0,68.0,69.0,70.0,71.0,72.0,73.0,74.0,75.0,76.0,77.0,78.0,79.0,80.0,81.0,82.0,83.0,84.0,85.0,86.0,87.0,88.0,89.0,90.0,91.0,92.0,93.0,94.0,95.0,96.0,97.0,98.0,99.0,100.0,101.0,102.0,103.0,104.0,105.0,106.0,107.0,108.0,109.0,110.0,111.0,112.0,113.0,114.0,115.0,116.0,117.0,118.0,119.0,120.0,121.0,122.0,123.0,124.0,125.0,126.0,127.0,128.0,129.0,130.0,131.0,132.0,133.0,134.0,135.0,136.0,137.0,138.0,139.0,140.0,141.0,142.0,143.0,144.0,145.0,146.0,147.0,148.0,149.0,150.0,151.0,152.0,153.0,154.0,155.0,156.0,157.0,158.0,159.0,160.0,161.0,162.0,163.0,164.0,165.0,166.0,167.0,168.0,169.0,170.0,171.0,172.0,173.0,174.0,175.0,176.0,177.0,178.0,179.0,180.0,181.0,182.0,183.0,184.0,185.0,186.0,187.0,188.0,189.0,190.0,191.0,192.0,193.0,194.0,195.0,196.0,197.0,198.0,199.0,200.0,201.0,202.0,203.0,204.0,205.0,206.0,207.0,208.0,209.0,210.0,211.0,212.0,213.0,214.0,215.0,216.0,217.0,218.0,219.0,220.0,221.0,222.0,223.0,224.0,225.0,226.0,227.0,228.0,229.0,230.0,231.0,232.0,233.0,234.0,235.0,236.0,237.0,238.0,239.0,240.0,241.0,242.0,243.0,244.0,245.0,246.0,247.0,248.0,249.0,250.0,251.0,252.0,253.0,254.0,255.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0,256.0] +[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256] +[100000000,200000000,300000000,400000000,500000000,600000000,700000000,800000000,900000000,1000000000,1100000000,1200000000,1300000000,1400000000,1500000000,1600000000,1700000000,1800000000,1900000000,2000000000,2100000000,2200000000,2300000000,2400000000,2500000000,2600000000,2700000000,2800000000,2900000000,3000000000,3100000000,3200000000,3300000000,3400000000,3500000000,3600000000,3700000000,3800000000,3900000000,4000000000,4100000000,4200000000,4300000000,4400000000,4500000000,4600000000,4700000000,4800000000,4900000000,5000000000,5100000000,5200000000,5300000000,5400000000,5500000000,5600000000,5700000000,5800000000,5900000000,6000000000,6100000000,6200000000,6300000000,6400000000,6500000000,6600000000,6700000000,6800000000,6900000000,7000000000,7100000000,7200000000,7300000000,7400000000,7500000000,7600000000,7700000000,7800000000,7900000000,8000000000,8100000000,8200000000,8300000000,8400000000,8500000000,8600000000,8700000000,8800000000,8900000000,9000000000,9100000000,9200000000,9300000000,9400000000,9500000000,9600000000,9700000000,9800000000,9900000000,10000000000,10100000000,10200000000,10300000000,10400000000,10500000000,10600000000,10700000000,10800000000,10900000000,11000000000,11100000000,11200000000,11300000000,11400000000,11500000000,11600000000,11700000000,11800000000,11900000000,12000000000,12100000000,12200000000,12300000000,12400000000,12500000000,12600000000,12700000000,12800000000,12900000000,13000000000,13100000000,13200000000,13300000000,13400000000,13500000000,13600000000,13700000000,13800000000,13900000000,14000000000,14100000000,14200000000,14300000000,14400000000,14500000000,14600000000,14700000000,14800000000,14900000000,15000000000,15100000000,15200000000,15300000000,15400000000,15500000000,15600000000,15700000000,15800000000,15900000000,16000000000,16100000000,16200000000,16300000000,16400000000,16500000000,16600000000,16700000000,16800000000,16900000000,17000000000,17100000000,17200000000,17300000000,17400000000,17500000000,17600000000,17700000000,17800000000,17900000000,18000000000,18100000000,18200000000,18300000000,18400000000,18500000000,18600000000,18700000000,18800000000,18900000000,19000000000,19100000000,19200000000,19300000000,19400000000,19500000000,19600000000,19700000000,19800000000,19900000000,20000000000,20100000000,20200000000,20300000000,20400000000,20500000000,20600000000,20700000000,20800000000,20900000000,21000000000,21100000000,21200000000,21300000000,21400000000,21500000000,21600000000,21700000000,21800000000,21900000000,22000000000,22100000000,22200000000,22300000000,22400000000,22500000000,22600000000,22700000000,22800000000,22900000000,23000000000,23100000000,23200000000,23300000000,23400000000,23500000000,23600000000,23700000000,23800000000,23900000000,24000000000,24100000000,24200000000,24300000000,24400000000,24500000000,24600000000,24700000000,24800000000,24900000000,25000000000,25100000000,25200000000,25300000000,25400000000,25500000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000,25600000000] +[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256] [0.00390625,0.0078125,0.01171875,0.015625,0.01953125,0.0234375,0.02734375,0.03125,0.03515625,0.0390625,0.04296875,0.046875,0.05078125,0.0546875,0.05859375,0.0625,0.06640625,0.0703125,0.07421875,0.078125,0.08203125,0.0859375,0.08984375,0.09375,0.09765625,0.1015625,0.10546875,0.109375,0.11328125,0.1171875,0.12109375,0.125,0.12890625,0.1328125,0.13671875,0.140625,0.14453125,0.1484375,0.15234375,0.15625,0.16015625,0.1640625,0.16796875,0.171875,0.17578125,0.1796875,0.18359375,0.1875,0.19140625,0.1953125,0.19921875,0.203125,0.20703125,0.2109375,0.21484375,0.21875,0.22265625,0.2265625,0.23046875,0.234375,0.23828125,0.2421875,0.24609375,0.25,0.25390625,0.2578125,0.26171875,0.265625,0.26953125,0.2734375,0.27734375,0.28125,0.28515625,0.2890625,0.29296875,0.296875,0.30078125,0.3046875,0.30859375,0.3125,0.31640625,0.3203125,0.32421875,0.328125,0.33203125,0.3359375,0.33984375,0.34375,0.34765625,0.3515625,0.35546875,0.359375,0.36328125,0.3671875,0.37109375,0.375,0.37890625,0.3828125,0.38671875,0.390625,0.39453125,0.3984375,0.40234375,0.40625,0.41015625,0.4140625,0.41796875,0.421875,0.42578125,0.4296875,0.43359375,0.4375,0.44140625,0.4453125,0.44921875,0.453125,0.45703125,0.4609375,0.46484375,0.46875,0.47265625,0.4765625,0.48046875,0.484375,0.48828125,0.4921875,0.49609375,0.5,0.50390625,0.5078125,0.51171875,0.515625,0.51953125,0.5234375,0.52734375,0.53125,0.53515625,0.5390625,0.54296875,0.546875,0.55078125,0.5546875,0.55859375,0.5625,0.56640625,0.5703125,0.57421875,0.578125,0.58203125,0.5859375,0.58984375,0.59375,0.59765625,0.6015625,0.60546875,0.609375,0.61328125,0.6171875,0.62109375,0.625,0.62890625,0.6328125,0.63671875,0.640625,0.64453125,0.6484375,0.65234375,0.65625,0.66015625,0.6640625,0.66796875,0.671875,0.67578125,0.6796875,0.68359375,0.6875,0.69140625,0.6953125,0.69921875,0.703125,0.70703125,0.7109375,0.71484375,0.71875,0.72265625,0.7265625,0.73046875,0.734375,0.73828125,0.7421875,0.74609375,0.75,0.75390625,0.7578125,0.76171875,0.765625,0.76953125,0.7734375,0.77734375,0.78125,0.78515625,0.7890625,0.79296875,0.796875,0.80078125,0.8046875,0.80859375,0.8125,0.81640625,0.8203125,0.82421875,0.828125,0.83203125,0.8359375,0.83984375,0.84375,0.84765625,0.8515625,0.85546875,0.859375,0.86328125,0.8671875,0.87109375,0.875,0.87890625,0.8828125,0.88671875,0.890625,0.89453125,0.8984375,0.90234375,0.90625,0.91015625,0.9140625,0.91796875,0.921875,0.92578125,0.9296875,0.93359375,0.9375,0.94140625,0.9453125,0.94921875,0.953125,0.95703125,0.9609375,0.96484375,0.96875,0.97265625,0.9765625,0.98046875,0.984375,0.98828125,0.9921875,0.99609375,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] [-0.00390625,-0.0078125,-0.01171875,-0.015625,-0.01953125,-0.0234375,-0.02734375,-0.03125,-0.03515625,-0.0390625,-0.04296875,-0.046875,-0.05078125,-0.0546875,-0.05859375,-0.0625,-0.06640625,-0.0703125,-0.07421875,-0.078125,-0.08203125,-0.0859375,-0.08984375,-0.09375,-0.09765625,-0.1015625,-0.10546875,-0.109375,-0.11328125,-0.1171875,-0.12109375,-0.125,-0.12890625,-0.1328125,-0.13671875,-0.140625,-0.14453125,-0.1484375,-0.15234375,-0.15625,-0.16015625,-0.1640625,-0.16796875,-0.171875,-0.17578125,-0.1796875,-0.18359375,-0.1875,-0.19140625,-0.1953125,-0.19921875,-0.203125,-0.20703125,-0.2109375,-0.21484375,-0.21875,-0.22265625,-0.2265625,-0.23046875,-0.234375,-0.23828125,-0.2421875,-0.24609375,-0.25,-0.25390625,-0.2578125,-0.26171875,-0.265625,-0.26953125,-0.2734375,-0.27734375,-0.28125,-0.28515625,-0.2890625,-0.29296875,-0.296875,-0.30078125,-0.3046875,-0.30859375,-0.3125,-0.31640625,-0.3203125,-0.32421875,-0.328125,-0.33203125,-0.3359375,-0.33984375,-0.34375,-0.34765625,-0.3515625,-0.35546875,-0.359375,-0.36328125,-0.3671875,-0.37109375,-0.375,-0.37890625,-0.3828125,-0.38671875,-0.390625,-0.39453125,-0.3984375,-0.40234375,-0.40625,-0.41015625,-0.4140625,-0.41796875,-0.421875,-0.42578125,-0.4296875,-0.43359375,-0.4375,-0.44140625,-0.4453125,-0.44921875,-0.453125,-0.45703125,-0.4609375,-0.46484375,-0.46875,-0.47265625,-0.4765625,-0.48046875,-0.484375,-0.48828125,-0.4921875,-0.49609375,-0.5,-0.50390625,-0.5078125,-0.51171875,-0.515625,-0.51953125,-0.5234375,-0.52734375,-0.53125,-0.53515625,-0.5390625,-0.54296875,-0.546875,-0.55078125,-0.5546875,-0.55859375,-0.5625,-0.56640625,-0.5703125,-0.57421875,-0.578125,-0.58203125,-0.5859375,-0.58984375,-0.59375,-0.59765625,-0.6015625,-0.60546875,-0.609375,-0.61328125,-0.6171875,-0.62109375,-0.625,-0.62890625,-0.6328125,-0.63671875,-0.640625,-0.64453125,-0.6484375,-0.65234375,-0.65625,-0.66015625,-0.6640625,-0.66796875,-0.671875,-0.67578125,-0.6796875,-0.68359375,-0.6875,-0.69140625,-0.6953125,-0.69921875,-0.703125,-0.70703125,-0.7109375,-0.71484375,-0.71875,-0.72265625,-0.7265625,-0.73046875,-0.734375,-0.73828125,-0.7421875,-0.74609375,-0.75,-0.75390625,-0.7578125,-0.76171875,-0.765625,-0.76953125,-0.7734375,-0.77734375,-0.78125,-0.78515625,-0.7890625,-0.79296875,-0.796875,-0.80078125,-0.8046875,-0.80859375,-0.8125,-0.81640625,-0.8203125,-0.82421875,-0.828125,-0.83203125,-0.8359375,-0.83984375,-0.84375,-0.84765625,-0.8515625,-0.85546875,-0.859375,-0.86328125,-0.8671875,-0.87109375,-0.875,-0.87890625,-0.8828125,-0.88671875,-0.890625,-0.89453125,-0.8984375,-0.90234375,-0.90625,-0.91015625,-0.9140625,-0.91796875,-0.921875,-0.92578125,-0.9296875,-0.93359375,-0.9375,-0.94140625,-0.9453125,-0.94921875,-0.953125,-0.95703125,-0.9609375,-0.96484375,-0.96875,-0.97265625,-0.9765625,-0.98046875,-0.984375,-0.98828125,-0.9921875,-0.99609375,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1] [0.0039,0.0078,0.0117,0.0156,0.0195,0.0234,0.0273,0.0312,0.0352,0.0391,0.043,0.0469,0.0508,0.0547,0.0586,0.0625,0.0664,0.0703,0.0742,0.0781,0.082,0.0859,0.0898,0.0938,0.0977,0.1016,0.1055,0.1094,0.1133,0.1172,0.1211,0.125,0.1289,0.1328,0.1367,0.1406,0.1445,0.1484,0.1523,0.1562,0.1602,0.1641,0.168,0.1719,0.1758,0.1797,0.1836,0.1875,0.1914,0.1953,0.1992,0.2031,0.207,0.2109,0.2148,0.2188,0.2227,0.2266,0.2305,0.2344,0.2383,0.2422,0.2461,0.25,0.2539,0.2578,0.2617,0.2656,0.2695,0.2734,0.2773,0.2812,0.2852,0.2891,0.293,0.2969,0.3008,0.3047,0.3086,0.3125,0.3164,0.3203,0.3242,0.3281,0.332,0.3359,0.3398,0.3438,0.3477,0.3516,0.3555,0.3594,0.3633,0.3672,0.3711,0.375,0.3789,0.3828,0.3867,0.3906,0.3945,0.3984,0.4023,0.4062,0.4102,0.4141,0.418,0.4219,0.4258,0.4297,0.4336,0.4375,0.4414,0.4453,0.4492,0.4531,0.457,0.4609,0.4648,0.4688,0.4727,0.4766,0.4805,0.4844,0.4883,0.4922,0.4961,0.5,0.5039,0.5078,0.5117,0.5156,0.5195,0.5234,0.5273,0.5312,0.5352,0.5391,0.543,0.5469,0.5508,0.5547,0.5586,0.5625,0.5664,0.5703,0.5742,0.5781,0.582,0.5859,0.5898,0.5938,0.5977,0.6016,0.6055,0.6094,0.6133,0.6172,0.6211,0.625,0.6289,0.6328,0.6367,0.6406,0.6445,0.6484,0.6523,0.6562,0.6602,0.6641,0.668,0.6719,0.6758,0.6797,0.6836,0.6875,0.6914,0.6953,0.6992,0.7031,0.707,0.7109,0.7148,0.7188,0.7227,0.7266,0.7305,0.7344,0.7383,0.7422,0.7461,0.75,0.7539,0.7578,0.7617,0.7656,0.7695,0.7734,0.7773,0.7812,0.7852,0.7891,0.793,0.7969,0.8008,0.8047,0.8086,0.8125,0.8164,0.8203,0.8242,0.8281,0.832,0.8359,0.8398,0.8438,0.8477,0.8516,0.8555,0.8594,0.8633,0.8672,0.8711,0.875,0.8789,0.8828,0.8867,0.8906,0.8945,0.8984,0.9023,0.9062,0.9102,0.9141,0.918,0.9219,0.9258,0.9297,0.9336,0.9375,0.9414,0.9453,0.9492,0.9531,0.957,0.9609,0.9648,0.9688,0.9727,0.9766,0.9805,0.9844,0.9883,0.9922,0.9961,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] -[0.003906250,0.007812500,0.011718750,0.015625000,0.019531250,0.023437500,0.027343750,0.031250000,0.035156250,0.039062500,0.042968750,0.046875000,0.050781250,0.054687500,0.058593750,0.062500000,0.066406250,0.070312500,0.074218750,0.078125000,0.082031250,0.085937500,0.089843750,0.093750000,0.097656250,0.101562500,0.105468750,0.109375000,0.113281250,0.117187500,0.121093750,0.125000000,0.128906250,0.132812500,0.136718750,0.140625000,0.144531250,0.148437500,0.152343750,0.156250000,0.160156250,0.164062500,0.167968750,0.171875000,0.175781250,0.179687500,0.183593750,0.187500000,0.191406250,0.195312500,0.199218750,0.203125000,0.207031250,0.210937500,0.214843750,0.218750000,0.222656250,0.226562500,0.230468750,0.234375000,0.238281250,0.242187500,0.246093750,0.250000000,0.253906250,0.257812500,0.261718750,0.265625000,0.269531250,0.273437500,0.277343750,0.281250000,0.285156250,0.289062500,0.292968750,0.296875000,0.300781250,0.304687500,0.308593750,0.312500000,0.316406250,0.320312500,0.324218750,0.328125000,0.332031250,0.335937500,0.339843750,0.343750000,0.347656250,0.351562500,0.355468750,0.359375000,0.363281250,0.367187500,0.371093750,0.375000000,0.378906250,0.382812500,0.386718750,0.390625000,0.394531250,0.398437500,0.402343750,0.406250000,0.410156250,0.414062500,0.417968750,0.421875000,0.425781250,0.429687500,0.433593750,0.437500000,0.441406250,0.445312500,0.449218750,0.453125000,0.457031250,0.460937500,0.464843750,0.468750000,0.472656250,0.476562500,0.480468750,0.484375000,0.488281250,0.492187500,0.496093750,0.500000000,0.503906250,0.507812500,0.511718750,0.515625000,0.519531250,0.523437500,0.527343750,0.531250000,0.535156250,0.539062500,0.542968750,0.546875000,0.550781250,0.554687500,0.558593750,0.562500000,0.566406250,0.570312500,0.574218750,0.578125000,0.582031250,0.585937500,0.589843750,0.593750000,0.597656250,0.601562500,0.605468750,0.609375000,0.613281250,0.617187500,0.621093750,0.625000000,0.628906250,0.632812500,0.636718750,0.640625000,0.644531250,0.648437500,0.652343750,0.656250000,0.660156250,0.664062500,0.667968750,0.671875000,0.675781250,0.679687500,0.683593750,0.687500000,0.691406250,0.695312500,0.699218750,0.703125000,0.707031250,0.710937500,0.714843750,0.718750000,0.722656250,0.726562500,0.730468750,0.734375000,0.738281250,0.742187500,0.746093750,0.750000000,0.753906250,0.757812500,0.761718750,0.765625000,0.769531250,0.773437500,0.777343750,0.781250000,0.785156250,0.789062500,0.792968750,0.796875000,0.800781250,0.804687500,0.808593750,0.812500000,0.816406250,0.820312500,0.824218750,0.828125000,0.832031250,0.835937500,0.839843750,0.843750000,0.847656250,0.851562500,0.855468750,0.859375000,0.863281250,0.867187500,0.871093750,0.875000000,0.878906250,0.882812500,0.886718750,0.890625000,0.894531250,0.898437500,0.902343750,0.906250000,0.910156250,0.914062500,0.917968750,0.921875000,0.925781250,0.929687500,0.933593750,0.937500000,0.941406250,0.945312500,0.949218750,0.953125000,0.957031250,0.960937500,0.964843750,0.968750000,0.972656250,0.976562500,0.980468750,0.984375000,0.988281250,0.992187500,0.996093750,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000] +[0.00390625,0.0078125,0.01171875,0.015625,0.01953125,0.0234375,0.02734375,0.03125,0.03515625,0.0390625,0.04296875,0.046875,0.05078125,0.0546875,0.05859375,0.0625,0.06640625,0.0703125,0.07421875,0.078125,0.08203125,0.0859375,0.08984375,0.09375,0.09765625,0.1015625,0.10546875,0.109375,0.11328125,0.1171875,0.12109375,0.125,0.12890625,0.1328125,0.13671875,0.140625,0.14453125,0.1484375,0.15234375,0.15625,0.16015625,0.1640625,0.16796875,0.171875,0.17578125,0.1796875,0.18359375,0.1875,0.19140625,0.1953125,0.19921875,0.203125,0.20703125,0.2109375,0.21484375,0.21875,0.22265625,0.2265625,0.23046875,0.234375,0.23828125,0.2421875,0.24609375,0.25,0.25390625,0.2578125,0.26171875,0.265625,0.26953125,0.2734375,0.27734375,0.28125,0.28515625,0.2890625,0.29296875,0.296875,0.30078125,0.3046875,0.30859375,0.3125,0.31640625,0.3203125,0.32421875,0.328125,0.33203125,0.3359375,0.33984375,0.34375,0.34765625,0.3515625,0.35546875,0.359375,0.36328125,0.3671875,0.37109375,0.375,0.37890625,0.3828125,0.38671875,0.390625,0.39453125,0.3984375,0.40234375,0.40625,0.41015625,0.4140625,0.41796875,0.421875,0.42578125,0.4296875,0.43359375,0.4375,0.44140625,0.4453125,0.44921875,0.453125,0.45703125,0.4609375,0.46484375,0.46875,0.47265625,0.4765625,0.48046875,0.484375,0.48828125,0.4921875,0.49609375,0.5,0.50390625,0.5078125,0.51171875,0.515625,0.51953125,0.5234375,0.52734375,0.53125,0.53515625,0.5390625,0.54296875,0.546875,0.55078125,0.5546875,0.55859375,0.5625,0.56640625,0.5703125,0.57421875,0.578125,0.58203125,0.5859375,0.58984375,0.59375,0.59765625,0.6015625,0.60546875,0.609375,0.61328125,0.6171875,0.62109375,0.625,0.62890625,0.6328125,0.63671875,0.640625,0.64453125,0.6484375,0.65234375,0.65625,0.66015625,0.6640625,0.66796875,0.671875,0.67578125,0.6796875,0.68359375,0.6875,0.69140625,0.6953125,0.69921875,0.703125,0.70703125,0.7109375,0.71484375,0.71875,0.72265625,0.7265625,0.73046875,0.734375,0.73828125,0.7421875,0.74609375,0.75,0.75390625,0.7578125,0.76171875,0.765625,0.76953125,0.7734375,0.77734375,0.78125,0.78515625,0.7890625,0.79296875,0.796875,0.80078125,0.8046875,0.80859375,0.8125,0.81640625,0.8203125,0.82421875,0.828125,0.83203125,0.8359375,0.83984375,0.84375,0.84765625,0.8515625,0.85546875,0.859375,0.86328125,0.8671875,0.87109375,0.875,0.87890625,0.8828125,0.88671875,0.890625,0.89453125,0.8984375,0.90234375,0.90625,0.91015625,0.9140625,0.91796875,0.921875,0.92578125,0.9296875,0.93359375,0.9375,0.94140625,0.9453125,0.94921875,0.953125,0.95703125,0.9609375,0.96484375,0.96875,0.97265625,0.9765625,0.98046875,0.984375,0.98828125,0.9921875,0.99609375,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] Array(Decimal(38, 9)) -[0.010000000,0.020000000,0.030000000,0.040000000,0.050000000,0.060000000,0.070000000,0.080000000,0.090000000,0.100000000,0.110000000,0.120000000,0.130000000,0.140000000,0.150000000,0.160000000,0.170000000,0.180000000,0.190000000,0.200000000,0.210000000,0.220000000,0.230000000,0.240000000,0.250000000,0.260000000,0.270000000,0.280000000,0.290000000,0.300000000,0.310000000,0.320000000,0.330000000,0.340000000,0.350000000,0.360000000,0.370000000,0.380000000,0.390000000,0.400000000,0.410000000,0.420000000,0.430000000,0.440000000,0.450000000,0.460000000,0.470000000,0.480000000,0.490000000,0.500000000,0.510000000,0.520000000,0.530000000,0.540000000,0.550000000,0.560000000,0.570000000,0.580000000,0.590000000,0.600000000,0.610000000,0.620000000,0.630000000,0.640000000,0.650000000,0.660000000,0.670000000,0.680000000,0.690000000,0.700000000,0.710000000,0.720000000,0.730000000,0.740000000,0.750000000,0.760000000,0.770000000,0.780000000,0.790000000,0.800000000,0.810000000,0.820000000,0.830000000,0.840000000,0.850000000,0.860000000,0.870000000,0.880000000,0.890000000,0.900000000,0.910000000,0.920000000,0.930000000,0.940000000,0.950000000,0.960000000,0.970000000,0.980000000,0.990000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000,1.000000000] +[0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.1,0.11,0.12,0.13,0.14,0.15,0.16,0.17,0.18,0.19,0.2,0.21,0.22,0.23,0.24,0.25,0.26,0.27,0.28,0.29,0.3,0.31,0.32,0.33,0.34,0.35,0.36,0.37,0.38,0.39,0.4,0.41,0.42,0.43,0.44,0.45,0.46,0.47,0.48,0.49,0.5,0.51,0.52,0.53,0.54,0.55,0.56,0.57,0.58,0.59,0.6,0.61,0.62,0.63,0.64,0.65,0.66,0.67,0.68,0.69,0.7,0.71,0.72,0.73,0.74,0.75,0.76,0.77,0.78,0.79,0.8,0.81,0.82,0.83,0.84,0.85,0.86,0.87,0.88,0.89,0.9,0.91,0.92,0.93,0.94,0.95,0.96,0.97,0.98,0.99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] diff --git a/tests/queries/0_stateless/01414_optimize_any_bug.reference b/tests/queries/0_stateless/01414_optimize_any_bug.reference index 573541ac970..e69de29bb2d 100644 --- a/tests/queries/0_stateless/01414_optimize_any_bug.reference +++ b/tests/queries/0_stateless/01414_optimize_any_bug.reference @@ -1 +0,0 @@ -0 diff --git a/tests/queries/0_stateless/01415_sticking_mutations.sh b/tests/queries/0_stateless/01415_sticking_mutations.sh index 9bd0a6eeebf..2e86b6d972d 100755 --- a/tests/queries/0_stateless/01415_sticking_mutations.sh +++ b/tests/queries/0_stateless/01415_sticking_mutations.sh @@ -33,9 +33,10 @@ function check_sticky_mutations() query_result=$($CLICKHOUSE_CLIENT --query="$check_query" 2>&1) - while [ "$query_result" == "0" ] + for _ in {1..50} do query_result=$($CLICKHOUSE_CLIENT --query="$check_query" 2>&1) + if ! [ "$query_result" == "0" ]; then break; fi sleep 0.5 done ##### wait mutation to start ##### diff --git a/tests/queries/0_stateless/01425_decimal_parse_big_negative_exponent.reference b/tests/queries/0_stateless/01425_decimal_parse_big_negative_exponent.reference index 7f41fb5addb..cc91b057dc8 100644 --- a/tests/queries/0_stateless/01425_decimal_parse_big_negative_exponent.reference +++ b/tests/queries/0_stateless/01425_decimal_parse_big_negative_exponent.reference @@ -3,4 +3,4 @@ 1E-7 0 1e-7 0 1E-9 0.000000001 -1E-10 0.000000000 +1E-10 0 diff --git a/tests/queries/0_stateless/01425_default_value_of_type_name.reference b/tests/queries/0_stateless/01425_default_value_of_type_name.reference index c7dfcb7607d..33ff67f2b23 100644 --- a/tests/queries/0_stateless/01425_default_value_of_type_name.reference +++ b/tests/queries/0_stateless/01425_default_value_of_type_name.reference @@ -1 +1 @@ -0 00000000-0000-0000-0000-000000000000 0.0.0.0 :: 0.000 ('1970-01-01','1970-01-01 00:00:00',[],NULL) +0 00000000-0000-0000-0000-000000000000 0.0.0.0 :: 0 ('1970-01-01','1970-01-01 00:00:00',[],NULL) diff --git a/tests/queries/0_stateless/01429_join_on_error_messages.sql b/tests/queries/0_stateless/01429_join_on_error_messages.sql index f9e2647f2e3..6e792e90d42 100644 --- a/tests/queries/0_stateless/01429_join_on_error_messages.sql +++ b/tests/queries/0_stateless/01429_join_on_error_messages.sql @@ -4,8 +4,8 @@ SELECT 1 FROM (select 1 a) A JOIN (select 1 b) B ON (A.a = arrayJoin([1])); -- { SELECT 1 FROM (select 1 a) A JOIN (select 1 b) B ON equals(a); -- { serverError 62 } SELECT 1 FROM (select 1 a) A JOIN (select 1 b) B ON less(a); -- { serverError 62 } -SELECT 1 FROM (select 1 a) A JOIN (select 1 b) B ON a = b OR a = b; -- { serverError 48 } -SELECT 1 FROM (select 1 a) A JOIN (select 1 b) B ON a = b AND a > b; -- { serverError 48 } -SELECT 1 FROM (select 1 a) A JOIN (select 1 b) B ON a = b AND a < b; -- { serverError 48 } -SELECT 1 FROM (select 1 a) A JOIN (select 1 b) B ON a = b AND a >= b; -- { serverError 48 } -SELECT 1 FROM (select 1 a) A JOIN (select 1 b) B ON a = b AND a <= b; -- { serverError 48 } +SELECT 1 FROM (select 1 a) A JOIN (select 1 b) B ON a = b OR a = b; -- { serverError 403 } +SELECT 1 FROM (select 1 a) A JOIN (select 1 b) B ON a = b AND a > b; -- { serverError 403 } +SELECT 1 FROM (select 1 a) A JOIN (select 1 b) B ON a = b AND a < b; -- { serverError 403 } +SELECT 1 FROM (select 1 a) A JOIN (select 1 b) B ON a = b AND a >= b; -- { serverError 403 } +SELECT 1 FROM (select 1 a) A JOIN (select 1 b) B ON a = b AND a <= b; -- { serverError 403 } diff --git a/tests/queries/0_stateless/01430_modify_sample_by_zookeeper.reference b/tests/queries/0_stateless/01430_modify_sample_by_zookeeper_long.reference similarity index 100% rename from tests/queries/0_stateless/01430_modify_sample_by_zookeeper.reference rename to tests/queries/0_stateless/01430_modify_sample_by_zookeeper_long.reference diff --git a/tests/queries/0_stateless/01430_modify_sample_by_zookeeper.sql b/tests/queries/0_stateless/01430_modify_sample_by_zookeeper_long.sql similarity index 96% rename from tests/queries/0_stateless/01430_modify_sample_by_zookeeper.sql rename to tests/queries/0_stateless/01430_modify_sample_by_zookeeper_long.sql index dc7f5017bfd..288fa97d218 100644 --- a/tests/queries/0_stateless/01430_modify_sample_by_zookeeper.sql +++ b/tests/queries/0_stateless/01430_modify_sample_by_zookeeper_long.sql @@ -11,7 +11,7 @@ SELECT count(), min(x), max(x), sum(x), uniqExact(x) FROM modify_sample SAMPLE 0 ALTER TABLE modify_sample MODIFY SAMPLE BY x; SELECT count(), min(x), max(x), sum(x), uniqExact(x) FROM modify_sample SAMPLE 0.1; -CREATE TABLE modify_sample_replicated (d Date DEFAULT '2000-01-01', x UInt8, y UInt64) ENGINE = ReplicatedMergeTree('/clickhouse/tables/test_01430', 'modify_sample') PARTITION BY d ORDER BY (x, y); +CREATE TABLE modify_sample_replicated (d Date DEFAULT '2000-01-01', x UInt8, y UInt64) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/test_01430', 'modify_sample') PARTITION BY d ORDER BY (x, y); INSERT INTO modify_sample_replicated (x, y) SELECT toUInt8(number) AS x, toUInt64(number) as y FROM system.numbers LIMIT 256; diff --git a/tests/queries/0_stateless/01440_big_int_exotic_casts.reference b/tests/queries/0_stateless/01440_big_int_exotic_casts.reference index fb3cdce7ad9..8e02bffb91d 100644 --- a/tests/queries/0_stateless/01440_big_int_exotic_casts.reference +++ b/tests/queries/0_stateless/01440_big_int_exotic_casts.reference @@ -1,183 +1,183 @@ -0 0.0 0.00 0.000000 0.0000000 -1 1.0 1.00 1.000000 1.0000000 -8 8.0 8.00 8.000000 8.0000000 -27 27.0 27.00 27.000000 27.0000000 -64 64.0 64.00 64.000000 64.0000000 -125 125.0 125.00 125.000000 125.0000000 -216 216.0 216.00 216.000000 216.0000000 -343 343.0 343.00 343.000000 343.0000000 -512 512.0 512.00 512.000000 512.0000000 -729 729.0 729.00 729.000000 729.0000000 -0 0.0 0.00 0.000000 0.0000000 -1 1.0 1.00 1.000000 1.0000000 -8 8.0 8.00 8.000000 8.0000000 -27 27.0 27.00 27.000000 27.0000000 -64 64.0 64.00 64.000000 64.0000000 -125 125.0 125.00 125.000000 125.0000000 -216 216.0 216.00 216.000000 216.0000000 -343 343.0 343.00 343.000000 343.0000000 -512 512.0 512.00 512.000000 512.0000000 -729 729.0 729.00 729.000000 729.0000000 -0 0.0 0.00 0.000000 0.0000000 -1 1.0 1.00 1.000000 1.0000000 -8 8.0 8.00 8.000000 8.0000000 -27 27.0 27.00 27.000000 27.0000000 -64 64.0 64.00 64.000000 64.0000000 -125 125.0 125.00 125.000000 125.0000000 -216 216.0 216.00 216.000000 216.0000000 -343 343.0 343.00 343.000000 343.0000000 -512 512.0 512.00 512.000000 512.0000000 -729 729.0 729.00 729.000000 729.0000000 -0 0.0 0.00 0.000000 0.0000000 -1 1.0 1.00 1.000000 1.0000000 -8 8.0 8.00 8.000000 8.0000000 -27 27.0 27.00 27.000000 27.0000000 -64 64.0 64.00 64.000000 64.0000000 -125 125.0 125.00 125.000000 125.0000000 -216 216.0 216.00 216.000000 216.0000000 -343 343.0 343.00 343.000000 343.0000000 -512 512.0 512.00 512.000000 512.0000000 -729 729.0 729.00 729.000000 729.0000000 -0 0.0 0.00 0.000000 0.0000000 -1 1.0 1.00 1.000000 1.0000000 -8 8.0 8.00 8.000000 8.0000000 -27 27.0 27.00 27.000000 27.0000000 -64 64.0 64.00 64.000000 64.0000000 -125 125.0 125.00 125.000000 125.0000000 -216 216.0 216.00 216.000000 216.0000000 -343 343.0 343.00 343.000000 343.0000000 -512 512.0 512.00 512.000000 512.0000000 -729 729.0 729.00 729.000000 729.0000000 -0 0.0 0.00 0.000000 0.0000000 -1 1.0 1.00 1.000000 1.0000000 -8 8.0 8.00 8.000000 8.0000000 -27 27.0 27.00 27.000000 27.0000000 -64 64.0 64.00 64.000000 64.0000000 -125 125.0 125.00 125.000000 125.0000000 -216 216.0 216.00 216.000000 216.0000000 -343 343.0 343.00 343.000000 343.0000000 -512 512.0 512.00 512.000000 512.0000000 -729 729.0 729.00 729.000000 729.0000000 -0 0.0 0.00 0.000000 0.0000000 -1 1.0 1.00 1.000000 1.0000000 -8 8.0 8.00 8.000000 8.0000000 -27 27.0 27.00 27.000000 27.0000000 -64 64.0 64.00 64.000000 64.0000000 -125 125.0 125.00 125.000000 125.0000000 -216 216.0 216.00 216.000000 216.0000000 -343 343.0 343.00 343.000000 343.0000000 -512 512.0 512.00 512.000000 512.0000000 -729 729.0 729.00 729.000000 729.0000000 -0 0.0 0.00 0.000000 0.0000000 -1 1.0 1.00 1.000000 1.0000000 -8 8.0 8.00 8.000000 8.0000000 -27 27.0 27.00 27.000000 27.0000000 -64 64.0 64.00 64.000000 64.0000000 -125 125.0 125.00 125.000000 125.0000000 -216 216.0 216.00 216.000000 216.0000000 -343 343.0 343.00 343.000000 343.0000000 -512 512.0 512.00 512.000000 512.0000000 -729 729.0 729.00 729.000000 729.0000000 -0 0.0 0.00 0.000000 0.0000000 -1 1.0 1.00 1.000000 1.0000000 -8 8.0 8.00 8.000000 8.0000000 -27 27.0 27.00 27.000000 27.0000000 -64 64.0 64.00 64.000000 64.0000000 -125 125.0 125.00 125.000000 125.0000000 -216 216.0 216.00 216.000000 216.0000000 -343 343.0 343.00 343.000000 343.0000000 -512 512.0 512.00 512.000000 512.0000000 -729 729.0 729.00 729.000000 729.0000000 -0 0.0 0.00 0.000000 0.0000000 --1 -1.0 -1.00 -1.000000 -1.0000000 --4 -4.0 -4.00 -4.000000 -4.0000000 --9 -9.0 -9.00 -9.000000 -9.0000000 --16 -16.0 -16.00 -16.000000 -16.0000000 --25 -25.0 -25.00 -25.000000 -25.0000000 --36 -36.0 -36.00 -36.000000 -36.0000000 --49 -49.0 -49.00 -49.000000 -49.0000000 --64 -64.0 -64.00 -64.000000 -64.0000000 --81 -81.0 -81.00 -81.000000 -81.0000000 -0 0.0 0.00 0.000000 0.0000000 --1 -1.0 -1.00 -1.000000 -1.0000000 --4 -4.0 -4.00 -4.000000 -4.0000000 --9 -9.0 -9.00 -9.000000 -9.0000000 --16 -16.0 -16.00 -16.000000 -16.0000000 --25 -25.0 -25.00 -25.000000 -25.0000000 --36 -36.0 -36.00 -36.000000 -36.0000000 --49 -49.0 -49.00 -49.000000 -49.0000000 --64 -64.0 -64.00 -64.000000 -64.0000000 --81 -81.0 -81.00 -81.000000 -81.0000000 -0 0.0 0.00 0.000000 0.0000000 --1 -1.0 -1.00 -1.000000 -1.0000000 --4 -4.0 -4.00 -4.000000 -4.0000000 --9 -9.0 -9.00 -9.000000 -9.0000000 --16 -16.0 -16.00 -16.000000 -16.0000000 --25 -25.0 -25.00 -25.000000 -25.0000000 --36 -36.0 -36.00 -36.000000 -36.0000000 --49 -49.0 -49.00 -49.000000 -49.0000000 --64 -64.0 -64.00 -64.000000 -64.0000000 --81 -81.0 -81.00 -81.000000 -81.0000000 -0 0.0 0.00 0.000000 0.0000000 --1 -1.0 -1.00 -1.000000 -1.0000000 --4 -4.0 -4.00 -4.000000 -4.0000000 --9 -9.0 -9.00 -9.000000 -9.0000000 --16 -16.0 -16.00 -16.000000 -16.0000000 --25 -25.0 -25.00 -25.000000 -25.0000000 --36 -36.0 -36.00 -36.000000 -36.0000000 --49 -49.0 -49.00 -49.000000 -49.0000000 --64 -64.0 -64.00 -64.000000 -64.0000000 --81 -81.0 -81.00 -81.000000 -81.0000000 -0 0.0 0.00 0.000000 0.0000000 --1 -1.0 -1.00 -1.000000 -1.0000000 --4 -4.0 -4.00 -4.000000 -4.0000000 --9 -9.0 -9.00 -9.000000 -9.0000000 --16 -16.0 -16.00 -16.000000 -16.0000000 --25 -25.0 -25.00 -25.000000 -25.0000000 --36 -36.0 -36.00 -36.000000 -36.0000000 --49 -49.0 -49.00 -49.000000 -49.0000000 --64 -64.0 -64.00 -64.000000 -64.0000000 --81 -81.0 -81.00 -81.000000 -81.0000000 -0 0.0 0.00 0.000000 0.0000000 --1 -1.0 -1.00 -1.000000 -1.0000000 --4 -4.0 -4.00 -4.000000 -4.0000000 --9 -9.0 -9.00 -9.000000 -9.0000000 --16 -16.0 -16.00 -16.000000 -16.0000000 --25 -25.0 -25.00 -25.000000 -25.0000000 --36 -36.0 -36.00 -36.000000 -36.0000000 --49 -49.0 -49.00 -49.000000 -49.0000000 --64 -64.0 -64.00 -64.000000 -64.0000000 --81 -81.0 -81.00 -81.000000 -81.0000000 -0 0.0 0.00 0.000000 0.0000000 --1 -1.0 -1.00 -1.000000 -1.0000000 --4 -4.0 -4.00 -4.000000 -4.0000000 --9 -9.0 -9.00 -9.000000 -9.0000000 --16 -16.0 -16.00 -16.000000 -16.0000000 --25 -25.0 -25.00 -25.000000 -25.0000000 --36 -36.0 -36.00 -36.000000 -36.0000000 --49 -49.0 -49.00 -49.000000 -49.0000000 --64 -64.0 -64.00 -64.000000 -64.0000000 --81 -81.0 -81.00 -81.000000 -81.0000000 --0 0.0 0.00 0.000000 0.0000000 --1 -1.0 -1.00 -1.000000 -1.0000000 --4 -4.0 -4.00 -4.000000 -4.0000000 --9 -9.0 -9.00 -9.000000 -9.0000000 --16 -16.0 -16.00 -16.000000 -16.0000000 --25 -25.0 -25.00 -25.000000 -25.0000000 --36 -36.0 -36.00 -36.000000 -36.0000000 --49 -49.0 -49.00 -49.000000 -49.0000000 --64 -64.0 -64.00 -64.000000 -64.0000000 --81 -81.0 -81.00 -81.000000 -81.0000000 --0 0.0 0.00 0.000000 0.0000000 --1 -1.0 -1.00 -1.000000 -1.0000000 --4 -4.0 -4.00 -4.000000 -4.0000000 --9 -9.0 -9.00 -9.000000 -9.0000000 --16 -16.0 -16.00 -16.000000 -16.0000000 --25 -25.0 -25.00 -25.000000 -25.0000000 --36 -36.0 -36.00 -36.000000 -36.0000000 --49 -49.0 -49.00 -49.000000 -49.0000000 --64 -64.0 -64.00 -64.000000 -64.0000000 --81 -81.0 -81.00 -81.000000 -81.0000000 +0 0 0 0 0 +1 1 1 1 1 +8 8 8 8 8 +27 27 27 27 27 +64 64 64 64 64 +125 125 125 125 125 +216 216 216 216 216 +343 343 343 343 343 +512 512 512 512 512 +729 729 729 729 729 +0 0 0 0 0 +1 1 1 1 1 +8 8 8 8 8 +27 27 27 27 27 +64 64 64 64 64 +125 125 125 125 125 +216 216 216 216 216 +343 343 343 343 343 +512 512 512 512 512 +729 729 729 729 729 +0 0 0 0 0 +1 1 1 1 1 +8 8 8 8 8 +27 27 27 27 27 +64 64 64 64 64 +125 125 125 125 125 +216 216 216 216 216 +343 343 343 343 343 +512 512 512 512 512 +729 729 729 729 729 +0 0 0 0 0 +1 1 1 1 1 +8 8 8 8 8 +27 27 27 27 27 +64 64 64 64 64 +125 125 125 125 125 +216 216 216 216 216 +343 343 343 343 343 +512 512 512 512 512 +729 729 729 729 729 +0 0 0 0 0 +1 1 1 1 1 +8 8 8 8 8 +27 27 27 27 27 +64 64 64 64 64 +125 125 125 125 125 +216 216 216 216 216 +343 343 343 343 343 +512 512 512 512 512 +729 729 729 729 729 +0 0 0 0 0 +1 1 1 1 1 +8 8 8 8 8 +27 27 27 27 27 +64 64 64 64 64 +125 125 125 125 125 +216 216 216 216 216 +343 343 343 343 343 +512 512 512 512 512 +729 729 729 729 729 +0 0 0 0 0 +1 1 1 1 1 +8 8 8 8 8 +27 27 27 27 27 +64 64 64 64 64 +125 125 125 125 125 +216 216 216 216 216 +343 343 343 343 343 +512 512 512 512 512 +729 729 729 729 729 +0 0 0 0 0 +1 1 1 1 1 +8 8 8 8 8 +27 27 27 27 27 +64 64 64 64 64 +125 125 125 125 125 +216 216 216 216 216 +343 343 343 343 343 +512 512 512 512 512 +729 729 729 729 729 +0 0 0 0 0 +1 1 1 1 1 +8 8 8 8 8 +27 27 27 27 27 +64 64 64 64 64 +125 125 125 125 125 +216 216 216 216 216 +343 343 343 343 343 +512 512 512 512 512 +729 729 729 729 729 +0 0 0 0 0 +-1 -1 -1 -1 -1 +-4 -4 -4 -4 -4 +-9 -9 -9 -9 -9 +-16 -16 -16 -16 -16 +-25 -25 -25 -25 -25 +-36 -36 -36 -36 -36 +-49 -49 -49 -49 -49 +-64 -64 -64 -64 -64 +-81 -81 -81 -81 -81 +0 0 0 0 0 +-1 -1 -1 -1 -1 +-4 -4 -4 -4 -4 +-9 -9 -9 -9 -9 +-16 -16 -16 -16 -16 +-25 -25 -25 -25 -25 +-36 -36 -36 -36 -36 +-49 -49 -49 -49 -49 +-64 -64 -64 -64 -64 +-81 -81 -81 -81 -81 +0 0 0 0 0 +-1 -1 -1 -1 -1 +-4 -4 -4 -4 -4 +-9 -9 -9 -9 -9 +-16 -16 -16 -16 -16 +-25 -25 -25 -25 -25 +-36 -36 -36 -36 -36 +-49 -49 -49 -49 -49 +-64 -64 -64 -64 -64 +-81 -81 -81 -81 -81 +0 0 0 0 0 +-1 -1 -1 -1 -1 +-4 -4 -4 -4 -4 +-9 -9 -9 -9 -9 +-16 -16 -16 -16 -16 +-25 -25 -25 -25 -25 +-36 -36 -36 -36 -36 +-49 -49 -49 -49 -49 +-64 -64 -64 -64 -64 +-81 -81 -81 -81 -81 +0 0 0 0 0 +-1 -1 -1 -1 -1 +-4 -4 -4 -4 -4 +-9 -9 -9 -9 -9 +-16 -16 -16 -16 -16 +-25 -25 -25 -25 -25 +-36 -36 -36 -36 -36 +-49 -49 -49 -49 -49 +-64 -64 -64 -64 -64 +-81 -81 -81 -81 -81 +0 0 0 0 0 +-1 -1 -1 -1 -1 +-4 -4 -4 -4 -4 +-9 -9 -9 -9 -9 +-16 -16 -16 -16 -16 +-25 -25 -25 -25 -25 +-36 -36 -36 -36 -36 +-49 -49 -49 -49 -49 +-64 -64 -64 -64 -64 +-81 -81 -81 -81 -81 +0 0 0 0 0 +-1 -1 -1 -1 -1 +-4 -4 -4 -4 -4 +-9 -9 -9 -9 -9 +-16 -16 -16 -16 -16 +-25 -25 -25 -25 -25 +-36 -36 -36 -36 -36 +-49 -49 -49 -49 -49 +-64 -64 -64 -64 -64 +-81 -81 -81 -81 -81 +-0 0 0 0 0 +-1 -1 -1 -1 -1 +-4 -4 -4 -4 -4 +-9 -9 -9 -9 -9 +-16 -16 -16 -16 -16 +-25 -25 -25 -25 -25 +-36 -36 -36 -36 -36 +-49 -49 -49 -49 -49 +-64 -64 -64 -64 -64 +-81 -81 -81 -81 -81 +-0 0 0 0 0 +-1 -1 -1 -1 -1 +-4 -4 -4 -4 -4 +-9 -9 -9 -9 -9 +-16 -16 -16 -16 -16 +-25 -25 -25 -25 -25 +-36 -36 -36 -36 -36 +-49 -49 -49 -49 -49 +-64 -64 -64 -64 -64 +-81 -81 -81 -81 -81 0 0 0 0 4294967295 4294967295 4294967295 4294967295 8589934588 8589934588 8589934588 8589934588 @@ -288,5 +288,5 @@ -7 0 0 0 -8 0 0 0 -9 0 0 0 -2499500025000000 2499500025000000 2499500025000000 2499500025000000.00 -0 0 0 0.00 +2499500025000000 2499500025000000 2499500025000000 2499500025000000 +0 0 0 0 diff --git a/tests/queries/0_stateless/01440_to_date_monotonicity.sql b/tests/queries/0_stateless/01440_to_date_monotonicity.sql index e48911e954c..8843d7ffca6 100644 --- a/tests/queries/0_stateless/01440_to_date_monotonicity.sql +++ b/tests/queries/0_stateless/01440_to_date_monotonicity.sql @@ -1,14 +1,16 @@ DROP TABLE IF EXISTS tdm; DROP TABLE IF EXISTS tdm2; -CREATE TABLE tdm (x DateTime) ENGINE = MergeTree ORDER BY x SETTINGS write_final_mark = 0; +CREATE TABLE tdm (x DateTime('Europe/Moscow')) ENGINE = MergeTree ORDER BY x SETTINGS write_final_mark = 0; INSERT INTO tdm VALUES (now()); -SELECT count(x) FROM tdm WHERE toDate(x) < today() SETTINGS max_rows_to_read = 1; +SELECT count(x) FROM tdm WHERE toDate(x) < toDate(now(), 'Europe/Moscow') SETTINGS max_rows_to_read = 1; -SELECT toDate(-1), toDate(10000000000000), toDate(100), toDate(65536), toDate(65535); -SELECT toDateTime(-1), toDateTime(10000000000000), toDateTime(1000); +SELECT toDate(-1), toDate(10000000000000, 'Europe/Moscow'), toDate(100), toDate(65536, 'UTC'), toDate(65535, 'Europe/Moscow'); +SELECT toDateTime(-1, 'Europe/Moscow'), toDateTime(10000000000000, 'Europe/Moscow'), toDateTime(1000, 'Europe/Moscow'); CREATE TABLE tdm2 (timestamp UInt32) ENGINE = MergeTree ORDER BY timestamp SETTINGS index_granularity = 1; + INSERT INTO tdm2 VALUES (toUnixTimestamp('2000-01-01 13:12:12')), (toUnixTimestamp('2000-01-01 14:12:12')), (toUnixTimestamp('2000-01-01 15:12:12')); + SET max_rows_to_read = 1; SELECT toDateTime(timestamp) FROM tdm2 WHERE toHour(toDateTime(timestamp)) = 13; diff --git a/tests/queries/0_stateless/01451_normalize_query.reference b/tests/queries/0_stateless/01451_normalize_query.reference index 67aa3a97998..339ad34ea77 100644 --- a/tests/queries/0_stateless/01451_normalize_query.reference +++ b/tests/queries/0_stateless/01451_normalize_query.reference @@ -20,3 +20,6 @@ SELECT ? AS xyz11 SELECT ? xyz11 SELECT ?, xyz11 SELECT ?.. +SELECT ? xyz11 +SELECT ?, xyz11 +SELECT ?.. diff --git a/tests/queries/0_stateless/01451_normalize_query.sql b/tests/queries/0_stateless/01451_normalize_query.sql index d1e45dea967..3c01a975712 100644 --- a/tests/queries/0_stateless/01451_normalize_query.sql +++ b/tests/queries/0_stateless/01451_normalize_query.sql @@ -20,3 +20,7 @@ SELECT normalizeQuery('SELECT 1 AS xyz11'); SELECT normalizeQuery('SELECT 1 xyz11'); SELECT normalizeQuery('SELECT 1, xyz11'); SELECT normalizeQuery('SELECT 1, ''xyz11'''); +SELECT normalizeQuery('SELECT $doc$VALUE$doc$ xyz11'); +SELECT normalizeQuery('SELECT $doc$VALUE$doc$, xyz11'); +SELECT normalizeQuery('SELECT $doc$VALUE$doc$, ''xyz11'''); + diff --git a/tests/queries/0_stateless/01451_replicated_detach_drop_and_quorum.reference b/tests/queries/0_stateless/01451_replicated_detach_drop_and_quorum_long.reference similarity index 100% rename from tests/queries/0_stateless/01451_replicated_detach_drop_and_quorum.reference rename to tests/queries/0_stateless/01451_replicated_detach_drop_and_quorum_long.reference diff --git a/tests/queries/0_stateless/01451_replicated_detach_drop_and_quorum.sql b/tests/queries/0_stateless/01451_replicated_detach_drop_and_quorum_long.sql similarity index 84% rename from tests/queries/0_stateless/01451_replicated_detach_drop_and_quorum.sql rename to tests/queries/0_stateless/01451_replicated_detach_drop_and_quorum_long.sql index 72e588c5c02..2c6bafe4936 100644 --- a/tests/queries/0_stateless/01451_replicated_detach_drop_and_quorum.sql +++ b/tests/queries/0_stateless/01451_replicated_detach_drop_and_quorum_long.sql @@ -4,8 +4,8 @@ SET replication_alter_partitions_sync = 2; DROP TABLE IF EXISTS replica1; DROP TABLE IF EXISTS replica2; -CREATE TABLE replica1 (v UInt8) ENGINE = ReplicatedMergeTree('/clickhouse/tables/test/01451/quorum', 'r1') order by tuple() settings max_replicated_merges_in_queue = 0; -CREATE TABLE replica2 (v UInt8) ENGINE = ReplicatedMergeTree('/clickhouse/tables/test/01451/quorum', 'r2') order by tuple() settings max_replicated_merges_in_queue = 0; +CREATE TABLE replica1 (v UInt8) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/test/01451/quorum', 'r1') order by tuple() settings max_replicated_merges_in_queue = 0; +CREATE TABLE replica2 (v UInt8) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/test/01451/quorum', 'r2') order by tuple() settings max_replicated_merges_in_queue = 0; INSERT INTO replica1 VALUES (0); diff --git a/tests/queries/0_stateless/01451_replicated_detach_drop_part_long.sql b/tests/queries/0_stateless/01451_replicated_detach_drop_part_long.sql index cd8267ce59a..5da86f45fde 100644 --- a/tests/queries/0_stateless/01451_replicated_detach_drop_part_long.sql +++ b/tests/queries/0_stateless/01451_replicated_detach_drop_part_long.sql @@ -3,8 +3,8 @@ SET replication_alter_partitions_sync = 2; DROP TABLE IF EXISTS replica1; DROP TABLE IF EXISTS replica2; -CREATE TABLE replica1 (v UInt8) ENGINE = ReplicatedMergeTree('/clickhouse/tables/'||currentDatabase()||'test/01451/attach', 'r1') order by tuple() settings max_replicated_merges_in_queue = 0; -CREATE TABLE replica2 (v UInt8) ENGINE = ReplicatedMergeTree('/clickhouse/tables/'||currentDatabase()||'test/01451/attach', 'r2') order by tuple() settings max_replicated_merges_in_queue = 0; +CREATE TABLE replica1 (v UInt8) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/'||currentDatabase()||'test/01451/attach', 'r1') order by tuple() settings max_replicated_merges_in_queue = 0; +CREATE TABLE replica2 (v UInt8) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/'||currentDatabase()||'test/01451/attach', 'r2') order by tuple() settings max_replicated_merges_in_queue = 0; INSERT INTO replica1 VALUES (0); INSERT INTO replica1 VALUES (1); diff --git a/tests/queries/0_stateless/01452_normalized_query_hash.reference b/tests/queries/0_stateless/01452_normalized_query_hash.reference index fcb49fa9945..bb0850568bb 100644 --- a/tests/queries/0_stateless/01452_normalized_query_hash.reference +++ b/tests/queries/0_stateless/01452_normalized_query_hash.reference @@ -5,3 +5,5 @@ 1 1 1 +1 +1 diff --git a/tests/queries/0_stateless/01452_normalized_query_hash.sql b/tests/queries/0_stateless/01452_normalized_query_hash.sql index a888d2b87b5..0ae95b5292c 100644 --- a/tests/queries/0_stateless/01452_normalized_query_hash.sql +++ b/tests/queries/0_stateless/01452_normalized_query_hash.sql @@ -5,3 +5,7 @@ SELECT normalizedQueryHash('[1, 2, 3]') = normalizedQueryHash('[1, ''x'']'); SELECT normalizedQueryHash('[1, 2, 3, x]') != normalizedQueryHash('[1, x]'); SELECT normalizedQueryHash('SELECT 1 AS `xyz`') != normalizedQueryHash('SELECT 1 AS `abc`'); SELECT normalizedQueryHash('SELECT 1 AS xyz111') = normalizedQueryHash('SELECT 2 AS xyz234'); +SELECT normalizedQueryHash('SELECT $doc$VALUE$doc$ AS `xyz`') != normalizedQueryHash('SELECT $doc$VALUE$doc$ AS `abc`'); +SELECT normalizedQueryHash('SELECT $doc$VALUE$doc$ AS xyz111') = normalizedQueryHash('SELECT $doc$VALUE$doc$ AS xyz234'); + + diff --git a/tests/queries/0_stateless/01455_nullable_type_with_if_agg_combinator.sql b/tests/queries/0_stateless/01455_nullable_type_with_if_agg_combinator.sql index 852660117f5..0e951af73d0 100644 --- a/tests/queries/0_stateless/01455_nullable_type_with_if_agg_combinator.sql +++ b/tests/queries/0_stateless/01455_nullable_type_with_if_agg_combinator.sql @@ -1,3 +1,5 @@ +SET cast_keep_nullable = 0; + -- Value nullable SELECT anyIf(CAST(number, 'Nullable(UInt8)'), number = 3) AS a, toTypeName(a) FROM numbers(2); -- Value and condition nullable diff --git a/tests/queries/0_stateless/01455_shard_leaf_max_rows_bytes_to_read.sql b/tests/queries/0_stateless/01455_shard_leaf_max_rows_bytes_to_read.sql index fca5c4534f7..d21aa391890 100644 --- a/tests/queries/0_stateless/01455_shard_leaf_max_rows_bytes_to_read.sql +++ b/tests/queries/0_stateless/01455_shard_leaf_max_rows_bytes_to_read.sql @@ -1,3 +1,10 @@ +-- Leaf limits is unreliable w/ prefer_localhost_replica=1. +-- Since in this case initial query and the query on the local node (to the +-- underlying table) has the same counters, so if query on the remote node +-- will be finished before local, then local node will already have some rows +-- read, and leaf limit will fail. +SET prefer_localhost_replica=0; + SELECT count() FROM (SELECT * FROM remote('127.0.0.1', system.numbers) LIMIT 100) SETTINGS max_rows_to_read_leaf=1; -- { serverError 158 } SELECT count() FROM (SELECT * FROM remote('127.0.0.1', system.numbers) LIMIT 100) SETTINGS max_bytes_to_read_leaf=1; -- { serverError 307 } SELECT count() FROM (SELECT * FROM remote('127.0.0.1', system.numbers) LIMIT 100) SETTINGS max_rows_to_read_leaf=100; @@ -26,4 +33,4 @@ SELECT count() FROM (SELECT * FROM test_distributed) SETTINGS max_bytes_to_read SELECT count() FROM (SELECT * FROM test_distributed) SETTINGS max_bytes_to_read_leaf = 100000; DROP TABLE IF EXISTS test_local; -DROP TABLE IF EXISTS test_distributed; \ No newline at end of file +DROP TABLE IF EXISTS test_distributed; diff --git a/tests/queries/0_stateless/01459_decimal_casts.reference b/tests/queries/0_stateless/01459_decimal_casts.reference index bd635ee0235..b195ff881c0 100644 --- a/tests/queries/0_stateless/01459_decimal_casts.reference +++ b/tests/queries/0_stateless/01459_decimal_casts.reference @@ -1,12 +1,12 @@ -0 0.0 0.00000 0.000000 0.0000000 -1 1.0 1.00000 1.000000 1.0000000 -2 2.0 2.00000 2.000000 2.0000000 -3 3.0 3.00000 3.000000 3.0000000 -4 4.0 4.00000 4.000000 4.0000000 -5 5.0 5.00000 5.000000 5.0000000 -6 6.0 6.00000 6.000000 6.0000000 -7 7.0 7.00000 7.000000 7.0000000 -8 8.0 8.00000 8.000000 8.0000000 +0 0 0 0 0 +1 1 1 1 1 +2 2 2 2 2 +3 3 3 3 3 +4 4 4 4 4 +5 5 5 5 5 +6 6 6 6 6 +7 7 7 7 7 +8 8 8 8 8 9 9 9 10 10 10 11 11 11 diff --git a/tests/queries/0_stateless/01460_DistributedFilesToInsert.sql b/tests/queries/0_stateless/01460_DistributedFilesToInsert.sql index 34c0d55d573..02e3d3ef73f 100644 --- a/tests/queries/0_stateless/01460_DistributedFilesToInsert.sql +++ b/tests/queries/0_stateless/01460_DistributedFilesToInsert.sql @@ -2,33 +2,31 @@ -- (i.e. no .bin files and hence no sending is required) set prefer_localhost_replica=0; -set distributed_directory_monitor_sleep_time_ms=50; - drop table if exists data_01460; drop table if exists dist_01460; create table data_01460 as system.one engine=Null(); -create table dist_01460 as data_01460 engine=Distributed(test_shard_localhost, currentDatabase(), data_01460); +create table dist_01460 as data_01460 engine=Distributed(test_shard_localhost, currentDatabase(), data_01460) settings monitor_sleep_time_ms=50; select 'INSERT'; select value from system.metrics where metric = 'DistributedFilesToInsert'; insert into dist_01460 select * from system.one; -select sleep(1) format Null; -- distributed_directory_monitor_sleep_time_ms +select sleep(1) format Null; -- monitor_sleep_time_ms select value from system.metrics where metric = 'DistributedFilesToInsert'; select 'STOP/START DISTRIBUTED SENDS'; system stop distributed sends dist_01460; insert into dist_01460 select * from system.one; -select sleep(1) format Null; -- distributed_directory_monitor_sleep_time_ms +select sleep(1) format Null; -- monitor_sleep_time_ms select value from system.metrics where metric = 'DistributedFilesToInsert'; system start distributed sends dist_01460; -select sleep(1) format Null; -- distributed_directory_monitor_sleep_time_ms +select sleep(1) format Null; -- monitor_sleep_time_ms select value from system.metrics where metric = 'DistributedFilesToInsert'; select 'FLUSH DISTRIBUTED'; system stop distributed sends dist_01460; insert into dist_01460 select * from system.one; -select sleep(1) format Null; -- distributed_directory_monitor_sleep_time_ms +select sleep(1) format Null; -- monitor_sleep_time_ms select value from system.metrics where metric = 'DistributedFilesToInsert'; system flush distributed dist_01460; select value from system.metrics where metric = 'DistributedFilesToInsert'; @@ -36,7 +34,7 @@ select value from system.metrics where metric = 'DistributedFilesToInsert'; select 'DROP TABLE'; system stop distributed sends dist_01460; insert into dist_01460 select * from system.one; -select sleep(1) format Null; -- distributed_directory_monitor_sleep_time_ms +select sleep(1) format Null; -- monitor_sleep_time_ms select value from system.metrics where metric = 'DistributedFilesToInsert'; drop table dist_01460; select value from system.metrics where metric = 'DistributedFilesToInsert'; diff --git a/tests/queries/0_stateless/01474_decimal_scale_bug.reference b/tests/queries/0_stateless/01474_decimal_scale_bug.reference index 69c14de597f..26c53bc9984 100644 --- a/tests/queries/0_stateless/01474_decimal_scale_bug.reference +++ b/tests/queries/0_stateless/01474_decimal_scale_bug.reference @@ -1,18 +1,18 @@ -1.000 Decimal(9, 3) -1.000 Decimal(9, 3) -1.0000 Decimal(18, 4) -1.0000 Decimal(18, 4) -1.00000 Decimal(38, 5) -1.00000 Decimal(38, 5) -1.000 Decimal(18, 3) -1.000 Decimal(18, 3) -1.0000 Decimal(18, 4) -1.0000 Decimal(18, 4) -1.00000 Decimal(38, 5) -1.00000 Decimal(38, 5) -1.000 Decimal(38, 3) -1.000 Decimal(38, 3) -1.0000 Decimal(38, 4) -1.0000 Decimal(38, 4) -1.00000 Decimal(38, 5) -1.00000 Decimal(38, 5) +1 Decimal(9, 3) +1 Decimal(9, 3) +1 Decimal(18, 4) +1 Decimal(18, 4) +1 Decimal(38, 5) +1 Decimal(38, 5) +1 Decimal(18, 3) +1 Decimal(18, 3) +1 Decimal(18, 4) +1 Decimal(18, 4) +1 Decimal(38, 5) +1 Decimal(38, 5) +1 Decimal(38, 3) +1 Decimal(38, 3) +1 Decimal(38, 4) +1 Decimal(38, 4) +1 Decimal(38, 5) +1 Decimal(38, 5) diff --git a/tests/queries/0_stateless/01493_alter_remove_no_property_zookeeper.reference b/tests/queries/0_stateless/01493_alter_remove_no_property_zookeeper_long.reference similarity index 58% rename from tests/queries/0_stateless/01493_alter_remove_no_property_zookeeper.reference rename to tests/queries/0_stateless/01493_alter_remove_no_property_zookeeper_long.reference index 82f6fbd6615..a770460c8b8 100644 --- a/tests/queries/0_stateless/01493_alter_remove_no_property_zookeeper.reference +++ b/tests/queries/0_stateless/01493_alter_remove_no_property_zookeeper_long.reference @@ -1,4 +1,4 @@ CREATE TABLE default.no_prop_table\n(\n `some_column` UInt64\n)\nENGINE = MergeTree\nORDER BY tuple()\nSETTINGS index_granularity = 8192 CREATE TABLE default.no_prop_table\n(\n `some_column` UInt64\n)\nENGINE = MergeTree\nORDER BY tuple()\nSETTINGS index_granularity = 8192 -CREATE TABLE default.r_no_prop_table\n(\n `some_column` UInt64\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/test/01493_r_no_prop_table\', \'1\')\nORDER BY tuple()\nSETTINGS index_granularity = 8192 -CREATE TABLE default.r_no_prop_table\n(\n `some_column` UInt64\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/test/01493_r_no_prop_table\', \'1\')\nORDER BY tuple()\nSETTINGS index_granularity = 8192 +CREATE TABLE default.r_no_prop_table\n(\n `some_column` UInt64\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/default/test/01493_r_no_prop_table\', \'1\')\nORDER BY tuple()\nSETTINGS index_granularity = 8192 +CREATE TABLE default.r_no_prop_table\n(\n `some_column` UInt64\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/default/test/01493_r_no_prop_table\', \'1\')\nORDER BY tuple()\nSETTINGS index_granularity = 8192 diff --git a/tests/queries/0_stateless/01493_alter_remove_no_property_zookeeper.sql b/tests/queries/0_stateless/01493_alter_remove_no_property_zookeeper_long.sql similarity index 95% rename from tests/queries/0_stateless/01493_alter_remove_no_property_zookeeper.sql rename to tests/queries/0_stateless/01493_alter_remove_no_property_zookeeper_long.sql index aceb4e8140d..8d37900aaf8 100644 --- a/tests/queries/0_stateless/01493_alter_remove_no_property_zookeeper.sql +++ b/tests/queries/0_stateless/01493_alter_remove_no_property_zookeeper_long.sql @@ -29,7 +29,7 @@ CREATE TABLE r_no_prop_table ( some_column UInt64 ) -ENGINE ReplicatedMergeTree('/clickhouse/test/01493_r_no_prop_table', '1') +ENGINE ReplicatedMergeTree('/clickhouse/{database}/test/01493_r_no_prop_table', '1') ORDER BY tuple(); SHOW CREATE TABLE r_no_prop_table; diff --git a/tests/queries/0_stateless/01493_alter_remove_properties_zookeeper.reference b/tests/queries/0_stateless/01493_alter_remove_properties_zookeeper.reference index 7cd2c81b460..42f9b24715f 100644 --- a/tests/queries/0_stateless/01493_alter_remove_properties_zookeeper.reference +++ b/tests/queries/0_stateless/01493_alter_remove_properties_zookeeper.reference @@ -1,21 +1,21 @@ -CREATE TABLE default.r_prop_table1\n(\n `column_default` UInt64 DEFAULT 42,\n `column_codec` String CODEC(ZSTD(10)),\n `column_comment` Date COMMENT \'Some comment\',\n `column_ttl` UInt64 TTL column_comment + toIntervalMonth(1)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/test_01493/r_prop_table\', \'1\')\nORDER BY tuple()\nTTL column_comment + toIntervalMonth(2)\nSETTINGS index_granularity = 8192 -CREATE TABLE default.r_prop_table2\n(\n `column_default` UInt64 DEFAULT 42,\n `column_codec` String CODEC(ZSTD(10)),\n `column_comment` Date COMMENT \'Some comment\',\n `column_ttl` UInt64 TTL column_comment + toIntervalMonth(1)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/test_01493/r_prop_table\', \'2\')\nORDER BY tuple()\nTTL column_comment + toIntervalMonth(2)\nSETTINGS index_granularity = 8192 +CREATE TABLE default.r_prop_table1\n(\n `column_default` UInt64 DEFAULT 42,\n `column_codec` String CODEC(ZSTD(10)),\n `column_comment` Date COMMENT \'Some comment\',\n `column_ttl` UInt64 TTL column_comment + toIntervalMonth(1)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/default/test_01493/r_prop_table\', \'1\')\nORDER BY tuple()\nTTL column_comment + toIntervalMonth(2)\nSETTINGS index_granularity = 8192 +CREATE TABLE default.r_prop_table2\n(\n `column_default` UInt64 DEFAULT 42,\n `column_codec` String CODEC(ZSTD(10)),\n `column_comment` Date COMMENT \'Some comment\',\n `column_ttl` UInt64 TTL column_comment + toIntervalMonth(1)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/default/test_01493/r_prop_table\', \'2\')\nORDER BY tuple()\nTTL column_comment + toIntervalMonth(2)\nSETTINGS index_granularity = 8192 ====== remove column comment ====== -CREATE TABLE default.r_prop_table1\n(\n `column_default` UInt64 DEFAULT 42,\n `column_codec` String CODEC(ZSTD(10)),\n `column_comment` Date,\n `column_ttl` UInt64 TTL column_comment + toIntervalMonth(1)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/test_01493/r_prop_table\', \'1\')\nORDER BY tuple()\nTTL column_comment + toIntervalMonth(2)\nSETTINGS index_granularity = 8192 -CREATE TABLE default.r_prop_table2\n(\n `column_default` UInt64 DEFAULT 42,\n `column_codec` String CODEC(ZSTD(10)),\n `column_comment` Date,\n `column_ttl` UInt64 TTL column_comment + toIntervalMonth(1)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/test_01493/r_prop_table\', \'2\')\nORDER BY tuple()\nTTL column_comment + toIntervalMonth(2)\nSETTINGS index_granularity = 8192 +CREATE TABLE default.r_prop_table1\n(\n `column_default` UInt64 DEFAULT 42,\n `column_codec` String CODEC(ZSTD(10)),\n `column_comment` Date,\n `column_ttl` UInt64 TTL column_comment + toIntervalMonth(1)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/default/test_01493/r_prop_table\', \'1\')\nORDER BY tuple()\nTTL column_comment + toIntervalMonth(2)\nSETTINGS index_granularity = 8192 +CREATE TABLE default.r_prop_table2\n(\n `column_default` UInt64 DEFAULT 42,\n `column_codec` String CODEC(ZSTD(10)),\n `column_comment` Date,\n `column_ttl` UInt64 TTL column_comment + toIntervalMonth(1)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/default/test_01493/r_prop_table\', \'2\')\nORDER BY tuple()\nTTL column_comment + toIntervalMonth(2)\nSETTINGS index_granularity = 8192 ====== remove column codec ====== -CREATE TABLE default.r_prop_table1\n(\n `column_default` UInt64 DEFAULT 42,\n `column_codec` String,\n `column_comment` Date,\n `column_ttl` UInt64 TTL column_comment + toIntervalMonth(1)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/test_01493/r_prop_table\', \'1\')\nORDER BY tuple()\nTTL column_comment + toIntervalMonth(2)\nSETTINGS index_granularity = 8192 -CREATE TABLE default.r_prop_table2\n(\n `column_default` UInt64 DEFAULT 42,\n `column_codec` String,\n `column_comment` Date,\n `column_ttl` UInt64 TTL column_comment + toIntervalMonth(1)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/test_01493/r_prop_table\', \'2\')\nORDER BY tuple()\nTTL column_comment + toIntervalMonth(2)\nSETTINGS index_granularity = 8192 +CREATE TABLE default.r_prop_table1\n(\n `column_default` UInt64 DEFAULT 42,\n `column_codec` String,\n `column_comment` Date,\n `column_ttl` UInt64 TTL column_comment + toIntervalMonth(1)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/default/test_01493/r_prop_table\', \'1\')\nORDER BY tuple()\nTTL column_comment + toIntervalMonth(2)\nSETTINGS index_granularity = 8192 +CREATE TABLE default.r_prop_table2\n(\n `column_default` UInt64 DEFAULT 42,\n `column_codec` String,\n `column_comment` Date,\n `column_ttl` UInt64 TTL column_comment + toIntervalMonth(1)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/default/test_01493/r_prop_table\', \'2\')\nORDER BY tuple()\nTTL column_comment + toIntervalMonth(2)\nSETTINGS index_granularity = 8192 ====== remove column default ====== 42 str 1 0 tsr 2 -CREATE TABLE default.r_prop_table1\n(\n `column_default` UInt64,\n `column_codec` String,\n `column_comment` Date,\n `column_ttl` UInt64 TTL column_comment + toIntervalMonth(1)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/test_01493/r_prop_table\', \'1\')\nORDER BY tuple()\nTTL column_comment + toIntervalMonth(2)\nSETTINGS index_granularity = 8192 -CREATE TABLE default.r_prop_table2\n(\n `column_default` UInt64,\n `column_codec` String,\n `column_comment` Date,\n `column_ttl` UInt64 TTL column_comment + toIntervalMonth(1)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/test_01493/r_prop_table\', \'2\')\nORDER BY tuple()\nTTL column_comment + toIntervalMonth(2)\nSETTINGS index_granularity = 8192 +CREATE TABLE default.r_prop_table1\n(\n `column_default` UInt64,\n `column_codec` String,\n `column_comment` Date,\n `column_ttl` UInt64 TTL column_comment + toIntervalMonth(1)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/default/test_01493/r_prop_table\', \'1\')\nORDER BY tuple()\nTTL column_comment + toIntervalMonth(2)\nSETTINGS index_granularity = 8192 +CREATE TABLE default.r_prop_table2\n(\n `column_default` UInt64,\n `column_codec` String,\n `column_comment` Date,\n `column_ttl` UInt64 TTL column_comment + toIntervalMonth(1)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/default/test_01493/r_prop_table\', \'2\')\nORDER BY tuple()\nTTL column_comment + toIntervalMonth(2)\nSETTINGS index_granularity = 8192 ====== remove column TTL ====== -CREATE TABLE default.r_prop_table1\n(\n `column_default` UInt64,\n `column_codec` String,\n `column_comment` Date,\n `column_ttl` UInt64\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/test_01493/r_prop_table\', \'1\')\nORDER BY tuple()\nTTL column_comment + toIntervalMonth(2)\nSETTINGS index_granularity = 8192 -CREATE TABLE default.r_prop_table2\n(\n `column_default` UInt64,\n `column_codec` String,\n `column_comment` Date,\n `column_ttl` UInt64\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/test_01493/r_prop_table\', \'2\')\nORDER BY tuple()\nTTL column_comment + toIntervalMonth(2)\nSETTINGS index_granularity = 8192 +CREATE TABLE default.r_prop_table1\n(\n `column_default` UInt64,\n `column_codec` String,\n `column_comment` Date,\n `column_ttl` UInt64\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/default/test_01493/r_prop_table\', \'1\')\nORDER BY tuple()\nTTL column_comment + toIntervalMonth(2)\nSETTINGS index_granularity = 8192 +CREATE TABLE default.r_prop_table2\n(\n `column_default` UInt64,\n `column_codec` String,\n `column_comment` Date,\n `column_ttl` UInt64\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/default/test_01493/r_prop_table\', \'2\')\nORDER BY tuple()\nTTL column_comment + toIntervalMonth(2)\nSETTINGS index_granularity = 8192 ====== remove table TTL ====== -CREATE TABLE default.r_prop_table1\n(\n `column_default` UInt64,\n `column_codec` String,\n `column_comment` Date,\n `column_ttl` UInt64\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/test_01493/r_prop_table\', \'1\')\nORDER BY tuple()\nSETTINGS index_granularity = 8192 -CREATE TABLE default.r_prop_table2\n(\n `column_default` UInt64,\n `column_codec` String,\n `column_comment` Date,\n `column_ttl` UInt64\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/test_01493/r_prop_table\', \'2\')\nORDER BY tuple()\nSETTINGS index_granularity = 8192 +CREATE TABLE default.r_prop_table1\n(\n `column_default` UInt64,\n `column_codec` String,\n `column_comment` Date,\n `column_ttl` UInt64\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/default/test_01493/r_prop_table\', \'1\')\nORDER BY tuple()\nSETTINGS index_granularity = 8192 +CREATE TABLE default.r_prop_table2\n(\n `column_default` UInt64,\n `column_codec` String,\n `column_comment` Date,\n `column_ttl` UInt64\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/default/test_01493/r_prop_table\', \'2\')\nORDER BY tuple()\nSETTINGS index_granularity = 8192 3 3 diff --git a/tests/queries/0_stateless/01493_alter_remove_properties_zookeeper.sql b/tests/queries/0_stateless/01493_alter_remove_properties_zookeeper.sql index b810e2a8737..55f610eb7d0 100644 --- a/tests/queries/0_stateless/01493_alter_remove_properties_zookeeper.sql +++ b/tests/queries/0_stateless/01493_alter_remove_properties_zookeeper.sql @@ -10,7 +10,7 @@ CREATE TABLE r_prop_table1 column_comment Date COMMENT 'Some comment', column_ttl UInt64 TTL column_comment + INTERVAL 1 MONTH ) -ENGINE ReplicatedMergeTree('/clickhouse/test_01493/r_prop_table', '1') +ENGINE ReplicatedMergeTree('/clickhouse/{database}/test_01493/r_prop_table', '1') ORDER BY tuple() TTL column_comment + INTERVAL 2 MONTH; @@ -21,7 +21,7 @@ CREATE TABLE r_prop_table2 column_comment Date COMMENT 'Some comment', column_ttl UInt64 TTL column_comment + INTERVAL 1 MONTH ) -ENGINE ReplicatedMergeTree('/clickhouse/test_01493/r_prop_table', '2') +ENGINE ReplicatedMergeTree('/clickhouse/{database}/test_01493/r_prop_table', '2') ORDER BY tuple() TTL column_comment + INTERVAL 2 MONTH; diff --git a/tests/queries/0_stateless/01501_cache_dictionary_all_fields.reference b/tests/queries/0_stateless/01501_cache_dictionary_all_fields.reference index a67d5f46131..f04b50d6489 100644 --- a/tests/queries/0_stateless/01501_cache_dictionary_all_fields.reference +++ b/tests/queries/0_stateless/01501_cache_dictionary_all_fields.reference @@ -8,9 +8,9 @@ [-9223372036854775808,-4,-44,-444,-4444,-44444] [111.11,22.543,21.543,13.334,52.001,33.333] [222.11,3332154213.4,3111154213.9,3222187213.1,3237554213.5,3222193713.7] -[333.11000,0.00001,0.00002,0.00003,0.00004,0.00005] -[444.110000000000000,0.000000000000001,0.000000000000002,0.000000000000003,0.000000000000004,0.000000000000005] -[555.11000000000000000000000000000000000,0.00000000000000000000000000000000001,0.00000000000000000000000000000000002,0.00000000000000000000000000000000003,0.00000000000000000000000000000000004,0.00000000000000000000000000000000005] +[333.11,0.00001,0.00002,0.00003,0.00004,0.00005] +[444.11,0.000000000000001,0.000000000000002,0.000000000000003,0.000000000000004,0.000000000000005] +[555.11,0.00000000000000000000000000000000001,0.00000000000000000000000000000000002,0.00000000000000000000000000000000003,0.00000000000000000000000000000000004,0.00000000000000000000000000000000005] ['hi','clickhouse','hello','dbms','MergeTree','dictionary'] [55,2,22,222,174,206] [65535,3,33,333,3333,33333] @@ -22,9 +22,9 @@ [-9223372036854775808,-4,-44,-444,-4444,-44444] [111.11,22.543,21.543,13.334,52.001,33.333] [222.11,3332154213.4,3111154213.9,3222187213.1,3237554213.5,3222193713.7] -[333.11000,0.00001,0.00002,0.00003,0.00004,0.00005] -[444.110000000000000,0.000000000000001,0.000000000000002,0.000000000000003,0.000000000000004,0.000000000000005] -[555.11000000000000000000000000000000000,0.00000000000000000000000000000000001,0.00000000000000000000000000000000002,0.00000000000000000000000000000000003,0.00000000000000000000000000000000004,0.00000000000000000000000000000000005] +[333.11,0.00001,0.00002,0.00003,0.00004,0.00005] +[444.11,0.000000000000001,0.000000000000002,0.000000000000003,0.000000000000004,0.000000000000005] +[555.11,0.00000000000000000000000000000000001,0.00000000000000000000000000000000002,0.00000000000000000000000000000000003,0.00000000000000000000000000000000004,0.00000000000000000000000000000000005] ['hi','clickhouse','hello','dbms','MergeTree','dictionary'] [0,1,1,1,1,1,0,0,0,0] [0,1,1,1,1,1,0,0,0,0] diff --git a/tests/queries/0_stateless/01508_partition_pruning_long.queries b/tests/queries/0_stateless/01508_partition_pruning_long.queries index 3773e907c53..786240145a9 100644 --- a/tests/queries/0_stateless/01508_partition_pruning_long.queries +++ b/tests/queries/0_stateless/01508_partition_pruning_long.queries @@ -2,20 +2,20 @@ DROP TABLE IF EXISTS tMM; DROP TABLE IF EXISTS tDD; DROP TABLE IF EXISTS sDD; DROP TABLE IF EXISTS xMM; -CREATE TABLE tMM(d DateTime,a Int64) ENGINE = MergeTree PARTITION BY toYYYYMM(d) ORDER BY tuple() SETTINGS index_granularity = 8192; +CREATE TABLE tMM(d DateTime('Europe/Moscow'), a Int64) ENGINE = MergeTree PARTITION BY toYYYYMM(d) ORDER BY tuple() SETTINGS index_granularity = 8192; SYSTEM STOP MERGES tMM; -INSERT INTO tMM SELECT toDateTime('2020-08-16 00:00:00') + number*60, number FROM numbers(5000); -INSERT INTO tMM SELECT toDateTime('2020-08-16 00:00:00') + number*60, number FROM numbers(5000); -INSERT INTO tMM SELECT toDateTime('2020-09-01 00:00:00') + number*60, number FROM numbers(5000); -INSERT INTO tMM SELECT toDateTime('2020-09-01 00:00:00') + number*60, number FROM numbers(5000); -INSERT INTO tMM SELECT toDateTime('2020-10-01 00:00:00') + number*60, number FROM numbers(5000); -INSERT INTO tMM SELECT toDateTime('2020-10-15 00:00:00') + number*60, number FROM numbers(5000); +INSERT INTO tMM SELECT toDateTime('2020-08-16 00:00:00', 'Europe/Moscow') + number*60, number FROM numbers(5000); +INSERT INTO tMM SELECT toDateTime('2020-08-16 00:00:00', 'Europe/Moscow') + number*60, number FROM numbers(5000); +INSERT INTO tMM SELECT toDateTime('2020-09-01 00:00:00', 'Europe/Moscow') + number*60, number FROM numbers(5000); +INSERT INTO tMM SELECT toDateTime('2020-09-01 00:00:00', 'Europe/Moscow') + number*60, number FROM numbers(5000); +INSERT INTO tMM SELECT toDateTime('2020-10-01 00:00:00', 'Europe/Moscow') + number*60, number FROM numbers(5000); +INSERT INTO tMM SELECT toDateTime('2020-10-15 00:00:00', 'Europe/Moscow') + number*60, number FROM numbers(5000); -CREATE TABLE tDD(d DateTime,a Int) ENGINE = MergeTree PARTITION BY toYYYYMMDD(d) ORDER BY tuple() SETTINGS index_granularity = 8192; +CREATE TABLE tDD(d DateTime('Europe/Moscow'),a Int) ENGINE = MergeTree PARTITION BY toYYYYMMDD(d) ORDER BY tuple() SETTINGS index_granularity = 8192; SYSTEM STOP MERGES tDD; -insert into tDD select toDateTime(toDate('2020-09-23')), number from numbers(10000) UNION ALL select toDateTime(toDateTime('2020-09-23 11:00:00')), number from numbers(10000) UNION ALL select toDateTime(toDate('2020-09-24')), number from numbers(10000) UNION ALL select toDateTime(toDate('2020-09-25')), number from numbers(10000) UNION ALL select toDateTime(toDate('2020-08-15')), number from numbers(10000); +insert into tDD select toDateTime(toDate('2020-09-23'), 'Europe/Moscow'), number from numbers(10000) UNION ALL select toDateTime(toDateTime('2020-09-23 11:00:00', 'Europe/Moscow')), number from numbers(10000) UNION ALL select toDateTime(toDate('2020-09-24'), 'Europe/Moscow'), number from numbers(10000) UNION ALL select toDateTime(toDate('2020-09-25'), 'Europe/Moscow'), number from numbers(10000) UNION ALL select toDateTime(toDate('2020-08-15'), 'Europe/Moscow'), number from numbers(10000); -CREATE TABLE sDD(d UInt64,a Int) ENGINE = MergeTree PARTITION BY toYYYYMM(toDate(intDiv(d,1000))) ORDER BY tuple() SETTINGS index_granularity = 8192; +CREATE TABLE sDD(d UInt64,a Int) ENGINE = MergeTree PARTITION BY toYYYYMM(toDate(intDiv(d,1000), 'Europe/Moscow')) ORDER BY tuple() SETTINGS index_granularity = 8192; SYSTEM STOP MERGES sDD; insert into sDD select (1597536000+number*60)*1000, number from numbers(5000); insert into sDD select (1597536000+number*60)*1000, number from numbers(5000); @@ -24,14 +24,14 @@ insert into sDD select (1598918400+number*60)*1000, number from numbers(5000); insert into sDD select (1601510400+number*60)*1000, number from numbers(5000); insert into sDD select (1602720000+number*60)*1000, number from numbers(5000); -CREATE TABLE xMM(d DateTime,a Int64, f Int64) ENGINE = MergeTree PARTITION BY (toYYYYMM(d), a) ORDER BY tuple() SETTINGS index_granularity = 8192; +CREATE TABLE xMM(d DateTime('Europe/Moscow'),a Int64, f Int64) ENGINE = MergeTree PARTITION BY (toYYYYMM(d), a) ORDER BY tuple() SETTINGS index_granularity = 8192; SYSTEM STOP MERGES xMM; -INSERT INTO xMM SELECT toDateTime('2020-08-16 00:00:00') + number*60, 1, number FROM numbers(5000); -INSERT INTO xMM SELECT toDateTime('2020-08-16 00:00:00') + number*60, 2, number FROM numbers(5000); -INSERT INTO xMM SELECT toDateTime('2020-09-01 00:00:00') + number*60, 3, number FROM numbers(5000); -INSERT INTO xMM SELECT toDateTime('2020-09-01 00:00:00') + number*60, 2, number FROM numbers(5000); -INSERT INTO xMM SELECT toDateTime('2020-10-01 00:00:00') + number*60, 1, number FROM numbers(5000); -INSERT INTO xMM SELECT toDateTime('2020-10-15 00:00:00') + number*60, 1, number FROM numbers(5000); +INSERT INTO xMM SELECT toDateTime('2020-08-16 00:00:00', 'Europe/Moscow') + number*60, 1, number FROM numbers(5000); +INSERT INTO xMM SELECT toDateTime('2020-08-16 00:00:00', 'Europe/Moscow') + number*60, 2, number FROM numbers(5000); +INSERT INTO xMM SELECT toDateTime('2020-09-01 00:00:00', 'Europe/Moscow') + number*60, 3, number FROM numbers(5000); +INSERT INTO xMM SELECT toDateTime('2020-09-01 00:00:00', 'Europe/Moscow') + number*60, 2, number FROM numbers(5000); +INSERT INTO xMM SELECT toDateTime('2020-10-01 00:00:00', 'Europe/Moscow') + number*60, 1, number FROM numbers(5000); +INSERT INTO xMM SELECT toDateTime('2020-10-15 00:00:00', 'Europe/Moscow') + number*60, 1, number FROM numbers(5000); SELECT '--------- tMM ----------------------------'; @@ -44,8 +44,8 @@ select uniqExact(_part), count() from tMM where toYYYYMMDD(d)=20200816; select uniqExact(_part), count() from tMM where toYYYYMMDD(d)=20201015; select uniqExact(_part), count() from tMM where toDate(d)='2020-10-15'; select uniqExact(_part), count() from tMM where d >= '2020-09-01 00:00:00' and d<'2020-10-15 00:00:00'; -select uniqExact(_part), count() from tMM where d >= '2020-01-16 00:00:00' and d < toDateTime('2021-08-17 00:00:00'); -select uniqExact(_part), count() from tMM where d >= '2020-09-16 00:00:00' and d < toDateTime('2020-10-01 00:00:00'); +select uniqExact(_part), count() from tMM where d >= '2020-01-16 00:00:00' and d < toDateTime('2021-08-17 00:00:00', 'Europe/Moscow'); +select uniqExact(_part), count() from tMM where d >= '2020-09-16 00:00:00' and d < toDateTime('2020-10-01 00:00:00', 'Europe/Moscow'); select uniqExact(_part), count() from tMM where d >= '2020-09-12 00:00:00' and d < '2020-10-16 00:00:00'; select uniqExact(_part), count() from tMM where toStartOfDay(d) >= '2020-09-12 00:00:00'; select uniqExact(_part), count() from tMM where toStartOfDay(d) = '2020-09-01 00:00:00'; diff --git a/tests/queries/0_stateless/01508_partition_pruning_long.reference b/tests/queries/0_stateless/01508_partition_pruning_long.reference index 334ecb63164..9cd208a336f 100644 --- a/tests/queries/0_stateless/01508_partition_pruning_long.reference +++ b/tests/queries/0_stateless/01508_partition_pruning_long.reference @@ -35,11 +35,11 @@ select uniqExact(_part), count() from tMM where d >= '2020-09-01 00:00:00' and d 3 15000 Selected 3/6 parts by partition key, 3 parts by primary key, 3/3 marks by primary key, 3 marks to read from 3 ranges -select uniqExact(_part), count() from tMM where d >= '2020-01-16 00:00:00' and d < toDateTime('2021-08-17 00:00:00'); +select uniqExact(_part), count() from tMM where d >= '2020-01-16 00:00:00' and d < toDateTime('2021-08-17 00:00:00', 'Europe/Moscow'); 6 30000 Selected 6/6 parts by partition key, 6 parts by primary key, 6/6 marks by primary key, 6 marks to read from 6 ranges -select uniqExact(_part), count() from tMM where d >= '2020-09-16 00:00:00' and d < toDateTime('2020-10-01 00:00:00'); +select uniqExact(_part), count() from tMM where d >= '2020-09-16 00:00:00' and d < toDateTime('2020-10-01 00:00:00', 'Europe/Moscow'); 0 0 Selected 0/6 parts by partition key, 0 parts by primary key, 0/0 marks by primary key, 0 marks to read from 0 ranges diff --git a/tests/queries/0_stateless/01508_partition_pruning_long.sh b/tests/queries/0_stateless/01508_partition_pruning_long.sh index 1b3c524ac77..745d08496a7 100755 --- a/tests/queries/0_stateless/01508_partition_pruning_long.sh +++ b/tests/queries/0_stateless/01508_partition_pruning_long.sh @@ -1,22 +1,15 @@ #!/usr/bin/env bash -#------------------------------------------------------------------------------------------- # Description of test result: -# Test the correctness of the partition -# pruning +# Test the correctness of the partition pruning # -# Script executes queries from a file 01508_partition_pruning_long.queries (1 line = 1 query) -# Queries are started with 'select' (but NOT with 'SELECT') are executed with log_level=debug -#------------------------------------------------------------------------------------------- +# Script executes queries from a file 01508_partition_pruning_long.queries (1 line = 1 query) +# Queries are started with 'select' (but NOT with 'SELECT') are executed with log_level=debug CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # shellcheck source=../shell_config.sh . "$CURDIR"/../shell_config.sh -#export CLICKHOUSE_CLIENT="clickhouse-client --send_logs_level=none" -#export CLICKHOUSE_CLIENT_SERVER_LOGS_LEVEL=none -#export CURDIR=. - queries="${CURDIR}/01508_partition_pruning_long.queries" while IFS= read -r sql diff --git a/tests/queries/0_stateless/01509_check_many_parallel_quorum_inserts_long.sh b/tests/queries/0_stateless/01509_check_many_parallel_quorum_inserts_long.sh index b71654e7e6c..187357b94e2 100755 --- a/tests/queries/0_stateless/01509_check_many_parallel_quorum_inserts_long.sh +++ b/tests/queries/0_stateless/01509_check_many_parallel_quorum_inserts_long.sh @@ -16,13 +16,20 @@ for i in $(seq 1 $NUM_REPLICAS); do done function thread { - $CLICKHOUSE_CLIENT --insert_quorum 5 --insert_quorum_parallel 1 --query "INSERT INTO r$1 SELECT $2" + while true + do + $CLICKHOUSE_CLIENT --insert_quorum 5 --insert_quorum_parallel 1 --query "INSERT INTO r$1 SELECT $2" && break + sleep 0.1 + done } for i in $(seq 1 $NUM_REPLICAS); do for j in {0..9}; do a=$((($i - 1) * 10 + $j)) - thread $i $a & + + # Note: making 100 connections simultaneously is a mini-DoS when server is build with sanitizers and CI environment is overloaded. + # That's why we repeat "socket timeout" errors. + thread $i $a 2>&1 | grep -v -P 'SOCKET_TIMEOUT|NETWORK_ERROR|^$' & done done diff --git a/tests/queries/0_stateless/01509_parallel_quorum_insert_no_replicas.reference b/tests/queries/0_stateless/01509_parallel_quorum_insert_no_replicas_long.reference similarity index 100% rename from tests/queries/0_stateless/01509_parallel_quorum_insert_no_replicas.reference rename to tests/queries/0_stateless/01509_parallel_quorum_insert_no_replicas_long.reference diff --git a/tests/queries/0_stateless/01509_parallel_quorum_insert_no_replicas.sql b/tests/queries/0_stateless/01509_parallel_quorum_insert_no_replicas_long.sql similarity index 91% rename from tests/queries/0_stateless/01509_parallel_quorum_insert_no_replicas.sql rename to tests/queries/0_stateless/01509_parallel_quorum_insert_no_replicas_long.sql index 16c4a4df936..ba2b774b718 100644 --- a/tests/queries/0_stateless/01509_parallel_quorum_insert_no_replicas.sql +++ b/tests/queries/0_stateless/01509_parallel_quorum_insert_no_replicas_long.sql @@ -4,13 +4,13 @@ DROP TABLE IF EXISTS r2 SYNC; CREATE TABLE r1 ( key UInt64, value String ) -ENGINE = ReplicatedMergeTree('/clickhouse/01509_parallel_quorum_insert_no_replicas', '1') +ENGINE = ReplicatedMergeTree('/clickhouse/{database}/01509_parallel_quorum_insert_no_replicas', '1') ORDER BY tuple(); CREATE TABLE r2 ( key UInt64, value String ) -ENGINE = ReplicatedMergeTree('/clickhouse/01509_parallel_quorum_insert_no_replicas', '2') +ENGINE = ReplicatedMergeTree('/clickhouse/{database}/01509_parallel_quorum_insert_no_replicas', '2') ORDER BY tuple(); SET insert_quorum_parallel=1; diff --git a/tests/queries/0_stateless/01512_create_replicate_merge_tree_one_arg.sql b/tests/queries/0_stateless/01512_create_replicate_merge_tree_one_arg.sql index f33c1534a44..2ee73865122 100644 --- a/tests/queries/0_stateless/01512_create_replicate_merge_tree_one_arg.sql +++ b/tests/queries/0_stateless/01512_create_replicate_merge_tree_one_arg.sql @@ -1,3 +1,3 @@ -CREATE TABLE mt (v UInt8) ENGINE = ReplicatedMergeTree('/clickhouse/tables/test_01497/mt') +CREATE TABLE mt (v UInt8) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/test_01497/mt') ORDER BY tuple() -- { serverError 36 } diff --git a/tests/queries/0_stateless/01513_count_without_select_sequence_consistency_zookeeper.reference b/tests/queries/0_stateless/01513_count_without_select_sequence_consistency_zookeeper_long.reference similarity index 100% rename from tests/queries/0_stateless/01513_count_without_select_sequence_consistency_zookeeper.reference rename to tests/queries/0_stateless/01513_count_without_select_sequence_consistency_zookeeper_long.reference diff --git a/tests/queries/0_stateless/01513_count_without_select_sequence_consistency_zookeeper.sql b/tests/queries/0_stateless/01513_count_without_select_sequence_consistency_zookeeper_long.sql similarity index 79% rename from tests/queries/0_stateless/01513_count_without_select_sequence_consistency_zookeeper.sql rename to tests/queries/0_stateless/01513_count_without_select_sequence_consistency_zookeeper_long.sql index 0eb9f20ad91..925dd042435 100644 --- a/tests/queries/0_stateless/01513_count_without_select_sequence_consistency_zookeeper.sql +++ b/tests/queries/0_stateless/01513_count_without_select_sequence_consistency_zookeeper_long.sql @@ -4,9 +4,9 @@ DROP TABLE IF EXISTS quorum1 SYNC; DROP TABLE IF EXISTS quorum2 SYNC; DROP TABLE IF EXISTS quorum3 SYNC; -CREATE TABLE quorum1(x UInt32, y Date) ENGINE ReplicatedMergeTree('/clickhouse/tables/test_01513/sequence_consistency', '1') ORDER BY x PARTITION BY y; -CREATE TABLE quorum2(x UInt32, y Date) ENGINE ReplicatedMergeTree('/clickhouse/tables/test_01513/sequence_consistency', '2') ORDER BY x PARTITION BY y; -CREATE TABLE quorum3(x UInt32, y Date) ENGINE ReplicatedMergeTree('/clickhouse/tables/test_01513/sequence_consistency', '3') ORDER BY x PARTITION BY y; +CREATE TABLE quorum1(x UInt32, y Date) ENGINE ReplicatedMergeTree('/clickhouse/tables/{database}/test_01513/sequence_consistency', '1') ORDER BY x PARTITION BY y; +CREATE TABLE quorum2(x UInt32, y Date) ENGINE ReplicatedMergeTree('/clickhouse/tables/{database}/test_01513/sequence_consistency', '2') ORDER BY x PARTITION BY y; +CREATE TABLE quorum3(x UInt32, y Date) ENGINE ReplicatedMergeTree('/clickhouse/tables/{database}/test_01513/sequence_consistency', '3') ORDER BY x PARTITION BY y; INSERT INTO quorum1 VALUES (1, '1990-11-15'); INSERT INTO quorum1 VALUES (2, '1990-11-15'); diff --git a/tests/queries/0_stateless/01518_nullable_aggregate_states2.reference b/tests/queries/0_stateless/01518_nullable_aggregate_states2.reference index 7e353902742..4d17e2d1de9 100644 --- a/tests/queries/0_stateless/01518_nullable_aggregate_states2.reference +++ b/tests/queries/0_stateless/01518_nullable_aggregate_states2.reference @@ -6,2010 +6,2010 @@ -3 1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N -4 1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N -5 1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N -0 102 0 99900 0 300 150 15150 0 300 150 15150 0.00000 300.00000 150 15150.00000 2020-01-01 2020-01-02 2020-01-01 00:00:00 2020-01-02 03:45:00 2020-01-01 00:00:00.000 2020-01-02 03:45:00.000 0 99900 49950 5044950 0 99900 49950 5044950 -32569 32366 4529.009900990099 457430 -127 124 -2.9504950495049505 -298 -1 102 1 9991 0.003 300.003 150.003 15150.3033 0.003 300.003 150.003 15150.30329 0.00300 300.00300 150.003 15150.30300 2020-01-01 2020-01-02 2020-01-01 00:00:01 2020-01-02 03:45:01 2020-01-01 00:00:01.000 2020-01-02 03:45:01.000 1 99901 49951 5045051 1 99901 49951 5045051 -32568 32367 4530.009900990099 457531 -126 125 -1.9504950495049505 -197 +0 102 0 99900 0 300 150 15150 0 300 150 15150 0 300 150 15150 2020-01-01 2020-01-02 2020-01-01 00:00:00 2020-01-02 03:45:00 2020-01-01 00:00:00.000 2020-01-02 03:45:00.000 0 99900 49950 5044950 0 99900 49950 5044950 -32569 32366 4529.009900990099 457430 -127 124 -2.9504950495049505 -298 +1 102 1 9991 0.003 300.003 150.003 15150.3033 0.003 300.003 150.003 15150.30329 0.003 300.003 150.003 15150.303 2020-01-01 2020-01-02 2020-01-01 00:00:01 2020-01-02 03:45:01 2020-01-01 00:00:01.000 2020-01-02 03:45:01.000 1 99901 49951 5045051 1 99901 49951 5045051 -32568 32367 4530.009900990099 457531 -126 125 -1.9504950495049505 -197 10 102 10 99910 0.03003 300.03003 150.03003 15153.03303 0.03003 300.03003 150.03002 15153.03296 0.03003 300.03003 150.03003 15153.03303 2020-01-01 2020-01-02 2020-01-01 00:00:10 2020-01-02 03:45:10 2020-01-01 00:00:10.000 2020-01-02 03:45:10.000 10 99910 49960 5045960 10 99910 49960 5045960 -32559 32376 4539.009900990099 458440 -128 127 -0.5544554455445545 -56 -100 101 100 99001 0.3003 297.3003 148.8003 14880.03003 0.3003 297.3003 148.80029 14880.02962 0.30030 297.30030 148.8003 14880.03000 2020-01-01 2020-01-02 2020-01-01 00:01:40 2020-01-02 03:30:01 2020-01-01 00:01:40.000 2020-01-02 03:30:01.000 100 99001 49550.5 4955050 100 99001 49550.5 4955050 -32469 32466 4986.02 498602 -127 124 -0.86 -86 -101 101 10091 99002 0.3033 297.3033 148.8033 14880.33033 0.3033 297.3033 148.8033 14880.33035 0.30330 297.30330 148.8033 14880.33000 2020-01-01 2020-01-02 2020-01-01 00:01:41 2020-01-02 03:30:02 2020-01-01 00:01:41.000 2020-01-02 03:30:02.000 101 99002 49551.5 4955150 101 99002 49551.5 4955150 -32468 32467 4987.02 498702 -126 125 0.14 14 -102 101 10092 99003 0.3063 297.3063 148.8063 14880.63063 0.3063 297.3063 148.8063 14880.6305 0.30630 297.30630 148.8063 14880.63000 2020-01-01 2020-01-02 2020-01-01 00:01:42 2020-01-02 03:30:03 2020-01-01 00:01:42.000 2020-01-02 03:30:03.000 102 99003 49552.5 4955250 102 99003 49552.5 4955250 -32467 32468 4988.02 498802 -125 126 1.14 114 -103 101 10093 99004 0.3093 297.3093 148.8093 14880.93093 0.3093 297.3093 148.8093 14880.93085 0.30930 297.30930 148.8093 14880.93000 2020-01-01 2020-01-02 2020-01-01 00:01:43 2020-01-02 03:30:04 2020-01-01 00:01:43.000 2020-01-02 03:30:04.000 103 99004 49553.5 4955350 103 99004 49553.5 4955350 -32466 32469 4989.02 498902 -124 127 2.14 214 -104 101 10094 99005 0.31231 297.31231 148.81231 14881.23123 0.31231 297.31232 148.81231 14881.23144 0.31231 297.31231 148.81231 14881.23100 2020-01-01 2020-01-02 2020-01-01 00:01:44 2020-01-02 03:30:05 2020-01-01 00:01:44.000 2020-01-02 03:30:05.000 104 99005 49554.5 4955450 104 99005 49554.5 4955450 -32465 32470 4990.02 499002 -128 127 0.58 58 -105 101 10095 99006 0.31531 297.31531 148.81531 14881.53153 0.31531 297.3153 148.81531 14881.53174 0.31531 297.31531 148.81531 14881.53100 2020-01-01 2020-01-02 2020-01-01 00:01:45 2020-01-02 03:30:06 2020-01-01 00:01:45.000 2020-01-02 03:30:06.000 105 99006 49555.5 4955550 105 99006 49555.5 4955550 -32464 32471 4991.02 499102 -128 123 -0.98 -98 -106 101 10096 99007 0.31831 297.31831 148.81831 14881.83183 0.31831 297.31833 148.81831 14881.83182 0.31831 297.31831 148.81831 14881.83100 2020-01-01 2020-01-02 2020-01-01 00:01:46 2020-01-02 03:30:07 2020-01-01 00:01:46.000 2020-01-02 03:30:07.000 106 99007 49556.5 4955650 106 99007 49556.5 4955650 -32463 32472 4992.02 499202 -127 124 0.02 2 -107 101 10097 99008 0.32132 297.32132 148.82132 14882.13213 0.32132 297.32132 148.82131 14882.13197 0.32132 297.32132 148.82132 14882.13200 2020-01-01 2020-01-02 2020-01-01 00:01:47 2020-01-02 03:30:08 2020-01-01 00:01:47.000 2020-01-02 03:30:08.000 107 99008 49557.5 4955750 107 99008 49557.5 4955750 -32462 32473 4993.02 499302 -126 125 1.02 102 -108 101 10098 99009 0.32432 297.32432 148.82432 14882.43243 0.32432 297.3243 148.82432 14882.43232 0.32432 297.32432 148.82432 14882.43200 2020-01-01 2020-01-02 2020-01-01 00:01:48 2020-01-02 03:30:09 2020-01-01 00:01:48.000 2020-01-02 03:30:09.000 108 99009 49558.5 4955850 108 99009 49558.5 4955850 -32461 32474 4994.02 499402 -125 126 2.02 202 -109 101 10099 99010 0.32732 297.32732 148.82732 14882.73273 0.32732 297.32733 148.82732 14882.7329 0.32732 297.32732 148.82732 14882.73200 2020-01-01 2020-01-02 2020-01-01 00:01:49 2020-01-02 03:30:10 2020-01-01 00:01:49.000 2020-01-02 03:30:10.000 109 99010 49559.5 4955950 109 99010 49559.5 4955950 -32460 32475 4995.02 499502 -124 127 3.02 302 +100 101 100 99001 0.3003 297.3003 148.8003 14880.03003 0.3003 297.3003 148.80029 14880.02962 0.3003 297.3003 148.8003 14880.03 2020-01-01 2020-01-02 2020-01-01 00:01:40 2020-01-02 03:30:01 2020-01-01 00:01:40.000 2020-01-02 03:30:01.000 100 99001 49550.5 4955050 100 99001 49550.5 4955050 -32469 32466 4986.02 498602 -127 124 -0.86 -86 +101 101 10091 99002 0.3033 297.3033 148.8033 14880.33033 0.3033 297.3033 148.8033 14880.33035 0.3033 297.3033 148.8033 14880.33 2020-01-01 2020-01-02 2020-01-01 00:01:41 2020-01-02 03:30:02 2020-01-01 00:01:41.000 2020-01-02 03:30:02.000 101 99002 49551.5 4955150 101 99002 49551.5 4955150 -32468 32467 4987.02 498702 -126 125 0.14 14 +102 101 10092 99003 0.3063 297.3063 148.8063 14880.63063 0.3063 297.3063 148.8063 14880.6305 0.3063 297.3063 148.8063 14880.63 2020-01-01 2020-01-02 2020-01-01 00:01:42 2020-01-02 03:30:03 2020-01-01 00:01:42.000 2020-01-02 03:30:03.000 102 99003 49552.5 4955250 102 99003 49552.5 4955250 -32467 32468 4988.02 498802 -125 126 1.14 114 +103 101 10093 99004 0.3093 297.3093 148.8093 14880.93093 0.3093 297.3093 148.8093 14880.93085 0.3093 297.3093 148.8093 14880.93 2020-01-01 2020-01-02 2020-01-01 00:01:43 2020-01-02 03:30:04 2020-01-01 00:01:43.000 2020-01-02 03:30:04.000 103 99004 49553.5 4955350 103 99004 49553.5 4955350 -32466 32469 4989.02 498902 -124 127 2.14 214 +104 101 10094 99005 0.31231 297.31231 148.81231 14881.23123 0.31231 297.31232 148.81231 14881.23144 0.31231 297.31231 148.81231 14881.231 2020-01-01 2020-01-02 2020-01-01 00:01:44 2020-01-02 03:30:05 2020-01-01 00:01:44.000 2020-01-02 03:30:05.000 104 99005 49554.5 4955450 104 99005 49554.5 4955450 -32465 32470 4990.02 499002 -128 127 0.58 58 +105 101 10095 99006 0.31531 297.31531 148.81531 14881.53153 0.31531 297.3153 148.81531 14881.53174 0.31531 297.31531 148.81531 14881.531 2020-01-01 2020-01-02 2020-01-01 00:01:45 2020-01-02 03:30:06 2020-01-01 00:01:45.000 2020-01-02 03:30:06.000 105 99006 49555.5 4955550 105 99006 49555.5 4955550 -32464 32471 4991.02 499102 -128 123 -0.98 -98 +106 101 10096 99007 0.31831 297.31831 148.81831 14881.83183 0.31831 297.31833 148.81831 14881.83182 0.31831 297.31831 148.81831 14881.831 2020-01-01 2020-01-02 2020-01-01 00:01:46 2020-01-02 03:30:07 2020-01-01 00:01:46.000 2020-01-02 03:30:07.000 106 99007 49556.5 4955650 106 99007 49556.5 4955650 -32463 32472 4992.02 499202 -127 124 0.02 2 +107 101 10097 99008 0.32132 297.32132 148.82132 14882.13213 0.32132 297.32132 148.82131 14882.13197 0.32132 297.32132 148.82132 14882.132 2020-01-01 2020-01-02 2020-01-01 00:01:47 2020-01-02 03:30:08 2020-01-01 00:01:47.000 2020-01-02 03:30:08.000 107 99008 49557.5 4955750 107 99008 49557.5 4955750 -32462 32473 4993.02 499302 -126 125 1.02 102 +108 101 10098 99009 0.32432 297.32432 148.82432 14882.43243 0.32432 297.3243 148.82432 14882.43232 0.32432 297.32432 148.82432 14882.432 2020-01-01 2020-01-02 2020-01-01 00:01:48 2020-01-02 03:30:09 2020-01-01 00:01:48.000 2020-01-02 03:30:09.000 108 99009 49558.5 4955850 108 99009 49558.5 4955850 -32461 32474 4994.02 499402 -125 126 2.02 202 +109 101 10099 99010 0.32732 297.32732 148.82732 14882.73273 0.32732 297.32733 148.82732 14882.7329 0.32732 297.32732 148.82732 14882.732 2020-01-01 2020-01-02 2020-01-01 00:01:49 2020-01-02 03:30:10 2020-01-01 00:01:49.000 2020-01-02 03:30:10.000 109 99010 49559.5 4955950 109 99010 49559.5 4955950 -32460 32475 4995.02 499502 -124 127 3.02 302 11 102 10001 99911 0.03303 300.03303 150.03303 15153.33633 0.03303 300.03302 150.03303 15153.33627 0.03303 300.03303 150.03303 15153.33603 2020-01-01 2020-01-02 2020-01-01 00:00:11 2020-01-02 03:45:11 2020-01-01 00:00:11.000 2020-01-02 03:45:11.000 11 99911 49961 5046061 11 99911 49961 5046061 -32558 32377 4540.009900990099 458541 -128 123 -2.089108910891089 -211 -110 101 10100 99011 0.33033 297.33033 148.83033 14883.03303 0.33033 297.33032 148.83033 14883.03321 0.33033 297.33033 148.83033 14883.03300 2020-01-01 2020-01-02 2020-01-01 00:01:50 2020-01-02 03:30:11 2020-01-01 00:01:50.000 2020-01-02 03:30:11.000 110 99011 49560.5 4956050 110 99011 49560.5 4956050 -32459 32476 4996.02 499602 -128 127 1.46 146 -111 101 10101 99012 0.33333 297.33333 148.83333 14883.33333 0.33333 297.33334 148.83333 14883.33329 0.33333 297.33333 148.83333000000002 14883.33300 2020-01-01 2020-01-02 2020-01-01 00:01:51 2020-01-02 03:30:12 2020-01-01 00:01:51.000 2020-01-02 03:30:12.000 111 99012 49561.5 4956150 111 99012 49561.5 4956150 -32458 32477 4997.02 499702 -128 123 -0.1 -10 -112 101 10102 99013 0.33633 297.33633 148.83633 14883.63363 0.33633 297.33633 148.83633 14883.63348 0.33633 297.33633 148.83633 14883.63300 2020-01-01 2020-01-02 2020-01-01 00:01:52 2020-01-02 03:30:13 2020-01-01 00:01:52.000 2020-01-02 03:30:13.000 112 99013 49562.5 4956250 112 99013 49562.5 4956250 -32457 32478 4998.02 499802 -127 124 0.9 90 -113 101 10103 99014 0.33933 297.33933 148.83933 14883.93393 0.33933 297.33932 148.83933 14883.9338 0.33933 297.33933 148.83933000000002 14883.93300 2020-01-01 2020-01-02 2020-01-01 00:01:53 2020-01-02 03:30:14 2020-01-01 00:01:53.000 2020-01-02 03:30:14.000 113 99014 49563.5 4956350 113 99014 49563.5 4956350 -32456 32479 4999.02 499902 -126 125 1.9 190 -114 101 10104 99015 0.34234 297.34234 148.84234 14884.23423 0.34234 297.34235 148.84234 14884.23437 0.34234 297.34234 148.84234 14884.23400 2020-01-01 2020-01-02 2020-01-01 00:01:54 2020-01-02 03:30:15 2020-01-01 00:01:54.000 2020-01-02 03:30:15.000 114 99015 49564.5 4956450 114 99015 49564.5 4956450 -32455 32480 5000.02 500002 -125 126 2.9 290 -115 101 10105 99016 0.34534 297.34534 148.84534 14884.53453 0.34534 297.34534 148.84534 14884.53468 0.34534 297.34534 148.84534 14884.53400 2020-01-01 2020-01-02 2020-01-01 00:01:55 2020-01-02 03:30:16 2020-01-01 00:01:55.000 2020-01-02 03:30:16.000 115 99016 49565.5 4956550 115 99016 49565.5 4956550 -32454 32481 5001.02 500102 -124 127 3.9 390 -116 101 10106 99017 0.34834 297.34834 148.84834 14884.83483 0.34834 297.34836 148.84834 14884.83476 0.34834 297.34834 148.84834 14884.83400 2020-01-01 2020-01-02 2020-01-01 00:01:56 2020-01-02 03:30:17 2020-01-01 00:01:56.000 2020-01-02 03:30:17.000 116 99017 49566.5 4956650 116 99017 49566.5 4956650 -32453 32482 5002.02 500202 -128 127 2.34 234 -117 101 10107 99018 0.35135 297.35135 148.85135 14885.13513 0.35135 297.35135 148.85134 14885.13495 0.35135 297.35135 148.85135 14885.13500 2020-01-01 2020-01-02 2020-01-01 00:01:57 2020-01-02 03:30:18 2020-01-01 00:01:57.000 2020-01-02 03:30:18.000 117 99018 49567.5 4956750 117 99018 49567.5 4956750 -32452 32483 5003.02 500302 -128 123 0.78 78 -118 101 10108 99019 0.35435 297.35435 148.85435 14885.43543 0.35435 297.35434 148.85435 14885.43526 0.35435 297.35435 148.85434999999998 14885.43500 2020-01-01 2020-01-02 2020-01-01 00:01:58 2020-01-02 03:30:19 2020-01-01 00:01:58.000 2020-01-02 03:30:19.000 118 99019 49568.5 4956850 118 99019 49568.5 4956850 -32451 32484 5004.02 500402 -127 124 1.78 178 -119 101 10109 99020 0.35735 297.35735 148.85735 14885.73573 0.35735 297.35736 148.85736 14885.736 0.35735 297.35735 148.85735 14885.73500 2020-01-01 2020-01-02 2020-01-01 00:01:59 2020-01-02 03:30:20 2020-01-01 00:01:59.000 2020-01-02 03:30:20.000 119 99020 49569.5 4956950 119 99020 49569.5 4956950 -32450 32485 5005.02 500502 -126 125 2.78 278 +110 101 10100 99011 0.33033 297.33033 148.83033 14883.03303 0.33033 297.33032 148.83033 14883.03321 0.33033 297.33033 148.83033 14883.033 2020-01-01 2020-01-02 2020-01-01 00:01:50 2020-01-02 03:30:11 2020-01-01 00:01:50.000 2020-01-02 03:30:11.000 110 99011 49560.5 4956050 110 99011 49560.5 4956050 -32459 32476 4996.02 499602 -128 127 1.46 146 +111 101 10101 99012 0.33333 297.33333 148.83333 14883.33333 0.33333 297.33334 148.83333 14883.33329 0.33333 297.33333 148.83333000000002 14883.333 2020-01-01 2020-01-02 2020-01-01 00:01:51 2020-01-02 03:30:12 2020-01-01 00:01:51.000 2020-01-02 03:30:12.000 111 99012 49561.5 4956150 111 99012 49561.5 4956150 -32458 32477 4997.02 499702 -128 123 -0.1 -10 +112 101 10102 99013 0.33633 297.33633 148.83633 14883.63363 0.33633 297.33633 148.83633 14883.63348 0.33633 297.33633 148.83633 14883.633 2020-01-01 2020-01-02 2020-01-01 00:01:52 2020-01-02 03:30:13 2020-01-01 00:01:52.000 2020-01-02 03:30:13.000 112 99013 49562.5 4956250 112 99013 49562.5 4956250 -32457 32478 4998.02 499802 -127 124 0.9 90 +113 101 10103 99014 0.33933 297.33933 148.83933 14883.93393 0.33933 297.33932 148.83933 14883.9338 0.33933 297.33933 148.83933000000002 14883.933 2020-01-01 2020-01-02 2020-01-01 00:01:53 2020-01-02 03:30:14 2020-01-01 00:01:53.000 2020-01-02 03:30:14.000 113 99014 49563.5 4956350 113 99014 49563.5 4956350 -32456 32479 4999.02 499902 -126 125 1.9 190 +114 101 10104 99015 0.34234 297.34234 148.84234 14884.23423 0.34234 297.34235 148.84234 14884.23437 0.34234 297.34234 148.84234 14884.234 2020-01-01 2020-01-02 2020-01-01 00:01:54 2020-01-02 03:30:15 2020-01-01 00:01:54.000 2020-01-02 03:30:15.000 114 99015 49564.5 4956450 114 99015 49564.5 4956450 -32455 32480 5000.02 500002 -125 126 2.9 290 +115 101 10105 99016 0.34534 297.34534 148.84534 14884.53453 0.34534 297.34534 148.84534 14884.53468 0.34534 297.34534 148.84534 14884.534 2020-01-01 2020-01-02 2020-01-01 00:01:55 2020-01-02 03:30:16 2020-01-01 00:01:55.000 2020-01-02 03:30:16.000 115 99016 49565.5 4956550 115 99016 49565.5 4956550 -32454 32481 5001.02 500102 -124 127 3.9 390 +116 101 10106 99017 0.34834 297.34834 148.84834 14884.83483 0.34834 297.34836 148.84834 14884.83476 0.34834 297.34834 148.84834 14884.834 2020-01-01 2020-01-02 2020-01-01 00:01:56 2020-01-02 03:30:17 2020-01-01 00:01:56.000 2020-01-02 03:30:17.000 116 99017 49566.5 4956650 116 99017 49566.5 4956650 -32453 32482 5002.02 500202 -128 127 2.34 234 +117 101 10107 99018 0.35135 297.35135 148.85135 14885.13513 0.35135 297.35135 148.85134 14885.13495 0.35135 297.35135 148.85135 14885.135 2020-01-01 2020-01-02 2020-01-01 00:01:57 2020-01-02 03:30:18 2020-01-01 00:01:57.000 2020-01-02 03:30:18.000 117 99018 49567.5 4956750 117 99018 49567.5 4956750 -32452 32483 5003.02 500302 -128 123 0.78 78 +118 101 10108 99019 0.35435 297.35435 148.85435 14885.43543 0.35435 297.35434 148.85435 14885.43526 0.35435 297.35435 148.85434999999998 14885.435 2020-01-01 2020-01-02 2020-01-01 00:01:58 2020-01-02 03:30:19 2020-01-01 00:01:58.000 2020-01-02 03:30:19.000 118 99019 49568.5 4956850 118 99019 49568.5 4956850 -32451 32484 5004.02 500402 -127 124 1.78 178 +119 101 10109 99020 0.35735 297.35735 148.85735 14885.73573 0.35735 297.35736 148.85736 14885.736 0.35735 297.35735 148.85735 14885.735 2020-01-01 2020-01-02 2020-01-01 00:01:59 2020-01-02 03:30:20 2020-01-01 00:01:59.000 2020-01-02 03:30:20.000 119 99020 49569.5 4956950 119 99020 49569.5 4956950 -32450 32485 5005.02 500502 -126 125 2.78 278 12 102 10002 99912 0.03603 300.03603 150.03603 15153.63963 0.03603 300.03604 150.03603 15153.6399 0.03603 300.03603 150.03603 15153.63903 2020-01-01 2020-01-02 2020-01-01 00:00:12 2020-01-02 03:45:12 2020-01-01 00:00:12.000 2020-01-02 03:45:12.000 12 99912 49962 5046162 12 99912 49962 5046162 -32557 32378 4541.009900990099 458642 -127 124 -1.0891089108910892 -110 -120 101 10110 99021 0.36036 297.36036 148.86036 14886.03603 0.36036 297.36035 148.86036 14886.03615 0.36036 297.36036 148.86036000000001 14886.03600 2020-01-01 2020-01-02 2020-01-01 00:02:00 2020-01-02 03:30:21 2020-01-01 00:02:00.000 2020-01-02 03:30:21.000 120 99021 49570.5 4957050 120 99021 49570.5 4957050 -32449 32486 5006.02 500602 -125 126 3.78 378 -121 101 10111 99022 0.36336 297.36336 148.86336 14886.33633 0.36336 297.36337 148.86336 14886.33627 0.36336 297.36336 148.86336 14886.33600 2020-01-01 2020-01-02 2020-01-01 00:02:01 2020-01-02 03:30:22 2020-01-01 00:02:01.000 2020-01-02 03:30:22.000 121 99022 49571.5 4957150 121 99022 49571.5 4957150 -32448 32487 5007.02 500702 -124 127 4.78 478 -122 101 10112 99023 0.36636 297.36636 148.86636 14886.63663 0.36636 297.36636 148.86636 14886.63642 0.36636 297.36636 148.86636000000001 14886.63600 2020-01-01 2020-01-02 2020-01-01 00:02:02 2020-01-02 03:30:23 2020-01-01 00:02:02.000 2020-01-02 03:30:23.000 122 99023 49572.5 4957250 122 99023 49572.5 4957250 -32447 32488 5008.02 500802 -128 127 3.22 322 -123 101 10113 99024 0.36936 297.36936 148.86936 14886.93693 0.36936 297.36935 148.86936 14886.93673 0.36936 297.36936 148.86936 14886.93600 2020-01-01 2020-01-02 2020-01-01 00:02:03 2020-01-02 03:30:24 2020-01-01 00:02:03.000 2020-01-02 03:30:24.000 123 99024 49573.5 4957350 123 99024 49573.5 4957350 -32446 32489 5009.02 500902 -128 127 1.66 166 -124 101 10114 99025 0.37237 297.37237 148.87237 14887.23723 0.37237 297.37238 148.87237 14887.23746 0.37237 297.37237 148.87237 14887.23700 2020-01-01 2020-01-02 2020-01-01 00:02:04 2020-01-02 03:30:25 2020-01-01 00:02:04.000 2020-01-02 03:30:25.000 124 99025 49574.5 4957450 124 99025 49574.5 4957450 -32445 32490 5010.02 501002 -128 124 0.1 10 -125 101 10115 99026 0.37537 297.37537 148.87537 14887.53753 0.37537 297.37537 148.87537 14887.53762 0.37537 297.37537 148.87537 14887.53700 2020-01-01 2020-01-02 2020-01-01 00:02:05 2020-01-02 03:30:26 2020-01-01 00:02:05.000 2020-01-02 03:30:26.000 125 99026 49575.5 4957550 125 99026 49575.5 4957550 -32444 32491 5011.02 501102 -127 125 1.1 110 -126 101 10116 99027 0.37837 297.37837 148.87837 14887.83783 0.37837 297.3784 148.87837 14887.83774 0.37837 297.37837 148.87837 14887.83700 2020-01-01 2020-01-02 2020-01-01 00:02:06 2020-01-02 03:30:27 2020-01-01 00:02:06.000 2020-01-02 03:30:27.000 126 99027 49576.5 4957650 126 99027 49576.5 4957650 -32443 32492 5012.02 501202 -126 126 2.1 210 -127 101 10117 99028 0.38138 297.38138 148.88138 14888.13813 0.38138 297.38138 148.88137 14888.13789 0.38138 297.38138 148.88138 14888.13800 2020-01-01 2020-01-02 2020-01-01 00:02:07 2020-01-02 03:30:28 2020-01-01 00:02:07.000 2020-01-02 03:30:28.000 127 99028 49577.5 4957750 127 99028 49577.5 4957750 -32442 32493 5013.02 501302 -125 127 3.1 310 -128 101 10118 99029 0.38438 297.38438 148.88438 14888.43843 0.38438 297.3844 148.88438 14888.43862 0.38438 297.38438 148.88438 14888.43800 2020-01-01 2020-01-02 2020-01-01 00:02:08 2020-01-02 03:30:29 2020-01-01 00:02:08.000 2020-01-02 03:30:29.000 128 99029 49578.5 4957850 128 99029 49578.5 4957850 -32441 32494 5014.02 501402 -128 127 1.54 154 -129 101 10119 99030 0.38738 297.38738 148.88738 14888.73873 0.38738 297.3874 148.88738 14888.73894 0.38738 297.38738 148.88738 14888.73800 2020-01-01 2020-01-02 2020-01-01 00:02:09 2020-01-02 03:30:30 2020-01-01 00:02:09.000 2020-01-02 03:30:30.000 129 99030 49579.5 4957950 129 99030 49579.5 4957950 -32440 32495 5015.02 501502 -128 127 -0.02 -2 +120 101 10110 99021 0.36036 297.36036 148.86036 14886.03603 0.36036 297.36035 148.86036 14886.03615 0.36036 297.36036 148.86036000000001 14886.036 2020-01-01 2020-01-02 2020-01-01 00:02:00 2020-01-02 03:30:21 2020-01-01 00:02:00.000 2020-01-02 03:30:21.000 120 99021 49570.5 4957050 120 99021 49570.5 4957050 -32449 32486 5006.02 500602 -125 126 3.78 378 +121 101 10111 99022 0.36336 297.36336 148.86336 14886.33633 0.36336 297.36337 148.86336 14886.33627 0.36336 297.36336 148.86336 14886.336 2020-01-01 2020-01-02 2020-01-01 00:02:01 2020-01-02 03:30:22 2020-01-01 00:02:01.000 2020-01-02 03:30:22.000 121 99022 49571.5 4957150 121 99022 49571.5 4957150 -32448 32487 5007.02 500702 -124 127 4.78 478 +122 101 10112 99023 0.36636 297.36636 148.86636 14886.63663 0.36636 297.36636 148.86636 14886.63642 0.36636 297.36636 148.86636000000001 14886.636 2020-01-01 2020-01-02 2020-01-01 00:02:02 2020-01-02 03:30:23 2020-01-01 00:02:02.000 2020-01-02 03:30:23.000 122 99023 49572.5 4957250 122 99023 49572.5 4957250 -32447 32488 5008.02 500802 -128 127 3.22 322 +123 101 10113 99024 0.36936 297.36936 148.86936 14886.93693 0.36936 297.36935 148.86936 14886.93673 0.36936 297.36936 148.86936 14886.936 2020-01-01 2020-01-02 2020-01-01 00:02:03 2020-01-02 03:30:24 2020-01-01 00:02:03.000 2020-01-02 03:30:24.000 123 99024 49573.5 4957350 123 99024 49573.5 4957350 -32446 32489 5009.02 500902 -128 127 1.66 166 +124 101 10114 99025 0.37237 297.37237 148.87237 14887.23723 0.37237 297.37238 148.87237 14887.23746 0.37237 297.37237 148.87237 14887.237 2020-01-01 2020-01-02 2020-01-01 00:02:04 2020-01-02 03:30:25 2020-01-01 00:02:04.000 2020-01-02 03:30:25.000 124 99025 49574.5 4957450 124 99025 49574.5 4957450 -32445 32490 5010.02 501002 -128 124 0.1 10 +125 101 10115 99026 0.37537 297.37537 148.87537 14887.53753 0.37537 297.37537 148.87537 14887.53762 0.37537 297.37537 148.87537 14887.537 2020-01-01 2020-01-02 2020-01-01 00:02:05 2020-01-02 03:30:26 2020-01-01 00:02:05.000 2020-01-02 03:30:26.000 125 99026 49575.5 4957550 125 99026 49575.5 4957550 -32444 32491 5011.02 501102 -127 125 1.1 110 +126 101 10116 99027 0.37837 297.37837 148.87837 14887.83783 0.37837 297.3784 148.87837 14887.83774 0.37837 297.37837 148.87837 14887.837 2020-01-01 2020-01-02 2020-01-01 00:02:06 2020-01-02 03:30:27 2020-01-01 00:02:06.000 2020-01-02 03:30:27.000 126 99027 49576.5 4957650 126 99027 49576.5 4957650 -32443 32492 5012.02 501202 -126 126 2.1 210 +127 101 10117 99028 0.38138 297.38138 148.88138 14888.13813 0.38138 297.38138 148.88137 14888.13789 0.38138 297.38138 148.88138 14888.138 2020-01-01 2020-01-02 2020-01-01 00:02:07 2020-01-02 03:30:28 2020-01-01 00:02:07.000 2020-01-02 03:30:28.000 127 99028 49577.5 4957750 127 99028 49577.5 4957750 -32442 32493 5013.02 501302 -125 127 3.1 310 +128 101 10118 99029 0.38438 297.38438 148.88438 14888.43843 0.38438 297.3844 148.88438 14888.43862 0.38438 297.38438 148.88438 14888.438 2020-01-01 2020-01-02 2020-01-01 00:02:08 2020-01-02 03:30:29 2020-01-01 00:02:08.000 2020-01-02 03:30:29.000 128 99029 49578.5 4957850 128 99029 49578.5 4957850 -32441 32494 5014.02 501402 -128 127 1.54 154 +129 101 10119 99030 0.38738 297.38738 148.88738 14888.73873 0.38738 297.3874 148.88738 14888.73894 0.38738 297.38738 148.88738 14888.738 2020-01-01 2020-01-02 2020-01-01 00:02:09 2020-01-02 03:30:30 2020-01-01 00:02:09.000 2020-01-02 03:30:30.000 129 99030 49579.5 4957950 129 99030 49579.5 4957950 -32440 32495 5015.02 501502 -128 127 -0.02 -2 13 102 10003 99913 0.03903 300.03903 150.03903 15153.94294 0.03903 300.03903 150.03903 15153.94255 0.03903 300.03903 150.03903 15153.94203 2020-01-01 2020-01-02 2020-01-01 00:00:13 2020-01-02 03:45:13 2020-01-01 00:00:13.000 2020-01-02 03:45:13.000 13 99913 49963 5046263 13 99913 49963 5046263 -32556 32379 4542.009900990099 458743 -126 125 -0.0891089108910891 -9 -130 101 10120 99031 0.39039 297.39039 148.89039 14889.03903 0.39039 297.39038 148.89039 14889.03909 0.39039 297.39039 148.89039 14889.03900 2020-01-01 2020-01-02 2020-01-01 00:02:10 2020-01-02 03:30:31 2020-01-01 00:02:10.000 2020-01-02 03:30:31.000 130 99031 49580.5 4958050 130 99031 49580.5 4958050 -32439 32496 5016.02 501602 -128 123 -1.58 -158 -131 101 10121 99032 0.39339 297.39339 148.89339 14889.33933 0.39339 297.3934 148.89339 14889.33921 0.39339 297.39339 148.89339 14889.33900 2020-01-01 2020-01-02 2020-01-01 00:02:11 2020-01-02 03:30:32 2020-01-01 00:02:11.000 2020-01-02 03:30:32.000 131 99032 49581.5 4958150 131 99032 49581.5 4958150 -32438 32497 5017.02 501702 -127 124 -0.58 -58 -132 101 10122 99033 0.39639 297.39639 148.89639 14889.63963 0.39639 297.3964 148.89639 14889.63936 0.39639 297.39639 148.89639 14889.63900 2020-01-01 2020-01-02 2020-01-01 00:02:12 2020-01-02 03:30:33 2020-01-01 00:02:12.000 2020-01-02 03:30:33.000 132 99033 49582.5 4958250 132 99033 49582.5 4958250 -32437 32498 5018.02 501802 -126 125 0.42 42 -133 101 10123 99034 0.39939 297.39939 148.89939 14889.93993 0.39939 297.3994 148.8994 14889.94009 0.39939 297.39939 148.89939 14889.93900 2020-01-01 2020-01-02 2020-01-01 00:02:13 2020-01-02 03:30:34 2020-01-01 00:02:13.000 2020-01-02 03:30:34.000 133 99034 49583.5 4958350 133 99034 49583.5 4958350 -32436 32499 5019.02 501902 -125 126 1.42 142 -134 101 10124 99035 0.4024 297.4024 148.9024 14890.24024 0.4024 297.4024 148.9024 14890.24041 0.40240 297.40240 148.9024 14890.24000 2020-01-01 2020-01-02 2020-01-01 00:02:14 2020-01-02 03:30:35 2020-01-01 00:02:14.000 2020-01-02 03:30:35.000 134 99035 49584.5 4958450 134 99035 49584.5 4958450 -32435 32500 5020.02 502002 -124 127 2.42 242 -135 101 10125 99036 0.4054 297.4054 148.9054 14890.54054 0.4054 297.4054 148.9054 14890.54059 0.40540 297.40540 148.90540000000001 14890.54000 2020-01-01 2020-01-02 2020-01-01 00:02:15 2020-01-02 03:30:36 2020-01-01 00:02:15.000 2020-01-02 03:30:36.000 135 99036 49585.5 4958550 135 99036 49585.5 4958550 -32434 32501 5021.02 502102 -128 127 0.86 86 -136 101 10126 99037 0.4084 297.4084 148.9084 14890.84084 0.4084 297.40842 148.9084 14890.84068 0.40840 297.40840 148.9084 14890.84000 2020-01-01 2020-01-02 2020-01-01 00:02:16 2020-01-02 03:30:37 2020-01-01 00:02:16.000 2020-01-02 03:30:37.000 136 99037 49586.5 4958650 136 99037 49586.5 4958650 -32433 32502 5022.02 502202 -128 123 -0.7 -70 -137 101 10127 99038 0.41141 297.41141 148.91141 14891.14114 0.41141 297.4114 148.9114 14891.14099 0.41141 297.41141 148.91141 14891.14100 2020-01-01 2020-01-02 2020-01-01 00:02:17 2020-01-02 03:30:38 2020-01-01 00:02:17.000 2020-01-02 03:30:38.000 137 99038 49587.5 4958750 137 99038 49587.5 4958750 -32432 32503 5023.02 502302 -127 124 0.3 30 -138 101 10128 99039 0.41441 297.41441 148.91441 14891.44144 0.41441 297.41443 148.91441 14891.44157 0.41441 297.41441 148.91441 14891.44100 2020-01-01 2020-01-02 2020-01-01 00:02:18 2020-01-02 03:30:39 2020-01-01 00:02:18.000 2020-01-02 03:30:39.000 138 99039 49588.5 4958850 138 99039 49588.5 4958850 -32431 32504 5024.02 502402 -126 125 1.3 130 -139 101 10129 99040 0.41741 297.41741 148.91741 14891.74174 0.41741 297.41742 148.91741 14891.74188 0.41741 297.41741 148.91741 14891.74100 2020-01-01 2020-01-02 2020-01-01 00:02:19 2020-01-02 03:30:40 2020-01-01 00:02:19.000 2020-01-02 03:30:40.000 139 99040 49589.5 4958950 139 99040 49589.5 4958950 -32430 32505 5025.02 502502 -125 126 2.3 230 +130 101 10120 99031 0.39039 297.39039 148.89039 14889.03903 0.39039 297.39038 148.89039 14889.03909 0.39039 297.39039 148.89039 14889.039 2020-01-01 2020-01-02 2020-01-01 00:02:10 2020-01-02 03:30:31 2020-01-01 00:02:10.000 2020-01-02 03:30:31.000 130 99031 49580.5 4958050 130 99031 49580.5 4958050 -32439 32496 5016.02 501602 -128 123 -1.58 -158 +131 101 10121 99032 0.39339 297.39339 148.89339 14889.33933 0.39339 297.3934 148.89339 14889.33921 0.39339 297.39339 148.89339 14889.339 2020-01-01 2020-01-02 2020-01-01 00:02:11 2020-01-02 03:30:32 2020-01-01 00:02:11.000 2020-01-02 03:30:32.000 131 99032 49581.5 4958150 131 99032 49581.5 4958150 -32438 32497 5017.02 501702 -127 124 -0.58 -58 +132 101 10122 99033 0.39639 297.39639 148.89639 14889.63963 0.39639 297.3964 148.89639 14889.63936 0.39639 297.39639 148.89639 14889.639 2020-01-01 2020-01-02 2020-01-01 00:02:12 2020-01-02 03:30:33 2020-01-01 00:02:12.000 2020-01-02 03:30:33.000 132 99033 49582.5 4958250 132 99033 49582.5 4958250 -32437 32498 5018.02 501802 -126 125 0.42 42 +133 101 10123 99034 0.39939 297.39939 148.89939 14889.93993 0.39939 297.3994 148.8994 14889.94009 0.39939 297.39939 148.89939 14889.939 2020-01-01 2020-01-02 2020-01-01 00:02:13 2020-01-02 03:30:34 2020-01-01 00:02:13.000 2020-01-02 03:30:34.000 133 99034 49583.5 4958350 133 99034 49583.5 4958350 -32436 32499 5019.02 501902 -125 126 1.42 142 +134 101 10124 99035 0.4024 297.4024 148.9024 14890.24024 0.4024 297.4024 148.9024 14890.24041 0.4024 297.4024 148.9024 14890.24 2020-01-01 2020-01-02 2020-01-01 00:02:14 2020-01-02 03:30:35 2020-01-01 00:02:14.000 2020-01-02 03:30:35.000 134 99035 49584.5 4958450 134 99035 49584.5 4958450 -32435 32500 5020.02 502002 -124 127 2.42 242 +135 101 10125 99036 0.4054 297.4054 148.9054 14890.54054 0.4054 297.4054 148.9054 14890.54059 0.4054 297.4054 148.90540000000001 14890.54 2020-01-01 2020-01-02 2020-01-01 00:02:15 2020-01-02 03:30:36 2020-01-01 00:02:15.000 2020-01-02 03:30:36.000 135 99036 49585.5 4958550 135 99036 49585.5 4958550 -32434 32501 5021.02 502102 -128 127 0.86 86 +136 101 10126 99037 0.4084 297.4084 148.9084 14890.84084 0.4084 297.40842 148.9084 14890.84068 0.4084 297.4084 148.9084 14890.84 2020-01-01 2020-01-02 2020-01-01 00:02:16 2020-01-02 03:30:37 2020-01-01 00:02:16.000 2020-01-02 03:30:37.000 136 99037 49586.5 4958650 136 99037 49586.5 4958650 -32433 32502 5022.02 502202 -128 123 -0.7 -70 +137 101 10127 99038 0.41141 297.41141 148.91141 14891.14114 0.41141 297.4114 148.9114 14891.14099 0.41141 297.41141 148.91141 14891.141 2020-01-01 2020-01-02 2020-01-01 00:02:17 2020-01-02 03:30:38 2020-01-01 00:02:17.000 2020-01-02 03:30:38.000 137 99038 49587.5 4958750 137 99038 49587.5 4958750 -32432 32503 5023.02 502302 -127 124 0.3 30 +138 101 10128 99039 0.41441 297.41441 148.91441 14891.44144 0.41441 297.41443 148.91441 14891.44157 0.41441 297.41441 148.91441 14891.441 2020-01-01 2020-01-02 2020-01-01 00:02:18 2020-01-02 03:30:39 2020-01-01 00:02:18.000 2020-01-02 03:30:39.000 138 99039 49588.5 4958850 138 99039 49588.5 4958850 -32431 32504 5024.02 502402 -126 125 1.3 130 +139 101 10129 99040 0.41741 297.41741 148.91741 14891.74174 0.41741 297.41742 148.91741 14891.74188 0.41741 297.41741 148.91741 14891.741 2020-01-01 2020-01-02 2020-01-01 00:02:19 2020-01-02 03:30:40 2020-01-01 00:02:19.000 2020-01-02 03:30:40.000 139 99040 49589.5 4958950 139 99040 49589.5 4958950 -32430 32505 5025.02 502502 -125 126 2.3 230 14 102 10004 99914 0.04204 300.04204 150.04204 15154.24624 0.04204 300.04205 150.04204 15154.2463 0.04204 300.04204 150.04204 15154.24604 2020-01-01 2020-01-02 2020-01-01 00:00:14 2020-01-02 03:45:14 2020-01-01 00:00:14.000 2020-01-02 03:45:14.000 14 99914 49964 5046364 14 99914 49964 5046364 -32555 32380 4543.009900990099 458844 -125 126 0.9108910891089109 92 -140 101 10130 99041 0.42042 297.42042 148.92042 14892.04204 0.42042 297.4204 148.92042 14892.04206 0.42042 297.42042 148.92042 14892.04200 2020-01-01 2020-01-02 2020-01-01 00:02:20 2020-01-02 03:30:41 2020-01-01 00:02:20.000 2020-01-02 03:30:41.000 140 99041 49590.5 4959050 140 99041 49590.5 4959050 -32429 32506 5026.02 502602 -124 127 3.3 330 -141 101 10131 99042 0.42342 297.42342 148.92342 14892.34234 0.42342 297.42343 148.92342 14892.34215 0.42342 297.42342 148.92342 14892.34200 2020-01-01 2020-01-02 2020-01-01 00:02:21 2020-01-02 03:30:42 2020-01-01 00:02:21.000 2020-01-02 03:30:42.000 141 99042 49591.5 4959150 141 99042 49591.5 4959150 -32428 32507 5027.02 502702 -128 127 1.74 174 -142 101 10132 99043 0.42642 297.42642 148.92642 14892.64264 0.42642 297.42642 148.92642 14892.64246 0.42642 297.42642 148.92642 14892.64200 2020-01-01 2020-01-02 2020-01-01 00:02:22 2020-01-02 03:30:43 2020-01-01 00:02:22.000 2020-01-02 03:30:43.000 142 99043 49592.5 4959250 142 99043 49592.5 4959250 -32427 32508 5028.02 502802 -128 123 0.18 18 -143 101 10133 99044 0.42942 297.42942 148.92942 14892.94294 0.42942 297.42944 148.92943 14892.94304 0.42942 297.42942 148.92942 14892.94200 2020-01-01 2020-01-02 2020-01-01 00:02:23 2020-01-02 03:30:44 2020-01-01 00:02:23.000 2020-01-02 03:30:44.000 143 99044 49593.5 4959350 143 99044 49593.5 4959350 -32426 32509 5029.02 502902 -127 124 1.18 118 -144 101 10134 99045 0.43243 297.43243 148.93243 14893.24324 0.43243 297.43243 148.93243 14893.24338 0.43243 297.43243 148.93243 14893.24300 2020-01-01 2020-01-02 2020-01-01 00:02:24 2020-01-02 03:30:45 2020-01-01 00:02:24.000 2020-01-02 03:30:45.000 144 99045 49594.5 4959450 144 99045 49594.5 4959450 -32425 32510 5030.02 503002 -126 125 2.18 218 -145 101 10135 99046 0.43543 297.43543 148.93543 14893.54354 0.43543 297.43542 148.93543 14893.54354 0.43543 297.43543 148.93543 14893.54300 2020-01-01 2020-01-02 2020-01-01 00:02:25 2020-01-02 03:30:46 2020-01-01 00:02:25.000 2020-01-02 03:30:46.000 145 99046 49595.5 4959550 145 99046 49595.5 4959550 -32424 32511 5031.02 503102 -125 126 3.18 318 -146 101 10136 99047 0.43843 297.43843 148.93843 14893.84384 0.43843 297.43845 148.93844 14893.84427 0.43843 297.43843 148.93843 14893.84300 2020-01-01 2020-01-02 2020-01-01 00:02:26 2020-01-02 03:30:47 2020-01-01 00:02:26.000 2020-01-02 03:30:47.000 146 99047 49596.5 4959650 146 99047 49596.5 4959650 -32423 32512 5032.02 503202 -124 127 4.18 418 -147 101 10137 99048 0.44144 297.44144 148.94144 14894.14414 0.44144 297.44144 148.94143 14894.14392 0.44144 297.44144 148.94144 14894.14400 2020-01-01 2020-01-02 2020-01-01 00:02:27 2020-01-02 03:30:48 2020-01-01 00:02:27.000 2020-01-02 03:30:48.000 147 99048 49597.5 4959750 147 99048 49597.5 4959750 -32422 32513 5033.02 503302 -128 127 2.62 262 -148 101 10138 99049 0.44444 297.44444 148.94444 14894.44444 0.44444 297.44446 148.94444 14894.4445 0.44444 297.44444 148.94444 14894.44400 2020-01-01 2020-01-02 2020-01-01 00:02:28 2020-01-02 03:30:49 2020-01-01 00:02:28.000 2020-01-02 03:30:49.000 148 99049 49598.5 4959850 148 99049 49598.5 4959850 -32421 32514 5034.02 503402 -128 127 1.06 106 -149 101 10139 99050 0.44744 297.44744 148.94744 14894.74474 0.44744 297.44745 148.94744 14894.74485 0.44744 297.44744 148.94744 14894.74400 2020-01-01 2020-01-02 2020-01-01 00:02:29 2020-01-02 03:30:50 2020-01-01 00:02:29.000 2020-01-02 03:30:50.000 149 99050 49599.5 4959950 149 99050 49599.5 4959950 -32420 32515 5035.02 503502 -128 124 -0.5 -50 +140 101 10130 99041 0.42042 297.42042 148.92042 14892.04204 0.42042 297.4204 148.92042 14892.04206 0.42042 297.42042 148.92042 14892.042 2020-01-01 2020-01-02 2020-01-01 00:02:20 2020-01-02 03:30:41 2020-01-01 00:02:20.000 2020-01-02 03:30:41.000 140 99041 49590.5 4959050 140 99041 49590.5 4959050 -32429 32506 5026.02 502602 -124 127 3.3 330 +141 101 10131 99042 0.42342 297.42342 148.92342 14892.34234 0.42342 297.42343 148.92342 14892.34215 0.42342 297.42342 148.92342 14892.342 2020-01-01 2020-01-02 2020-01-01 00:02:21 2020-01-02 03:30:42 2020-01-01 00:02:21.000 2020-01-02 03:30:42.000 141 99042 49591.5 4959150 141 99042 49591.5 4959150 -32428 32507 5027.02 502702 -128 127 1.74 174 +142 101 10132 99043 0.42642 297.42642 148.92642 14892.64264 0.42642 297.42642 148.92642 14892.64246 0.42642 297.42642 148.92642 14892.642 2020-01-01 2020-01-02 2020-01-01 00:02:22 2020-01-02 03:30:43 2020-01-01 00:02:22.000 2020-01-02 03:30:43.000 142 99043 49592.5 4959250 142 99043 49592.5 4959250 -32427 32508 5028.02 502802 -128 123 0.18 18 +143 101 10133 99044 0.42942 297.42942 148.92942 14892.94294 0.42942 297.42944 148.92943 14892.94304 0.42942 297.42942 148.92942 14892.942 2020-01-01 2020-01-02 2020-01-01 00:02:23 2020-01-02 03:30:44 2020-01-01 00:02:23.000 2020-01-02 03:30:44.000 143 99044 49593.5 4959350 143 99044 49593.5 4959350 -32426 32509 5029.02 502902 -127 124 1.18 118 +144 101 10134 99045 0.43243 297.43243 148.93243 14893.24324 0.43243 297.43243 148.93243 14893.24338 0.43243 297.43243 148.93243 14893.243 2020-01-01 2020-01-02 2020-01-01 00:02:24 2020-01-02 03:30:45 2020-01-01 00:02:24.000 2020-01-02 03:30:45.000 144 99045 49594.5 4959450 144 99045 49594.5 4959450 -32425 32510 5030.02 503002 -126 125 2.18 218 +145 101 10135 99046 0.43543 297.43543 148.93543 14893.54354 0.43543 297.43542 148.93543 14893.54354 0.43543 297.43543 148.93543 14893.543 2020-01-01 2020-01-02 2020-01-01 00:02:25 2020-01-02 03:30:46 2020-01-01 00:02:25.000 2020-01-02 03:30:46.000 145 99046 49595.5 4959550 145 99046 49595.5 4959550 -32424 32511 5031.02 503102 -125 126 3.18 318 +146 101 10136 99047 0.43843 297.43843 148.93843 14893.84384 0.43843 297.43845 148.93844 14893.84427 0.43843 297.43843 148.93843 14893.843 2020-01-01 2020-01-02 2020-01-01 00:02:26 2020-01-02 03:30:47 2020-01-01 00:02:26.000 2020-01-02 03:30:47.000 146 99047 49596.5 4959650 146 99047 49596.5 4959650 -32423 32512 5032.02 503202 -124 127 4.18 418 +147 101 10137 99048 0.44144 297.44144 148.94144 14894.14414 0.44144 297.44144 148.94143 14894.14392 0.44144 297.44144 148.94144 14894.144 2020-01-01 2020-01-02 2020-01-01 00:02:27 2020-01-02 03:30:48 2020-01-01 00:02:27.000 2020-01-02 03:30:48.000 147 99048 49597.5 4959750 147 99048 49597.5 4959750 -32422 32513 5033.02 503302 -128 127 2.62 262 +148 101 10138 99049 0.44444 297.44444 148.94444 14894.44444 0.44444 297.44446 148.94444 14894.4445 0.44444 297.44444 148.94444 14894.444 2020-01-01 2020-01-02 2020-01-01 00:02:28 2020-01-02 03:30:49 2020-01-01 00:02:28.000 2020-01-02 03:30:49.000 148 99049 49598.5 4959850 148 99049 49598.5 4959850 -32421 32514 5034.02 503402 -128 127 1.06 106 +149 101 10139 99050 0.44744 297.44744 148.94744 14894.74474 0.44744 297.44745 148.94744 14894.74485 0.44744 297.44744 148.94744 14894.744 2020-01-01 2020-01-02 2020-01-01 00:02:29 2020-01-02 03:30:50 2020-01-01 00:02:29.000 2020-01-02 03:30:50.000 149 99050 49599.5 4959950 149 99050 49599.5 4959950 -32420 32515 5035.02 503502 -128 124 -0.5 -50 15 102 10005 99915 0.04504 300.04504 150.04504 15154.54954 0.04504 300.04504 150.04504 15154.54945 0.04504 300.04504 150.04504 15154.54904 2020-01-01 2020-01-02 2020-01-01 00:00:15 2020-01-02 03:45:15 2020-01-01 00:00:15.000 2020-01-02 03:45:15.000 15 99915 49965 5046465 15 99915 49965 5046465 -32554 32381 4544.009900990099 458945 -124 127 1.9108910891089108 193 -150 101 10140 99051 0.45045 297.45045 148.95045 14895.04504 0.45045 297.45044 148.95045 14895.04501 0.45045 297.45045 148.95045 14895.04500 2020-01-01 2020-01-02 2020-01-01 00:02:30 2020-01-02 03:30:51 2020-01-01 00:02:30.000 2020-01-02 03:30:51.000 150 99051 49600.5 4960050 150 99051 49600.5 4960050 -32419 32516 5036.02 503602 -127 125 0.5 50 -151 101 10141 99052 0.45345 297.45345 148.95345 14895.34534 0.45345 297.45346 148.95345 14895.34574 0.45345 297.45345 148.95345 14895.34500 2020-01-01 2020-01-02 2020-01-01 00:02:31 2020-01-02 03:30:52 2020-01-01 00:02:31.000 2020-01-02 03:30:52.000 151 99052 49601.5 4960150 151 99052 49601.5 4960150 -32418 32517 5037.02 503702 -126 126 1.5 150 -152 101 10142 99053 0.45645 297.45645 148.95645 14895.64564 0.45645 297.45645 148.95645 14895.6454 0.45645 297.45645 148.95645000000002 14895.64500 2020-01-01 2020-01-02 2020-01-01 00:02:32 2020-01-02 03:30:53 2020-01-01 00:02:32.000 2020-01-02 03:30:53.000 152 99053 49602.5 4960250 152 99053 49602.5 4960250 -32417 32518 5038.02 503802 -125 127 2.5 250 -153 101 10143 99054 0.45945 297.45945 148.95945 14895.94594 0.45945 297.45947 148.95946 14895.94601 0.45945 297.45945 148.95945 14895.94500 2020-01-01 2020-01-02 2020-01-01 00:02:33 2020-01-02 03:30:54 2020-01-01 00:02:33.000 2020-01-02 03:30:54.000 153 99054 49603.5 4960350 153 99054 49603.5 4960350 -32416 32519 5039.02 503902 -128 127 0.94 94 -154 101 10144 99055 0.46246 297.46246 148.96246 14896.24624 0.46246 297.46246 148.96246 14896.24633 0.46246 297.46246 148.96246 14896.24600 2020-01-01 2020-01-02 2020-01-01 00:02:34 2020-01-02 03:30:55 2020-01-01 00:02:34.000 2020-01-02 03:30:55.000 154 99055 49604.5 4960450 154 99055 49604.5 4960450 -32415 32520 5040.02 504002 -128 127 -0.62 -62 -155 101 10145 99056 0.46546 297.46546 148.96546 14896.54654 0.46546 297.46545 148.96546 14896.54647 0.46546 297.46546 148.96546 14896.54600 2020-01-01 2020-01-02 2020-01-01 00:02:35 2020-01-02 03:30:56 2020-01-01 00:02:35.000 2020-01-02 03:30:56.000 155 99056 49605.5 4960550 155 99056 49605.5 4960550 -32414 32521 5041.02 504102 -128 123 -2.18 -218 -156 101 10146 99057 0.46846 297.46846 148.96846 14896.84684 0.46846 297.46848 148.96847 14896.84721 0.46846 297.46846 148.96846 14896.84600 2020-01-01 2020-01-02 2020-01-01 00:02:36 2020-01-02 03:30:57 2020-01-01 00:02:36.000 2020-01-02 03:30:57.000 156 99057 49606.5 4960650 156 99057 49606.5 4960650 -32413 32522 5042.02 504202 -127 124 -1.18 -118 -157 101 10147 99058 0.47147 297.47147 148.97147 14897.14714 0.47147 297.47147 148.97146 14897.14687 0.47147 297.47147 148.97147 14897.14700 2020-01-01 2020-01-02 2020-01-01 00:02:37 2020-01-02 03:30:58 2020-01-01 00:02:37.000 2020-01-02 03:30:58.000 157 99058 49607.5 4960750 157 99058 49607.5 4960750 -32412 32523 5043.02 504302 -126 125 -0.18 -18 -158 101 10148 99059 0.47447 297.47447 148.97447 14897.44744 0.47447 297.4745 148.97447 14897.44748 0.47447 297.47447 148.97447 14897.44700 2020-01-01 2020-01-02 2020-01-01 00:02:38 2020-01-02 03:30:59 2020-01-01 00:02:38.000 2020-01-02 03:30:59.000 158 99059 49608.5 4960850 158 99059 49608.5 4960850 -32411 32524 5044.02 504402 -125 126 0.82 82 -159 101 10149 99060 0.47747 297.47747 148.97747 14897.74774 0.47747 297.47748 148.97747 14897.74779 0.47747 297.47747 148.97746999999998 14897.74700 2020-01-01 2020-01-02 2020-01-01 00:02:39 2020-01-02 03:31:00 2020-01-01 00:02:39.000 2020-01-02 03:31:00.000 159 99060 49609.5 4960950 159 99060 49609.5 4960950 -32410 32525 5045.02 504502 -124 127 1.82 182 +150 101 10140 99051 0.45045 297.45045 148.95045 14895.04504 0.45045 297.45044 148.95045 14895.04501 0.45045 297.45045 148.95045 14895.045 2020-01-01 2020-01-02 2020-01-01 00:02:30 2020-01-02 03:30:51 2020-01-01 00:02:30.000 2020-01-02 03:30:51.000 150 99051 49600.5 4960050 150 99051 49600.5 4960050 -32419 32516 5036.02 503602 -127 125 0.5 50 +151 101 10141 99052 0.45345 297.45345 148.95345 14895.34534 0.45345 297.45346 148.95345 14895.34574 0.45345 297.45345 148.95345 14895.345 2020-01-01 2020-01-02 2020-01-01 00:02:31 2020-01-02 03:30:52 2020-01-01 00:02:31.000 2020-01-02 03:30:52.000 151 99052 49601.5 4960150 151 99052 49601.5 4960150 -32418 32517 5037.02 503702 -126 126 1.5 150 +152 101 10142 99053 0.45645 297.45645 148.95645 14895.64564 0.45645 297.45645 148.95645 14895.6454 0.45645 297.45645 148.95645000000002 14895.645 2020-01-01 2020-01-02 2020-01-01 00:02:32 2020-01-02 03:30:53 2020-01-01 00:02:32.000 2020-01-02 03:30:53.000 152 99053 49602.5 4960250 152 99053 49602.5 4960250 -32417 32518 5038.02 503802 -125 127 2.5 250 +153 101 10143 99054 0.45945 297.45945 148.95945 14895.94594 0.45945 297.45947 148.95946 14895.94601 0.45945 297.45945 148.95945 14895.945 2020-01-01 2020-01-02 2020-01-01 00:02:33 2020-01-02 03:30:54 2020-01-01 00:02:33.000 2020-01-02 03:30:54.000 153 99054 49603.5 4960350 153 99054 49603.5 4960350 -32416 32519 5039.02 503902 -128 127 0.94 94 +154 101 10144 99055 0.46246 297.46246 148.96246 14896.24624 0.46246 297.46246 148.96246 14896.24633 0.46246 297.46246 148.96246 14896.246 2020-01-01 2020-01-02 2020-01-01 00:02:34 2020-01-02 03:30:55 2020-01-01 00:02:34.000 2020-01-02 03:30:55.000 154 99055 49604.5 4960450 154 99055 49604.5 4960450 -32415 32520 5040.02 504002 -128 127 -0.62 -62 +155 101 10145 99056 0.46546 297.46546 148.96546 14896.54654 0.46546 297.46545 148.96546 14896.54647 0.46546 297.46546 148.96546 14896.546 2020-01-01 2020-01-02 2020-01-01 00:02:35 2020-01-02 03:30:56 2020-01-01 00:02:35.000 2020-01-02 03:30:56.000 155 99056 49605.5 4960550 155 99056 49605.5 4960550 -32414 32521 5041.02 504102 -128 123 -2.18 -218 +156 101 10146 99057 0.46846 297.46846 148.96846 14896.84684 0.46846 297.46848 148.96847 14896.84721 0.46846 297.46846 148.96846 14896.846 2020-01-01 2020-01-02 2020-01-01 00:02:36 2020-01-02 03:30:57 2020-01-01 00:02:36.000 2020-01-02 03:30:57.000 156 99057 49606.5 4960650 156 99057 49606.5 4960650 -32413 32522 5042.02 504202 -127 124 -1.18 -118 +157 101 10147 99058 0.47147 297.47147 148.97147 14897.14714 0.47147 297.47147 148.97146 14897.14687 0.47147 297.47147 148.97147 14897.147 2020-01-01 2020-01-02 2020-01-01 00:02:37 2020-01-02 03:30:58 2020-01-01 00:02:37.000 2020-01-02 03:30:58.000 157 99058 49607.5 4960750 157 99058 49607.5 4960750 -32412 32523 5043.02 504302 -126 125 -0.18 -18 +158 101 10148 99059 0.47447 297.47447 148.97447 14897.44744 0.47447 297.4745 148.97447 14897.44748 0.47447 297.47447 148.97447 14897.447 2020-01-01 2020-01-02 2020-01-01 00:02:38 2020-01-02 03:30:59 2020-01-01 00:02:38.000 2020-01-02 03:30:59.000 158 99059 49608.5 4960850 158 99059 49608.5 4960850 -32411 32524 5044.02 504402 -125 126 0.82 82 +159 101 10149 99060 0.47747 297.47747 148.97747 14897.74774 0.47747 297.47748 148.97747 14897.74779 0.47747 297.47747 148.97746999999998 14897.747 2020-01-01 2020-01-02 2020-01-01 00:02:39 2020-01-02 03:31:00 2020-01-01 00:02:39.000 2020-01-02 03:31:00.000 159 99060 49609.5 4960950 159 99060 49609.5 4960950 -32410 32525 5045.02 504502 -124 127 1.82 182 16 102 10006 99916 0.04804 300.04804 150.04804 15154.85285 0.04804 300.04803 150.04804 15154.85279 0.04804 300.04804 150.04804 15154.85204 2020-01-01 2020-01-02 2020-01-01 00:00:16 2020-01-02 03:45:16 2020-01-01 00:00:16.000 2020-01-02 03:45:16.000 16 99916 49966 5046566 16 99916 49966 5046566 -32553 32382 4545.009900990099 459046 -128 127 0.37623762376237624 38 -160 101 10150 99061 0.48048 297.48048 148.98048 14898.04804 0.48048 297.48047 148.98048 14898.0481 0.48048 297.48048 148.98048 14898.04800 2020-01-01 2020-01-02 2020-01-01 00:02:40 2020-01-02 03:31:01 2020-01-01 00:02:40.000 2020-01-02 03:31:01.000 160 99061 49610.5 4961050 160 99061 49610.5 4961050 -32409 32526 5046.02 504602 -128 127 0.26 26 -161 101 10151 99062 0.48348 297.48348 148.98348 14898.34834 0.48348 297.4835 148.98348 14898.34868 0.48348 297.48348 148.98348 14898.34800 2020-01-01 2020-01-02 2020-01-01 00:02:41 2020-01-02 03:31:02 2020-01-01 00:02:41.000 2020-01-02 03:31:02.000 161 99062 49611.5 4961150 161 99062 49611.5 4961150 -32408 32527 5047.02 504702 -128 123 -1.3 -130 -162 101 10152 99063 0.48648 297.48648 148.98648 14898.64864 0.48648 297.48648 148.98648 14898.64837 0.48648 297.48648 148.98648 14898.64800 2020-01-01 2020-01-02 2020-01-01 00:02:42 2020-01-02 03:31:03 2020-01-01 00:02:42.000 2020-01-02 03:31:03.000 162 99063 49612.5 4961250 162 99063 49612.5 4961250 -32407 32528 5048.02 504802 -127 124 -0.3 -30 -163 101 10153 99064 0.48948 297.48948 148.98948 14898.94894 0.48948 297.4895 148.98948 14898.94895 0.48948 297.48948 148.98948000000001 14898.94800 2020-01-01 2020-01-02 2020-01-01 00:02:43 2020-01-02 03:31:04 2020-01-01 00:02:43.000 2020-01-02 03:31:04.000 163 99064 49613.5 4961350 163 99064 49613.5 4961350 -32406 32529 5049.02 504902 -126 125 0.7 70 -164 101 10154 99065 0.49249 297.49249 148.99249 14899.24924 0.49249 297.4925 148.99249 14899.24926 0.49249 297.49249 148.99249 14899.24900 2020-01-01 2020-01-02 2020-01-01 00:02:44 2020-01-02 03:31:05 2020-01-01 00:02:44.000 2020-01-02 03:31:05.000 164 99065 49614.5 4961450 164 99065 49614.5 4961450 -32405 32530 5050.02 505002 -125 126 1.7 170 -165 101 10155 99066 0.49549 297.49549 148.99549 14899.54954 0.49549 297.49548 148.99549 14899.54957 0.49549 297.49549 148.99549000000002 14899.54900 2020-01-01 2020-01-02 2020-01-01 00:02:45 2020-01-02 03:31:06 2020-01-01 00:02:45.000 2020-01-02 03:31:06.000 165 99066 49615.5 4961550 165 99066 49615.5 4961550 -32404 32531 5051.02 505102 -124 127 2.7 270 -166 101 10156 99067 0.49849 297.49849 148.99849 14899.84984 0.49849 297.4985 148.9985 14899.85015 0.49849 297.49849 148.99849 14899.84900 2020-01-01 2020-01-02 2020-01-01 00:02:46 2020-01-02 03:31:07 2020-01-01 00:02:46.000 2020-01-02 03:31:07.000 166 99067 49616.5 4961650 166 99067 49616.5 4961650 -32403 32532 5052.02 505202 -128 127 1.14 114 -167 101 10157 99068 0.5015 297.5015 149.0015 14900.15015 0.5015 297.5015 149.00149 14900.14984 0.50150 297.50150 149.0015 14900.15000 2020-01-01 2020-01-02 2020-01-01 00:02:47 2020-01-02 03:31:08 2020-01-01 00:02:47.000 2020-01-02 03:31:08.000 167 99068 49617.5 4961750 167 99068 49617.5 4961750 -32402 32533 5053.02 505302 -128 123 -0.42 -42 -168 101 10158 99069 0.5045 297.5045 149.0045 14900.45045 0.5045 297.50452 149.0045 14900.45042 0.50450 297.50450 149.0045 14900.45000 2020-01-01 2020-01-02 2020-01-01 00:02:48 2020-01-02 03:31:09 2020-01-01 00:02:48.000 2020-01-02 03:31:09.000 168 99069 49618.5 4961850 168 99069 49618.5 4961850 -32401 32534 5054.02 505402 -127 124 0.58 58 -169 101 10159 99070 0.5075 297.5075 149.0075 14900.75075 0.5075 297.5075 149.0075 14900.75073 0.50750 297.50750 149.0075 14900.75000 2020-01-01 2020-01-02 2020-01-01 00:02:49 2020-01-02 03:31:10 2020-01-01 00:02:49.000 2020-01-02 03:31:10.000 169 99070 49619.5 4961950 169 99070 49619.5 4961950 -32400 32535 5055.02 505502 -126 125 1.58 158 +160 101 10150 99061 0.48048 297.48048 148.98048 14898.04804 0.48048 297.48047 148.98048 14898.0481 0.48048 297.48048 148.98048 14898.048 2020-01-01 2020-01-02 2020-01-01 00:02:40 2020-01-02 03:31:01 2020-01-01 00:02:40.000 2020-01-02 03:31:01.000 160 99061 49610.5 4961050 160 99061 49610.5 4961050 -32409 32526 5046.02 504602 -128 127 0.26 26 +161 101 10151 99062 0.48348 297.48348 148.98348 14898.34834 0.48348 297.4835 148.98348 14898.34868 0.48348 297.48348 148.98348 14898.348 2020-01-01 2020-01-02 2020-01-01 00:02:41 2020-01-02 03:31:02 2020-01-01 00:02:41.000 2020-01-02 03:31:02.000 161 99062 49611.5 4961150 161 99062 49611.5 4961150 -32408 32527 5047.02 504702 -128 123 -1.3 -130 +162 101 10152 99063 0.48648 297.48648 148.98648 14898.64864 0.48648 297.48648 148.98648 14898.64837 0.48648 297.48648 148.98648 14898.648 2020-01-01 2020-01-02 2020-01-01 00:02:42 2020-01-02 03:31:03 2020-01-01 00:02:42.000 2020-01-02 03:31:03.000 162 99063 49612.5 4961250 162 99063 49612.5 4961250 -32407 32528 5048.02 504802 -127 124 -0.3 -30 +163 101 10153 99064 0.48948 297.48948 148.98948 14898.94894 0.48948 297.4895 148.98948 14898.94895 0.48948 297.48948 148.98948000000001 14898.948 2020-01-01 2020-01-02 2020-01-01 00:02:43 2020-01-02 03:31:04 2020-01-01 00:02:43.000 2020-01-02 03:31:04.000 163 99064 49613.5 4961350 163 99064 49613.5 4961350 -32406 32529 5049.02 504902 -126 125 0.7 70 +164 101 10154 99065 0.49249 297.49249 148.99249 14899.24924 0.49249 297.4925 148.99249 14899.24926 0.49249 297.49249 148.99249 14899.249 2020-01-01 2020-01-02 2020-01-01 00:02:44 2020-01-02 03:31:05 2020-01-01 00:02:44.000 2020-01-02 03:31:05.000 164 99065 49614.5 4961450 164 99065 49614.5 4961450 -32405 32530 5050.02 505002 -125 126 1.7 170 +165 101 10155 99066 0.49549 297.49549 148.99549 14899.54954 0.49549 297.49548 148.99549 14899.54957 0.49549 297.49549 148.99549000000002 14899.549 2020-01-01 2020-01-02 2020-01-01 00:02:45 2020-01-02 03:31:06 2020-01-01 00:02:45.000 2020-01-02 03:31:06.000 165 99066 49615.5 4961550 165 99066 49615.5 4961550 -32404 32531 5051.02 505102 -124 127 2.7 270 +166 101 10156 99067 0.49849 297.49849 148.99849 14899.84984 0.49849 297.4985 148.9985 14899.85015 0.49849 297.49849 148.99849 14899.849 2020-01-01 2020-01-02 2020-01-01 00:02:46 2020-01-02 03:31:07 2020-01-01 00:02:46.000 2020-01-02 03:31:07.000 166 99067 49616.5 4961650 166 99067 49616.5 4961650 -32403 32532 5052.02 505202 -128 127 1.14 114 +167 101 10157 99068 0.5015 297.5015 149.0015 14900.15015 0.5015 297.5015 149.00149 14900.14984 0.5015 297.5015 149.0015 14900.15 2020-01-01 2020-01-02 2020-01-01 00:02:47 2020-01-02 03:31:08 2020-01-01 00:02:47.000 2020-01-02 03:31:08.000 167 99068 49617.5 4961750 167 99068 49617.5 4961750 -32402 32533 5053.02 505302 -128 123 -0.42 -42 +168 101 10158 99069 0.5045 297.5045 149.0045 14900.45045 0.5045 297.50452 149.0045 14900.45042 0.5045 297.5045 149.0045 14900.45 2020-01-01 2020-01-02 2020-01-01 00:02:48 2020-01-02 03:31:09 2020-01-01 00:02:48.000 2020-01-02 03:31:09.000 168 99069 49618.5 4961850 168 99069 49618.5 4961850 -32401 32534 5054.02 505402 -127 124 0.58 58 +169 101 10159 99070 0.5075 297.5075 149.0075 14900.75075 0.5075 297.5075 149.0075 14900.75073 0.5075 297.5075 149.0075 14900.75 2020-01-01 2020-01-02 2020-01-01 00:02:49 2020-01-02 03:31:10 2020-01-01 00:02:49.000 2020-01-02 03:31:10.000 169 99070 49619.5 4961950 169 99070 49619.5 4961950 -32400 32535 5055.02 505502 -126 125 1.58 158 17 102 10007 99917 0.05105 300.05105 150.05105 15155.15615 0.05105 300.05106 150.05105 15155.15638 0.05105 300.05105 150.05105 15155.15605 2020-01-01 2020-01-02 2020-01-01 00:00:17 2020-01-02 03:45:17 2020-01-01 00:00:17.000 2020-01-02 03:45:17.000 17 99917 49967 5046667 17 99917 49967 5046667 -32552 32383 4546.009900990099 459147 -128 127 -1.1584158415841583 -117 -170 101 10160 99071 0.51051 297.51051 149.01051 14901.05105 0.51051 297.5105 149.01051 14901.05104 0.51051 297.51051 149.01050999999998 14901.05100 2020-01-01 2020-01-02 2020-01-01 00:02:50 2020-01-02 03:31:11 2020-01-01 00:02:50.000 2020-01-02 03:31:11.000 170 99071 49620.5 4962050 170 99071 49620.5 4962050 -32399 32536 5056.02 505602 -125 126 2.58 258 -171 101 10161 99072 0.51351 297.51351 149.01351 14901.35135 0.51351 297.51352 149.01351 14901.35162 0.51351 297.51351 149.01351 14901.35100 2020-01-01 2020-01-02 2020-01-01 00:02:51 2020-01-02 03:31:12 2020-01-01 00:02:51.000 2020-01-02 03:31:12.000 171 99072 49621.5 4962150 171 99072 49621.5 4962150 -32398 32537 5057.02 505702 -124 127 3.58 358 -172 101 10162 99073 0.51651 297.51651 149.01651 14901.65165 0.51651 297.5165 149.01651 14901.65131 0.51651 297.51651 149.01651 14901.65100 2020-01-01 2020-01-02 2020-01-01 00:02:52 2020-01-02 03:31:13 2020-01-01 00:02:52.000 2020-01-02 03:31:13.000 172 99073 49622.5 4962250 172 99073 49622.5 4962250 -32397 32538 5058.02 505802 -128 127 2.02 202 -173 101 10163 99074 0.51951 297.51951 149.01951 14901.95195 0.51951 297.51953 149.01951 14901.95189 0.51951 297.51951 149.01951 14901.95100 2020-01-01 2020-01-02 2020-01-01 00:02:53 2020-01-02 03:31:14 2020-01-01 00:02:53.000 2020-01-02 03:31:14.000 173 99074 49623.5 4962350 173 99074 49623.5 4962350 -32396 32539 5059.02 505902 -128 127 0.46 46 -174 101 10164 99075 0.52252 297.52252 149.02252 14902.25225 0.52252 297.52252 149.02252 14902.2522 0.52252 297.52252 149.02252000000001 14902.25200 2020-01-01 2020-01-02 2020-01-01 00:02:54 2020-01-02 03:31:15 2020-01-01 00:02:54.000 2020-01-02 03:31:15.000 174 99075 49624.5 4962450 174 99075 49624.5 4962450 -32395 32540 5060.02 506002 -128 124 -1.1 -110 -175 101 10165 99076 0.52552 297.52552 149.02552 14902.55255 0.52552 297.5255 149.02552 14902.55251 0.52552 297.52552 149.02552 14902.55200 2020-01-01 2020-01-02 2020-01-01 00:02:55 2020-01-02 03:31:16 2020-01-01 00:02:55.000 2020-01-02 03:31:16.000 175 99076 49625.5 4962550 175 99076 49625.5 4962550 -32394 32541 5061.02 506102 -127 125 -0.1 -10 -176 101 10166 99077 0.52852 297.52852 149.02852 14902.85285 0.52852 297.52853 149.02853 14902.85312 0.52852 297.52852 149.02852000000001 14902.85200 2020-01-01 2020-01-02 2020-01-01 00:02:56 2020-01-02 03:31:17 2020-01-01 00:02:56.000 2020-01-02 03:31:17.000 176 99077 49626.5 4962650 176 99077 49626.5 4962650 -32393 32542 5062.02 506202 -126 126 0.9 90 -177 101 10167 99078 0.53153 297.53153 149.03153 14903.15315 0.53153 297.53152 149.03152 14903.15278 0.53153 297.53153 149.03153 14903.15300 2020-01-01 2020-01-02 2020-01-01 00:02:57 2020-01-02 03:31:18 2020-01-01 00:02:57.000 2020-01-02 03:31:18.000 177 99078 49627.5 4962750 177 99078 49627.5 4962750 -32392 32543 5063.02 506302 -125 127 1.9 190 -178 101 10168 99079 0.53453 297.53453 149.03453 14903.45345 0.53453 297.53455 149.03453 14903.45352 0.53453 297.53453 149.03453 14903.45300 2020-01-01 2020-01-02 2020-01-01 00:02:58 2020-01-02 03:31:19 2020-01-01 00:02:58.000 2020-01-02 03:31:19.000 178 99079 49628.5 4962850 178 99079 49628.5 4962850 -32391 32544 5064.02 506402 -128 127 0.34 34 -179 101 10169 99080 0.53753 297.53753 149.03753 14903.75375 0.53753 297.53754 149.03753 14903.75366 0.53753 297.53753 149.03753 14903.75300 2020-01-01 2020-01-02 2020-01-01 00:02:59 2020-01-02 03:31:20 2020-01-01 00:02:59.000 2020-01-02 03:31:20.000 179 99080 49629.5 4962950 179 99080 49629.5 4962950 -32390 32545 5065.02 506502 -128 127 -1.22 -122 +170 101 10160 99071 0.51051 297.51051 149.01051 14901.05105 0.51051 297.5105 149.01051 14901.05104 0.51051 297.51051 149.01050999999998 14901.051 2020-01-01 2020-01-02 2020-01-01 00:02:50 2020-01-02 03:31:11 2020-01-01 00:02:50.000 2020-01-02 03:31:11.000 170 99071 49620.5 4962050 170 99071 49620.5 4962050 -32399 32536 5056.02 505602 -125 126 2.58 258 +171 101 10161 99072 0.51351 297.51351 149.01351 14901.35135 0.51351 297.51352 149.01351 14901.35162 0.51351 297.51351 149.01351 14901.351 2020-01-01 2020-01-02 2020-01-01 00:02:51 2020-01-02 03:31:12 2020-01-01 00:02:51.000 2020-01-02 03:31:12.000 171 99072 49621.5 4962150 171 99072 49621.5 4962150 -32398 32537 5057.02 505702 -124 127 3.58 358 +172 101 10162 99073 0.51651 297.51651 149.01651 14901.65165 0.51651 297.5165 149.01651 14901.65131 0.51651 297.51651 149.01651 14901.651 2020-01-01 2020-01-02 2020-01-01 00:02:52 2020-01-02 03:31:13 2020-01-01 00:02:52.000 2020-01-02 03:31:13.000 172 99073 49622.5 4962250 172 99073 49622.5 4962250 -32397 32538 5058.02 505802 -128 127 2.02 202 +173 101 10163 99074 0.51951 297.51951 149.01951 14901.95195 0.51951 297.51953 149.01951 14901.95189 0.51951 297.51951 149.01951 14901.951 2020-01-01 2020-01-02 2020-01-01 00:02:53 2020-01-02 03:31:14 2020-01-01 00:02:53.000 2020-01-02 03:31:14.000 173 99074 49623.5 4962350 173 99074 49623.5 4962350 -32396 32539 5059.02 505902 -128 127 0.46 46 +174 101 10164 99075 0.52252 297.52252 149.02252 14902.25225 0.52252 297.52252 149.02252 14902.2522 0.52252 297.52252 149.02252000000001 14902.252 2020-01-01 2020-01-02 2020-01-01 00:02:54 2020-01-02 03:31:15 2020-01-01 00:02:54.000 2020-01-02 03:31:15.000 174 99075 49624.5 4962450 174 99075 49624.5 4962450 -32395 32540 5060.02 506002 -128 124 -1.1 -110 +175 101 10165 99076 0.52552 297.52552 149.02552 14902.55255 0.52552 297.5255 149.02552 14902.55251 0.52552 297.52552 149.02552 14902.552 2020-01-01 2020-01-02 2020-01-01 00:02:55 2020-01-02 03:31:16 2020-01-01 00:02:55.000 2020-01-02 03:31:16.000 175 99076 49625.5 4962550 175 99076 49625.5 4962550 -32394 32541 5061.02 506102 -127 125 -0.1 -10 +176 101 10166 99077 0.52852 297.52852 149.02852 14902.85285 0.52852 297.52853 149.02853 14902.85312 0.52852 297.52852 149.02852000000001 14902.852 2020-01-01 2020-01-02 2020-01-01 00:02:56 2020-01-02 03:31:17 2020-01-01 00:02:56.000 2020-01-02 03:31:17.000 176 99077 49626.5 4962650 176 99077 49626.5 4962650 -32393 32542 5062.02 506202 -126 126 0.9 90 +177 101 10167 99078 0.53153 297.53153 149.03153 14903.15315 0.53153 297.53152 149.03152 14903.15278 0.53153 297.53153 149.03153 14903.153 2020-01-01 2020-01-02 2020-01-01 00:02:57 2020-01-02 03:31:18 2020-01-01 00:02:57.000 2020-01-02 03:31:18.000 177 99078 49627.5 4962750 177 99078 49627.5 4962750 -32392 32543 5063.02 506302 -125 127 1.9 190 +178 101 10168 99079 0.53453 297.53453 149.03453 14903.45345 0.53453 297.53455 149.03453 14903.45352 0.53453 297.53453 149.03453 14903.453 2020-01-01 2020-01-02 2020-01-01 00:02:58 2020-01-02 03:31:19 2020-01-01 00:02:58.000 2020-01-02 03:31:19.000 178 99079 49628.5 4962850 178 99079 49628.5 4962850 -32391 32544 5064.02 506402 -128 127 0.34 34 +179 101 10169 99080 0.53753 297.53753 149.03753 14903.75375 0.53753 297.53754 149.03753 14903.75366 0.53753 297.53753 149.03753 14903.753 2020-01-01 2020-01-02 2020-01-01 00:02:59 2020-01-02 03:31:20 2020-01-01 00:02:59.000 2020-01-02 03:31:20.000 179 99080 49629.5 4962950 179 99080 49629.5 4962950 -32390 32545 5065.02 506502 -128 127 -1.22 -122 18 102 10008 99918 0.05405 300.05405 150.05405 15155.45945 0.05405 300.05405 150.05404 15155.45903 0.05405 300.05405 150.05405 15155.45905 2020-01-01 2020-01-02 2020-01-01 00:00:18 2020-01-02 03:45:18 2020-01-01 00:00:18.000 2020-01-02 03:45:18.000 18 99918 49968 5046768 18 99918 49968 5046768 -32551 32384 4547.009900990099 459248 -128 124 -2.6930693069306932 -272 -180 101 10170 99081 0.54054 297.54054 149.04054 14904.05405 0.54054 297.54053 149.04053 14904.05398 0.54054 297.54054 149.04054 14904.05400 2020-01-01 2020-01-02 2020-01-01 00:03:00 2020-01-02 03:31:21 2020-01-01 00:03:00.000 2020-01-02 03:31:21.000 180 99081 49630.5 4963050 180 99081 49630.5 4963050 -32389 32546 5066.02 506602 -128 123 -2.78 -278 -181 101 10171 99082 0.54354 297.54354 149.04354 14904.35435 0.54354 297.54355 149.04354 14904.35459 0.54354 297.54354 149.04354 14904.35400 2020-01-01 2020-01-02 2020-01-01 00:03:01 2020-01-02 03:31:22 2020-01-01 00:03:01.000 2020-01-02 03:31:22.000 181 99082 49631.5 4963150 181 99082 49631.5 4963150 -32388 32547 5067.02 506702 -127 124 -1.78 -178 -182 101 10172 99083 0.54654 297.54654 149.04654 14904.65465 0.54654 297.54654 149.04654 14904.65425 0.54654 297.54654 149.04654 14904.65400 2020-01-01 2020-01-02 2020-01-01 00:03:02 2020-01-02 03:31:23 2020-01-01 00:03:02.000 2020-01-02 03:31:23.000 182 99083 49632.5 4963250 182 99083 49632.5 4963250 -32387 32548 5068.02 506802 -126 125 -0.78 -78 -183 101 10173 99084 0.54954 297.54954 149.04954 14904.95495 0.54954 297.54956 149.04954 14904.95498 0.54954 297.54954 149.04954 14904.95400 2020-01-01 2020-01-02 2020-01-01 00:03:03 2020-01-02 03:31:24 2020-01-01 00:03:03.000 2020-01-02 03:31:24.000 183 99084 49633.5 4963350 183 99084 49633.5 4963350 -32386 32549 5069.02 506902 -125 126 0.22 22 -184 101 10174 99085 0.55255 297.55255 149.05255 14905.25525 0.55255 297.55255 149.05255 14905.25514 0.55255 297.55255 149.05255 14905.25500 2020-01-01 2020-01-02 2020-01-01 00:03:04 2020-01-02 03:31:25 2020-01-01 00:03:04.000 2020-01-02 03:31:25.000 184 99085 49634.5 4963450 184 99085 49634.5 4963450 -32385 32550 5070.02 507002 -124 127 1.22 122 -185 101 10175 99086 0.55555 297.55555 149.05555 14905.55555 0.55555 297.55554 149.05555 14905.55549 0.55555 297.55555 149.05555 14905.55500 2020-01-01 2020-01-02 2020-01-01 00:03:05 2020-01-02 03:31:26 2020-01-01 00:03:05.000 2020-01-02 03:31:26.000 185 99086 49635.5 4963550 185 99086 49635.5 4963550 -32384 32551 5071.02 507102 -128 127 -0.34 -34 -186 101 10176 99087 0.55855 297.55855 149.05855 14905.85585 0.55855 297.55856 149.05856 14905.85607 0.55855 297.55855 149.05855 14905.85500 2020-01-01 2020-01-02 2020-01-01 00:03:06 2020-01-02 03:31:27 2020-01-01 00:03:06.000 2020-01-02 03:31:27.000 186 99087 49636.5 4963650 186 99087 49636.5 4963650 -32383 32552 5072.02 507202 -128 123 -1.9 -190 -187 101 10177 99088 0.56156 297.56156 149.06156 14906.15615 0.56156 297.56155 149.06155 14906.15572 0.56156 297.56156 149.06156000000001 14906.15600 2020-01-01 2020-01-02 2020-01-01 00:03:07 2020-01-02 03:31:28 2020-01-01 00:03:07.000 2020-01-02 03:31:28.000 187 99088 49637.5 4963750 187 99088 49637.5 4963750 -32382 32553 5073.02 507302 -127 124 -0.9 -90 -188 101 10178 99089 0.56456 297.56456 149.06456 14906.45645 0.56456 297.56458 149.06456 14906.45645 0.56456 297.56456 149.06456 14906.45600 2020-01-01 2020-01-02 2020-01-01 00:03:08 2020-01-02 03:31:29 2020-01-01 00:03:08.000 2020-01-02 03:31:29.000 188 99089 49638.5 4963850 188 99089 49638.5 4963850 -32381 32554 5074.02 507402 -126 125 0.1 10 -189 101 10179 99090 0.56756 297.56756 149.06756 14906.75675 0.56756 297.56757 149.06756 14906.75661 0.56756 297.56756 149.06756 14906.75600 2020-01-01 2020-01-02 2020-01-01 00:03:09 2020-01-02 03:31:30 2020-01-01 00:03:09.000 2020-01-02 03:31:30.000 189 99090 49639.5 4963950 189 99090 49639.5 4963950 -32380 32555 5075.02 507502 -125 126 1.1 110 +180 101 10170 99081 0.54054 297.54054 149.04054 14904.05405 0.54054 297.54053 149.04053 14904.05398 0.54054 297.54054 149.04054 14904.054 2020-01-01 2020-01-02 2020-01-01 00:03:00 2020-01-02 03:31:21 2020-01-01 00:03:00.000 2020-01-02 03:31:21.000 180 99081 49630.5 4963050 180 99081 49630.5 4963050 -32389 32546 5066.02 506602 -128 123 -2.78 -278 +181 101 10171 99082 0.54354 297.54354 149.04354 14904.35435 0.54354 297.54355 149.04354 14904.35459 0.54354 297.54354 149.04354 14904.354 2020-01-01 2020-01-02 2020-01-01 00:03:01 2020-01-02 03:31:22 2020-01-01 00:03:01.000 2020-01-02 03:31:22.000 181 99082 49631.5 4963150 181 99082 49631.5 4963150 -32388 32547 5067.02 506702 -127 124 -1.78 -178 +182 101 10172 99083 0.54654 297.54654 149.04654 14904.65465 0.54654 297.54654 149.04654 14904.65425 0.54654 297.54654 149.04654 14904.654 2020-01-01 2020-01-02 2020-01-01 00:03:02 2020-01-02 03:31:23 2020-01-01 00:03:02.000 2020-01-02 03:31:23.000 182 99083 49632.5 4963250 182 99083 49632.5 4963250 -32387 32548 5068.02 506802 -126 125 -0.78 -78 +183 101 10173 99084 0.54954 297.54954 149.04954 14904.95495 0.54954 297.54956 149.04954 14904.95498 0.54954 297.54954 149.04954 14904.954 2020-01-01 2020-01-02 2020-01-01 00:03:03 2020-01-02 03:31:24 2020-01-01 00:03:03.000 2020-01-02 03:31:24.000 183 99084 49633.5 4963350 183 99084 49633.5 4963350 -32386 32549 5069.02 506902 -125 126 0.22 22 +184 101 10174 99085 0.55255 297.55255 149.05255 14905.25525 0.55255 297.55255 149.05255 14905.25514 0.55255 297.55255 149.05255 14905.255 2020-01-01 2020-01-02 2020-01-01 00:03:04 2020-01-02 03:31:25 2020-01-01 00:03:04.000 2020-01-02 03:31:25.000 184 99085 49634.5 4963450 184 99085 49634.5 4963450 -32385 32550 5070.02 507002 -124 127 1.22 122 +185 101 10175 99086 0.55555 297.55555 149.05555 14905.55555 0.55555 297.55554 149.05555 14905.55549 0.55555 297.55555 149.05555 14905.555 2020-01-01 2020-01-02 2020-01-01 00:03:05 2020-01-02 03:31:26 2020-01-01 00:03:05.000 2020-01-02 03:31:26.000 185 99086 49635.5 4963550 185 99086 49635.5 4963550 -32384 32551 5071.02 507102 -128 127 -0.34 -34 +186 101 10176 99087 0.55855 297.55855 149.05855 14905.85585 0.55855 297.55856 149.05856 14905.85607 0.55855 297.55855 149.05855 14905.855 2020-01-01 2020-01-02 2020-01-01 00:03:06 2020-01-02 03:31:27 2020-01-01 00:03:06.000 2020-01-02 03:31:27.000 186 99087 49636.5 4963650 186 99087 49636.5 4963650 -32383 32552 5072.02 507202 -128 123 -1.9 -190 +187 101 10177 99088 0.56156 297.56156 149.06156 14906.15615 0.56156 297.56155 149.06155 14906.15572 0.56156 297.56156 149.06156000000001 14906.156 2020-01-01 2020-01-02 2020-01-01 00:03:07 2020-01-02 03:31:28 2020-01-01 00:03:07.000 2020-01-02 03:31:28.000 187 99088 49637.5 4963750 187 99088 49637.5 4963750 -32382 32553 5073.02 507302 -127 124 -0.9 -90 +188 101 10178 99089 0.56456 297.56456 149.06456 14906.45645 0.56456 297.56458 149.06456 14906.45645 0.56456 297.56456 149.06456 14906.456 2020-01-01 2020-01-02 2020-01-01 00:03:08 2020-01-02 03:31:29 2020-01-01 00:03:08.000 2020-01-02 03:31:29.000 188 99089 49638.5 4963850 188 99089 49638.5 4963850 -32381 32554 5074.02 507402 -126 125 0.1 10 +189 101 10179 99090 0.56756 297.56756 149.06756 14906.75675 0.56756 297.56757 149.06756 14906.75661 0.56756 297.56756 149.06756 14906.756 2020-01-01 2020-01-02 2020-01-01 00:03:09 2020-01-02 03:31:30 2020-01-01 00:03:09.000 2020-01-02 03:31:30.000 189 99090 49639.5 4963950 189 99090 49639.5 4963950 -32380 32555 5075.02 507502 -125 126 1.1 110 19 102 10009 99919 0.05705 300.05705 150.05705 15155.76276 0.05705 300.05707 150.05705 15155.76279 0.05705 300.05705 150.05705 15155.76205 2020-01-01 2020-01-02 2020-01-01 00:00:19 2020-01-02 03:45:19 2020-01-01 00:00:19.000 2020-01-02 03:45:19.000 19 99919 49969 5046869 19 99919 49969 5046869 -32550 32385 4548.009900990099 459349 -127 125 -1.693069306930693 -171 -190 101 10180 99091 0.57057 297.57057 149.07057 14907.05705 0.57057 297.57056 149.07056 14907.05695 0.57057 297.57057 149.07057 14907.05700 2020-01-01 2020-01-02 2020-01-01 00:03:10 2020-01-02 03:31:31 2020-01-01 00:03:10.000 2020-01-02 03:31:31.000 190 99091 49640.5 4964050 190 99091 49640.5 4964050 -32379 32556 5076.02 507602 -124 127 2.1 210 -191 101 10181 99092 0.57357 297.57357 149.07357 14907.35735 0.57357 297.57358 149.07357 14907.35753 0.57357 297.57357 149.07357 14907.35700 2020-01-01 2020-01-02 2020-01-01 00:03:11 2020-01-02 03:31:32 2020-01-01 00:03:11.000 2020-01-02 03:31:32.000 191 99092 49641.5 4964150 191 99092 49641.5 4964150 -32378 32557 5077.02 507702 -128 127 0.54 54 -192 101 10182 99093 0.57657 297.57657 149.07657 14907.65765 0.57657 297.57657 149.07657 14907.65784 0.57657 297.57657 149.07657 14907.65700 2020-01-01 2020-01-02 2020-01-01 00:03:12 2020-01-02 03:31:33 2020-01-01 00:03:12.000 2020-01-02 03:31:33.000 192 99093 49642.5 4964250 192 99093 49642.5 4964250 -32377 32558 5078.02 507802 -128 123 -1.02 -102 -193 101 10183 99094 0.57957 297.57957 149.07957 14907.95795 0.57957 297.5796 149.07957 14907.95793 0.57957 297.57957 149.07957 14907.95700 2020-01-01 2020-01-02 2020-01-01 00:03:13 2020-01-02 03:31:34 2020-01-01 00:03:13.000 2020-01-02 03:31:34.000 193 99094 49643.5 4964350 193 99094 49643.5 4964350 -32376 32559 5079.02 507902 -127 124 -0.02 -2 -194 101 10184 99095 0.58258 297.58258 149.08258 14908.25825 0.58258 297.58258 149.08258 14908.25811 0.58258 297.58258 149.08258 14908.25800 2020-01-01 2020-01-02 2020-01-01 00:03:14 2020-01-02 03:31:35 2020-01-01 00:03:14.000 2020-01-02 03:31:35.000 194 99095 49644.5 4964450 194 99095 49644.5 4964450 -32375 32560 5080.02 508002 -126 125 0.98 98 -195 101 10185 99096 0.58558 297.58558 149.08558 14908.55855 0.58558 297.58557 149.08558 14908.55842 0.58558 297.58558 149.08558000000002 14908.55800 2020-01-01 2020-01-02 2020-01-01 00:03:15 2020-01-02 03:31:36 2020-01-01 00:03:15.000 2020-01-02 03:31:36.000 195 99096 49645.5 4964550 195 99096 49645.5 4964550 -32374 32561 5081.02 508102 -125 126 1.98 198 -196 101 10186 99097 0.58858 297.58858 149.08858 14908.85885 0.58858 297.5886 149.08859 14908.859 0.58858 297.58858 149.08858 14908.85800 2020-01-01 2020-01-02 2020-01-01 00:03:16 2020-01-02 03:31:37 2020-01-01 00:03:16.000 2020-01-02 03:31:37.000 196 99097 49646.5 4964650 196 99097 49646.5 4964650 -32373 32562 5082.02 508202 -124 127 2.98 298 -197 101 10187 99098 0.59159 297.59159 149.09159 14909.15915 0.59159 297.59158 149.09159 14909.15931 0.59159 297.59159 149.09159 14909.15900 2020-01-01 2020-01-02 2020-01-01 00:03:17 2020-01-02 03:31:38 2020-01-01 00:03:17.000 2020-01-02 03:31:38.000 197 99098 49647.5 4964750 197 99098 49647.5 4964750 -32372 32563 5083.02 508302 -128 127 1.42 142 -198 101 10188 99099 0.59459 297.59459 149.09459 14909.45945 0.59459 297.5946 149.09459 14909.4594 0.59459 297.59459 149.09459 14909.45900 2020-01-01 2020-01-02 2020-01-01 00:03:18 2020-01-02 03:31:39 2020-01-01 00:03:18.000 2020-01-02 03:31:39.000 198 99099 49648.5 4964850 198 99099 49648.5 4964850 -32371 32564 5084.02 508402 -128 127 -0.14 -14 -199 101 10189 99100 0.59759 297.59759 149.09759 14909.75975 0.59759 297.5976 149.09759 14909.75958 0.59759 297.59759 149.09759 14909.75900 2020-01-01 2020-01-02 2020-01-01 00:03:19 2020-01-02 03:31:40 2020-01-01 00:03:19.000 2020-01-02 03:31:40.000 199 99100 49649.5 4964950 199 99100 49649.5 4964950 -32370 32565 5085.02 508502 -128 124 -1.7 -170 -2 102 1001 9992 0.006 300.006 150.006 15150.6066 0.006 300.006 150.006 15150.6069 0.00600 300.00600 150.006 15150.60600 2020-01-01 2020-01-02 2020-01-01 00:00:02 2020-01-02 03:45:02 2020-01-01 00:00:02.000 2020-01-02 03:45:02.000 2 99902 49952 5045152 2 99902 49952 5045152 -32567 32368 4531.009900990099 457632 -125 126 -0.9504950495049505 -96 +190 101 10180 99091 0.57057 297.57057 149.07057 14907.05705 0.57057 297.57056 149.07056 14907.05695 0.57057 297.57057 149.07057 14907.057 2020-01-01 2020-01-02 2020-01-01 00:03:10 2020-01-02 03:31:31 2020-01-01 00:03:10.000 2020-01-02 03:31:31.000 190 99091 49640.5 4964050 190 99091 49640.5 4964050 -32379 32556 5076.02 507602 -124 127 2.1 210 +191 101 10181 99092 0.57357 297.57357 149.07357 14907.35735 0.57357 297.57358 149.07357 14907.35753 0.57357 297.57357 149.07357 14907.357 2020-01-01 2020-01-02 2020-01-01 00:03:11 2020-01-02 03:31:32 2020-01-01 00:03:11.000 2020-01-02 03:31:32.000 191 99092 49641.5 4964150 191 99092 49641.5 4964150 -32378 32557 5077.02 507702 -128 127 0.54 54 +192 101 10182 99093 0.57657 297.57657 149.07657 14907.65765 0.57657 297.57657 149.07657 14907.65784 0.57657 297.57657 149.07657 14907.657 2020-01-01 2020-01-02 2020-01-01 00:03:12 2020-01-02 03:31:33 2020-01-01 00:03:12.000 2020-01-02 03:31:33.000 192 99093 49642.5 4964250 192 99093 49642.5 4964250 -32377 32558 5078.02 507802 -128 123 -1.02 -102 +193 101 10183 99094 0.57957 297.57957 149.07957 14907.95795 0.57957 297.5796 149.07957 14907.95793 0.57957 297.57957 149.07957 14907.957 2020-01-01 2020-01-02 2020-01-01 00:03:13 2020-01-02 03:31:34 2020-01-01 00:03:13.000 2020-01-02 03:31:34.000 193 99094 49643.5 4964350 193 99094 49643.5 4964350 -32376 32559 5079.02 507902 -127 124 -0.02 -2 +194 101 10184 99095 0.58258 297.58258 149.08258 14908.25825 0.58258 297.58258 149.08258 14908.25811 0.58258 297.58258 149.08258 14908.258 2020-01-01 2020-01-02 2020-01-01 00:03:14 2020-01-02 03:31:35 2020-01-01 00:03:14.000 2020-01-02 03:31:35.000 194 99095 49644.5 4964450 194 99095 49644.5 4964450 -32375 32560 5080.02 508002 -126 125 0.98 98 +195 101 10185 99096 0.58558 297.58558 149.08558 14908.55855 0.58558 297.58557 149.08558 14908.55842 0.58558 297.58558 149.08558000000002 14908.558 2020-01-01 2020-01-02 2020-01-01 00:03:15 2020-01-02 03:31:36 2020-01-01 00:03:15.000 2020-01-02 03:31:36.000 195 99096 49645.5 4964550 195 99096 49645.5 4964550 -32374 32561 5081.02 508102 -125 126 1.98 198 +196 101 10186 99097 0.58858 297.58858 149.08858 14908.85885 0.58858 297.5886 149.08859 14908.859 0.58858 297.58858 149.08858 14908.858 2020-01-01 2020-01-02 2020-01-01 00:03:16 2020-01-02 03:31:37 2020-01-01 00:03:16.000 2020-01-02 03:31:37.000 196 99097 49646.5 4964650 196 99097 49646.5 4964650 -32373 32562 5082.02 508202 -124 127 2.98 298 +197 101 10187 99098 0.59159 297.59159 149.09159 14909.15915 0.59159 297.59158 149.09159 14909.15931 0.59159 297.59159 149.09159 14909.159 2020-01-01 2020-01-02 2020-01-01 00:03:17 2020-01-02 03:31:38 2020-01-01 00:03:17.000 2020-01-02 03:31:38.000 197 99098 49647.5 4964750 197 99098 49647.5 4964750 -32372 32563 5083.02 508302 -128 127 1.42 142 +198 101 10188 99099 0.59459 297.59459 149.09459 14909.45945 0.59459 297.5946 149.09459 14909.4594 0.59459 297.59459 149.09459 14909.459 2020-01-01 2020-01-02 2020-01-01 00:03:18 2020-01-02 03:31:39 2020-01-01 00:03:18.000 2020-01-02 03:31:39.000 198 99099 49648.5 4964850 198 99099 49648.5 4964850 -32371 32564 5084.02 508402 -128 127 -0.14 -14 +199 101 10189 99100 0.59759 297.59759 149.09759 14909.75975 0.59759 297.5976 149.09759 14909.75958 0.59759 297.59759 149.09759 14909.759 2020-01-01 2020-01-02 2020-01-01 00:03:19 2020-01-02 03:31:40 2020-01-01 00:03:19.000 2020-01-02 03:31:40.000 199 99100 49649.5 4964950 199 99100 49649.5 4964950 -32370 32565 5085.02 508502 -128 124 -1.7 -170 +2 102 1001 9992 0.006 300.006 150.006 15150.6066 0.006 300.006 150.006 15150.6069 0.006 300.006 150.006 15150.606 2020-01-01 2020-01-02 2020-01-01 00:00:02 2020-01-02 03:45:02 2020-01-01 00:00:02.000 2020-01-02 03:45:02.000 2 99902 49952 5045152 2 99902 49952 5045152 -32567 32368 4531.009900990099 457632 -125 126 -0.9504950495049505 -96 20 102 10010 99920 0.06006 300.06006 150.06006 15156.06606 0.06006 300.06006 150.06005 15156.06593 0.06006 300.06006 150.06006 15156.06606 2020-01-01 2020-01-02 2020-01-01 00:00:20 2020-01-02 03:45:20 2020-01-01 00:00:20.000 2020-01-02 03:45:20.000 20 99920 49970 5046970 20 99920 49970 5046970 -32549 32386 4549.009900990099 459450 -126 126 -0.693069306930693 -70 -200 101 10190 99101 0.6006 297.6006 149.1006 14910.06006 0.6006 297.6006 149.10059 14910.0599 0.60060 297.60060 149.1006 14910.06000 2020-01-01 2020-01-02 2020-01-01 00:03:20 2020-01-02 03:31:41 2020-01-01 00:03:20.000 2020-01-02 03:31:41.000 200 99101 49650.5 4965050 200 99101 49650.5 4965050 -32369 32566 5086.02 508602 -127 125 -0.7 -70 -201 101 10191 99102 0.6036 297.6036 149.1036 14910.36036 0.6036 297.6036 149.1036 14910.36063 0.60360 297.60360 149.1036 14910.36000 2020-01-01 2020-01-02 2020-01-01 00:03:21 2020-01-02 03:31:42 2020-01-01 00:03:21.000 2020-01-02 03:31:42.000 201 99102 49651.5 4965150 201 99102 49651.5 4965150 -32368 32567 5087.02 508702 -126 126 0.3 30 -202 101 10192 99103 0.6066 297.6066 149.1066 14910.66066 0.6066 297.6066 149.1066 14910.66078 0.60660 297.60660 149.1066 14910.66000 2020-01-01 2020-01-02 2020-01-01 00:03:22 2020-01-02 03:31:43 2020-01-01 00:03:22.000 2020-01-02 03:31:43.000 202 99103 49652.5 4965250 202 99103 49652.5 4965250 -32367 32568 5088.02 508802 -125 127 1.3 130 -203 101 10193 99104 0.6096 297.6096 149.1096 14910.96096 0.6096 297.60962 149.1096 14910.9609 0.60960 297.60960 149.1096 14910.96000 2020-01-01 2020-01-02 2020-01-01 00:03:23 2020-01-02 03:31:44 2020-01-01 00:03:23.000 2020-01-02 03:31:44.000 203 99104 49653.5 4965350 203 99104 49653.5 4965350 -32366 32569 5089.02 508902 -128 127 -0.26 -26 -204 101 10194 99105 0.61261 297.61261 149.11261 14911.26126 0.61261 297.6126 149.11261 14911.26105 0.61261 297.61261 149.11261000000002 14911.26100 2020-01-01 2020-01-02 2020-01-01 00:03:24 2020-01-02 03:31:45 2020-01-01 00:03:24.000 2020-01-02 03:31:45.000 204 99105 49654.5 4965450 204 99105 49654.5 4965450 -32365 32570 5090.02 509002 -128 127 -1.82 -182 -205 101 10195 99106 0.61561 297.61561 149.11561 14911.56156 0.61561 297.6156 149.11561 14911.56137 0.61561 297.61561 149.11561 14911.56100 2020-01-01 2020-01-02 2020-01-01 00:03:25 2020-01-02 03:31:46 2020-01-01 00:03:25.000 2020-01-02 03:31:46.000 205 99106 49655.5 4965550 205 99106 49655.5 4965550 -32364 32571 5091.02 509102 -128 123 -3.38 -338 -206 101 10196 99107 0.61861 297.61861 149.11861 14911.86186 0.61861 297.61862 149.11862 14911.8621 0.61861 297.61861 149.11861000000002 14911.86100 2020-01-01 2020-01-02 2020-01-01 00:03:26 2020-01-02 03:31:47 2020-01-01 00:03:26.000 2020-01-02 03:31:47.000 206 99107 49656.5 4965650 206 99107 49656.5 4965650 -32363 32572 5092.02 509202 -127 124 -2.38 -238 -207 101 10197 99108 0.62162 297.62162 149.12162 14912.16216 0.62162 297.6216 149.12162 14912.16225 0.62162 297.62162 149.12162 14912.16200 2020-01-01 2020-01-02 2020-01-01 00:03:27 2020-01-02 03:31:48 2020-01-01 00:03:27.000 2020-01-02 03:31:48.000 207 99108 49657.5 4965750 207 99108 49657.5 4965750 -32362 32573 5093.02 509302 -126 125 -1.38 -138 -208 101 10198 99109 0.62462 297.62462 149.12462 14912.46246 0.62462 297.62463 149.12462 14912.46237 0.62462 297.62462 149.12462 14912.46200 2020-01-01 2020-01-02 2020-01-01 00:03:28 2020-01-02 03:31:49 2020-01-01 00:03:28.000 2020-01-02 03:31:49.000 208 99109 49658.5 4965850 208 99109 49658.5 4965850 -32361 32574 5094.02 509402 -125 126 -0.38 -38 -209 101 10199 99110 0.62762 297.62762 149.12762 14912.76276 0.62762 297.62762 149.12762 14912.76253 0.62762 297.62762 149.12762 14912.76200 2020-01-01 2020-01-02 2020-01-01 00:03:29 2020-01-02 03:31:50 2020-01-01 00:03:29.000 2020-01-02 03:31:50.000 209 99110 49659.5 4965950 209 99110 49659.5 4965950 -32360 32575 5095.02 509502 -124 127 0.62 62 +200 101 10190 99101 0.6006 297.6006 149.1006 14910.06006 0.6006 297.6006 149.10059 14910.0599 0.6006 297.6006 149.1006 14910.06 2020-01-01 2020-01-02 2020-01-01 00:03:20 2020-01-02 03:31:41 2020-01-01 00:03:20.000 2020-01-02 03:31:41.000 200 99101 49650.5 4965050 200 99101 49650.5 4965050 -32369 32566 5086.02 508602 -127 125 -0.7 -70 +201 101 10191 99102 0.6036 297.6036 149.1036 14910.36036 0.6036 297.6036 149.1036 14910.36063 0.6036 297.6036 149.1036 14910.36 2020-01-01 2020-01-02 2020-01-01 00:03:21 2020-01-02 03:31:42 2020-01-01 00:03:21.000 2020-01-02 03:31:42.000 201 99102 49651.5 4965150 201 99102 49651.5 4965150 -32368 32567 5087.02 508702 -126 126 0.3 30 +202 101 10192 99103 0.6066 297.6066 149.1066 14910.66066 0.6066 297.6066 149.1066 14910.66078 0.6066 297.6066 149.1066 14910.66 2020-01-01 2020-01-02 2020-01-01 00:03:22 2020-01-02 03:31:43 2020-01-01 00:03:22.000 2020-01-02 03:31:43.000 202 99103 49652.5 4965250 202 99103 49652.5 4965250 -32367 32568 5088.02 508802 -125 127 1.3 130 +203 101 10193 99104 0.6096 297.6096 149.1096 14910.96096 0.6096 297.60962 149.1096 14910.9609 0.6096 297.6096 149.1096 14910.96 2020-01-01 2020-01-02 2020-01-01 00:03:23 2020-01-02 03:31:44 2020-01-01 00:03:23.000 2020-01-02 03:31:44.000 203 99104 49653.5 4965350 203 99104 49653.5 4965350 -32366 32569 5089.02 508902 -128 127 -0.26 -26 +204 101 10194 99105 0.61261 297.61261 149.11261 14911.26126 0.61261 297.6126 149.11261 14911.26105 0.61261 297.61261 149.11261000000002 14911.261 2020-01-01 2020-01-02 2020-01-01 00:03:24 2020-01-02 03:31:45 2020-01-01 00:03:24.000 2020-01-02 03:31:45.000 204 99105 49654.5 4965450 204 99105 49654.5 4965450 -32365 32570 5090.02 509002 -128 127 -1.82 -182 +205 101 10195 99106 0.61561 297.61561 149.11561 14911.56156 0.61561 297.6156 149.11561 14911.56137 0.61561 297.61561 149.11561 14911.561 2020-01-01 2020-01-02 2020-01-01 00:03:25 2020-01-02 03:31:46 2020-01-01 00:03:25.000 2020-01-02 03:31:46.000 205 99106 49655.5 4965550 205 99106 49655.5 4965550 -32364 32571 5091.02 509102 -128 123 -3.38 -338 +206 101 10196 99107 0.61861 297.61861 149.11861 14911.86186 0.61861 297.61862 149.11862 14911.8621 0.61861 297.61861 149.11861000000002 14911.861 2020-01-01 2020-01-02 2020-01-01 00:03:26 2020-01-02 03:31:47 2020-01-01 00:03:26.000 2020-01-02 03:31:47.000 206 99107 49656.5 4965650 206 99107 49656.5 4965650 -32363 32572 5092.02 509202 -127 124 -2.38 -238 +207 101 10197 99108 0.62162 297.62162 149.12162 14912.16216 0.62162 297.6216 149.12162 14912.16225 0.62162 297.62162 149.12162 14912.162 2020-01-01 2020-01-02 2020-01-01 00:03:27 2020-01-02 03:31:48 2020-01-01 00:03:27.000 2020-01-02 03:31:48.000 207 99108 49657.5 4965750 207 99108 49657.5 4965750 -32362 32573 5093.02 509302 -126 125 -1.38 -138 +208 101 10198 99109 0.62462 297.62462 149.12462 14912.46246 0.62462 297.62463 149.12462 14912.46237 0.62462 297.62462 149.12462 14912.462 2020-01-01 2020-01-02 2020-01-01 00:03:28 2020-01-02 03:31:49 2020-01-01 00:03:28.000 2020-01-02 03:31:49.000 208 99109 49658.5 4965850 208 99109 49658.5 4965850 -32361 32574 5094.02 509402 -125 126 -0.38 -38 +209 101 10199 99110 0.62762 297.62762 149.12762 14912.76276 0.62762 297.62762 149.12762 14912.76253 0.62762 297.62762 149.12762 14912.762 2020-01-01 2020-01-02 2020-01-01 00:03:29 2020-01-02 03:31:50 2020-01-01 00:03:29.000 2020-01-02 03:31:50.000 209 99110 49659.5 4965950 209 99110 49659.5 4965950 -32360 32575 5095.02 509502 -124 127 0.62 62 21 102 10011 99921 0.06306 300.06306 150.06306 15156.36936 0.06306 300.06305 150.06306 15156.36927 0.06306 300.06306 150.06306 15156.36906 2020-01-01 2020-01-02 2020-01-01 00:00:21 2020-01-02 03:45:21 2020-01-01 00:00:21.000 2020-01-02 03:45:21.000 21 99921 49971 5047071 21 99921 49971 5047071 -32548 32387 4550.009900990099 459551 -125 127 0.3069306930693069 31 -210 101 10200 99111 0.63063 297.63063 149.13063 14913.06306 0.63063 297.63065 149.13063 14913.06326 0.63063 297.63063 149.13063 14913.06300 2020-01-01 2020-01-02 2020-01-01 00:03:30 2020-01-02 03:31:51 2020-01-01 00:03:30.000 2020-01-02 03:31:51.000 210 99111 49660.5 4966050 210 99111 49660.5 4966050 -32359 32576 5096.02 509602 -128 127 -0.94 -94 -211 101 10201 99112 0.63363 297.63363 149.13363 14913.36336 0.63363 297.63364 149.13363 14913.36357 0.63363 297.63363 149.13362999999998 14913.36300 2020-01-01 2020-01-02 2020-01-01 00:03:31 2020-01-02 03:31:52 2020-01-01 00:03:31.000 2020-01-02 03:31:52.000 211 99112 49661.5 4966150 211 99112 49661.5 4966150 -32358 32577 5097.02 509702 -128 123 -2.5 -250 -212 101 10202 99113 0.63663 297.63663 149.13663 14913.66366 0.63663 297.63663 149.13663 14913.66372 0.63663 297.63663 149.13663 14913.66300 2020-01-01 2020-01-02 2020-01-01 00:03:32 2020-01-02 03:31:53 2020-01-01 00:03:32.000 2020-01-02 03:31:53.000 212 99113 49662.5 4966250 212 99113 49662.5 4966250 -32357 32578 5098.02 509802 -127 124 -1.5 -150 -213 101 10203 99114 0.63963 297.63963 149.13963 14913.96396 0.63963 297.63965 149.13963 14913.96384 0.63963 297.63963 149.13963 14913.96300 2020-01-01 2020-01-02 2020-01-01 00:03:33 2020-01-02 03:31:54 2020-01-01 00:03:33.000 2020-01-02 03:31:54.000 213 99114 49663.5 4966350 213 99114 49663.5 4966350 -32356 32579 5099.02 509902 -126 125 -0.5 -50 -214 101 10204 99115 0.64264 297.64264 149.14264 14914.26426 0.64264 297.64264 149.14263 14914.26399 0.64264 297.64264 149.14264 14914.26400 2020-01-01 2020-01-02 2020-01-01 00:03:34 2020-01-02 03:31:55 2020-01-01 00:03:34.000 2020-01-02 03:31:55.000 214 99115 49664.5 4966450 214 99115 49664.5 4966450 -32355 32580 5100.02 510002 -125 126 0.5 50 -215 101 10205 99116 0.64564 297.64564 149.14564 14914.56456 0.64564 297.64566 149.14564 14914.56473 0.64564 297.64564 149.14564000000001 14914.56400 2020-01-01 2020-01-02 2020-01-01 00:03:35 2020-01-02 03:31:56 2020-01-01 00:03:35.000 2020-01-02 03:31:56.000 215 99116 49665.5 4966550 215 99116 49665.5 4966550 -32354 32581 5101.02 510102 -124 127 1.5 150 -216 101 10206 99117 0.64864 297.64864 149.14864 14914.86486 0.64864 297.64865 149.14865 14914.86504 0.64864 297.64864 149.14864 14914.86400 2020-01-01 2020-01-02 2020-01-01 00:03:36 2020-01-02 03:31:57 2020-01-01 00:03:36.000 2020-01-02 03:31:57.000 216 99117 49666.5 4966650 216 99117 49666.5 4966650 -32353 32582 5102.02 510202 -128 127 -0.06 -6 -217 101 10207 99118 0.65165 297.65165 149.15165 14915.16516 0.65165 297.65164 149.15165 14915.16523 0.65165 297.65165 149.15165000000002 14915.16500 2020-01-01 2020-01-02 2020-01-01 00:03:37 2020-01-02 03:31:58 2020-01-01 00:03:37.000 2020-01-02 03:31:58.000 217 99118 49667.5 4966750 217 99118 49667.5 4966750 -32352 32583 5103.02 510302 -128 123 -1.62 -162 -218 101 10208 99119 0.65465 297.65465 149.15465 14915.46546 0.65465 297.65466 149.15465 14915.46531 0.65465 297.65465 149.15465 14915.46500 2020-01-01 2020-01-02 2020-01-01 00:03:38 2020-01-02 03:31:59 2020-01-01 00:03:38.000 2020-01-02 03:31:59.000 218 99119 49668.5 4966850 218 99119 49668.5 4966850 -32351 32584 5104.02 510402 -127 124 -0.62 -62 -219 101 10209 99120 0.65765 297.65765 149.15765 14915.76576 0.65765 297.65765 149.15765 14915.76562 0.65765 297.65765 149.15765 14915.76500 2020-01-01 2020-01-02 2020-01-01 00:03:39 2020-01-02 03:32:00 2020-01-01 00:03:39.000 2020-01-02 03:32:00.000 219 99120 49669.5 4966950 219 99120 49669.5 4966950 -32350 32585 5105.02 510502 -126 125 0.38 38 +210 101 10200 99111 0.63063 297.63063 149.13063 14913.06306 0.63063 297.63065 149.13063 14913.06326 0.63063 297.63063 149.13063 14913.063 2020-01-01 2020-01-02 2020-01-01 00:03:30 2020-01-02 03:31:51 2020-01-01 00:03:30.000 2020-01-02 03:31:51.000 210 99111 49660.5 4966050 210 99111 49660.5 4966050 -32359 32576 5096.02 509602 -128 127 -0.94 -94 +211 101 10201 99112 0.63363 297.63363 149.13363 14913.36336 0.63363 297.63364 149.13363 14913.36357 0.63363 297.63363 149.13362999999998 14913.363 2020-01-01 2020-01-02 2020-01-01 00:03:31 2020-01-02 03:31:52 2020-01-01 00:03:31.000 2020-01-02 03:31:52.000 211 99112 49661.5 4966150 211 99112 49661.5 4966150 -32358 32577 5097.02 509702 -128 123 -2.5 -250 +212 101 10202 99113 0.63663 297.63663 149.13663 14913.66366 0.63663 297.63663 149.13663 14913.66372 0.63663 297.63663 149.13663 14913.663 2020-01-01 2020-01-02 2020-01-01 00:03:32 2020-01-02 03:31:53 2020-01-01 00:03:32.000 2020-01-02 03:31:53.000 212 99113 49662.5 4966250 212 99113 49662.5 4966250 -32357 32578 5098.02 509802 -127 124 -1.5 -150 +213 101 10203 99114 0.63963 297.63963 149.13963 14913.96396 0.63963 297.63965 149.13963 14913.96384 0.63963 297.63963 149.13963 14913.963 2020-01-01 2020-01-02 2020-01-01 00:03:33 2020-01-02 03:31:54 2020-01-01 00:03:33.000 2020-01-02 03:31:54.000 213 99114 49663.5 4966350 213 99114 49663.5 4966350 -32356 32579 5099.02 509902 -126 125 -0.5 -50 +214 101 10204 99115 0.64264 297.64264 149.14264 14914.26426 0.64264 297.64264 149.14263 14914.26399 0.64264 297.64264 149.14264 14914.264 2020-01-01 2020-01-02 2020-01-01 00:03:34 2020-01-02 03:31:55 2020-01-01 00:03:34.000 2020-01-02 03:31:55.000 214 99115 49664.5 4966450 214 99115 49664.5 4966450 -32355 32580 5100.02 510002 -125 126 0.5 50 +215 101 10205 99116 0.64564 297.64564 149.14564 14914.56456 0.64564 297.64566 149.14564 14914.56473 0.64564 297.64564 149.14564000000001 14914.564 2020-01-01 2020-01-02 2020-01-01 00:03:35 2020-01-02 03:31:56 2020-01-01 00:03:35.000 2020-01-02 03:31:56.000 215 99116 49665.5 4966550 215 99116 49665.5 4966550 -32354 32581 5101.02 510102 -124 127 1.5 150 +216 101 10206 99117 0.64864 297.64864 149.14864 14914.86486 0.64864 297.64865 149.14865 14914.86504 0.64864 297.64864 149.14864 14914.864 2020-01-01 2020-01-02 2020-01-01 00:03:36 2020-01-02 03:31:57 2020-01-01 00:03:36.000 2020-01-02 03:31:57.000 216 99117 49666.5 4966650 216 99117 49666.5 4966650 -32353 32582 5102.02 510202 -128 127 -0.06 -6 +217 101 10207 99118 0.65165 297.65165 149.15165 14915.16516 0.65165 297.65164 149.15165 14915.16523 0.65165 297.65165 149.15165000000002 14915.165 2020-01-01 2020-01-02 2020-01-01 00:03:37 2020-01-02 03:31:58 2020-01-01 00:03:37.000 2020-01-02 03:31:58.000 217 99118 49667.5 4966750 217 99118 49667.5 4966750 -32352 32583 5103.02 510302 -128 123 -1.62 -162 +218 101 10208 99119 0.65465 297.65465 149.15465 14915.46546 0.65465 297.65466 149.15465 14915.46531 0.65465 297.65465 149.15465 14915.465 2020-01-01 2020-01-02 2020-01-01 00:03:38 2020-01-02 03:31:59 2020-01-01 00:03:38.000 2020-01-02 03:31:59.000 218 99119 49668.5 4966850 218 99119 49668.5 4966850 -32351 32584 5104.02 510402 -127 124 -0.62 -62 +219 101 10209 99120 0.65765 297.65765 149.15765 14915.76576 0.65765 297.65765 149.15765 14915.76562 0.65765 297.65765 149.15765 14915.765 2020-01-01 2020-01-02 2020-01-01 00:03:39 2020-01-02 03:32:00 2020-01-01 00:03:39.000 2020-01-02 03:32:00.000 219 99120 49669.5 4966950 219 99120 49669.5 4966950 -32350 32585 5105.02 510502 -126 125 0.38 38 22 102 10012 99922 0.06606 300.06606 150.06606 15156.67267 0.06606 300.06607 150.06606 15156.67287 0.06606 300.06606 150.06606000000002 15156.67206 2020-01-01 2020-01-02 2020-01-01 00:00:22 2020-01-02 03:45:22 2020-01-01 00:00:22.000 2020-01-02 03:45:22.000 22 99922 49972 5047172 22 99922 49972 5047172 -32547 32388 4551.009900990099 459652 -128 127 -1.2277227722772277 -124 -220 101 10210 99121 0.66066 297.66066 149.16066 14916.06606 0.66066 297.66068 149.16066 14916.06619 0.66066 297.66066 149.16066 14916.06600 2020-01-01 2020-01-02 2020-01-01 00:03:40 2020-01-02 03:32:01 2020-01-01 00:03:40.000 2020-01-02 03:32:01.000 220 99121 49670.5 4967050 220 99121 49670.5 4967050 -32349 32586 5106.02 510602 -125 126 1.38 138 -221 101 10211 99122 0.66366 297.66366 149.16366 14916.36636 0.66366 297.66367 149.16366 14916.36651 0.66366 297.66366 149.16366 14916.36600 2020-01-01 2020-01-02 2020-01-01 00:03:41 2020-01-02 03:32:02 2020-01-01 00:03:41.000 2020-01-02 03:32:02.000 221 99122 49671.5 4967150 221 99122 49671.5 4967150 -32348 32587 5107.02 510702 -124 127 2.38 238 -222 101 10212 99123 0.66666 297.66666 149.16666 14916.66666 0.66666 297.66666 149.16666 14916.6667 0.66666 297.66666 149.16665999999998 14916.66600 2020-01-01 2020-01-02 2020-01-01 00:03:42 2020-01-02 03:32:03 2020-01-01 00:03:42.000 2020-01-02 03:32:03.000 222 99123 49672.5 4967250 222 99123 49672.5 4967250 -32347 32588 5108.02 510802 -128 127 0.82 82 -223 101 10213 99124 0.66966 297.66966 149.16966 14916.96696 0.66966 297.66968 149.16966 14916.96678 0.66966 297.66966 149.16966 14916.96600 2020-01-01 2020-01-02 2020-01-01 00:03:43 2020-01-02 03:32:04 2020-01-01 00:03:43.000 2020-01-02 03:32:04.000 223 99124 49673.5 4967350 223 99124 49673.5 4967350 -32346 32589 5109.02 510902 -128 127 -0.74 -74 -224 101 10214 99125 0.67267 297.67267 149.17267 14917.26726 0.67267 297.67267 149.17267 14917.26709 0.67267 297.67267 149.17267 14917.26700 2020-01-01 2020-01-02 2020-01-01 00:03:44 2020-01-02 03:32:05 2020-01-01 00:03:44.000 2020-01-02 03:32:05.000 224 99125 49674.5 4967450 224 99125 49674.5 4967450 -32345 32590 5110.02 511002 -128 124 -2.3 -230 -225 101 10215 99126 0.67567 297.67567 149.17567 14917.56756 0.67567 297.6757 149.17567 14917.56767 0.67567 297.67567 149.17567 14917.56700 2020-01-01 2020-01-02 2020-01-01 00:03:45 2020-01-02 03:32:06 2020-01-01 00:03:45.000 2020-01-02 03:32:06.000 225 99126 49675.5 4967550 225 99126 49675.5 4967550 -32344 32591 5111.02 511102 -127 125 -1.3 -130 -226 101 10216 99127 0.67867 297.67867 149.17867 14917.86786 0.67867 297.67868 149.17868 14917.86802 0.67867 297.67867 149.17867 14917.86700 2020-01-01 2020-01-02 2020-01-01 00:03:46 2020-01-02 03:32:07 2020-01-01 00:03:46.000 2020-01-02 03:32:07.000 226 99127 49676.5 4967650 226 99127 49676.5 4967650 -32343 32592 5112.02 511202 -126 126 -0.3 -30 -227 101 10217 99128 0.68168 297.68168 149.18168 14918.16816 0.68168 297.68167 149.18168 14918.16817 0.68168 297.68168 149.18168 14918.16800 2020-01-01 2020-01-02 2020-01-01 00:03:47 2020-01-02 03:32:08 2020-01-01 00:03:47.000 2020-01-02 03:32:08.000 227 99128 49677.5 4967750 227 99128 49677.5 4967750 -32342 32593 5113.02 511302 -125 127 0.7 70 -228 101 10218 99129 0.68468 297.68468 149.18468 14918.46846 0.68468 297.6847 149.18468 14918.46825 0.68468 297.68468 149.18468000000001 14918.46800 2020-01-01 2020-01-02 2020-01-01 00:03:48 2020-01-02 03:32:09 2020-01-01 00:03:48.000 2020-01-02 03:32:09.000 228 99129 49678.5 4967850 228 99129 49678.5 4967850 -32341 32594 5114.02 511402 -128 127 -0.86 -86 -229 101 10219 99130 0.68768 297.68768 149.18768 14918.76876 0.68768 297.68768 149.18768 14918.76855 0.68768 297.68768 149.18768 14918.76800 2020-01-01 2020-01-02 2020-01-01 00:03:49 2020-01-02 03:32:10 2020-01-01 00:03:49.000 2020-01-02 03:32:10.000 229 99130 49679.5 4967950 229 99130 49679.5 4967950 -32340 32595 5115.02 511502 -128 127 -2.42 -242 +220 101 10210 99121 0.66066 297.66066 149.16066 14916.06606 0.66066 297.66068 149.16066 14916.06619 0.66066 297.66066 149.16066 14916.066 2020-01-01 2020-01-02 2020-01-01 00:03:40 2020-01-02 03:32:01 2020-01-01 00:03:40.000 2020-01-02 03:32:01.000 220 99121 49670.5 4967050 220 99121 49670.5 4967050 -32349 32586 5106.02 510602 -125 126 1.38 138 +221 101 10211 99122 0.66366 297.66366 149.16366 14916.36636 0.66366 297.66367 149.16366 14916.36651 0.66366 297.66366 149.16366 14916.366 2020-01-01 2020-01-02 2020-01-01 00:03:41 2020-01-02 03:32:02 2020-01-01 00:03:41.000 2020-01-02 03:32:02.000 221 99122 49671.5 4967150 221 99122 49671.5 4967150 -32348 32587 5107.02 510702 -124 127 2.38 238 +222 101 10212 99123 0.66666 297.66666 149.16666 14916.66666 0.66666 297.66666 149.16666 14916.6667 0.66666 297.66666 149.16665999999998 14916.666 2020-01-01 2020-01-02 2020-01-01 00:03:42 2020-01-02 03:32:03 2020-01-01 00:03:42.000 2020-01-02 03:32:03.000 222 99123 49672.5 4967250 222 99123 49672.5 4967250 -32347 32588 5108.02 510802 -128 127 0.82 82 +223 101 10213 99124 0.66966 297.66966 149.16966 14916.96696 0.66966 297.66968 149.16966 14916.96678 0.66966 297.66966 149.16966 14916.966 2020-01-01 2020-01-02 2020-01-01 00:03:43 2020-01-02 03:32:04 2020-01-01 00:03:43.000 2020-01-02 03:32:04.000 223 99124 49673.5 4967350 223 99124 49673.5 4967350 -32346 32589 5109.02 510902 -128 127 -0.74 -74 +224 101 10214 99125 0.67267 297.67267 149.17267 14917.26726 0.67267 297.67267 149.17267 14917.26709 0.67267 297.67267 149.17267 14917.267 2020-01-01 2020-01-02 2020-01-01 00:03:44 2020-01-02 03:32:05 2020-01-01 00:03:44.000 2020-01-02 03:32:05.000 224 99125 49674.5 4967450 224 99125 49674.5 4967450 -32345 32590 5110.02 511002 -128 124 -2.3 -230 +225 101 10215 99126 0.67567 297.67567 149.17567 14917.56756 0.67567 297.6757 149.17567 14917.56767 0.67567 297.67567 149.17567 14917.567 2020-01-01 2020-01-02 2020-01-01 00:03:45 2020-01-02 03:32:06 2020-01-01 00:03:45.000 2020-01-02 03:32:06.000 225 99126 49675.5 4967550 225 99126 49675.5 4967550 -32344 32591 5111.02 511102 -127 125 -1.3 -130 +226 101 10216 99127 0.67867 297.67867 149.17867 14917.86786 0.67867 297.67868 149.17868 14917.86802 0.67867 297.67867 149.17867 14917.867 2020-01-01 2020-01-02 2020-01-01 00:03:46 2020-01-02 03:32:07 2020-01-01 00:03:46.000 2020-01-02 03:32:07.000 226 99127 49676.5 4967650 226 99127 49676.5 4967650 -32343 32592 5112.02 511202 -126 126 -0.3 -30 +227 101 10217 99128 0.68168 297.68168 149.18168 14918.16816 0.68168 297.68167 149.18168 14918.16817 0.68168 297.68168 149.18168 14918.168 2020-01-01 2020-01-02 2020-01-01 00:03:47 2020-01-02 03:32:08 2020-01-01 00:03:47.000 2020-01-02 03:32:08.000 227 99128 49677.5 4967750 227 99128 49677.5 4967750 -32342 32593 5113.02 511302 -125 127 0.7 70 +228 101 10218 99129 0.68468 297.68468 149.18468 14918.46846 0.68468 297.6847 149.18468 14918.46825 0.68468 297.68468 149.18468000000001 14918.468 2020-01-01 2020-01-02 2020-01-01 00:03:48 2020-01-02 03:32:09 2020-01-01 00:03:48.000 2020-01-02 03:32:09.000 228 99129 49678.5 4967850 228 99129 49678.5 4967850 -32341 32594 5114.02 511402 -128 127 -0.86 -86 +229 101 10219 99130 0.68768 297.68768 149.18768 14918.76876 0.68768 297.68768 149.18768 14918.76855 0.68768 297.68768 149.18768 14918.768 2020-01-01 2020-01-02 2020-01-01 00:03:49 2020-01-02 03:32:10 2020-01-01 00:03:49.000 2020-01-02 03:32:10.000 229 99130 49679.5 4967950 229 99130 49679.5 4967950 -32340 32595 5115.02 511502 -128 127 -2.42 -242 23 102 10013 99923 0.06906 300.06906 150.06906 15156.97597 0.06906 300.06906 150.06907 15156.97617 0.06906 300.06906 150.06906 15156.97506 2020-01-01 2020-01-02 2020-01-01 00:00:23 2020-01-02 03:45:23 2020-01-01 00:00:23.000 2020-01-02 03:45:23.000 23 99923 49973 5047273 23 99923 49973 5047273 -32546 32389 4552.009900990099 459753 -128 127 -2.762376237623762 -279 -230 101 10220 99131 0.69069 297.69069 149.19069 14919.06906 0.69069 297.6907 149.19069 14919.06914 0.69069 297.69069 149.19069 14919.06900 2020-01-01 2020-01-02 2020-01-01 00:03:50 2020-01-02 03:32:11 2020-01-01 00:03:50.000 2020-01-02 03:32:11.000 230 99131 49680.5 4968050 230 99131 49680.5 4968050 -32339 32596 5116.02 511602 -128 123 -3.98 -398 -231 101 10221 99132 0.69369 297.69369 149.19369 14919.36936 0.69369 297.6937 149.19369 14919.36949 0.69369 297.69369 149.19369 14919.36900 2020-01-01 2020-01-02 2020-01-01 00:03:51 2020-01-02 03:32:12 2020-01-01 00:03:51.000 2020-01-02 03:32:12.000 231 99132 49681.5 4968150 231 99132 49681.5 4968150 -32338 32597 5117.02 511702 -127 124 -2.98 -298 -232 101 10222 99133 0.69669 297.69669 149.19669 14919.66966 0.69669 297.6967 149.19669 14919.66964 0.69669 297.69669 149.19669 14919.66900 2020-01-01 2020-01-02 2020-01-01 00:03:52 2020-01-02 03:32:13 2020-01-01 00:03:52.000 2020-01-02 03:32:13.000 232 99133 49682.5 4968250 232 99133 49682.5 4968250 -32337 32598 5118.02 511802 -126 125 -1.98 -198 -233 101 10223 99134 0.69969 297.69969 149.19969 14919.96996 0.69969 297.6997 149.1997 14919.97037 0.69969 297.69969 149.19969 14919.96900 2020-01-01 2020-01-02 2020-01-01 00:03:53 2020-01-02 03:32:14 2020-01-01 00:03:53.000 2020-01-02 03:32:14.000 233 99134 49683.5 4968350 233 99134 49683.5 4968350 -32336 32599 5119.02 511902 -125 126 -0.98 -98 -234 101 10224 99135 0.7027 297.7027 149.2027 14920.27027 0.7027 297.7027 149.2027 14920.27003 0.70270 297.70270 149.2027 14920.27000 2020-01-01 2020-01-02 2020-01-01 00:03:54 2020-01-02 03:32:15 2020-01-01 00:03:54.000 2020-01-02 03:32:15.000 234 99135 49684.5 4968450 234 99135 49684.5 4968450 -32335 32600 5120.02 512002 -124 127 0.02 2 -235 101 10225 99136 0.7057 297.7057 149.2057 14920.57057 0.7057 297.70572 149.2057 14920.57065 0.70570 297.70570 149.2057 14920.57000 2020-01-01 2020-01-02 2020-01-01 00:03:55 2020-01-02 03:32:16 2020-01-01 00:03:55.000 2020-01-02 03:32:16.000 235 99136 49685.5 4968550 235 99136 49685.5 4968550 -32334 32601 5121.02 512102 -128 127 -1.54 -154 -236 101 10226 99137 0.7087 297.7087 149.2087 14920.87087 0.7087 297.7087 149.2087 14920.87095 0.70870 297.70870 149.20870000000002 14920.87000 2020-01-01 2020-01-02 2020-01-01 00:03:56 2020-01-02 03:32:17 2020-01-01 00:03:56.000 2020-01-02 03:32:17.000 236 99137 49686.5 4968650 236 99137 49686.5 4968650 -32333 32602 5122.02 512202 -128 123 -3.1 -310 -237 101 10227 99138 0.71171 297.71171 149.21171 14921.17117 0.71171 297.7117 149.21171 14921.17111 0.71171 297.71171 149.21171 14921.17100 2020-01-01 2020-01-02 2020-01-01 00:03:57 2020-01-02 03:32:18 2020-01-01 00:03:57.000 2020-01-02 03:32:18.000 237 99138 49687.5 4968750 237 99138 49687.5 4968750 -32332 32603 5123.02 512302 -127 124 -2.1 -210 -238 101 10228 99139 0.71471 297.71471 149.21471 14921.47147 0.71471 297.71472 149.21471 14921.47184 0.71471 297.71471 149.21471 14921.47100 2020-01-01 2020-01-02 2020-01-01 00:03:58 2020-01-02 03:32:19 2020-01-01 00:03:58.000 2020-01-02 03:32:19.000 238 99139 49688.5 4968850 238 99139 49688.5 4968850 -32331 32604 5124.02 512402 -126 125 -1.1 -110 -239 101 10229 99140 0.71771 297.71771 149.21771 14921.77177 0.71771 297.7177 149.21771 14921.7715 0.71771 297.71771 149.21771 14921.77100 2020-01-01 2020-01-02 2020-01-01 00:03:59 2020-01-02 03:32:20 2020-01-01 00:03:59.000 2020-01-02 03:32:20.000 239 99140 49689.5 4968950 239 99140 49689.5 4968950 -32330 32605 5125.02 512502 -125 126 -0.1 -10 +230 101 10220 99131 0.69069 297.69069 149.19069 14919.06906 0.69069 297.6907 149.19069 14919.06914 0.69069 297.69069 149.19069 14919.069 2020-01-01 2020-01-02 2020-01-01 00:03:50 2020-01-02 03:32:11 2020-01-01 00:03:50.000 2020-01-02 03:32:11.000 230 99131 49680.5 4968050 230 99131 49680.5 4968050 -32339 32596 5116.02 511602 -128 123 -3.98 -398 +231 101 10221 99132 0.69369 297.69369 149.19369 14919.36936 0.69369 297.6937 149.19369 14919.36949 0.69369 297.69369 149.19369 14919.369 2020-01-01 2020-01-02 2020-01-01 00:03:51 2020-01-02 03:32:12 2020-01-01 00:03:51.000 2020-01-02 03:32:12.000 231 99132 49681.5 4968150 231 99132 49681.5 4968150 -32338 32597 5117.02 511702 -127 124 -2.98 -298 +232 101 10222 99133 0.69669 297.69669 149.19669 14919.66966 0.69669 297.6967 149.19669 14919.66964 0.69669 297.69669 149.19669 14919.669 2020-01-01 2020-01-02 2020-01-01 00:03:52 2020-01-02 03:32:13 2020-01-01 00:03:52.000 2020-01-02 03:32:13.000 232 99133 49682.5 4968250 232 99133 49682.5 4968250 -32337 32598 5118.02 511802 -126 125 -1.98 -198 +233 101 10223 99134 0.69969 297.69969 149.19969 14919.96996 0.69969 297.6997 149.1997 14919.97037 0.69969 297.69969 149.19969 14919.969 2020-01-01 2020-01-02 2020-01-01 00:03:53 2020-01-02 03:32:14 2020-01-01 00:03:53.000 2020-01-02 03:32:14.000 233 99134 49683.5 4968350 233 99134 49683.5 4968350 -32336 32599 5119.02 511902 -125 126 -0.98 -98 +234 101 10224 99135 0.7027 297.7027 149.2027 14920.27027 0.7027 297.7027 149.2027 14920.27003 0.7027 297.7027 149.2027 14920.27 2020-01-01 2020-01-02 2020-01-01 00:03:54 2020-01-02 03:32:15 2020-01-01 00:03:54.000 2020-01-02 03:32:15.000 234 99135 49684.5 4968450 234 99135 49684.5 4968450 -32335 32600 5120.02 512002 -124 127 0.02 2 +235 101 10225 99136 0.7057 297.7057 149.2057 14920.57057 0.7057 297.70572 149.2057 14920.57065 0.7057 297.7057 149.2057 14920.57 2020-01-01 2020-01-02 2020-01-01 00:03:55 2020-01-02 03:32:16 2020-01-01 00:03:55.000 2020-01-02 03:32:16.000 235 99136 49685.5 4968550 235 99136 49685.5 4968550 -32334 32601 5121.02 512102 -128 127 -1.54 -154 +236 101 10226 99137 0.7087 297.7087 149.2087 14920.87087 0.7087 297.7087 149.2087 14920.87095 0.7087 297.7087 149.20870000000002 14920.87 2020-01-01 2020-01-02 2020-01-01 00:03:56 2020-01-02 03:32:17 2020-01-01 00:03:56.000 2020-01-02 03:32:17.000 236 99137 49686.5 4968650 236 99137 49686.5 4968650 -32333 32602 5122.02 512202 -128 123 -3.1 -310 +237 101 10227 99138 0.71171 297.71171 149.21171 14921.17117 0.71171 297.7117 149.21171 14921.17111 0.71171 297.71171 149.21171 14921.171 2020-01-01 2020-01-02 2020-01-01 00:03:57 2020-01-02 03:32:18 2020-01-01 00:03:57.000 2020-01-02 03:32:18.000 237 99138 49687.5 4968750 237 99138 49687.5 4968750 -32332 32603 5123.02 512302 -127 124 -2.1 -210 +238 101 10228 99139 0.71471 297.71471 149.21471 14921.47147 0.71471 297.71472 149.21471 14921.47184 0.71471 297.71471 149.21471 14921.471 2020-01-01 2020-01-02 2020-01-01 00:03:58 2020-01-02 03:32:19 2020-01-01 00:03:58.000 2020-01-02 03:32:19.000 238 99139 49688.5 4968850 238 99139 49688.5 4968850 -32331 32604 5124.02 512402 -126 125 -1.1 -110 +239 101 10229 99140 0.71771 297.71771 149.21771 14921.77177 0.71771 297.7177 149.21771 14921.7715 0.71771 297.71771 149.21771 14921.771 2020-01-01 2020-01-02 2020-01-01 00:03:59 2020-01-02 03:32:20 2020-01-01 00:03:59.000 2020-01-02 03:32:20.000 239 99140 49689.5 4968950 239 99140 49689.5 4968950 -32330 32605 5125.02 512502 -125 126 -0.1 -10 24 102 10014 99924 0.07207 300.07207 150.07207 15157.27927 0.07207 300.07208 150.07207 15157.27928 0.07207 300.07207 150.07207 15157.27907 2020-01-01 2020-01-02 2020-01-01 00:00:24 2020-01-02 03:45:24 2020-01-01 00:00:24.000 2020-01-02 03:45:24.000 24 99924 49974 5047374 24 99924 49974 5047374 -32545 32390 4553.009900990099 459854 -128 123 -4.297029702970297 -434 -240 101 10230 99141 0.72072 297.72072 149.22072 14922.07207 0.72072 297.72073 149.22072 14922.07211 0.72072 297.72072 149.22072 14922.07200 2020-01-01 2020-01-02 2020-01-01 00:04:00 2020-01-02 03:32:21 2020-01-01 00:04:00.000 2020-01-02 03:32:21.000 240 99141 49690.5 4969050 240 99141 49690.5 4969050 -32329 32606 5126.02 512602 -124 127 0.9 90 -241 101 10231 99142 0.72372 297.72372 149.22372 14922.37237 0.72372 297.72372 149.22372 14922.37243 0.72372 297.72372 149.22372 14922.37200 2020-01-01 2020-01-02 2020-01-01 00:04:01 2020-01-02 03:32:22 2020-01-01 00:04:01.000 2020-01-02 03:32:22.000 241 99142 49691.5 4969150 241 99142 49691.5 4969150 -32328 32607 5127.02 512702 -128 127 -0.66 -66 -242 101 10232 99143 0.72672 297.72672 149.22672 14922.67267 0.72672 297.7267 149.22672 14922.67273 0.72672 297.72672 149.22672 14922.67200 2020-01-01 2020-01-02 2020-01-01 00:04:02 2020-01-02 03:32:23 2020-01-01 00:04:02.000 2020-01-02 03:32:23.000 242 99143 49692.5 4969250 242 99143 49692.5 4969250 -32327 32608 5128.02 512802 -128 123 -2.22 -222 -243 101 10233 99144 0.72972 297.72972 149.22972 14922.97297 0.72972 297.72974 149.22973 14922.97332 0.72972 297.72972 149.22972 14922.97200 2020-01-01 2020-01-02 2020-01-01 00:04:03 2020-01-02 03:32:24 2020-01-01 00:04:03.000 2020-01-02 03:32:24.000 243 99144 49693.5 4969350 243 99144 49693.5 4969350 -32326 32609 5129.02 512902 -127 124 -1.22 -122 -244 101 10234 99145 0.73273 297.73273 149.23273 14923.27327 0.73273 297.73273 149.23272 14923.27297 0.73273 297.73273 149.23273 14923.27300 2020-01-01 2020-01-02 2020-01-01 00:04:04 2020-01-02 03:32:25 2020-01-01 00:04:04.000 2020-01-02 03:32:25.000 244 99145 49694.5 4969450 244 99145 49694.5 4969450 -32325 32610 5130.02 513002 -126 125 -0.22 -22 -245 101 10235 99146 0.73573 297.73573 149.23573 14923.57357 0.73573 297.73575 149.23573 14923.57358 0.73573 297.73573 149.23573 14923.57300 2020-01-01 2020-01-02 2020-01-01 00:04:05 2020-01-02 03:32:26 2020-01-01 00:04:05.000 2020-01-02 03:32:26.000 245 99146 49695.5 4969550 245 99146 49695.5 4969550 -32324 32611 5131.02 513102 -125 126 0.78 78 -246 101 10236 99147 0.73873 297.73873 149.23873 14923.87387 0.73873 297.73874 149.23873 14923.8739 0.73873 297.73873 149.23873 14923.87300 2020-01-01 2020-01-02 2020-01-01 00:04:06 2020-01-02 03:32:27 2020-01-01 00:04:06.000 2020-01-02 03:32:27.000 246 99147 49696.5 4969650 246 99147 49696.5 4969650 -32323 32612 5132.02 513202 -124 127 1.78 178 -247 101 10237 99148 0.74174 297.74174 149.24174 14924.17417 0.74174 297.74173 149.24174 14924.1742 0.74174 297.74174 149.24174000000002 14924.17400 2020-01-01 2020-01-02 2020-01-01 00:04:07 2020-01-02 03:32:28 2020-01-01 00:04:07.000 2020-01-02 03:32:28.000 247 99148 49697.5 4969750 247 99148 49697.5 4969750 -32322 32613 5133.02 513302 -128 127 0.22 22 -248 101 10238 99149 0.74474 297.74474 149.24474 14924.47447 0.74474 297.74475 149.24474 14924.47478 0.74474 297.74474 149.24474 14924.47400 2020-01-01 2020-01-02 2020-01-01 00:04:08 2020-01-02 03:32:29 2020-01-01 00:04:08.000 2020-01-02 03:32:29.000 248 99149 49698.5 4969850 248 99149 49698.5 4969850 -32321 32614 5134.02 513402 -128 127 -1.34 -134 -249 101 10239 99150 0.74774 297.74774 149.24774 14924.77477 0.74774 297.74774 149.24774 14924.77447 0.74774 297.74774 149.24774 14924.77400 2020-01-01 2020-01-02 2020-01-01 00:04:09 2020-01-02 03:32:30 2020-01-01 00:04:09.000 2020-01-02 03:32:30.000 249 99150 49699.5 4969950 249 99150 49699.5 4969950 -32320 32615 5135.02 513502 -128 124 -2.9 -290 +240 101 10230 99141 0.72072 297.72072 149.22072 14922.07207 0.72072 297.72073 149.22072 14922.07211 0.72072 297.72072 149.22072 14922.072 2020-01-01 2020-01-02 2020-01-01 00:04:00 2020-01-02 03:32:21 2020-01-01 00:04:00.000 2020-01-02 03:32:21.000 240 99141 49690.5 4969050 240 99141 49690.5 4969050 -32329 32606 5126.02 512602 -124 127 0.9 90 +241 101 10231 99142 0.72372 297.72372 149.22372 14922.37237 0.72372 297.72372 149.22372 14922.37243 0.72372 297.72372 149.22372 14922.372 2020-01-01 2020-01-02 2020-01-01 00:04:01 2020-01-02 03:32:22 2020-01-01 00:04:01.000 2020-01-02 03:32:22.000 241 99142 49691.5 4969150 241 99142 49691.5 4969150 -32328 32607 5127.02 512702 -128 127 -0.66 -66 +242 101 10232 99143 0.72672 297.72672 149.22672 14922.67267 0.72672 297.7267 149.22672 14922.67273 0.72672 297.72672 149.22672 14922.672 2020-01-01 2020-01-02 2020-01-01 00:04:02 2020-01-02 03:32:23 2020-01-01 00:04:02.000 2020-01-02 03:32:23.000 242 99143 49692.5 4969250 242 99143 49692.5 4969250 -32327 32608 5128.02 512802 -128 123 -2.22 -222 +243 101 10233 99144 0.72972 297.72972 149.22972 14922.97297 0.72972 297.72974 149.22973 14922.97332 0.72972 297.72972 149.22972 14922.972 2020-01-01 2020-01-02 2020-01-01 00:04:03 2020-01-02 03:32:24 2020-01-01 00:04:03.000 2020-01-02 03:32:24.000 243 99144 49693.5 4969350 243 99144 49693.5 4969350 -32326 32609 5129.02 512902 -127 124 -1.22 -122 +244 101 10234 99145 0.73273 297.73273 149.23273 14923.27327 0.73273 297.73273 149.23272 14923.27297 0.73273 297.73273 149.23273 14923.273 2020-01-01 2020-01-02 2020-01-01 00:04:04 2020-01-02 03:32:25 2020-01-01 00:04:04.000 2020-01-02 03:32:25.000 244 99145 49694.5 4969450 244 99145 49694.5 4969450 -32325 32610 5130.02 513002 -126 125 -0.22 -22 +245 101 10235 99146 0.73573 297.73573 149.23573 14923.57357 0.73573 297.73575 149.23573 14923.57358 0.73573 297.73573 149.23573 14923.573 2020-01-01 2020-01-02 2020-01-01 00:04:05 2020-01-02 03:32:26 2020-01-01 00:04:05.000 2020-01-02 03:32:26.000 245 99146 49695.5 4969550 245 99146 49695.5 4969550 -32324 32611 5131.02 513102 -125 126 0.78 78 +246 101 10236 99147 0.73873 297.73873 149.23873 14923.87387 0.73873 297.73874 149.23873 14923.8739 0.73873 297.73873 149.23873 14923.873 2020-01-01 2020-01-02 2020-01-01 00:04:06 2020-01-02 03:32:27 2020-01-01 00:04:06.000 2020-01-02 03:32:27.000 246 99147 49696.5 4969650 246 99147 49696.5 4969650 -32323 32612 5132.02 513202 -124 127 1.78 178 +247 101 10237 99148 0.74174 297.74174 149.24174 14924.17417 0.74174 297.74173 149.24174 14924.1742 0.74174 297.74174 149.24174000000002 14924.174 2020-01-01 2020-01-02 2020-01-01 00:04:07 2020-01-02 03:32:28 2020-01-01 00:04:07.000 2020-01-02 03:32:28.000 247 99148 49697.5 4969750 247 99148 49697.5 4969750 -32322 32613 5133.02 513302 -128 127 0.22 22 +248 101 10238 99149 0.74474 297.74474 149.24474 14924.47447 0.74474 297.74475 149.24474 14924.47478 0.74474 297.74474 149.24474 14924.474 2020-01-01 2020-01-02 2020-01-01 00:04:08 2020-01-02 03:32:29 2020-01-01 00:04:08.000 2020-01-02 03:32:29.000 248 99149 49698.5 4969850 248 99149 49698.5 4969850 -32321 32614 5134.02 513402 -128 127 -1.34 -134 +249 101 10239 99150 0.74774 297.74774 149.24774 14924.77477 0.74774 297.74774 149.24774 14924.77447 0.74774 297.74774 149.24774 14924.774 2020-01-01 2020-01-02 2020-01-01 00:04:09 2020-01-02 03:32:30 2020-01-01 00:04:09.000 2020-01-02 03:32:30.000 249 99150 49699.5 4969950 249 99150 49699.5 4969950 -32320 32615 5135.02 513502 -128 124 -2.9 -290 25 102 10015 99925 0.07507 300.07507 150.07507 15157.58258 0.07507 300.07507 150.07507 15157.58241 0.07507 300.07507 150.07507 15157.58207 2020-01-01 2020-01-02 2020-01-01 00:00:25 2020-01-02 03:45:25 2020-01-01 00:00:25.000 2020-01-02 03:45:25.000 25 99925 49975 5047475 25 99925 49975 5047475 -32544 32391 4554.009900990099 459955 -127 124 -3.297029702970297 -333 -250 101 10240 99151 0.75075 297.75075 149.25075 14925.07507 0.75075 297.75076 149.25075 14925.07506 0.75075 297.75075 149.25075 14925.07500 2020-01-01 2020-01-02 2020-01-01 00:04:10 2020-01-02 03:32:31 2020-01-01 00:04:10.000 2020-01-02 03:32:31.000 250 99151 49700.5 4970050 250 99151 49700.5 4970050 -32319 32616 5136.02 513602 -127 125 -1.9 -190 -251 101 10241 99152 0.75375 297.75375 149.25375 14925.37537 0.75375 297.75375 149.25375 14925.37536 0.75375 297.75375 149.25375 14925.37500 2020-01-01 2020-01-02 2020-01-01 00:04:11 2020-01-02 03:32:32 2020-01-01 00:04:11.000 2020-01-02 03:32:32.000 251 99152 49701.5 4970150 251 99152 49701.5 4970150 -32318 32617 5137.02 513702 -126 126 -0.9 -90 -252 101 10242 99153 0.75675 297.75675 149.25675 14925.67567 0.75675 297.75674 149.25675 14925.67567 0.75675 297.75675 149.25674999999998 14925.67500 2020-01-01 2020-01-02 2020-01-01 00:04:12 2020-01-02 03:32:33 2020-01-01 00:04:12.000 2020-01-02 03:32:33.000 252 99153 49702.5 4970250 252 99153 49702.5 4970250 -32317 32618 5138.02 513802 -125 127 0.1 10 -253 101 10243 99154 0.75975 297.75975 149.25975 14925.97597 0.75975 297.75977 149.25976 14925.97625 0.75975 297.75975 149.25975 14925.97500 2020-01-01 2020-01-02 2020-01-01 00:04:13 2020-01-02 03:32:34 2020-01-01 00:04:13.000 2020-01-02 03:32:34.000 253 99154 49703.5 4970350 253 99154 49703.5 4970350 -32316 32619 5139.02 513902 -128 127 -1.46 -146 -254 101 10244 99155 0.76276 297.76276 149.26276 14926.27627 0.76276 297.76276 149.26275 14926.27594 0.76276 297.76276 149.26276 14926.27600 2020-01-01 2020-01-02 2020-01-01 00:04:14 2020-01-02 03:32:35 2020-01-01 00:04:14.000 2020-01-02 03:32:35.000 254 99155 49704.5 4970450 254 99155 49704.5 4970450 -32315 32620 5140.02 514002 -128 127 -3.02 -302 -255 101 10245 99156 0.76576 297.76576 149.26576 14926.57657 0.76576 297.76578 149.26576 14926.57652 0.76576 297.76576 149.26576 14926.57600 2020-01-01 2020-01-02 2020-01-01 00:04:15 2020-01-02 03:32:36 2020-01-01 00:04:15.000 2020-01-02 03:32:36.000 255 99156 49705.5 4970550 255 99156 49705.5 4970550 -32314 32621 5141.02 514102 -128 123 -4.58 -458 -256 101 10246 99157 0.76876 297.76876 149.26876 14926.87687 0.76876 297.76877 149.26876 14926.87683 0.76876 297.76876 149.26876000000001 14926.87600 2020-01-01 2020-01-02 2020-01-01 00:04:16 2020-01-02 03:32:37 2020-01-01 00:04:16.000 2020-01-02 03:32:37.000 256 99157 49706.5 4970650 256 99157 49706.5 4970650 -32313 32622 5142.02 514202 -127 124 -3.58 -358 -257 101 10247 99158 0.77177 297.77177 149.27177 14927.17717 0.77177 297.77176 149.27177 14927.17714 0.77177 297.77177 149.27177 14927.17700 2020-01-01 2020-01-02 2020-01-01 00:04:17 2020-01-02 03:32:38 2020-01-01 00:04:17.000 2020-01-02 03:32:38.000 257 99158 49707.5 4970750 257 99158 49707.5 4970750 -32312 32623 5143.02 514302 -126 125 -2.58 -258 -258 101 10248 99159 0.77477 297.77477 149.27477 14927.47747 0.77477 297.77478 149.27477 14927.47776 0.77477 297.77477 149.27477000000002 14927.47700 2020-01-01 2020-01-02 2020-01-01 00:04:18 2020-01-02 03:32:39 2020-01-01 00:04:18.000 2020-01-02 03:32:39.000 258 99159 49708.5 4970850 258 99159 49708.5 4970850 -32311 32624 5144.02 514402 -125 126 -1.58 -158 -259 101 10249 99160 0.77777 297.77777 149.27777 14927.77777 0.77777 297.77777 149.27777 14927.77742 0.77777 297.77777 149.27777 14927.77700 2020-01-01 2020-01-02 2020-01-01 00:04:19 2020-01-02 03:32:40 2020-01-01 00:04:19.000 2020-01-02 03:32:40.000 259 99160 49709.5 4970950 259 99160 49709.5 4970950 -32310 32625 5145.02 514502 -124 127 -0.58 -58 +250 101 10240 99151 0.75075 297.75075 149.25075 14925.07507 0.75075 297.75076 149.25075 14925.07506 0.75075 297.75075 149.25075 14925.075 2020-01-01 2020-01-02 2020-01-01 00:04:10 2020-01-02 03:32:31 2020-01-01 00:04:10.000 2020-01-02 03:32:31.000 250 99151 49700.5 4970050 250 99151 49700.5 4970050 -32319 32616 5136.02 513602 -127 125 -1.9 -190 +251 101 10241 99152 0.75375 297.75375 149.25375 14925.37537 0.75375 297.75375 149.25375 14925.37536 0.75375 297.75375 149.25375 14925.375 2020-01-01 2020-01-02 2020-01-01 00:04:11 2020-01-02 03:32:32 2020-01-01 00:04:11.000 2020-01-02 03:32:32.000 251 99152 49701.5 4970150 251 99152 49701.5 4970150 -32318 32617 5137.02 513702 -126 126 -0.9 -90 +252 101 10242 99153 0.75675 297.75675 149.25675 14925.67567 0.75675 297.75674 149.25675 14925.67567 0.75675 297.75675 149.25674999999998 14925.675 2020-01-01 2020-01-02 2020-01-01 00:04:12 2020-01-02 03:32:33 2020-01-01 00:04:12.000 2020-01-02 03:32:33.000 252 99153 49702.5 4970250 252 99153 49702.5 4970250 -32317 32618 5138.02 513802 -125 127 0.1 10 +253 101 10243 99154 0.75975 297.75975 149.25975 14925.97597 0.75975 297.75977 149.25976 14925.97625 0.75975 297.75975 149.25975 14925.975 2020-01-01 2020-01-02 2020-01-01 00:04:13 2020-01-02 03:32:34 2020-01-01 00:04:13.000 2020-01-02 03:32:34.000 253 99154 49703.5 4970350 253 99154 49703.5 4970350 -32316 32619 5139.02 513902 -128 127 -1.46 -146 +254 101 10244 99155 0.76276 297.76276 149.26276 14926.27627 0.76276 297.76276 149.26275 14926.27594 0.76276 297.76276 149.26276 14926.276 2020-01-01 2020-01-02 2020-01-01 00:04:14 2020-01-02 03:32:35 2020-01-01 00:04:14.000 2020-01-02 03:32:35.000 254 99155 49704.5 4970450 254 99155 49704.5 4970450 -32315 32620 5140.02 514002 -128 127 -3.02 -302 +255 101 10245 99156 0.76576 297.76576 149.26576 14926.57657 0.76576 297.76578 149.26576 14926.57652 0.76576 297.76576 149.26576 14926.576 2020-01-01 2020-01-02 2020-01-01 00:04:15 2020-01-02 03:32:36 2020-01-01 00:04:15.000 2020-01-02 03:32:36.000 255 99156 49705.5 4970550 255 99156 49705.5 4970550 -32314 32621 5141.02 514102 -128 123 -4.58 -458 +256 101 10246 99157 0.76876 297.76876 149.26876 14926.87687 0.76876 297.76877 149.26876 14926.87683 0.76876 297.76876 149.26876000000001 14926.876 2020-01-01 2020-01-02 2020-01-01 00:04:16 2020-01-02 03:32:37 2020-01-01 00:04:16.000 2020-01-02 03:32:37.000 256 99157 49706.5 4970650 256 99157 49706.5 4970650 -32313 32622 5142.02 514202 -127 124 -3.58 -358 +257 101 10247 99158 0.77177 297.77177 149.27177 14927.17717 0.77177 297.77176 149.27177 14927.17714 0.77177 297.77177 149.27177 14927.177 2020-01-01 2020-01-02 2020-01-01 00:04:17 2020-01-02 03:32:38 2020-01-01 00:04:17.000 2020-01-02 03:32:38.000 257 99158 49707.5 4970750 257 99158 49707.5 4970750 -32312 32623 5143.02 514302 -126 125 -2.58 -258 +258 101 10248 99159 0.77477 297.77477 149.27477 14927.47747 0.77477 297.77478 149.27477 14927.47776 0.77477 297.77477 149.27477000000002 14927.477 2020-01-01 2020-01-02 2020-01-01 00:04:18 2020-01-02 03:32:39 2020-01-01 00:04:18.000 2020-01-02 03:32:39.000 258 99159 49708.5 4970850 258 99159 49708.5 4970850 -32311 32624 5144.02 514402 -125 126 -1.58 -158 +259 101 10249 99160 0.77777 297.77777 149.27777 14927.77777 0.77777 297.77777 149.27777 14927.77742 0.77777 297.77777 149.27777 14927.777 2020-01-01 2020-01-02 2020-01-01 00:04:19 2020-01-02 03:32:40 2020-01-01 00:04:19.000 2020-01-02 03:32:40.000 259 99160 49709.5 4970950 259 99160 49709.5 4970950 -32310 32625 5145.02 514502 -124 127 -0.58 -58 26 102 10016 99926 0.07807 300.07807 150.07807 15157.88588 0.07807 300.07806 150.07807 15157.88575 0.07807 300.07807 150.07807 15157.88507 2020-01-01 2020-01-02 2020-01-01 00:00:26 2020-01-02 03:45:26 2020-01-01 00:00:26.000 2020-01-02 03:45:26.000 26 99926 49976 5047576 26 99926 49976 5047576 -32543 32392 4555.009900990099 460056 -126 125 -2.297029702970297 -232 -260 101 10250 99161 0.78078 297.78078 149.28078 14928.07807 0.78078 297.7808 149.28077 14928.07799 0.78078 297.78078 149.28078 14928.07800 2020-01-01 2020-01-02 2020-01-01 00:04:20 2020-01-02 03:32:41 2020-01-01 00:04:20.000 2020-01-02 03:32:41.000 260 99161 49710.5 4971050 260 99161 49710.5 4971050 -32309 32626 5146.02 514602 -128 127 -2.14 -214 -261 101 10251 99162 0.78378 297.78378 149.28378 14928.37837 0.78378 297.78378 149.28378 14928.3783 0.78378 297.78378 149.28378 14928.37800 2020-01-01 2020-01-02 2020-01-01 00:04:21 2020-01-02 03:32:42 2020-01-01 00:04:21.000 2020-01-02 03:32:42.000 261 99162 49711.5 4971150 261 99162 49711.5 4971150 -32308 32627 5147.02 514702 -128 123 -3.7 -370 -262 101 10252 99163 0.78678 297.78678 149.28678 14928.67867 0.78678 297.78677 149.28678 14928.67861 0.78678 297.78678 149.28678 14928.67800 2020-01-01 2020-01-02 2020-01-01 00:04:22 2020-01-02 03:32:43 2020-01-01 00:04:22.000 2020-01-02 03:32:43.000 262 99163 49712.5 4971250 262 99163 49712.5 4971250 -32307 32628 5148.02 514802 -127 124 -2.7 -270 -263 101 10253 99164 0.78978 297.78978 149.28978 14928.97897 0.78978 297.7898 149.28979 14928.97923 0.78978 297.78978 149.28977999999998 14928.97800 2020-01-01 2020-01-02 2020-01-01 00:04:23 2020-01-02 03:32:44 2020-01-01 00:04:23.000 2020-01-02 03:32:44.000 263 99164 49713.5 4971350 263 99164 49713.5 4971350 -32306 32629 5149.02 514902 -126 125 -1.7 -170 -264 101 10254 99165 0.79279 297.79279 149.29279 14929.27927 0.79279 297.7928 149.29278 14929.27888 0.79279 297.79279 149.29279 14929.27900 2020-01-01 2020-01-02 2020-01-01 00:04:24 2020-01-02 03:32:45 2020-01-01 00:04:24.000 2020-01-02 03:32:45.000 264 99165 49714.5 4971450 264 99165 49714.5 4971450 -32305 32630 5150.02 515002 -125 126 -0.7 -70 -265 101 10255 99166 0.79579 297.79579 149.29579 14929.57957 0.79579 297.7958 149.29579 14929.57962 0.79579 297.79579 149.29579 14929.57900 2020-01-01 2020-01-02 2020-01-01 00:04:25 2020-01-02 03:32:46 2020-01-01 00:04:25.000 2020-01-02 03:32:46.000 265 99166 49715.5 4971550 265 99166 49715.5 4971550 -32304 32631 5151.02 515102 -124 127 0.3 30 -266 101 10256 99167 0.79879 297.79879 149.29879 14929.87987 0.79879 297.7988 149.29879 14929.87977 0.79879 297.79879 149.29879 14929.87900 2020-01-01 2020-01-02 2020-01-01 00:04:26 2020-01-02 03:32:47 2020-01-01 00:04:26.000 2020-01-02 03:32:47.000 266 99167 49716.5 4971650 266 99167 49716.5 4971650 -32303 32632 5152.02 515202 -128 127 -1.26 -126 -267 101 10257 99168 0.8018 297.8018 149.3018 14930.18018 0.8018 297.8018 149.3018 14930.18012 0.80180 297.80180 149.30180000000001 14930.18000 2020-01-01 2020-01-02 2020-01-01 00:04:27 2020-01-02 03:32:48 2020-01-01 00:04:27.000 2020-01-02 03:32:48.000 267 99168 49717.5 4971750 267 99168 49717.5 4971750 -32302 32633 5153.02 515302 -128 123 -2.82 -282 -268 101 10258 99169 0.8048 297.8048 149.3048 14930.48048 0.8048 297.8048 149.3048 14930.4807 0.80480 297.80480 149.3048 14930.48000 2020-01-01 2020-01-02 2020-01-01 00:04:28 2020-01-02 03:32:49 2020-01-01 00:04:28.000 2020-01-02 03:32:49.000 268 99169 49718.5 4971850 268 99169 49718.5 4971850 -32301 32634 5154.02 515402 -127 124 -1.82 -182 -269 101 10259 99170 0.8078 297.8078 149.3078 14930.78078 0.8078 297.8078 149.3078 14930.78035 0.80780 297.80780 149.30780000000001 14930.78000 2020-01-01 2020-01-02 2020-01-01 00:04:29 2020-01-02 03:32:50 2020-01-01 00:04:29.000 2020-01-02 03:32:50.000 269 99170 49719.5 4971950 269 99170 49719.5 4971950 -32300 32635 5155.02 515502 -126 125 -0.82 -82 +260 101 10250 99161 0.78078 297.78078 149.28078 14928.07807 0.78078 297.7808 149.28077 14928.07799 0.78078 297.78078 149.28078 14928.078 2020-01-01 2020-01-02 2020-01-01 00:04:20 2020-01-02 03:32:41 2020-01-01 00:04:20.000 2020-01-02 03:32:41.000 260 99161 49710.5 4971050 260 99161 49710.5 4971050 -32309 32626 5146.02 514602 -128 127 -2.14 -214 +261 101 10251 99162 0.78378 297.78378 149.28378 14928.37837 0.78378 297.78378 149.28378 14928.3783 0.78378 297.78378 149.28378 14928.378 2020-01-01 2020-01-02 2020-01-01 00:04:21 2020-01-02 03:32:42 2020-01-01 00:04:21.000 2020-01-02 03:32:42.000 261 99162 49711.5 4971150 261 99162 49711.5 4971150 -32308 32627 5147.02 514702 -128 123 -3.7 -370 +262 101 10252 99163 0.78678 297.78678 149.28678 14928.67867 0.78678 297.78677 149.28678 14928.67861 0.78678 297.78678 149.28678 14928.678 2020-01-01 2020-01-02 2020-01-01 00:04:22 2020-01-02 03:32:43 2020-01-01 00:04:22.000 2020-01-02 03:32:43.000 262 99163 49712.5 4971250 262 99163 49712.5 4971250 -32307 32628 5148.02 514802 -127 124 -2.7 -270 +263 101 10253 99164 0.78978 297.78978 149.28978 14928.97897 0.78978 297.7898 149.28979 14928.97923 0.78978 297.78978 149.28977999999998 14928.978 2020-01-01 2020-01-02 2020-01-01 00:04:23 2020-01-02 03:32:44 2020-01-01 00:04:23.000 2020-01-02 03:32:44.000 263 99164 49713.5 4971350 263 99164 49713.5 4971350 -32306 32629 5149.02 514902 -126 125 -1.7 -170 +264 101 10254 99165 0.79279 297.79279 149.29279 14929.27927 0.79279 297.7928 149.29278 14929.27888 0.79279 297.79279 149.29279 14929.279 2020-01-01 2020-01-02 2020-01-01 00:04:24 2020-01-02 03:32:45 2020-01-01 00:04:24.000 2020-01-02 03:32:45.000 264 99165 49714.5 4971450 264 99165 49714.5 4971450 -32305 32630 5150.02 515002 -125 126 -0.7 -70 +265 101 10255 99166 0.79579 297.79579 149.29579 14929.57957 0.79579 297.7958 149.29579 14929.57962 0.79579 297.79579 149.29579 14929.579 2020-01-01 2020-01-02 2020-01-01 00:04:25 2020-01-02 03:32:46 2020-01-01 00:04:25.000 2020-01-02 03:32:46.000 265 99166 49715.5 4971550 265 99166 49715.5 4971550 -32304 32631 5151.02 515102 -124 127 0.3 30 +266 101 10256 99167 0.79879 297.79879 149.29879 14929.87987 0.79879 297.7988 149.29879 14929.87977 0.79879 297.79879 149.29879 14929.879 2020-01-01 2020-01-02 2020-01-01 00:04:26 2020-01-02 03:32:47 2020-01-01 00:04:26.000 2020-01-02 03:32:47.000 266 99167 49716.5 4971650 266 99167 49716.5 4971650 -32303 32632 5152.02 515202 -128 127 -1.26 -126 +267 101 10257 99168 0.8018 297.8018 149.3018 14930.18018 0.8018 297.8018 149.3018 14930.18012 0.8018 297.8018 149.30180000000001 14930.18 2020-01-01 2020-01-02 2020-01-01 00:04:27 2020-01-02 03:32:48 2020-01-01 00:04:27.000 2020-01-02 03:32:48.000 267 99168 49717.5 4971750 267 99168 49717.5 4971750 -32302 32633 5153.02 515302 -128 123 -2.82 -282 +268 101 10258 99169 0.8048 297.8048 149.3048 14930.48048 0.8048 297.8048 149.3048 14930.4807 0.8048 297.8048 149.3048 14930.48 2020-01-01 2020-01-02 2020-01-01 00:04:28 2020-01-02 03:32:49 2020-01-01 00:04:28.000 2020-01-02 03:32:49.000 268 99169 49718.5 4971850 268 99169 49718.5 4971850 -32301 32634 5154.02 515402 -127 124 -1.82 -182 +269 101 10259 99170 0.8078 297.8078 149.3078 14930.78078 0.8078 297.8078 149.3078 14930.78035 0.8078 297.8078 149.30780000000001 14930.78 2020-01-01 2020-01-02 2020-01-01 00:04:29 2020-01-02 03:32:50 2020-01-01 00:04:29.000 2020-01-02 03:32:50.000 269 99170 49719.5 4971950 269 99170 49719.5 4971950 -32300 32635 5155.02 515502 -126 125 -0.82 -82 27 102 10017 99927 0.08108 300.08108 150.08108 15158.18918 0.08108 300.0811 150.08108 15158.18936 0.08108 300.08108 150.08108000000001 15158.18908 2020-01-01 2020-01-02 2020-01-01 00:00:27 2020-01-02 03:45:27 2020-01-01 00:00:27.000 2020-01-02 03:45:27.000 27 99927 49977 5047677 27 99927 49977 5047677 -32542 32393 4556.009900990099 460157 -125 126 -1.297029702970297 -131 -270 101 10260 99171 0.81081 297.81081 149.31081 14931.08108 0.81081 297.81082 149.31081 14931.08109 0.81081 297.81081 149.31081 14931.08100 2020-01-01 2020-01-02 2020-01-01 00:04:30 2020-01-02 03:32:51 2020-01-01 00:04:30.000 2020-01-02 03:32:51.000 270 99171 49720.5 4972050 270 99171 49720.5 4972050 -32299 32636 5156.02 515602 -125 126 0.18 18 -271 101 10261 99172 0.81381 297.81381 149.31381 14931.38138 0.81381 297.8138 149.31381 14931.38124 0.81381 297.81381 149.31381 14931.38100 2020-01-01 2020-01-02 2020-01-01 00:04:31 2020-01-02 03:32:52 2020-01-01 00:04:31.000 2020-01-02 03:32:52.000 271 99172 49721.5 4972150 271 99172 49721.5 4972150 -32298 32637 5157.02 515702 -124 127 1.18 118 -272 101 10262 99173 0.81681 297.81681 149.31681 14931.68168 0.81681 297.8168 149.31681 14931.68159 0.81681 297.81681 149.31681 14931.68100 2020-01-01 2020-01-02 2020-01-01 00:04:32 2020-01-02 03:32:53 2020-01-01 00:04:32.000 2020-01-02 03:32:53.000 272 99173 49722.5 4972250 272 99173 49722.5 4972250 -32297 32638 5158.02 515802 -128 127 -0.38 -38 -273 101 10263 99174 0.81981 297.81981 149.31981 14931.98198 0.81981 297.81982 149.31982 14931.98217 0.81981 297.81981 149.31981 14931.98100 2020-01-01 2020-01-02 2020-01-01 00:04:33 2020-01-02 03:32:54 2020-01-01 00:04:33.000 2020-01-02 03:32:54.000 273 99174 49723.5 4972350 273 99174 49723.5 4972350 -32296 32639 5159.02 515902 -128 127 -1.94 -194 -274 101 10264 99175 0.82282 297.82282 149.32282 14932.28228 0.82282 297.8228 149.32282 14932.28247 0.82282 297.82282 149.32281999999998 14932.28200 2020-01-01 2020-01-02 2020-01-01 00:04:34 2020-01-02 03:32:55 2020-01-01 00:04:34.000 2020-01-02 03:32:55.000 274 99175 49724.5 4972450 274 99175 49724.5 4972450 -32295 32640 5160.02 516002 -128 124 -3.5 -350 -275 101 10265 99176 0.82582 297.82582 149.32582 14932.58258 0.82582 297.82584 149.32582 14932.58256 0.82582 297.82582 149.32582 14932.58200 2020-01-01 2020-01-02 2020-01-01 00:04:35 2020-01-02 03:32:56 2020-01-01 00:04:35.000 2020-01-02 03:32:56.000 275 99176 49725.5 4972550 275 99176 49725.5 4972550 -32294 32641 5161.02 516102 -127 125 -2.5 -250 -276 101 10266 99177 0.82882 297.82882 149.32882 14932.88288 0.82882 297.82883 149.32882 14932.88275 0.82882 297.82882 149.32882 14932.88200 2020-01-01 2020-01-02 2020-01-01 00:04:36 2020-01-02 03:32:57 2020-01-01 00:04:36.000 2020-01-02 03:32:57.000 276 99177 49726.5 4972650 276 99177 49726.5 4972650 -32293 32642 5162.02 516202 -126 126 -1.5 -150 -277 101 10267 99178 0.83183 297.83183 149.33183 14933.18318 0.83183 297.83182 149.33183 14933.18305 0.83183 297.83183 149.33183 14933.18300 2020-01-01 2020-01-02 2020-01-01 00:04:37 2020-01-02 03:32:58 2020-01-01 00:04:37.000 2020-01-02 03:32:58.000 277 99178 49727.5 4972750 277 99178 49727.5 4972750 -32292 32643 5163.02 516302 -125 127 -0.5 -50 -278 101 10268 99179 0.83483 297.83483 149.33483 14933.48348 0.83483 297.83484 149.33483 14933.48364 0.83483 297.83483 149.33483 14933.48300 2020-01-01 2020-01-02 2020-01-01 00:04:38 2020-01-02 03:32:59 2020-01-01 00:04:38.000 2020-01-02 03:32:59.000 278 99179 49728.5 4972850 278 99179 49728.5 4972850 -32291 32644 5164.02 516402 -128 127 -2.06 -206 -279 101 10269 99180 0.83783 297.83783 149.33783 14933.78378 0.83783 297.83783 149.33783 14933.78394 0.83783 297.83783 149.33783 14933.78300 2020-01-01 2020-01-02 2020-01-01 00:04:39 2020-01-02 03:33:00 2020-01-01 00:04:39.000 2020-01-02 03:33:00.000 279 99180 49729.5 4972950 279 99180 49729.5 4972950 -32290 32645 5165.02 516502 -128 127 -3.62 -362 +270 101 10260 99171 0.81081 297.81081 149.31081 14931.08108 0.81081 297.81082 149.31081 14931.08109 0.81081 297.81081 149.31081 14931.081 2020-01-01 2020-01-02 2020-01-01 00:04:30 2020-01-02 03:32:51 2020-01-01 00:04:30.000 2020-01-02 03:32:51.000 270 99171 49720.5 4972050 270 99171 49720.5 4972050 -32299 32636 5156.02 515602 -125 126 0.18 18 +271 101 10261 99172 0.81381 297.81381 149.31381 14931.38138 0.81381 297.8138 149.31381 14931.38124 0.81381 297.81381 149.31381 14931.381 2020-01-01 2020-01-02 2020-01-01 00:04:31 2020-01-02 03:32:52 2020-01-01 00:04:31.000 2020-01-02 03:32:52.000 271 99172 49721.5 4972150 271 99172 49721.5 4972150 -32298 32637 5157.02 515702 -124 127 1.18 118 +272 101 10262 99173 0.81681 297.81681 149.31681 14931.68168 0.81681 297.8168 149.31681 14931.68159 0.81681 297.81681 149.31681 14931.681 2020-01-01 2020-01-02 2020-01-01 00:04:32 2020-01-02 03:32:53 2020-01-01 00:04:32.000 2020-01-02 03:32:53.000 272 99173 49722.5 4972250 272 99173 49722.5 4972250 -32297 32638 5158.02 515802 -128 127 -0.38 -38 +273 101 10263 99174 0.81981 297.81981 149.31981 14931.98198 0.81981 297.81982 149.31982 14931.98217 0.81981 297.81981 149.31981 14931.981 2020-01-01 2020-01-02 2020-01-01 00:04:33 2020-01-02 03:32:54 2020-01-01 00:04:33.000 2020-01-02 03:32:54.000 273 99174 49723.5 4972350 273 99174 49723.5 4972350 -32296 32639 5159.02 515902 -128 127 -1.94 -194 +274 101 10264 99175 0.82282 297.82282 149.32282 14932.28228 0.82282 297.8228 149.32282 14932.28247 0.82282 297.82282 149.32281999999998 14932.282 2020-01-01 2020-01-02 2020-01-01 00:04:34 2020-01-02 03:32:55 2020-01-01 00:04:34.000 2020-01-02 03:32:55.000 274 99175 49724.5 4972450 274 99175 49724.5 4972450 -32295 32640 5160.02 516002 -128 124 -3.5 -350 +275 101 10265 99176 0.82582 297.82582 149.32582 14932.58258 0.82582 297.82584 149.32582 14932.58256 0.82582 297.82582 149.32582 14932.582 2020-01-01 2020-01-02 2020-01-01 00:04:35 2020-01-02 03:32:56 2020-01-01 00:04:35.000 2020-01-02 03:32:56.000 275 99176 49725.5 4972550 275 99176 49725.5 4972550 -32294 32641 5161.02 516102 -127 125 -2.5 -250 +276 101 10266 99177 0.82882 297.82882 149.32882 14932.88288 0.82882 297.82883 149.32882 14932.88275 0.82882 297.82882 149.32882 14932.882 2020-01-01 2020-01-02 2020-01-01 00:04:36 2020-01-02 03:32:57 2020-01-01 00:04:36.000 2020-01-02 03:32:57.000 276 99177 49726.5 4972650 276 99177 49726.5 4972650 -32293 32642 5162.02 516202 -126 126 -1.5 -150 +277 101 10267 99178 0.83183 297.83183 149.33183 14933.18318 0.83183 297.83182 149.33183 14933.18305 0.83183 297.83183 149.33183 14933.183 2020-01-01 2020-01-02 2020-01-01 00:04:37 2020-01-02 03:32:58 2020-01-01 00:04:37.000 2020-01-02 03:32:58.000 277 99178 49727.5 4972750 277 99178 49727.5 4972750 -32292 32643 5163.02 516302 -125 127 -0.5 -50 +278 101 10268 99179 0.83483 297.83483 149.33483 14933.48348 0.83483 297.83484 149.33483 14933.48364 0.83483 297.83483 149.33483 14933.483 2020-01-01 2020-01-02 2020-01-01 00:04:38 2020-01-02 03:32:59 2020-01-01 00:04:38.000 2020-01-02 03:32:59.000 278 99179 49728.5 4972850 278 99179 49728.5 4972850 -32291 32644 5164.02 516402 -128 127 -2.06 -206 +279 101 10269 99180 0.83783 297.83783 149.33783 14933.78378 0.83783 297.83783 149.33783 14933.78394 0.83783 297.83783 149.33783 14933.783 2020-01-01 2020-01-02 2020-01-01 00:04:39 2020-01-02 03:33:00 2020-01-01 00:04:39.000 2020-01-02 03:33:00.000 279 99180 49729.5 4972950 279 99180 49729.5 4972950 -32290 32645 5165.02 516502 -128 127 -3.62 -362 28 102 10018 99928 0.08408 300.08408 150.08408 15158.49249 0.08408 300.08408 150.08408 15158.49265 0.08408 300.08408 150.08408 15158.49208 2020-01-01 2020-01-02 2020-01-01 00:00:28 2020-01-02 03:45:28 2020-01-01 00:00:28.000 2020-01-02 03:45:28.000 28 99928 49978 5047778 28 99928 49978 5047778 -32541 32394 4557.009900990099 460258 -124 127 -0.297029702970297 -30 -280 101 10270 99181 0.84084 297.84084 149.34084 14934.08408 0.84084 297.84085 149.34084 14934.08403 0.84084 297.84084 149.34084000000001 14934.08400 2020-01-01 2020-01-02 2020-01-01 00:04:40 2020-01-02 03:33:01 2020-01-01 00:04:40.000 2020-01-02 03:33:01.000 280 99181 49730.5 4973050 280 99181 49730.5 4973050 -32289 32646 5166.02 516602 -128 123 -5.18 -518 -281 101 10271 99182 0.84384 297.84384 149.34384 14934.38438 0.84384 297.84384 149.34384 14934.38421 0.84384 297.84384 149.34384 14934.38400 2020-01-01 2020-01-02 2020-01-01 00:04:41 2020-01-02 03:33:02 2020-01-01 00:04:41.000 2020-01-02 03:33:02.000 281 99182 49731.5 4973150 281 99182 49731.5 4973150 -32288 32647 5167.02 516702 -127 124 -4.18 -418 -282 101 10272 99183 0.84684 297.84684 149.34684 14934.68468 0.84684 297.84683 149.34684 14934.68453 0.84684 297.84684 149.34684 14934.68400 2020-01-01 2020-01-02 2020-01-01 00:04:42 2020-01-02 03:33:03 2020-01-01 00:04:42.000 2020-01-02 03:33:03.000 282 99183 49732.5 4973250 282 99183 49732.5 4973250 -32287 32648 5168.02 516802 -126 125 -3.18 -318 -283 101 10273 99184 0.84984 297.84984 149.34984 14934.98498 0.84984 297.84985 149.34985 14934.98526 0.84984 297.84984 149.34984 14934.98400 2020-01-01 2020-01-02 2020-01-01 00:04:43 2020-01-02 03:33:04 2020-01-01 00:04:43.000 2020-01-02 03:33:04.000 283 99184 49733.5 4973350 283 99184 49733.5 4973350 -32286 32649 5169.02 516902 -125 126 -2.18 -218 -284 101 10274 99185 0.85285 297.85285 149.35285 14935.28528 0.85285 297.85284 149.35285 14935.28542 0.85285 297.85285 149.35285 14935.28500 2020-01-01 2020-01-02 2020-01-01 00:04:44 2020-01-02 03:33:05 2020-01-01 00:04:44.000 2020-01-02 03:33:05.000 284 99185 49734.5 4973450 284 99185 49734.5 4973450 -32285 32650 5170.02 517002 -124 127 -1.18 -118 -285 101 10275 99186 0.85585 297.85585 149.35585 14935.58558 0.85585 297.85587 149.35585 14935.5855 0.85585 297.85585 149.35585 14935.58500 2020-01-01 2020-01-02 2020-01-01 00:04:45 2020-01-02 03:33:06 2020-01-01 00:04:45.000 2020-01-02 03:33:06.000 285 99186 49735.5 4973550 285 99186 49735.5 4973550 -32284 32651 5171.02 517102 -128 127 -2.74 -274 -286 101 10276 99187 0.85885 297.85885 149.35885 14935.88588 0.85885 297.85886 149.35885 14935.88568 0.85885 297.85885 149.35885 14935.88500 2020-01-01 2020-01-02 2020-01-01 00:04:46 2020-01-02 03:33:07 2020-01-01 00:04:46.000 2020-01-02 03:33:07.000 286 99187 49736.5 4973650 286 99187 49736.5 4973650 -32283 32652 5172.02 517202 -128 123 -4.3 -430 -287 101 10277 99188 0.86186 297.86186 149.36186 14936.18618 0.86186 297.86185 149.36186 14936.186 0.86186 297.86186 149.36186 14936.18600 2020-01-01 2020-01-02 2020-01-01 00:04:47 2020-01-02 03:33:08 2020-01-01 00:04:47.000 2020-01-02 03:33:08.000 287 99188 49737.5 4973750 287 99188 49737.5 4973750 -32282 32653 5173.02 517302 -127 124 -3.3 -330 -288 101 10278 99189 0.86486 297.86486 149.36486 14936.48648 0.86486 297.86487 149.36486 14936.48673 0.86486 297.86486 149.36486000000002 14936.48600 2020-01-01 2020-01-02 2020-01-01 00:04:48 2020-01-02 03:33:09 2020-01-01 00:04:48.000 2020-01-02 03:33:09.000 288 99189 49738.5 4973850 288 99189 49738.5 4973850 -32281 32654 5174.02 517402 -126 125 -2.3 -230 -289 101 10279 99190 0.86786 297.86786 149.36786 14936.78678 0.86786 297.86786 149.36786 14936.78688 0.86786 297.86786 149.36786 14936.78600 2020-01-01 2020-01-02 2020-01-01 00:04:49 2020-01-02 03:33:10 2020-01-01 00:04:49.000 2020-01-02 03:33:10.000 289 99190 49739.5 4973950 289 99190 49739.5 4973950 -32280 32655 5175.02 517502 -125 126 -1.3 -130 +280 101 10270 99181 0.84084 297.84084 149.34084 14934.08408 0.84084 297.84085 149.34084 14934.08403 0.84084 297.84084 149.34084000000001 14934.084 2020-01-01 2020-01-02 2020-01-01 00:04:40 2020-01-02 03:33:01 2020-01-01 00:04:40.000 2020-01-02 03:33:01.000 280 99181 49730.5 4973050 280 99181 49730.5 4973050 -32289 32646 5166.02 516602 -128 123 -5.18 -518 +281 101 10271 99182 0.84384 297.84384 149.34384 14934.38438 0.84384 297.84384 149.34384 14934.38421 0.84384 297.84384 149.34384 14934.384 2020-01-01 2020-01-02 2020-01-01 00:04:41 2020-01-02 03:33:02 2020-01-01 00:04:41.000 2020-01-02 03:33:02.000 281 99182 49731.5 4973150 281 99182 49731.5 4973150 -32288 32647 5167.02 516702 -127 124 -4.18 -418 +282 101 10272 99183 0.84684 297.84684 149.34684 14934.68468 0.84684 297.84683 149.34684 14934.68453 0.84684 297.84684 149.34684 14934.684 2020-01-01 2020-01-02 2020-01-01 00:04:42 2020-01-02 03:33:03 2020-01-01 00:04:42.000 2020-01-02 03:33:03.000 282 99183 49732.5 4973250 282 99183 49732.5 4973250 -32287 32648 5168.02 516802 -126 125 -3.18 -318 +283 101 10273 99184 0.84984 297.84984 149.34984 14934.98498 0.84984 297.84985 149.34985 14934.98526 0.84984 297.84984 149.34984 14934.984 2020-01-01 2020-01-02 2020-01-01 00:04:43 2020-01-02 03:33:04 2020-01-01 00:04:43.000 2020-01-02 03:33:04.000 283 99184 49733.5 4973350 283 99184 49733.5 4973350 -32286 32649 5169.02 516902 -125 126 -2.18 -218 +284 101 10274 99185 0.85285 297.85285 149.35285 14935.28528 0.85285 297.85284 149.35285 14935.28542 0.85285 297.85285 149.35285 14935.285 2020-01-01 2020-01-02 2020-01-01 00:04:44 2020-01-02 03:33:05 2020-01-01 00:04:44.000 2020-01-02 03:33:05.000 284 99185 49734.5 4973450 284 99185 49734.5 4973450 -32285 32650 5170.02 517002 -124 127 -1.18 -118 +285 101 10275 99186 0.85585 297.85585 149.35585 14935.58558 0.85585 297.85587 149.35585 14935.5855 0.85585 297.85585 149.35585 14935.585 2020-01-01 2020-01-02 2020-01-01 00:04:45 2020-01-02 03:33:06 2020-01-01 00:04:45.000 2020-01-02 03:33:06.000 285 99186 49735.5 4973550 285 99186 49735.5 4973550 -32284 32651 5171.02 517102 -128 127 -2.74 -274 +286 101 10276 99187 0.85885 297.85885 149.35885 14935.88588 0.85885 297.85886 149.35885 14935.88568 0.85885 297.85885 149.35885 14935.885 2020-01-01 2020-01-02 2020-01-01 00:04:46 2020-01-02 03:33:07 2020-01-01 00:04:46.000 2020-01-02 03:33:07.000 286 99187 49736.5 4973650 286 99187 49736.5 4973650 -32283 32652 5172.02 517202 -128 123 -4.3 -430 +287 101 10277 99188 0.86186 297.86186 149.36186 14936.18618 0.86186 297.86185 149.36186 14936.186 0.86186 297.86186 149.36186 14936.186 2020-01-01 2020-01-02 2020-01-01 00:04:47 2020-01-02 03:33:08 2020-01-01 00:04:47.000 2020-01-02 03:33:08.000 287 99188 49737.5 4973750 287 99188 49737.5 4973750 -32282 32653 5173.02 517302 -127 124 -3.3 -330 +288 101 10278 99189 0.86486 297.86486 149.36486 14936.48648 0.86486 297.86487 149.36486 14936.48673 0.86486 297.86486 149.36486000000002 14936.486 2020-01-01 2020-01-02 2020-01-01 00:04:48 2020-01-02 03:33:09 2020-01-01 00:04:48.000 2020-01-02 03:33:09.000 288 99189 49738.5 4973850 288 99189 49738.5 4973850 -32281 32654 5174.02 517402 -126 125 -2.3 -230 +289 101 10279 99190 0.86786 297.86786 149.36786 14936.78678 0.86786 297.86786 149.36786 14936.78688 0.86786 297.86786 149.36786 14936.786 2020-01-01 2020-01-02 2020-01-01 00:04:49 2020-01-02 03:33:10 2020-01-01 00:04:49.000 2020-01-02 03:33:10.000 289 99190 49739.5 4973950 289 99190 49739.5 4973950 -32280 32655 5175.02 517502 -125 126 -1.3 -130 29 102 10019 99929 0.08708 300.08708 150.08708 15158.79579 0.08708 300.0871 150.08708 15158.79576 0.08708 300.08708 150.08708 15158.79508 2020-01-01 2020-01-02 2020-01-01 00:00:29 2020-01-02 03:45:29 2020-01-01 00:00:29.000 2020-01-02 03:45:29.000 29 99929 49979 5047879 29 99929 49979 5047879 -32540 32395 4558.009900990099 460359 -128 127 -1.8316831683168318 -185 -290 101 10280 99191 0.87087 297.87087 149.37087 14937.08708 0.87087 297.87088 149.37087 14937.087 0.87087 297.87087 149.37087 14937.08700 2020-01-01 2020-01-02 2020-01-01 00:04:50 2020-01-02 03:33:11 2020-01-01 00:04:50.000 2020-01-02 03:33:11.000 290 99191 49740.5 4974050 290 99191 49740.5 4974050 -32279 32656 5176.02 517602 -124 127 -0.3 -30 -291 101 10281 99192 0.87387 297.87387 149.37387 14937.38738 0.87387 297.87387 149.37387 14937.38716 0.87387 297.87387 149.37387 14937.38700 2020-01-01 2020-01-02 2020-01-01 00:04:51 2020-01-02 03:33:12 2020-01-01 00:04:51.000 2020-01-02 03:33:12.000 291 99192 49741.5 4974150 291 99192 49741.5 4974150 -32278 32657 5177.02 517702 -128 127 -1.86 -186 -292 101 10282 99193 0.87687 297.87687 149.37687 14937.68768 0.87687 297.8769 149.37687 14937.68789 0.87687 297.87687 149.37687 14937.68700 2020-01-01 2020-01-02 2020-01-01 00:04:52 2020-01-02 03:33:13 2020-01-01 00:04:52.000 2020-01-02 03:33:13.000 292 99193 49742.5 4974250 292 99193 49742.5 4974250 -32277 32658 5178.02 517802 -128 123 -3.42 -342 -293 101 10283 99194 0.87987 297.87987 149.37987 14937.98798 0.87987 297.87988 149.37988 14937.9882 0.87987 297.87987 149.37986999999998 14937.98700 2020-01-01 2020-01-02 2020-01-01 00:04:53 2020-01-02 03:33:14 2020-01-01 00:04:53.000 2020-01-02 03:33:14.000 293 99194 49743.5 4974350 293 99194 49743.5 4974350 -32276 32659 5179.02 517902 -127 124 -2.42 -242 -294 101 10284 99195 0.88288 297.88288 149.38288 14938.28828 0.88288 297.88287 149.38288 14938.28835 0.88288 297.88288 149.38288 14938.28800 2020-01-01 2020-01-02 2020-01-01 00:04:54 2020-01-02 03:33:15 2020-01-01 00:04:54.000 2020-01-02 03:33:15.000 294 99195 49744.5 4974450 294 99195 49744.5 4974450 -32275 32660 5180.02 518002 -126 125 -1.42 -142 -295 101 10285 99196 0.88588 297.88588 149.38588 14938.58858 0.88588 297.8859 149.38588 14938.58847 0.88588 297.88588 149.38588 14938.58800 2020-01-01 2020-01-02 2020-01-01 00:04:55 2020-01-02 03:33:16 2020-01-01 00:04:55.000 2020-01-02 03:33:16.000 295 99196 49745.5 4974550 295 99196 49745.5 4974550 -32274 32661 5181.02 518102 -125 126 -0.42 -42 -296 101 10286 99197 0.88888 297.88888 149.38888 14938.88888 0.88888 297.8889 149.38888 14938.88863 0.88888 297.88888 149.38888 14938.88800 2020-01-01 2020-01-02 2020-01-01 00:04:56 2020-01-02 03:33:17 2020-01-01 00:04:56.000 2020-01-02 03:33:17.000 296 99197 49746.5 4974650 296 99197 49746.5 4974650 -32273 32662 5182.02 518202 -124 127 0.58 58 -297 101 10287 99198 0.89189 297.89189 149.39189 14939.18918 0.89189 297.8919 149.39189 14939.18936 0.89189 297.89189 149.39189 14939.18900 2020-01-01 2020-01-02 2020-01-01 00:04:57 2020-01-02 03:33:18 2020-01-01 00:04:57.000 2020-01-02 03:33:18.000 297 99198 49747.5 4974750 297 99198 49747.5 4974750 -32272 32663 5183.02 518302 -128 127 -0.98 -98 -298 101 10288 99199 0.89489 297.89489 149.39489 14939.48948 0.89489 297.8949 149.39489 14939.48967 0.89489 297.89489 149.39489 14939.48900 2020-01-01 2020-01-02 2020-01-01 00:04:58 2020-01-02 03:33:19 2020-01-01 00:04:58.000 2020-01-02 03:33:19.000 298 99199 49748.5 4974850 298 99199 49748.5 4974850 -32271 32664 5184.02 518402 -128 127 -2.54 -254 -299 101 10289 99200 0.89789 297.89789 149.39789 14939.78978 0.89789 297.8979 149.39789 14939.78986 0.89789 297.89789 149.39789000000002 14939.78900 2020-01-01 2020-01-02 2020-01-01 00:04:59 2020-01-02 03:33:20 2020-01-01 00:04:59.000 2020-01-02 03:33:20.000 299 99200 49749.5 4974950 299 99200 49749.5 4974950 -32270 32665 5185.02 518502 -128 124 -4.1 -410 -3 102 1002 9993 0.009 300.009 150.009 15150.9099 0.009 300.009 150.009 15150.90958 0.00900 300.00900 150.009 15150.90900 2020-01-01 2020-01-02 2020-01-01 00:00:03 2020-01-02 03:45:03 2020-01-01 00:00:03.000 2020-01-02 03:45:03.000 3 99903 49953 5045253 3 99903 49953 5045253 -32566 32369 4532.009900990099 457733 -124 127 0.04950495049504951 5 +290 101 10280 99191 0.87087 297.87087 149.37087 14937.08708 0.87087 297.87088 149.37087 14937.087 0.87087 297.87087 149.37087 14937.087 2020-01-01 2020-01-02 2020-01-01 00:04:50 2020-01-02 03:33:11 2020-01-01 00:04:50.000 2020-01-02 03:33:11.000 290 99191 49740.5 4974050 290 99191 49740.5 4974050 -32279 32656 5176.02 517602 -124 127 -0.3 -30 +291 101 10281 99192 0.87387 297.87387 149.37387 14937.38738 0.87387 297.87387 149.37387 14937.38716 0.87387 297.87387 149.37387 14937.387 2020-01-01 2020-01-02 2020-01-01 00:04:51 2020-01-02 03:33:12 2020-01-01 00:04:51.000 2020-01-02 03:33:12.000 291 99192 49741.5 4974150 291 99192 49741.5 4974150 -32278 32657 5177.02 517702 -128 127 -1.86 -186 +292 101 10282 99193 0.87687 297.87687 149.37687 14937.68768 0.87687 297.8769 149.37687 14937.68789 0.87687 297.87687 149.37687 14937.687 2020-01-01 2020-01-02 2020-01-01 00:04:52 2020-01-02 03:33:13 2020-01-01 00:04:52.000 2020-01-02 03:33:13.000 292 99193 49742.5 4974250 292 99193 49742.5 4974250 -32277 32658 5178.02 517802 -128 123 -3.42 -342 +293 101 10283 99194 0.87987 297.87987 149.37987 14937.98798 0.87987 297.87988 149.37988 14937.9882 0.87987 297.87987 149.37986999999998 14937.987 2020-01-01 2020-01-02 2020-01-01 00:04:53 2020-01-02 03:33:14 2020-01-01 00:04:53.000 2020-01-02 03:33:14.000 293 99194 49743.5 4974350 293 99194 49743.5 4974350 -32276 32659 5179.02 517902 -127 124 -2.42 -242 +294 101 10284 99195 0.88288 297.88288 149.38288 14938.28828 0.88288 297.88287 149.38288 14938.28835 0.88288 297.88288 149.38288 14938.288 2020-01-01 2020-01-02 2020-01-01 00:04:54 2020-01-02 03:33:15 2020-01-01 00:04:54.000 2020-01-02 03:33:15.000 294 99195 49744.5 4974450 294 99195 49744.5 4974450 -32275 32660 5180.02 518002 -126 125 -1.42 -142 +295 101 10285 99196 0.88588 297.88588 149.38588 14938.58858 0.88588 297.8859 149.38588 14938.58847 0.88588 297.88588 149.38588 14938.588 2020-01-01 2020-01-02 2020-01-01 00:04:55 2020-01-02 03:33:16 2020-01-01 00:04:55.000 2020-01-02 03:33:16.000 295 99196 49745.5 4974550 295 99196 49745.5 4974550 -32274 32661 5181.02 518102 -125 126 -0.42 -42 +296 101 10286 99197 0.88888 297.88888 149.38888 14938.88888 0.88888 297.8889 149.38888 14938.88863 0.88888 297.88888 149.38888 14938.888 2020-01-01 2020-01-02 2020-01-01 00:04:56 2020-01-02 03:33:17 2020-01-01 00:04:56.000 2020-01-02 03:33:17.000 296 99197 49746.5 4974650 296 99197 49746.5 4974650 -32273 32662 5182.02 518202 -124 127 0.58 58 +297 101 10287 99198 0.89189 297.89189 149.39189 14939.18918 0.89189 297.8919 149.39189 14939.18936 0.89189 297.89189 149.39189 14939.189 2020-01-01 2020-01-02 2020-01-01 00:04:57 2020-01-02 03:33:18 2020-01-01 00:04:57.000 2020-01-02 03:33:18.000 297 99198 49747.5 4974750 297 99198 49747.5 4974750 -32272 32663 5183.02 518302 -128 127 -0.98 -98 +298 101 10288 99199 0.89489 297.89489 149.39489 14939.48948 0.89489 297.8949 149.39489 14939.48967 0.89489 297.89489 149.39489 14939.489 2020-01-01 2020-01-02 2020-01-01 00:04:58 2020-01-02 03:33:19 2020-01-01 00:04:58.000 2020-01-02 03:33:19.000 298 99199 49748.5 4974850 298 99199 49748.5 4974850 -32271 32664 5184.02 518402 -128 127 -2.54 -254 +299 101 10289 99200 0.89789 297.89789 149.39789 14939.78978 0.89789 297.8979 149.39789 14939.78986 0.89789 297.89789 149.39789000000002 14939.789 2020-01-01 2020-01-02 2020-01-01 00:04:59 2020-01-02 03:33:20 2020-01-01 00:04:59.000 2020-01-02 03:33:20.000 299 99200 49749.5 4974950 299 99200 49749.5 4974950 -32270 32665 5185.02 518502 -128 124 -4.1 -410 +3 102 1002 9993 0.009 300.009 150.009 15150.9099 0.009 300.009 150.009 15150.90958 0.009 300.009 150.009 15150.909 2020-01-01 2020-01-02 2020-01-01 00:00:03 2020-01-02 03:45:03 2020-01-01 00:00:03.000 2020-01-02 03:45:03.000 3 99903 49953 5045253 3 99903 49953 5045253 -32566 32369 4532.009900990099 457733 -124 127 0.04950495049504951 5 30 102 10020 99930 0.09009 300.09009 150.09009 15159.09909 0.09009 300.0901 150.09008 15159.09894 0.09009 300.09009 150.09009 15159.09909 2020-01-01 2020-01-02 2020-01-01 00:00:30 2020-01-02 03:45:30 2020-01-01 00:00:30.000 2020-01-02 03:45:30.000 30 99930 49980 5047980 30 99930 49980 5047980 -32539 32396 4559.009900990099 460460 -128 123 -3.366336633663366 -340 -300 101 10290 99201 0.9009 297.9009 149.4009 14940.09009 0.9009 297.9009 149.40089 14940.08995 0.90090 297.90090 149.4009 14940.09000 2020-01-01 2020-01-02 2020-01-01 00:05:00 2020-01-02 03:33:21 2020-01-01 00:05:00.000 2020-01-02 03:33:21.000 300 99201 49750.5 4975050 300 99201 49750.5 4975050 -32269 32666 5186.02 518602 -127 125 -3.1 -310 -301 101 10291 99202 0.9039 297.9039 149.4039 14940.39039 0.9039 297.9039 149.4039 14940.39009 0.90390 297.90390 149.4039 14940.39000 2020-01-01 2020-01-02 2020-01-01 00:05:01 2020-01-02 03:33:22 2020-01-01 00:05:01.000 2020-01-02 03:33:22.000 301 99202 49751.5 4975150 301 99202 49751.5 4975150 -32268 32667 5187.02 518702 -126 126 -2.1 -210 -302 101 10292 99203 0.9069 297.9069 149.4069 14940.69069 0.9069 297.90692 149.4069 14940.69083 0.90690 297.90690 149.4069 14940.69000 2020-01-01 2020-01-02 2020-01-01 00:05:02 2020-01-02 03:33:23 2020-01-01 00:05:02.000 2020-01-02 03:33:23.000 302 99203 49752.5 4975250 302 99203 49752.5 4975250 -32267 32668 5188.02 518802 -125 127 -1.1 -110 -303 101 10293 99204 0.9099 297.9099 149.4099 14940.99099 0.9099 297.9099 149.40991 14940.99114 0.90990 297.90990 149.4099 14940.99000 2020-01-01 2020-01-02 2020-01-01 00:05:03 2020-01-02 03:33:24 2020-01-01 00:05:03.000 2020-01-02 03:33:24.000 303 99204 49753.5 4975350 303 99204 49753.5 4975350 -32266 32669 5189.02 518902 -128 127 -2.66 -266 -304 101 10294 99205 0.91291 297.91291 149.41291 14941.29129 0.91291 297.9129 149.41291 14941.29133 0.91291 297.91291 149.41290999999998 14941.29100 2020-01-01 2020-01-02 2020-01-01 00:05:04 2020-01-02 03:33:25 2020-01-01 00:05:04.000 2020-01-02 03:33:25.000 304 99205 49754.5 4975450 304 99205 49754.5 4975450 -32265 32670 5190.02 519002 -128 127 -4.22 -422 -305 101 10295 99206 0.91591 297.91591 149.41591 14941.59159 0.91591 297.91592 149.41591 14941.59141 0.91591 297.91591 149.41591 14941.59100 2020-01-01 2020-01-02 2020-01-01 00:05:05 2020-01-02 03:33:26 2020-01-01 00:05:05.000 2020-01-02 03:33:26.000 305 99206 49755.5 4975550 305 99206 49755.5 4975550 -32264 32671 5191.02 519102 -128 123 -5.78 -578 -306 101 10296 99207 0.91891 297.91891 149.41891 14941.89189 0.91891 297.9189 149.41891 14941.89172 0.91891 297.91891 149.41890999999998 14941.89100 2020-01-01 2020-01-02 2020-01-01 00:05:06 2020-01-02 03:33:27 2020-01-01 00:05:06.000 2020-01-02 03:33:27.000 306 99207 49756.5 4975650 306 99207 49756.5 4975650 -32263 32672 5192.02 519202 -127 124 -4.78 -478 -307 101 10297 99208 0.92192 297.92192 149.42192 14942.19219 0.92192 297.92194 149.42192 14942.1923 0.92192 297.92192 149.42192 14942.19200 2020-01-01 2020-01-02 2020-01-01 00:05:07 2020-01-02 03:33:28 2020-01-01 00:05:07.000 2020-01-02 03:33:28.000 307 99208 49757.5 4975750 307 99208 49757.5 4975750 -32262 32673 5193.02 519302 -126 125 -3.78 -378 -308 101 10298 99209 0.92492 297.92492 149.42492 14942.49249 0.92492 297.92493 149.42492 14942.49265 0.92492 297.92492 149.42492000000001 14942.49200 2020-01-01 2020-01-02 2020-01-01 00:05:08 2020-01-02 03:33:29 2020-01-01 00:05:08.000 2020-01-02 03:33:29.000 308 99209 49758.5 4975850 308 99209 49758.5 4975850 -32261 32674 5194.02 519402 -125 126 -2.78 -278 -309 101 10299 99210 0.92792 297.92792 149.42792 14942.79279 0.92792 297.92792 149.42792 14942.7928 0.92792 297.92792 149.42792 14942.79200 2020-01-01 2020-01-02 2020-01-01 00:05:09 2020-01-02 03:33:30 2020-01-01 00:05:09.000 2020-01-02 03:33:30.000 309 99210 49759.5 4975950 309 99210 49759.5 4975950 -32260 32675 5195.02 519502 -124 127 -1.78 -178 +300 101 10290 99201 0.9009 297.9009 149.4009 14940.09009 0.9009 297.9009 149.40089 14940.08995 0.9009 297.9009 149.4009 14940.09 2020-01-01 2020-01-02 2020-01-01 00:05:00 2020-01-02 03:33:21 2020-01-01 00:05:00.000 2020-01-02 03:33:21.000 300 99201 49750.5 4975050 300 99201 49750.5 4975050 -32269 32666 5186.02 518602 -127 125 -3.1 -310 +301 101 10291 99202 0.9039 297.9039 149.4039 14940.39039 0.9039 297.9039 149.4039 14940.39009 0.9039 297.9039 149.4039 14940.39 2020-01-01 2020-01-02 2020-01-01 00:05:01 2020-01-02 03:33:22 2020-01-01 00:05:01.000 2020-01-02 03:33:22.000 301 99202 49751.5 4975150 301 99202 49751.5 4975150 -32268 32667 5187.02 518702 -126 126 -2.1 -210 +302 101 10292 99203 0.9069 297.9069 149.4069 14940.69069 0.9069 297.90692 149.4069 14940.69083 0.9069 297.9069 149.4069 14940.69 2020-01-01 2020-01-02 2020-01-01 00:05:02 2020-01-02 03:33:23 2020-01-01 00:05:02.000 2020-01-02 03:33:23.000 302 99203 49752.5 4975250 302 99203 49752.5 4975250 -32267 32668 5188.02 518802 -125 127 -1.1 -110 +303 101 10293 99204 0.9099 297.9099 149.4099 14940.99099 0.9099 297.9099 149.40991 14940.99114 0.9099 297.9099 149.4099 14940.99 2020-01-01 2020-01-02 2020-01-01 00:05:03 2020-01-02 03:33:24 2020-01-01 00:05:03.000 2020-01-02 03:33:24.000 303 99204 49753.5 4975350 303 99204 49753.5 4975350 -32266 32669 5189.02 518902 -128 127 -2.66 -266 +304 101 10294 99205 0.91291 297.91291 149.41291 14941.29129 0.91291 297.9129 149.41291 14941.29133 0.91291 297.91291 149.41290999999998 14941.291 2020-01-01 2020-01-02 2020-01-01 00:05:04 2020-01-02 03:33:25 2020-01-01 00:05:04.000 2020-01-02 03:33:25.000 304 99205 49754.5 4975450 304 99205 49754.5 4975450 -32265 32670 5190.02 519002 -128 127 -4.22 -422 +305 101 10295 99206 0.91591 297.91591 149.41591 14941.59159 0.91591 297.91592 149.41591 14941.59141 0.91591 297.91591 149.41591 14941.591 2020-01-01 2020-01-02 2020-01-01 00:05:05 2020-01-02 03:33:26 2020-01-01 00:05:05.000 2020-01-02 03:33:26.000 305 99206 49755.5 4975550 305 99206 49755.5 4975550 -32264 32671 5191.02 519102 -128 123 -5.78 -578 +306 101 10296 99207 0.91891 297.91891 149.41891 14941.89189 0.91891 297.9189 149.41891 14941.89172 0.91891 297.91891 149.41890999999998 14941.891 2020-01-01 2020-01-02 2020-01-01 00:05:06 2020-01-02 03:33:27 2020-01-01 00:05:06.000 2020-01-02 03:33:27.000 306 99207 49756.5 4975650 306 99207 49756.5 4975650 -32263 32672 5192.02 519202 -127 124 -4.78 -478 +307 101 10297 99208 0.92192 297.92192 149.42192 14942.19219 0.92192 297.92194 149.42192 14942.1923 0.92192 297.92192 149.42192 14942.192 2020-01-01 2020-01-02 2020-01-01 00:05:07 2020-01-02 03:33:28 2020-01-01 00:05:07.000 2020-01-02 03:33:28.000 307 99208 49757.5 4975750 307 99208 49757.5 4975750 -32262 32673 5193.02 519302 -126 125 -3.78 -378 +308 101 10298 99209 0.92492 297.92492 149.42492 14942.49249 0.92492 297.92493 149.42492 14942.49265 0.92492 297.92492 149.42492000000001 14942.492 2020-01-01 2020-01-02 2020-01-01 00:05:08 2020-01-02 03:33:29 2020-01-01 00:05:08.000 2020-01-02 03:33:29.000 308 99209 49758.5 4975850 308 99209 49758.5 4975850 -32261 32674 5194.02 519402 -125 126 -2.78 -278 +309 101 10299 99210 0.92792 297.92792 149.42792 14942.79279 0.92792 297.92792 149.42792 14942.7928 0.92792 297.92792 149.42792 14942.792 2020-01-01 2020-01-02 2020-01-01 00:05:09 2020-01-02 03:33:30 2020-01-01 00:05:09.000 2020-01-02 03:33:30.000 309 99210 49759.5 4975950 309 99210 49759.5 4975950 -32260 32675 5195.02 519502 -124 127 -1.78 -178 31 102 10021 99931 0.09309 300.09309 150.09309 15159.4024 0.09309 300.09308 150.09309 15159.40224 0.09309 300.09309 150.09309 15159.40209 2020-01-01 2020-01-02 2020-01-01 00:00:31 2020-01-02 03:45:31 2020-01-01 00:00:31.000 2020-01-02 03:45:31.000 31 99931 49981 5048081 31 99931 49981 5048081 -32538 32397 4560.009900990099 460561 -127 124 -2.366336633663366 -239 -310 101 10300 99211 0.93093 297.93093 149.43093 14943.09309 0.93093 297.93094 149.43092 14943.09288 0.93093 297.93093 149.43093000000002 14943.09300 2020-01-01 2020-01-02 2020-01-01 00:05:10 2020-01-02 03:33:31 2020-01-01 00:05:10.000 2020-01-02 03:33:31.000 310 99211 49760.5 4976050 310 99211 49760.5 4976050 -32259 32676 5196.02 519602 -128 127 -3.34 -334 -311 101 10301 99212 0.93393 297.93393 149.43393 14943.39339 0.93393 297.93393 149.43393 14943.39319 0.93393 297.93393 149.43393 14943.39300 2020-01-01 2020-01-02 2020-01-01 00:05:11 2020-01-02 03:33:32 2020-01-01 00:05:11.000 2020-01-02 03:33:32.000 311 99212 49761.5 4976150 311 99212 49761.5 4976150 -32258 32677 5197.02 519702 -128 123 -4.9 -490 -312 101 10302 99213 0.93693 297.93693 149.43693 14943.69369 0.93693 297.93695 149.43693 14943.69377 0.93693 297.93693 149.43693 14943.69300 2020-01-01 2020-01-02 2020-01-01 00:05:12 2020-01-02 03:33:33 2020-01-01 00:05:12.000 2020-01-02 03:33:33.000 312 99213 49762.5 4976250 312 99213 49762.5 4976250 -32257 32678 5198.02 519802 -127 124 -3.9 -390 -313 101 10303 99214 0.93993 297.93993 149.43993 14943.99399 0.93993 297.93994 149.43994 14943.99412 0.93993 297.93993 149.43993 14943.99300 2020-01-01 2020-01-02 2020-01-01 00:05:13 2020-01-02 03:33:34 2020-01-01 00:05:13.000 2020-01-02 03:33:34.000 313 99214 49763.5 4976350 313 99214 49763.5 4976350 -32256 32679 5199.02 519902 -126 125 -2.9 -290 -314 101 10304 99215 0.94294 297.94294 149.44294 14944.29429 0.94294 297.94293 149.44294 14944.29427 0.94294 297.94294 149.44294 14944.29400 2020-01-01 2020-01-02 2020-01-01 00:05:14 2020-01-02 03:33:35 2020-01-01 00:05:14.000 2020-01-02 03:33:35.000 314 99215 49764.5 4976450 314 99215 49764.5 4976450 -32255 32680 5200.02 520002 -125 126 -1.9 -190 -315 101 10305 99216 0.94594 297.94594 149.44594 14944.59459 0.94594 297.94595 149.44595 14944.595 0.94594 297.94594 149.44593999999998 14944.59400 2020-01-01 2020-01-02 2020-01-01 00:05:15 2020-01-02 03:33:36 2020-01-01 00:05:15.000 2020-01-02 03:33:36.000 315 99216 49765.5 4976550 315 99216 49765.5 4976550 -32254 32681 5201.02 520102 -124 127 -0.9 -90 -316 101 10306 99217 0.94894 297.94894 149.44894 14944.89489 0.94894 297.94894 149.44894 14944.89466 0.94894 297.94894 149.44894 14944.89400 2020-01-01 2020-01-02 2020-01-01 00:05:16 2020-01-02 03:33:37 2020-01-01 00:05:16.000 2020-01-02 03:33:37.000 316 99217 49766.5 4976650 316 99217 49766.5 4976650 -32253 32682 5202.02 520202 -128 127 -2.46 -246 -317 101 10307 99218 0.95195 297.95195 149.45195 14945.19519 0.95195 297.95197 149.45195 14945.19524 0.95195 297.95195 149.45195 14945.19500 2020-01-01 2020-01-02 2020-01-01 00:05:17 2020-01-02 03:33:38 2020-01-01 00:05:17.000 2020-01-02 03:33:38.000 317 99218 49767.5 4976750 317 99218 49767.5 4976750 -32252 32683 5203.02 520302 -128 123 -4.02 -402 -318 101 10308 99219 0.95495 297.95495 149.45495 14945.49549 0.95495 297.95496 149.45495 14945.49558 0.95495 297.95495 149.45495 14945.49500 2020-01-01 2020-01-02 2020-01-01 00:05:18 2020-01-02 03:33:39 2020-01-01 00:05:18.000 2020-01-02 03:33:39.000 318 99219 49768.5 4976850 318 99219 49768.5 4976850 -32251 32684 5204.02 520402 -127 124 -3.02 -302 -319 101 10309 99220 0.95795 297.95795 149.45795 14945.79579 0.95795 297.95795 149.45795 14945.79574 0.95795 297.95795 149.45795 14945.79500 2020-01-01 2020-01-02 2020-01-01 00:05:19 2020-01-02 03:33:40 2020-01-01 00:05:19.000 2020-01-02 03:33:40.000 319 99220 49769.5 4976950 319 99220 49769.5 4976950 -32250 32685 5205.02 520502 -126 125 -2.02 -202 +310 101 10300 99211 0.93093 297.93093 149.43093 14943.09309 0.93093 297.93094 149.43092 14943.09288 0.93093 297.93093 149.43093000000002 14943.093 2020-01-01 2020-01-02 2020-01-01 00:05:10 2020-01-02 03:33:31 2020-01-01 00:05:10.000 2020-01-02 03:33:31.000 310 99211 49760.5 4976050 310 99211 49760.5 4976050 -32259 32676 5196.02 519602 -128 127 -3.34 -334 +311 101 10301 99212 0.93393 297.93393 149.43393 14943.39339 0.93393 297.93393 149.43393 14943.39319 0.93393 297.93393 149.43393 14943.393 2020-01-01 2020-01-02 2020-01-01 00:05:11 2020-01-02 03:33:32 2020-01-01 00:05:11.000 2020-01-02 03:33:32.000 311 99212 49761.5 4976150 311 99212 49761.5 4976150 -32258 32677 5197.02 519702 -128 123 -4.9 -490 +312 101 10302 99213 0.93693 297.93693 149.43693 14943.69369 0.93693 297.93695 149.43693 14943.69377 0.93693 297.93693 149.43693 14943.693 2020-01-01 2020-01-02 2020-01-01 00:05:12 2020-01-02 03:33:33 2020-01-01 00:05:12.000 2020-01-02 03:33:33.000 312 99213 49762.5 4976250 312 99213 49762.5 4976250 -32257 32678 5198.02 519802 -127 124 -3.9 -390 +313 101 10303 99214 0.93993 297.93993 149.43993 14943.99399 0.93993 297.93994 149.43994 14943.99412 0.93993 297.93993 149.43993 14943.993 2020-01-01 2020-01-02 2020-01-01 00:05:13 2020-01-02 03:33:34 2020-01-01 00:05:13.000 2020-01-02 03:33:34.000 313 99214 49763.5 4976350 313 99214 49763.5 4976350 -32256 32679 5199.02 519902 -126 125 -2.9 -290 +314 101 10304 99215 0.94294 297.94294 149.44294 14944.29429 0.94294 297.94293 149.44294 14944.29427 0.94294 297.94294 149.44294 14944.294 2020-01-01 2020-01-02 2020-01-01 00:05:14 2020-01-02 03:33:35 2020-01-01 00:05:14.000 2020-01-02 03:33:35.000 314 99215 49764.5 4976450 314 99215 49764.5 4976450 -32255 32680 5200.02 520002 -125 126 -1.9 -190 +315 101 10305 99216 0.94594 297.94594 149.44594 14944.59459 0.94594 297.94595 149.44595 14944.595 0.94594 297.94594 149.44593999999998 14944.594 2020-01-01 2020-01-02 2020-01-01 00:05:15 2020-01-02 03:33:36 2020-01-01 00:05:15.000 2020-01-02 03:33:36.000 315 99216 49765.5 4976550 315 99216 49765.5 4976550 -32254 32681 5201.02 520102 -124 127 -0.9 -90 +316 101 10306 99217 0.94894 297.94894 149.44894 14944.89489 0.94894 297.94894 149.44894 14944.89466 0.94894 297.94894 149.44894 14944.894 2020-01-01 2020-01-02 2020-01-01 00:05:16 2020-01-02 03:33:37 2020-01-01 00:05:16.000 2020-01-02 03:33:37.000 316 99217 49766.5 4976650 316 99217 49766.5 4976650 -32253 32682 5202.02 520202 -128 127 -2.46 -246 +317 101 10307 99218 0.95195 297.95195 149.45195 14945.19519 0.95195 297.95197 149.45195 14945.19524 0.95195 297.95195 149.45195 14945.195 2020-01-01 2020-01-02 2020-01-01 00:05:17 2020-01-02 03:33:38 2020-01-01 00:05:17.000 2020-01-02 03:33:38.000 317 99218 49767.5 4976750 317 99218 49767.5 4976750 -32252 32683 5203.02 520302 -128 123 -4.02 -402 +318 101 10308 99219 0.95495 297.95495 149.45495 14945.49549 0.95495 297.95496 149.45495 14945.49558 0.95495 297.95495 149.45495 14945.495 2020-01-01 2020-01-02 2020-01-01 00:05:18 2020-01-02 03:33:39 2020-01-01 00:05:18.000 2020-01-02 03:33:39.000 318 99219 49768.5 4976850 318 99219 49768.5 4976850 -32251 32684 5204.02 520402 -127 124 -3.02 -302 +319 101 10309 99220 0.95795 297.95795 149.45795 14945.79579 0.95795 297.95795 149.45795 14945.79574 0.95795 297.95795 149.45795 14945.795 2020-01-01 2020-01-02 2020-01-01 00:05:19 2020-01-02 03:33:40 2020-01-01 00:05:19.000 2020-01-02 03:33:40.000 319 99220 49769.5 4976950 319 99220 49769.5 4976950 -32250 32685 5205.02 520502 -126 125 -2.02 -202 32 102 10022 99932 0.09609 300.09609 150.09609 15159.7057 0.09609 300.0961 150.09609 15159.706 0.09609 300.09609 150.09609 15159.70509 2020-01-01 2020-01-02 2020-01-01 00:00:32 2020-01-02 03:45:32 2020-01-01 00:00:32.000 2020-01-02 03:45:32.000 32 99932 49982 5048182 32 99932 49982 5048182 -32537 32398 4561.009900990099 460662 -126 125 -1.3663366336633664 -138 -320 101 10310 99221 0.96096 297.96096 149.46096 14946.09609 0.96096 297.96097 149.46096 14946.09647 0.96096 297.96096 149.46096 14946.09600 2020-01-01 2020-01-02 2020-01-01 00:05:20 2020-01-02 03:33:41 2020-01-01 00:05:20.000 2020-01-02 03:33:41.000 320 99221 49770.5 4977050 320 99221 49770.5 4977050 -32249 32686 5206.02 520602 -125 126 -1.02 -102 -321 101 10311 99222 0.96396 297.96396 149.46396 14946.39639 0.96396 297.96396 149.46396 14946.39613 0.96396 297.96396 149.46396000000001 14946.39600 2020-01-01 2020-01-02 2020-01-01 00:05:21 2020-01-02 03:33:42 2020-01-01 00:05:21.000 2020-01-02 03:33:42.000 321 99222 49771.5 4977150 321 99222 49771.5 4977150 -32248 32687 5207.02 520702 -124 127 -0.02 -2 -322 101 10312 99223 0.96696 297.96696 149.46696 14946.69669 0.96696 297.96698 149.46696 14946.69674 0.96696 297.96696 149.46696 14946.69600 2020-01-01 2020-01-02 2020-01-01 00:05:22 2020-01-02 03:33:43 2020-01-01 00:05:22.000 2020-01-02 03:33:43.000 322 99223 49772.5 4977250 322 99223 49772.5 4977250 -32247 32688 5208.02 520802 -128 127 -1.58 -158 -323 101 10313 99224 0.96996 297.96996 149.46996 14946.99699 0.96997 297.96997 149.46997 14946.99706 0.96996 297.96996 149.46996 14946.99600 2020-01-01 2020-01-02 2020-01-01 00:05:23 2020-01-02 03:33:44 2020-01-01 00:05:23.000 2020-01-02 03:33:44.000 323 99224 49773.5 4977350 323 99224 49773.5 4977350 -32246 32689 5209.02 520902 -128 123 -3.14 -314 -324 101 10314 99225 0.97297 297.97297 149.47297 14947.29729 0.97297 297.97296 149.47297 14947.29737 0.97297 297.97297 149.47297 14947.29700 2020-01-01 2020-01-02 2020-01-01 00:05:24 2020-01-02 03:33:45 2020-01-01 00:05:24.000 2020-01-02 03:33:45.000 324 99225 49774.5 4977450 324 99225 49774.5 4977450 -32245 32690 5210.02 521002 -127 124 -2.14 -214 -325 101 10315 99226 0.97597 297.97597 149.47597 14947.59759 0.97597 297.97598 149.47597 14947.59794 0.97597 297.97597 149.47597 14947.59700 2020-01-01 2020-01-02 2020-01-01 00:05:25 2020-01-02 03:33:46 2020-01-01 00:05:25.000 2020-01-02 03:33:46.000 325 99226 49775.5 4977550 325 99226 49775.5 4977550 -32244 32691 5211.02 521102 -126 125 -1.14 -114 -326 101 10316 99227 0.97897 297.97897 149.47897 14947.89789 0.97897 297.97897 149.47897 14947.8976 0.97897 297.97897 149.47897 14947.89700 2020-01-01 2020-01-02 2020-01-01 00:05:26 2020-01-02 03:33:47 2020-01-01 00:05:26.000 2020-01-02 03:33:47.000 326 99227 49776.5 4977650 326 99227 49776.5 4977650 -32243 32692 5212.02 521202 -125 126 -0.14 -14 -327 101 10317 99228 0.98198 297.98198 149.48198 14948.19819 0.98198 297.982 149.48198 14948.19821 0.98198 297.98198 149.48198 14948.19800 2020-01-01 2020-01-02 2020-01-01 00:05:27 2020-01-02 03:33:48 2020-01-01 00:05:27.000 2020-01-02 03:33:48.000 327 99228 49777.5 4977750 327 99228 49777.5 4977750 -32242 32693 5213.02 521302 -124 127 0.86 86 -328 101 10318 99229 0.98498 297.98498 149.48498 14948.49849 0.98498 297.985 149.48498 14948.49853 0.98498 297.98498 149.48498 14948.49800 2020-01-01 2020-01-02 2020-01-01 00:05:28 2020-01-02 03:33:49 2020-01-01 00:05:28.000 2020-01-02 03:33:49.000 328 99229 49778.5 4977850 328 99229 49778.5 4977850 -32241 32694 5214.02 521402 -128 127 -0.7 -70 -329 101 10319 99230 0.98798 297.98798 149.48798 14948.79879 0.98798 297.98798 149.48798 14948.79883 0.98798 297.98798 149.48798 14948.79800 2020-01-01 2020-01-02 2020-01-01 00:05:29 2020-01-02 03:33:50 2020-01-01 00:05:29.000 2020-01-02 03:33:50.000 329 99230 49779.5 4977950 329 99230 49779.5 4977950 -32240 32695 5215.02 521502 -128 127 -2.26 -226 +320 101 10310 99221 0.96096 297.96096 149.46096 14946.09609 0.96096 297.96097 149.46096 14946.09647 0.96096 297.96096 149.46096 14946.096 2020-01-01 2020-01-02 2020-01-01 00:05:20 2020-01-02 03:33:41 2020-01-01 00:05:20.000 2020-01-02 03:33:41.000 320 99221 49770.5 4977050 320 99221 49770.5 4977050 -32249 32686 5206.02 520602 -125 126 -1.02 -102 +321 101 10311 99222 0.96396 297.96396 149.46396 14946.39639 0.96396 297.96396 149.46396 14946.39613 0.96396 297.96396 149.46396000000001 14946.396 2020-01-01 2020-01-02 2020-01-01 00:05:21 2020-01-02 03:33:42 2020-01-01 00:05:21.000 2020-01-02 03:33:42.000 321 99222 49771.5 4977150 321 99222 49771.5 4977150 -32248 32687 5207.02 520702 -124 127 -0.02 -2 +322 101 10312 99223 0.96696 297.96696 149.46696 14946.69669 0.96696 297.96698 149.46696 14946.69674 0.96696 297.96696 149.46696 14946.696 2020-01-01 2020-01-02 2020-01-01 00:05:22 2020-01-02 03:33:43 2020-01-01 00:05:22.000 2020-01-02 03:33:43.000 322 99223 49772.5 4977250 322 99223 49772.5 4977250 -32247 32688 5208.02 520802 -128 127 -1.58 -158 +323 101 10313 99224 0.96996 297.96996 149.46996 14946.99699 0.96997 297.96997 149.46997 14946.99706 0.96996 297.96996 149.46996 14946.996 2020-01-01 2020-01-02 2020-01-01 00:05:23 2020-01-02 03:33:44 2020-01-01 00:05:23.000 2020-01-02 03:33:44.000 323 99224 49773.5 4977350 323 99224 49773.5 4977350 -32246 32689 5209.02 520902 -128 123 -3.14 -314 +324 101 10314 99225 0.97297 297.97297 149.47297 14947.29729 0.97297 297.97296 149.47297 14947.29737 0.97297 297.97297 149.47297 14947.297 2020-01-01 2020-01-02 2020-01-01 00:05:24 2020-01-02 03:33:45 2020-01-01 00:05:24.000 2020-01-02 03:33:45.000 324 99225 49774.5 4977450 324 99225 49774.5 4977450 -32245 32690 5210.02 521002 -127 124 -2.14 -214 +325 101 10315 99226 0.97597 297.97597 149.47597 14947.59759 0.97597 297.97598 149.47597 14947.59794 0.97597 297.97597 149.47597 14947.597 2020-01-01 2020-01-02 2020-01-01 00:05:25 2020-01-02 03:33:46 2020-01-01 00:05:25.000 2020-01-02 03:33:46.000 325 99226 49775.5 4977550 325 99226 49775.5 4977550 -32244 32691 5211.02 521102 -126 125 -1.14 -114 +326 101 10316 99227 0.97897 297.97897 149.47897 14947.89789 0.97897 297.97897 149.47897 14947.8976 0.97897 297.97897 149.47897 14947.897 2020-01-01 2020-01-02 2020-01-01 00:05:26 2020-01-02 03:33:47 2020-01-01 00:05:26.000 2020-01-02 03:33:47.000 326 99227 49776.5 4977650 326 99227 49776.5 4977650 -32243 32692 5212.02 521202 -125 126 -0.14 -14 +327 101 10317 99228 0.98198 297.98198 149.48198 14948.19819 0.98198 297.982 149.48198 14948.19821 0.98198 297.98198 149.48198 14948.198 2020-01-01 2020-01-02 2020-01-01 00:05:27 2020-01-02 03:33:48 2020-01-01 00:05:27.000 2020-01-02 03:33:48.000 327 99228 49777.5 4977750 327 99228 49777.5 4977750 -32242 32693 5213.02 521302 -124 127 0.86 86 +328 101 10318 99229 0.98498 297.98498 149.48498 14948.49849 0.98498 297.985 149.48498 14948.49853 0.98498 297.98498 149.48498 14948.498 2020-01-01 2020-01-02 2020-01-01 00:05:28 2020-01-02 03:33:49 2020-01-01 00:05:28.000 2020-01-02 03:33:49.000 328 99229 49778.5 4977850 328 99229 49778.5 4977850 -32241 32694 5214.02 521402 -128 127 -0.7 -70 +329 101 10319 99230 0.98798 297.98798 149.48798 14948.79879 0.98798 297.98798 149.48798 14948.79883 0.98798 297.98798 149.48798 14948.798 2020-01-01 2020-01-02 2020-01-01 00:05:29 2020-01-02 03:33:50 2020-01-01 00:05:29.000 2020-01-02 03:33:50.000 329 99230 49779.5 4977950 329 99230 49779.5 4977950 -32240 32695 5215.02 521502 -128 127 -2.26 -226 33 102 10023 99933 0.09909 300.09909 150.09909 15160.009 0.09909 300.0991 150.0991 15160.00913 0.09909 300.09909 150.09909 15160.00809 2020-01-01 2020-01-02 2020-01-01 00:00:33 2020-01-02 03:45:33 2020-01-01 00:00:33.000 2020-01-02 03:45:33.000 33 99933 49983 5048283 33 99933 49983 5048283 -32536 32399 4562.009900990099 460763 -125 126 -0.36633663366336633 -37 -330 101 10320 99231 0.99099 297.99099 149.49099 14949.09909 0.99099 297.991 149.49099 14949.09941 0.99099 297.99099 149.49099 14949.09900 2020-01-01 2020-01-02 2020-01-01 00:05:30 2020-01-02 03:33:51 2020-01-01 00:05:30.000 2020-01-02 03:33:51.000 330 99231 49780.5 4978050 330 99231 49780.5 4978050 -32239 32696 5216.02 521602 -128 123 -3.82 -382 -331 101 10321 99232 0.99399 297.99399 149.49399 14949.39939 0.99399 297.994 149.49399 14949.39911 0.99399 297.99399 149.49399 14949.39900 2020-01-01 2020-01-02 2020-01-01 00:05:31 2020-01-02 03:33:52 2020-01-01 00:05:31.000 2020-01-02 03:33:52.000 331 99232 49781.5 4978150 331 99232 49781.5 4978150 -32238 32697 5217.02 521702 -127 124 -2.82 -282 -332 101 10322 99233 0.99699 297.99699 149.49699 14949.69969 0.99699 297.997 149.49699 14949.69969 0.99699 297.99699 149.49699 14949.69900 2020-01-01 2020-01-02 2020-01-01 00:05:32 2020-01-02 03:33:53 2020-01-01 00:05:32.000 2020-01-02 03:33:53.000 332 99233 49782.5 4978250 332 99233 49782.5 4978250 -32237 32698 5218.02 521802 -126 125 -1.82 -182 -333 101 10323 99234 1 298 149.5 14950 1 298 149.5 14950 1.00000 298.00000 149.5 14950.00000 2020-01-01 2020-01-02 2020-01-01 00:05:33 2020-01-02 03:33:54 2020-01-01 00:05:33.000 2020-01-02 03:33:54.000 333 99234 49783.5 4978350 333 99234 49783.5 4978350 -32236 32699 5219.02 521902 -125 126 -0.82 -82 -334 101 10324 99235 1.003 298.003 149.503 14950.3003 1.003 298.003 149.503 14950.30029 1.00300 298.00300 149.503 14950.30000 2020-01-01 2020-01-02 2020-01-01 00:05:34 2020-01-02 03:33:55 2020-01-01 00:05:34.000 2020-01-02 03:33:55.000 334 99235 49784.5 4978450 334 99235 49784.5 4978450 -32235 32700 5220.02 522002 -124 127 0.18 18 -335 101 10325 99236 1.006 298.006 149.506 14950.6006 1.006 298.006 149.506 14950.60088 1.00600 298.00600 149.506 14950.60000 2020-01-01 2020-01-02 2020-01-01 00:05:35 2020-01-02 03:33:56 2020-01-01 00:05:35.000 2020-01-02 03:33:56.000 335 99236 49785.5 4978550 335 99236 49785.5 4978550 -32234 32701 5221.02 522102 -128 127 -1.38 -138 -336 101 10326 99237 1.009 298.009 149.509 14950.9009 1.009 298.009 149.509 14950.90057 1.00900 298.00900 149.509 14950.90000 2020-01-01 2020-01-02 2020-01-01 00:05:36 2020-01-02 03:33:57 2020-01-01 00:05:36.000 2020-01-02 03:33:57.000 336 99237 49786.5 4978650 336 99237 49786.5 4978650 -32233 32702 5222.02 522202 -128 123 -2.94 -294 -337 101 10327 99238 1.01201 298.01201 149.51201 14951.2012 1.01201 298.01202 149.51201 14951.20117 1.01201 298.01201 149.51201 14951.20100 2020-01-01 2020-01-02 2020-01-01 00:05:37 2020-01-02 03:33:58 2020-01-01 00:05:37.000 2020-01-02 03:33:58.000 337 99238 49787.5 4978750 337 99238 49787.5 4978750 -32232 32703 5223.02 522302 -127 124 -1.94 -194 -338 101 10328 99239 1.01501 298.01501 149.51501 14951.5015 1.01501 298.015 149.51501 14951.50146 1.01501 298.01501 149.51501 14951.50100 2020-01-01 2020-01-02 2020-01-01 00:05:38 2020-01-02 03:33:59 2020-01-01 00:05:38.000 2020-01-02 03:33:59.000 338 99239 49788.5 4978850 338 99239 49788.5 4978850 -32231 32704 5224.02 522402 -126 125 -0.94 -94 -339 101 10329 99240 1.01801 298.01801 149.51801 14951.8018 1.01801 298.018 149.51801 14951.80177 1.01801 298.01801 149.51801 14951.80100 2020-01-01 2020-01-02 2020-01-01 00:05:39 2020-01-02 03:34:00 2020-01-01 00:05:39.000 2020-01-02 03:34:00.000 339 99240 49789.5 4978950 339 99240 49789.5 4978950 -32230 32705 5225.02 522502 -125 126 0.06 6 -34 102 10024 99934 0.1021 300.1021 150.1021 15160.31231 0.1021 300.1021 150.1021 15160.31224 0.10210 300.10210 150.10209999999998 15160.31210 2020-01-01 2020-01-02 2020-01-01 00:00:34 2020-01-02 03:45:34 2020-01-01 00:00:34.000 2020-01-02 03:45:34.000 34 99934 49984 5048384 34 99934 49984 5048384 -32535 32400 4563.009900990099 460864 -124 127 0.6336633663366337 64 -340 101 10330 99241 1.02102 298.02102 149.52102 14952.1021 1.02102 298.02103 149.52102 14952.10239 1.02102 298.02102 149.52102000000002 14952.10200 2020-01-01 2020-01-02 2020-01-01 00:05:40 2020-01-02 03:34:01 2020-01-01 00:05:40.000 2020-01-02 03:34:01.000 340 99241 49790.5 4979050 340 99241 49790.5 4979050 -32229 32706 5226.02 522602 -124 127 1.06 106 -341 101 10331 99242 1.02402 298.02402 149.52402 14952.4024 1.02402 298.02402 149.52402 14952.40205 1.02402 298.02402 149.52402 14952.40200 2020-01-01 2020-01-02 2020-01-01 00:05:41 2020-01-02 03:34:02 2020-01-01 00:05:41.000 2020-01-02 03:34:02.000 341 99242 49791.5 4979150 341 99242 49791.5 4979150 -32228 32707 5227.02 522702 -128 127 -0.5 -50 -342 101 10332 99243 1.02702 298.02702 149.52702 14952.7027 1.02702 298.02704 149.52702 14952.70264 1.02702 298.02702 149.52702 14952.70200 2020-01-01 2020-01-02 2020-01-01 00:05:42 2020-01-02 03:34:03 2020-01-01 00:05:42.000 2020-01-02 03:34:03.000 342 99243 49792.5 4979250 342 99243 49792.5 4979250 -32227 32708 5228.02 522802 -128 123 -2.06 -206 -343 101 10333 99244 1.03003 298.03003 149.53003 14953.003 1.03003 298.03003 149.53002 14953.00293 1.03003 298.03003 149.53003 14953.00300 2020-01-01 2020-01-02 2020-01-01 00:05:43 2020-01-02 03:34:04 2020-01-01 00:05:43.000 2020-01-02 03:34:04.000 343 99244 49793.5 4979350 343 99244 49793.5 4979350 -32226 32709 5229.02 522902 -127 124 -1.06 -106 -344 101 10334 99245 1.03303 298.03303 149.53303 14953.3033 1.03303 298.03302 149.53303 14953.30323 1.03303 298.03303 149.53303 14953.30300 2020-01-01 2020-01-02 2020-01-01 00:05:44 2020-01-02 03:34:05 2020-01-01 00:05:44.000 2020-01-02 03:34:05.000 344 99245 49794.5 4979450 344 99245 49794.5 4979450 -32225 32710 5230.02 523002 -126 125 -0.06 -6 -345 101 10335 99246 1.03603 298.03603 149.53603 14953.6036 1.03603 298.03604 149.53603 14953.60386 1.03603 298.03603 149.53602999999998 14953.60300 2020-01-01 2020-01-02 2020-01-01 00:05:45 2020-01-02 03:34:06 2020-01-01 00:05:45.000 2020-01-02 03:34:06.000 345 99246 49795.5 4979550 345 99246 49795.5 4979550 -32224 32711 5231.02 523102 -125 126 0.94 94 -346 101 10336 99247 1.03903 298.03903 149.53903 14953.9039 1.03903 298.03903 149.53903 14953.90352 1.03903 298.03903 149.53903 14953.90300 2020-01-01 2020-01-02 2020-01-01 00:05:46 2020-01-02 03:34:07 2020-01-01 00:05:46.000 2020-01-02 03:34:07.000 346 99247 49796.5 4979650 346 99247 49796.5 4979650 -32223 32712 5232.02 523202 -124 127 1.94 194 -347 101 10337 99248 1.04204 298.04204 149.54204 14954.2042 1.04204 298.04205 149.54204 14954.20427 1.04204 298.04204 149.54204 14954.20400 2020-01-01 2020-01-02 2020-01-01 00:05:47 2020-01-02 03:34:08 2020-01-01 00:05:47.000 2020-01-02 03:34:08.000 347 99248 49797.5 4979750 347 99248 49797.5 4979750 -32222 32713 5233.02 523302 -128 127 0.38 38 -348 101 10338 99249 1.04504 298.04504 149.54504 14954.5045 1.04504 298.04504 149.54504 14954.50441 1.04504 298.04504 149.54504 14954.50400 2020-01-01 2020-01-02 2020-01-01 00:05:48 2020-01-02 03:34:09 2020-01-01 00:05:48.000 2020-01-02 03:34:09.000 348 99249 49798.5 4979850 348 99249 49798.5 4979850 -32221 32714 5234.02 523402 -128 123 -1.18 -118 -349 101 10339 99250 1.04804 298.04804 149.54804 14954.8048 1.04804 298.04803 149.54804 14954.80474 1.04804 298.04804 149.54804000000001 14954.80400 2020-01-01 2020-01-02 2020-01-01 00:05:49 2020-01-02 03:34:10 2020-01-01 00:05:49.000 2020-01-02 03:34:10.000 349 99250 49799.5 4979950 349 99250 49799.5 4979950 -32220 32715 5235.02 523502 -127 124 -0.18 -18 -35 102 10025 99935 0.1051 300.1051 150.1051 15160.61561 0.1051 300.1051 150.1051 15160.61542 0.10510 300.10510 150.10510000000002 15160.61510 2020-01-01 2020-01-02 2020-01-01 00:00:35 2020-01-02 03:45:35 2020-01-01 00:00:35.000 2020-01-02 03:45:35.000 35 99935 49985 5048485 35 99935 49985 5048485 -32534 32401 4564.009900990099 460965 -128 127 -0.900990099009901 -91 -350 101 10340 99251 1.05105 298.05105 149.55105 14955.1051 1.05105 298.05106 149.55105 14955.10532 1.05105 298.05105 149.55105 14955.10500 2020-01-01 2020-01-02 2020-01-01 00:05:50 2020-01-02 03:34:11 2020-01-01 00:05:50.000 2020-01-02 03:34:11.000 350 99251 49800.5 4980050 350 99251 49800.5 4980050 -32219 32716 5236.02 523602 -126 125 0.82 82 -351 101 10341 99252 1.05405 298.05405 149.55405 14955.4054 1.05405 298.05405 149.55404 14955.40499 1.05405 298.05405 149.55405000000002 14955.40500 2020-01-01 2020-01-02 2020-01-01 00:05:51 2020-01-02 03:34:12 2020-01-01 00:05:51.000 2020-01-02 03:34:12.000 351 99252 49801.5 4980150 351 99252 49801.5 4980150 -32218 32717 5237.02 523702 -125 126 1.82 182 -352 101 10342 99253 1.05705 298.05705 149.55705 14955.7057 1.05705 298.05707 149.55705 14955.70574 1.05705 298.05705 149.55705 14955.70500 2020-01-01 2020-01-02 2020-01-01 00:05:52 2020-01-02 03:34:13 2020-01-01 00:05:52.000 2020-01-02 03:34:13.000 352 99253 49802.5 4980250 352 99253 49802.5 4980250 -32217 32718 5238.02 523802 -124 127 2.82 282 -353 101 10343 99254 1.06006 298.06006 149.56006 14956.006 1.06006 298.06006 149.56005 14956.00587 1.06006 298.06006 149.56006 14956.00600 2020-01-01 2020-01-02 2020-01-01 00:05:53 2020-01-02 03:34:14 2020-01-01 00:05:53.000 2020-01-02 03:34:14.000 353 99254 49803.5 4980350 353 99254 49803.5 4980350 -32216 32719 5239.02 523902 -128 127 1.26 126 -354 101 10344 99255 1.06306 298.06306 149.56306 14956.3063 1.06306 298.06305 149.56306 14956.3062 1.06306 298.06306 149.56306 14956.30600 2020-01-01 2020-01-02 2020-01-01 00:05:54 2020-01-02 03:34:15 2020-01-01 00:05:54.000 2020-01-02 03:34:15.000 354 99255 49804.5 4980450 354 99255 49804.5 4980450 -32215 32720 5240.02 524002 -128 127 -0.3 -30 -355 101 10345 99256 1.06606 298.06606 149.56606 14956.6066 1.06606 298.06607 149.56606 14956.6068 1.06606 298.06606 149.56606 14956.60600 2020-01-01 2020-01-02 2020-01-01 00:05:55 2020-01-02 03:34:16 2020-01-01 00:05:55.000 2020-01-02 03:34:16.000 355 99256 49805.5 4980550 355 99256 49805.5 4980550 -32214 32721 5241.02 524102 -128 123 -1.86 -186 -356 101 10346 99257 1.06906 298.06906 149.56906 14956.9069 1.06906 298.06906 149.56907 14956.90709 1.06906 298.06906 149.56906 14956.90600 2020-01-01 2020-01-02 2020-01-01 00:05:56 2020-01-02 03:34:17 2020-01-01 00:05:56.000 2020-01-02 03:34:17.000 356 99257 49806.5 4980650 356 99257 49806.5 4980650 -32213 32722 5242.02 524202 -127 124 -0.86 -86 -357 101 10347 99258 1.07207 298.07207 149.57207 14957.2072 1.07207 298.07208 149.57207 14957.20721 1.07207 298.07207 149.57207 14957.20700 2020-01-01 2020-01-02 2020-01-01 00:05:57 2020-01-02 03:34:18 2020-01-01 00:05:57.000 2020-01-02 03:34:18.000 357 99258 49807.5 4980750 357 99258 49807.5 4980750 -32212 32723 5243.02 524302 -126 125 0.14 14 -358 101 10348 99259 1.07507 298.07507 149.57507 14957.5075 1.07507 298.07507 149.57507 14957.50734 1.07507 298.07507 149.57506999999998 14957.50700 2020-01-01 2020-01-02 2020-01-01 00:05:58 2020-01-02 03:34:19 2020-01-01 00:05:58.000 2020-01-02 03:34:19.000 358 99259 49808.5 4980850 358 99259 49808.5 4980850 -32211 32724 5244.02 524402 -125 126 1.14 114 -359 101 10349 99260 1.07807 298.07807 149.57807 14957.8078 1.07807 298.07806 149.57807 14957.80767 1.07807 298.07807 149.57807 14957.80700 2020-01-01 2020-01-02 2020-01-01 00:05:59 2020-01-02 03:34:20 2020-01-01 00:05:59.000 2020-01-02 03:34:20.000 359 99260 49809.5 4980950 359 99260 49809.5 4980950 -32210 32725 5245.02 524502 -124 127 2.14 214 -36 102 10026 99936 0.1081 300.1081 150.1081 15160.91891 0.1081 300.1081 150.1081 15160.91873 0.10810 300.10810 150.1081 15160.91810 2020-01-01 2020-01-02 2020-01-01 00:00:36 2020-01-02 03:45:36 2020-01-01 00:00:36.000 2020-01-02 03:45:36.000 36 99936 49986 5048586 36 99936 49986 5048586 -32533 32402 4565.009900990099 461066 -128 123 -2.4356435643564356 -246 -360 101 10350 99261 1.08108 298.08108 149.58108 14958.1081 1.08108 298.0811 149.58108 14958.10827 1.08108 298.08108 149.58108000000001 14958.10800 2020-01-01 2020-01-02 2020-01-01 00:06:00 2020-01-02 03:34:21 2020-01-01 00:06:00.000 2020-01-02 03:34:21.000 360 99261 49810.5 4981050 360 99261 49810.5 4981050 -32209 32726 5246.02 524602 -128 127 0.58 58 -361 101 10351 99262 1.08408 298.08408 149.58408 14958.4084 1.08408 298.08408 149.58408 14958.40856 1.08408 298.08408 149.58408 14958.40800 2020-01-01 2020-01-02 2020-01-01 00:06:01 2020-01-02 03:34:22 2020-01-01 00:06:01.000 2020-01-02 03:34:22.000 361 99262 49811.5 4981150 361 99262 49811.5 4981150 -32208 32727 5247.02 524702 -128 123 -0.98 -98 -362 101 10352 99263 1.08708 298.08708 149.58708 14958.7087 1.08708 298.0871 149.58708 14958.70868 1.08708 298.08708 149.58708000000001 14958.70800 2020-01-01 2020-01-02 2020-01-01 00:06:02 2020-01-02 03:34:23 2020-01-01 00:06:02.000 2020-01-02 03:34:23.000 362 99263 49812.5 4981250 362 99263 49812.5 4981250 -32207 32728 5248.02 524802 -127 124 0.02 2 -363 101 10353 99264 1.09009 298.09009 149.59009 14959.009 1.09009 298.0901 149.59008 14959.00884 1.09009 298.09009 149.59009 14959.00900 2020-01-01 2020-01-02 2020-01-01 00:06:03 2020-01-02 03:34:24 2020-01-01 00:06:03.000 2020-01-02 03:34:24.000 363 99264 49813.5 4981350 363 99264 49813.5 4981350 -32206 32729 5249.02 524902 -126 125 1.02 102 -364 101 10354 99265 1.09309 298.09309 149.59309 14959.3093 1.09309 298.09308 149.59309 14959.30915 1.09309 298.09309 149.59309 14959.30900 2020-01-01 2020-01-02 2020-01-01 00:06:04 2020-01-02 03:34:25 2020-01-01 00:06:04.000 2020-01-02 03:34:25.000 364 99265 49814.5 4981450 364 99265 49814.5 4981450 -32205 32730 5250.02 525002 -125 126 2.02 202 -365 101 10355 99266 1.09609 298.09609 149.59609 14959.6096 1.09609 298.0961 149.59609 14959.6099 1.09609 298.09609 149.59609 14959.60900 2020-01-01 2020-01-02 2020-01-01 00:06:05 2020-01-02 03:34:26 2020-01-01 00:06:05.000 2020-01-02 03:34:26.000 365 99266 49815.5 4981550 365 99266 49815.5 4981550 -32204 32731 5251.02 525102 -124 127 3.02 302 -366 101 10356 99267 1.09909 298.09909 149.59909 14959.9099 1.09909 298.0991 149.5991 14959.91003 1.09909 298.09909 149.59909 14959.90900 2020-01-01 2020-01-02 2020-01-01 00:06:06 2020-01-02 03:34:27 2020-01-01 00:06:06.000 2020-01-02 03:34:27.000 366 99267 49816.5 4981650 366 99267 49816.5 4981650 -32203 32732 5252.02 525202 -128 127 1.46 146 -367 101 10357 99268 1.1021 298.1021 149.6021 14960.21021 1.1021 298.1021 149.6021 14960.21015 1.10210 298.10210 149.60209999999998 14960.21000 2020-01-01 2020-01-02 2020-01-01 00:06:07 2020-01-02 03:34:28 2020-01-01 00:06:07.000 2020-01-02 03:34:28.000 367 99268 49817.5 4981750 367 99268 49817.5 4981750 -32202 32733 5253.02 525302 -128 123 -0.1 -10 -368 101 10358 99269 1.1051 298.1051 149.6051 14960.51051 1.1051 298.1051 149.6051 14960.51031 1.10510 298.10510 149.6051 14960.51000 2020-01-01 2020-01-02 2020-01-01 00:06:08 2020-01-02 03:34:29 2020-01-01 00:06:08.000 2020-01-02 03:34:29.000 368 99269 49818.5 4981850 368 99269 49818.5 4981850 -32201 32734 5254.02 525402 -127 124 0.9 90 -369 101 10359 99270 1.1081 298.1081 149.6081 14960.81081 1.1081 298.1081 149.6081 14960.81062 1.10810 298.10810 149.6081 14960.81000 2020-01-01 2020-01-02 2020-01-01 00:06:09 2020-01-02 03:34:30 2020-01-01 00:06:09.000 2020-01-02 03:34:30.000 369 99270 49819.5 4981950 369 99270 49819.5 4981950 -32200 32735 5255.02 525502 -126 125 1.9 190 +330 101 10320 99231 0.99099 297.99099 149.49099 14949.09909 0.99099 297.991 149.49099 14949.09941 0.99099 297.99099 149.49099 14949.099 2020-01-01 2020-01-02 2020-01-01 00:05:30 2020-01-02 03:33:51 2020-01-01 00:05:30.000 2020-01-02 03:33:51.000 330 99231 49780.5 4978050 330 99231 49780.5 4978050 -32239 32696 5216.02 521602 -128 123 -3.82 -382 +331 101 10321 99232 0.99399 297.99399 149.49399 14949.39939 0.99399 297.994 149.49399 14949.39911 0.99399 297.99399 149.49399 14949.399 2020-01-01 2020-01-02 2020-01-01 00:05:31 2020-01-02 03:33:52 2020-01-01 00:05:31.000 2020-01-02 03:33:52.000 331 99232 49781.5 4978150 331 99232 49781.5 4978150 -32238 32697 5217.02 521702 -127 124 -2.82 -282 +332 101 10322 99233 0.99699 297.99699 149.49699 14949.69969 0.99699 297.997 149.49699 14949.69969 0.99699 297.99699 149.49699 14949.699 2020-01-01 2020-01-02 2020-01-01 00:05:32 2020-01-02 03:33:53 2020-01-01 00:05:32.000 2020-01-02 03:33:53.000 332 99233 49782.5 4978250 332 99233 49782.5 4978250 -32237 32698 5218.02 521802 -126 125 -1.82 -182 +333 101 10323 99234 1 298 149.5 14950 1 298 149.5 14950 1 298 149.5 14950 2020-01-01 2020-01-02 2020-01-01 00:05:33 2020-01-02 03:33:54 2020-01-01 00:05:33.000 2020-01-02 03:33:54.000 333 99234 49783.5 4978350 333 99234 49783.5 4978350 -32236 32699 5219.02 521902 -125 126 -0.82 -82 +334 101 10324 99235 1.003 298.003 149.503 14950.3003 1.003 298.003 149.503 14950.30029 1.003 298.003 149.503 14950.3 2020-01-01 2020-01-02 2020-01-01 00:05:34 2020-01-02 03:33:55 2020-01-01 00:05:34.000 2020-01-02 03:33:55.000 334 99235 49784.5 4978450 334 99235 49784.5 4978450 -32235 32700 5220.02 522002 -124 127 0.18 18 +335 101 10325 99236 1.006 298.006 149.506 14950.6006 1.006 298.006 149.506 14950.60088 1.006 298.006 149.506 14950.6 2020-01-01 2020-01-02 2020-01-01 00:05:35 2020-01-02 03:33:56 2020-01-01 00:05:35.000 2020-01-02 03:33:56.000 335 99236 49785.5 4978550 335 99236 49785.5 4978550 -32234 32701 5221.02 522102 -128 127 -1.38 -138 +336 101 10326 99237 1.009 298.009 149.509 14950.9009 1.009 298.009 149.509 14950.90057 1.009 298.009 149.509 14950.9 2020-01-01 2020-01-02 2020-01-01 00:05:36 2020-01-02 03:33:57 2020-01-01 00:05:36.000 2020-01-02 03:33:57.000 336 99237 49786.5 4978650 336 99237 49786.5 4978650 -32233 32702 5222.02 522202 -128 123 -2.94 -294 +337 101 10327 99238 1.01201 298.01201 149.51201 14951.2012 1.01201 298.01202 149.51201 14951.20117 1.01201 298.01201 149.51201 14951.201 2020-01-01 2020-01-02 2020-01-01 00:05:37 2020-01-02 03:33:58 2020-01-01 00:05:37.000 2020-01-02 03:33:58.000 337 99238 49787.5 4978750 337 99238 49787.5 4978750 -32232 32703 5223.02 522302 -127 124 -1.94 -194 +338 101 10328 99239 1.01501 298.01501 149.51501 14951.5015 1.01501 298.015 149.51501 14951.50146 1.01501 298.01501 149.51501 14951.501 2020-01-01 2020-01-02 2020-01-01 00:05:38 2020-01-02 03:33:59 2020-01-01 00:05:38.000 2020-01-02 03:33:59.000 338 99239 49788.5 4978850 338 99239 49788.5 4978850 -32231 32704 5224.02 522402 -126 125 -0.94 -94 +339 101 10329 99240 1.01801 298.01801 149.51801 14951.8018 1.01801 298.018 149.51801 14951.80177 1.01801 298.01801 149.51801 14951.801 2020-01-01 2020-01-02 2020-01-01 00:05:39 2020-01-02 03:34:00 2020-01-01 00:05:39.000 2020-01-02 03:34:00.000 339 99240 49789.5 4978950 339 99240 49789.5 4978950 -32230 32705 5225.02 522502 -125 126 0.06 6 +34 102 10024 99934 0.1021 300.1021 150.1021 15160.31231 0.1021 300.1021 150.1021 15160.31224 0.1021 300.1021 150.10209999999998 15160.3121 2020-01-01 2020-01-02 2020-01-01 00:00:34 2020-01-02 03:45:34 2020-01-01 00:00:34.000 2020-01-02 03:45:34.000 34 99934 49984 5048384 34 99934 49984 5048384 -32535 32400 4563.009900990099 460864 -124 127 0.6336633663366337 64 +340 101 10330 99241 1.02102 298.02102 149.52102 14952.1021 1.02102 298.02103 149.52102 14952.10239 1.02102 298.02102 149.52102000000002 14952.102 2020-01-01 2020-01-02 2020-01-01 00:05:40 2020-01-02 03:34:01 2020-01-01 00:05:40.000 2020-01-02 03:34:01.000 340 99241 49790.5 4979050 340 99241 49790.5 4979050 -32229 32706 5226.02 522602 -124 127 1.06 106 +341 101 10331 99242 1.02402 298.02402 149.52402 14952.4024 1.02402 298.02402 149.52402 14952.40205 1.02402 298.02402 149.52402 14952.402 2020-01-01 2020-01-02 2020-01-01 00:05:41 2020-01-02 03:34:02 2020-01-01 00:05:41.000 2020-01-02 03:34:02.000 341 99242 49791.5 4979150 341 99242 49791.5 4979150 -32228 32707 5227.02 522702 -128 127 -0.5 -50 +342 101 10332 99243 1.02702 298.02702 149.52702 14952.7027 1.02702 298.02704 149.52702 14952.70264 1.02702 298.02702 149.52702 14952.702 2020-01-01 2020-01-02 2020-01-01 00:05:42 2020-01-02 03:34:03 2020-01-01 00:05:42.000 2020-01-02 03:34:03.000 342 99243 49792.5 4979250 342 99243 49792.5 4979250 -32227 32708 5228.02 522802 -128 123 -2.06 -206 +343 101 10333 99244 1.03003 298.03003 149.53003 14953.003 1.03003 298.03003 149.53002 14953.00293 1.03003 298.03003 149.53003 14953.003 2020-01-01 2020-01-02 2020-01-01 00:05:43 2020-01-02 03:34:04 2020-01-01 00:05:43.000 2020-01-02 03:34:04.000 343 99244 49793.5 4979350 343 99244 49793.5 4979350 -32226 32709 5229.02 522902 -127 124 -1.06 -106 +344 101 10334 99245 1.03303 298.03303 149.53303 14953.3033 1.03303 298.03302 149.53303 14953.30323 1.03303 298.03303 149.53303 14953.303 2020-01-01 2020-01-02 2020-01-01 00:05:44 2020-01-02 03:34:05 2020-01-01 00:05:44.000 2020-01-02 03:34:05.000 344 99245 49794.5 4979450 344 99245 49794.5 4979450 -32225 32710 5230.02 523002 -126 125 -0.06 -6 +345 101 10335 99246 1.03603 298.03603 149.53603 14953.6036 1.03603 298.03604 149.53603 14953.60386 1.03603 298.03603 149.53602999999998 14953.603 2020-01-01 2020-01-02 2020-01-01 00:05:45 2020-01-02 03:34:06 2020-01-01 00:05:45.000 2020-01-02 03:34:06.000 345 99246 49795.5 4979550 345 99246 49795.5 4979550 -32224 32711 5231.02 523102 -125 126 0.94 94 +346 101 10336 99247 1.03903 298.03903 149.53903 14953.9039 1.03903 298.03903 149.53903 14953.90352 1.03903 298.03903 149.53903 14953.903 2020-01-01 2020-01-02 2020-01-01 00:05:46 2020-01-02 03:34:07 2020-01-01 00:05:46.000 2020-01-02 03:34:07.000 346 99247 49796.5 4979650 346 99247 49796.5 4979650 -32223 32712 5232.02 523202 -124 127 1.94 194 +347 101 10337 99248 1.04204 298.04204 149.54204 14954.2042 1.04204 298.04205 149.54204 14954.20427 1.04204 298.04204 149.54204 14954.204 2020-01-01 2020-01-02 2020-01-01 00:05:47 2020-01-02 03:34:08 2020-01-01 00:05:47.000 2020-01-02 03:34:08.000 347 99248 49797.5 4979750 347 99248 49797.5 4979750 -32222 32713 5233.02 523302 -128 127 0.38 38 +348 101 10338 99249 1.04504 298.04504 149.54504 14954.5045 1.04504 298.04504 149.54504 14954.50441 1.04504 298.04504 149.54504 14954.504 2020-01-01 2020-01-02 2020-01-01 00:05:48 2020-01-02 03:34:09 2020-01-01 00:05:48.000 2020-01-02 03:34:09.000 348 99249 49798.5 4979850 348 99249 49798.5 4979850 -32221 32714 5234.02 523402 -128 123 -1.18 -118 +349 101 10339 99250 1.04804 298.04804 149.54804 14954.8048 1.04804 298.04803 149.54804 14954.80474 1.04804 298.04804 149.54804000000001 14954.804 2020-01-01 2020-01-02 2020-01-01 00:05:49 2020-01-02 03:34:10 2020-01-01 00:05:49.000 2020-01-02 03:34:10.000 349 99250 49799.5 4979950 349 99250 49799.5 4979950 -32220 32715 5235.02 523502 -127 124 -0.18 -18 +35 102 10025 99935 0.1051 300.1051 150.1051 15160.61561 0.1051 300.1051 150.1051 15160.61542 0.1051 300.1051 150.10510000000002 15160.6151 2020-01-01 2020-01-02 2020-01-01 00:00:35 2020-01-02 03:45:35 2020-01-01 00:00:35.000 2020-01-02 03:45:35.000 35 99935 49985 5048485 35 99935 49985 5048485 -32534 32401 4564.009900990099 460965 -128 127 -0.900990099009901 -91 +350 101 10340 99251 1.05105 298.05105 149.55105 14955.1051 1.05105 298.05106 149.55105 14955.10532 1.05105 298.05105 149.55105 14955.105 2020-01-01 2020-01-02 2020-01-01 00:05:50 2020-01-02 03:34:11 2020-01-01 00:05:50.000 2020-01-02 03:34:11.000 350 99251 49800.5 4980050 350 99251 49800.5 4980050 -32219 32716 5236.02 523602 -126 125 0.82 82 +351 101 10341 99252 1.05405 298.05405 149.55405 14955.4054 1.05405 298.05405 149.55404 14955.40499 1.05405 298.05405 149.55405000000002 14955.405 2020-01-01 2020-01-02 2020-01-01 00:05:51 2020-01-02 03:34:12 2020-01-01 00:05:51.000 2020-01-02 03:34:12.000 351 99252 49801.5 4980150 351 99252 49801.5 4980150 -32218 32717 5237.02 523702 -125 126 1.82 182 +352 101 10342 99253 1.05705 298.05705 149.55705 14955.7057 1.05705 298.05707 149.55705 14955.70574 1.05705 298.05705 149.55705 14955.705 2020-01-01 2020-01-02 2020-01-01 00:05:52 2020-01-02 03:34:13 2020-01-01 00:05:52.000 2020-01-02 03:34:13.000 352 99253 49802.5 4980250 352 99253 49802.5 4980250 -32217 32718 5238.02 523802 -124 127 2.82 282 +353 101 10343 99254 1.06006 298.06006 149.56006 14956.006 1.06006 298.06006 149.56005 14956.00587 1.06006 298.06006 149.56006 14956.006 2020-01-01 2020-01-02 2020-01-01 00:05:53 2020-01-02 03:34:14 2020-01-01 00:05:53.000 2020-01-02 03:34:14.000 353 99254 49803.5 4980350 353 99254 49803.5 4980350 -32216 32719 5239.02 523902 -128 127 1.26 126 +354 101 10344 99255 1.06306 298.06306 149.56306 14956.3063 1.06306 298.06305 149.56306 14956.3062 1.06306 298.06306 149.56306 14956.306 2020-01-01 2020-01-02 2020-01-01 00:05:54 2020-01-02 03:34:15 2020-01-01 00:05:54.000 2020-01-02 03:34:15.000 354 99255 49804.5 4980450 354 99255 49804.5 4980450 -32215 32720 5240.02 524002 -128 127 -0.3 -30 +355 101 10345 99256 1.06606 298.06606 149.56606 14956.6066 1.06606 298.06607 149.56606 14956.6068 1.06606 298.06606 149.56606 14956.606 2020-01-01 2020-01-02 2020-01-01 00:05:55 2020-01-02 03:34:16 2020-01-01 00:05:55.000 2020-01-02 03:34:16.000 355 99256 49805.5 4980550 355 99256 49805.5 4980550 -32214 32721 5241.02 524102 -128 123 -1.86 -186 +356 101 10346 99257 1.06906 298.06906 149.56906 14956.9069 1.06906 298.06906 149.56907 14956.90709 1.06906 298.06906 149.56906 14956.906 2020-01-01 2020-01-02 2020-01-01 00:05:56 2020-01-02 03:34:17 2020-01-01 00:05:56.000 2020-01-02 03:34:17.000 356 99257 49806.5 4980650 356 99257 49806.5 4980650 -32213 32722 5242.02 524202 -127 124 -0.86 -86 +357 101 10347 99258 1.07207 298.07207 149.57207 14957.2072 1.07207 298.07208 149.57207 14957.20721 1.07207 298.07207 149.57207 14957.207 2020-01-01 2020-01-02 2020-01-01 00:05:57 2020-01-02 03:34:18 2020-01-01 00:05:57.000 2020-01-02 03:34:18.000 357 99258 49807.5 4980750 357 99258 49807.5 4980750 -32212 32723 5243.02 524302 -126 125 0.14 14 +358 101 10348 99259 1.07507 298.07507 149.57507 14957.5075 1.07507 298.07507 149.57507 14957.50734 1.07507 298.07507 149.57506999999998 14957.507 2020-01-01 2020-01-02 2020-01-01 00:05:58 2020-01-02 03:34:19 2020-01-01 00:05:58.000 2020-01-02 03:34:19.000 358 99259 49808.5 4980850 358 99259 49808.5 4980850 -32211 32724 5244.02 524402 -125 126 1.14 114 +359 101 10349 99260 1.07807 298.07807 149.57807 14957.8078 1.07807 298.07806 149.57807 14957.80767 1.07807 298.07807 149.57807 14957.807 2020-01-01 2020-01-02 2020-01-01 00:05:59 2020-01-02 03:34:20 2020-01-01 00:05:59.000 2020-01-02 03:34:20.000 359 99260 49809.5 4980950 359 99260 49809.5 4980950 -32210 32725 5245.02 524502 -124 127 2.14 214 +36 102 10026 99936 0.1081 300.1081 150.1081 15160.91891 0.1081 300.1081 150.1081 15160.91873 0.1081 300.1081 150.1081 15160.9181 2020-01-01 2020-01-02 2020-01-01 00:00:36 2020-01-02 03:45:36 2020-01-01 00:00:36.000 2020-01-02 03:45:36.000 36 99936 49986 5048586 36 99936 49986 5048586 -32533 32402 4565.009900990099 461066 -128 123 -2.4356435643564356 -246 +360 101 10350 99261 1.08108 298.08108 149.58108 14958.1081 1.08108 298.0811 149.58108 14958.10827 1.08108 298.08108 149.58108000000001 14958.108 2020-01-01 2020-01-02 2020-01-01 00:06:00 2020-01-02 03:34:21 2020-01-01 00:06:00.000 2020-01-02 03:34:21.000 360 99261 49810.5 4981050 360 99261 49810.5 4981050 -32209 32726 5246.02 524602 -128 127 0.58 58 +361 101 10351 99262 1.08408 298.08408 149.58408 14958.4084 1.08408 298.08408 149.58408 14958.40856 1.08408 298.08408 149.58408 14958.408 2020-01-01 2020-01-02 2020-01-01 00:06:01 2020-01-02 03:34:22 2020-01-01 00:06:01.000 2020-01-02 03:34:22.000 361 99262 49811.5 4981150 361 99262 49811.5 4981150 -32208 32727 5247.02 524702 -128 123 -0.98 -98 +362 101 10352 99263 1.08708 298.08708 149.58708 14958.7087 1.08708 298.0871 149.58708 14958.70868 1.08708 298.08708 149.58708000000001 14958.708 2020-01-01 2020-01-02 2020-01-01 00:06:02 2020-01-02 03:34:23 2020-01-01 00:06:02.000 2020-01-02 03:34:23.000 362 99263 49812.5 4981250 362 99263 49812.5 4981250 -32207 32728 5248.02 524802 -127 124 0.02 2 +363 101 10353 99264 1.09009 298.09009 149.59009 14959.009 1.09009 298.0901 149.59008 14959.00884 1.09009 298.09009 149.59009 14959.009 2020-01-01 2020-01-02 2020-01-01 00:06:03 2020-01-02 03:34:24 2020-01-01 00:06:03.000 2020-01-02 03:34:24.000 363 99264 49813.5 4981350 363 99264 49813.5 4981350 -32206 32729 5249.02 524902 -126 125 1.02 102 +364 101 10354 99265 1.09309 298.09309 149.59309 14959.3093 1.09309 298.09308 149.59309 14959.30915 1.09309 298.09309 149.59309 14959.309 2020-01-01 2020-01-02 2020-01-01 00:06:04 2020-01-02 03:34:25 2020-01-01 00:06:04.000 2020-01-02 03:34:25.000 364 99265 49814.5 4981450 364 99265 49814.5 4981450 -32205 32730 5250.02 525002 -125 126 2.02 202 +365 101 10355 99266 1.09609 298.09609 149.59609 14959.6096 1.09609 298.0961 149.59609 14959.6099 1.09609 298.09609 149.59609 14959.609 2020-01-01 2020-01-02 2020-01-01 00:06:05 2020-01-02 03:34:26 2020-01-01 00:06:05.000 2020-01-02 03:34:26.000 365 99266 49815.5 4981550 365 99266 49815.5 4981550 -32204 32731 5251.02 525102 -124 127 3.02 302 +366 101 10356 99267 1.09909 298.09909 149.59909 14959.9099 1.09909 298.0991 149.5991 14959.91003 1.09909 298.09909 149.59909 14959.909 2020-01-01 2020-01-02 2020-01-01 00:06:06 2020-01-02 03:34:27 2020-01-01 00:06:06.000 2020-01-02 03:34:27.000 366 99267 49816.5 4981650 366 99267 49816.5 4981650 -32203 32732 5252.02 525202 -128 127 1.46 146 +367 101 10357 99268 1.1021 298.1021 149.6021 14960.21021 1.1021 298.1021 149.6021 14960.21015 1.1021 298.1021 149.60209999999998 14960.21 2020-01-01 2020-01-02 2020-01-01 00:06:07 2020-01-02 03:34:28 2020-01-01 00:06:07.000 2020-01-02 03:34:28.000 367 99268 49817.5 4981750 367 99268 49817.5 4981750 -32202 32733 5253.02 525302 -128 123 -0.1 -10 +368 101 10358 99269 1.1051 298.1051 149.6051 14960.51051 1.1051 298.1051 149.6051 14960.51031 1.1051 298.1051 149.6051 14960.51 2020-01-01 2020-01-02 2020-01-01 00:06:08 2020-01-02 03:34:29 2020-01-01 00:06:08.000 2020-01-02 03:34:29.000 368 99269 49818.5 4981850 368 99269 49818.5 4981850 -32201 32734 5254.02 525402 -127 124 0.9 90 +369 101 10359 99270 1.1081 298.1081 149.6081 14960.81081 1.1081 298.1081 149.6081 14960.81062 1.1081 298.1081 149.6081 14960.81 2020-01-01 2020-01-02 2020-01-01 00:06:09 2020-01-02 03:34:30 2020-01-01 00:06:09.000 2020-01-02 03:34:30.000 369 99270 49819.5 4981950 369 99270 49819.5 4981950 -32200 32735 5255.02 525502 -126 125 1.9 190 37 102 10027 99937 0.11111 300.11111 150.11111 15161.22222 0.11111 300.1111 150.11111 15161.22248 0.11111 300.11111 150.11111 15161.22211 2020-01-01 2020-01-02 2020-01-01 00:00:37 2020-01-02 03:45:37 2020-01-01 00:00:37.000 2020-01-02 03:45:37.000 37 99937 49987 5048687 37 99937 49987 5048687 -32532 32403 4566.009900990099 461167 -127 124 -1.4356435643564356 -145 -370 101 10360 99271 1.11111 298.11111 149.61111 14961.11111 1.11111 298.1111 149.61111 14961.11137 1.11111 298.11111 149.61111 14961.11100 2020-01-01 2020-01-02 2020-01-01 00:06:10 2020-01-02 03:34:31 2020-01-01 00:06:10.000 2020-01-02 03:34:31.000 370 99271 49820.5 4982050 370 99271 49820.5 4982050 -32199 32736 5256.02 525602 -125 126 2.9 290 -371 101 10361 99272 1.11411 298.11411 149.61411 14961.41141 1.11411 298.1141 149.61411 14961.4115 1.11411 298.11411 149.61411 14961.41100 2020-01-01 2020-01-02 2020-01-01 00:06:11 2020-01-02 03:34:32 2020-01-01 00:06:11.000 2020-01-02 03:34:32.000 371 99272 49821.5 4982150 371 99272 49821.5 4982150 -32198 32737 5257.02 525702 -124 127 3.9 390 -372 101 10362 99273 1.11711 298.11711 149.61711 14961.71171 1.11711 298.11713 149.61711 14961.71165 1.11711 298.11711 149.61711 14961.71100 2020-01-01 2020-01-02 2020-01-01 00:06:12 2020-01-02 03:34:33 2020-01-01 00:06:12.000 2020-01-02 03:34:33.000 372 99273 49822.5 4982250 372 99273 49822.5 4982250 -32197 32738 5258.02 525802 -128 127 2.34 234 -373 101 10363 99274 1.12012 298.12012 149.62012 14962.01201 1.12012 298.12012 149.62011 14962.01179 1.12012 298.12012 149.62012000000001 14962.01200 2020-01-01 2020-01-02 2020-01-01 00:06:13 2020-01-02 03:34:34 2020-01-01 00:06:13.000 2020-01-02 03:34:34.000 373 99274 49823.5 4982350 373 99274 49823.5 4982350 -32196 32739 5259.02 525902 -128 123 0.78 78 -374 101 10364 99275 1.12312 298.12312 149.62312 14962.31231 1.12312 298.1231 149.62312 14962.31208 1.12312 298.12312 149.62312 14962.31200 2020-01-01 2020-01-02 2020-01-01 00:06:14 2020-01-02 03:34:35 2020-01-01 00:06:14.000 2020-01-02 03:34:35.000 374 99275 49824.5 4982450 374 99275 49824.5 4982450 -32195 32740 5260.02 526002 -127 124 1.78 178 -375 101 10365 99276 1.12612 298.12612 149.62612 14962.61261 1.12612 298.12613 149.62612 14962.61283 1.12612 298.12612 149.62612 14962.61200 2020-01-01 2020-01-02 2020-01-01 00:06:15 2020-01-02 03:34:36 2020-01-01 00:06:15.000 2020-01-02 03:34:36.000 375 99276 49825.5 4982550 375 99276 49825.5 4982550 -32194 32741 5261.02 526102 -126 125 2.78 278 -376 101 10366 99277 1.12912 298.12912 149.62912 14962.91291 1.12912 298.12912 149.62912 14962.91297 1.12912 298.12912 149.62912 14962.91200 2020-01-01 2020-01-02 2020-01-01 00:06:16 2020-01-02 03:34:37 2020-01-01 00:06:16.000 2020-01-02 03:34:37.000 376 99277 49826.5 4982650 376 99277 49826.5 4982650 -32193 32742 5262.02 526202 -125 126 3.78 378 -377 101 10367 99278 1.13213 298.13213 149.63213 14963.21321 1.13213 298.13214 149.63213 14963.21312 1.13213 298.13213 149.63213 14963.21300 2020-01-01 2020-01-02 2020-01-01 00:06:17 2020-01-02 03:34:38 2020-01-01 00:06:17.000 2020-01-02 03:34:38.000 377 99278 49827.5 4982750 377 99278 49827.5 4982750 -32192 32743 5263.02 526302 -124 127 4.78 478 -378 101 10368 99279 1.13513 298.13513 149.63513 14963.51351 1.13513 298.13513 149.63513 14963.51326 1.13513 298.13513 149.63513 14963.51300 2020-01-01 2020-01-02 2020-01-01 00:06:18 2020-01-02 03:34:39 2020-01-01 00:06:18.000 2020-01-02 03:34:39.000 378 99279 49828.5 4982850 378 99279 49828.5 4982850 -32191 32744 5264.02 526402 -128 127 3.22 322 -379 101 10369 99280 1.13813 298.13813 149.63813 14963.81381 1.13813 298.13815 149.63814 14963.81401 1.13813 298.13813 149.63813 14963.81300 2020-01-01 2020-01-02 2020-01-01 00:06:19 2020-01-02 03:34:40 2020-01-01 00:06:19.000 2020-01-02 03:34:40.000 379 99280 49829.5 4982950 379 99280 49829.5 4982950 -32190 32745 5265.02 526502 -128 127 1.66 166 +370 101 10360 99271 1.11111 298.11111 149.61111 14961.11111 1.11111 298.1111 149.61111 14961.11137 1.11111 298.11111 149.61111 14961.111 2020-01-01 2020-01-02 2020-01-01 00:06:10 2020-01-02 03:34:31 2020-01-01 00:06:10.000 2020-01-02 03:34:31.000 370 99271 49820.5 4982050 370 99271 49820.5 4982050 -32199 32736 5256.02 525602 -125 126 2.9 290 +371 101 10361 99272 1.11411 298.11411 149.61411 14961.41141 1.11411 298.1141 149.61411 14961.4115 1.11411 298.11411 149.61411 14961.411 2020-01-01 2020-01-02 2020-01-01 00:06:11 2020-01-02 03:34:32 2020-01-01 00:06:11.000 2020-01-02 03:34:32.000 371 99272 49821.5 4982150 371 99272 49821.5 4982150 -32198 32737 5257.02 525702 -124 127 3.9 390 +372 101 10362 99273 1.11711 298.11711 149.61711 14961.71171 1.11711 298.11713 149.61711 14961.71165 1.11711 298.11711 149.61711 14961.711 2020-01-01 2020-01-02 2020-01-01 00:06:12 2020-01-02 03:34:33 2020-01-01 00:06:12.000 2020-01-02 03:34:33.000 372 99273 49822.5 4982250 372 99273 49822.5 4982250 -32197 32738 5258.02 525802 -128 127 2.34 234 +373 101 10363 99274 1.12012 298.12012 149.62012 14962.01201 1.12012 298.12012 149.62011 14962.01179 1.12012 298.12012 149.62012000000001 14962.012 2020-01-01 2020-01-02 2020-01-01 00:06:13 2020-01-02 03:34:34 2020-01-01 00:06:13.000 2020-01-02 03:34:34.000 373 99274 49823.5 4982350 373 99274 49823.5 4982350 -32196 32739 5259.02 525902 -128 123 0.78 78 +374 101 10364 99275 1.12312 298.12312 149.62312 14962.31231 1.12312 298.1231 149.62312 14962.31208 1.12312 298.12312 149.62312 14962.312 2020-01-01 2020-01-02 2020-01-01 00:06:14 2020-01-02 03:34:35 2020-01-01 00:06:14.000 2020-01-02 03:34:35.000 374 99275 49824.5 4982450 374 99275 49824.5 4982450 -32195 32740 5260.02 526002 -127 124 1.78 178 +375 101 10365 99276 1.12612 298.12612 149.62612 14962.61261 1.12612 298.12613 149.62612 14962.61283 1.12612 298.12612 149.62612 14962.612 2020-01-01 2020-01-02 2020-01-01 00:06:15 2020-01-02 03:34:36 2020-01-01 00:06:15.000 2020-01-02 03:34:36.000 375 99276 49825.5 4982550 375 99276 49825.5 4982550 -32194 32741 5261.02 526102 -126 125 2.78 278 +376 101 10366 99277 1.12912 298.12912 149.62912 14962.91291 1.12912 298.12912 149.62912 14962.91297 1.12912 298.12912 149.62912 14962.912 2020-01-01 2020-01-02 2020-01-01 00:06:16 2020-01-02 03:34:37 2020-01-01 00:06:16.000 2020-01-02 03:34:37.000 376 99277 49826.5 4982650 376 99277 49826.5 4982650 -32193 32742 5262.02 526202 -125 126 3.78 378 +377 101 10367 99278 1.13213 298.13213 149.63213 14963.21321 1.13213 298.13214 149.63213 14963.21312 1.13213 298.13213 149.63213 14963.213 2020-01-01 2020-01-02 2020-01-01 00:06:17 2020-01-02 03:34:38 2020-01-01 00:06:17.000 2020-01-02 03:34:38.000 377 99278 49827.5 4982750 377 99278 49827.5 4982750 -32192 32743 5263.02 526302 -124 127 4.78 478 +378 101 10368 99279 1.13513 298.13513 149.63513 14963.51351 1.13513 298.13513 149.63513 14963.51326 1.13513 298.13513 149.63513 14963.513 2020-01-01 2020-01-02 2020-01-01 00:06:18 2020-01-02 03:34:39 2020-01-01 00:06:18.000 2020-01-02 03:34:39.000 378 99279 49828.5 4982850 378 99279 49828.5 4982850 -32191 32744 5264.02 526402 -128 127 3.22 322 +379 101 10369 99280 1.13813 298.13813 149.63813 14963.81381 1.13813 298.13815 149.63814 14963.81401 1.13813 298.13813 149.63813 14963.813 2020-01-01 2020-01-02 2020-01-01 00:06:19 2020-01-02 03:34:40 2020-01-01 00:06:19.000 2020-01-02 03:34:40.000 379 99280 49829.5 4982950 379 99280 49829.5 4982950 -32190 32745 5265.02 526502 -128 127 1.66 166 38 102 10028 99938 0.11411 300.11411 150.11411 15161.52552 0.11411 300.1141 150.11411 15161.52562 0.11411 300.11411 150.11411 15161.52511 2020-01-01 2020-01-02 2020-01-01 00:00:38 2020-01-02 03:45:38 2020-01-01 00:00:38.000 2020-01-02 03:45:38.000 38 99938 49988 5048788 38 99938 49988 5048788 -32531 32404 4567.009900990099 461268 -126 125 -0.43564356435643564 -44 -380 101 10370 99281 1.14114 298.14114 149.64114 14964.11411 1.14114 298.14114 149.64114 14964.11431 1.14114 298.14114 149.64114 14964.11400 2020-01-01 2020-01-02 2020-01-01 00:06:20 2020-01-02 03:34:41 2020-01-01 00:06:20.000 2020-01-02 03:34:41.000 380 99281 49830.5 4983050 380 99281 49830.5 4983050 -32189 32746 5266.02 526602 -128 124 0.1 10 -381 101 10371 99282 1.14414 298.14414 149.64414 14964.41441 1.14414 298.14413 149.64414 14964.41448 1.14414 298.14414 149.64414 14964.41400 2020-01-01 2020-01-02 2020-01-01 00:06:21 2020-01-02 03:34:42 2020-01-01 00:06:21.000 2020-01-02 03:34:42.000 381 99282 49831.5 4983150 381 99282 49831.5 4983150 -32188 32747 5267.02 526702 -127 125 1.1 110 -382 101 10372 99283 1.14714 298.14714 149.64714 14964.71471 1.14714 298.14716 149.64714 14964.71459 1.14714 298.14714 149.64714 14964.71400 2020-01-01 2020-01-02 2020-01-01 00:06:22 2020-01-02 03:34:43 2020-01-01 00:06:22.000 2020-01-02 03:34:43.000 382 99283 49832.5 4983250 382 99283 49832.5 4983250 -32187 32748 5268.02 526802 -126 126 2.1 210 -383 101 10373 99284 1.15015 298.15015 149.65015 14965.01501 1.15015 298.15015 149.65014 14965.01472 1.15015 298.15015 149.65015 14965.01500 2020-01-01 2020-01-02 2020-01-01 00:06:23 2020-01-02 03:34:44 2020-01-01 00:06:23.000 2020-01-02 03:34:44.000 383 99284 49833.5 4983350 383 99284 49833.5 4983350 -32186 32749 5269.02 526902 -125 127 3.1 310 -384 101 10374 99285 1.15315 298.15315 149.65315 14965.31531 1.15315 298.15317 149.65315 14965.31547 1.15315 298.15315 149.65315 14965.31500 2020-01-01 2020-01-02 2020-01-01 00:06:24 2020-01-02 03:34:45 2020-01-01 00:06:24.000 2020-01-02 03:34:45.000 384 99285 49834.5 4983450 384 99285 49834.5 4983450 -32185 32750 5270.02 527002 -128 127 1.54 154 -385 101 10375 99286 1.15615 298.15615 149.65615 14965.61561 1.15615 298.15616 149.65615 14965.61578 1.15615 298.15615 149.65615 14965.61500 2020-01-01 2020-01-02 2020-01-01 00:06:25 2020-01-02 03:34:46 2020-01-01 00:06:25.000 2020-01-02 03:34:46.000 385 99286 49835.5 4983550 385 99286 49835.5 4983550 -32184 32751 5271.02 527102 -128 127 -0.02 -2 -386 101 10376 99287 1.15915 298.15915 149.65915 14965.91591 1.15915 298.15915 149.65915 14965.91594 1.15915 298.15915 149.65915 14965.91500 2020-01-01 2020-01-02 2020-01-01 00:06:26 2020-01-02 03:34:47 2020-01-01 00:06:26.000 2020-01-02 03:34:47.000 386 99287 49836.5 4983650 386 99287 49836.5 4983650 -32183 32752 5272.02 527202 -128 123 -1.58 -158 -387 101 10377 99288 1.16216 298.16216 149.66216 14966.21621 1.16216 298.16217 149.66216 14966.21606 1.16216 298.16216 149.66216 14966.21600 2020-01-01 2020-01-02 2020-01-01 00:06:27 2020-01-02 03:34:48 2020-01-01 00:06:27.000 2020-01-02 03:34:48.000 387 99288 49837.5 4983750 387 99288 49837.5 4983750 -32182 32753 5273.02 527302 -127 124 -0.58 -58 -388 101 10378 99289 1.16516 298.16516 149.66516 14966.51651 1.16516 298.16516 149.66516 14966.51636 1.16516 298.16516 149.66516 14966.51600 2020-01-01 2020-01-02 2020-01-01 00:06:28 2020-01-02 03:34:49 2020-01-01 00:06:28.000 2020-01-02 03:34:49.000 388 99289 49838.5 4983850 388 99289 49838.5 4983850 -32181 32754 5274.02 527402 -126 125 0.42 42 -389 101 10379 99290 1.16816 298.16816 149.66816 14966.81681 1.16816 298.16818 149.66816 14966.81695 1.16816 298.16816 149.66816 14966.81600 2020-01-01 2020-01-02 2020-01-01 00:06:29 2020-01-02 03:34:50 2020-01-01 00:06:29.000 2020-01-02 03:34:50.000 389 99290 49839.5 4983950 389 99290 49839.5 4983950 -32180 32755 5275.02 527502 -125 126 1.42 142 +380 101 10370 99281 1.14114 298.14114 149.64114 14964.11411 1.14114 298.14114 149.64114 14964.11431 1.14114 298.14114 149.64114 14964.114 2020-01-01 2020-01-02 2020-01-01 00:06:20 2020-01-02 03:34:41 2020-01-01 00:06:20.000 2020-01-02 03:34:41.000 380 99281 49830.5 4983050 380 99281 49830.5 4983050 -32189 32746 5266.02 526602 -128 124 0.1 10 +381 101 10371 99282 1.14414 298.14414 149.64414 14964.41441 1.14414 298.14413 149.64414 14964.41448 1.14414 298.14414 149.64414 14964.414 2020-01-01 2020-01-02 2020-01-01 00:06:21 2020-01-02 03:34:42 2020-01-01 00:06:21.000 2020-01-02 03:34:42.000 381 99282 49831.5 4983150 381 99282 49831.5 4983150 -32188 32747 5267.02 526702 -127 125 1.1 110 +382 101 10372 99283 1.14714 298.14714 149.64714 14964.71471 1.14714 298.14716 149.64714 14964.71459 1.14714 298.14714 149.64714 14964.714 2020-01-01 2020-01-02 2020-01-01 00:06:22 2020-01-02 03:34:43 2020-01-01 00:06:22.000 2020-01-02 03:34:43.000 382 99283 49832.5 4983250 382 99283 49832.5 4983250 -32187 32748 5268.02 526802 -126 126 2.1 210 +383 101 10373 99284 1.15015 298.15015 149.65015 14965.01501 1.15015 298.15015 149.65014 14965.01472 1.15015 298.15015 149.65015 14965.015 2020-01-01 2020-01-02 2020-01-01 00:06:23 2020-01-02 03:34:44 2020-01-01 00:06:23.000 2020-01-02 03:34:44.000 383 99284 49833.5 4983350 383 99284 49833.5 4983350 -32186 32749 5269.02 526902 -125 127 3.1 310 +384 101 10374 99285 1.15315 298.15315 149.65315 14965.31531 1.15315 298.15317 149.65315 14965.31547 1.15315 298.15315 149.65315 14965.315 2020-01-01 2020-01-02 2020-01-01 00:06:24 2020-01-02 03:34:45 2020-01-01 00:06:24.000 2020-01-02 03:34:45.000 384 99285 49834.5 4983450 384 99285 49834.5 4983450 -32185 32750 5270.02 527002 -128 127 1.54 154 +385 101 10375 99286 1.15615 298.15615 149.65615 14965.61561 1.15615 298.15616 149.65615 14965.61578 1.15615 298.15615 149.65615 14965.615 2020-01-01 2020-01-02 2020-01-01 00:06:25 2020-01-02 03:34:46 2020-01-01 00:06:25.000 2020-01-02 03:34:46.000 385 99286 49835.5 4983550 385 99286 49835.5 4983550 -32184 32751 5271.02 527102 -128 127 -0.02 -2 +386 101 10376 99287 1.15915 298.15915 149.65915 14965.91591 1.15915 298.15915 149.65915 14965.91594 1.15915 298.15915 149.65915 14965.915 2020-01-01 2020-01-02 2020-01-01 00:06:26 2020-01-02 03:34:47 2020-01-01 00:06:26.000 2020-01-02 03:34:47.000 386 99287 49836.5 4983650 386 99287 49836.5 4983650 -32183 32752 5272.02 527202 -128 123 -1.58 -158 +387 101 10377 99288 1.16216 298.16216 149.66216 14966.21621 1.16216 298.16217 149.66216 14966.21606 1.16216 298.16216 149.66216 14966.216 2020-01-01 2020-01-02 2020-01-01 00:06:27 2020-01-02 03:34:48 2020-01-01 00:06:27.000 2020-01-02 03:34:48.000 387 99288 49837.5 4983750 387 99288 49837.5 4983750 -32182 32753 5273.02 527302 -127 124 -0.58 -58 +388 101 10378 99289 1.16516 298.16516 149.66516 14966.51651 1.16516 298.16516 149.66516 14966.51636 1.16516 298.16516 149.66516 14966.516 2020-01-01 2020-01-02 2020-01-01 00:06:28 2020-01-02 03:34:49 2020-01-01 00:06:28.000 2020-01-02 03:34:49.000 388 99289 49838.5 4983850 388 99289 49838.5 4983850 -32181 32754 5274.02 527402 -126 125 0.42 42 +389 101 10379 99290 1.16816 298.16816 149.66816 14966.81681 1.16816 298.16818 149.66816 14966.81695 1.16816 298.16816 149.66816 14966.816 2020-01-01 2020-01-02 2020-01-01 00:06:29 2020-01-02 03:34:50 2020-01-01 00:06:29.000 2020-01-02 03:34:50.000 389 99290 49839.5 4983950 389 99290 49839.5 4983950 -32180 32755 5275.02 527502 -125 126 1.42 142 39 102 10029 99939 0.11711 300.11711 150.11711 15161.82882 0.11711 300.11713 150.11711 15161.82876 0.11711 300.11711 150.11711 15161.82811 2020-01-01 2020-01-02 2020-01-01 00:00:39 2020-01-02 03:45:39 2020-01-01 00:00:39.000 2020-01-02 03:45:39.000 39 99939 49989 5048889 39 99939 49989 5048889 -32530 32405 4568.009900990099 461369 -125 126 0.5643564356435643 57 -390 101 10380 99291 1.17117 298.17117 149.67117 14967.11711 1.17117 298.17117 149.67117 14967.11725 1.17117 298.17117 149.67117 14967.11700 2020-01-01 2020-01-02 2020-01-01 00:06:30 2020-01-02 03:34:51 2020-01-01 00:06:30.000 2020-01-02 03:34:51.000 390 99291 49840.5 4984050 390 99291 49840.5 4984050 -32179 32756 5276.02 527602 -124 127 2.42 242 -391 101 10381 99292 1.17417 298.17417 149.67417 14967.41741 1.17417 298.17416 149.67417 14967.41741 1.17417 298.17417 149.67417 14967.41700 2020-01-01 2020-01-02 2020-01-01 00:06:31 2020-01-02 03:34:52 2020-01-01 00:06:31.000 2020-01-02 03:34:52.000 391 99292 49841.5 4984150 391 99292 49841.5 4984150 -32178 32757 5277.02 527702 -128 127 0.86 86 -392 101 10382 99293 1.17717 298.17717 149.67717 14967.71771 1.17717 298.1772 149.67717 14967.71753 1.17717 298.17717 149.67717000000002 14967.71700 2020-01-01 2020-01-02 2020-01-01 00:06:32 2020-01-02 03:34:53 2020-01-01 00:06:32.000 2020-01-02 03:34:53.000 392 99293 49842.5 4984250 392 99293 49842.5 4984250 -32177 32758 5278.02 527802 -128 123 -0.7 -70 -393 101 10383 99294 1.18018 298.18018 149.68018 14968.01801 1.18018 298.18018 149.68017 14968.01782 1.18018 298.18018 149.68018 14968.01800 2020-01-01 2020-01-02 2020-01-01 00:06:33 2020-01-02 03:34:54 2020-01-01 00:06:33.000 2020-01-02 03:34:54.000 393 99294 49843.5 4984350 393 99294 49843.5 4984350 -32176 32759 5279.02 527902 -127 124 0.3 30 -394 101 10384 99295 1.18318 298.18318 149.68318 14968.31831 1.18318 298.1832 149.68318 14968.31842 1.18318 298.18318 149.68318 14968.31800 2020-01-01 2020-01-02 2020-01-01 00:06:34 2020-01-02 03:34:55 2020-01-01 00:06:34.000 2020-01-02 03:34:55.000 394 99295 49844.5 4984450 394 99295 49844.5 4984450 -32175 32760 5280.02 528002 -126 125 1.3 130 -395 101 10385 99296 1.18618 298.18618 149.68618 14968.61861 1.18618 298.1862 149.68618 14968.61875 1.18618 298.18618 149.68618 14968.61800 2020-01-01 2020-01-02 2020-01-01 00:06:35 2020-01-02 03:34:56 2020-01-01 00:06:35.000 2020-01-02 03:34:56.000 395 99296 49845.5 4984550 395 99296 49845.5 4984550 -32174 32761 5281.02 528102 -125 126 2.3 230 -396 101 10386 99297 1.18918 298.18918 149.68918 14968.91891 1.18918 298.18918 149.68918 14968.91889 1.18918 298.18918 149.68918 14968.91800 2020-01-01 2020-01-02 2020-01-01 00:06:36 2020-01-02 03:34:57 2020-01-01 00:06:36.000 2020-01-02 03:34:57.000 396 99297 49846.5 4984650 396 99297 49846.5 4984650 -32173 32762 5282.02 528202 -124 127 3.3 330 -397 101 10387 99298 1.19219 298.19219 149.69219 14969.21921 1.19219 298.1922 149.69219 14969.21964 1.19219 298.19219 149.69218999999998 14969.21900 2020-01-01 2020-01-02 2020-01-01 00:06:37 2020-01-02 03:34:58 2020-01-01 00:06:37.000 2020-01-02 03:34:58.000 397 99298 49847.5 4984750 397 99298 49847.5 4984750 -32172 32763 5283.02 528302 -128 127 1.74 174 -398 101 10388 99299 1.19519 298.19519 149.69519 14969.51951 1.19519 298.1952 149.69519 14969.51929 1.19519 298.19519 149.69519 14969.51900 2020-01-01 2020-01-02 2020-01-01 00:06:38 2020-01-02 03:34:59 2020-01-01 00:06:38.000 2020-01-02 03:34:59.000 398 99299 49848.5 4984850 398 99299 49848.5 4984850 -32171 32764 5284.02 528402 -128 123 0.18 18 -399 101 10389 99300 1.19819 298.19819 149.69819 14969.81981 1.19819 298.1982 149.69819 14969.81989 1.19819 298.19819 149.69818999999998 14969.81900 2020-01-01 2020-01-02 2020-01-01 00:06:39 2020-01-02 03:35:00 2020-01-01 00:06:39.000 2020-01-02 03:35:00.000 399 99300 49849.5 4984950 399 99300 49849.5 4984950 -32170 32765 5285.02 528502 -127 124 1.18 118 +390 101 10380 99291 1.17117 298.17117 149.67117 14967.11711 1.17117 298.17117 149.67117 14967.11725 1.17117 298.17117 149.67117 14967.117 2020-01-01 2020-01-02 2020-01-01 00:06:30 2020-01-02 03:34:51 2020-01-01 00:06:30.000 2020-01-02 03:34:51.000 390 99291 49840.5 4984050 390 99291 49840.5 4984050 -32179 32756 5276.02 527602 -124 127 2.42 242 +391 101 10381 99292 1.17417 298.17417 149.67417 14967.41741 1.17417 298.17416 149.67417 14967.41741 1.17417 298.17417 149.67417 14967.417 2020-01-01 2020-01-02 2020-01-01 00:06:31 2020-01-02 03:34:52 2020-01-01 00:06:31.000 2020-01-02 03:34:52.000 391 99292 49841.5 4984150 391 99292 49841.5 4984150 -32178 32757 5277.02 527702 -128 127 0.86 86 +392 101 10382 99293 1.17717 298.17717 149.67717 14967.71771 1.17717 298.1772 149.67717 14967.71753 1.17717 298.17717 149.67717000000002 14967.717 2020-01-01 2020-01-02 2020-01-01 00:06:32 2020-01-02 03:34:53 2020-01-01 00:06:32.000 2020-01-02 03:34:53.000 392 99293 49842.5 4984250 392 99293 49842.5 4984250 -32177 32758 5278.02 527802 -128 123 -0.7 -70 +393 101 10383 99294 1.18018 298.18018 149.68018 14968.01801 1.18018 298.18018 149.68017 14968.01782 1.18018 298.18018 149.68018 14968.018 2020-01-01 2020-01-02 2020-01-01 00:06:33 2020-01-02 03:34:54 2020-01-01 00:06:33.000 2020-01-02 03:34:54.000 393 99294 49843.5 4984350 393 99294 49843.5 4984350 -32176 32759 5279.02 527902 -127 124 0.3 30 +394 101 10384 99295 1.18318 298.18318 149.68318 14968.31831 1.18318 298.1832 149.68318 14968.31842 1.18318 298.18318 149.68318 14968.318 2020-01-01 2020-01-02 2020-01-01 00:06:34 2020-01-02 03:34:55 2020-01-01 00:06:34.000 2020-01-02 03:34:55.000 394 99295 49844.5 4984450 394 99295 49844.5 4984450 -32175 32760 5280.02 528002 -126 125 1.3 130 +395 101 10385 99296 1.18618 298.18618 149.68618 14968.61861 1.18618 298.1862 149.68618 14968.61875 1.18618 298.18618 149.68618 14968.618 2020-01-01 2020-01-02 2020-01-01 00:06:35 2020-01-02 03:34:56 2020-01-01 00:06:35.000 2020-01-02 03:34:56.000 395 99296 49845.5 4984550 395 99296 49845.5 4984550 -32174 32761 5281.02 528102 -125 126 2.3 230 +396 101 10386 99297 1.18918 298.18918 149.68918 14968.91891 1.18918 298.18918 149.68918 14968.91889 1.18918 298.18918 149.68918 14968.918 2020-01-01 2020-01-02 2020-01-01 00:06:36 2020-01-02 03:34:57 2020-01-01 00:06:36.000 2020-01-02 03:34:57.000 396 99297 49846.5 4984650 396 99297 49846.5 4984650 -32173 32762 5282.02 528202 -124 127 3.3 330 +397 101 10387 99298 1.19219 298.19219 149.69219 14969.21921 1.19219 298.1922 149.69219 14969.21964 1.19219 298.19219 149.69218999999998 14969.219 2020-01-01 2020-01-02 2020-01-01 00:06:37 2020-01-02 03:34:58 2020-01-01 00:06:37.000 2020-01-02 03:34:58.000 397 99298 49847.5 4984750 397 99298 49847.5 4984750 -32172 32763 5283.02 528302 -128 127 1.74 174 +398 101 10388 99299 1.19519 298.19519 149.69519 14969.51951 1.19519 298.1952 149.69519 14969.51929 1.19519 298.19519 149.69519 14969.519 2020-01-01 2020-01-02 2020-01-01 00:06:38 2020-01-02 03:34:59 2020-01-01 00:06:38.000 2020-01-02 03:34:59.000 398 99299 49848.5 4984850 398 99299 49848.5 4984850 -32171 32764 5284.02 528402 -128 123 0.18 18 +399 101 10389 99300 1.19819 298.19819 149.69819 14969.81981 1.19819 298.1982 149.69819 14969.81989 1.19819 298.19819 149.69818999999998 14969.819 2020-01-01 2020-01-02 2020-01-01 00:06:39 2020-01-02 03:35:00 2020-01-01 00:06:39.000 2020-01-02 03:35:00.000 399 99300 49849.5 4984950 399 99300 49849.5 4984950 -32170 32765 5285.02 528502 -127 124 1.18 118 4 102 1003 9994 0.01201 300.01201 150.01201 15151.21321 0.01201 300.01202 150.01201 15151.21318 0.01201 300.01201 150.01201 15151.21301 2020-01-01 2020-01-02 2020-01-01 00:00:04 2020-01-02 03:45:04 2020-01-01 00:00:04.000 2020-01-02 03:45:04.000 4 99904 49954 5045354 4 99904 49954 5045354 -32565 32370 4533.009900990099 457834 -128 127 -1.4851485148514851 -150 40 102 10030 99940 0.12012 300.12012 150.12012 15162.13213 0.12012 300.12012 150.12011 15162.13191 0.12012 300.12012 150.12012000000001 15162.13212 2020-01-01 2020-01-02 2020-01-01 00:00:40 2020-01-02 03:45:40 2020-01-01 00:00:40.000 2020-01-02 03:45:40.000 40 99940 49990 5048990 40 99940 49990 5048990 -32529 32406 4569.009900990099 461470 -124 127 1.5643564356435644 158 -400 101 10390 99301 1.2012 298.2012 149.7012 14970.12012 1.2012 298.2012 149.7012 14970.12022 1.20120 298.20120 149.7012 14970.12000 2020-01-01 2020-01-02 2020-01-01 00:06:40 2020-01-02 03:35:01 2020-01-01 00:06:40.000 2020-01-02 03:35:01.000 400 99301 49850.5 4985050 400 99301 49850.5 4985050 -32169 32766 5286.02 528602 -126 125 2.18 218 -401 101 10391 99302 1.2042 298.2042 149.7042 14970.42042 1.2042 298.2042 149.7042 14970.42035 1.20420 298.20420 149.70420000000001 14970.42000 2020-01-01 2020-01-02 2020-01-01 00:06:41 2020-01-02 03:35:02 2020-01-01 00:06:41.000 2020-01-02 03:35:02.000 401 99302 49851.5 4985150 401 99302 49851.5 4985150 -32168 32767 5287.02 528702 -125 126 3.18 318 -402 101 10392 99303 1.2072 298.2072 149.7072 14970.72072 1.2072 298.2072 149.70721 14970.72111 1.20720 298.20720 149.7072 14970.72000 2020-01-01 2020-01-02 2020-01-01 00:06:42 2020-01-02 03:35:03 2020-01-01 00:06:42.000 2020-01-02 03:35:03.000 402 99303 49852.5 4985250 402 99303 49852.5 4985250 -32768 32370 4632.66 463266 -124 127 4.18 418 -403 101 10393 99304 1.21021 298.21021 149.71021 14971.02102 1.21021 298.2102 149.7102 14971.02077 1.21021 298.21021 149.71021000000002 14971.02100 2020-01-01 2020-01-02 2020-01-01 00:06:43 2020-01-02 03:35:04 2020-01-01 00:06:43.000 2020-01-02 03:35:04.000 403 99304 49853.5 4985350 403 99304 49853.5 4985350 -32767 32371 4633.66 463366 -128 127 2.62 262 -404 101 10394 99305 1.21321 298.21321 149.71321 14971.32132 1.21321 298.21323 149.71321 14971.32139 1.21321 298.21321 149.71321 14971.32100 2020-01-01 2020-01-02 2020-01-01 00:06:44 2020-01-02 03:35:05 2020-01-01 00:06:44.000 2020-01-02 03:35:05.000 404 99305 49854.5 4985450 404 99305 49854.5 4985450 -32766 32372 4634.66 463466 -128 127 1.06 106 -405 101 10395 99306 1.21621 298.21621 149.71621 14971.62162 1.21621 298.21622 149.71621 14971.62169 1.21621 298.21621 149.71621 14971.62100 2020-01-01 2020-01-02 2020-01-01 00:06:45 2020-01-02 03:35:06 2020-01-01 00:06:45.000 2020-01-02 03:35:06.000 405 99306 49855.5 4985550 405 99306 49855.5 4985550 -32765 32373 4635.66 463566 -128 124 -0.5 -50 -406 101 10396 99307 1.21921 298.21921 149.71921 14971.92192 1.21921 298.2192 149.71921 14971.92199 1.21921 298.21921 149.71921 14971.92100 2020-01-01 2020-01-02 2020-01-01 00:06:46 2020-01-02 03:35:07 2020-01-01 00:06:46.000 2020-01-02 03:35:07.000 406 99307 49856.5 4985650 406 99307 49856.5 4985650 -32764 32374 4636.66 463666 -127 125 0.5 50 -407 101 10397 99308 1.22222 298.22222 149.72222 14972.22222 1.22222 298.22223 149.72222 14972.22257 1.22222 298.22222 149.72222 14972.22200 2020-01-01 2020-01-02 2020-01-01 00:06:47 2020-01-02 03:35:08 2020-01-01 00:06:47.000 2020-01-02 03:35:08.000 407 99308 49857.5 4985750 407 99308 49857.5 4985750 -32763 32375 4637.66 463766 -126 126 1.5 150 -408 101 10398 99309 1.22522 298.22522 149.72522 14972.52252 1.22522 298.22522 149.72522 14972.52224 1.22522 298.22522 149.72522 14972.52200 2020-01-01 2020-01-02 2020-01-01 00:06:48 2020-01-02 03:35:09 2020-01-01 00:06:48.000 2020-01-02 03:35:09.000 408 99309 49858.5 4985850 408 99309 49858.5 4985850 -32762 32376 4638.66 463866 -125 127 2.5 250 -409 101 10399 99310 1.22822 298.22822 149.72822 14972.82282 1.22822 298.22824 149.72822 14972.82286 1.22822 298.22822 149.72822 14972.82200 2020-01-01 2020-01-02 2020-01-01 00:06:49 2020-01-02 03:35:10 2020-01-01 00:06:49.000 2020-01-02 03:35:10.000 409 99310 49859.5 4985950 409 99310 49859.5 4985950 -32761 32377 4639.66 463966 -128 127 0.94 94 +400 101 10390 99301 1.2012 298.2012 149.7012 14970.12012 1.2012 298.2012 149.7012 14970.12022 1.2012 298.2012 149.7012 14970.12 2020-01-01 2020-01-02 2020-01-01 00:06:40 2020-01-02 03:35:01 2020-01-01 00:06:40.000 2020-01-02 03:35:01.000 400 99301 49850.5 4985050 400 99301 49850.5 4985050 -32169 32766 5286.02 528602 -126 125 2.18 218 +401 101 10391 99302 1.2042 298.2042 149.7042 14970.42042 1.2042 298.2042 149.7042 14970.42035 1.2042 298.2042 149.70420000000001 14970.42 2020-01-01 2020-01-02 2020-01-01 00:06:41 2020-01-02 03:35:02 2020-01-01 00:06:41.000 2020-01-02 03:35:02.000 401 99302 49851.5 4985150 401 99302 49851.5 4985150 -32168 32767 5287.02 528702 -125 126 3.18 318 +402 101 10392 99303 1.2072 298.2072 149.7072 14970.72072 1.2072 298.2072 149.70721 14970.72111 1.2072 298.2072 149.7072 14970.72 2020-01-01 2020-01-02 2020-01-01 00:06:42 2020-01-02 03:35:03 2020-01-01 00:06:42.000 2020-01-02 03:35:03.000 402 99303 49852.5 4985250 402 99303 49852.5 4985250 -32768 32370 4632.66 463266 -124 127 4.18 418 +403 101 10393 99304 1.21021 298.21021 149.71021 14971.02102 1.21021 298.2102 149.7102 14971.02077 1.21021 298.21021 149.71021000000002 14971.021 2020-01-01 2020-01-02 2020-01-01 00:06:43 2020-01-02 03:35:04 2020-01-01 00:06:43.000 2020-01-02 03:35:04.000 403 99304 49853.5 4985350 403 99304 49853.5 4985350 -32767 32371 4633.66 463366 -128 127 2.62 262 +404 101 10394 99305 1.21321 298.21321 149.71321 14971.32132 1.21321 298.21323 149.71321 14971.32139 1.21321 298.21321 149.71321 14971.321 2020-01-01 2020-01-02 2020-01-01 00:06:44 2020-01-02 03:35:05 2020-01-01 00:06:44.000 2020-01-02 03:35:05.000 404 99305 49854.5 4985450 404 99305 49854.5 4985450 -32766 32372 4634.66 463466 -128 127 1.06 106 +405 101 10395 99306 1.21621 298.21621 149.71621 14971.62162 1.21621 298.21622 149.71621 14971.62169 1.21621 298.21621 149.71621 14971.621 2020-01-01 2020-01-02 2020-01-01 00:06:45 2020-01-02 03:35:06 2020-01-01 00:06:45.000 2020-01-02 03:35:06.000 405 99306 49855.5 4985550 405 99306 49855.5 4985550 -32765 32373 4635.66 463566 -128 124 -0.5 -50 +406 101 10396 99307 1.21921 298.21921 149.71921 14971.92192 1.21921 298.2192 149.71921 14971.92199 1.21921 298.21921 149.71921 14971.921 2020-01-01 2020-01-02 2020-01-01 00:06:46 2020-01-02 03:35:07 2020-01-01 00:06:46.000 2020-01-02 03:35:07.000 406 99307 49856.5 4985650 406 99307 49856.5 4985650 -32764 32374 4636.66 463666 -127 125 0.5 50 +407 101 10397 99308 1.22222 298.22222 149.72222 14972.22222 1.22222 298.22223 149.72222 14972.22257 1.22222 298.22222 149.72222 14972.222 2020-01-01 2020-01-02 2020-01-01 00:06:47 2020-01-02 03:35:08 2020-01-01 00:06:47.000 2020-01-02 03:35:08.000 407 99308 49857.5 4985750 407 99308 49857.5 4985750 -32763 32375 4637.66 463766 -126 126 1.5 150 +408 101 10398 99309 1.22522 298.22522 149.72522 14972.52252 1.22522 298.22522 149.72522 14972.52224 1.22522 298.22522 149.72522 14972.522 2020-01-01 2020-01-02 2020-01-01 00:06:48 2020-01-02 03:35:09 2020-01-01 00:06:48.000 2020-01-02 03:35:09.000 408 99309 49858.5 4985850 408 99309 49858.5 4985850 -32762 32376 4638.66 463866 -125 127 2.5 250 +409 101 10399 99310 1.22822 298.22822 149.72822 14972.82282 1.22822 298.22824 149.72822 14972.82286 1.22822 298.22822 149.72822 14972.822 2020-01-01 2020-01-02 2020-01-01 00:06:49 2020-01-02 03:35:10 2020-01-01 00:06:49.000 2020-01-02 03:35:10.000 409 99310 49859.5 4985950 409 99310 49859.5 4985950 -32761 32377 4639.66 463966 -128 127 0.94 94 41 102 10031 99941 0.12312 300.12312 150.12312 15162.43543 0.12312 300.1231 150.12312 15162.43521 0.12312 300.12312 150.12312 15162.43512 2020-01-01 2020-01-02 2020-01-01 00:00:41 2020-01-02 03:45:41 2020-01-01 00:00:41.000 2020-01-02 03:45:41.000 41 99941 49991 5049091 41 99941 49991 5049091 -32528 32407 4570.009900990099 461571 -128 127 0.0297029702970297 3 -410 101 10400 99311 1.23123 298.23123 149.73123 14973.12312 1.23123 298.23123 149.73123 14973.12316 1.23123 298.23123 149.73122999999998 14973.12300 2020-01-01 2020-01-02 2020-01-01 00:06:50 2020-01-02 03:35:11 2020-01-01 00:06:50.000 2020-01-02 03:35:11.000 410 99311 49860.5 4986050 410 99311 49860.5 4986050 -32760 32378 4640.66 464066 -128 127 -0.62 -62 -411 101 10401 99312 1.23423 298.23423 149.73423 14973.42342 1.23423 298.23422 149.73423 14973.42345 1.23423 298.23423 149.73423 14973.42300 2020-01-01 2020-01-02 2020-01-01 00:06:51 2020-01-02 03:35:12 2020-01-01 00:06:51.000 2020-01-02 03:35:12.000 411 99312 49861.5 4986150 411 99312 49861.5 4986150 -32759 32379 4641.66 464166 -128 123 -2.18 -218 -412 101 10402 99313 1.23723 298.23723 149.73723 14973.72372 1.23723 298.23724 149.73724 14973.72405 1.23723 298.23723 149.73723 14973.72300 2020-01-01 2020-01-02 2020-01-01 00:06:52 2020-01-02 03:35:13 2020-01-01 00:06:52.000 2020-01-02 03:35:13.000 412 99313 49862.5 4986250 412 99313 49862.5 4986250 -32758 32380 4642.66 464266 -127 124 -1.18 -118 -413 101 10403 99314 1.24024 298.24024 149.74024 14974.02402 1.24024 298.24023 149.74023 14974.02374 1.24024 298.24024 149.74024 14974.02400 2020-01-01 2020-01-02 2020-01-01 00:06:53 2020-01-02 03:35:14 2020-01-01 00:06:53.000 2020-01-02 03:35:14.000 413 99314 49863.5 4986350 413 99314 49863.5 4986350 -32757 32381 4643.66 464366 -126 125 -0.18 -18 -414 101 10404 99315 1.24324 298.24324 149.74324 14974.32432 1.24324 298.24326 149.74324 14974.32433 1.24324 298.24324 149.74324000000001 14974.32400 2020-01-01 2020-01-02 2020-01-01 00:06:54 2020-01-02 03:35:15 2020-01-01 00:06:54.000 2020-01-02 03:35:15.000 414 99315 49864.5 4986450 414 99315 49864.5 4986450 -32756 32382 4644.66 464466 -125 126 0.82 82 -415 101 10405 99316 1.24624 298.24624 149.74624 14974.62462 1.24624 298.24625 149.74624 14974.62463 1.24624 298.24624 149.74624 14974.62400 2020-01-01 2020-01-02 2020-01-01 00:06:55 2020-01-02 03:35:16 2020-01-01 00:06:55.000 2020-01-02 03:35:16.000 415 99316 49865.5 4986550 415 99316 49865.5 4986550 -32755 32383 4645.66 464566 -124 127 1.82 182 -416 101 10406 99317 1.24924 298.24924 149.74924 14974.92492 1.24924 298.24924 149.74924 14974.92492 1.24924 298.24924 149.74924000000001 14974.92400 2020-01-01 2020-01-02 2020-01-01 00:06:56 2020-01-02 03:35:17 2020-01-01 00:06:56.000 2020-01-02 03:35:17.000 416 99317 49866.5 4986650 416 99317 49866.5 4986650 -32754 32384 4646.66 464666 -128 127 0.26 26 -417 101 10407 99318 1.25225 298.25225 149.75225 14975.22522 1.25225 298.25226 149.75225 14975.22552 1.25225 298.25225 149.75225 14975.22500 2020-01-01 2020-01-02 2020-01-01 00:06:57 2020-01-02 03:35:18 2020-01-01 00:06:57.000 2020-01-02 03:35:18.000 417 99318 49867.5 4986750 417 99318 49867.5 4986750 -32753 32385 4647.66 464766 -128 123 -1.3 -130 -418 101 10408 99319 1.25525 298.25525 149.75525 14975.52552 1.25525 298.25525 149.75525 14975.52521 1.25525 298.25525 149.75525 14975.52500 2020-01-01 2020-01-02 2020-01-01 00:06:58 2020-01-02 03:35:19 2020-01-01 00:06:58.000 2020-01-02 03:35:19.000 418 99319 49868.5 4986850 418 99319 49868.5 4986850 -32752 32386 4648.66 464866 -127 124 -0.3 -30 -419 101 10409 99320 1.25825 298.25825 149.75825 14975.82582 1.25825 298.25827 149.75825 14975.8258 1.25825 298.25825 149.75825 14975.82500 2020-01-01 2020-01-02 2020-01-01 00:06:59 2020-01-02 03:35:20 2020-01-01 00:06:59.000 2020-01-02 03:35:20.000 419 99320 49869.5 4986950 419 99320 49869.5 4986950 -32751 32387 4649.66 464966 -126 125 0.7 70 +410 101 10400 99311 1.23123 298.23123 149.73123 14973.12312 1.23123 298.23123 149.73123 14973.12316 1.23123 298.23123 149.73122999999998 14973.123 2020-01-01 2020-01-02 2020-01-01 00:06:50 2020-01-02 03:35:11 2020-01-01 00:06:50.000 2020-01-02 03:35:11.000 410 99311 49860.5 4986050 410 99311 49860.5 4986050 -32760 32378 4640.66 464066 -128 127 -0.62 -62 +411 101 10401 99312 1.23423 298.23423 149.73423 14973.42342 1.23423 298.23422 149.73423 14973.42345 1.23423 298.23423 149.73423 14973.423 2020-01-01 2020-01-02 2020-01-01 00:06:51 2020-01-02 03:35:12 2020-01-01 00:06:51.000 2020-01-02 03:35:12.000 411 99312 49861.5 4986150 411 99312 49861.5 4986150 -32759 32379 4641.66 464166 -128 123 -2.18 -218 +412 101 10402 99313 1.23723 298.23723 149.73723 14973.72372 1.23723 298.23724 149.73724 14973.72405 1.23723 298.23723 149.73723 14973.723 2020-01-01 2020-01-02 2020-01-01 00:06:52 2020-01-02 03:35:13 2020-01-01 00:06:52.000 2020-01-02 03:35:13.000 412 99313 49862.5 4986250 412 99313 49862.5 4986250 -32758 32380 4642.66 464266 -127 124 -1.18 -118 +413 101 10403 99314 1.24024 298.24024 149.74024 14974.02402 1.24024 298.24023 149.74023 14974.02374 1.24024 298.24024 149.74024 14974.024 2020-01-01 2020-01-02 2020-01-01 00:06:53 2020-01-02 03:35:14 2020-01-01 00:06:53.000 2020-01-02 03:35:14.000 413 99314 49863.5 4986350 413 99314 49863.5 4986350 -32757 32381 4643.66 464366 -126 125 -0.18 -18 +414 101 10404 99315 1.24324 298.24324 149.74324 14974.32432 1.24324 298.24326 149.74324 14974.32433 1.24324 298.24324 149.74324000000001 14974.324 2020-01-01 2020-01-02 2020-01-01 00:06:54 2020-01-02 03:35:15 2020-01-01 00:06:54.000 2020-01-02 03:35:15.000 414 99315 49864.5 4986450 414 99315 49864.5 4986450 -32756 32382 4644.66 464466 -125 126 0.82 82 +415 101 10405 99316 1.24624 298.24624 149.74624 14974.62462 1.24624 298.24625 149.74624 14974.62463 1.24624 298.24624 149.74624 14974.624 2020-01-01 2020-01-02 2020-01-01 00:06:55 2020-01-02 03:35:16 2020-01-01 00:06:55.000 2020-01-02 03:35:16.000 415 99316 49865.5 4986550 415 99316 49865.5 4986550 -32755 32383 4645.66 464566 -124 127 1.82 182 +416 101 10406 99317 1.24924 298.24924 149.74924 14974.92492 1.24924 298.24924 149.74924 14974.92492 1.24924 298.24924 149.74924000000001 14974.924 2020-01-01 2020-01-02 2020-01-01 00:06:56 2020-01-02 03:35:17 2020-01-01 00:06:56.000 2020-01-02 03:35:17.000 416 99317 49866.5 4986650 416 99317 49866.5 4986650 -32754 32384 4646.66 464666 -128 127 0.26 26 +417 101 10407 99318 1.25225 298.25225 149.75225 14975.22522 1.25225 298.25226 149.75225 14975.22552 1.25225 298.25225 149.75225 14975.225 2020-01-01 2020-01-02 2020-01-01 00:06:57 2020-01-02 03:35:18 2020-01-01 00:06:57.000 2020-01-02 03:35:18.000 417 99318 49867.5 4986750 417 99318 49867.5 4986750 -32753 32385 4647.66 464766 -128 123 -1.3 -130 +418 101 10408 99319 1.25525 298.25525 149.75525 14975.52552 1.25525 298.25525 149.75525 14975.52521 1.25525 298.25525 149.75525 14975.525 2020-01-01 2020-01-02 2020-01-01 00:06:58 2020-01-02 03:35:19 2020-01-01 00:06:58.000 2020-01-02 03:35:19.000 418 99319 49868.5 4986850 418 99319 49868.5 4986850 -32752 32386 4648.66 464866 -127 124 -0.3 -30 +419 101 10409 99320 1.25825 298.25825 149.75825 14975.82582 1.25825 298.25827 149.75825 14975.8258 1.25825 298.25825 149.75825 14975.825 2020-01-01 2020-01-02 2020-01-01 00:06:59 2020-01-02 03:35:20 2020-01-01 00:06:59.000 2020-01-02 03:35:20.000 419 99320 49869.5 4986950 419 99320 49869.5 4986950 -32751 32387 4649.66 464966 -126 125 0.7 70 42 102 10032 99942 0.12612 300.12612 150.12612 15162.73873 0.12612 300.12613 150.12612 15162.73896 0.12612 300.12612 150.12612 15162.73812 2020-01-01 2020-01-02 2020-01-01 00:00:42 2020-01-02 03:45:42 2020-01-01 00:00:42.000 2020-01-02 03:45:42.000 42 99942 49992 5049192 42 99942 49992 5049192 -32527 32408 4571.009900990099 461672 -128 127 -1.504950495049505 -152 -420 101 10410 99321 1.26126 298.26126 149.76126 14976.12612 1.26126 298.26126 149.76126 14976.12609 1.26126 298.26126 149.76126 14976.12600 2020-01-01 2020-01-02 2020-01-01 00:07:00 2020-01-02 03:35:21 2020-01-01 00:07:00.000 2020-01-02 03:35:21.000 420 99321 49870.5 4987050 420 99321 49870.5 4987050 -32750 32388 4650.66 465066 -125 126 1.7 170 -421 101 10411 99322 1.26426 298.26426 149.76426 14976.42642 1.26426 298.26425 149.76426 14976.4264 1.26426 298.26426 149.76426 14976.42600 2020-01-01 2020-01-02 2020-01-01 00:07:01 2020-01-02 03:35:22 2020-01-01 00:07:01.000 2020-01-02 03:35:22.000 421 99322 49871.5 4987150 421 99322 49871.5 4987150 -32749 32389 4651.66 465166 -124 127 2.7 270 -422 101 10412 99323 1.26726 298.26726 149.76726 14976.72672 1.26726 298.26727 149.76727 14976.72702 1.26726 298.26726 149.76726 14976.72600 2020-01-01 2020-01-02 2020-01-01 00:07:02 2020-01-02 03:35:23 2020-01-01 00:07:02.000 2020-01-02 03:35:23.000 422 99323 49872.5 4987250 422 99323 49872.5 4987250 -32748 32390 4652.66 465266 -128 127 1.14 114 -423 101 10413 99324 1.27027 298.27027 149.77027 14977.02702 1.27027 298.27026 149.77026 14977.02667 1.27027 298.27027 149.77027 14977.02700 2020-01-01 2020-01-02 2020-01-01 00:07:03 2020-01-02 03:35:24 2020-01-01 00:07:03.000 2020-01-02 03:35:24.000 423 99324 49873.5 4987350 423 99324 49873.5 4987350 -32747 32391 4653.66 465366 -128 123 -0.42 -42 -424 101 10414 99325 1.27327 298.27327 149.77327 14977.32732 1.27327 298.2733 149.77327 14977.32727 1.27327 298.27327 149.77327 14977.32700 2020-01-01 2020-01-02 2020-01-01 00:07:04 2020-01-02 03:35:25 2020-01-01 00:07:04.000 2020-01-02 03:35:25.000 424 99325 49874.5 4987450 424 99325 49874.5 4987450 -32746 32392 4654.66 465466 -127 124 0.58 58 -425 101 10415 99326 1.27627 298.27627 149.77627 14977.62762 1.27627 298.27628 149.77627 14977.62756 1.27627 298.27627 149.77627 14977.62700 2020-01-01 2020-01-02 2020-01-01 00:07:05 2020-01-02 03:35:26 2020-01-01 00:07:05.000 2020-01-02 03:35:26.000 425 99326 49875.5 4987550 425 99326 49875.5 4987550 -32745 32393 4655.66 465566 -126 125 1.58 158 -426 101 10416 99327 1.27927 298.27927 149.77927 14977.92792 1.27927 298.27927 149.77927 14977.92787 1.27927 298.27927 149.77927 14977.92700 2020-01-01 2020-01-02 2020-01-01 00:07:06 2020-01-02 03:35:27 2020-01-01 00:07:06.000 2020-01-02 03:35:27.000 426 99327 49876.5 4987650 426 99327 49876.5 4987650 -32744 32394 4656.66 465666 -125 126 2.58 258 -427 101 10417 99328 1.28228 298.28228 149.78228 14978.22822 1.28228 298.2823 149.78228 14978.22849 1.28228 298.28228 149.78228 14978.22800 2020-01-01 2020-01-02 2020-01-01 00:07:07 2020-01-02 03:35:28 2020-01-01 00:07:07.000 2020-01-02 03:35:28.000 427 99328 49877.5 4987750 427 99328 49877.5 4987750 -32743 32395 4657.66 465766 -124 127 3.58 358 -428 101 10418 99329 1.28528 298.28528 149.78528 14978.52852 1.28528 298.28528 149.78528 14978.52815 1.28528 298.28528 149.78528 14978.52800 2020-01-01 2020-01-02 2020-01-01 00:07:08 2020-01-02 03:35:29 2020-01-01 00:07:08.000 2020-01-02 03:35:29.000 428 99329 49878.5 4987850 428 99329 49878.5 4987850 -32742 32396 4658.66 465866 -128 127 2.02 202 -429 101 10419 99330 1.28828 298.28828 149.78828 14978.82882 1.28828 298.2883 149.78828 14978.8289 1.28828 298.28828 149.78828 14978.82800 2020-01-01 2020-01-02 2020-01-01 00:07:09 2020-01-02 03:35:30 2020-01-01 00:07:09.000 2020-01-02 03:35:30.000 429 99330 49879.5 4987950 429 99330 49879.5 4987950 -32741 32397 4659.66 465966 -128 127 0.46 46 +420 101 10410 99321 1.26126 298.26126 149.76126 14976.12612 1.26126 298.26126 149.76126 14976.12609 1.26126 298.26126 149.76126 14976.126 2020-01-01 2020-01-02 2020-01-01 00:07:00 2020-01-02 03:35:21 2020-01-01 00:07:00.000 2020-01-02 03:35:21.000 420 99321 49870.5 4987050 420 99321 49870.5 4987050 -32750 32388 4650.66 465066 -125 126 1.7 170 +421 101 10411 99322 1.26426 298.26426 149.76426 14976.42642 1.26426 298.26425 149.76426 14976.4264 1.26426 298.26426 149.76426 14976.426 2020-01-01 2020-01-02 2020-01-01 00:07:01 2020-01-02 03:35:22 2020-01-01 00:07:01.000 2020-01-02 03:35:22.000 421 99322 49871.5 4987150 421 99322 49871.5 4987150 -32749 32389 4651.66 465166 -124 127 2.7 270 +422 101 10412 99323 1.26726 298.26726 149.76726 14976.72672 1.26726 298.26727 149.76727 14976.72702 1.26726 298.26726 149.76726 14976.726 2020-01-01 2020-01-02 2020-01-01 00:07:02 2020-01-02 03:35:23 2020-01-01 00:07:02.000 2020-01-02 03:35:23.000 422 99323 49872.5 4987250 422 99323 49872.5 4987250 -32748 32390 4652.66 465266 -128 127 1.14 114 +423 101 10413 99324 1.27027 298.27027 149.77027 14977.02702 1.27027 298.27026 149.77026 14977.02667 1.27027 298.27027 149.77027 14977.027 2020-01-01 2020-01-02 2020-01-01 00:07:03 2020-01-02 03:35:24 2020-01-01 00:07:03.000 2020-01-02 03:35:24.000 423 99324 49873.5 4987350 423 99324 49873.5 4987350 -32747 32391 4653.66 465366 -128 123 -0.42 -42 +424 101 10414 99325 1.27327 298.27327 149.77327 14977.32732 1.27327 298.2733 149.77327 14977.32727 1.27327 298.27327 149.77327 14977.327 2020-01-01 2020-01-02 2020-01-01 00:07:04 2020-01-02 03:35:25 2020-01-01 00:07:04.000 2020-01-02 03:35:25.000 424 99325 49874.5 4987450 424 99325 49874.5 4987450 -32746 32392 4654.66 465466 -127 124 0.58 58 +425 101 10415 99326 1.27627 298.27627 149.77627 14977.62762 1.27627 298.27628 149.77627 14977.62756 1.27627 298.27627 149.77627 14977.627 2020-01-01 2020-01-02 2020-01-01 00:07:05 2020-01-02 03:35:26 2020-01-01 00:07:05.000 2020-01-02 03:35:26.000 425 99326 49875.5 4987550 425 99326 49875.5 4987550 -32745 32393 4655.66 465566 -126 125 1.58 158 +426 101 10416 99327 1.27927 298.27927 149.77927 14977.92792 1.27927 298.27927 149.77927 14977.92787 1.27927 298.27927 149.77927 14977.927 2020-01-01 2020-01-02 2020-01-01 00:07:06 2020-01-02 03:35:27 2020-01-01 00:07:06.000 2020-01-02 03:35:27.000 426 99327 49876.5 4987650 426 99327 49876.5 4987650 -32744 32394 4656.66 465666 -125 126 2.58 258 +427 101 10417 99328 1.28228 298.28228 149.78228 14978.22822 1.28228 298.2823 149.78228 14978.22849 1.28228 298.28228 149.78228 14978.228 2020-01-01 2020-01-02 2020-01-01 00:07:07 2020-01-02 03:35:28 2020-01-01 00:07:07.000 2020-01-02 03:35:28.000 427 99328 49877.5 4987750 427 99328 49877.5 4987750 -32743 32395 4657.66 465766 -124 127 3.58 358 +428 101 10418 99329 1.28528 298.28528 149.78528 14978.52852 1.28528 298.28528 149.78528 14978.52815 1.28528 298.28528 149.78528 14978.528 2020-01-01 2020-01-02 2020-01-01 00:07:08 2020-01-02 03:35:29 2020-01-01 00:07:08.000 2020-01-02 03:35:29.000 428 99329 49878.5 4987850 428 99329 49878.5 4987850 -32742 32396 4658.66 465866 -128 127 2.02 202 +429 101 10419 99330 1.28828 298.28828 149.78828 14978.82882 1.28828 298.2883 149.78828 14978.8289 1.28828 298.28828 149.78828 14978.828 2020-01-01 2020-01-02 2020-01-01 00:07:09 2020-01-02 03:35:30 2020-01-01 00:07:09.000 2020-01-02 03:35:30.000 429 99330 49879.5 4987950 429 99330 49879.5 4987950 -32741 32397 4659.66 465966 -128 127 0.46 46 43 102 10033 99943 0.12912 300.12912 150.12912 15163.04204 0.12912 300.12912 150.12912 15163.04211 0.12912 300.12912 150.12912 15163.04112 2020-01-01 2020-01-02 2020-01-01 00:00:43 2020-01-02 03:45:43 2020-01-01 00:00:43.000 2020-01-02 03:45:43.000 43 99943 49993 5049293 43 99943 49993 5049293 -32526 32409 4572.009900990099 461773 -128 124 -3.0396039603960396 -307 -430 101 10420 99331 1.29129 298.29129 149.79129 14979.12912 1.29129 298.2913 149.79129 14979.12904 1.29129 298.29129 149.79129 14979.12900 2020-01-01 2020-01-02 2020-01-01 00:07:10 2020-01-02 03:35:31 2020-01-01 00:07:10.000 2020-01-02 03:35:31.000 430 99331 49880.5 4988050 430 99331 49880.5 4988050 -32740 32398 4660.66 466066 -128 124 -1.1 -110 -431 101 10421 99332 1.29429 298.29429 149.79429 14979.42942 1.29429 298.29428 149.79429 14979.42933 1.29429 298.29429 149.79429 14979.42900 2020-01-01 2020-01-02 2020-01-01 00:07:11 2020-01-02 03:35:32 2020-01-01 00:07:11.000 2020-01-02 03:35:32.000 431 99332 49881.5 4988150 431 99332 49881.5 4988150 -32739 32399 4661.66 466166 -127 125 -0.1 -10 -432 101 10422 99333 1.29729 298.29729 149.79729 14979.72972 1.29729 298.2973 149.79729 14979.72996 1.29729 298.29729 149.79729 14979.72900 2020-01-01 2020-01-02 2020-01-01 00:07:12 2020-01-02 03:35:33 2020-01-01 00:07:12.000 2020-01-02 03:35:33.000 432 99333 49882.5 4988250 432 99333 49882.5 4988250 -32738 32400 4662.66 466266 -126 126 0.9 90 -433 101 10423 99334 1.3003 298.3003 149.8003 14980.03003 1.3003 298.3003 149.80029 14980.02962 1.30030 298.30030 149.8003 14980.03000 2020-01-01 2020-01-02 2020-01-01 00:07:13 2020-01-02 03:35:34 2020-01-01 00:07:13.000 2020-01-02 03:35:34.000 433 99334 49883.5 4988350 433 99334 49883.5 4988350 -32737 32401 4663.66 466366 -125 127 1.9 190 -434 101 10424 99335 1.3033 298.3033 149.8033 14980.33033 1.3033 298.3033 149.8033 14980.33037 1.30330 298.30330 149.8033 14980.33000 2020-01-01 2020-01-02 2020-01-01 00:07:14 2020-01-02 03:35:35 2020-01-01 00:07:14.000 2020-01-02 03:35:35.000 434 99335 49884.5 4988450 434 99335 49884.5 4988450 -32736 32402 4664.66 466466 -128 127 0.34 34 -435 101 10425 99336 1.3063 298.3063 149.8063 14980.63063 1.3063 298.3063 149.8063 14980.63051 1.30630 298.30630 149.8063 14980.63000 2020-01-01 2020-01-02 2020-01-01 00:07:15 2020-01-02 03:35:36 2020-01-01 00:07:15.000 2020-01-02 03:35:36.000 435 99336 49885.5 4988550 435 99336 49885.5 4988550 -32735 32403 4665.66 466566 -128 127 -1.22 -122 -436 101 10426 99337 1.3093 298.3093 149.8093 14980.93093 1.3093 298.3093 149.8093 14980.93084 1.30930 298.30930 149.8093 14980.93000 2020-01-01 2020-01-02 2020-01-01 00:07:16 2020-01-02 03:35:37 2020-01-01 00:07:16.000 2020-01-02 03:35:37.000 436 99337 49886.5 4988650 436 99337 49886.5 4988650 -32734 32404 4666.66 466666 -128 123 -2.78 -278 -437 101 10427 99338 1.31231 298.31231 149.81231 14981.23123 1.31231 298.31232 149.81231 14981.23143 1.31231 298.31231 149.81231 14981.23100 2020-01-01 2020-01-02 2020-01-01 00:07:17 2020-01-02 03:35:38 2020-01-01 00:07:17.000 2020-01-02 03:35:38.000 437 99338 49887.5 4988750 437 99338 49887.5 4988750 -32733 32405 4667.66 466766 -127 124 -1.78 -178 -438 101 10428 99339 1.31531 298.31531 149.81531 14981.53153 1.31531 298.3153 149.81531 14981.53173 1.31531 298.31531 149.81531 14981.53100 2020-01-01 2020-01-02 2020-01-01 00:07:18 2020-01-02 03:35:39 2020-01-01 00:07:18.000 2020-01-02 03:35:39.000 438 99339 49888.5 4988850 438 99339 49888.5 4988850 -32732 32406 4668.66 466866 -126 125 -0.78 -78 -439 101 10429 99340 1.31831 298.31831 149.81831 14981.83183 1.31831 298.31833 149.81831 14981.83184 1.31831 298.31831 149.81831 14981.83100 2020-01-01 2020-01-02 2020-01-01 00:07:19 2020-01-02 03:35:40 2020-01-01 00:07:19.000 2020-01-02 03:35:40.000 439 99340 49889.5 4988950 439 99340 49889.5 4988950 -32731 32407 4669.66 466966 -125 126 0.22 22 +430 101 10420 99331 1.29129 298.29129 149.79129 14979.12912 1.29129 298.2913 149.79129 14979.12904 1.29129 298.29129 149.79129 14979.129 2020-01-01 2020-01-02 2020-01-01 00:07:10 2020-01-02 03:35:31 2020-01-01 00:07:10.000 2020-01-02 03:35:31.000 430 99331 49880.5 4988050 430 99331 49880.5 4988050 -32740 32398 4660.66 466066 -128 124 -1.1 -110 +431 101 10421 99332 1.29429 298.29429 149.79429 14979.42942 1.29429 298.29428 149.79429 14979.42933 1.29429 298.29429 149.79429 14979.429 2020-01-01 2020-01-02 2020-01-01 00:07:11 2020-01-02 03:35:32 2020-01-01 00:07:11.000 2020-01-02 03:35:32.000 431 99332 49881.5 4988150 431 99332 49881.5 4988150 -32739 32399 4661.66 466166 -127 125 -0.1 -10 +432 101 10422 99333 1.29729 298.29729 149.79729 14979.72972 1.29729 298.2973 149.79729 14979.72996 1.29729 298.29729 149.79729 14979.729 2020-01-01 2020-01-02 2020-01-01 00:07:12 2020-01-02 03:35:33 2020-01-01 00:07:12.000 2020-01-02 03:35:33.000 432 99333 49882.5 4988250 432 99333 49882.5 4988250 -32738 32400 4662.66 466266 -126 126 0.9 90 +433 101 10423 99334 1.3003 298.3003 149.8003 14980.03003 1.3003 298.3003 149.80029 14980.02962 1.3003 298.3003 149.8003 14980.03 2020-01-01 2020-01-02 2020-01-01 00:07:13 2020-01-02 03:35:34 2020-01-01 00:07:13.000 2020-01-02 03:35:34.000 433 99334 49883.5 4988350 433 99334 49883.5 4988350 -32737 32401 4663.66 466366 -125 127 1.9 190 +434 101 10424 99335 1.3033 298.3033 149.8033 14980.33033 1.3033 298.3033 149.8033 14980.33037 1.3033 298.3033 149.8033 14980.33 2020-01-01 2020-01-02 2020-01-01 00:07:14 2020-01-02 03:35:35 2020-01-01 00:07:14.000 2020-01-02 03:35:35.000 434 99335 49884.5 4988450 434 99335 49884.5 4988450 -32736 32402 4664.66 466466 -128 127 0.34 34 +435 101 10425 99336 1.3063 298.3063 149.8063 14980.63063 1.3063 298.3063 149.8063 14980.63051 1.3063 298.3063 149.8063 14980.63 2020-01-01 2020-01-02 2020-01-01 00:07:15 2020-01-02 03:35:36 2020-01-01 00:07:15.000 2020-01-02 03:35:36.000 435 99336 49885.5 4988550 435 99336 49885.5 4988550 -32735 32403 4665.66 466566 -128 127 -1.22 -122 +436 101 10426 99337 1.3093 298.3093 149.8093 14980.93093 1.3093 298.3093 149.8093 14980.93084 1.3093 298.3093 149.8093 14980.93 2020-01-01 2020-01-02 2020-01-01 00:07:16 2020-01-02 03:35:37 2020-01-01 00:07:16.000 2020-01-02 03:35:37.000 436 99337 49886.5 4988650 436 99337 49886.5 4988650 -32734 32404 4666.66 466666 -128 123 -2.78 -278 +437 101 10427 99338 1.31231 298.31231 149.81231 14981.23123 1.31231 298.31232 149.81231 14981.23143 1.31231 298.31231 149.81231 14981.231 2020-01-01 2020-01-02 2020-01-01 00:07:17 2020-01-02 03:35:38 2020-01-01 00:07:17.000 2020-01-02 03:35:38.000 437 99338 49887.5 4988750 437 99338 49887.5 4988750 -32733 32405 4667.66 466766 -127 124 -1.78 -178 +438 101 10428 99339 1.31531 298.31531 149.81531 14981.53153 1.31531 298.3153 149.81531 14981.53173 1.31531 298.31531 149.81531 14981.531 2020-01-01 2020-01-02 2020-01-01 00:07:18 2020-01-02 03:35:39 2020-01-01 00:07:18.000 2020-01-02 03:35:39.000 438 99339 49888.5 4988850 438 99339 49888.5 4988850 -32732 32406 4668.66 466866 -126 125 -0.78 -78 +439 101 10429 99340 1.31831 298.31831 149.81831 14981.83183 1.31831 298.31833 149.81831 14981.83184 1.31831 298.31831 149.81831 14981.831 2020-01-01 2020-01-02 2020-01-01 00:07:19 2020-01-02 03:35:40 2020-01-01 00:07:19.000 2020-01-02 03:35:40.000 439 99340 49889.5 4988950 439 99340 49889.5 4988950 -32731 32407 4669.66 466966 -125 126 0.22 22 44 102 10034 99944 0.13213 300.13213 150.13213 15163.34534 0.13213 300.13214 150.13213 15163.34525 0.13213 300.13213 150.13213 15163.34513 2020-01-01 2020-01-02 2020-01-01 00:00:44 2020-01-02 03:45:44 2020-01-01 00:00:44.000 2020-01-02 03:45:44.000 44 99944 49994 5049394 44 99944 49994 5049394 -32525 32410 4573.009900990099 461874 -127 125 -2.0396039603960396 -206 -440 101 10430 99341 1.32132 298.32132 149.82132 14982.13213 1.32132 298.32132 149.82131 14982.13197 1.32132 298.32132 149.82132 14982.13200 2020-01-01 2020-01-02 2020-01-01 00:07:20 2020-01-02 03:35:41 2020-01-01 00:07:20.000 2020-01-02 03:35:41.000 440 99341 49890.5 4989050 440 99341 49890.5 4989050 -32730 32408 4670.66 467066 -124 127 1.22 122 -441 101 10431 99342 1.32432 298.32432 149.82432 14982.43243 1.32432 298.3243 149.82432 14982.4323 1.32432 298.32432 149.82432 14982.43200 2020-01-01 2020-01-02 2020-01-01 00:07:21 2020-01-02 03:35:42 2020-01-01 00:07:21.000 2020-01-02 03:35:42.000 441 99342 49891.5 4989150 441 99342 49891.5 4989150 -32729 32409 4671.66 467166 -128 127 -0.34 -34 -442 101 10432 99343 1.32732 298.32732 149.82732 14982.73273 1.32732 298.32733 149.82732 14982.7329 1.32732 298.32732 149.82732 14982.73200 2020-01-01 2020-01-02 2020-01-01 00:07:22 2020-01-02 03:35:43 2020-01-01 00:07:22.000 2020-01-02 03:35:43.000 442 99343 49892.5 4989250 442 99343 49892.5 4989250 -32728 32410 4672.66 467266 -128 123 -1.9 -190 -443 101 10433 99344 1.33033 298.33033 149.83033 14983.03303 1.33033 298.33032 149.83033 14983.03319 1.33033 298.33033 149.83033 14983.03300 2020-01-01 2020-01-02 2020-01-01 00:07:23 2020-01-02 03:35:44 2020-01-01 00:07:23.000 2020-01-02 03:35:44.000 443 99344 49893.5 4989350 443 99344 49893.5 4989350 -32727 32411 4673.66 467366 -127 124 -0.9 -90 -444 101 10434 99345 1.33333 298.33333 149.83333 14983.33333 1.33333 298.33334 149.83333 14983.33331 1.33333 298.33333 149.83333000000002 14983.33300 2020-01-01 2020-01-02 2020-01-01 00:07:24 2020-01-02 03:35:45 2020-01-01 00:07:24.000 2020-01-02 03:35:45.000 444 99345 49894.5 4989450 444 99345 49894.5 4989450 -32726 32412 4674.66 467466 -126 125 0.1 10 -445 101 10435 99346 1.33633 298.33633 149.83633 14983.63363 1.33633 298.33633 149.83633 14983.63348 1.33633 298.33633 149.83633 14983.63300 2020-01-01 2020-01-02 2020-01-01 00:07:25 2020-01-02 03:35:46 2020-01-01 00:07:25.000 2020-01-02 03:35:46.000 445 99346 49895.5 4989550 445 99346 49895.5 4989550 -32725 32413 4675.66 467566 -125 126 1.1 110 -446 101 10436 99347 1.33933 298.33933 149.83933 14983.93393 1.33933 298.33932 149.83933 14983.93378 1.33933 298.33933 149.83933000000002 14983.93300 2020-01-01 2020-01-02 2020-01-01 00:07:26 2020-01-02 03:35:47 2020-01-01 00:07:26.000 2020-01-02 03:35:47.000 446 99347 49896.5 4989650 446 99347 49896.5 4989650 -32724 32414 4676.66 467666 -124 127 2.1 210 -447 101 10437 99348 1.34234 298.34234 149.84234 14984.23423 1.34234 298.34235 149.84234 14984.23437 1.34234 298.34234 149.84234 14984.23400 2020-01-01 2020-01-02 2020-01-01 00:07:27 2020-01-02 03:35:48 2020-01-01 00:07:27.000 2020-01-02 03:35:48.000 447 99348 49897.5 4989750 447 99348 49897.5 4989750 -32723 32415 4677.66 467766 -128 127 0.54 54 -448 101 10438 99349 1.34534 298.34534 149.84534 14984.53453 1.34534 298.34534 149.84534 14984.53466 1.34534 298.34534 149.84534 14984.53400 2020-01-01 2020-01-02 2020-01-01 00:07:28 2020-01-02 03:35:49 2020-01-01 00:07:28.000 2020-01-02 03:35:49.000 448 99349 49898.5 4989850 448 99349 49898.5 4989850 -32722 32416 4678.66 467866 -128 123 -1.02 -102 -449 101 10439 99350 1.34834 298.34834 149.84834 14984.83483 1.34834 298.34836 149.84834 14984.83478 1.34834 298.34834 149.84834 14984.83400 2020-01-01 2020-01-02 2020-01-01 00:07:29 2020-01-02 03:35:50 2020-01-01 00:07:29.000 2020-01-02 03:35:50.000 449 99350 49899.5 4989950 449 99350 49899.5 4989950 -32721 32417 4679.66 467966 -127 124 -0.02 -2 +440 101 10430 99341 1.32132 298.32132 149.82132 14982.13213 1.32132 298.32132 149.82131 14982.13197 1.32132 298.32132 149.82132 14982.132 2020-01-01 2020-01-02 2020-01-01 00:07:20 2020-01-02 03:35:41 2020-01-01 00:07:20.000 2020-01-02 03:35:41.000 440 99341 49890.5 4989050 440 99341 49890.5 4989050 -32730 32408 4670.66 467066 -124 127 1.22 122 +441 101 10431 99342 1.32432 298.32432 149.82432 14982.43243 1.32432 298.3243 149.82432 14982.4323 1.32432 298.32432 149.82432 14982.432 2020-01-01 2020-01-02 2020-01-01 00:07:21 2020-01-02 03:35:42 2020-01-01 00:07:21.000 2020-01-02 03:35:42.000 441 99342 49891.5 4989150 441 99342 49891.5 4989150 -32729 32409 4671.66 467166 -128 127 -0.34 -34 +442 101 10432 99343 1.32732 298.32732 149.82732 14982.73273 1.32732 298.32733 149.82732 14982.7329 1.32732 298.32732 149.82732 14982.732 2020-01-01 2020-01-02 2020-01-01 00:07:22 2020-01-02 03:35:43 2020-01-01 00:07:22.000 2020-01-02 03:35:43.000 442 99343 49892.5 4989250 442 99343 49892.5 4989250 -32728 32410 4672.66 467266 -128 123 -1.9 -190 +443 101 10433 99344 1.33033 298.33033 149.83033 14983.03303 1.33033 298.33032 149.83033 14983.03319 1.33033 298.33033 149.83033 14983.033 2020-01-01 2020-01-02 2020-01-01 00:07:23 2020-01-02 03:35:44 2020-01-01 00:07:23.000 2020-01-02 03:35:44.000 443 99344 49893.5 4989350 443 99344 49893.5 4989350 -32727 32411 4673.66 467366 -127 124 -0.9 -90 +444 101 10434 99345 1.33333 298.33333 149.83333 14983.33333 1.33333 298.33334 149.83333 14983.33331 1.33333 298.33333 149.83333000000002 14983.333 2020-01-01 2020-01-02 2020-01-01 00:07:24 2020-01-02 03:35:45 2020-01-01 00:07:24.000 2020-01-02 03:35:45.000 444 99345 49894.5 4989450 444 99345 49894.5 4989450 -32726 32412 4674.66 467466 -126 125 0.1 10 +445 101 10435 99346 1.33633 298.33633 149.83633 14983.63363 1.33633 298.33633 149.83633 14983.63348 1.33633 298.33633 149.83633 14983.633 2020-01-01 2020-01-02 2020-01-01 00:07:25 2020-01-02 03:35:46 2020-01-01 00:07:25.000 2020-01-02 03:35:46.000 445 99346 49895.5 4989550 445 99346 49895.5 4989550 -32725 32413 4675.66 467566 -125 126 1.1 110 +446 101 10436 99347 1.33933 298.33933 149.83933 14983.93393 1.33933 298.33932 149.83933 14983.93378 1.33933 298.33933 149.83933000000002 14983.933 2020-01-01 2020-01-02 2020-01-01 00:07:26 2020-01-02 03:35:47 2020-01-01 00:07:26.000 2020-01-02 03:35:47.000 446 99347 49896.5 4989650 446 99347 49896.5 4989650 -32724 32414 4676.66 467666 -124 127 2.1 210 +447 101 10437 99348 1.34234 298.34234 149.84234 14984.23423 1.34234 298.34235 149.84234 14984.23437 1.34234 298.34234 149.84234 14984.234 2020-01-01 2020-01-02 2020-01-01 00:07:27 2020-01-02 03:35:48 2020-01-01 00:07:27.000 2020-01-02 03:35:48.000 447 99348 49897.5 4989750 447 99348 49897.5 4989750 -32723 32415 4677.66 467766 -128 127 0.54 54 +448 101 10438 99349 1.34534 298.34534 149.84534 14984.53453 1.34534 298.34534 149.84534 14984.53466 1.34534 298.34534 149.84534 14984.534 2020-01-01 2020-01-02 2020-01-01 00:07:28 2020-01-02 03:35:49 2020-01-01 00:07:28.000 2020-01-02 03:35:49.000 448 99349 49898.5 4989850 448 99349 49898.5 4989850 -32722 32416 4678.66 467866 -128 123 -1.02 -102 +449 101 10439 99350 1.34834 298.34834 149.84834 14984.83483 1.34834 298.34836 149.84834 14984.83478 1.34834 298.34834 149.84834 14984.834 2020-01-01 2020-01-02 2020-01-01 00:07:29 2020-01-02 03:35:50 2020-01-01 00:07:29.000 2020-01-02 03:35:50.000 449 99350 49899.5 4989950 449 99350 49899.5 4989950 -32721 32417 4679.66 467966 -127 124 -0.02 -2 45 102 10035 99945 0.13513 300.13513 150.13513 15163.64864 0.13513 300.13513 150.13513 15163.64839 0.13513 300.13513 150.13513 15163.64813 2020-01-01 2020-01-02 2020-01-01 00:00:45 2020-01-02 03:45:45 2020-01-01 00:00:45.000 2020-01-02 03:45:45.000 45 99945 49995 5049495 45 99945 49995 5049495 -32524 32411 4574.009900990099 461975 -126 126 -1.0396039603960396 -105 -450 101 10440 99351 1.35135 298.35135 149.85135 14985.13513 1.35135 298.35135 149.85134 14985.13495 1.35135 298.35135 149.85135 14985.13500 2020-01-01 2020-01-02 2020-01-01 00:07:30 2020-01-02 03:35:51 2020-01-01 00:07:30.000 2020-01-02 03:35:51.000 450 99351 49900.5 4990050 450 99351 49900.5 4990050 -32720 32418 4680.66 468066 -126 125 0.98 98 -451 101 10441 99352 1.35435 298.35435 149.85435 14985.43543 1.35435 298.35434 149.85435 14985.43525 1.35435 298.35435 149.85434999999998 14985.43500 2020-01-01 2020-01-02 2020-01-01 00:07:31 2020-01-02 03:35:52 2020-01-01 00:07:31.000 2020-01-02 03:35:52.000 451 99352 49901.5 4990150 451 99352 49901.5 4990150 -32719 32419 4681.66 468166 -125 126 1.98 198 -452 101 10442 99353 1.35735 298.35735 149.85735 14985.73573 1.35735 298.35736 149.85736 14985.736 1.35735 298.35735 149.85735 14985.73500 2020-01-01 2020-01-02 2020-01-01 00:07:32 2020-01-02 03:35:53 2020-01-01 00:07:32.000 2020-01-02 03:35:53.000 452 99353 49902.5 4990250 452 99353 49902.5 4990250 -32718 32420 4682.66 468266 -124 127 2.98 298 -453 101 10443 99354 1.36036 298.36036 149.86036 14986.03603 1.36036 298.36035 149.86036 14986.03614 1.36036 298.36036 149.86036000000001 14986.03600 2020-01-01 2020-01-02 2020-01-01 00:07:33 2020-01-02 03:35:54 2020-01-01 00:07:33.000 2020-01-02 03:35:54.000 453 99354 49903.5 4990350 453 99354 49903.5 4990350 -32717 32421 4683.66 468366 -128 127 1.42 142 -454 101 10444 99355 1.36336 298.36336 149.86336 14986.33633 1.36336 298.36337 149.86336 14986.33629 1.36336 298.36336 149.86336 14986.33600 2020-01-01 2020-01-02 2020-01-01 00:07:34 2020-01-02 03:35:55 2020-01-01 00:07:34.000 2020-01-02 03:35:55.000 454 99355 49904.5 4990450 454 99355 49904.5 4990450 -32716 32422 4684.66 468466 -128 127 -0.14 -14 -455 101 10445 99356 1.36636 298.36636 149.86636 14986.63663 1.36636 298.36636 149.86636 14986.63641 1.36636 298.36636 149.86636000000001 14986.63600 2020-01-01 2020-01-02 2020-01-01 00:07:35 2020-01-02 03:35:56 2020-01-01 00:07:35.000 2020-01-02 03:35:56.000 455 99356 49905.5 4990550 455 99356 49905.5 4990550 -32715 32423 4685.66 468566 -128 124 -1.7 -170 -456 101 10446 99357 1.36936 298.36936 149.86936 14986.93693 1.36936 298.36935 149.86936 14986.93672 1.36936 298.36936 149.86936 14986.93600 2020-01-01 2020-01-02 2020-01-01 00:07:36 2020-01-02 03:35:57 2020-01-01 00:07:36.000 2020-01-02 03:35:57.000 456 99357 49906.5 4990650 456 99357 49906.5 4990650 -32714 32424 4686.66 468666 -127 125 -0.7 -70 -457 101 10447 99358 1.37237 298.37237 149.87237 14987.23723 1.37237 298.37238 149.87237 14987.23747 1.37237 298.37237 149.87237 14987.23700 2020-01-01 2020-01-02 2020-01-01 00:07:37 2020-01-02 03:35:58 2020-01-01 00:07:37.000 2020-01-02 03:35:58.000 457 99358 49907.5 4990750 457 99358 49907.5 4990750 -32713 32425 4687.66 468766 -126 126 0.3 30 -458 101 10448 99359 1.37537 298.37537 149.87537 14987.53753 1.37537 298.37537 149.87537 14987.5376 1.37537 298.37537 149.87537 14987.53700 2020-01-01 2020-01-02 2020-01-01 00:07:38 2020-01-02 03:35:59 2020-01-01 00:07:38.000 2020-01-02 03:35:59.000 458 99359 49908.5 4990850 458 99359 49908.5 4990850 -32712 32426 4688.66 468866 -125 127 1.3 130 -459 101 10449 99360 1.37837 298.37837 149.87837 14987.83783 1.37837 298.3784 149.87837 14987.83775 1.37837 298.37837 149.87837 14987.83700 2020-01-01 2020-01-02 2020-01-01 00:07:39 2020-01-02 03:36:00 2020-01-01 00:07:39.000 2020-01-02 03:36:00.000 459 99360 49909.5 4990950 459 99360 49909.5 4990950 -32711 32427 4689.66 468966 -128 127 -0.26 -26 +450 101 10440 99351 1.35135 298.35135 149.85135 14985.13513 1.35135 298.35135 149.85134 14985.13495 1.35135 298.35135 149.85135 14985.135 2020-01-01 2020-01-02 2020-01-01 00:07:30 2020-01-02 03:35:51 2020-01-01 00:07:30.000 2020-01-02 03:35:51.000 450 99351 49900.5 4990050 450 99351 49900.5 4990050 -32720 32418 4680.66 468066 -126 125 0.98 98 +451 101 10441 99352 1.35435 298.35435 149.85435 14985.43543 1.35435 298.35434 149.85435 14985.43525 1.35435 298.35435 149.85434999999998 14985.435 2020-01-01 2020-01-02 2020-01-01 00:07:31 2020-01-02 03:35:52 2020-01-01 00:07:31.000 2020-01-02 03:35:52.000 451 99352 49901.5 4990150 451 99352 49901.5 4990150 -32719 32419 4681.66 468166 -125 126 1.98 198 +452 101 10442 99353 1.35735 298.35735 149.85735 14985.73573 1.35735 298.35736 149.85736 14985.736 1.35735 298.35735 149.85735 14985.735 2020-01-01 2020-01-02 2020-01-01 00:07:32 2020-01-02 03:35:53 2020-01-01 00:07:32.000 2020-01-02 03:35:53.000 452 99353 49902.5 4990250 452 99353 49902.5 4990250 -32718 32420 4682.66 468266 -124 127 2.98 298 +453 101 10443 99354 1.36036 298.36036 149.86036 14986.03603 1.36036 298.36035 149.86036 14986.03614 1.36036 298.36036 149.86036000000001 14986.036 2020-01-01 2020-01-02 2020-01-01 00:07:33 2020-01-02 03:35:54 2020-01-01 00:07:33.000 2020-01-02 03:35:54.000 453 99354 49903.5 4990350 453 99354 49903.5 4990350 -32717 32421 4683.66 468366 -128 127 1.42 142 +454 101 10444 99355 1.36336 298.36336 149.86336 14986.33633 1.36336 298.36337 149.86336 14986.33629 1.36336 298.36336 149.86336 14986.336 2020-01-01 2020-01-02 2020-01-01 00:07:34 2020-01-02 03:35:55 2020-01-01 00:07:34.000 2020-01-02 03:35:55.000 454 99355 49904.5 4990450 454 99355 49904.5 4990450 -32716 32422 4684.66 468466 -128 127 -0.14 -14 +455 101 10445 99356 1.36636 298.36636 149.86636 14986.63663 1.36636 298.36636 149.86636 14986.63641 1.36636 298.36636 149.86636000000001 14986.636 2020-01-01 2020-01-02 2020-01-01 00:07:35 2020-01-02 03:35:56 2020-01-01 00:07:35.000 2020-01-02 03:35:56.000 455 99356 49905.5 4990550 455 99356 49905.5 4990550 -32715 32423 4685.66 468566 -128 124 -1.7 -170 +456 101 10446 99357 1.36936 298.36936 149.86936 14986.93693 1.36936 298.36935 149.86936 14986.93672 1.36936 298.36936 149.86936 14986.936 2020-01-01 2020-01-02 2020-01-01 00:07:36 2020-01-02 03:35:57 2020-01-01 00:07:36.000 2020-01-02 03:35:57.000 456 99357 49906.5 4990650 456 99357 49906.5 4990650 -32714 32424 4686.66 468666 -127 125 -0.7 -70 +457 101 10447 99358 1.37237 298.37237 149.87237 14987.23723 1.37237 298.37238 149.87237 14987.23747 1.37237 298.37237 149.87237 14987.237 2020-01-01 2020-01-02 2020-01-01 00:07:37 2020-01-02 03:35:58 2020-01-01 00:07:37.000 2020-01-02 03:35:58.000 457 99358 49907.5 4990750 457 99358 49907.5 4990750 -32713 32425 4687.66 468766 -126 126 0.3 30 +458 101 10448 99359 1.37537 298.37537 149.87537 14987.53753 1.37537 298.37537 149.87537 14987.5376 1.37537 298.37537 149.87537 14987.537 2020-01-01 2020-01-02 2020-01-01 00:07:38 2020-01-02 03:35:59 2020-01-01 00:07:38.000 2020-01-02 03:35:59.000 458 99359 49908.5 4990850 458 99359 49908.5 4990850 -32712 32426 4688.66 468866 -125 127 1.3 130 +459 101 10449 99360 1.37837 298.37837 149.87837 14987.83783 1.37837 298.3784 149.87837 14987.83775 1.37837 298.37837 149.87837 14987.837 2020-01-01 2020-01-02 2020-01-01 00:07:39 2020-01-02 03:36:00 2020-01-01 00:07:39.000 2020-01-02 03:36:00.000 459 99360 49909.5 4990950 459 99360 49909.5 4990950 -32711 32427 4689.66 468966 -128 127 -0.26 -26 46 102 10036 99946 0.13813 300.13813 150.13813 15163.95195 0.13813 300.13815 150.13814 15163.95214 0.13813 300.13813 150.13813 15163.95113 2020-01-01 2020-01-02 2020-01-01 00:00:46 2020-01-02 03:45:46 2020-01-01 00:00:46.000 2020-01-02 03:45:46.000 46 99946 49996 5049596 46 99946 49996 5049596 -32523 32412 4575.009900990099 462076 -125 127 -0.039603960396039604 -4 -460 101 10450 99361 1.38138 298.38138 149.88138 14988.13813 1.38138 298.38138 149.88137 14988.13789 1.38138 298.38138 149.88138 14988.13800 2020-01-01 2020-01-02 2020-01-01 00:07:40 2020-01-02 03:36:01 2020-01-01 00:07:40.000 2020-01-02 03:36:01.000 460 99361 49910.5 4991050 460 99361 49910.5 4991050 -32710 32428 4690.66 469066 -128 127 -1.82 -182 -461 101 10451 99362 1.38438 298.38438 149.88438 14988.43843 1.38438 298.3844 149.88438 14988.43864 1.38438 298.38438 149.88438 14988.43800 2020-01-01 2020-01-02 2020-01-01 00:07:41 2020-01-02 03:36:02 2020-01-01 00:07:41.000 2020-01-02 03:36:02.000 461 99362 49911.5 4991150 461 99362 49911.5 4991150 -32709 32429 4691.66 469166 -128 123 -3.38 -338 -462 101 10452 99363 1.38738 298.38738 149.88738 14988.73873 1.38738 298.3874 149.88738 14988.73894 1.38738 298.38738 149.88738 14988.73800 2020-01-01 2020-01-02 2020-01-01 00:07:42 2020-01-02 03:36:03 2020-01-01 00:07:42.000 2020-01-02 03:36:03.000 462 99363 49912.5 4991250 462 99363 49912.5 4991250 -32708 32430 4692.66 469266 -127 124 -2.38 -238 -463 101 10453 99364 1.39039 298.39039 149.89039 14989.03903 1.39039 298.39038 149.89039 14989.03907 1.39039 298.39039 149.89039 14989.03900 2020-01-01 2020-01-02 2020-01-01 00:07:43 2020-01-02 03:36:04 2020-01-01 00:07:43.000 2020-01-02 03:36:04.000 463 99364 49913.5 4991350 463 99364 49913.5 4991350 -32707 32431 4693.66 469366 -126 125 -1.38 -138 -464 101 10454 99365 1.39339 298.39339 149.89339 14989.33933 1.39339 298.3934 149.89339 14989.33922 1.39339 298.39339 149.89339 14989.33900 2020-01-01 2020-01-02 2020-01-01 00:07:44 2020-01-02 03:36:05 2020-01-01 00:07:44.000 2020-01-02 03:36:05.000 464 99365 49914.5 4991450 464 99365 49914.5 4991450 -32706 32432 4694.66 469466 -125 126 -0.38 -38 -465 101 10455 99366 1.39639 298.39639 149.89639 14989.63963 1.39639 298.3964 149.89639 14989.63936 1.39639 298.39639 149.89639 14989.63900 2020-01-01 2020-01-02 2020-01-01 00:07:45 2020-01-02 03:36:06 2020-01-01 00:07:45.000 2020-01-02 03:36:06.000 465 99366 49915.5 4991550 465 99366 49915.5 4991550 -32705 32433 4695.66 469566 -124 127 0.62 62 -466 101 10456 99367 1.39939 298.39939 149.89939 14989.93993 1.39939 298.3994 149.8994 14989.94011 1.39939 298.39939 149.89939 14989.93900 2020-01-01 2020-01-02 2020-01-01 00:07:46 2020-01-02 03:36:07 2020-01-01 00:07:46.000 2020-01-02 03:36:07.000 466 99367 49916.5 4991650 466 99367 49916.5 4991650 -32704 32434 4696.66 469666 -128 127 -0.94 -94 -467 101 10457 99368 1.4024 298.4024 149.9024 14990.24024 1.4024 298.4024 149.9024 14990.24041 1.40240 298.40240 149.9024 14990.24000 2020-01-01 2020-01-02 2020-01-01 00:07:47 2020-01-02 03:36:08 2020-01-01 00:07:47.000 2020-01-02 03:36:08.000 467 99368 49917.5 4991750 467 99368 49917.5 4991750 -32703 32435 4697.66 469766 -128 123 -2.5 -250 -468 101 10458 99369 1.4054 298.4054 149.9054 14990.54054 1.4054 298.4054 149.9054 14990.54058 1.40540 298.40540 149.90540000000001 14990.54000 2020-01-01 2020-01-02 2020-01-01 00:07:48 2020-01-02 03:36:09 2020-01-01 00:07:48.000 2020-01-02 03:36:09.000 468 99369 49918.5 4991850 468 99369 49918.5 4991850 -32702 32436 4698.66 469866 -127 124 -1.5 -150 -469 101 10459 99370 1.4084 298.4084 149.9084 14990.84084 1.4084 298.40842 149.9084 14990.8407 1.40840 298.40840 149.9084 14990.84000 2020-01-01 2020-01-02 2020-01-01 00:07:49 2020-01-02 03:36:10 2020-01-01 00:07:49.000 2020-01-02 03:36:10.000 469 99370 49919.5 4991950 469 99370 49919.5 4991950 -32701 32437 4699.66 469966 -126 125 -0.5 -50 +460 101 10450 99361 1.38138 298.38138 149.88138 14988.13813 1.38138 298.38138 149.88137 14988.13789 1.38138 298.38138 149.88138 14988.138 2020-01-01 2020-01-02 2020-01-01 00:07:40 2020-01-02 03:36:01 2020-01-01 00:07:40.000 2020-01-02 03:36:01.000 460 99361 49910.5 4991050 460 99361 49910.5 4991050 -32710 32428 4690.66 469066 -128 127 -1.82 -182 +461 101 10451 99362 1.38438 298.38438 149.88438 14988.43843 1.38438 298.3844 149.88438 14988.43864 1.38438 298.38438 149.88438 14988.438 2020-01-01 2020-01-02 2020-01-01 00:07:41 2020-01-02 03:36:02 2020-01-01 00:07:41.000 2020-01-02 03:36:02.000 461 99362 49911.5 4991150 461 99362 49911.5 4991150 -32709 32429 4691.66 469166 -128 123 -3.38 -338 +462 101 10452 99363 1.38738 298.38738 149.88738 14988.73873 1.38738 298.3874 149.88738 14988.73894 1.38738 298.38738 149.88738 14988.738 2020-01-01 2020-01-02 2020-01-01 00:07:42 2020-01-02 03:36:03 2020-01-01 00:07:42.000 2020-01-02 03:36:03.000 462 99363 49912.5 4991250 462 99363 49912.5 4991250 -32708 32430 4692.66 469266 -127 124 -2.38 -238 +463 101 10453 99364 1.39039 298.39039 149.89039 14989.03903 1.39039 298.39038 149.89039 14989.03907 1.39039 298.39039 149.89039 14989.039 2020-01-01 2020-01-02 2020-01-01 00:07:43 2020-01-02 03:36:04 2020-01-01 00:07:43.000 2020-01-02 03:36:04.000 463 99364 49913.5 4991350 463 99364 49913.5 4991350 -32707 32431 4693.66 469366 -126 125 -1.38 -138 +464 101 10454 99365 1.39339 298.39339 149.89339 14989.33933 1.39339 298.3934 149.89339 14989.33922 1.39339 298.39339 149.89339 14989.339 2020-01-01 2020-01-02 2020-01-01 00:07:44 2020-01-02 03:36:05 2020-01-01 00:07:44.000 2020-01-02 03:36:05.000 464 99365 49914.5 4991450 464 99365 49914.5 4991450 -32706 32432 4694.66 469466 -125 126 -0.38 -38 +465 101 10455 99366 1.39639 298.39639 149.89639 14989.63963 1.39639 298.3964 149.89639 14989.63936 1.39639 298.39639 149.89639 14989.639 2020-01-01 2020-01-02 2020-01-01 00:07:45 2020-01-02 03:36:06 2020-01-01 00:07:45.000 2020-01-02 03:36:06.000 465 99366 49915.5 4991550 465 99366 49915.5 4991550 -32705 32433 4695.66 469566 -124 127 0.62 62 +466 101 10456 99367 1.39939 298.39939 149.89939 14989.93993 1.39939 298.3994 149.8994 14989.94011 1.39939 298.39939 149.89939 14989.939 2020-01-01 2020-01-02 2020-01-01 00:07:46 2020-01-02 03:36:07 2020-01-01 00:07:46.000 2020-01-02 03:36:07.000 466 99367 49916.5 4991650 466 99367 49916.5 4991650 -32704 32434 4696.66 469666 -128 127 -0.94 -94 +467 101 10457 99368 1.4024 298.4024 149.9024 14990.24024 1.4024 298.4024 149.9024 14990.24041 1.4024 298.4024 149.9024 14990.24 2020-01-01 2020-01-02 2020-01-01 00:07:47 2020-01-02 03:36:08 2020-01-01 00:07:47.000 2020-01-02 03:36:08.000 467 99368 49917.5 4991750 467 99368 49917.5 4991750 -32703 32435 4697.66 469766 -128 123 -2.5 -250 +468 101 10458 99369 1.4054 298.4054 149.9054 14990.54054 1.4054 298.4054 149.9054 14990.54058 1.4054 298.4054 149.90540000000001 14990.54 2020-01-01 2020-01-02 2020-01-01 00:07:48 2020-01-02 03:36:09 2020-01-01 00:07:48.000 2020-01-02 03:36:09.000 468 99369 49918.5 4991850 468 99369 49918.5 4991850 -32702 32436 4698.66 469866 -127 124 -1.5 -150 +469 101 10459 99370 1.4084 298.4084 149.9084 14990.84084 1.4084 298.40842 149.9084 14990.8407 1.4084 298.4084 149.9084 14990.84 2020-01-01 2020-01-02 2020-01-01 00:07:49 2020-01-02 03:36:10 2020-01-01 00:07:49.000 2020-01-02 03:36:10.000 469 99370 49919.5 4991950 469 99370 49919.5 4991950 -32701 32437 4699.66 469966 -126 125 -0.5 -50 47 102 10037 99947 0.14114 300.14114 150.14114 15164.25525 0.14114 300.14114 150.14114 15164.25545 0.14114 300.14114 150.14114 15164.25514 2020-01-01 2020-01-02 2020-01-01 00:00:47 2020-01-02 03:45:47 2020-01-01 00:00:47.000 2020-01-02 03:45:47.000 47 99947 49997 5049697 47 99947 49997 5049697 -32522 32413 4576.009900990099 462177 -128 127 -1.5742574257425743 -159 -470 101 10460 99371 1.41141 298.41141 149.91141 14991.14114 1.41141 298.4114 149.9114 14991.14099 1.41141 298.41141 149.91141 14991.14100 2020-01-01 2020-01-02 2020-01-01 00:07:50 2020-01-02 03:36:11 2020-01-01 00:07:50.000 2020-01-02 03:36:11.000 470 99371 49920.5 4992050 470 99371 49920.5 4992050 -32700 32438 4700.66 470066 -125 126 0.5 50 -471 101 10461 99372 1.41441 298.41441 149.91441 14991.44144 1.41441 298.41443 149.91441 14991.44159 1.41441 298.41441 149.91441 14991.44100 2020-01-01 2020-01-02 2020-01-01 00:07:51 2020-01-02 03:36:12 2020-01-01 00:07:51.000 2020-01-02 03:36:12.000 471 99372 49921.5 4992150 471 99372 49921.5 4992150 -32699 32439 4701.66 470166 -124 127 1.5 150 -472 101 10462 99373 1.41741 298.41741 149.91741 14991.74174 1.41741 298.41742 149.91741 14991.74188 1.41741 298.41741 149.91741 14991.74100 2020-01-01 2020-01-02 2020-01-01 00:07:52 2020-01-02 03:36:13 2020-01-01 00:07:52.000 2020-01-02 03:36:13.000 472 99373 49922.5 4992250 472 99373 49922.5 4992250 -32698 32440 4702.66 470266 -128 127 -0.06 -6 -473 101 10463 99374 1.42042 298.42042 149.92042 14992.04204 1.42042 298.4204 149.92042 14992.04204 1.42042 298.42042 149.92042 14992.04200 2020-01-01 2020-01-02 2020-01-01 00:07:53 2020-01-02 03:36:14 2020-01-01 00:07:53.000 2020-01-02 03:36:14.000 473 99374 49923.5 4992350 473 99374 49923.5 4992350 -32697 32441 4703.66 470366 -128 123 -1.62 -162 -474 101 10464 99375 1.42342 298.42342 149.92342 14992.34234 1.42342 298.42343 149.92342 14992.34216 1.42342 298.42342 149.92342 14992.34200 2020-01-01 2020-01-02 2020-01-01 00:07:54 2020-01-02 03:36:15 2020-01-01 00:07:54.000 2020-01-02 03:36:15.000 474 99375 49924.5 4992450 474 99375 49924.5 4992450 -32696 32442 4704.66 470466 -127 124 -0.62 -62 -475 101 10465 99376 1.42642 298.42642 149.92642 14992.64264 1.42642 298.42642 149.92642 14992.64246 1.42642 298.42642 149.92642 14992.64200 2020-01-01 2020-01-02 2020-01-01 00:07:55 2020-01-02 03:36:16 2020-01-01 00:07:55.000 2020-01-02 03:36:16.000 475 99376 49925.5 4992550 475 99376 49925.5 4992550 -32695 32443 4705.66 470566 -126 125 0.38 38 -476 101 10466 99377 1.42942 298.42942 149.92942 14992.94294 1.42942 298.42944 149.92943 14992.94305 1.42942 298.42942 149.92942 14992.94200 2020-01-01 2020-01-02 2020-01-01 00:07:56 2020-01-02 03:36:17 2020-01-01 00:07:56.000 2020-01-02 03:36:17.000 476 99377 49926.5 4992650 476 99377 49926.5 4992650 -32694 32444 4706.66 470666 -125 126 1.38 138 -477 101 10467 99378 1.43243 298.43243 149.93243 14993.24324 1.43243 298.43243 149.93243 14993.24338 1.43243 298.43243 149.93243 14993.24300 2020-01-01 2020-01-02 2020-01-01 00:07:57 2020-01-02 03:36:18 2020-01-01 00:07:57.000 2020-01-02 03:36:18.000 477 99378 49927.5 4992750 477 99378 49927.5 4992750 -32693 32445 4707.66 470766 -124 127 2.38 238 -478 101 10468 99379 1.43543 298.43543 149.93543 14993.54354 1.43543 298.43542 149.93543 14993.54352 1.43543 298.43543 149.93543 14993.54300 2020-01-01 2020-01-02 2020-01-01 00:07:58 2020-01-02 03:36:19 2020-01-01 00:07:58.000 2020-01-02 03:36:19.000 478 99379 49928.5 4992850 478 99379 49928.5 4992850 -32692 32446 4708.66 470866 -128 127 0.82 82 -479 101 10469 99380 1.43843 298.43843 149.93843 14993.84384 1.43843 298.43845 149.93844 14993.84427 1.43843 298.43843 149.93843 14993.84300 2020-01-01 2020-01-02 2020-01-01 00:07:59 2020-01-02 03:36:20 2020-01-01 00:07:59.000 2020-01-02 03:36:20.000 479 99380 49929.5 4992950 479 99380 49929.5 4992950 -32691 32447 4709.66 470966 -128 127 -0.74 -74 +470 101 10460 99371 1.41141 298.41141 149.91141 14991.14114 1.41141 298.4114 149.9114 14991.14099 1.41141 298.41141 149.91141 14991.141 2020-01-01 2020-01-02 2020-01-01 00:07:50 2020-01-02 03:36:11 2020-01-01 00:07:50.000 2020-01-02 03:36:11.000 470 99371 49920.5 4992050 470 99371 49920.5 4992050 -32700 32438 4700.66 470066 -125 126 0.5 50 +471 101 10461 99372 1.41441 298.41441 149.91441 14991.44144 1.41441 298.41443 149.91441 14991.44159 1.41441 298.41441 149.91441 14991.441 2020-01-01 2020-01-02 2020-01-01 00:07:51 2020-01-02 03:36:12 2020-01-01 00:07:51.000 2020-01-02 03:36:12.000 471 99372 49921.5 4992150 471 99372 49921.5 4992150 -32699 32439 4701.66 470166 -124 127 1.5 150 +472 101 10462 99373 1.41741 298.41741 149.91741 14991.74174 1.41741 298.41742 149.91741 14991.74188 1.41741 298.41741 149.91741 14991.741 2020-01-01 2020-01-02 2020-01-01 00:07:52 2020-01-02 03:36:13 2020-01-01 00:07:52.000 2020-01-02 03:36:13.000 472 99373 49922.5 4992250 472 99373 49922.5 4992250 -32698 32440 4702.66 470266 -128 127 -0.06 -6 +473 101 10463 99374 1.42042 298.42042 149.92042 14992.04204 1.42042 298.4204 149.92042 14992.04204 1.42042 298.42042 149.92042 14992.042 2020-01-01 2020-01-02 2020-01-01 00:07:53 2020-01-02 03:36:14 2020-01-01 00:07:53.000 2020-01-02 03:36:14.000 473 99374 49923.5 4992350 473 99374 49923.5 4992350 -32697 32441 4703.66 470366 -128 123 -1.62 -162 +474 101 10464 99375 1.42342 298.42342 149.92342 14992.34234 1.42342 298.42343 149.92342 14992.34216 1.42342 298.42342 149.92342 14992.342 2020-01-01 2020-01-02 2020-01-01 00:07:54 2020-01-02 03:36:15 2020-01-01 00:07:54.000 2020-01-02 03:36:15.000 474 99375 49924.5 4992450 474 99375 49924.5 4992450 -32696 32442 4704.66 470466 -127 124 -0.62 -62 +475 101 10465 99376 1.42642 298.42642 149.92642 14992.64264 1.42642 298.42642 149.92642 14992.64246 1.42642 298.42642 149.92642 14992.642 2020-01-01 2020-01-02 2020-01-01 00:07:55 2020-01-02 03:36:16 2020-01-01 00:07:55.000 2020-01-02 03:36:16.000 475 99376 49925.5 4992550 475 99376 49925.5 4992550 -32695 32443 4705.66 470566 -126 125 0.38 38 +476 101 10466 99377 1.42942 298.42942 149.92942 14992.94294 1.42942 298.42944 149.92943 14992.94305 1.42942 298.42942 149.92942 14992.942 2020-01-01 2020-01-02 2020-01-01 00:07:56 2020-01-02 03:36:17 2020-01-01 00:07:56.000 2020-01-02 03:36:17.000 476 99377 49926.5 4992650 476 99377 49926.5 4992650 -32694 32444 4706.66 470666 -125 126 1.38 138 +477 101 10467 99378 1.43243 298.43243 149.93243 14993.24324 1.43243 298.43243 149.93243 14993.24338 1.43243 298.43243 149.93243 14993.243 2020-01-01 2020-01-02 2020-01-01 00:07:57 2020-01-02 03:36:18 2020-01-01 00:07:57.000 2020-01-02 03:36:18.000 477 99378 49927.5 4992750 477 99378 49927.5 4992750 -32693 32445 4707.66 470766 -124 127 2.38 238 +478 101 10468 99379 1.43543 298.43543 149.93543 14993.54354 1.43543 298.43542 149.93543 14993.54352 1.43543 298.43543 149.93543 14993.543 2020-01-01 2020-01-02 2020-01-01 00:07:58 2020-01-02 03:36:19 2020-01-01 00:07:58.000 2020-01-02 03:36:19.000 478 99379 49928.5 4992850 478 99379 49928.5 4992850 -32692 32446 4708.66 470866 -128 127 0.82 82 +479 101 10469 99380 1.43843 298.43843 149.93843 14993.84384 1.43843 298.43845 149.93844 14993.84427 1.43843 298.43843 149.93843 14993.843 2020-01-01 2020-01-02 2020-01-01 00:07:59 2020-01-02 03:36:20 2020-01-01 00:07:59.000 2020-01-02 03:36:20.000 479 99380 49929.5 4992950 479 99380 49929.5 4992950 -32691 32447 4709.66 470966 -128 127 -0.74 -74 48 102 10038 99948 0.14414 300.14414 150.14414 15164.55855 0.14414 300.14413 150.14414 15164.55863 0.14414 300.14414 150.14414 15164.55814 2020-01-01 2020-01-02 2020-01-01 00:00:48 2020-01-02 03:45:48 2020-01-01 00:00:48.000 2020-01-02 03:45:48.000 48 99948 49998 5049798 48 99948 49998 5049798 -32521 32414 4577.009900990099 462278 -128 127 -3.108910891089109 -314 -480 101 10470 99381 1.44144 298.44144 149.94144 14994.14414 1.44144 298.44144 149.94143 14994.14392 1.44144 298.44144 149.94144 14994.14400 2020-01-01 2020-01-02 2020-01-01 00:08:00 2020-01-02 03:36:21 2020-01-01 00:08:00.000 2020-01-02 03:36:21.000 480 99381 49930.5 4993050 480 99381 49930.5 4993050 -32690 32448 4710.66 471066 -128 124 -2.3 -230 -481 101 10471 99382 1.44444 298.44444 149.94444 14994.44444 1.44444 298.44446 149.94444 14994.44452 1.44444 298.44444 149.94444 14994.44400 2020-01-01 2020-01-02 2020-01-01 00:08:01 2020-01-02 03:36:22 2020-01-01 00:08:01.000 2020-01-02 03:36:22.000 481 99382 49931.5 4993150 481 99382 49931.5 4993150 -32689 32449 4711.66 471166 -127 125 -1.3 -130 -482 101 10472 99383 1.44744 298.44744 149.94744 14994.74474 1.44744 298.44745 149.94744 14994.74485 1.44744 298.44744 149.94744 14994.74400 2020-01-01 2020-01-02 2020-01-01 00:08:02 2020-01-02 03:36:23 2020-01-01 00:08:02.000 2020-01-02 03:36:23.000 482 99383 49932.5 4993250 482 99383 49932.5 4993250 -32688 32450 4712.66 471266 -126 126 -0.3 -30 -483 101 10473 99384 1.45045 298.45045 149.95045 14995.04504 1.45045 298.45044 149.95044 14995.04499 1.45045 298.45045 149.95045 14995.04500 2020-01-01 2020-01-02 2020-01-01 00:08:03 2020-01-02 03:36:24 2020-01-01 00:08:03.000 2020-01-02 03:36:24.000 483 99384 49933.5 4993350 483 99384 49933.5 4993350 -32687 32451 4713.66 471366 -125 127 0.7 70 -484 101 10474 99385 1.45345 298.45345 149.95345 14995.34534 1.45345 298.45346 149.95345 14995.34574 1.45345 298.45345 149.95345 14995.34500 2020-01-01 2020-01-02 2020-01-01 00:08:04 2020-01-02 03:36:25 2020-01-01 00:08:04.000 2020-01-02 03:36:25.000 484 99385 49934.5 4993450 484 99385 49934.5 4993450 -32686 32452 4714.66 471466 -128 127 -0.86 -86 -485 101 10475 99386 1.45645 298.45645 149.95645 14995.64564 1.45645 298.45645 149.95645 14995.6454 1.45645 298.45645 149.95645000000002 14995.64500 2020-01-01 2020-01-02 2020-01-01 00:08:05 2020-01-02 03:36:26 2020-01-01 00:08:05.000 2020-01-02 03:36:26.000 485 99386 49935.5 4993550 485 99386 49935.5 4993550 -32685 32453 4715.66 471566 -128 127 -2.42 -242 -486 101 10476 99387 1.45945 298.45945 149.95945 14995.94594 1.45945 298.45947 149.95946 14995.94602 1.45945 298.45945 149.95945 14995.94500 2020-01-01 2020-01-02 2020-01-01 00:08:06 2020-01-02 03:36:27 2020-01-01 00:08:06.000 2020-01-02 03:36:27.000 486 99387 49936.5 4993650 486 99387 49936.5 4993650 -32684 32454 4716.66 471666 -128 123 -3.98 -398 -487 101 10477 99388 1.46246 298.46246 149.96246 14996.24624 1.46246 298.46246 149.96246 14996.24633 1.46246 298.46246 149.96246 14996.24600 2020-01-01 2020-01-02 2020-01-01 00:08:07 2020-01-02 03:36:28 2020-01-01 00:08:07.000 2020-01-02 03:36:28.000 487 99388 49937.5 4993750 487 99388 49937.5 4993750 -32683 32455 4717.66 471766 -127 124 -2.98 -298 -488 101 10478 99389 1.46546 298.46546 149.96546 14996.54654 1.46546 298.46545 149.96546 14996.54645 1.46546 298.46546 149.96546 14996.54600 2020-01-01 2020-01-02 2020-01-01 00:08:08 2020-01-02 03:36:29 2020-01-01 00:08:08.000 2020-01-02 03:36:29.000 488 99389 49938.5 4993850 488 99389 49938.5 4993850 -32682 32456 4718.66 471866 -126 125 -1.98 -198 -489 101 10479 99390 1.46846 298.46846 149.96846 14996.84684 1.46846 298.46848 149.96847 14996.84721 1.46846 298.46846 149.96846 14996.84600 2020-01-01 2020-01-02 2020-01-01 00:08:09 2020-01-02 03:36:30 2020-01-01 00:08:09.000 2020-01-02 03:36:30.000 489 99390 49939.5 4993950 489 99390 49939.5 4993950 -32681 32457 4719.66 471966 -125 126 -0.98 -98 +480 101 10470 99381 1.44144 298.44144 149.94144 14994.14414 1.44144 298.44144 149.94143 14994.14392 1.44144 298.44144 149.94144 14994.144 2020-01-01 2020-01-02 2020-01-01 00:08:00 2020-01-02 03:36:21 2020-01-01 00:08:00.000 2020-01-02 03:36:21.000 480 99381 49930.5 4993050 480 99381 49930.5 4993050 -32690 32448 4710.66 471066 -128 124 -2.3 -230 +481 101 10471 99382 1.44444 298.44444 149.94444 14994.44444 1.44444 298.44446 149.94444 14994.44452 1.44444 298.44444 149.94444 14994.444 2020-01-01 2020-01-02 2020-01-01 00:08:01 2020-01-02 03:36:22 2020-01-01 00:08:01.000 2020-01-02 03:36:22.000 481 99382 49931.5 4993150 481 99382 49931.5 4993150 -32689 32449 4711.66 471166 -127 125 -1.3 -130 +482 101 10472 99383 1.44744 298.44744 149.94744 14994.74474 1.44744 298.44745 149.94744 14994.74485 1.44744 298.44744 149.94744 14994.744 2020-01-01 2020-01-02 2020-01-01 00:08:02 2020-01-02 03:36:23 2020-01-01 00:08:02.000 2020-01-02 03:36:23.000 482 99383 49932.5 4993250 482 99383 49932.5 4993250 -32688 32450 4712.66 471266 -126 126 -0.3 -30 +483 101 10473 99384 1.45045 298.45045 149.95045 14995.04504 1.45045 298.45044 149.95044 14995.04499 1.45045 298.45045 149.95045 14995.045 2020-01-01 2020-01-02 2020-01-01 00:08:03 2020-01-02 03:36:24 2020-01-01 00:08:03.000 2020-01-02 03:36:24.000 483 99384 49933.5 4993350 483 99384 49933.5 4993350 -32687 32451 4713.66 471366 -125 127 0.7 70 +484 101 10474 99385 1.45345 298.45345 149.95345 14995.34534 1.45345 298.45346 149.95345 14995.34574 1.45345 298.45345 149.95345 14995.345 2020-01-01 2020-01-02 2020-01-01 00:08:04 2020-01-02 03:36:25 2020-01-01 00:08:04.000 2020-01-02 03:36:25.000 484 99385 49934.5 4993450 484 99385 49934.5 4993450 -32686 32452 4714.66 471466 -128 127 -0.86 -86 +485 101 10475 99386 1.45645 298.45645 149.95645 14995.64564 1.45645 298.45645 149.95645 14995.6454 1.45645 298.45645 149.95645000000002 14995.645 2020-01-01 2020-01-02 2020-01-01 00:08:05 2020-01-02 03:36:26 2020-01-01 00:08:05.000 2020-01-02 03:36:26.000 485 99386 49935.5 4993550 485 99386 49935.5 4993550 -32685 32453 4715.66 471566 -128 127 -2.42 -242 +486 101 10476 99387 1.45945 298.45945 149.95945 14995.94594 1.45945 298.45947 149.95946 14995.94602 1.45945 298.45945 149.95945 14995.945 2020-01-01 2020-01-02 2020-01-01 00:08:06 2020-01-02 03:36:27 2020-01-01 00:08:06.000 2020-01-02 03:36:27.000 486 99387 49936.5 4993650 486 99387 49936.5 4993650 -32684 32454 4716.66 471666 -128 123 -3.98 -398 +487 101 10477 99388 1.46246 298.46246 149.96246 14996.24624 1.46246 298.46246 149.96246 14996.24633 1.46246 298.46246 149.96246 14996.246 2020-01-01 2020-01-02 2020-01-01 00:08:07 2020-01-02 03:36:28 2020-01-01 00:08:07.000 2020-01-02 03:36:28.000 487 99388 49937.5 4993750 487 99388 49937.5 4993750 -32683 32455 4717.66 471766 -127 124 -2.98 -298 +488 101 10478 99389 1.46546 298.46546 149.96546 14996.54654 1.46546 298.46545 149.96546 14996.54645 1.46546 298.46546 149.96546 14996.546 2020-01-01 2020-01-02 2020-01-01 00:08:08 2020-01-02 03:36:29 2020-01-01 00:08:08.000 2020-01-02 03:36:29.000 488 99389 49938.5 4993850 488 99389 49938.5 4993850 -32682 32456 4718.66 471866 -126 125 -1.98 -198 +489 101 10479 99390 1.46846 298.46846 149.96846 14996.84684 1.46846 298.46848 149.96847 14996.84721 1.46846 298.46846 149.96846 14996.846 2020-01-01 2020-01-02 2020-01-01 00:08:09 2020-01-02 03:36:30 2020-01-01 00:08:09.000 2020-01-02 03:36:30.000 489 99390 49939.5 4993950 489 99390 49939.5 4993950 -32681 32457 4719.66 471966 -125 126 -0.98 -98 49 102 10039 99949 0.14714 300.14714 150.14714 15164.86186 0.14714 300.14716 150.14714 15164.86173 0.14714 300.14714 150.14714 15164.86114 2020-01-01 2020-01-02 2020-01-01 00:00:49 2020-01-02 03:45:49 2020-01-01 00:00:49.000 2020-01-02 03:45:49.000 49 99949 49999 5049899 49 99949 49999 5049899 -32520 32415 4578.009900990099 462379 -128 123 -4.643564356435643 -469 -490 101 10480 99391 1.47147 298.47147 149.97147 14997.14714 1.47147 298.47147 149.97146 14997.14687 1.47147 298.47147 149.97147 14997.14700 2020-01-01 2020-01-02 2020-01-01 00:08:10 2020-01-02 03:36:31 2020-01-01 00:08:10.000 2020-01-02 03:36:31.000 490 99391 49940.5 4994050 490 99391 49940.5 4994050 -32680 32458 4720.66 472066 -124 127 0.02 2 -491 101 10481 99392 1.47447 298.47447 149.97447 14997.44744 1.47447 298.4745 149.97447 14997.44749 1.47447 298.47447 149.97447 14997.44700 2020-01-01 2020-01-02 2020-01-01 00:08:11 2020-01-02 03:36:32 2020-01-01 00:08:11.000 2020-01-02 03:36:32.000 491 99392 49941.5 4994150 491 99392 49941.5 4994150 -32679 32459 4721.66 472166 -128 127 -1.54 -154 -492 101 10482 99393 1.47747 298.47747 149.97747 14997.74774 1.47747 298.47748 149.97747 14997.74779 1.47747 298.47747 149.97746999999998 14997.74700 2020-01-01 2020-01-02 2020-01-01 00:08:12 2020-01-02 03:36:33 2020-01-01 00:08:12.000 2020-01-02 03:36:33.000 492 99393 49942.5 4994250 492 99393 49942.5 4994250 -32678 32460 4722.66 472266 -128 123 -3.1 -310 -493 101 10483 99394 1.48048 298.48048 149.98048 14998.04804 1.48048 298.48047 149.98048 14998.04809 1.48048 298.48048 149.98048 14998.04800 2020-01-01 2020-01-02 2020-01-01 00:08:13 2020-01-02 03:36:34 2020-01-01 00:08:13.000 2020-01-02 03:36:34.000 493 99394 49943.5 4994350 493 99394 49943.5 4994350 -32677 32461 4723.66 472366 -127 124 -2.1 -210 -494 101 10484 99395 1.48348 298.48348 149.98348 14998.34834 1.48348 298.4835 149.98348 14998.34868 1.48348 298.48348 149.98348 14998.34800 2020-01-01 2020-01-02 2020-01-01 00:08:14 2020-01-02 03:36:35 2020-01-01 00:08:14.000 2020-01-02 03:36:35.000 494 99395 49944.5 4994450 494 99395 49944.5 4994450 -32676 32462 4724.66 472466 -126 125 -1.1 -110 -495 100 10485 99396 1.48648 298.48648 149.98648 14998.64864 1.48648 298.48648 149.98648 14998.64837 1.48648 298.48648 149.98648 14998.64800 2020-01-01 2020-01-02 2020-01-01 00:08:15 2020-01-02 03:36:36 2020-01-01 00:08:15.000 2020-01-02 03:36:36.000 495 99396 49945.5 4994550 495 99396 49945.5 4994550 -32675 32463 4725.66 472566 -125 126 -0.1 -10 -496 100 10486 99397 1.48948 298.48948 149.98948 14998.94894 1.48948 298.4895 149.98948 14998.94896 1.48948 298.48948 149.98948000000001 14998.94800 2020-01-01 2020-01-02 2020-01-01 00:08:16 2020-01-02 03:36:37 2020-01-01 00:08:16.000 2020-01-02 03:36:37.000 496 99397 49946.5 4994650 496 99397 49946.5 4994650 -32674 32464 4726.66 472666 -124 127 0.9 90 -497 100 10487 99398 1.49249 298.49249 149.99249 14999.24924 1.49249 298.4925 149.99249 14999.24926 1.49249 298.49249 149.99249 14999.24900 2020-01-01 2020-01-02 2020-01-01 00:08:17 2020-01-02 03:36:38 2020-01-01 00:08:17.000 2020-01-02 03:36:38.000 497 99398 49947.5 4994750 497 99398 49947.5 4994750 -32673 32465 4727.66 472766 -128 127 -0.66 -66 -498 100 10488 99399 1.49549 298.49549 149.99549 14999.54954 1.49549 298.49548 149.99549 14999.54956 1.49549 298.49549 149.99549000000002 14999.54900 2020-01-01 2020-01-02 2020-01-01 00:08:18 2020-01-02 03:36:39 2020-01-01 00:08:18.000 2020-01-02 03:36:39.000 498 99399 49948.5 4994850 498 99399 49948.5 4994850 -32672 32466 4728.66 472866 -128 123 -2.22 -222 -499 100 10489 99400 1.49849 298.49849 149.99849 14999.84984 1.49849 298.4985 149.9985 14999.85015 1.49849 298.49849 149.99849 14999.84900 2020-01-01 2020-01-02 2020-01-01 00:08:19 2020-01-02 03:36:40 2020-01-01 00:08:19.000 2020-01-02 03:36:40.000 499 99400 49949.5 4994950 499 99400 49949.5 4994950 -32671 32467 4729.66 472966 -127 124 -1.22 -122 +490 101 10480 99391 1.47147 298.47147 149.97147 14997.14714 1.47147 298.47147 149.97146 14997.14687 1.47147 298.47147 149.97147 14997.147 2020-01-01 2020-01-02 2020-01-01 00:08:10 2020-01-02 03:36:31 2020-01-01 00:08:10.000 2020-01-02 03:36:31.000 490 99391 49940.5 4994050 490 99391 49940.5 4994050 -32680 32458 4720.66 472066 -124 127 0.02 2 +491 101 10481 99392 1.47447 298.47447 149.97447 14997.44744 1.47447 298.4745 149.97447 14997.44749 1.47447 298.47447 149.97447 14997.447 2020-01-01 2020-01-02 2020-01-01 00:08:11 2020-01-02 03:36:32 2020-01-01 00:08:11.000 2020-01-02 03:36:32.000 491 99392 49941.5 4994150 491 99392 49941.5 4994150 -32679 32459 4721.66 472166 -128 127 -1.54 -154 +492 101 10482 99393 1.47747 298.47747 149.97747 14997.74774 1.47747 298.47748 149.97747 14997.74779 1.47747 298.47747 149.97746999999998 14997.747 2020-01-01 2020-01-02 2020-01-01 00:08:12 2020-01-02 03:36:33 2020-01-01 00:08:12.000 2020-01-02 03:36:33.000 492 99393 49942.5 4994250 492 99393 49942.5 4994250 -32678 32460 4722.66 472266 -128 123 -3.1 -310 +493 101 10483 99394 1.48048 298.48048 149.98048 14998.04804 1.48048 298.48047 149.98048 14998.04809 1.48048 298.48048 149.98048 14998.048 2020-01-01 2020-01-02 2020-01-01 00:08:13 2020-01-02 03:36:34 2020-01-01 00:08:13.000 2020-01-02 03:36:34.000 493 99394 49943.5 4994350 493 99394 49943.5 4994350 -32677 32461 4723.66 472366 -127 124 -2.1 -210 +494 101 10484 99395 1.48348 298.48348 149.98348 14998.34834 1.48348 298.4835 149.98348 14998.34868 1.48348 298.48348 149.98348 14998.348 2020-01-01 2020-01-02 2020-01-01 00:08:14 2020-01-02 03:36:35 2020-01-01 00:08:14.000 2020-01-02 03:36:35.000 494 99395 49944.5 4994450 494 99395 49944.5 4994450 -32676 32462 4724.66 472466 -126 125 -1.1 -110 +495 100 10485 99396 1.48648 298.48648 149.98648 14998.64864 1.48648 298.48648 149.98648 14998.64837 1.48648 298.48648 149.98648 14998.648 2020-01-01 2020-01-02 2020-01-01 00:08:15 2020-01-02 03:36:36 2020-01-01 00:08:15.000 2020-01-02 03:36:36.000 495 99396 49945.5 4994550 495 99396 49945.5 4994550 -32675 32463 4725.66 472566 -125 126 -0.1 -10 +496 100 10486 99397 1.48948 298.48948 149.98948 14998.94894 1.48948 298.4895 149.98948 14998.94896 1.48948 298.48948 149.98948000000001 14998.948 2020-01-01 2020-01-02 2020-01-01 00:08:16 2020-01-02 03:36:37 2020-01-01 00:08:16.000 2020-01-02 03:36:37.000 496 99397 49946.5 4994650 496 99397 49946.5 4994650 -32674 32464 4726.66 472666 -124 127 0.9 90 +497 100 10487 99398 1.49249 298.49249 149.99249 14999.24924 1.49249 298.4925 149.99249 14999.24926 1.49249 298.49249 149.99249 14999.249 2020-01-01 2020-01-02 2020-01-01 00:08:17 2020-01-02 03:36:38 2020-01-01 00:08:17.000 2020-01-02 03:36:38.000 497 99398 49947.5 4994750 497 99398 49947.5 4994750 -32673 32465 4727.66 472766 -128 127 -0.66 -66 +498 100 10488 99399 1.49549 298.49549 149.99549 14999.54954 1.49549 298.49548 149.99549 14999.54956 1.49549 298.49549 149.99549000000002 14999.549 2020-01-01 2020-01-02 2020-01-01 00:08:18 2020-01-02 03:36:39 2020-01-01 00:08:18.000 2020-01-02 03:36:39.000 498 99399 49948.5 4994850 498 99399 49948.5 4994850 -32672 32466 4728.66 472866 -128 123 -2.22 -222 +499 100 10489 99400 1.49849 298.49849 149.99849 14999.84984 1.49849 298.4985 149.9985 14999.85015 1.49849 298.49849 149.99849 14999.849 2020-01-01 2020-01-02 2020-01-01 00:08:19 2020-01-02 03:36:40 2020-01-01 00:08:19.000 2020-01-02 03:36:40.000 499 99400 49949.5 4994950 499 99400 49949.5 4994950 -32671 32467 4729.66 472966 -127 124 -1.22 -122 5 102 1004 9995 0.01501 300.01501 150.01501 15151.51651 0.01501 300.015 150.01501 15151.51648 0.01501 300.01501 150.01501 15151.51601 2020-01-01 2020-01-02 2020-01-01 00:00:05 2020-01-02 03:45:05 2020-01-01 00:00:05.000 2020-01-02 03:45:05.000 5 99905 49955 5045455 5 99905 49955 5045455 -32564 32371 4534.009900990099 457935 -128 123 -3.01980198019802 -305 50 102 10040 99950 0.15015 300.15015 150.15015 15165.16516 0.15015 300.15015 150.15014 15165.16487 0.15015 300.15015 150.15015 15165.16515 2020-01-01 2020-01-02 2020-01-01 00:00:50 2020-01-02 03:45:50 2020-01-01 00:00:50.000 2020-01-02 03:45:50.000 50 99950 50000 5050000 50 99950 50000 5050000 -32519 32416 4579.009900990099 462480 -127 124 -3.6435643564356437 -368 -500 100 10490 99401 1.5015 298.5015 150.0015 15000.15015 1.5015 298.5015 150.00149 15000.14984 1.50150 298.50150 150.0015 15000.15000 2020-01-01 2020-01-02 2020-01-01 00:08:20 2020-01-02 03:36:41 2020-01-01 00:08:20.000 2020-01-02 03:36:41.000 500 99401 49950.5 4995050 500 99401 49950.5 4995050 -32670 32468 4730.66 473066 -126 125 -0.22 -22 -501 100 10491 99402 1.5045 298.5045 150.0045 15000.45045 1.5045 298.50452 150.0045 15000.45043 1.50450 298.50450 150.0045 15000.45000 2020-01-01 2020-01-02 2020-01-01 00:08:21 2020-01-02 03:36:42 2020-01-01 00:08:21.000 2020-01-02 03:36:42.000 501 99402 49951.5 4995150 501 99402 49951.5 4995150 -32669 32469 4731.66 473166 -125 126 0.78 78 -502 100 10492 99403 1.5075 298.5075 150.0075 15000.75075 1.5075 298.5075 150.0075 15000.75073 1.50750 298.50750 150.0075 15000.75000 2020-01-01 2020-01-02 2020-01-01 00:08:22 2020-01-02 03:36:43 2020-01-01 00:08:22.000 2020-01-02 03:36:43.000 502 99403 49952.5 4995250 502 99403 49952.5 4995250 -32668 32470 4732.66 473266 -124 127 1.78 178 -503 100 10493 99404 1.51051 298.51051 150.01051 15001.05105 1.51051 298.5105 150.01051 15001.05103 1.51051 298.51051 150.01050999999998 15001.05100 2020-01-01 2020-01-02 2020-01-01 00:08:23 2020-01-02 03:36:44 2020-01-01 00:08:23.000 2020-01-02 03:36:44.000 503 99404 49953.5 4995350 503 99404 49953.5 4995350 -32667 32471 4733.66 473366 -128 127 0.22 22 -504 100 10494 99405 1.51351 298.51351 150.01351 15001.35135 1.51351 298.51352 150.01351 15001.35162 1.51351 298.51351 150.01351 15001.35100 2020-01-01 2020-01-02 2020-01-01 00:08:24 2020-01-02 03:36:45 2020-01-01 00:08:24.000 2020-01-02 03:36:45.000 504 99405 49954.5 4995450 504 99405 49954.5 4995450 -32666 32472 4734.66 473466 -128 127 -1.34 -134 -505 100 10495 99406 1.51651 298.51651 150.01651 15001.65165 1.51651 298.5165 150.01651 15001.65131 1.51651 298.51651 150.01651 15001.65100 2020-01-01 2020-01-02 2020-01-01 00:08:25 2020-01-02 03:36:46 2020-01-01 00:08:25.000 2020-01-02 03:36:46.000 505 99406 49955.5 4995550 505 99406 49955.5 4995550 -32665 32473 4735.66 473566 -128 124 -2.9 -290 -506 100 10496 99407 1.51951 298.51951 150.01951 15001.95195 1.51951 298.51953 150.01951 15001.9519 1.51951 298.51951 150.01951 15001.95100 2020-01-01 2020-01-02 2020-01-01 00:08:26 2020-01-02 03:36:47 2020-01-01 00:08:26.000 2020-01-02 03:36:47.000 506 99407 49956.5 4995650 506 99407 49956.5 4995650 -32664 32474 4736.66 473666 -127 125 -1.9 -190 -507 100 10497 99408 1.52252 298.52252 150.02252 15002.25225 1.52252 298.52252 150.02252 15002.2522 1.52252 298.52252 150.02252000000001 15002.25200 2020-01-01 2020-01-02 2020-01-01 00:08:27 2020-01-02 03:36:48 2020-01-01 00:08:27.000 2020-01-02 03:36:48.000 507 99408 49957.5 4995750 507 99408 49957.5 4995750 -32663 32475 4737.66 473766 -126 126 -0.9 -90 -508 100 10498 99409 1.52552 298.52552 150.02552 15002.55255 1.52552 298.5255 150.02552 15002.5525 1.52552 298.52552 150.02552 15002.55200 2020-01-01 2020-01-02 2020-01-01 00:08:28 2020-01-02 03:36:49 2020-01-01 00:08:28.000 2020-01-02 03:36:49.000 508 99409 49958.5 4995850 508 99409 49958.5 4995850 -32662 32476 4738.66 473866 -125 127 0.1 10 -509 100 10499 99410 1.52852 298.52852 150.02852 15002.85285 1.52852 298.52853 150.02853 15002.85312 1.52852 298.52852 150.02852000000001 15002.85200 2020-01-01 2020-01-02 2020-01-01 00:08:29 2020-01-02 03:36:50 2020-01-01 00:08:29.000 2020-01-02 03:36:50.000 509 99410 49959.5 4995950 509 99410 49959.5 4995950 -32661 32477 4739.66 473966 -128 127 -1.46 -146 +500 100 10490 99401 1.5015 298.5015 150.0015 15000.15015 1.5015 298.5015 150.00149 15000.14984 1.5015 298.5015 150.0015 15000.15 2020-01-01 2020-01-02 2020-01-01 00:08:20 2020-01-02 03:36:41 2020-01-01 00:08:20.000 2020-01-02 03:36:41.000 500 99401 49950.5 4995050 500 99401 49950.5 4995050 -32670 32468 4730.66 473066 -126 125 -0.22 -22 +501 100 10491 99402 1.5045 298.5045 150.0045 15000.45045 1.5045 298.50452 150.0045 15000.45043 1.5045 298.5045 150.0045 15000.45 2020-01-01 2020-01-02 2020-01-01 00:08:21 2020-01-02 03:36:42 2020-01-01 00:08:21.000 2020-01-02 03:36:42.000 501 99402 49951.5 4995150 501 99402 49951.5 4995150 -32669 32469 4731.66 473166 -125 126 0.78 78 +502 100 10492 99403 1.5075 298.5075 150.0075 15000.75075 1.5075 298.5075 150.0075 15000.75073 1.5075 298.5075 150.0075 15000.75 2020-01-01 2020-01-02 2020-01-01 00:08:22 2020-01-02 03:36:43 2020-01-01 00:08:22.000 2020-01-02 03:36:43.000 502 99403 49952.5 4995250 502 99403 49952.5 4995250 -32668 32470 4732.66 473266 -124 127 1.78 178 +503 100 10493 99404 1.51051 298.51051 150.01051 15001.05105 1.51051 298.5105 150.01051 15001.05103 1.51051 298.51051 150.01050999999998 15001.051 2020-01-01 2020-01-02 2020-01-01 00:08:23 2020-01-02 03:36:44 2020-01-01 00:08:23.000 2020-01-02 03:36:44.000 503 99404 49953.5 4995350 503 99404 49953.5 4995350 -32667 32471 4733.66 473366 -128 127 0.22 22 +504 100 10494 99405 1.51351 298.51351 150.01351 15001.35135 1.51351 298.51352 150.01351 15001.35162 1.51351 298.51351 150.01351 15001.351 2020-01-01 2020-01-02 2020-01-01 00:08:24 2020-01-02 03:36:45 2020-01-01 00:08:24.000 2020-01-02 03:36:45.000 504 99405 49954.5 4995450 504 99405 49954.5 4995450 -32666 32472 4734.66 473466 -128 127 -1.34 -134 +505 100 10495 99406 1.51651 298.51651 150.01651 15001.65165 1.51651 298.5165 150.01651 15001.65131 1.51651 298.51651 150.01651 15001.651 2020-01-01 2020-01-02 2020-01-01 00:08:25 2020-01-02 03:36:46 2020-01-01 00:08:25.000 2020-01-02 03:36:46.000 505 99406 49955.5 4995550 505 99406 49955.5 4995550 -32665 32473 4735.66 473566 -128 124 -2.9 -290 +506 100 10496 99407 1.51951 298.51951 150.01951 15001.95195 1.51951 298.51953 150.01951 15001.9519 1.51951 298.51951 150.01951 15001.951 2020-01-01 2020-01-02 2020-01-01 00:08:26 2020-01-02 03:36:47 2020-01-01 00:08:26.000 2020-01-02 03:36:47.000 506 99407 49956.5 4995650 506 99407 49956.5 4995650 -32664 32474 4736.66 473666 -127 125 -1.9 -190 +507 100 10497 99408 1.52252 298.52252 150.02252 15002.25225 1.52252 298.52252 150.02252 15002.2522 1.52252 298.52252 150.02252000000001 15002.252 2020-01-01 2020-01-02 2020-01-01 00:08:27 2020-01-02 03:36:48 2020-01-01 00:08:27.000 2020-01-02 03:36:48.000 507 99408 49957.5 4995750 507 99408 49957.5 4995750 -32663 32475 4737.66 473766 -126 126 -0.9 -90 +508 100 10498 99409 1.52552 298.52552 150.02552 15002.55255 1.52552 298.5255 150.02552 15002.5525 1.52552 298.52552 150.02552 15002.552 2020-01-01 2020-01-02 2020-01-01 00:08:28 2020-01-02 03:36:49 2020-01-01 00:08:28.000 2020-01-02 03:36:49.000 508 99409 49958.5 4995850 508 99409 49958.5 4995850 -32662 32476 4738.66 473866 -125 127 0.1 10 +509 100 10499 99410 1.52852 298.52852 150.02852 15002.85285 1.52852 298.52853 150.02853 15002.85312 1.52852 298.52852 150.02852000000001 15002.852 2020-01-01 2020-01-02 2020-01-01 00:08:29 2020-01-02 03:36:50 2020-01-01 00:08:29.000 2020-01-02 03:36:50.000 509 99410 49959.5 4995950 509 99410 49959.5 4995950 -32661 32477 4739.66 473966 -128 127 -1.46 -146 51 102 10041 99951 0.15315 300.15315 150.15315 15165.46846 0.15315 300.15317 150.15315 15165.46863 0.15315 300.15315 150.15315 15165.46815 2020-01-01 2020-01-02 2020-01-01 00:00:51 2020-01-02 03:45:51 2020-01-01 00:00:51.000 2020-01-02 03:45:51.000 51 99951 50001 5050101 51 99951 50001 5050101 -32518 32417 4580.009900990099 462581 -126 125 -2.6435643564356437 -267 -510 100 10500 99411 1.53153 298.53153 150.03153 15003.15315 1.53153 298.53152 150.03152 15003.15278 1.53153 298.53153 150.03153 15003.15300 2020-01-01 2020-01-02 2020-01-01 00:08:30 2020-01-02 03:36:51 2020-01-01 00:08:30.000 2020-01-02 03:36:51.000 510 99411 49960.5 4996050 510 99411 49960.5 4996050 -32660 32478 4740.66 474066 -128 127 -3.02 -302 -511 100 10501 99412 1.53453 298.53453 150.03453 15003.45345 1.53453 298.53455 150.03453 15003.45354 1.53453 298.53453 150.03453 15003.45300 2020-01-01 2020-01-02 2020-01-01 00:08:31 2020-01-02 03:36:52 2020-01-01 00:08:31.000 2020-01-02 03:36:52.000 511 99412 49961.5 4996150 511 99412 49961.5 4996150 -32659 32479 4741.66 474166 -128 123 -4.58 -458 -512 100 10502 99413 1.53753 298.53753 150.03753 15003.75375 1.53753 298.53754 150.03753 15003.75366 1.53753 298.53753 150.03753 15003.75300 2020-01-01 2020-01-02 2020-01-01 00:08:32 2020-01-02 03:36:53 2020-01-01 00:08:32.000 2020-01-02 03:36:53.000 512 99413 49962.5 4996250 512 99413 49962.5 4996250 -32658 32480 4742.66 474266 -127 124 -3.58 -358 -513 100 10503 99414 1.54054 298.54054 150.04054 15004.05405 1.54054 298.54053 150.04053 15004.05397 1.54054 298.54054 150.04054 15004.05400 2020-01-01 2020-01-02 2020-01-01 00:08:33 2020-01-02 03:36:54 2020-01-01 00:08:33.000 2020-01-02 03:36:54.000 513 99414 49963.5 4996350 513 99414 49963.5 4996350 -32657 32481 4743.66 474366 -126 125 -2.58 -258 -514 100 10504 99415 1.54354 298.54354 150.04354 15004.35435 1.54354 298.54355 150.04354 15004.35459 1.54354 298.54354 150.04354 15004.35400 2020-01-01 2020-01-02 2020-01-01 00:08:34 2020-01-02 03:36:55 2020-01-01 00:08:34.000 2020-01-02 03:36:55.000 514 99415 49964.5 4996450 514 99415 49964.5 4996450 -32656 32482 4744.66 474466 -125 126 -1.58 -158 -515 100 10505 99416 1.54654 298.54654 150.04654 15004.65465 1.54654 298.54654 150.04654 15004.65425 1.54654 298.54654 150.04654 15004.65400 2020-01-01 2020-01-02 2020-01-01 00:08:35 2020-01-02 03:36:56 2020-01-01 00:08:35.000 2020-01-02 03:36:56.000 515 99416 49965.5 4996550 515 99416 49965.5 4996550 -32655 32483 4745.66 474566 -124 127 -0.58 -58 -516 100 10506 99417 1.54954 298.54954 150.04954 15004.95495 1.54954 298.54956 150.04955 15004.955 1.54954 298.54954 150.04954 15004.95400 2020-01-01 2020-01-02 2020-01-01 00:08:36 2020-01-02 03:36:57 2020-01-01 00:08:36.000 2020-01-02 03:36:57.000 516 99417 49966.5 4996650 516 99417 49966.5 4996650 -32654 32484 4746.66 474666 -128 127 -2.14 -214 -517 100 10507 99418 1.55255 298.55255 150.05255 15005.25525 1.55255 298.55255 150.05255 15005.25514 1.55255 298.55255 150.05255 15005.25500 2020-01-01 2020-01-02 2020-01-01 00:08:37 2020-01-02 03:36:58 2020-01-01 00:08:37.000 2020-01-02 03:36:58.000 517 99418 49967.5 4996750 517 99418 49967.5 4996750 -32653 32485 4747.66 474766 -128 123 -3.7 -370 -518 100 10508 99419 1.55555 298.55555 150.05555 15005.55555 1.55555 298.55554 150.05555 15005.55547 1.55555 298.55555 150.05555 15005.55500 2020-01-01 2020-01-02 2020-01-01 00:08:38 2020-01-02 03:36:59 2020-01-01 00:08:38.000 2020-01-02 03:36:59.000 518 99419 49968.5 4996850 518 99419 49968.5 4996850 -32652 32486 4748.66 474866 -127 124 -2.7 -270 -519 100 10509 99420 1.55855 298.55855 150.05855 15005.85585 1.55855 298.55856 150.05856 15005.85607 1.55855 298.55855 150.05855 15005.85500 2020-01-01 2020-01-02 2020-01-01 00:08:39 2020-01-02 03:37:00 2020-01-01 00:08:39.000 2020-01-02 03:37:00.000 519 99420 49969.5 4996950 519 99420 49969.5 4996950 -32651 32487 4749.66 474966 -126 125 -1.7 -170 +510 100 10500 99411 1.53153 298.53153 150.03153 15003.15315 1.53153 298.53152 150.03152 15003.15278 1.53153 298.53153 150.03153 15003.153 2020-01-01 2020-01-02 2020-01-01 00:08:30 2020-01-02 03:36:51 2020-01-01 00:08:30.000 2020-01-02 03:36:51.000 510 99411 49960.5 4996050 510 99411 49960.5 4996050 -32660 32478 4740.66 474066 -128 127 -3.02 -302 +511 100 10501 99412 1.53453 298.53453 150.03453 15003.45345 1.53453 298.53455 150.03453 15003.45354 1.53453 298.53453 150.03453 15003.453 2020-01-01 2020-01-02 2020-01-01 00:08:31 2020-01-02 03:36:52 2020-01-01 00:08:31.000 2020-01-02 03:36:52.000 511 99412 49961.5 4996150 511 99412 49961.5 4996150 -32659 32479 4741.66 474166 -128 123 -4.58 -458 +512 100 10502 99413 1.53753 298.53753 150.03753 15003.75375 1.53753 298.53754 150.03753 15003.75366 1.53753 298.53753 150.03753 15003.753 2020-01-01 2020-01-02 2020-01-01 00:08:32 2020-01-02 03:36:53 2020-01-01 00:08:32.000 2020-01-02 03:36:53.000 512 99413 49962.5 4996250 512 99413 49962.5 4996250 -32658 32480 4742.66 474266 -127 124 -3.58 -358 +513 100 10503 99414 1.54054 298.54054 150.04054 15004.05405 1.54054 298.54053 150.04053 15004.05397 1.54054 298.54054 150.04054 15004.054 2020-01-01 2020-01-02 2020-01-01 00:08:33 2020-01-02 03:36:54 2020-01-01 00:08:33.000 2020-01-02 03:36:54.000 513 99414 49963.5 4996350 513 99414 49963.5 4996350 -32657 32481 4743.66 474366 -126 125 -2.58 -258 +514 100 10504 99415 1.54354 298.54354 150.04354 15004.35435 1.54354 298.54355 150.04354 15004.35459 1.54354 298.54354 150.04354 15004.354 2020-01-01 2020-01-02 2020-01-01 00:08:34 2020-01-02 03:36:55 2020-01-01 00:08:34.000 2020-01-02 03:36:55.000 514 99415 49964.5 4996450 514 99415 49964.5 4996450 -32656 32482 4744.66 474466 -125 126 -1.58 -158 +515 100 10505 99416 1.54654 298.54654 150.04654 15004.65465 1.54654 298.54654 150.04654 15004.65425 1.54654 298.54654 150.04654 15004.654 2020-01-01 2020-01-02 2020-01-01 00:08:35 2020-01-02 03:36:56 2020-01-01 00:08:35.000 2020-01-02 03:36:56.000 515 99416 49965.5 4996550 515 99416 49965.5 4996550 -32655 32483 4745.66 474566 -124 127 -0.58 -58 +516 100 10506 99417 1.54954 298.54954 150.04954 15004.95495 1.54954 298.54956 150.04955 15004.955 1.54954 298.54954 150.04954 15004.954 2020-01-01 2020-01-02 2020-01-01 00:08:36 2020-01-02 03:36:57 2020-01-01 00:08:36.000 2020-01-02 03:36:57.000 516 99417 49966.5 4996650 516 99417 49966.5 4996650 -32654 32484 4746.66 474666 -128 127 -2.14 -214 +517 100 10507 99418 1.55255 298.55255 150.05255 15005.25525 1.55255 298.55255 150.05255 15005.25514 1.55255 298.55255 150.05255 15005.255 2020-01-01 2020-01-02 2020-01-01 00:08:37 2020-01-02 03:36:58 2020-01-01 00:08:37.000 2020-01-02 03:36:58.000 517 99418 49967.5 4996750 517 99418 49967.5 4996750 -32653 32485 4747.66 474766 -128 123 -3.7 -370 +518 100 10508 99419 1.55555 298.55555 150.05555 15005.55555 1.55555 298.55554 150.05555 15005.55547 1.55555 298.55555 150.05555 15005.555 2020-01-01 2020-01-02 2020-01-01 00:08:38 2020-01-02 03:36:59 2020-01-01 00:08:38.000 2020-01-02 03:36:59.000 518 99419 49968.5 4996850 518 99419 49968.5 4996850 -32652 32486 4748.66 474866 -127 124 -2.7 -270 +519 100 10509 99420 1.55855 298.55855 150.05855 15005.85585 1.55855 298.55856 150.05856 15005.85607 1.55855 298.55855 150.05855 15005.855 2020-01-01 2020-01-02 2020-01-01 00:08:39 2020-01-02 03:37:00 2020-01-01 00:08:39.000 2020-01-02 03:37:00.000 519 99420 49969.5 4996950 519 99420 49969.5 4996950 -32651 32487 4749.66 474966 -126 125 -1.7 -170 52 102 10042 99952 0.15615 300.15615 150.15615 15165.77177 0.15615 300.15616 150.15615 15165.77193 0.15615 300.15615 150.15615 15165.77115 2020-01-01 2020-01-02 2020-01-01 00:00:52 2020-01-02 03:45:52 2020-01-01 00:00:52.000 2020-01-02 03:45:52.000 52 99952 50002 5050202 52 99952 50002 5050202 -32517 32418 4581.009900990099 462682 -125 126 -1.6435643564356435 -166 -520 100 10510 99421 1.56156 298.56156 150.06156 15006.15615 1.56156 298.56155 150.06155 15006.15572 1.56156 298.56156 150.06156000000001 15006.15600 2020-01-01 2020-01-02 2020-01-01 00:08:40 2020-01-02 03:37:01 2020-01-01 00:08:40.000 2020-01-02 03:37:01.000 520 99421 49970.5 4997050 520 99421 49970.5 4997050 -32650 32488 4750.66 475066 -125 126 -0.7 -70 -521 100 10511 99422 1.56456 298.56456 150.06456 15006.45645 1.56456 298.56458 150.06456 15006.45647 1.56456 298.56456 150.06456 15006.45600 2020-01-01 2020-01-02 2020-01-01 00:08:41 2020-01-02 03:37:02 2020-01-01 00:08:41.000 2020-01-02 03:37:02.000 521 99422 49971.5 4997150 521 99422 49971.5 4997150 -32649 32489 4751.66 475166 -124 127 0.3 30 -522 100 10512 99423 1.56756 298.56756 150.06756 15006.75675 1.56756 298.56757 150.06756 15006.75661 1.56756 298.56756 150.06756 15006.75600 2020-01-01 2020-01-02 2020-01-01 00:08:42 2020-01-02 03:37:03 2020-01-01 00:08:42.000 2020-01-02 03:37:03.000 522 99423 49972.5 4997250 522 99423 49972.5 4997250 -32648 32490 4752.66 475266 -128 127 -1.26 -126 -523 100 10513 99424 1.57057 298.57057 150.07057 15007.05705 1.57057 298.57056 150.07056 15007.05694 1.57057 298.57057 150.07057 15007.05700 2020-01-01 2020-01-02 2020-01-01 00:08:43 2020-01-02 03:37:04 2020-01-01 00:08:43.000 2020-01-02 03:37:04.000 523 99424 49973.5 4997350 523 99424 49973.5 4997350 -32647 32491 4753.66 475366 -128 123 -2.82 -282 -524 100 10514 99425 1.57357 298.57357 150.07357 15007.35735 1.57357 298.57358 150.07357 15007.35753 1.57357 298.57357 150.07357 15007.35700 2020-01-01 2020-01-02 2020-01-01 00:08:44 2020-01-02 03:37:05 2020-01-01 00:08:44.000 2020-01-02 03:37:05.000 524 99425 49974.5 4997450 524 99425 49974.5 4997450 -32646 32492 4754.66 475466 -127 124 -1.82 -182 -525 100 10515 99426 1.57657 298.57657 150.07657 15007.65765 1.57657 298.57657 150.07657 15007.65783 1.57657 298.57657 150.07657 15007.65700 2020-01-01 2020-01-02 2020-01-01 00:08:45 2020-01-02 03:37:06 2020-01-01 00:08:45.000 2020-01-02 03:37:06.000 525 99426 49975.5 4997550 525 99426 49975.5 4997550 -32645 32493 4755.66 475566 -126 125 -0.82 -82 -526 100 10516 99427 1.57957 298.57957 150.07957 15007.95795 1.57957 298.5796 150.07957 15007.95795 1.57957 298.57957 150.07957 15007.95700 2020-01-01 2020-01-02 2020-01-01 00:08:46 2020-01-02 03:37:07 2020-01-01 00:08:46.000 2020-01-02 03:37:07.000 526 99427 49976.5 4997650 526 99427 49976.5 4997650 -32644 32494 4756.66 475666 -125 126 0.18 18 -527 100 10517 99428 1.58258 298.58258 150.08258 15008.25825 1.58258 298.58258 150.08258 15008.25811 1.58258 298.58258 150.08258 15008.25800 2020-01-01 2020-01-02 2020-01-01 00:08:47 2020-01-02 03:37:08 2020-01-01 00:08:47.000 2020-01-02 03:37:08.000 527 99428 49977.5 4997750 527 99428 49977.5 4997750 -32643 32495 4757.66 475766 -124 127 1.18 118 -528 100 10518 99429 1.58558 298.58558 150.08558 15008.55855 1.58558 298.58557 150.08558 15008.5584 1.58558 298.58558 150.08558000000002 15008.55800 2020-01-01 2020-01-02 2020-01-01 00:08:48 2020-01-02 03:37:09 2020-01-01 00:08:48.000 2020-01-02 03:37:09.000 528 99429 49978.5 4997850 528 99429 49978.5 4997850 -32642 32496 4758.66 475866 -128 127 -0.38 -38 -529 100 10519 99430 1.58858 298.58858 150.08858 15008.85885 1.58858 298.5886 150.08859 15008.859 1.58858 298.58858 150.08858 15008.85800 2020-01-01 2020-01-02 2020-01-01 00:08:49 2020-01-02 03:37:10 2020-01-01 00:08:49.000 2020-01-02 03:37:10.000 529 99430 49979.5 4997950 529 99430 49979.5 4997950 -32641 32497 4759.66 475966 -128 127 -1.94 -194 +520 100 10510 99421 1.56156 298.56156 150.06156 15006.15615 1.56156 298.56155 150.06155 15006.15572 1.56156 298.56156 150.06156000000001 15006.156 2020-01-01 2020-01-02 2020-01-01 00:08:40 2020-01-02 03:37:01 2020-01-01 00:08:40.000 2020-01-02 03:37:01.000 520 99421 49970.5 4997050 520 99421 49970.5 4997050 -32650 32488 4750.66 475066 -125 126 -0.7 -70 +521 100 10511 99422 1.56456 298.56456 150.06456 15006.45645 1.56456 298.56458 150.06456 15006.45647 1.56456 298.56456 150.06456 15006.456 2020-01-01 2020-01-02 2020-01-01 00:08:41 2020-01-02 03:37:02 2020-01-01 00:08:41.000 2020-01-02 03:37:02.000 521 99422 49971.5 4997150 521 99422 49971.5 4997150 -32649 32489 4751.66 475166 -124 127 0.3 30 +522 100 10512 99423 1.56756 298.56756 150.06756 15006.75675 1.56756 298.56757 150.06756 15006.75661 1.56756 298.56756 150.06756 15006.756 2020-01-01 2020-01-02 2020-01-01 00:08:42 2020-01-02 03:37:03 2020-01-01 00:08:42.000 2020-01-02 03:37:03.000 522 99423 49972.5 4997250 522 99423 49972.5 4997250 -32648 32490 4752.66 475266 -128 127 -1.26 -126 +523 100 10513 99424 1.57057 298.57057 150.07057 15007.05705 1.57057 298.57056 150.07056 15007.05694 1.57057 298.57057 150.07057 15007.057 2020-01-01 2020-01-02 2020-01-01 00:08:43 2020-01-02 03:37:04 2020-01-01 00:08:43.000 2020-01-02 03:37:04.000 523 99424 49973.5 4997350 523 99424 49973.5 4997350 -32647 32491 4753.66 475366 -128 123 -2.82 -282 +524 100 10514 99425 1.57357 298.57357 150.07357 15007.35735 1.57357 298.57358 150.07357 15007.35753 1.57357 298.57357 150.07357 15007.357 2020-01-01 2020-01-02 2020-01-01 00:08:44 2020-01-02 03:37:05 2020-01-01 00:08:44.000 2020-01-02 03:37:05.000 524 99425 49974.5 4997450 524 99425 49974.5 4997450 -32646 32492 4754.66 475466 -127 124 -1.82 -182 +525 100 10515 99426 1.57657 298.57657 150.07657 15007.65765 1.57657 298.57657 150.07657 15007.65783 1.57657 298.57657 150.07657 15007.657 2020-01-01 2020-01-02 2020-01-01 00:08:45 2020-01-02 03:37:06 2020-01-01 00:08:45.000 2020-01-02 03:37:06.000 525 99426 49975.5 4997550 525 99426 49975.5 4997550 -32645 32493 4755.66 475566 -126 125 -0.82 -82 +526 100 10516 99427 1.57957 298.57957 150.07957 15007.95795 1.57957 298.5796 150.07957 15007.95795 1.57957 298.57957 150.07957 15007.957 2020-01-01 2020-01-02 2020-01-01 00:08:46 2020-01-02 03:37:07 2020-01-01 00:08:46.000 2020-01-02 03:37:07.000 526 99427 49976.5 4997650 526 99427 49976.5 4997650 -32644 32494 4756.66 475666 -125 126 0.18 18 +527 100 10517 99428 1.58258 298.58258 150.08258 15008.25825 1.58258 298.58258 150.08258 15008.25811 1.58258 298.58258 150.08258 15008.258 2020-01-01 2020-01-02 2020-01-01 00:08:47 2020-01-02 03:37:08 2020-01-01 00:08:47.000 2020-01-02 03:37:08.000 527 99428 49977.5 4997750 527 99428 49977.5 4997750 -32643 32495 4757.66 475766 -124 127 1.18 118 +528 100 10518 99429 1.58558 298.58558 150.08558 15008.55855 1.58558 298.58557 150.08558 15008.5584 1.58558 298.58558 150.08558000000002 15008.558 2020-01-01 2020-01-02 2020-01-01 00:08:48 2020-01-02 03:37:09 2020-01-01 00:08:48.000 2020-01-02 03:37:09.000 528 99429 49978.5 4997850 528 99429 49978.5 4997850 -32642 32496 4758.66 475866 -128 127 -0.38 -38 +529 100 10519 99430 1.58858 298.58858 150.08858 15008.85885 1.58858 298.5886 150.08859 15008.859 1.58858 298.58858 150.08858 15008.858 2020-01-01 2020-01-02 2020-01-01 00:08:49 2020-01-02 03:37:10 2020-01-01 00:08:49.000 2020-01-02 03:37:10.000 529 99430 49979.5 4997950 529 99430 49979.5 4997950 -32641 32497 4759.66 475966 -128 127 -1.94 -194 53 102 10043 99953 0.15915 300.15915 150.15915 15166.07507 0.15915 300.15915 150.15915 15166.07511 0.15915 300.15915 150.15915 15166.07415 2020-01-01 2020-01-02 2020-01-01 00:00:53 2020-01-02 03:45:53 2020-01-01 00:00:53.000 2020-01-02 03:45:53.000 53 99953 50003 5050303 53 99953 50003 5050303 -32516 32419 4582.009900990099 462783 -124 127 -0.6435643564356436 -65 -530 100 10520 99431 1.59159 298.59159 150.09159 15009.15915 1.59159 298.59158 150.09159 15009.15929 1.59159 298.59159 150.09159 15009.15900 2020-01-01 2020-01-02 2020-01-01 00:08:50 2020-01-02 03:37:11 2020-01-01 00:08:50.000 2020-01-02 03:37:11.000 530 99431 49980.5 4998050 530 99431 49980.5 4998050 -32640 32498 4760.66 476066 -128 124 -3.5 -350 -531 100 10521 99432 1.59459 298.59459 150.09459 15009.45945 1.59459 298.5946 150.09459 15009.45941 1.59459 298.59459 150.09459 15009.45900 2020-01-01 2020-01-02 2020-01-01 00:08:51 2020-01-02 03:37:12 2020-01-01 00:08:51.000 2020-01-02 03:37:12.000 531 99432 49981.5 4998150 531 99432 49981.5 4998150 -32639 32499 4761.66 476166 -127 125 -2.5 -250 -532 100 10522 99433 1.59759 298.59759 150.09759 15009.75975 1.59759 298.5976 150.09759 15009.75958 1.59759 298.59759 150.09759 15009.75900 2020-01-01 2020-01-02 2020-01-01 00:08:52 2020-01-02 03:37:13 2020-01-01 00:08:52.000 2020-01-02 03:37:13.000 532 99433 49982.5 4998250 532 99433 49982.5 4998250 -32638 32500 4762.66 476266 -126 126 -1.5 -150 -533 100 10523 99434 1.6006 298.6006 150.1006 15010.06006 1.6006 298.6006 150.10059 15010.05988 1.60060 298.60060 150.1006 15010.06000 2020-01-01 2020-01-02 2020-01-01 00:08:53 2020-01-02 03:37:14 2020-01-01 00:08:53.000 2020-01-02 03:37:14.000 533 99434 49983.5 4998350 533 99434 49983.5 4998350 -32637 32501 4763.66 476366 -125 127 -0.5 -50 -534 100 10524 99435 1.6036 298.6036 150.1036 15010.36036 1.6036 298.6036 150.1036 15010.36063 1.60360 298.60360 150.1036 15010.36000 2020-01-01 2020-01-02 2020-01-01 00:08:54 2020-01-02 03:37:15 2020-01-01 00:08:54.000 2020-01-02 03:37:15.000 534 99435 49984.5 4998450 534 99435 49984.5 4998450 -32636 32502 4764.66 476466 -128 127 -2.06 -206 -535 100 10525 99436 1.6066 298.6066 150.1066 15010.66066 1.6066 298.6066 150.1066 15010.66077 1.60660 298.60660 150.1066 15010.66000 2020-01-01 2020-01-02 2020-01-01 00:08:55 2020-01-02 03:37:16 2020-01-01 00:08:55.000 2020-01-02 03:37:16.000 535 99436 49985.5 4998550 535 99436 49985.5 4998550 -32635 32503 4765.66 476566 -128 127 -3.62 -362 -536 100 10526 99437 1.6096 298.6096 150.1096 15010.96096 1.6096 298.60962 150.1096 15010.96092 1.60960 298.60960 150.1096 15010.96000 2020-01-01 2020-01-02 2020-01-01 00:08:56 2020-01-02 03:37:17 2020-01-01 00:08:56.000 2020-01-02 03:37:17.000 536 99437 49986.5 4998650 536 99437 49986.5 4998650 -32634 32504 4766.66 476666 -128 123 -5.18 -518 -537 100 10527 99438 1.61261 298.61261 150.11261 15011.26126 1.61261 298.6126 150.11261 15011.26105 1.61261 298.61261 150.11261000000002 15011.26100 2020-01-01 2020-01-02 2020-01-01 00:08:57 2020-01-02 03:37:18 2020-01-01 00:08:57.000 2020-01-02 03:37:18.000 537 99438 49987.5 4998750 537 99438 49987.5 4998750 -32633 32505 4767.66 476766 -127 124 -4.18 -418 -538 100 10528 99439 1.61561 298.61561 150.11561 15011.56156 1.61561 298.6156 150.11561 15011.56135 1.61561 298.61561 150.11561 15011.56100 2020-01-01 2020-01-02 2020-01-01 00:08:58 2020-01-02 03:37:19 2020-01-01 00:08:58.000 2020-01-02 03:37:19.000 538 99439 49988.5 4998850 538 99439 49988.5 4998850 -32632 32506 4768.66 476866 -126 125 -3.18 -318 -539 100 10529 99440 1.61861 298.61861 150.11861 15011.86186 1.61861 298.61862 150.11862 15011.8621 1.61861 298.61861 150.11861000000002 15011.86100 2020-01-01 2020-01-02 2020-01-01 00:08:59 2020-01-02 03:37:20 2020-01-01 00:08:59.000 2020-01-02 03:37:20.000 539 99440 49989.5 4998950 539 99440 49989.5 4998950 -32631 32507 4769.66 476966 -125 126 -2.18 -218 +530 100 10520 99431 1.59159 298.59159 150.09159 15009.15915 1.59159 298.59158 150.09159 15009.15929 1.59159 298.59159 150.09159 15009.159 2020-01-01 2020-01-02 2020-01-01 00:08:50 2020-01-02 03:37:11 2020-01-01 00:08:50.000 2020-01-02 03:37:11.000 530 99431 49980.5 4998050 530 99431 49980.5 4998050 -32640 32498 4760.66 476066 -128 124 -3.5 -350 +531 100 10521 99432 1.59459 298.59459 150.09459 15009.45945 1.59459 298.5946 150.09459 15009.45941 1.59459 298.59459 150.09459 15009.459 2020-01-01 2020-01-02 2020-01-01 00:08:51 2020-01-02 03:37:12 2020-01-01 00:08:51.000 2020-01-02 03:37:12.000 531 99432 49981.5 4998150 531 99432 49981.5 4998150 -32639 32499 4761.66 476166 -127 125 -2.5 -250 +532 100 10522 99433 1.59759 298.59759 150.09759 15009.75975 1.59759 298.5976 150.09759 15009.75958 1.59759 298.59759 150.09759 15009.759 2020-01-01 2020-01-02 2020-01-01 00:08:52 2020-01-02 03:37:13 2020-01-01 00:08:52.000 2020-01-02 03:37:13.000 532 99433 49982.5 4998250 532 99433 49982.5 4998250 -32638 32500 4762.66 476266 -126 126 -1.5 -150 +533 100 10523 99434 1.6006 298.6006 150.1006 15010.06006 1.6006 298.6006 150.10059 15010.05988 1.6006 298.6006 150.1006 15010.06 2020-01-01 2020-01-02 2020-01-01 00:08:53 2020-01-02 03:37:14 2020-01-01 00:08:53.000 2020-01-02 03:37:14.000 533 99434 49983.5 4998350 533 99434 49983.5 4998350 -32637 32501 4763.66 476366 -125 127 -0.5 -50 +534 100 10524 99435 1.6036 298.6036 150.1036 15010.36036 1.6036 298.6036 150.1036 15010.36063 1.6036 298.6036 150.1036 15010.36 2020-01-01 2020-01-02 2020-01-01 00:08:54 2020-01-02 03:37:15 2020-01-01 00:08:54.000 2020-01-02 03:37:15.000 534 99435 49984.5 4998450 534 99435 49984.5 4998450 -32636 32502 4764.66 476466 -128 127 -2.06 -206 +535 100 10525 99436 1.6066 298.6066 150.1066 15010.66066 1.6066 298.6066 150.1066 15010.66077 1.6066 298.6066 150.1066 15010.66 2020-01-01 2020-01-02 2020-01-01 00:08:55 2020-01-02 03:37:16 2020-01-01 00:08:55.000 2020-01-02 03:37:16.000 535 99436 49985.5 4998550 535 99436 49985.5 4998550 -32635 32503 4765.66 476566 -128 127 -3.62 -362 +536 100 10526 99437 1.6096 298.6096 150.1096 15010.96096 1.6096 298.60962 150.1096 15010.96092 1.6096 298.6096 150.1096 15010.96 2020-01-01 2020-01-02 2020-01-01 00:08:56 2020-01-02 03:37:17 2020-01-01 00:08:56.000 2020-01-02 03:37:17.000 536 99437 49986.5 4998650 536 99437 49986.5 4998650 -32634 32504 4766.66 476666 -128 123 -5.18 -518 +537 100 10527 99438 1.61261 298.61261 150.11261 15011.26126 1.61261 298.6126 150.11261 15011.26105 1.61261 298.61261 150.11261000000002 15011.261 2020-01-01 2020-01-02 2020-01-01 00:08:57 2020-01-02 03:37:18 2020-01-01 00:08:57.000 2020-01-02 03:37:18.000 537 99438 49987.5 4998750 537 99438 49987.5 4998750 -32633 32505 4767.66 476766 -127 124 -4.18 -418 +538 100 10528 99439 1.61561 298.61561 150.11561 15011.56156 1.61561 298.6156 150.11561 15011.56135 1.61561 298.61561 150.11561 15011.561 2020-01-01 2020-01-02 2020-01-01 00:08:58 2020-01-02 03:37:19 2020-01-01 00:08:58.000 2020-01-02 03:37:19.000 538 99439 49988.5 4998850 538 99439 49988.5 4998850 -32632 32506 4768.66 476866 -126 125 -3.18 -318 +539 100 10529 99440 1.61861 298.61861 150.11861 15011.86186 1.61861 298.61862 150.11862 15011.8621 1.61861 298.61861 150.11861000000002 15011.861 2020-01-01 2020-01-02 2020-01-01 00:08:59 2020-01-02 03:37:20 2020-01-01 00:08:59.000 2020-01-02 03:37:20.000 539 99440 49989.5 4998950 539 99440 49989.5 4998950 -32631 32507 4769.66 476966 -125 126 -2.18 -218 54 102 10044 99954 0.16216 300.16216 150.16216 15166.37837 0.16216 300.16217 150.16216 15166.37822 0.16216 300.16216 150.16216 15166.37816 2020-01-01 2020-01-02 2020-01-01 00:00:54 2020-01-02 03:45:54 2020-01-01 00:00:54.000 2020-01-02 03:45:54.000 54 99954 50004 5050404 54 99954 50004 5050404 -32515 32420 4583.009900990099 462884 -128 127 -2.1782178217821784 -220 -540 100 10530 99441 1.62162 298.62162 150.12162 15012.16216 1.62162 298.6216 150.12162 15012.16224 1.62162 298.62162 150.12162 15012.16200 2020-01-01 2020-01-02 2020-01-01 00:09:00 2020-01-02 03:37:21 2020-01-01 00:09:00.000 2020-01-02 03:37:21.000 540 99441 49990.5 4999050 540 99441 49990.5 4999050 -32630 32508 4770.66 477066 -124 127 -1.18 -118 -541 100 10531 99442 1.62462 298.62462 150.12462 15012.46246 1.62462 298.62463 150.12462 15012.46239 1.62462 298.62462 150.12462 15012.46200 2020-01-01 2020-01-02 2020-01-01 00:09:01 2020-01-02 03:37:22 2020-01-01 00:09:01.000 2020-01-02 03:37:22.000 541 99442 49991.5 4999150 541 99442 49991.5 4999150 -32629 32509 4771.66 477166 -128 127 -2.74 -274 -542 100 10532 99443 1.62762 298.62762 150.12762 15012.76276 1.62762 298.62762 150.12762 15012.76252 1.62762 298.62762 150.12762 15012.76200 2020-01-01 2020-01-02 2020-01-01 00:09:02 2020-01-02 03:37:23 2020-01-01 00:09:02.000 2020-01-02 03:37:23.000 542 99443 49992.5 4999250 542 99443 49992.5 4999250 -32628 32510 4772.66 477266 -128 123 -4.3 -430 -543 100 10533 99444 1.63063 298.63063 150.13063 15013.06306 1.63063 298.63065 150.13063 15013.06327 1.63063 298.63063 150.13063 15013.06300 2020-01-01 2020-01-02 2020-01-01 00:09:03 2020-01-02 03:37:24 2020-01-01 00:09:03.000 2020-01-02 03:37:24.000 543 99444 49993.5 4999350 543 99444 49993.5 4999350 -32627 32511 4773.66 477366 -127 124 -3.3 -330 -544 100 10534 99445 1.63363 298.63363 150.13363 15013.36336 1.63363 298.63364 150.13363 15013.36358 1.63363 298.63363 150.13362999999998 15013.36300 2020-01-01 2020-01-02 2020-01-01 00:09:04 2020-01-02 03:37:25 2020-01-01 00:09:04.000 2020-01-02 03:37:25.000 544 99445 49994.5 4999450 544 99445 49994.5 4999450 -32626 32512 4774.66 477466 -126 125 -2.3 -230 -545 100 10535 99446 1.63663 298.63663 150.13663 15013.66366 1.63663 298.63663 150.13663 15013.6637 1.63663 298.63663 150.13663 15013.66300 2020-01-01 2020-01-02 2020-01-01 00:09:05 2020-01-02 03:37:26 2020-01-01 00:09:05.000 2020-01-02 03:37:26.000 545 99446 49995.5 4999550 545 99446 49995.5 4999550 -32625 32513 4775.66 477566 -125 126 -1.3 -130 -546 100 10536 99447 1.63963 298.63963 150.13963 15013.96396 1.63963 298.63965 150.13963 15013.96385 1.63963 298.63963 150.13963 15013.96300 2020-01-01 2020-01-02 2020-01-01 00:09:06 2020-01-02 03:37:27 2020-01-01 00:09:06.000 2020-01-02 03:37:27.000 546 99447 49996.5 4999650 546 99447 49996.5 4999650 -32624 32514 4776.66 477666 -124 127 -0.3 -30 -547 100 10537 99448 1.64264 298.64264 150.14264 15014.26426 1.64264 298.64264 150.14263 15014.26399 1.64264 298.64264 150.14264 15014.26400 2020-01-01 2020-01-02 2020-01-01 00:09:07 2020-01-02 03:37:28 2020-01-01 00:09:07.000 2020-01-02 03:37:28.000 547 99448 49997.5 4999750 547 99448 49997.5 4999750 -32623 32515 4777.66 477766 -128 127 -1.86 -186 -548 100 10538 99449 1.64564 298.64564 150.14564 15014.56456 1.64564 298.64566 150.14564 15014.56474 1.64564 298.64564 150.14564000000001 15014.56400 2020-01-01 2020-01-02 2020-01-01 00:09:08 2020-01-02 03:37:29 2020-01-01 00:09:08.000 2020-01-02 03:37:29.000 548 99449 49998.5 4999850 548 99449 49998.5 4999850 -32622 32516 4778.66 477866 -128 123 -3.42 -342 -549 100 10539 99450 1.64864 298.64864 150.14864 15014.86486 1.64864 298.64865 150.14865 15014.86504 1.64864 298.64864 150.14864 15014.86400 2020-01-01 2020-01-02 2020-01-01 00:09:09 2020-01-02 03:37:30 2020-01-01 00:09:09.000 2020-01-02 03:37:30.000 549 99450 49999.5 4999950 549 99450 49999.5 4999950 -32621 32517 4779.66 477966 -127 124 -2.42 -242 +540 100 10530 99441 1.62162 298.62162 150.12162 15012.16216 1.62162 298.6216 150.12162 15012.16224 1.62162 298.62162 150.12162 15012.162 2020-01-01 2020-01-02 2020-01-01 00:09:00 2020-01-02 03:37:21 2020-01-01 00:09:00.000 2020-01-02 03:37:21.000 540 99441 49990.5 4999050 540 99441 49990.5 4999050 -32630 32508 4770.66 477066 -124 127 -1.18 -118 +541 100 10531 99442 1.62462 298.62462 150.12462 15012.46246 1.62462 298.62463 150.12462 15012.46239 1.62462 298.62462 150.12462 15012.462 2020-01-01 2020-01-02 2020-01-01 00:09:01 2020-01-02 03:37:22 2020-01-01 00:09:01.000 2020-01-02 03:37:22.000 541 99442 49991.5 4999150 541 99442 49991.5 4999150 -32629 32509 4771.66 477166 -128 127 -2.74 -274 +542 100 10532 99443 1.62762 298.62762 150.12762 15012.76276 1.62762 298.62762 150.12762 15012.76252 1.62762 298.62762 150.12762 15012.762 2020-01-01 2020-01-02 2020-01-01 00:09:02 2020-01-02 03:37:23 2020-01-01 00:09:02.000 2020-01-02 03:37:23.000 542 99443 49992.5 4999250 542 99443 49992.5 4999250 -32628 32510 4772.66 477266 -128 123 -4.3 -430 +543 100 10533 99444 1.63063 298.63063 150.13063 15013.06306 1.63063 298.63065 150.13063 15013.06327 1.63063 298.63063 150.13063 15013.063 2020-01-01 2020-01-02 2020-01-01 00:09:03 2020-01-02 03:37:24 2020-01-01 00:09:03.000 2020-01-02 03:37:24.000 543 99444 49993.5 4999350 543 99444 49993.5 4999350 -32627 32511 4773.66 477366 -127 124 -3.3 -330 +544 100 10534 99445 1.63363 298.63363 150.13363 15013.36336 1.63363 298.63364 150.13363 15013.36358 1.63363 298.63363 150.13362999999998 15013.363 2020-01-01 2020-01-02 2020-01-01 00:09:04 2020-01-02 03:37:25 2020-01-01 00:09:04.000 2020-01-02 03:37:25.000 544 99445 49994.5 4999450 544 99445 49994.5 4999450 -32626 32512 4774.66 477466 -126 125 -2.3 -230 +545 100 10535 99446 1.63663 298.63663 150.13663 15013.66366 1.63663 298.63663 150.13663 15013.6637 1.63663 298.63663 150.13663 15013.663 2020-01-01 2020-01-02 2020-01-01 00:09:05 2020-01-02 03:37:26 2020-01-01 00:09:05.000 2020-01-02 03:37:26.000 545 99446 49995.5 4999550 545 99446 49995.5 4999550 -32625 32513 4775.66 477566 -125 126 -1.3 -130 +546 100 10536 99447 1.63963 298.63963 150.13963 15013.96396 1.63963 298.63965 150.13963 15013.96385 1.63963 298.63963 150.13963 15013.963 2020-01-01 2020-01-02 2020-01-01 00:09:06 2020-01-02 03:37:27 2020-01-01 00:09:06.000 2020-01-02 03:37:27.000 546 99447 49996.5 4999650 546 99447 49996.5 4999650 -32624 32514 4776.66 477666 -124 127 -0.3 -30 +547 100 10537 99448 1.64264 298.64264 150.14264 15014.26426 1.64264 298.64264 150.14263 15014.26399 1.64264 298.64264 150.14264 15014.264 2020-01-01 2020-01-02 2020-01-01 00:09:07 2020-01-02 03:37:28 2020-01-01 00:09:07.000 2020-01-02 03:37:28.000 547 99448 49997.5 4999750 547 99448 49997.5 4999750 -32623 32515 4777.66 477766 -128 127 -1.86 -186 +548 100 10538 99449 1.64564 298.64564 150.14564 15014.56456 1.64564 298.64566 150.14564 15014.56474 1.64564 298.64564 150.14564000000001 15014.564 2020-01-01 2020-01-02 2020-01-01 00:09:08 2020-01-02 03:37:29 2020-01-01 00:09:08.000 2020-01-02 03:37:29.000 548 99449 49998.5 4999850 548 99449 49998.5 4999850 -32622 32516 4778.66 477866 -128 123 -3.42 -342 +549 100 10539 99450 1.64864 298.64864 150.14864 15014.86486 1.64864 298.64865 150.14865 15014.86504 1.64864 298.64864 150.14864 15014.864 2020-01-01 2020-01-02 2020-01-01 00:09:09 2020-01-02 03:37:30 2020-01-01 00:09:09.000 2020-01-02 03:37:30.000 549 99450 49999.5 4999950 549 99450 49999.5 4999950 -32621 32517 4779.66 477966 -127 124 -2.42 -242 55 102 10045 99955 0.16516 300.16516 150.16516 15166.68168 0.16516 300.16516 150.16516 15166.68151 0.16516 300.16516 150.16516000000001 15166.68116 2020-01-01 2020-01-02 2020-01-01 00:00:55 2020-01-02 03:45:55 2020-01-01 00:00:55.000 2020-01-02 03:45:55.000 55 99955 50005 5050505 55 99955 50005 5050505 -32514 32421 4584.009900990099 462985 -128 123 -3.712871287128713 -375 -550 100 10540 99451 1.65165 298.65165 150.15165 15015.16516 1.65165 298.65164 150.15165 15015.16521 1.65165 298.65165 150.15165000000002 15015.16500 2020-01-01 2020-01-02 2020-01-01 00:09:10 2020-01-02 03:37:31 2020-01-01 00:09:10.000 2020-01-02 03:37:31.000 550 99451 50000.5 5000050 550 99451 50000.5 5000050 -32620 32518 4780.66 478066 -126 125 -1.42 -142 -551 100 10541 99452 1.65465 298.65465 150.15465 15015.46546 1.65465 298.65466 150.15465 15015.46533 1.65465 298.65465 150.15465 15015.46500 2020-01-01 2020-01-02 2020-01-01 00:09:11 2020-01-02 03:37:32 2020-01-01 00:09:11.000 2020-01-02 03:37:32.000 551 99452 50001.5 5000150 551 99452 50001.5 5000150 -32619 32519 4781.66 478166 -125 126 -0.42 -42 -552 100 10542 99453 1.65765 298.65765 150.15765 15015.76576 1.65765 298.65765 150.15765 15015.76562 1.65765 298.65765 150.15765 15015.76500 2020-01-01 2020-01-02 2020-01-01 00:09:12 2020-01-02 03:37:33 2020-01-01 00:09:12.000 2020-01-02 03:37:33.000 552 99453 50002.5 5000250 552 99453 50002.5 5000250 -32618 32520 4782.66 478266 -124 127 0.58 58 -553 100 10543 99454 1.66066 298.66066 150.16066 15016.06606 1.66066 298.66068 150.16066 15016.06621 1.66066 298.66066 150.16066 15016.06600 2020-01-01 2020-01-02 2020-01-01 00:09:13 2020-01-02 03:37:34 2020-01-01 00:09:13.000 2020-01-02 03:37:34.000 553 99454 50003.5 5000350 553 99454 50003.5 5000350 -32617 32521 4783.66 478366 -128 127 -0.98 -98 -554 100 10544 99455 1.66366 298.66366 150.16366 15016.36636 1.66366 298.66367 150.16366 15016.36651 1.66366 298.66366 150.16366 15016.36600 2020-01-01 2020-01-02 2020-01-01 00:09:14 2020-01-02 03:37:35 2020-01-01 00:09:14.000 2020-01-02 03:37:35.000 554 99455 50004.5 5000450 554 99455 50004.5 5000450 -32616 32522 4784.66 478466 -128 127 -2.54 -254 -555 100 10545 99456 1.66666 298.66666 150.16666 15016.66666 1.66666 298.66666 150.16666 15016.66668 1.66666 298.66666 150.16665999999998 15016.66600 2020-01-01 2020-01-02 2020-01-01 00:09:15 2020-01-02 03:37:36 2020-01-01 00:09:15.000 2020-01-02 03:37:36.000 555 99456 50005.5 5000550 555 99456 50005.5 5000550 -32615 32523 4785.66 478566 -128 124 -4.1 -410 -556 100 10546 99457 1.66966 298.66966 150.16966 15016.96696 1.66966 298.66968 150.16966 15016.9668 1.66966 298.66966 150.16966 15016.96600 2020-01-01 2020-01-02 2020-01-01 00:09:16 2020-01-02 03:37:37 2020-01-01 00:09:16.000 2020-01-02 03:37:37.000 556 99457 50006.5 5000650 556 99457 50006.5 5000650 -32614 32524 4786.66 478666 -127 125 -3.1 -310 -557 100 10547 99458 1.67267 298.67267 150.17267 15017.26726 1.67267 298.67267 150.17267 15017.26709 1.67267 298.67267 150.17267 15017.26700 2020-01-01 2020-01-02 2020-01-01 00:09:17 2020-01-02 03:37:38 2020-01-01 00:09:17.000 2020-01-02 03:37:38.000 557 99458 50007.5 5000750 557 99458 50007.5 5000750 -32613 32525 4787.66 478766 -126 126 -2.1 -210 -558 100 10548 99459 1.67567 298.67567 150.17567 15017.56756 1.67567 298.6757 150.17567 15017.56769 1.67567 298.67567 150.17567 15017.56700 2020-01-01 2020-01-02 2020-01-01 00:09:18 2020-01-02 03:37:39 2020-01-01 00:09:18.000 2020-01-02 03:37:39.000 558 99459 50008.5 5000850 558 99459 50008.5 5000850 -32612 32526 4788.66 478866 -125 127 -1.1 -110 -559 100 10549 99460 1.67867 298.67867 150.17867 15017.86786 1.67867 298.67868 150.17868 15017.86802 1.67867 298.67867 150.17867 15017.86700 2020-01-01 2020-01-02 2020-01-01 00:09:19 2020-01-02 03:37:40 2020-01-01 00:09:19.000 2020-01-02 03:37:40.000 559 99460 50009.5 5000950 559 99460 50009.5 5000950 -32611 32527 4789.66 478966 -128 127 -2.66 -266 +550 100 10540 99451 1.65165 298.65165 150.15165 15015.16516 1.65165 298.65164 150.15165 15015.16521 1.65165 298.65165 150.15165000000002 15015.165 2020-01-01 2020-01-02 2020-01-01 00:09:10 2020-01-02 03:37:31 2020-01-01 00:09:10.000 2020-01-02 03:37:31.000 550 99451 50000.5 5000050 550 99451 50000.5 5000050 -32620 32518 4780.66 478066 -126 125 -1.42 -142 +551 100 10541 99452 1.65465 298.65465 150.15465 15015.46546 1.65465 298.65466 150.15465 15015.46533 1.65465 298.65465 150.15465 15015.465 2020-01-01 2020-01-02 2020-01-01 00:09:11 2020-01-02 03:37:32 2020-01-01 00:09:11.000 2020-01-02 03:37:32.000 551 99452 50001.5 5000150 551 99452 50001.5 5000150 -32619 32519 4781.66 478166 -125 126 -0.42 -42 +552 100 10542 99453 1.65765 298.65765 150.15765 15015.76576 1.65765 298.65765 150.15765 15015.76562 1.65765 298.65765 150.15765 15015.765 2020-01-01 2020-01-02 2020-01-01 00:09:12 2020-01-02 03:37:33 2020-01-01 00:09:12.000 2020-01-02 03:37:33.000 552 99453 50002.5 5000250 552 99453 50002.5 5000250 -32618 32520 4782.66 478266 -124 127 0.58 58 +553 100 10543 99454 1.66066 298.66066 150.16066 15016.06606 1.66066 298.66068 150.16066 15016.06621 1.66066 298.66066 150.16066 15016.066 2020-01-01 2020-01-02 2020-01-01 00:09:13 2020-01-02 03:37:34 2020-01-01 00:09:13.000 2020-01-02 03:37:34.000 553 99454 50003.5 5000350 553 99454 50003.5 5000350 -32617 32521 4783.66 478366 -128 127 -0.98 -98 +554 100 10544 99455 1.66366 298.66366 150.16366 15016.36636 1.66366 298.66367 150.16366 15016.36651 1.66366 298.66366 150.16366 15016.366 2020-01-01 2020-01-02 2020-01-01 00:09:14 2020-01-02 03:37:35 2020-01-01 00:09:14.000 2020-01-02 03:37:35.000 554 99455 50004.5 5000450 554 99455 50004.5 5000450 -32616 32522 4784.66 478466 -128 127 -2.54 -254 +555 100 10545 99456 1.66666 298.66666 150.16666 15016.66666 1.66666 298.66666 150.16666 15016.66668 1.66666 298.66666 150.16665999999998 15016.666 2020-01-01 2020-01-02 2020-01-01 00:09:15 2020-01-02 03:37:36 2020-01-01 00:09:15.000 2020-01-02 03:37:36.000 555 99456 50005.5 5000550 555 99456 50005.5 5000550 -32615 32523 4785.66 478566 -128 124 -4.1 -410 +556 100 10546 99457 1.66966 298.66966 150.16966 15016.96696 1.66966 298.66968 150.16966 15016.9668 1.66966 298.66966 150.16966 15016.966 2020-01-01 2020-01-02 2020-01-01 00:09:16 2020-01-02 03:37:37 2020-01-01 00:09:16.000 2020-01-02 03:37:37.000 556 99457 50006.5 5000650 556 99457 50006.5 5000650 -32614 32524 4786.66 478666 -127 125 -3.1 -310 +557 100 10547 99458 1.67267 298.67267 150.17267 15017.26726 1.67267 298.67267 150.17267 15017.26709 1.67267 298.67267 150.17267 15017.267 2020-01-01 2020-01-02 2020-01-01 00:09:17 2020-01-02 03:37:38 2020-01-01 00:09:17.000 2020-01-02 03:37:38.000 557 99458 50007.5 5000750 557 99458 50007.5 5000750 -32613 32525 4787.66 478766 -126 126 -2.1 -210 +558 100 10548 99459 1.67567 298.67567 150.17567 15017.56756 1.67567 298.6757 150.17567 15017.56769 1.67567 298.67567 150.17567 15017.567 2020-01-01 2020-01-02 2020-01-01 00:09:18 2020-01-02 03:37:39 2020-01-01 00:09:18.000 2020-01-02 03:37:39.000 558 99459 50008.5 5000850 558 99459 50008.5 5000850 -32612 32526 4788.66 478866 -125 127 -1.1 -110 +559 100 10549 99460 1.67867 298.67867 150.17867 15017.86786 1.67867 298.67868 150.17868 15017.86802 1.67867 298.67867 150.17867 15017.867 2020-01-01 2020-01-02 2020-01-01 00:09:19 2020-01-02 03:37:40 2020-01-01 00:09:19.000 2020-01-02 03:37:40.000 559 99460 50009.5 5000950 559 99460 50009.5 5000950 -32611 32527 4789.66 478966 -128 127 -2.66 -266 56 102 10046 99956 0.16816 300.16816 150.16816 15166.98498 0.16816 300.16818 150.16816 15166.98512 0.16816 300.16816 150.16816 15166.98416 2020-01-01 2020-01-02 2020-01-01 00:00:56 2020-01-02 03:45:56 2020-01-01 00:00:56.000 2020-01-02 03:45:56.000 56 99956 50006 5050606 56 99956 50006 5050606 -32513 32422 4585.009900990099 463086 -127 124 -2.712871287128713 -274 -560 100 10550 99461 1.68168 298.68168 150.18168 15018.16816 1.68168 298.68167 150.18168 15018.16815 1.68168 298.68168 150.18168 15018.16800 2020-01-01 2020-01-02 2020-01-01 00:09:20 2020-01-02 03:37:41 2020-01-01 00:09:20.000 2020-01-02 03:37:41.000 560 99461 50010.5 5001050 560 99461 50010.5 5001050 -32610 32528 4790.66 479066 -128 127 -4.22 -422 -561 100 10551 99462 1.68468 298.68468 150.18468 15018.46846 1.68468 298.6847 150.18468 15018.46826 1.68468 298.68468 150.18468000000001 15018.46800 2020-01-01 2020-01-02 2020-01-01 00:09:21 2020-01-02 03:37:42 2020-01-01 00:09:21.000 2020-01-02 03:37:42.000 561 99462 50011.5 5001150 561 99462 50011.5 5001150 -32609 32529 4791.66 479166 -128 123 -5.78 -578 -562 100 10552 99463 1.68768 298.68768 150.18768 15018.76876 1.68768 298.68768 150.18768 15018.76856 1.68768 298.68768 150.18768 15018.76800 2020-01-01 2020-01-02 2020-01-01 00:09:22 2020-01-02 03:37:43 2020-01-01 00:09:22.000 2020-01-02 03:37:43.000 562 99463 50012.5 5001250 562 99463 50012.5 5001250 -32608 32530 4792.66 479266 -127 124 -4.78 -478 -563 100 10553 99464 1.69069 298.69069 150.19069 15019.06906 1.69069 298.6907 150.19069 15019.06915 1.69069 298.69069 150.19069 15019.06900 2020-01-01 2020-01-02 2020-01-01 00:09:23 2020-01-02 03:37:44 2020-01-01 00:09:23.000 2020-01-02 03:37:44.000 563 99464 50013.5 5001350 563 99464 50013.5 5001350 -32607 32531 4793.66 479366 -126 125 -3.78 -378 -564 100 10554 99465 1.69369 298.69369 150.19369 15019.36936 1.69369 298.6937 150.19369 15019.36948 1.69369 298.69369 150.19369 15019.36900 2020-01-01 2020-01-02 2020-01-01 00:09:24 2020-01-02 03:37:45 2020-01-01 00:09:24.000 2020-01-02 03:37:45.000 564 99465 50014.5 5001450 564 99465 50014.5 5001450 -32606 32532 4794.66 479466 -125 126 -2.78 -278 -565 100 10555 99466 1.69669 298.69669 150.19669 15019.66966 1.69669 298.6967 150.19669 15019.66962 1.69669 298.69669 150.19669 15019.66900 2020-01-01 2020-01-02 2020-01-01 00:09:25 2020-01-02 03:37:46 2020-01-01 00:09:25.000 2020-01-02 03:37:46.000 565 99466 50015.5 5001550 565 99466 50015.5 5001550 -32605 32533 4795.66 479566 -124 127 -1.78 -178 -566 100 10556 99467 1.69969 298.69969 150.19969 15019.96996 1.69969 298.6997 150.1997 15019.97037 1.69969 298.69969 150.19969 15019.96900 2020-01-01 2020-01-02 2020-01-01 00:09:26 2020-01-02 03:37:47 2020-01-01 00:09:26.000 2020-01-02 03:37:47.000 566 99467 50016.5 5001650 566 99467 50016.5 5001650 -32604 32534 4796.66 479666 -128 127 -3.34 -334 -567 100 10557 99468 1.7027 298.7027 150.2027 15020.27027 1.7027 298.7027 150.2027 15020.27003 1.70270 298.70270 150.2027 15020.27000 2020-01-01 2020-01-02 2020-01-01 00:09:27 2020-01-02 03:37:48 2020-01-01 00:09:27.000 2020-01-02 03:37:48.000 567 99468 50017.5 5001750 567 99468 50017.5 5001750 -32603 32535 4797.66 479766 -128 123 -4.9 -490 -568 100 10558 99469 1.7057 298.7057 150.2057 15020.57057 1.7057 298.70572 150.2057 15020.57066 1.70570 298.70570 150.2057 15020.57000 2020-01-01 2020-01-02 2020-01-01 00:09:28 2020-01-02 03:37:49 2020-01-01 00:09:28.000 2020-01-02 03:37:49.000 568 99469 50018.5 5001850 568 99469 50018.5 5001850 -32602 32536 4798.66 479866 -127 124 -3.9 -390 -569 100 10559 99470 1.7087 298.7087 150.2087 15020.87087 1.7087 298.7087 150.2087 15020.87095 1.70870 298.70870 150.20870000000002 15020.87000 2020-01-01 2020-01-02 2020-01-01 00:09:29 2020-01-02 03:37:50 2020-01-01 00:09:29.000 2020-01-02 03:37:50.000 569 99470 50019.5 5001950 569 99470 50019.5 5001950 -32601 32537 4799.66 479966 -126 125 -2.9 -290 +560 100 10550 99461 1.68168 298.68168 150.18168 15018.16816 1.68168 298.68167 150.18168 15018.16815 1.68168 298.68168 150.18168 15018.168 2020-01-01 2020-01-02 2020-01-01 00:09:20 2020-01-02 03:37:41 2020-01-01 00:09:20.000 2020-01-02 03:37:41.000 560 99461 50010.5 5001050 560 99461 50010.5 5001050 -32610 32528 4790.66 479066 -128 127 -4.22 -422 +561 100 10551 99462 1.68468 298.68468 150.18468 15018.46846 1.68468 298.6847 150.18468 15018.46826 1.68468 298.68468 150.18468000000001 15018.468 2020-01-01 2020-01-02 2020-01-01 00:09:21 2020-01-02 03:37:42 2020-01-01 00:09:21.000 2020-01-02 03:37:42.000 561 99462 50011.5 5001150 561 99462 50011.5 5001150 -32609 32529 4791.66 479166 -128 123 -5.78 -578 +562 100 10552 99463 1.68768 298.68768 150.18768 15018.76876 1.68768 298.68768 150.18768 15018.76856 1.68768 298.68768 150.18768 15018.768 2020-01-01 2020-01-02 2020-01-01 00:09:22 2020-01-02 03:37:43 2020-01-01 00:09:22.000 2020-01-02 03:37:43.000 562 99463 50012.5 5001250 562 99463 50012.5 5001250 -32608 32530 4792.66 479266 -127 124 -4.78 -478 +563 100 10553 99464 1.69069 298.69069 150.19069 15019.06906 1.69069 298.6907 150.19069 15019.06915 1.69069 298.69069 150.19069 15019.069 2020-01-01 2020-01-02 2020-01-01 00:09:23 2020-01-02 03:37:44 2020-01-01 00:09:23.000 2020-01-02 03:37:44.000 563 99464 50013.5 5001350 563 99464 50013.5 5001350 -32607 32531 4793.66 479366 -126 125 -3.78 -378 +564 100 10554 99465 1.69369 298.69369 150.19369 15019.36936 1.69369 298.6937 150.19369 15019.36948 1.69369 298.69369 150.19369 15019.369 2020-01-01 2020-01-02 2020-01-01 00:09:24 2020-01-02 03:37:45 2020-01-01 00:09:24.000 2020-01-02 03:37:45.000 564 99465 50014.5 5001450 564 99465 50014.5 5001450 -32606 32532 4794.66 479466 -125 126 -2.78 -278 +565 100 10555 99466 1.69669 298.69669 150.19669 15019.66966 1.69669 298.6967 150.19669 15019.66962 1.69669 298.69669 150.19669 15019.669 2020-01-01 2020-01-02 2020-01-01 00:09:25 2020-01-02 03:37:46 2020-01-01 00:09:25.000 2020-01-02 03:37:46.000 565 99466 50015.5 5001550 565 99466 50015.5 5001550 -32605 32533 4795.66 479566 -124 127 -1.78 -178 +566 100 10556 99467 1.69969 298.69969 150.19969 15019.96996 1.69969 298.6997 150.1997 15019.97037 1.69969 298.69969 150.19969 15019.969 2020-01-01 2020-01-02 2020-01-01 00:09:26 2020-01-02 03:37:47 2020-01-01 00:09:26.000 2020-01-02 03:37:47.000 566 99467 50016.5 5001650 566 99467 50016.5 5001650 -32604 32534 4796.66 479666 -128 127 -3.34 -334 +567 100 10557 99468 1.7027 298.7027 150.2027 15020.27027 1.7027 298.7027 150.2027 15020.27003 1.7027 298.7027 150.2027 15020.27 2020-01-01 2020-01-02 2020-01-01 00:09:27 2020-01-02 03:37:48 2020-01-01 00:09:27.000 2020-01-02 03:37:48.000 567 99468 50017.5 5001750 567 99468 50017.5 5001750 -32603 32535 4797.66 479766 -128 123 -4.9 -490 +568 100 10558 99469 1.7057 298.7057 150.2057 15020.57057 1.7057 298.70572 150.2057 15020.57066 1.7057 298.7057 150.2057 15020.57 2020-01-01 2020-01-02 2020-01-01 00:09:28 2020-01-02 03:37:49 2020-01-01 00:09:28.000 2020-01-02 03:37:49.000 568 99469 50018.5 5001850 568 99469 50018.5 5001850 -32602 32536 4798.66 479866 -127 124 -3.9 -390 +569 100 10559 99470 1.7087 298.7087 150.2087 15020.87087 1.7087 298.7087 150.2087 15020.87095 1.7087 298.7087 150.20870000000002 15020.87 2020-01-01 2020-01-02 2020-01-01 00:09:29 2020-01-02 03:37:50 2020-01-01 00:09:29.000 2020-01-02 03:37:50.000 569 99470 50019.5 5001950 569 99470 50019.5 5001950 -32601 32537 4799.66 479966 -126 125 -2.9 -290 57 102 10047 99957 0.17117 300.17117 150.17117 15167.28828 0.17117 300.17117 150.17117 15167.28841 0.17117 300.17117 150.17117 15167.28817 2020-01-01 2020-01-02 2020-01-01 00:00:57 2020-01-02 03:45:57 2020-01-01 00:00:57.000 2020-01-02 03:45:57.000 57 99957 50007 5050707 57 99957 50007 5050707 -32512 32423 4586.009900990099 463187 -126 125 -1.7128712871287128 -173 -570 100 10560 99471 1.71171 298.71171 150.21171 15021.17117 1.71171 298.7117 150.21171 15021.17109 1.71171 298.71171 150.21171 15021.17100 2020-01-01 2020-01-02 2020-01-01 00:09:30 2020-01-02 03:37:51 2020-01-01 00:09:30.000 2020-01-02 03:37:51.000 570 99471 50020.5 5002050 570 99471 50020.5 5002050 -32600 32538 4800.66 480066 -125 126 -1.9 -190 -571 100 10561 99472 1.71471 298.71471 150.21471 15021.47147 1.71471 298.71472 150.21471 15021.47184 1.71471 298.71471 150.21471 15021.47100 2020-01-01 2020-01-02 2020-01-01 00:09:31 2020-01-02 03:37:52 2020-01-01 00:09:31.000 2020-01-02 03:37:52.000 571 99472 50021.5 5002150 571 99472 50021.5 5002150 -32599 32539 4801.66 480166 -124 127 -0.9 -90 -572 100 10562 99473 1.71771 298.71771 150.21771 15021.77177 1.71771 298.7177 150.21771 15021.7715 1.71771 298.71771 150.21771 15021.77100 2020-01-01 2020-01-02 2020-01-01 00:09:32 2020-01-02 03:37:53 2020-01-01 00:09:32.000 2020-01-02 03:37:53.000 572 99473 50022.5 5002250 572 99473 50022.5 5002250 -32598 32540 4802.66 480266 -128 127 -2.46 -246 -573 100 10563 99474 1.72072 298.72072 150.22072 15022.07207 1.72072 298.72073 150.22072 15022.07212 1.72072 298.72072 150.22072 15022.07200 2020-01-01 2020-01-02 2020-01-01 00:09:33 2020-01-02 03:37:54 2020-01-01 00:09:33.000 2020-01-02 03:37:54.000 573 99474 50023.5 5002350 573 99474 50023.5 5002350 -32597 32541 4803.66 480366 -128 123 -4.02 -402 -574 100 10564 99475 1.72372 298.72372 150.22372 15022.37237 1.72372 298.72372 150.22372 15022.37243 1.72372 298.72372 150.22372 15022.37200 2020-01-01 2020-01-02 2020-01-01 00:09:34 2020-01-02 03:37:55 2020-01-01 00:09:34.000 2020-01-02 03:37:55.000 574 99475 50024.5 5002450 574 99475 50024.5 5002450 -32596 32542 4804.66 480466 -127 124 -3.02 -302 -575 100 10565 99476 1.72672 298.72672 150.22672 15022.67267 1.72672 298.7267 150.22672 15022.67272 1.72672 298.72672 150.22672 15022.67200 2020-01-01 2020-01-02 2020-01-01 00:09:35 2020-01-02 03:37:56 2020-01-01 00:09:35.000 2020-01-02 03:37:56.000 575 99476 50025.5 5002550 575 99476 50025.5 5002550 -32595 32543 4805.66 480566 -126 125 -2.02 -202 -576 100 10566 99477 1.72972 298.72972 150.22972 15022.97297 1.72972 298.72974 150.22973 15022.97332 1.72972 298.72972 150.22972 15022.97200 2020-01-01 2020-01-02 2020-01-01 00:09:36 2020-01-02 03:37:57 2020-01-01 00:09:36.000 2020-01-02 03:37:57.000 576 99477 50026.5 5002650 576 99477 50026.5 5002650 -32594 32544 4806.66 480666 -125 126 -1.02 -102 -577 100 10567 99478 1.73273 298.73273 150.23273 15023.27327 1.73273 298.73273 150.23272 15023.27297 1.73273 298.73273 150.23273 15023.27300 2020-01-01 2020-01-02 2020-01-01 00:09:37 2020-01-02 03:37:58 2020-01-01 00:09:37.000 2020-01-02 03:37:58.000 577 99478 50027.5 5002750 577 99478 50027.5 5002750 -32593 32545 4807.66 480766 -124 127 -0.02 -2 -578 100 10568 99479 1.73573 298.73573 150.23573 15023.57357 1.73573 298.73575 150.23573 15023.57359 1.73573 298.73573 150.23573 15023.57300 2020-01-01 2020-01-02 2020-01-01 00:09:38 2020-01-02 03:37:59 2020-01-01 00:09:38.000 2020-01-02 03:37:59.000 578 99479 50028.5 5002850 578 99479 50028.5 5002850 -32592 32546 4808.66 480866 -128 127 -1.58 -158 -579 100 10569 99480 1.73873 298.73873 150.23873 15023.87387 1.73873 298.73874 150.23873 15023.8739 1.73873 298.73873 150.23873 15023.87300 2020-01-01 2020-01-02 2020-01-01 00:09:39 2020-01-02 03:38:00 2020-01-01 00:09:39.000 2020-01-02 03:38:00.000 579 99480 50029.5 5002950 579 99480 50029.5 5002950 -32591 32547 4809.66 480966 -128 123 -3.14 -314 +570 100 10560 99471 1.71171 298.71171 150.21171 15021.17117 1.71171 298.7117 150.21171 15021.17109 1.71171 298.71171 150.21171 15021.171 2020-01-01 2020-01-02 2020-01-01 00:09:30 2020-01-02 03:37:51 2020-01-01 00:09:30.000 2020-01-02 03:37:51.000 570 99471 50020.5 5002050 570 99471 50020.5 5002050 -32600 32538 4800.66 480066 -125 126 -1.9 -190 +571 100 10561 99472 1.71471 298.71471 150.21471 15021.47147 1.71471 298.71472 150.21471 15021.47184 1.71471 298.71471 150.21471 15021.471 2020-01-01 2020-01-02 2020-01-01 00:09:31 2020-01-02 03:37:52 2020-01-01 00:09:31.000 2020-01-02 03:37:52.000 571 99472 50021.5 5002150 571 99472 50021.5 5002150 -32599 32539 4801.66 480166 -124 127 -0.9 -90 +572 100 10562 99473 1.71771 298.71771 150.21771 15021.77177 1.71771 298.7177 150.21771 15021.7715 1.71771 298.71771 150.21771 15021.771 2020-01-01 2020-01-02 2020-01-01 00:09:32 2020-01-02 03:37:53 2020-01-01 00:09:32.000 2020-01-02 03:37:53.000 572 99473 50022.5 5002250 572 99473 50022.5 5002250 -32598 32540 4802.66 480266 -128 127 -2.46 -246 +573 100 10563 99474 1.72072 298.72072 150.22072 15022.07207 1.72072 298.72073 150.22072 15022.07212 1.72072 298.72072 150.22072 15022.072 2020-01-01 2020-01-02 2020-01-01 00:09:33 2020-01-02 03:37:54 2020-01-01 00:09:33.000 2020-01-02 03:37:54.000 573 99474 50023.5 5002350 573 99474 50023.5 5002350 -32597 32541 4803.66 480366 -128 123 -4.02 -402 +574 100 10564 99475 1.72372 298.72372 150.22372 15022.37237 1.72372 298.72372 150.22372 15022.37243 1.72372 298.72372 150.22372 15022.372 2020-01-01 2020-01-02 2020-01-01 00:09:34 2020-01-02 03:37:55 2020-01-01 00:09:34.000 2020-01-02 03:37:55.000 574 99475 50024.5 5002450 574 99475 50024.5 5002450 -32596 32542 4804.66 480466 -127 124 -3.02 -302 +575 100 10565 99476 1.72672 298.72672 150.22672 15022.67267 1.72672 298.7267 150.22672 15022.67272 1.72672 298.72672 150.22672 15022.672 2020-01-01 2020-01-02 2020-01-01 00:09:35 2020-01-02 03:37:56 2020-01-01 00:09:35.000 2020-01-02 03:37:56.000 575 99476 50025.5 5002550 575 99476 50025.5 5002550 -32595 32543 4805.66 480566 -126 125 -2.02 -202 +576 100 10566 99477 1.72972 298.72972 150.22972 15022.97297 1.72972 298.72974 150.22973 15022.97332 1.72972 298.72972 150.22972 15022.972 2020-01-01 2020-01-02 2020-01-01 00:09:36 2020-01-02 03:37:57 2020-01-01 00:09:36.000 2020-01-02 03:37:57.000 576 99477 50026.5 5002650 576 99477 50026.5 5002650 -32594 32544 4806.66 480666 -125 126 -1.02 -102 +577 100 10567 99478 1.73273 298.73273 150.23273 15023.27327 1.73273 298.73273 150.23272 15023.27297 1.73273 298.73273 150.23273 15023.273 2020-01-01 2020-01-02 2020-01-01 00:09:37 2020-01-02 03:37:58 2020-01-01 00:09:37.000 2020-01-02 03:37:58.000 577 99478 50027.5 5002750 577 99478 50027.5 5002750 -32593 32545 4807.66 480766 -124 127 -0.02 -2 +578 100 10568 99479 1.73573 298.73573 150.23573 15023.57357 1.73573 298.73575 150.23573 15023.57359 1.73573 298.73573 150.23573 15023.573 2020-01-01 2020-01-02 2020-01-01 00:09:38 2020-01-02 03:37:59 2020-01-01 00:09:38.000 2020-01-02 03:37:59.000 578 99479 50028.5 5002850 578 99479 50028.5 5002850 -32592 32546 4808.66 480866 -128 127 -1.58 -158 +579 100 10569 99480 1.73873 298.73873 150.23873 15023.87387 1.73873 298.73874 150.23873 15023.8739 1.73873 298.73873 150.23873 15023.873 2020-01-01 2020-01-02 2020-01-01 00:09:39 2020-01-02 03:38:00 2020-01-01 00:09:39.000 2020-01-02 03:38:00.000 579 99480 50029.5 5002950 579 99480 50029.5 5002950 -32591 32547 4809.66 480966 -128 123 -3.14 -314 58 102 10048 99958 0.17417 300.17417 150.17417 15167.59159 0.17417 300.17416 150.17417 15167.59159 0.17417 300.17417 150.17417 15167.59117 2020-01-01 2020-01-02 2020-01-01 00:00:58 2020-01-02 03:45:58 2020-01-01 00:00:58.000 2020-01-02 03:45:58.000 58 99958 50008 5050808 58 99958 50008 5050808 -32511 32424 4587.009900990099 463288 -125 126 -0.7128712871287128 -72 -580 100 10570 99481 1.74174 298.74174 150.24174 15024.17417 1.74174 298.74173 150.24174 15024.17419 1.74174 298.74174 150.24174000000002 15024.17400 2020-01-01 2020-01-02 2020-01-01 00:09:40 2020-01-02 03:38:01 2020-01-01 00:09:40.000 2020-01-02 03:38:01.000 580 99481 50030.5 5003050 580 99481 50030.5 5003050 -32590 32548 4810.66 481066 -127 124 -2.14 -214 -581 100 10571 99482 1.74474 298.74474 150.24474 15024.47447 1.74474 298.74475 150.24474 15024.47478 1.74474 298.74474 150.24474 15024.47400 2020-01-01 2020-01-02 2020-01-01 00:09:41 2020-01-02 03:38:02 2020-01-01 00:09:41.000 2020-01-02 03:38:02.000 581 99482 50031.5 5003150 581 99482 50031.5 5003150 -32589 32549 4811.66 481166 -126 125 -1.14 -114 -582 100 10572 99483 1.74774 298.74774 150.24774 15024.77477 1.74774 298.74774 150.24774 15024.77447 1.74774 298.74774 150.24774 15024.77400 2020-01-01 2020-01-02 2020-01-01 00:09:42 2020-01-02 03:38:03 2020-01-01 00:09:42.000 2020-01-02 03:38:03.000 582 99483 50032.5 5003250 582 99483 50032.5 5003250 -32588 32550 4812.66 481266 -125 126 -0.14 -14 -583 100 10573 99484 1.75075 298.75075 150.25075 15025.07507 1.75075 298.75076 150.25075 15025.07507 1.75075 298.75075 150.25075 15025.07500 2020-01-01 2020-01-02 2020-01-01 00:09:43 2020-01-02 03:38:04 2020-01-01 00:09:43.000 2020-01-02 03:38:04.000 583 99484 50033.5 5003350 583 99484 50033.5 5003350 -32587 32551 4813.66 481366 -124 127 0.86 86 -584 100 10574 99485 1.75375 298.75375 150.25375 15025.37537 1.75375 298.75375 150.25375 15025.37536 1.75375 298.75375 150.25375 15025.37500 2020-01-01 2020-01-02 2020-01-01 00:09:44 2020-01-02 03:38:05 2020-01-01 00:09:44.000 2020-01-02 03:38:05.000 584 99485 50034.5 5003450 584 99485 50034.5 5003450 -32586 32552 4814.66 481466 -128 127 -0.7 -70 -585 100 10575 99486 1.75675 298.75675 150.25675 15025.67567 1.75675 298.75674 150.25675 15025.67566 1.75675 298.75675 150.25674999999998 15025.67500 2020-01-01 2020-01-02 2020-01-01 00:09:45 2020-01-02 03:38:06 2020-01-01 00:09:45.000 2020-01-02 03:38:06.000 585 99486 50035.5 5003550 585 99486 50035.5 5003550 -32585 32553 4815.66 481566 -128 127 -2.26 -226 -586 100 10576 99487 1.75975 298.75975 150.25975 15025.97597 1.75975 298.75977 150.25976 15025.97625 1.75975 298.75975 150.25975 15025.97500 2020-01-01 2020-01-02 2020-01-01 00:09:46 2020-01-02 03:38:07 2020-01-01 00:09:46.000 2020-01-02 03:38:07.000 586 99487 50036.5 5003650 586 99487 50036.5 5003650 -32584 32554 4816.66 481666 -128 123 -3.82 -382 -587 100 10577 99488 1.76276 298.76276 150.26276 15026.27627 1.76276 298.76276 150.26275 15026.27594 1.76276 298.76276 150.26276 15026.27600 2020-01-01 2020-01-02 2020-01-01 00:09:47 2020-01-02 03:38:08 2020-01-01 00:09:47.000 2020-01-02 03:38:08.000 587 99488 50037.5 5003750 587 99488 50037.5 5003750 -32583 32555 4817.66 481766 -127 124 -2.82 -282 -588 100 10578 99489 1.76576 298.76576 150.26576 15026.57657 1.76576 298.76578 150.26576 15026.57654 1.76576 298.76576 150.26576 15026.57600 2020-01-01 2020-01-02 2020-01-01 00:09:48 2020-01-02 03:38:09 2020-01-01 00:09:48.000 2020-01-02 03:38:09.000 588 99489 50038.5 5003850 588 99489 50038.5 5003850 -32582 32556 4818.66 481866 -126 125 -1.82 -182 -589 100 10579 99490 1.76876 298.76876 150.26876 15026.87687 1.76876 298.76877 150.26876 15026.87683 1.76876 298.76876 150.26876000000001 15026.87600 2020-01-01 2020-01-02 2020-01-01 00:09:49 2020-01-02 03:38:10 2020-01-01 00:09:49.000 2020-01-02 03:38:10.000 589 99490 50039.5 5003950 589 99490 50039.5 5003950 -32581 32557 4819.66 481966 -125 126 -0.82 -82 +580 100 10570 99481 1.74174 298.74174 150.24174 15024.17417 1.74174 298.74173 150.24174 15024.17419 1.74174 298.74174 150.24174000000002 15024.174 2020-01-01 2020-01-02 2020-01-01 00:09:40 2020-01-02 03:38:01 2020-01-01 00:09:40.000 2020-01-02 03:38:01.000 580 99481 50030.5 5003050 580 99481 50030.5 5003050 -32590 32548 4810.66 481066 -127 124 -2.14 -214 +581 100 10571 99482 1.74474 298.74474 150.24474 15024.47447 1.74474 298.74475 150.24474 15024.47478 1.74474 298.74474 150.24474 15024.474 2020-01-01 2020-01-02 2020-01-01 00:09:41 2020-01-02 03:38:02 2020-01-01 00:09:41.000 2020-01-02 03:38:02.000 581 99482 50031.5 5003150 581 99482 50031.5 5003150 -32589 32549 4811.66 481166 -126 125 -1.14 -114 +582 100 10572 99483 1.74774 298.74774 150.24774 15024.77477 1.74774 298.74774 150.24774 15024.77447 1.74774 298.74774 150.24774 15024.774 2020-01-01 2020-01-02 2020-01-01 00:09:42 2020-01-02 03:38:03 2020-01-01 00:09:42.000 2020-01-02 03:38:03.000 582 99483 50032.5 5003250 582 99483 50032.5 5003250 -32588 32550 4812.66 481266 -125 126 -0.14 -14 +583 100 10573 99484 1.75075 298.75075 150.25075 15025.07507 1.75075 298.75076 150.25075 15025.07507 1.75075 298.75075 150.25075 15025.075 2020-01-01 2020-01-02 2020-01-01 00:09:43 2020-01-02 03:38:04 2020-01-01 00:09:43.000 2020-01-02 03:38:04.000 583 99484 50033.5 5003350 583 99484 50033.5 5003350 -32587 32551 4813.66 481366 -124 127 0.86 86 +584 100 10574 99485 1.75375 298.75375 150.25375 15025.37537 1.75375 298.75375 150.25375 15025.37536 1.75375 298.75375 150.25375 15025.375 2020-01-01 2020-01-02 2020-01-01 00:09:44 2020-01-02 03:38:05 2020-01-01 00:09:44.000 2020-01-02 03:38:05.000 584 99485 50034.5 5003450 584 99485 50034.5 5003450 -32586 32552 4814.66 481466 -128 127 -0.7 -70 +585 100 10575 99486 1.75675 298.75675 150.25675 15025.67567 1.75675 298.75674 150.25675 15025.67566 1.75675 298.75675 150.25674999999998 15025.675 2020-01-01 2020-01-02 2020-01-01 00:09:45 2020-01-02 03:38:06 2020-01-01 00:09:45.000 2020-01-02 03:38:06.000 585 99486 50035.5 5003550 585 99486 50035.5 5003550 -32585 32553 4815.66 481566 -128 127 -2.26 -226 +586 100 10576 99487 1.75975 298.75975 150.25975 15025.97597 1.75975 298.75977 150.25976 15025.97625 1.75975 298.75975 150.25975 15025.975 2020-01-01 2020-01-02 2020-01-01 00:09:46 2020-01-02 03:38:07 2020-01-01 00:09:46.000 2020-01-02 03:38:07.000 586 99487 50036.5 5003650 586 99487 50036.5 5003650 -32584 32554 4816.66 481666 -128 123 -3.82 -382 +587 100 10577 99488 1.76276 298.76276 150.26276 15026.27627 1.76276 298.76276 150.26275 15026.27594 1.76276 298.76276 150.26276 15026.276 2020-01-01 2020-01-02 2020-01-01 00:09:47 2020-01-02 03:38:08 2020-01-01 00:09:47.000 2020-01-02 03:38:08.000 587 99488 50037.5 5003750 587 99488 50037.5 5003750 -32583 32555 4817.66 481766 -127 124 -2.82 -282 +588 100 10578 99489 1.76576 298.76576 150.26576 15026.57657 1.76576 298.76578 150.26576 15026.57654 1.76576 298.76576 150.26576 15026.576 2020-01-01 2020-01-02 2020-01-01 00:09:48 2020-01-02 03:38:09 2020-01-01 00:09:48.000 2020-01-02 03:38:09.000 588 99489 50038.5 5003850 588 99489 50038.5 5003850 -32582 32556 4818.66 481866 -126 125 -1.82 -182 +589 100 10579 99490 1.76876 298.76876 150.26876 15026.87687 1.76876 298.76877 150.26876 15026.87683 1.76876 298.76876 150.26876000000001 15026.876 2020-01-01 2020-01-02 2020-01-01 00:09:49 2020-01-02 03:38:10 2020-01-01 00:09:49.000 2020-01-02 03:38:10.000 589 99490 50039.5 5003950 589 99490 50039.5 5003950 -32581 32557 4819.66 481966 -125 126 -0.82 -82 59 102 10049 99959 0.17717 300.17717 150.17717 15167.89489 0.17717 300.1772 150.17717 15167.8947 0.17717 300.17717 150.17717 15167.89417 2020-01-01 2020-01-02 2020-01-01 00:00:59 2020-01-02 03:45:59 2020-01-01 00:00:59.000 2020-01-02 03:45:59.000 59 99959 50009 5050909 59 99959 50009 5050909 -32510 32425 4588.009900990099 463389 -124 127 0.2871287128712871 29 -590 100 10580 99491 1.77177 298.77177 150.27177 15027.17717 1.77177 298.77176 150.27177 15027.17713 1.77177 298.77177 150.27177 15027.17700 2020-01-01 2020-01-02 2020-01-01 00:09:50 2020-01-02 03:38:11 2020-01-01 00:09:50.000 2020-01-02 03:38:11.000 590 99491 50040.5 5004050 590 99491 50040.5 5004050 -32580 32558 4820.66 482066 -124 127 0.18 18 -591 100 10581 99492 1.77477 298.77477 150.27477 15027.47747 1.77477 298.77478 150.27477 15027.47775 1.77477 298.77477 150.27477000000002 15027.47700 2020-01-01 2020-01-02 2020-01-01 00:09:51 2020-01-02 03:38:12 2020-01-01 00:09:51.000 2020-01-02 03:38:12.000 591 99492 50041.5 5004150 591 99492 50041.5 5004150 -32579 32559 4821.66 482166 -128 127 -1.38 -138 -592 100 10582 99493 1.77777 298.77777 150.27777 15027.77777 1.77777 298.77777 150.27777 15027.77742 1.77777 298.77777 150.27777 15027.77700 2020-01-01 2020-01-02 2020-01-01 00:09:52 2020-01-02 03:38:13 2020-01-01 00:09:52.000 2020-01-02 03:38:13.000 592 99493 50042.5 5004250 592 99493 50042.5 5004250 -32578 32560 4822.66 482266 -128 123 -2.94 -294 -593 100 10583 99494 1.78078 298.78078 150.28078 15028.07807 1.78078 298.7808 150.28078 15028.078 1.78078 298.78078 150.28078 15028.07800 2020-01-01 2020-01-02 2020-01-01 00:09:53 2020-01-02 03:38:14 2020-01-01 00:09:53.000 2020-01-02 03:38:14.000 593 99494 50043.5 5004350 593 99494 50043.5 5004350 -32577 32561 4823.66 482366 -127 124 -1.94 -194 -594 100 10584 99495 1.78378 298.78378 150.28378 15028.37837 1.78378 298.78378 150.28378 15028.3783 1.78378 298.78378 150.28378 15028.37800 2020-01-01 2020-01-02 2020-01-01 00:09:54 2020-01-02 03:38:15 2020-01-01 00:09:54.000 2020-01-02 03:38:15.000 594 99495 50044.5 5004450 594 99495 50044.5 5004450 -32576 32562 4824.66 482466 -126 125 -0.94 -94 -595 100 10585 99496 1.78678 298.78678 150.28678 15028.67867 1.78678 298.78677 150.28678 15028.6786 1.78678 298.78678 150.28678 15028.67800 2020-01-01 2020-01-02 2020-01-01 00:09:55 2020-01-02 03:38:16 2020-01-01 00:09:55.000 2020-01-02 03:38:16.000 595 99496 50045.5 5004550 595 99496 50045.5 5004550 -32575 32563 4825.66 482566 -125 126 0.06 6 -596 100 10586 99497 1.78978 298.78978 150.28978 15028.97897 1.78978 298.7898 150.28979 15028.97922 1.78978 298.78978 150.28977999999998 15028.97800 2020-01-01 2020-01-02 2020-01-01 00:09:56 2020-01-02 03:38:17 2020-01-01 00:09:56.000 2020-01-02 03:38:17.000 596 99497 50046.5 5004650 596 99497 50046.5 5004650 -32574 32564 4826.66 482666 -124 127 1.06 106 -597 100 10587 99498 1.79279 298.79279 150.29279 15029.27927 1.79279 298.7928 150.29278 15029.27888 1.79279 298.79279 150.29279 15029.27900 2020-01-01 2020-01-02 2020-01-01 00:09:57 2020-01-02 03:38:18 2020-01-01 00:09:57.000 2020-01-02 03:38:18.000 597 99498 50047.5 5004750 597 99498 50047.5 5004750 -32573 32565 4827.66 482766 -128 127 -0.5 -50 -598 100 10588 99499 1.79579 298.79579 150.29579 15029.57957 1.79579 298.7958 150.29579 15029.57964 1.79579 298.79579 150.29579 15029.57900 2020-01-01 2020-01-02 2020-01-01 00:09:58 2020-01-02 03:38:19 2020-01-01 00:09:58.000 2020-01-02 03:38:19.000 598 99499 50048.5 5004850 598 99499 50048.5 5004850 -32572 32566 4828.66 482866 -128 123 -2.06 -206 -599 100 10589 99500 1.79879 298.79879 150.29879 15029.87987 1.79879 298.7988 150.29879 15029.87977 1.79879 298.79879 150.29879 15029.87900 2020-01-01 2020-01-02 2020-01-01 00:09:59 2020-01-02 03:38:20 2020-01-01 00:09:59.000 2020-01-02 03:38:20.000 599 99500 50049.5 5004950 599 99500 50049.5 5004950 -32571 32567 4829.66 482966 -127 124 -1.06 -106 +590 100 10580 99491 1.77177 298.77177 150.27177 15027.17717 1.77177 298.77176 150.27177 15027.17713 1.77177 298.77177 150.27177 15027.177 2020-01-01 2020-01-02 2020-01-01 00:09:50 2020-01-02 03:38:11 2020-01-01 00:09:50.000 2020-01-02 03:38:11.000 590 99491 50040.5 5004050 590 99491 50040.5 5004050 -32580 32558 4820.66 482066 -124 127 0.18 18 +591 100 10581 99492 1.77477 298.77477 150.27477 15027.47747 1.77477 298.77478 150.27477 15027.47775 1.77477 298.77477 150.27477000000002 15027.477 2020-01-01 2020-01-02 2020-01-01 00:09:51 2020-01-02 03:38:12 2020-01-01 00:09:51.000 2020-01-02 03:38:12.000 591 99492 50041.5 5004150 591 99492 50041.5 5004150 -32579 32559 4821.66 482166 -128 127 -1.38 -138 +592 100 10582 99493 1.77777 298.77777 150.27777 15027.77777 1.77777 298.77777 150.27777 15027.77742 1.77777 298.77777 150.27777 15027.777 2020-01-01 2020-01-02 2020-01-01 00:09:52 2020-01-02 03:38:13 2020-01-01 00:09:52.000 2020-01-02 03:38:13.000 592 99493 50042.5 5004250 592 99493 50042.5 5004250 -32578 32560 4822.66 482266 -128 123 -2.94 -294 +593 100 10583 99494 1.78078 298.78078 150.28078 15028.07807 1.78078 298.7808 150.28078 15028.078 1.78078 298.78078 150.28078 15028.078 2020-01-01 2020-01-02 2020-01-01 00:09:53 2020-01-02 03:38:14 2020-01-01 00:09:53.000 2020-01-02 03:38:14.000 593 99494 50043.5 5004350 593 99494 50043.5 5004350 -32577 32561 4823.66 482366 -127 124 -1.94 -194 +594 100 10584 99495 1.78378 298.78378 150.28378 15028.37837 1.78378 298.78378 150.28378 15028.3783 1.78378 298.78378 150.28378 15028.378 2020-01-01 2020-01-02 2020-01-01 00:09:54 2020-01-02 03:38:15 2020-01-01 00:09:54.000 2020-01-02 03:38:15.000 594 99495 50044.5 5004450 594 99495 50044.5 5004450 -32576 32562 4824.66 482466 -126 125 -0.94 -94 +595 100 10585 99496 1.78678 298.78678 150.28678 15028.67867 1.78678 298.78677 150.28678 15028.6786 1.78678 298.78678 150.28678 15028.678 2020-01-01 2020-01-02 2020-01-01 00:09:55 2020-01-02 03:38:16 2020-01-01 00:09:55.000 2020-01-02 03:38:16.000 595 99496 50045.5 5004550 595 99496 50045.5 5004550 -32575 32563 4825.66 482566 -125 126 0.06 6 +596 100 10586 99497 1.78978 298.78978 150.28978 15028.97897 1.78978 298.7898 150.28979 15028.97922 1.78978 298.78978 150.28977999999998 15028.978 2020-01-01 2020-01-02 2020-01-01 00:09:56 2020-01-02 03:38:17 2020-01-01 00:09:56.000 2020-01-02 03:38:17.000 596 99497 50046.5 5004650 596 99497 50046.5 5004650 -32574 32564 4826.66 482666 -124 127 1.06 106 +597 100 10587 99498 1.79279 298.79279 150.29279 15029.27927 1.79279 298.7928 150.29278 15029.27888 1.79279 298.79279 150.29279 15029.279 2020-01-01 2020-01-02 2020-01-01 00:09:57 2020-01-02 03:38:18 2020-01-01 00:09:57.000 2020-01-02 03:38:18.000 597 99498 50047.5 5004750 597 99498 50047.5 5004750 -32573 32565 4827.66 482766 -128 127 -0.5 -50 +598 100 10588 99499 1.79579 298.79579 150.29579 15029.57957 1.79579 298.7958 150.29579 15029.57964 1.79579 298.79579 150.29579 15029.579 2020-01-01 2020-01-02 2020-01-01 00:09:58 2020-01-02 03:38:19 2020-01-01 00:09:58.000 2020-01-02 03:38:19.000 598 99499 50048.5 5004850 598 99499 50048.5 5004850 -32572 32566 4828.66 482866 -128 123 -2.06 -206 +599 100 10589 99500 1.79879 298.79879 150.29879 15029.87987 1.79879 298.7988 150.29879 15029.87977 1.79879 298.79879 150.29879 15029.879 2020-01-01 2020-01-02 2020-01-01 00:09:59 2020-01-02 03:38:20 2020-01-01 00:09:59.000 2020-01-02 03:38:20.000 599 99500 50049.5 5004950 599 99500 50049.5 5004950 -32571 32567 4829.66 482966 -127 124 -1.06 -106 6 102 1005 9996 0.01801 300.01801 150.01801 15151.81981 0.01801 300.018 150.01801 15151.81978 0.01801 300.01801 150.01801 15151.81901 2020-01-01 2020-01-02 2020-01-01 00:00:06 2020-01-02 03:45:06 2020-01-01 00:00:06.000 2020-01-02 03:45:06.000 6 99906 49956 5045556 6 99906 49956 5045556 -32563 32372 4535.009900990099 458036 -127 124 -2.01980198019802 -204 60 102 10050 99960 0.18018 300.18018 150.18018 15168.19819 0.18018 300.18018 150.18017 15168.198 0.18018 300.18018 150.18018 15168.19818 2020-01-01 2020-01-02 2020-01-01 00:01:00 2020-01-02 03:46:00 2020-01-01 00:01:00.000 2020-01-02 03:46:00.000 60 99960 50010 5051010 60 99960 50010 5051010 -32509 32426 4589.009900990099 463490 -128 127 -1.2475247524752475 -126 -600 100 10590 99501 1.8018 298.8018 150.3018 15030.18018 1.8018 298.8018 150.3018 15030.1801 1.80180 298.80180 150.30180000000001 15030.18000 2020-01-01 2020-01-02 2020-01-01 00:10:00 2020-01-02 03:38:21 2020-01-01 00:10:00.000 2020-01-02 03:38:21.000 600 99501 50050.5 5005050 600 99501 50050.5 5005050 -32570 32568 4830.66 483066 -126 125 -0.06 -6 -601 100 10591 99502 1.8048 298.8048 150.3048 15030.48048 1.8048 298.8048 150.3048 15030.4807 1.80480 298.80480 150.3048 15030.48000 2020-01-01 2020-01-02 2020-01-01 00:10:01 2020-01-02 03:38:22 2020-01-01 00:10:01.000 2020-01-02 03:38:22.000 601 99502 50051.5 5005150 601 99502 50051.5 5005150 -32569 32569 4831.66 483166 -125 126 0.94 94 -602 100 10592 99503 1.8078 298.8078 150.3078 15030.78078 1.8078 298.8078 150.3078 15030.78035 1.80780 298.80780 150.30780000000001 15030.78000 2020-01-01 2020-01-02 2020-01-01 00:10:02 2020-01-02 03:38:23 2020-01-01 00:10:02.000 2020-01-02 03:38:23.000 602 99503 50052.5 5005250 602 99503 50052.5 5005250 -32568 32570 4832.66 483266 -124 127 1.94 194 -603 100 10593 99504 1.81081 298.81081 150.31081 15031.08108 1.81081 298.81082 150.31081 15031.0811 1.81081 298.81081 150.31081 15031.08100 2020-01-01 2020-01-02 2020-01-01 00:10:03 2020-01-02 03:38:24 2020-01-01 00:10:03.000 2020-01-02 03:38:24.000 603 99504 50053.5 5005350 603 99504 50053.5 5005350 -32567 32571 4833.66 483366 -128 127 0.38 38 -604 100 10594 99505 1.81381 298.81381 150.31381 15031.38138 1.81381 298.8138 150.31381 15031.38124 1.81381 298.81381 150.31381 15031.38100 2020-01-01 2020-01-02 2020-01-01 00:10:04 2020-01-02 03:38:25 2020-01-01 00:10:04.000 2020-01-02 03:38:25.000 604 99505 50054.5 5005450 604 99505 50054.5 5005450 -32566 32572 4834.66 483466 -128 123 -1.18 -118 -605 100 10595 99506 1.81681 298.81681 150.31681 15031.68168 1.81681 298.8168 150.31681 15031.68157 1.81681 298.81681 150.31681 15031.68100 2020-01-01 2020-01-02 2020-01-01 00:10:05 2020-01-02 03:38:26 2020-01-01 00:10:05.000 2020-01-02 03:38:26.000 605 99506 50055.5 5005550 605 99506 50055.5 5005550 -32565 32573 4835.66 483566 -127 124 -0.18 -18 -606 100 10596 99507 1.81981 298.81981 150.31981 15031.98198 1.81981 298.81982 150.31982 15031.98217 1.81981 298.81981 150.31981 15031.98100 2020-01-01 2020-01-02 2020-01-01 00:10:06 2020-01-02 03:38:27 2020-01-01 00:10:06.000 2020-01-02 03:38:27.000 606 99507 50056.5 5005650 606 99507 50056.5 5005650 -32564 32574 4836.66 483666 -126 125 0.82 82 -607 100 10597 99508 1.82282 298.82282 150.32282 15032.28228 1.82282 298.8228 150.32282 15032.28246 1.82282 298.82282 150.32281999999998 15032.28200 2020-01-01 2020-01-02 2020-01-01 00:10:07 2020-01-02 03:38:28 2020-01-01 00:10:07.000 2020-01-02 03:38:28.000 607 99508 50057.5 5005750 607 99508 50057.5 5005750 -32563 32575 4837.66 483766 -125 126 1.82 182 -608 100 10598 99509 1.82582 298.82582 150.32582 15032.58258 1.82582 298.82584 150.32582 15032.58258 1.82582 298.82582 150.32582 15032.58200 2020-01-01 2020-01-02 2020-01-01 00:10:08 2020-01-02 03:38:29 2020-01-01 00:10:08.000 2020-01-02 03:38:29.000 608 99509 50058.5 5005850 608 99509 50058.5 5005850 -32562 32576 4838.66 483866 -124 127 2.82 282 -609 100 10599 99510 1.82882 298.82882 150.32882 15032.88288 1.82882 298.82883 150.32882 15032.88274 1.82882 298.82882 150.32882 15032.88200 2020-01-01 2020-01-02 2020-01-01 00:10:09 2020-01-02 03:38:30 2020-01-01 00:10:09.000 2020-01-02 03:38:30.000 609 99510 50059.5 5005950 609 99510 50059.5 5005950 -32561 32577 4839.66 483966 -128 127 1.26 126 +600 100 10590 99501 1.8018 298.8018 150.3018 15030.18018 1.8018 298.8018 150.3018 15030.1801 1.8018 298.8018 150.30180000000001 15030.18 2020-01-01 2020-01-02 2020-01-01 00:10:00 2020-01-02 03:38:21 2020-01-01 00:10:00.000 2020-01-02 03:38:21.000 600 99501 50050.5 5005050 600 99501 50050.5 5005050 -32570 32568 4830.66 483066 -126 125 -0.06 -6 +601 100 10591 99502 1.8048 298.8048 150.3048 15030.48048 1.8048 298.8048 150.3048 15030.4807 1.8048 298.8048 150.3048 15030.48 2020-01-01 2020-01-02 2020-01-01 00:10:01 2020-01-02 03:38:22 2020-01-01 00:10:01.000 2020-01-02 03:38:22.000 601 99502 50051.5 5005150 601 99502 50051.5 5005150 -32569 32569 4831.66 483166 -125 126 0.94 94 +602 100 10592 99503 1.8078 298.8078 150.3078 15030.78078 1.8078 298.8078 150.3078 15030.78035 1.8078 298.8078 150.30780000000001 15030.78 2020-01-01 2020-01-02 2020-01-01 00:10:02 2020-01-02 03:38:23 2020-01-01 00:10:02.000 2020-01-02 03:38:23.000 602 99503 50052.5 5005250 602 99503 50052.5 5005250 -32568 32570 4832.66 483266 -124 127 1.94 194 +603 100 10593 99504 1.81081 298.81081 150.31081 15031.08108 1.81081 298.81082 150.31081 15031.0811 1.81081 298.81081 150.31081 15031.081 2020-01-01 2020-01-02 2020-01-01 00:10:03 2020-01-02 03:38:24 2020-01-01 00:10:03.000 2020-01-02 03:38:24.000 603 99504 50053.5 5005350 603 99504 50053.5 5005350 -32567 32571 4833.66 483366 -128 127 0.38 38 +604 100 10594 99505 1.81381 298.81381 150.31381 15031.38138 1.81381 298.8138 150.31381 15031.38124 1.81381 298.81381 150.31381 15031.381 2020-01-01 2020-01-02 2020-01-01 00:10:04 2020-01-02 03:38:25 2020-01-01 00:10:04.000 2020-01-02 03:38:25.000 604 99505 50054.5 5005450 604 99505 50054.5 5005450 -32566 32572 4834.66 483466 -128 123 -1.18 -118 +605 100 10595 99506 1.81681 298.81681 150.31681 15031.68168 1.81681 298.8168 150.31681 15031.68157 1.81681 298.81681 150.31681 15031.681 2020-01-01 2020-01-02 2020-01-01 00:10:05 2020-01-02 03:38:26 2020-01-01 00:10:05.000 2020-01-02 03:38:26.000 605 99506 50055.5 5005550 605 99506 50055.5 5005550 -32565 32573 4835.66 483566 -127 124 -0.18 -18 +606 100 10596 99507 1.81981 298.81981 150.31981 15031.98198 1.81981 298.81982 150.31982 15031.98217 1.81981 298.81981 150.31981 15031.981 2020-01-01 2020-01-02 2020-01-01 00:10:06 2020-01-02 03:38:27 2020-01-01 00:10:06.000 2020-01-02 03:38:27.000 606 99507 50056.5 5005650 606 99507 50056.5 5005650 -32564 32574 4836.66 483666 -126 125 0.82 82 +607 100 10597 99508 1.82282 298.82282 150.32282 15032.28228 1.82282 298.8228 150.32282 15032.28246 1.82282 298.82282 150.32281999999998 15032.282 2020-01-01 2020-01-02 2020-01-01 00:10:07 2020-01-02 03:38:28 2020-01-01 00:10:07.000 2020-01-02 03:38:28.000 607 99508 50057.5 5005750 607 99508 50057.5 5005750 -32563 32575 4837.66 483766 -125 126 1.82 182 +608 100 10598 99509 1.82582 298.82582 150.32582 15032.58258 1.82582 298.82584 150.32582 15032.58258 1.82582 298.82582 150.32582 15032.582 2020-01-01 2020-01-02 2020-01-01 00:10:08 2020-01-02 03:38:29 2020-01-01 00:10:08.000 2020-01-02 03:38:29.000 608 99509 50058.5 5005850 608 99509 50058.5 5005850 -32562 32576 4838.66 483866 -124 127 2.82 282 +609 100 10599 99510 1.82882 298.82882 150.32882 15032.88288 1.82882 298.82883 150.32882 15032.88274 1.82882 298.82882 150.32882 15032.882 2020-01-01 2020-01-02 2020-01-01 00:10:09 2020-01-02 03:38:30 2020-01-01 00:10:09.000 2020-01-02 03:38:30.000 609 99510 50059.5 5005950 609 99510 50059.5 5005950 -32561 32577 4839.66 483966 -128 127 1.26 126 61 102 10051 99961 0.18318 300.18318 150.18318 15168.5015 0.18318 300.1832 150.18318 15168.5016 0.18318 300.18318 150.18318 15168.50118 2020-01-01 2020-01-02 2020-01-01 00:01:01 2020-01-02 03:46:01 2020-01-01 00:01:01.000 2020-01-02 03:46:01.000 61 99961 50011 5051111 61 99961 50011 5051111 -32508 32427 4590.009900990099 463591 -128 123 -2.782178217821782 -281 -610 100 10600 99511 1.83183 298.83183 150.33183 15033.18318 1.83183 298.83182 150.33183 15033.18304 1.83183 298.83183 150.33183 15033.18300 2020-01-01 2020-01-02 2020-01-01 00:10:10 2020-01-02 03:38:31 2020-01-01 00:10:10.000 2020-01-02 03:38:31.000 610 99511 50060.5 5006050 610 99511 50060.5 5006050 -32560 32578 4840.66 484066 -128 127 -0.3 -30 -611 100 10601 99512 1.83483 298.83483 150.33483 15033.48348 1.83483 298.83484 150.33483 15033.48363 1.83483 298.83483 150.33483 15033.48300 2020-01-01 2020-01-02 2020-01-01 00:10:11 2020-01-02 03:38:32 2020-01-01 00:10:11.000 2020-01-02 03:38:32.000 611 99512 50061.5 5006150 611 99512 50061.5 5006150 -32559 32579 4841.66 484166 -128 123 -1.86 -186 -612 100 10602 99513 1.83783 298.83783 150.33783 15033.78378 1.83783 298.83783 150.33783 15033.78393 1.83783 298.83783 150.33783 15033.78300 2020-01-01 2020-01-02 2020-01-01 00:10:12 2020-01-02 03:38:33 2020-01-01 00:10:12.000 2020-01-02 03:38:33.000 612 99513 50062.5 5006250 612 99513 50062.5 5006250 -32558 32580 4842.66 484266 -127 124 -0.86 -86 -613 100 10603 99514 1.84084 298.84084 150.34084 15034.08408 1.84084 298.84085 150.34084 15034.08405 1.84084 298.84084 150.34084000000001 15034.08400 2020-01-01 2020-01-02 2020-01-01 00:10:13 2020-01-02 03:38:34 2020-01-01 00:10:13.000 2020-01-02 03:38:34.000 613 99514 50063.5 5006350 613 99514 50063.5 5006350 -32557 32581 4843.66 484366 -126 125 0.14 14 -614 100 10604 99515 1.84384 298.84384 150.34384 15034.38438 1.84384 298.84384 150.34384 15034.38421 1.84384 298.84384 150.34384 15034.38400 2020-01-01 2020-01-02 2020-01-01 00:10:14 2020-01-02 03:38:35 2020-01-01 00:10:14.000 2020-01-02 03:38:35.000 614 99515 50064.5 5006450 614 99515 50064.5 5006450 -32556 32582 4844.66 484466 -125 126 1.14 114 -615 100 10605 99516 1.84684 298.84684 150.34684 15034.68468 1.84684 298.84683 150.34684 15034.68452 1.84684 298.84684 150.34684 15034.68400 2020-01-01 2020-01-02 2020-01-01 00:10:15 2020-01-02 03:38:36 2020-01-01 00:10:15.000 2020-01-02 03:38:36.000 615 99516 50065.5 5006550 615 99516 50065.5 5006550 -32555 32583 4845.66 484566 -124 127 2.14 214 -616 100 10606 99517 1.84984 298.84984 150.34984 15034.98498 1.84984 298.84985 150.34985 15034.98527 1.84984 298.84984 150.34984 15034.98400 2020-01-01 2020-01-02 2020-01-01 00:10:16 2020-01-02 03:38:37 2020-01-01 00:10:16.000 2020-01-02 03:38:37.000 616 99517 50066.5 5006650 616 99517 50066.5 5006650 -32554 32584 4846.66 484666 -128 127 0.58 58 -617 100 10607 99518 1.85285 298.85285 150.35285 15035.28528 1.85285 298.85284 150.35285 15035.2854 1.85285 298.85285 150.35285 15035.28500 2020-01-01 2020-01-02 2020-01-01 00:10:17 2020-01-02 03:38:38 2020-01-01 00:10:17.000 2020-01-02 03:38:38.000 617 99518 50067.5 5006750 617 99518 50067.5 5006750 -32553 32585 4847.66 484766 -128 123 -0.98 -98 -618 100 10608 99519 1.85585 298.85585 150.35585 15035.58558 1.85585 298.85587 150.35585 15035.58551 1.85585 298.85585 150.35585 15035.58500 2020-01-01 2020-01-02 2020-01-01 00:10:18 2020-01-02 03:38:39 2020-01-01 00:10:18.000 2020-01-02 03:38:39.000 618 99519 50068.5 5006850 618 99519 50068.5 5006850 -32552 32586 4848.66 484866 -127 124 0.02 2 -619 100 10609 99520 1.85885 298.85885 150.35885 15035.88588 1.85885 298.85886 150.35885 15035.88568 1.85885 298.85885 150.35885 15035.88500 2020-01-01 2020-01-02 2020-01-01 00:10:19 2020-01-02 03:38:40 2020-01-01 00:10:19.000 2020-01-02 03:38:40.000 619 99520 50069.5 5006950 619 99520 50069.5 5006950 -32551 32587 4849.66 484966 -126 125 1.02 102 +610 100 10600 99511 1.83183 298.83183 150.33183 15033.18318 1.83183 298.83182 150.33183 15033.18304 1.83183 298.83183 150.33183 15033.183 2020-01-01 2020-01-02 2020-01-01 00:10:10 2020-01-02 03:38:31 2020-01-01 00:10:10.000 2020-01-02 03:38:31.000 610 99511 50060.5 5006050 610 99511 50060.5 5006050 -32560 32578 4840.66 484066 -128 127 -0.3 -30 +611 100 10601 99512 1.83483 298.83483 150.33483 15033.48348 1.83483 298.83484 150.33483 15033.48363 1.83483 298.83483 150.33483 15033.483 2020-01-01 2020-01-02 2020-01-01 00:10:11 2020-01-02 03:38:32 2020-01-01 00:10:11.000 2020-01-02 03:38:32.000 611 99512 50061.5 5006150 611 99512 50061.5 5006150 -32559 32579 4841.66 484166 -128 123 -1.86 -186 +612 100 10602 99513 1.83783 298.83783 150.33783 15033.78378 1.83783 298.83783 150.33783 15033.78393 1.83783 298.83783 150.33783 15033.783 2020-01-01 2020-01-02 2020-01-01 00:10:12 2020-01-02 03:38:33 2020-01-01 00:10:12.000 2020-01-02 03:38:33.000 612 99513 50062.5 5006250 612 99513 50062.5 5006250 -32558 32580 4842.66 484266 -127 124 -0.86 -86 +613 100 10603 99514 1.84084 298.84084 150.34084 15034.08408 1.84084 298.84085 150.34084 15034.08405 1.84084 298.84084 150.34084000000001 15034.084 2020-01-01 2020-01-02 2020-01-01 00:10:13 2020-01-02 03:38:34 2020-01-01 00:10:13.000 2020-01-02 03:38:34.000 613 99514 50063.5 5006350 613 99514 50063.5 5006350 -32557 32581 4843.66 484366 -126 125 0.14 14 +614 100 10604 99515 1.84384 298.84384 150.34384 15034.38438 1.84384 298.84384 150.34384 15034.38421 1.84384 298.84384 150.34384 15034.384 2020-01-01 2020-01-02 2020-01-01 00:10:14 2020-01-02 03:38:35 2020-01-01 00:10:14.000 2020-01-02 03:38:35.000 614 99515 50064.5 5006450 614 99515 50064.5 5006450 -32556 32582 4844.66 484466 -125 126 1.14 114 +615 100 10605 99516 1.84684 298.84684 150.34684 15034.68468 1.84684 298.84683 150.34684 15034.68452 1.84684 298.84684 150.34684 15034.684 2020-01-01 2020-01-02 2020-01-01 00:10:15 2020-01-02 03:38:36 2020-01-01 00:10:15.000 2020-01-02 03:38:36.000 615 99516 50065.5 5006550 615 99516 50065.5 5006550 -32555 32583 4845.66 484566 -124 127 2.14 214 +616 100 10606 99517 1.84984 298.84984 150.34984 15034.98498 1.84984 298.84985 150.34985 15034.98527 1.84984 298.84984 150.34984 15034.984 2020-01-01 2020-01-02 2020-01-01 00:10:16 2020-01-02 03:38:37 2020-01-01 00:10:16.000 2020-01-02 03:38:37.000 616 99517 50066.5 5006650 616 99517 50066.5 5006650 -32554 32584 4846.66 484666 -128 127 0.58 58 +617 100 10607 99518 1.85285 298.85285 150.35285 15035.28528 1.85285 298.85284 150.35285 15035.2854 1.85285 298.85285 150.35285 15035.285 2020-01-01 2020-01-02 2020-01-01 00:10:17 2020-01-02 03:38:38 2020-01-01 00:10:17.000 2020-01-02 03:38:38.000 617 99518 50067.5 5006750 617 99518 50067.5 5006750 -32553 32585 4847.66 484766 -128 123 -0.98 -98 +618 100 10608 99519 1.85585 298.85585 150.35585 15035.58558 1.85585 298.85587 150.35585 15035.58551 1.85585 298.85585 150.35585 15035.585 2020-01-01 2020-01-02 2020-01-01 00:10:18 2020-01-02 03:38:39 2020-01-01 00:10:18.000 2020-01-02 03:38:39.000 618 99519 50068.5 5006850 618 99519 50068.5 5006850 -32552 32586 4848.66 484866 -127 124 0.02 2 +619 100 10609 99520 1.85885 298.85885 150.35885 15035.88588 1.85885 298.85886 150.35885 15035.88568 1.85885 298.85885 150.35885 15035.885 2020-01-01 2020-01-02 2020-01-01 00:10:19 2020-01-02 03:38:40 2020-01-01 00:10:19.000 2020-01-02 03:38:40.000 619 99520 50069.5 5006950 619 99520 50069.5 5006950 -32551 32587 4849.66 484966 -126 125 1.02 102 62 102 10052 99962 0.18618 300.18618 150.18618 15168.8048 0.18618 300.1862 150.18618 15168.80494 0.18618 300.18618 150.18617999999998 15168.80418 2020-01-01 2020-01-02 2020-01-01 00:01:02 2020-01-02 03:46:02 2020-01-01 00:01:02.000 2020-01-02 03:46:02.000 62 99962 50012 5051212 62 99962 50012 5051212 -32507 32428 4591.009900990099 463692 -127 124 -1.7821782178217822 -180 -620 100 10610 99521 1.86186 298.86186 150.36186 15036.18618 1.86186 298.86185 150.36185 15036.18598 1.86186 298.86186 150.36186 15036.18600 2020-01-01 2020-01-02 2020-01-01 00:10:20 2020-01-02 03:38:41 2020-01-01 00:10:20.000 2020-01-02 03:38:41.000 620 99521 50070.5 5007050 620 99521 50070.5 5007050 -32550 32588 4850.66 485066 -125 126 2.02 202 -621 100 10611 99522 1.86486 298.86486 150.36486 15036.48648 1.86486 298.86487 150.36486 15036.48673 1.86486 298.86486 150.36486000000002 15036.48600 2020-01-01 2020-01-02 2020-01-01 00:10:21 2020-01-02 03:38:42 2020-01-01 00:10:21.000 2020-01-02 03:38:42.000 621 99522 50071.5 5007150 621 99522 50071.5 5007150 -32549 32589 4851.66 485166 -124 127 3.02 302 -622 100 10612 99523 1.86786 298.86786 150.36786 15036.78678 1.86786 298.86786 150.36786 15036.78687 1.86786 298.86786 150.36786 15036.78600 2020-01-01 2020-01-02 2020-01-01 00:10:22 2020-01-02 03:38:43 2020-01-01 00:10:22.000 2020-01-02 03:38:43.000 622 99523 50072.5 5007250 622 99523 50072.5 5007250 -32548 32590 4852.66 485266 -128 127 1.46 146 -623 100 10613 99524 1.87087 298.87087 150.37087 15037.08708 1.87087 298.87088 150.37087 15037.08702 1.87087 298.87087 150.37087 15037.08700 2020-01-01 2020-01-02 2020-01-01 00:10:23 2020-01-02 03:38:44 2020-01-01 00:10:23.000 2020-01-02 03:38:44.000 623 99524 50073.5 5007350 623 99524 50073.5 5007350 -32547 32591 4853.66 485366 -128 123 -0.1 -10 -624 100 10614 99525 1.87387 298.87387 150.37387 15037.38738 1.87387 298.87387 150.37387 15037.38716 1.87387 298.87387 150.37387 15037.38700 2020-01-01 2020-01-02 2020-01-01 00:10:24 2020-01-02 03:38:45 2020-01-01 00:10:24.000 2020-01-02 03:38:45.000 624 99525 50074.5 5007450 624 99525 50074.5 5007450 -32546 32592 4854.66 485466 -127 124 0.9 90 -625 100 10615 99526 1.87687 298.87687 150.37687 15037.68768 1.87687 298.8769 150.37687 15037.68791 1.87687 298.87687 150.37687 15037.68700 2020-01-01 2020-01-02 2020-01-01 00:10:25 2020-01-02 03:38:46 2020-01-01 00:10:25.000 2020-01-02 03:38:46.000 625 99526 50075.5 5007550 625 99526 50075.5 5007550 -32545 32593 4855.66 485566 -126 125 1.9 190 -626 100 10616 99527 1.87987 298.87987 150.37987 15037.98798 1.87987 298.87988 150.37988 15037.9882 1.87987 298.87987 150.37986999999998 15037.98700 2020-01-01 2020-01-02 2020-01-01 00:10:26 2020-01-02 03:38:47 2020-01-01 00:10:26.000 2020-01-02 03:38:47.000 626 99527 50076.5 5007650 626 99527 50076.5 5007650 -32544 32594 4856.66 485666 -125 126 2.9 290 -627 100 10617 99528 1.88288 298.88288 150.38288 15038.28828 1.88288 298.88287 150.38288 15038.28834 1.88288 298.88288 150.38288 15038.28800 2020-01-01 2020-01-02 2020-01-01 00:10:27 2020-01-02 03:38:48 2020-01-01 00:10:27.000 2020-01-02 03:38:48.000 627 99528 50077.5 5007750 627 99528 50077.5 5007750 -32543 32595 4857.66 485766 -124 127 3.9 390 -628 100 10618 99529 1.88588 298.88588 150.38588 15038.58858 1.88588 298.8859 150.38588 15038.58849 1.88588 298.88588 150.38588 15038.58800 2020-01-01 2020-01-02 2020-01-01 00:10:28 2020-01-02 03:38:49 2020-01-01 00:10:28.000 2020-01-02 03:38:49.000 628 99529 50078.5 5007850 628 99529 50078.5 5007850 -32542 32596 4858.66 485866 -128 127 2.34 234 -629 100 10619 99530 1.88888 298.88888 150.38888 15038.88888 1.88888 298.8889 150.38888 15038.88862 1.88888 298.88888 150.38888 15038.88800 2020-01-01 2020-01-02 2020-01-01 00:10:29 2020-01-02 03:38:50 2020-01-01 00:10:29.000 2020-01-02 03:38:50.000 629 99530 50079.5 5007950 629 99530 50079.5 5007950 -32541 32597 4859.66 485966 -128 123 0.78 78 +620 100 10610 99521 1.86186 298.86186 150.36186 15036.18618 1.86186 298.86185 150.36185 15036.18598 1.86186 298.86186 150.36186 15036.186 2020-01-01 2020-01-02 2020-01-01 00:10:20 2020-01-02 03:38:41 2020-01-01 00:10:20.000 2020-01-02 03:38:41.000 620 99521 50070.5 5007050 620 99521 50070.5 5007050 -32550 32588 4850.66 485066 -125 126 2.02 202 +621 100 10611 99522 1.86486 298.86486 150.36486 15036.48648 1.86486 298.86487 150.36486 15036.48673 1.86486 298.86486 150.36486000000002 15036.486 2020-01-01 2020-01-02 2020-01-01 00:10:21 2020-01-02 03:38:42 2020-01-01 00:10:21.000 2020-01-02 03:38:42.000 621 99522 50071.5 5007150 621 99522 50071.5 5007150 -32549 32589 4851.66 485166 -124 127 3.02 302 +622 100 10612 99523 1.86786 298.86786 150.36786 15036.78678 1.86786 298.86786 150.36786 15036.78687 1.86786 298.86786 150.36786 15036.786 2020-01-01 2020-01-02 2020-01-01 00:10:22 2020-01-02 03:38:43 2020-01-01 00:10:22.000 2020-01-02 03:38:43.000 622 99523 50072.5 5007250 622 99523 50072.5 5007250 -32548 32590 4852.66 485266 -128 127 1.46 146 +623 100 10613 99524 1.87087 298.87087 150.37087 15037.08708 1.87087 298.87088 150.37087 15037.08702 1.87087 298.87087 150.37087 15037.087 2020-01-01 2020-01-02 2020-01-01 00:10:23 2020-01-02 03:38:44 2020-01-01 00:10:23.000 2020-01-02 03:38:44.000 623 99524 50073.5 5007350 623 99524 50073.5 5007350 -32547 32591 4853.66 485366 -128 123 -0.1 -10 +624 100 10614 99525 1.87387 298.87387 150.37387 15037.38738 1.87387 298.87387 150.37387 15037.38716 1.87387 298.87387 150.37387 15037.387 2020-01-01 2020-01-02 2020-01-01 00:10:24 2020-01-02 03:38:45 2020-01-01 00:10:24.000 2020-01-02 03:38:45.000 624 99525 50074.5 5007450 624 99525 50074.5 5007450 -32546 32592 4854.66 485466 -127 124 0.9 90 +625 100 10615 99526 1.87687 298.87687 150.37687 15037.68768 1.87687 298.8769 150.37687 15037.68791 1.87687 298.87687 150.37687 15037.687 2020-01-01 2020-01-02 2020-01-01 00:10:25 2020-01-02 03:38:46 2020-01-01 00:10:25.000 2020-01-02 03:38:46.000 625 99526 50075.5 5007550 625 99526 50075.5 5007550 -32545 32593 4855.66 485566 -126 125 1.9 190 +626 100 10616 99527 1.87987 298.87987 150.37987 15037.98798 1.87987 298.87988 150.37988 15037.9882 1.87987 298.87987 150.37986999999998 15037.987 2020-01-01 2020-01-02 2020-01-01 00:10:26 2020-01-02 03:38:47 2020-01-01 00:10:26.000 2020-01-02 03:38:47.000 626 99527 50076.5 5007650 626 99527 50076.5 5007650 -32544 32594 4856.66 485666 -125 126 2.9 290 +627 100 10617 99528 1.88288 298.88288 150.38288 15038.28828 1.88288 298.88287 150.38288 15038.28834 1.88288 298.88288 150.38288 15038.288 2020-01-01 2020-01-02 2020-01-01 00:10:27 2020-01-02 03:38:48 2020-01-01 00:10:27.000 2020-01-02 03:38:48.000 627 99528 50077.5 5007750 627 99528 50077.5 5007750 -32543 32595 4857.66 485766 -124 127 3.9 390 +628 100 10618 99529 1.88588 298.88588 150.38588 15038.58858 1.88588 298.8859 150.38588 15038.58849 1.88588 298.88588 150.38588 15038.588 2020-01-01 2020-01-02 2020-01-01 00:10:28 2020-01-02 03:38:49 2020-01-01 00:10:28.000 2020-01-02 03:38:49.000 628 99529 50078.5 5007850 628 99529 50078.5 5007850 -32542 32596 4858.66 485866 -128 127 2.34 234 +629 100 10619 99530 1.88888 298.88888 150.38888 15038.88888 1.88888 298.8889 150.38888 15038.88862 1.88888 298.88888 150.38888 15038.888 2020-01-01 2020-01-02 2020-01-01 00:10:29 2020-01-02 03:38:50 2020-01-01 00:10:29.000 2020-01-02 03:38:50.000 629 99530 50079.5 5007950 629 99530 50079.5 5007950 -32541 32597 4859.66 485966 -128 123 0.78 78 63 102 10053 99963 0.18918 300.18918 150.18918 15169.1081 0.18918 300.18918 150.18918 15169.10808 0.18918 300.18918 150.18918000000002 15169.10718 2020-01-01 2020-01-02 2020-01-01 00:01:03 2020-01-02 03:46:03 2020-01-01 00:01:03.000 2020-01-02 03:46:03.000 63 99963 50013 5051313 63 99963 50013 5051313 -32506 32429 4592.009900990099 463793 -126 125 -0.7821782178217822 -79 -630 100 10620 99531 1.89189 298.89189 150.39189 15039.18918 1.89189 298.8919 150.39189 15039.18937 1.89189 298.89189 150.39189 15039.18900 2020-01-01 2020-01-02 2020-01-01 00:10:30 2020-01-02 03:38:51 2020-01-01 00:10:30.000 2020-01-02 03:38:51.000 630 99531 50080.5 5008050 630 99531 50080.5 5008050 -32540 32598 4860.66 486066 -127 124 1.78 178 -631 100 10621 99532 1.89489 298.89489 150.39489 15039.48948 1.89489 298.8949 150.39489 15039.48968 1.89489 298.89489 150.39489 15039.48900 2020-01-01 2020-01-02 2020-01-01 00:10:31 2020-01-02 03:38:52 2020-01-01 00:10:31.000 2020-01-02 03:38:52.000 631 99532 50081.5 5008150 631 99532 50081.5 5008150 -32539 32599 4861.66 486166 -126 125 2.78 278 -632 100 10622 99533 1.89789 298.89789 150.39789 15039.78978 1.89789 298.8979 150.39789 15039.78984 1.89789 298.89789 150.39789000000002 15039.78900 2020-01-01 2020-01-02 2020-01-01 00:10:32 2020-01-02 03:38:53 2020-01-01 00:10:32.000 2020-01-02 03:38:53.000 632 99533 50082.5 5008250 632 99533 50082.5 5008250 -32538 32600 4862.66 486266 -125 126 3.78 378 -633 100 10623 99534 1.9009 298.9009 150.4009 15040.09009 1.9009 298.9009 150.40089 15040.08996 1.90090 298.90090 150.4009 15040.09000 2020-01-01 2020-01-02 2020-01-01 00:10:33 2020-01-02 03:38:54 2020-01-01 00:10:33.000 2020-01-02 03:38:54.000 633 99534 50083.5 5008350 633 99534 50083.5 5008350 -32537 32601 4863.66 486366 -124 127 4.78 478 -634 100 10624 99535 1.9039 298.9039 150.4039 15040.39039 1.9039 298.9039 150.4039 15040.39009 1.90390 298.90390 150.4039 15040.39000 2020-01-01 2020-01-02 2020-01-01 00:10:34 2020-01-02 03:38:55 2020-01-01 00:10:34.000 2020-01-02 03:38:55.000 634 99535 50084.5 5008450 634 99535 50084.5 5008450 -32536 32602 4864.66 486466 -128 127 3.22 322 -635 100 10625 99536 1.9069 298.9069 150.4069 15040.69069 1.9069 298.90692 150.4069 15040.69084 1.90690 298.90690 150.4069 15040.69000 2020-01-01 2020-01-02 2020-01-01 00:10:35 2020-01-02 03:38:56 2020-01-01 00:10:35.000 2020-01-02 03:38:56.000 635 99536 50085.5 5008550 635 99536 50085.5 5008550 -32535 32603 4865.66 486566 -128 127 1.66 166 -636 100 10626 99537 1.9099 298.9099 150.4099 15040.99099 1.90991 298.9099 150.40991 15040.99115 1.90990 298.90990 150.4099 15040.99000 2020-01-01 2020-01-02 2020-01-01 00:10:36 2020-01-02 03:38:57 2020-01-01 00:10:36.000 2020-01-02 03:38:57.000 636 99537 50086.5 5008650 636 99537 50086.5 5008650 -32534 32604 4866.66 486666 -128 124 0.1 10 -637 100 10627 99538 1.91291 298.91291 150.41291 15041.29129 1.91291 298.9129 150.41291 15041.29131 1.91291 298.91291 150.41290999999998 15041.29100 2020-01-01 2020-01-02 2020-01-01 00:10:37 2020-01-02 03:38:58 2020-01-01 00:10:37.000 2020-01-02 03:38:58.000 637 99538 50087.5 5008750 637 99538 50087.5 5008750 -32533 32605 4867.66 486766 -127 125 1.1 110 -638 100 10628 99539 1.91591 298.91591 150.41591 15041.59159 1.91591 298.91592 150.41591 15041.59143 1.91591 298.91591 150.41591 15041.59100 2020-01-01 2020-01-02 2020-01-01 00:10:38 2020-01-02 03:38:59 2020-01-01 00:10:38.000 2020-01-02 03:38:59.000 638 99539 50088.5 5008850 638 99539 50088.5 5008850 -32532 32606 4868.66 486866 -126 126 2.1 210 -639 100 10629 99540 1.91891 298.91891 150.41891 15041.89189 1.91891 298.9189 150.41891 15041.89172 1.91891 298.91891 150.41890999999998 15041.89100 2020-01-01 2020-01-02 2020-01-01 00:10:39 2020-01-02 03:39:00 2020-01-01 00:10:39.000 2020-01-02 03:39:00.000 639 99540 50089.5 5008950 639 99540 50089.5 5008950 -32531 32607 4869.66 486966 -125 127 3.1 310 +630 100 10620 99531 1.89189 298.89189 150.39189 15039.18918 1.89189 298.8919 150.39189 15039.18937 1.89189 298.89189 150.39189 15039.189 2020-01-01 2020-01-02 2020-01-01 00:10:30 2020-01-02 03:38:51 2020-01-01 00:10:30.000 2020-01-02 03:38:51.000 630 99531 50080.5 5008050 630 99531 50080.5 5008050 -32540 32598 4860.66 486066 -127 124 1.78 178 +631 100 10621 99532 1.89489 298.89489 150.39489 15039.48948 1.89489 298.8949 150.39489 15039.48968 1.89489 298.89489 150.39489 15039.489 2020-01-01 2020-01-02 2020-01-01 00:10:31 2020-01-02 03:38:52 2020-01-01 00:10:31.000 2020-01-02 03:38:52.000 631 99532 50081.5 5008150 631 99532 50081.5 5008150 -32539 32599 4861.66 486166 -126 125 2.78 278 +632 100 10622 99533 1.89789 298.89789 150.39789 15039.78978 1.89789 298.8979 150.39789 15039.78984 1.89789 298.89789 150.39789000000002 15039.789 2020-01-01 2020-01-02 2020-01-01 00:10:32 2020-01-02 03:38:53 2020-01-01 00:10:32.000 2020-01-02 03:38:53.000 632 99533 50082.5 5008250 632 99533 50082.5 5008250 -32538 32600 4862.66 486266 -125 126 3.78 378 +633 100 10623 99534 1.9009 298.9009 150.4009 15040.09009 1.9009 298.9009 150.40089 15040.08996 1.9009 298.9009 150.4009 15040.09 2020-01-01 2020-01-02 2020-01-01 00:10:33 2020-01-02 03:38:54 2020-01-01 00:10:33.000 2020-01-02 03:38:54.000 633 99534 50083.5 5008350 633 99534 50083.5 5008350 -32537 32601 4863.66 486366 -124 127 4.78 478 +634 100 10624 99535 1.9039 298.9039 150.4039 15040.39039 1.9039 298.9039 150.4039 15040.39009 1.9039 298.9039 150.4039 15040.39 2020-01-01 2020-01-02 2020-01-01 00:10:34 2020-01-02 03:38:55 2020-01-01 00:10:34.000 2020-01-02 03:38:55.000 634 99535 50084.5 5008450 634 99535 50084.5 5008450 -32536 32602 4864.66 486466 -128 127 3.22 322 +635 100 10625 99536 1.9069 298.9069 150.4069 15040.69069 1.9069 298.90692 150.4069 15040.69084 1.9069 298.9069 150.4069 15040.69 2020-01-01 2020-01-02 2020-01-01 00:10:35 2020-01-02 03:38:56 2020-01-01 00:10:35.000 2020-01-02 03:38:56.000 635 99536 50085.5 5008550 635 99536 50085.5 5008550 -32535 32603 4865.66 486566 -128 127 1.66 166 +636 100 10626 99537 1.9099 298.9099 150.4099 15040.99099 1.90991 298.9099 150.40991 15040.99115 1.9099 298.9099 150.4099 15040.99 2020-01-01 2020-01-02 2020-01-01 00:10:36 2020-01-02 03:38:57 2020-01-01 00:10:36.000 2020-01-02 03:38:57.000 636 99537 50086.5 5008650 636 99537 50086.5 5008650 -32534 32604 4866.66 486666 -128 124 0.1 10 +637 100 10627 99538 1.91291 298.91291 150.41291 15041.29129 1.91291 298.9129 150.41291 15041.29131 1.91291 298.91291 150.41290999999998 15041.291 2020-01-01 2020-01-02 2020-01-01 00:10:37 2020-01-02 03:38:58 2020-01-01 00:10:37.000 2020-01-02 03:38:58.000 637 99538 50087.5 5008750 637 99538 50087.5 5008750 -32533 32605 4867.66 486766 -127 125 1.1 110 +638 100 10628 99539 1.91591 298.91591 150.41591 15041.59159 1.91591 298.91592 150.41591 15041.59143 1.91591 298.91591 150.41591 15041.591 2020-01-01 2020-01-02 2020-01-01 00:10:38 2020-01-02 03:38:59 2020-01-01 00:10:38.000 2020-01-02 03:38:59.000 638 99539 50088.5 5008850 638 99539 50088.5 5008850 -32532 32606 4868.66 486866 -126 126 2.1 210 +639 100 10629 99540 1.91891 298.91891 150.41891 15041.89189 1.91891 298.9189 150.41891 15041.89172 1.91891 298.91891 150.41890999999998 15041.891 2020-01-01 2020-01-02 2020-01-01 00:10:39 2020-01-02 03:39:00 2020-01-01 00:10:39.000 2020-01-02 03:39:00.000 639 99540 50089.5 5008950 639 99540 50089.5 5008950 -32531 32607 4869.66 486966 -125 127 3.1 310 64 102 10054 99964 0.19219 300.19219 150.19219 15169.41141 0.19219 300.1922 150.19219 15169.41184 0.19219 300.19219 150.19219 15169.41119 2020-01-01 2020-01-02 2020-01-01 00:01:04 2020-01-02 03:46:04 2020-01-01 00:01:04.000 2020-01-02 03:46:04.000 64 99964 50014 5051414 64 99964 50014 5051414 -32505 32430 4593.009900990099 463894 -125 126 0.21782178217821782 22 -640 100 10630 99541 1.92192 298.92192 150.42192 15042.19219 1.92192 298.92194 150.42192 15042.19232 1.92192 298.92192 150.42192 15042.19200 2020-01-01 2020-01-02 2020-01-01 00:10:40 2020-01-02 03:39:01 2020-01-01 00:10:40.000 2020-01-02 03:39:01.000 640 99541 50090.5 5009050 640 99541 50090.5 5009050 -32530 32608 4870.66 487066 -128 127 1.54 154 -641 100 10631 99542 1.92492 298.92492 150.42492 15042.49249 1.92492 298.92493 150.42492 15042.49265 1.92492 298.92492 150.42492000000001 15042.49200 2020-01-01 2020-01-02 2020-01-01 00:10:41 2020-01-02 03:39:02 2020-01-01 00:10:41.000 2020-01-02 03:39:02.000 641 99542 50091.5 5009150 641 99542 50091.5 5009150 -32529 32609 4871.66 487166 -128 127 -0.02 -2 -642 100 10632 99543 1.92792 298.92792 150.42792 15042.79279 1.92792 298.92792 150.42792 15042.79278 1.92792 298.92792 150.42792 15042.79200 2020-01-01 2020-01-02 2020-01-01 00:10:42 2020-01-02 03:39:03 2020-01-01 00:10:42.000 2020-01-02 03:39:03.000 642 99543 50092.5 5009250 642 99543 50092.5 5009250 -32528 32610 4872.66 487266 -128 123 -1.58 -158 -643 100 10633 99544 1.93093 298.93093 150.43093 15043.09309 1.93093 298.93094 150.43092 15043.0929 1.93093 298.93093 150.43093000000002 15043.09300 2020-01-01 2020-01-02 2020-01-01 00:10:43 2020-01-02 03:39:04 2020-01-01 00:10:43.000 2020-01-02 03:39:04.000 643 99544 50093.5 5009350 643 99544 50093.5 5009350 -32527 32611 4873.66 487366 -127 124 -0.58 -58 -644 100 10634 99545 1.93393 298.93393 150.43393 15043.39339 1.93393 298.93393 150.43393 15043.39319 1.93393 298.93393 150.43393 15043.39300 2020-01-01 2020-01-02 2020-01-01 00:10:44 2020-01-02 03:39:05 2020-01-01 00:10:44.000 2020-01-02 03:39:05.000 644 99545 50094.5 5009450 644 99545 50094.5 5009450 -32526 32612 4874.66 487466 -126 125 0.42 42 -645 100 10635 99546 1.93693 298.93693 150.43693 15043.69369 1.93693 298.93695 150.43693 15043.69379 1.93693 298.93693 150.43693 15043.69300 2020-01-01 2020-01-02 2020-01-01 00:10:45 2020-01-02 03:39:06 2020-01-01 00:10:45.000 2020-01-02 03:39:06.000 645 99546 50095.5 5009550 645 99546 50095.5 5009550 -32525 32613 4875.66 487566 -125 126 1.42 142 -646 100 10636 99547 1.93993 298.93993 150.43993 15043.99399 1.93994 298.93994 150.43994 15043.99412 1.93993 298.93993 150.43993 15043.99300 2020-01-01 2020-01-02 2020-01-01 00:10:46 2020-01-02 03:39:07 2020-01-01 00:10:46.000 2020-01-02 03:39:07.000 646 99547 50096.5 5009650 646 99547 50096.5 5009650 -32524 32614 4876.66 487666 -124 127 2.42 242 -647 100 10637 99548 1.94294 298.94294 150.44294 15044.29429 1.94294 298.94293 150.44294 15044.29425 1.94294 298.94294 150.44294 15044.29400 2020-01-01 2020-01-02 2020-01-01 00:10:47 2020-01-02 03:39:08 2020-01-01 00:10:47.000 2020-01-02 03:39:08.000 647 99548 50097.5 5009750 647 99548 50097.5 5009750 -32523 32615 4877.66 487766 -128 127 0.86 86 -648 100 10638 99549 1.94594 298.94594 150.44594 15044.59459 1.94594 298.94595 150.44595 15044.595 1.94594 298.94594 150.44593999999998 15044.59400 2020-01-01 2020-01-02 2020-01-01 00:10:48 2020-01-02 03:39:09 2020-01-01 00:10:48.000 2020-01-02 03:39:09.000 648 99549 50098.5 5009850 648 99549 50098.5 5009850 -32522 32616 4878.66 487866 -128 123 -0.7 -70 -649 100 10639 99550 1.94894 298.94894 150.44894 15044.89489 1.94894 298.94894 150.44894 15044.89467 1.94894 298.94894 150.44894 15044.89400 2020-01-01 2020-01-02 2020-01-01 00:10:49 2020-01-02 03:39:10 2020-01-01 00:10:49.000 2020-01-02 03:39:10.000 649 99550 50099.5 5009950 649 99550 50099.5 5009950 -32521 32617 4879.66 487966 -127 124 0.3 30 +640 100 10630 99541 1.92192 298.92192 150.42192 15042.19219 1.92192 298.92194 150.42192 15042.19232 1.92192 298.92192 150.42192 15042.192 2020-01-01 2020-01-02 2020-01-01 00:10:40 2020-01-02 03:39:01 2020-01-01 00:10:40.000 2020-01-02 03:39:01.000 640 99541 50090.5 5009050 640 99541 50090.5 5009050 -32530 32608 4870.66 487066 -128 127 1.54 154 +641 100 10631 99542 1.92492 298.92492 150.42492 15042.49249 1.92492 298.92493 150.42492 15042.49265 1.92492 298.92492 150.42492000000001 15042.492 2020-01-01 2020-01-02 2020-01-01 00:10:41 2020-01-02 03:39:02 2020-01-01 00:10:41.000 2020-01-02 03:39:02.000 641 99542 50091.5 5009150 641 99542 50091.5 5009150 -32529 32609 4871.66 487166 -128 127 -0.02 -2 +642 100 10632 99543 1.92792 298.92792 150.42792 15042.79279 1.92792 298.92792 150.42792 15042.79278 1.92792 298.92792 150.42792 15042.792 2020-01-01 2020-01-02 2020-01-01 00:10:42 2020-01-02 03:39:03 2020-01-01 00:10:42.000 2020-01-02 03:39:03.000 642 99543 50092.5 5009250 642 99543 50092.5 5009250 -32528 32610 4872.66 487266 -128 123 -1.58 -158 +643 100 10633 99544 1.93093 298.93093 150.43093 15043.09309 1.93093 298.93094 150.43092 15043.0929 1.93093 298.93093 150.43093000000002 15043.093 2020-01-01 2020-01-02 2020-01-01 00:10:43 2020-01-02 03:39:04 2020-01-01 00:10:43.000 2020-01-02 03:39:04.000 643 99544 50093.5 5009350 643 99544 50093.5 5009350 -32527 32611 4873.66 487366 -127 124 -0.58 -58 +644 100 10634 99545 1.93393 298.93393 150.43393 15043.39339 1.93393 298.93393 150.43393 15043.39319 1.93393 298.93393 150.43393 15043.393 2020-01-01 2020-01-02 2020-01-01 00:10:44 2020-01-02 03:39:05 2020-01-01 00:10:44.000 2020-01-02 03:39:05.000 644 99545 50094.5 5009450 644 99545 50094.5 5009450 -32526 32612 4874.66 487466 -126 125 0.42 42 +645 100 10635 99546 1.93693 298.93693 150.43693 15043.69369 1.93693 298.93695 150.43693 15043.69379 1.93693 298.93693 150.43693 15043.693 2020-01-01 2020-01-02 2020-01-01 00:10:45 2020-01-02 03:39:06 2020-01-01 00:10:45.000 2020-01-02 03:39:06.000 645 99546 50095.5 5009550 645 99546 50095.5 5009550 -32525 32613 4875.66 487566 -125 126 1.42 142 +646 100 10636 99547 1.93993 298.93993 150.43993 15043.99399 1.93994 298.93994 150.43994 15043.99412 1.93993 298.93993 150.43993 15043.993 2020-01-01 2020-01-02 2020-01-01 00:10:46 2020-01-02 03:39:07 2020-01-01 00:10:46.000 2020-01-02 03:39:07.000 646 99547 50096.5 5009650 646 99547 50096.5 5009650 -32524 32614 4876.66 487666 -124 127 2.42 242 +647 100 10637 99548 1.94294 298.94294 150.44294 15044.29429 1.94294 298.94293 150.44294 15044.29425 1.94294 298.94294 150.44294 15044.294 2020-01-01 2020-01-02 2020-01-01 00:10:47 2020-01-02 03:39:08 2020-01-01 00:10:47.000 2020-01-02 03:39:08.000 647 99548 50097.5 5009750 647 99548 50097.5 5009750 -32523 32615 4877.66 487766 -128 127 0.86 86 +648 100 10638 99549 1.94594 298.94594 150.44594 15044.59459 1.94594 298.94595 150.44595 15044.595 1.94594 298.94594 150.44593999999998 15044.594 2020-01-01 2020-01-02 2020-01-01 00:10:48 2020-01-02 03:39:09 2020-01-01 00:10:48.000 2020-01-02 03:39:09.000 648 99549 50098.5 5009850 648 99549 50098.5 5009850 -32522 32616 4878.66 487866 -128 123 -0.7 -70 +649 100 10639 99550 1.94894 298.94894 150.44894 15044.89489 1.94894 298.94894 150.44894 15044.89467 1.94894 298.94894 150.44894 15044.894 2020-01-01 2020-01-02 2020-01-01 00:10:49 2020-01-02 03:39:10 2020-01-01 00:10:49.000 2020-01-02 03:39:10.000 649 99550 50099.5 5009950 649 99550 50099.5 5009950 -32521 32617 4879.66 487966 -127 124 0.3 30 65 102 10055 99965 0.19519 300.19519 150.19519 15169.71471 0.19519 300.1952 150.19519 15169.71448 0.19519 300.19519 150.19519 15169.71419 2020-01-01 2020-01-02 2020-01-01 00:01:05 2020-01-02 03:46:05 2020-01-01 00:01:05.000 2020-01-02 03:46:05.000 65 99965 50015 5051515 65 99965 50015 5051515 -32504 32431 4594.009900990099 463995 -124 127 1.2178217821782178 123 -650 100 10640 99551 1.95195 298.95195 150.45195 15045.19519 1.95195 298.95197 150.45195 15045.19525 1.95195 298.95195 150.45195 15045.19500 2020-01-01 2020-01-02 2020-01-01 00:10:50 2020-01-02 03:39:11 2020-01-01 00:10:50.000 2020-01-02 03:39:11.000 650 99551 50100.5 5010050 650 99551 50100.5 5010050 -32520 32618 4880.66 488066 -126 125 1.3 130 -651 100 10641 99552 1.95495 298.95495 150.45495 15045.49549 1.95495 298.95496 150.45495 15045.49558 1.95495 298.95495 150.45495 15045.49500 2020-01-01 2020-01-02 2020-01-01 00:10:51 2020-01-02 03:39:12 2020-01-01 00:10:51.000 2020-01-02 03:39:12.000 651 99552 50101.5 5010150 651 99552 50101.5 5010150 -32519 32619 4881.66 488166 -125 126 2.3 230 -652 100 10642 99553 1.95795 298.95795 150.45795 15045.79579 1.95795 298.95795 150.45795 15045.79572 1.95795 298.95795 150.45795 15045.79500 2020-01-01 2020-01-02 2020-01-01 00:10:52 2020-01-02 03:39:13 2020-01-01 00:10:52.000 2020-01-02 03:39:13.000 652 99553 50102.5 5010250 652 99553 50102.5 5010250 -32518 32620 4882.66 488266 -124 127 3.3 330 -653 100 10643 99554 1.96096 298.96096 150.46096 15046.09609 1.96096 298.96097 150.46096 15046.09647 1.96096 298.96096 150.46096 15046.09600 2020-01-01 2020-01-02 2020-01-01 00:10:53 2020-01-02 03:39:14 2020-01-01 00:10:53.000 2020-01-02 03:39:14.000 653 99554 50103.5 5010350 653 99554 50103.5 5010350 -32517 32621 4883.66 488366 -128 127 1.74 174 -654 100 10644 99555 1.96396 298.96396 150.46396 15046.39639 1.96396 298.96396 150.46396 15046.39613 1.96396 298.96396 150.46396000000001 15046.39600 2020-01-01 2020-01-02 2020-01-01 00:10:54 2020-01-02 03:39:15 2020-01-01 00:10:54.000 2020-01-02 03:39:15.000 654 99555 50104.5 5010450 654 99555 50104.5 5010450 -32516 32622 4884.66 488466 -128 123 0.18 18 -655 100 10645 99556 1.96696 298.96696 150.46696 15046.69669 1.96696 298.96698 150.46696 15046.69676 1.96696 298.96696 150.46696 15046.69600 2020-01-01 2020-01-02 2020-01-01 00:10:55 2020-01-02 03:39:16 2020-01-01 00:10:55.000 2020-01-02 03:39:16.000 655 99556 50105.5 5010550 655 99556 50105.5 5010550 -32515 32623 4885.66 488566 -127 124 1.18 118 -656 100 10646 99557 1.96996 298.96996 150.46996 15046.99699 1.96997 298.96997 150.46997 15046.99706 1.96996 298.96996 150.46996 15046.99600 2020-01-01 2020-01-02 2020-01-01 00:10:56 2020-01-02 03:39:17 2020-01-01 00:10:56.000 2020-01-02 03:39:17.000 656 99557 50106.5 5010650 656 99557 50106.5 5010650 -32514 32624 4886.66 488666 -126 125 2.18 218 -657 100 10647 99558 1.97297 298.97297 150.47297 15047.29729 1.97297 298.97296 150.47297 15047.29735 1.97297 298.97297 150.47297 15047.29700 2020-01-01 2020-01-02 2020-01-01 00:10:57 2020-01-02 03:39:18 2020-01-01 00:10:57.000 2020-01-02 03:39:18.000 657 99558 50107.5 5010750 657 99558 50107.5 5010750 -32513 32625 4887.66 488766 -125 126 3.18 318 -658 100 10648 99559 1.97597 298.97597 150.47597 15047.59759 1.97597 298.97598 150.47597 15047.59794 1.97597 298.97597 150.47597 15047.59700 2020-01-01 2020-01-02 2020-01-01 00:10:58 2020-01-02 03:39:19 2020-01-01 00:10:58.000 2020-01-02 03:39:19.000 658 99559 50108.5 5010850 658 99559 50108.5 5010850 -32512 32626 4888.66 488866 -124 127 4.18 418 -659 100 10649 99560 1.97897 298.97897 150.47897 15047.89789 1.97897 298.97897 150.47897 15047.8976 1.97897 298.97897 150.47897 15047.89700 2020-01-01 2020-01-02 2020-01-01 00:10:59 2020-01-02 03:39:20 2020-01-01 00:10:59.000 2020-01-02 03:39:20.000 659 99560 50109.5 5010950 659 99560 50109.5 5010950 -32511 32627 4889.66 488966 -128 127 2.62 262 +650 100 10640 99551 1.95195 298.95195 150.45195 15045.19519 1.95195 298.95197 150.45195 15045.19525 1.95195 298.95195 150.45195 15045.195 2020-01-01 2020-01-02 2020-01-01 00:10:50 2020-01-02 03:39:11 2020-01-01 00:10:50.000 2020-01-02 03:39:11.000 650 99551 50100.5 5010050 650 99551 50100.5 5010050 -32520 32618 4880.66 488066 -126 125 1.3 130 +651 100 10641 99552 1.95495 298.95495 150.45495 15045.49549 1.95495 298.95496 150.45495 15045.49558 1.95495 298.95495 150.45495 15045.495 2020-01-01 2020-01-02 2020-01-01 00:10:51 2020-01-02 03:39:12 2020-01-01 00:10:51.000 2020-01-02 03:39:12.000 651 99552 50101.5 5010150 651 99552 50101.5 5010150 -32519 32619 4881.66 488166 -125 126 2.3 230 +652 100 10642 99553 1.95795 298.95795 150.45795 15045.79579 1.95795 298.95795 150.45795 15045.79572 1.95795 298.95795 150.45795 15045.795 2020-01-01 2020-01-02 2020-01-01 00:10:52 2020-01-02 03:39:13 2020-01-01 00:10:52.000 2020-01-02 03:39:13.000 652 99553 50102.5 5010250 652 99553 50102.5 5010250 -32518 32620 4882.66 488266 -124 127 3.3 330 +653 100 10643 99554 1.96096 298.96096 150.46096 15046.09609 1.96096 298.96097 150.46096 15046.09647 1.96096 298.96096 150.46096 15046.096 2020-01-01 2020-01-02 2020-01-01 00:10:53 2020-01-02 03:39:14 2020-01-01 00:10:53.000 2020-01-02 03:39:14.000 653 99554 50103.5 5010350 653 99554 50103.5 5010350 -32517 32621 4883.66 488366 -128 127 1.74 174 +654 100 10644 99555 1.96396 298.96396 150.46396 15046.39639 1.96396 298.96396 150.46396 15046.39613 1.96396 298.96396 150.46396000000001 15046.396 2020-01-01 2020-01-02 2020-01-01 00:10:54 2020-01-02 03:39:15 2020-01-01 00:10:54.000 2020-01-02 03:39:15.000 654 99555 50104.5 5010450 654 99555 50104.5 5010450 -32516 32622 4884.66 488466 -128 123 0.18 18 +655 100 10645 99556 1.96696 298.96696 150.46696 15046.69669 1.96696 298.96698 150.46696 15046.69676 1.96696 298.96696 150.46696 15046.696 2020-01-01 2020-01-02 2020-01-01 00:10:55 2020-01-02 03:39:16 2020-01-01 00:10:55.000 2020-01-02 03:39:16.000 655 99556 50105.5 5010550 655 99556 50105.5 5010550 -32515 32623 4885.66 488566 -127 124 1.18 118 +656 100 10646 99557 1.96996 298.96996 150.46996 15046.99699 1.96997 298.96997 150.46997 15046.99706 1.96996 298.96996 150.46996 15046.996 2020-01-01 2020-01-02 2020-01-01 00:10:56 2020-01-02 03:39:17 2020-01-01 00:10:56.000 2020-01-02 03:39:17.000 656 99557 50106.5 5010650 656 99557 50106.5 5010650 -32514 32624 4886.66 488666 -126 125 2.18 218 +657 100 10647 99558 1.97297 298.97297 150.47297 15047.29729 1.97297 298.97296 150.47297 15047.29735 1.97297 298.97297 150.47297 15047.297 2020-01-01 2020-01-02 2020-01-01 00:10:57 2020-01-02 03:39:18 2020-01-01 00:10:57.000 2020-01-02 03:39:18.000 657 99558 50107.5 5010750 657 99558 50107.5 5010750 -32513 32625 4887.66 488766 -125 126 3.18 318 +658 100 10648 99559 1.97597 298.97597 150.47597 15047.59759 1.97597 298.97598 150.47597 15047.59794 1.97597 298.97597 150.47597 15047.597 2020-01-01 2020-01-02 2020-01-01 00:10:58 2020-01-02 03:39:19 2020-01-01 00:10:58.000 2020-01-02 03:39:19.000 658 99559 50108.5 5010850 658 99559 50108.5 5010850 -32512 32626 4888.66 488866 -124 127 4.18 418 +659 100 10649 99560 1.97897 298.97897 150.47897 15047.89789 1.97897 298.97897 150.47897 15047.8976 1.97897 298.97897 150.47897 15047.897 2020-01-01 2020-01-02 2020-01-01 00:10:59 2020-01-02 03:39:20 2020-01-01 00:10:59.000 2020-01-02 03:39:20.000 659 99560 50109.5 5010950 659 99560 50109.5 5010950 -32511 32627 4889.66 488966 -128 127 2.62 262 66 102 10056 99966 0.19819 300.19819 150.19819 15170.01801 0.19819 300.1982 150.19819 15170.01808 0.19819 300.19819 150.19819 15170.01719 2020-01-01 2020-01-02 2020-01-01 00:01:06 2020-01-02 03:46:06 2020-01-01 00:01:06.000 2020-01-02 03:46:06.000 66 99966 50016 5051616 66 99966 50016 5051616 -32503 32432 4595.009900990099 464096 -128 127 -0.31683168316831684 -32 -660 100 10650 99561 1.98198 298.98198 150.48198 15048.19819 1.98198 298.982 150.48198 15048.19822 1.98198 298.98198 150.48198 15048.19800 2020-01-01 2020-01-02 2020-01-01 00:11:00 2020-01-02 03:39:21 2020-01-01 00:11:00.000 2020-01-02 03:39:21.000 660 99561 50110.5 5011050 660 99561 50110.5 5011050 -32510 32628 4890.66 489066 -128 127 1.06 106 -661 100 10651 99562 1.98498 298.98498 150.48498 15048.49849 1.98498 298.985 150.48498 15048.49853 1.98498 298.98498 150.48498 15048.49800 2020-01-01 2020-01-02 2020-01-01 00:11:01 2020-01-02 03:39:22 2020-01-01 00:11:01.000 2020-01-02 03:39:22.000 661 99562 50111.5 5011150 661 99562 50111.5 5011150 -32509 32629 4891.66 489166 -128 124 -0.5 -50 -662 100 10652 99563 1.98798 298.98798 150.48798 15048.79879 1.98798 298.98798 150.48798 15048.79882 1.98798 298.98798 150.48798 15048.79800 2020-01-01 2020-01-02 2020-01-01 00:11:02 2020-01-02 03:39:23 2020-01-01 00:11:02.000 2020-01-02 03:39:23.000 662 99563 50112.5 5011250 662 99563 50112.5 5011250 -32508 32630 4892.66 489266 -127 125 0.5 50 -663 100 10653 99564 1.99099 298.99099 150.49099 15049.09909 1.99099 298.991 150.49099 15049.09942 1.99099 298.99099 150.49099 15049.09900 2020-01-01 2020-01-02 2020-01-01 00:11:03 2020-01-02 03:39:24 2020-01-01 00:11:03.000 2020-01-02 03:39:24.000 663 99564 50113.5 5011350 663 99564 50113.5 5011350 -32507 32631 4893.66 489366 -126 126 1.5 150 -664 100 10654 99565 1.99399 298.99399 150.49399 15049.39939 1.99399 298.994 150.49399 15049.39911 1.99399 298.99399 150.49399 15049.39900 2020-01-01 2020-01-02 2020-01-01 00:11:04 2020-01-02 03:39:25 2020-01-01 00:11:04.000 2020-01-02 03:39:25.000 664 99565 50114.5 5011450 664 99565 50114.5 5011450 -32506 32632 4894.66 489466 -125 127 2.5 250 -665 100 10655 99566 1.99699 298.99699 150.49699 15049.69969 1.99699 298.997 150.49699 15049.6997 1.99699 298.99699 150.49699 15049.69900 2020-01-01 2020-01-02 2020-01-01 00:11:05 2020-01-02 03:39:26 2020-01-01 00:11:05.000 2020-01-02 03:39:26.000 665 99566 50115.5 5011550 665 99566 50115.5 5011550 -32505 32633 4895.66 489566 -128 127 0.94 94 -666 100 10656 99567 2 299 150.5 15050 2 299 150.5 15050 2.00000 299.00000 150.5 15050.00000 2020-01-01 2020-01-02 2020-01-01 00:11:06 2020-01-02 03:39:27 2020-01-01 00:11:06.000 2020-01-02 03:39:27.000 666 99567 50116.5 5011650 666 99567 50116.5 5011650 -32504 32634 4896.66 489666 -128 127 -0.62 -62 -667 100 10657 99568 2.003 299.003 150.503 15050.3003 2.003 299.003 150.503 15050.30029 2.00300 299.00300 150.503 15050.30000 2020-01-01 2020-01-02 2020-01-01 00:11:07 2020-01-02 03:39:28 2020-01-01 00:11:07.000 2020-01-02 03:39:28.000 667 99568 50117.5 5011750 667 99568 50117.5 5011750 -32503 32635 4897.66 489766 -128 123 -2.18 -218 -668 100 10658 99569 2.006 299.006 150.506 15050.6006 2.006 299.006 150.506 15050.60089 2.00600 299.00600 150.506 15050.60000 2020-01-01 2020-01-02 2020-01-01 00:11:08 2020-01-02 03:39:29 2020-01-01 00:11:08.000 2020-01-02 03:39:29.000 668 99569 50118.5 5011850 668 99569 50118.5 5011850 -32502 32636 4898.66 489866 -127 124 -1.18 -118 -669 100 10659 99570 2.009 299.009 150.509 15050.9009 2.009 299.009 150.509 15050.90057 2.00900 299.00900 150.509 15050.90000 2020-01-01 2020-01-02 2020-01-01 00:11:09 2020-01-02 03:39:30 2020-01-01 00:11:09.000 2020-01-02 03:39:30.000 669 99570 50119.5 5011950 669 99570 50119.5 5011950 -32501 32637 4899.66 489966 -126 125 -0.18 -18 -67 102 10057 99967 0.2012 300.2012 150.2012 15170.32132 0.2012 300.2012 150.2012 15170.32142 0.20120 300.20120 150.2012 15170.32120 2020-01-01 2020-01-02 2020-01-01 00:01:07 2020-01-02 03:46:07 2020-01-01 00:01:07.000 2020-01-02 03:46:07.000 67 99967 50017 5051717 67 99967 50017 5051717 -32502 32433 4596.009900990099 464197 -128 127 -1.8514851485148516 -187 -670 100 10660 99571 2.01201 299.01201 150.51201 15051.2012 2.01201 299.01202 150.51201 15051.20117 2.01201 299.01201 150.51201 15051.20100 2020-01-01 2020-01-02 2020-01-01 00:11:10 2020-01-02 03:39:31 2020-01-01 00:11:10.000 2020-01-02 03:39:31.000 670 99571 50120.5 5012050 670 99571 50120.5 5012050 -32500 32638 4900.66 490066 -125 126 0.82 82 -671 100 10661 99572 2.01501 299.01501 150.51501 15051.5015 2.01501 299.015 150.51501 15051.50146 2.01501 299.01501 150.51501 15051.50100 2020-01-01 2020-01-02 2020-01-01 00:11:11 2020-01-02 03:39:32 2020-01-01 00:11:11.000 2020-01-02 03:39:32.000 671 99572 50121.5 5012150 671 99572 50121.5 5012150 -32499 32639 4901.66 490166 -124 127 1.82 182 -672 100 10662 99573 2.01801 299.01801 150.51801 15051.8018 2.01801 299.018 150.51801 15051.80176 2.01801 299.01801 150.51801 15051.80100 2020-01-01 2020-01-02 2020-01-01 00:11:12 2020-01-02 03:39:33 2020-01-01 00:11:12.000 2020-01-02 03:39:33.000 672 99573 50122.5 5012250 672 99573 50122.5 5012250 -32498 32640 4902.66 490266 -128 127 0.26 26 -673 100 10663 99574 2.02102 299.02102 150.52102 15052.1021 2.02102 299.02103 150.52102 15052.1024 2.02102 299.02102 150.52102000000002 15052.10200 2020-01-01 2020-01-02 2020-01-01 00:11:13 2020-01-02 03:39:34 2020-01-01 00:11:13.000 2020-01-02 03:39:34.000 673 99574 50123.5 5012350 673 99574 50123.5 5012350 -32497 32641 4903.66 490366 -128 123 -1.3 -130 -674 100 10664 99575 2.02402 299.02402 150.52402 15052.4024 2.02402 299.02402 150.52402 15052.40204 2.02402 299.02402 150.52402 15052.40200 2020-01-01 2020-01-02 2020-01-01 00:11:14 2020-01-02 03:39:35 2020-01-01 00:11:14.000 2020-01-02 03:39:35.000 674 99575 50124.5 5012450 674 99575 50124.5 5012450 -32496 32642 4904.66 490466 -127 124 -0.3 -30 -675 100 10665 99576 2.02702 299.02702 150.52702 15052.7027 2.02702 299.02704 150.52702 15052.70264 2.02702 299.02702 150.52702 15052.70200 2020-01-01 2020-01-02 2020-01-01 00:11:15 2020-01-02 03:39:36 2020-01-01 00:11:15.000 2020-01-02 03:39:36.000 675 99576 50125.5 5012550 675 99576 50125.5 5012550 -32495 32643 4905.66 490566 -126 125 0.7 70 -676 100 10666 99577 2.03003 299.03003 150.53003 15053.003 2.03003 299.03003 150.53002 15053.00293 2.03003 299.03003 150.53003 15053.00300 2020-01-01 2020-01-02 2020-01-01 00:11:16 2020-01-02 03:39:37 2020-01-01 00:11:16.000 2020-01-02 03:39:37.000 676 99577 50126.5 5012650 676 99577 50126.5 5012650 -32494 32644 4906.66 490666 -125 126 1.7 170 -677 100 10667 99578 2.03303 299.03303 150.53303 15053.3033 2.03303 299.03302 150.53303 15053.30323 2.03303 299.03303 150.53303 15053.30300 2020-01-01 2020-01-02 2020-01-01 00:11:17 2020-01-02 03:39:38 2020-01-01 00:11:17.000 2020-01-02 03:39:38.000 677 99578 50127.5 5012750 677 99578 50127.5 5012750 -32493 32645 4907.66 490766 -124 127 2.7 270 -678 100 10668 99579 2.03603 299.03603 150.53603 15053.6036 2.03603 299.03604 150.53603 15053.60387 2.03603 299.03603 150.53602999999998 15053.60300 2020-01-01 2020-01-02 2020-01-01 00:11:18 2020-01-02 03:39:39 2020-01-01 00:11:18.000 2020-01-02 03:39:39.000 678 99579 50128.5 5012850 678 99579 50128.5 5012850 -32492 32646 4908.66 490866 -128 127 1.14 114 -679 100 10669 99580 2.03903 299.03903 150.53903 15053.9039 2.03903 299.03903 150.53903 15053.90351 2.03903 299.03903 150.53903 15053.90300 2020-01-01 2020-01-02 2020-01-01 00:11:19 2020-01-02 03:39:40 2020-01-01 00:11:19.000 2020-01-02 03:39:40.000 679 99580 50129.5 5012950 679 99580 50129.5 5012950 -32491 32647 4909.66 490966 -128 123 -0.42 -42 -68 102 10058 99968 0.2042 300.2042 150.2042 15170.62462 0.2042 300.2042 150.2042 15170.62457 0.20420 300.20420 150.20420000000001 15170.62420 2020-01-01 2020-01-02 2020-01-01 00:01:08 2020-01-02 03:46:08 2020-01-01 00:01:08.000 2020-01-02 03:46:08.000 68 99968 50018 5051818 68 99968 50018 5051818 -32501 32434 4597.009900990099 464298 -128 124 -3.386138613861386 -342 -680 100 10670 99581 2.04204 299.04204 150.54204 15054.2042 2.04204 299.04205 150.54204 15054.20426 2.04204 299.04204 150.54204 15054.20400 2020-01-01 2020-01-02 2020-01-01 00:11:20 2020-01-02 03:39:41 2020-01-01 00:11:20.000 2020-01-02 03:39:41.000 680 99581 50130.5 5013050 680 99581 50130.5 5013050 -32490 32648 4910.66 491066 -127 124 0.58 58 -681 100 10671 99582 2.04504 299.04504 150.54504 15054.5045 2.04504 299.04504 150.54504 15054.5044 2.04504 299.04504 150.54504 15054.50400 2020-01-01 2020-01-02 2020-01-01 00:11:21 2020-01-02 03:39:42 2020-01-01 00:11:21.000 2020-01-02 03:39:42.000 681 99582 50131.5 5013150 681 99582 50131.5 5013150 -32489 32649 4911.66 491166 -126 125 1.58 158 -682 100 10672 99583 2.04804 299.04804 150.54804 15054.8048 2.04804 299.04803 150.54804 15054.80474 2.04804 299.04804 150.54804000000001 15054.80400 2020-01-01 2020-01-02 2020-01-01 00:11:22 2020-01-02 03:39:43 2020-01-01 00:11:22.000 2020-01-02 03:39:43.000 682 99583 50132.5 5013250 682 99583 50132.5 5013250 -32488 32650 4912.66 491266 -125 126 2.58 258 -683 100 10673 99584 2.05105 299.05105 150.55105 15055.1051 2.05105 299.05106 150.55105 15055.10533 2.05105 299.05105 150.55105 15055.10500 2020-01-01 2020-01-02 2020-01-01 00:11:23 2020-01-02 03:39:44 2020-01-01 00:11:23.000 2020-01-02 03:39:44.000 683 99584 50133.5 5013350 683 99584 50133.5 5013350 -32487 32651 4913.66 491366 -124 127 3.58 358 -684 100 10674 99585 2.05405 299.05405 150.55405 15055.4054 2.05405 299.05405 150.55404 15055.40498 2.05405 299.05405 150.55405000000002 15055.40500 2020-01-01 2020-01-02 2020-01-01 00:11:24 2020-01-02 03:39:45 2020-01-01 00:11:24.000 2020-01-02 03:39:45.000 684 99585 50134.5 5013450 684 99585 50134.5 5013450 -32486 32652 4914.66 491466 -128 127 2.02 202 -685 100 10675 99586 2.05705 299.05705 150.55705 15055.7057 2.05705 299.05707 150.55705 15055.70573 2.05705 299.05705 150.55705 15055.70500 2020-01-01 2020-01-02 2020-01-01 00:11:25 2020-01-02 03:39:46 2020-01-01 00:11:25.000 2020-01-02 03:39:46.000 685 99586 50135.5 5013550 685 99586 50135.5 5013550 -32485 32653 4915.66 491566 -128 127 0.46 46 -686 100 10676 99587 2.06006 299.06006 150.56006 15056.006 2.06006 299.06006 150.56005 15056.00587 2.06006 299.06006 150.56006 15056.00600 2020-01-01 2020-01-02 2020-01-01 00:11:26 2020-01-02 03:39:47 2020-01-01 00:11:26.000 2020-01-02 03:39:47.000 686 99587 50136.5 5013650 686 99587 50136.5 5013650 -32484 32654 4916.66 491666 -128 124 -1.1 -110 -687 100 10677 99588 2.06306 299.06306 150.56306 15056.3063 2.06306 299.06305 150.56306 15056.30621 2.06306 299.06306 150.56306 15056.30600 2020-01-01 2020-01-02 2020-01-01 00:11:27 2020-01-02 03:39:48 2020-01-01 00:11:27.000 2020-01-02 03:39:48.000 687 99588 50137.5 5013750 687 99588 50137.5 5013750 -32483 32655 4917.66 491766 -127 125 -0.1 -10 -688 100 10678 99589 2.06606 299.06606 150.56606 15056.6066 2.06606 299.06607 150.56606 15056.60681 2.06606 299.06606 150.56606 15056.60600 2020-01-01 2020-01-02 2020-01-01 00:11:28 2020-01-02 03:39:49 2020-01-01 00:11:28.000 2020-01-02 03:39:49.000 688 99589 50138.5 5013850 688 99589 50138.5 5013850 -32482 32656 4918.66 491866 -126 126 0.9 90 -689 100 10679 99590 2.06906 299.06906 150.56906 15056.9069 2.06906 299.06906 150.56907 15056.9071 2.06906 299.06906 150.56906 15056.90600 2020-01-01 2020-01-02 2020-01-01 00:11:29 2020-01-02 03:39:50 2020-01-01 00:11:29.000 2020-01-02 03:39:50.000 689 99590 50139.5 5013950 689 99590 50139.5 5013950 -32481 32657 4919.66 491966 -125 127 1.9 190 -69 102 10059 99969 0.2072 300.2072 150.2072 15170.92792 0.2072 300.2072 150.20721 15170.92832 0.20720 300.20720 150.2072 15170.92720 2020-01-01 2020-01-02 2020-01-01 00:01:09 2020-01-02 03:46:09 2020-01-01 00:01:09.000 2020-01-02 03:46:09.000 69 99969 50019 5051919 69 99969 50019 5051919 -32500 32435 4598.009900990099 464399 -127 125 -2.386138613861386 -241 -690 100 10680 99591 2.07207 299.07207 150.57207 15057.2072 2.07207 299.07208 150.57207 15057.2072 2.07207 299.07207 150.57207 15057.20700 2020-01-01 2020-01-02 2020-01-01 00:11:30 2020-01-02 03:39:51 2020-01-01 00:11:30.000 2020-01-02 03:39:51.000 690 99591 50140.5 5014050 690 99591 50140.5 5014050 -32480 32658 4920.66 492066 -128 127 0.34 34 -691 100 10681 99592 2.07507 299.07507 150.57507 15057.5075 2.07507 299.07507 150.57507 15057.50734 2.07507 299.07507 150.57506999999998 15057.50700 2020-01-01 2020-01-02 2020-01-01 00:11:31 2020-01-02 03:39:52 2020-01-01 00:11:31.000 2020-01-02 03:39:52.000 691 99592 50141.5 5014150 691 99592 50141.5 5014150 -32479 32659 4921.66 492166 -128 127 -1.22 -122 -692 100 10682 99593 2.07807 299.07807 150.57807 15057.8078 2.07807 299.07806 150.57807 15057.80767 2.07807 299.07807 150.57807 15057.80700 2020-01-01 2020-01-02 2020-01-01 00:11:32 2020-01-02 03:39:53 2020-01-01 00:11:32.000 2020-01-02 03:39:53.000 692 99593 50142.5 5014250 692 99593 50142.5 5014250 -32478 32660 4922.66 492266 -128 123 -2.78 -278 -693 100 10683 99594 2.08108 299.08108 150.58108 15058.1081 2.08108 299.0811 150.58108 15058.10827 2.08108 299.08108 150.58108000000001 15058.10800 2020-01-01 2020-01-02 2020-01-01 00:11:33 2020-01-02 03:39:54 2020-01-01 00:11:33.000 2020-01-02 03:39:54.000 693 99594 50143.5 5014350 693 99594 50143.5 5014350 -32477 32661 4923.66 492366 -127 124 -1.78 -178 -694 100 10684 99595 2.08408 299.08408 150.58408 15058.4084 2.08408 299.08408 150.58408 15058.40857 2.08408 299.08408 150.58408 15058.40800 2020-01-01 2020-01-02 2020-01-01 00:11:34 2020-01-02 03:39:55 2020-01-01 00:11:34.000 2020-01-02 03:39:55.000 694 99595 50144.5 5014450 694 99595 50144.5 5014450 -32476 32662 4924.66 492466 -126 125 -0.78 -78 -695 100 10685 99596 2.08708 299.08708 150.58708 15058.7087 2.08708 299.0871 150.58708 15058.70867 2.08708 299.08708 150.58708000000001 15058.70800 2020-01-01 2020-01-02 2020-01-01 00:11:35 2020-01-02 03:39:56 2020-01-01 00:11:35.000 2020-01-02 03:39:56.000 695 99596 50145.5 5014550 695 99596 50145.5 5014550 -32475 32663 4925.66 492566 -125 126 0.22 22 -696 100 10686 99597 2.09009 299.09009 150.59009 15059.009 2.09009 299.0901 150.59008 15059.00885 2.09009 299.09009 150.59009 15059.00900 2020-01-01 2020-01-02 2020-01-01 00:11:36 2020-01-02 03:39:57 2020-01-01 00:11:36.000 2020-01-02 03:39:57.000 696 99597 50146.5 5014650 696 99597 50146.5 5014650 -32474 32664 4926.66 492666 -124 127 1.22 122 -697 100 10687 99598 2.09309 299.09309 150.59309 15059.3093 2.09309 299.09308 150.59309 15059.30915 2.09309 299.09309 150.59309 15059.30900 2020-01-01 2020-01-02 2020-01-01 00:11:37 2020-01-02 03:39:58 2020-01-01 00:11:37.000 2020-01-02 03:39:58.000 697 99598 50147.5 5014750 697 99598 50147.5 5014750 -32473 32665 4927.66 492766 -128 127 -0.34 -34 -698 100 10688 99599 2.09609 299.09609 150.59609 15059.6096 2.09609 299.0961 150.59609 15059.6099 2.09609 299.09609 150.59609 15059.60900 2020-01-01 2020-01-02 2020-01-01 00:11:38 2020-01-02 03:39:59 2020-01-01 00:11:38.000 2020-01-02 03:39:59.000 698 99599 50148.5 5014850 698 99599 50148.5 5014850 -32472 32666 4928.66 492866 -128 123 -1.9 -190 -699 100 10689 99600 2.09909 299.09909 150.59909 15059.9099 2.09909 299.0991 150.5991 15059.91003 2.09909 299.09909 150.59909 15059.90900 2020-01-01 2020-01-02 2020-01-01 00:11:39 2020-01-02 03:40:00 2020-01-01 00:11:39.000 2020-01-02 03:40:00.000 699 99600 50149.5 5014950 699 99600 50149.5 5014950 -32471 32667 4929.66 492966 -127 124 -0.9 -90 +660 100 10650 99561 1.98198 298.98198 150.48198 15048.19819 1.98198 298.982 150.48198 15048.19822 1.98198 298.98198 150.48198 15048.198 2020-01-01 2020-01-02 2020-01-01 00:11:00 2020-01-02 03:39:21 2020-01-01 00:11:00.000 2020-01-02 03:39:21.000 660 99561 50110.5 5011050 660 99561 50110.5 5011050 -32510 32628 4890.66 489066 -128 127 1.06 106 +661 100 10651 99562 1.98498 298.98498 150.48498 15048.49849 1.98498 298.985 150.48498 15048.49853 1.98498 298.98498 150.48498 15048.498 2020-01-01 2020-01-02 2020-01-01 00:11:01 2020-01-02 03:39:22 2020-01-01 00:11:01.000 2020-01-02 03:39:22.000 661 99562 50111.5 5011150 661 99562 50111.5 5011150 -32509 32629 4891.66 489166 -128 124 -0.5 -50 +662 100 10652 99563 1.98798 298.98798 150.48798 15048.79879 1.98798 298.98798 150.48798 15048.79882 1.98798 298.98798 150.48798 15048.798 2020-01-01 2020-01-02 2020-01-01 00:11:02 2020-01-02 03:39:23 2020-01-01 00:11:02.000 2020-01-02 03:39:23.000 662 99563 50112.5 5011250 662 99563 50112.5 5011250 -32508 32630 4892.66 489266 -127 125 0.5 50 +663 100 10653 99564 1.99099 298.99099 150.49099 15049.09909 1.99099 298.991 150.49099 15049.09942 1.99099 298.99099 150.49099 15049.099 2020-01-01 2020-01-02 2020-01-01 00:11:03 2020-01-02 03:39:24 2020-01-01 00:11:03.000 2020-01-02 03:39:24.000 663 99564 50113.5 5011350 663 99564 50113.5 5011350 -32507 32631 4893.66 489366 -126 126 1.5 150 +664 100 10654 99565 1.99399 298.99399 150.49399 15049.39939 1.99399 298.994 150.49399 15049.39911 1.99399 298.99399 150.49399 15049.399 2020-01-01 2020-01-02 2020-01-01 00:11:04 2020-01-02 03:39:25 2020-01-01 00:11:04.000 2020-01-02 03:39:25.000 664 99565 50114.5 5011450 664 99565 50114.5 5011450 -32506 32632 4894.66 489466 -125 127 2.5 250 +665 100 10655 99566 1.99699 298.99699 150.49699 15049.69969 1.99699 298.997 150.49699 15049.6997 1.99699 298.99699 150.49699 15049.699 2020-01-01 2020-01-02 2020-01-01 00:11:05 2020-01-02 03:39:26 2020-01-01 00:11:05.000 2020-01-02 03:39:26.000 665 99566 50115.5 5011550 665 99566 50115.5 5011550 -32505 32633 4895.66 489566 -128 127 0.94 94 +666 100 10656 99567 2 299 150.5 15050 2 299 150.5 15050 2 299 150.5 15050 2020-01-01 2020-01-02 2020-01-01 00:11:06 2020-01-02 03:39:27 2020-01-01 00:11:06.000 2020-01-02 03:39:27.000 666 99567 50116.5 5011650 666 99567 50116.5 5011650 -32504 32634 4896.66 489666 -128 127 -0.62 -62 +667 100 10657 99568 2.003 299.003 150.503 15050.3003 2.003 299.003 150.503 15050.30029 2.003 299.003 150.503 15050.3 2020-01-01 2020-01-02 2020-01-01 00:11:07 2020-01-02 03:39:28 2020-01-01 00:11:07.000 2020-01-02 03:39:28.000 667 99568 50117.5 5011750 667 99568 50117.5 5011750 -32503 32635 4897.66 489766 -128 123 -2.18 -218 +668 100 10658 99569 2.006 299.006 150.506 15050.6006 2.006 299.006 150.506 15050.60089 2.006 299.006 150.506 15050.6 2020-01-01 2020-01-02 2020-01-01 00:11:08 2020-01-02 03:39:29 2020-01-01 00:11:08.000 2020-01-02 03:39:29.000 668 99569 50118.5 5011850 668 99569 50118.5 5011850 -32502 32636 4898.66 489866 -127 124 -1.18 -118 +669 100 10659 99570 2.009 299.009 150.509 15050.9009 2.009 299.009 150.509 15050.90057 2.009 299.009 150.509 15050.9 2020-01-01 2020-01-02 2020-01-01 00:11:09 2020-01-02 03:39:30 2020-01-01 00:11:09.000 2020-01-02 03:39:30.000 669 99570 50119.5 5011950 669 99570 50119.5 5011950 -32501 32637 4899.66 489966 -126 125 -0.18 -18 +67 102 10057 99967 0.2012 300.2012 150.2012 15170.32132 0.2012 300.2012 150.2012 15170.32142 0.2012 300.2012 150.2012 15170.3212 2020-01-01 2020-01-02 2020-01-01 00:01:07 2020-01-02 03:46:07 2020-01-01 00:01:07.000 2020-01-02 03:46:07.000 67 99967 50017 5051717 67 99967 50017 5051717 -32502 32433 4596.009900990099 464197 -128 127 -1.8514851485148516 -187 +670 100 10660 99571 2.01201 299.01201 150.51201 15051.2012 2.01201 299.01202 150.51201 15051.20117 2.01201 299.01201 150.51201 15051.201 2020-01-01 2020-01-02 2020-01-01 00:11:10 2020-01-02 03:39:31 2020-01-01 00:11:10.000 2020-01-02 03:39:31.000 670 99571 50120.5 5012050 670 99571 50120.5 5012050 -32500 32638 4900.66 490066 -125 126 0.82 82 +671 100 10661 99572 2.01501 299.01501 150.51501 15051.5015 2.01501 299.015 150.51501 15051.50146 2.01501 299.01501 150.51501 15051.501 2020-01-01 2020-01-02 2020-01-01 00:11:11 2020-01-02 03:39:32 2020-01-01 00:11:11.000 2020-01-02 03:39:32.000 671 99572 50121.5 5012150 671 99572 50121.5 5012150 -32499 32639 4901.66 490166 -124 127 1.82 182 +672 100 10662 99573 2.01801 299.01801 150.51801 15051.8018 2.01801 299.018 150.51801 15051.80176 2.01801 299.01801 150.51801 15051.801 2020-01-01 2020-01-02 2020-01-01 00:11:12 2020-01-02 03:39:33 2020-01-01 00:11:12.000 2020-01-02 03:39:33.000 672 99573 50122.5 5012250 672 99573 50122.5 5012250 -32498 32640 4902.66 490266 -128 127 0.26 26 +673 100 10663 99574 2.02102 299.02102 150.52102 15052.1021 2.02102 299.02103 150.52102 15052.1024 2.02102 299.02102 150.52102000000002 15052.102 2020-01-01 2020-01-02 2020-01-01 00:11:13 2020-01-02 03:39:34 2020-01-01 00:11:13.000 2020-01-02 03:39:34.000 673 99574 50123.5 5012350 673 99574 50123.5 5012350 -32497 32641 4903.66 490366 -128 123 -1.3 -130 +674 100 10664 99575 2.02402 299.02402 150.52402 15052.4024 2.02402 299.02402 150.52402 15052.40204 2.02402 299.02402 150.52402 15052.402 2020-01-01 2020-01-02 2020-01-01 00:11:14 2020-01-02 03:39:35 2020-01-01 00:11:14.000 2020-01-02 03:39:35.000 674 99575 50124.5 5012450 674 99575 50124.5 5012450 -32496 32642 4904.66 490466 -127 124 -0.3 -30 +675 100 10665 99576 2.02702 299.02702 150.52702 15052.7027 2.02702 299.02704 150.52702 15052.70264 2.02702 299.02702 150.52702 15052.702 2020-01-01 2020-01-02 2020-01-01 00:11:15 2020-01-02 03:39:36 2020-01-01 00:11:15.000 2020-01-02 03:39:36.000 675 99576 50125.5 5012550 675 99576 50125.5 5012550 -32495 32643 4905.66 490566 -126 125 0.7 70 +676 100 10666 99577 2.03003 299.03003 150.53003 15053.003 2.03003 299.03003 150.53002 15053.00293 2.03003 299.03003 150.53003 15053.003 2020-01-01 2020-01-02 2020-01-01 00:11:16 2020-01-02 03:39:37 2020-01-01 00:11:16.000 2020-01-02 03:39:37.000 676 99577 50126.5 5012650 676 99577 50126.5 5012650 -32494 32644 4906.66 490666 -125 126 1.7 170 +677 100 10667 99578 2.03303 299.03303 150.53303 15053.3033 2.03303 299.03302 150.53303 15053.30323 2.03303 299.03303 150.53303 15053.303 2020-01-01 2020-01-02 2020-01-01 00:11:17 2020-01-02 03:39:38 2020-01-01 00:11:17.000 2020-01-02 03:39:38.000 677 99578 50127.5 5012750 677 99578 50127.5 5012750 -32493 32645 4907.66 490766 -124 127 2.7 270 +678 100 10668 99579 2.03603 299.03603 150.53603 15053.6036 2.03603 299.03604 150.53603 15053.60387 2.03603 299.03603 150.53602999999998 15053.603 2020-01-01 2020-01-02 2020-01-01 00:11:18 2020-01-02 03:39:39 2020-01-01 00:11:18.000 2020-01-02 03:39:39.000 678 99579 50128.5 5012850 678 99579 50128.5 5012850 -32492 32646 4908.66 490866 -128 127 1.14 114 +679 100 10669 99580 2.03903 299.03903 150.53903 15053.9039 2.03903 299.03903 150.53903 15053.90351 2.03903 299.03903 150.53903 15053.903 2020-01-01 2020-01-02 2020-01-01 00:11:19 2020-01-02 03:39:40 2020-01-01 00:11:19.000 2020-01-02 03:39:40.000 679 99580 50129.5 5012950 679 99580 50129.5 5012950 -32491 32647 4909.66 490966 -128 123 -0.42 -42 +68 102 10058 99968 0.2042 300.2042 150.2042 15170.62462 0.2042 300.2042 150.2042 15170.62457 0.2042 300.2042 150.20420000000001 15170.6242 2020-01-01 2020-01-02 2020-01-01 00:01:08 2020-01-02 03:46:08 2020-01-01 00:01:08.000 2020-01-02 03:46:08.000 68 99968 50018 5051818 68 99968 50018 5051818 -32501 32434 4597.009900990099 464298 -128 124 -3.386138613861386 -342 +680 100 10670 99581 2.04204 299.04204 150.54204 15054.2042 2.04204 299.04205 150.54204 15054.20426 2.04204 299.04204 150.54204 15054.204 2020-01-01 2020-01-02 2020-01-01 00:11:20 2020-01-02 03:39:41 2020-01-01 00:11:20.000 2020-01-02 03:39:41.000 680 99581 50130.5 5013050 680 99581 50130.5 5013050 -32490 32648 4910.66 491066 -127 124 0.58 58 +681 100 10671 99582 2.04504 299.04504 150.54504 15054.5045 2.04504 299.04504 150.54504 15054.5044 2.04504 299.04504 150.54504 15054.504 2020-01-01 2020-01-02 2020-01-01 00:11:21 2020-01-02 03:39:42 2020-01-01 00:11:21.000 2020-01-02 03:39:42.000 681 99582 50131.5 5013150 681 99582 50131.5 5013150 -32489 32649 4911.66 491166 -126 125 1.58 158 +682 100 10672 99583 2.04804 299.04804 150.54804 15054.8048 2.04804 299.04803 150.54804 15054.80474 2.04804 299.04804 150.54804000000001 15054.804 2020-01-01 2020-01-02 2020-01-01 00:11:22 2020-01-02 03:39:43 2020-01-01 00:11:22.000 2020-01-02 03:39:43.000 682 99583 50132.5 5013250 682 99583 50132.5 5013250 -32488 32650 4912.66 491266 -125 126 2.58 258 +683 100 10673 99584 2.05105 299.05105 150.55105 15055.1051 2.05105 299.05106 150.55105 15055.10533 2.05105 299.05105 150.55105 15055.105 2020-01-01 2020-01-02 2020-01-01 00:11:23 2020-01-02 03:39:44 2020-01-01 00:11:23.000 2020-01-02 03:39:44.000 683 99584 50133.5 5013350 683 99584 50133.5 5013350 -32487 32651 4913.66 491366 -124 127 3.58 358 +684 100 10674 99585 2.05405 299.05405 150.55405 15055.4054 2.05405 299.05405 150.55404 15055.40498 2.05405 299.05405 150.55405000000002 15055.405 2020-01-01 2020-01-02 2020-01-01 00:11:24 2020-01-02 03:39:45 2020-01-01 00:11:24.000 2020-01-02 03:39:45.000 684 99585 50134.5 5013450 684 99585 50134.5 5013450 -32486 32652 4914.66 491466 -128 127 2.02 202 +685 100 10675 99586 2.05705 299.05705 150.55705 15055.7057 2.05705 299.05707 150.55705 15055.70573 2.05705 299.05705 150.55705 15055.705 2020-01-01 2020-01-02 2020-01-01 00:11:25 2020-01-02 03:39:46 2020-01-01 00:11:25.000 2020-01-02 03:39:46.000 685 99586 50135.5 5013550 685 99586 50135.5 5013550 -32485 32653 4915.66 491566 -128 127 0.46 46 +686 100 10676 99587 2.06006 299.06006 150.56006 15056.006 2.06006 299.06006 150.56005 15056.00587 2.06006 299.06006 150.56006 15056.006 2020-01-01 2020-01-02 2020-01-01 00:11:26 2020-01-02 03:39:47 2020-01-01 00:11:26.000 2020-01-02 03:39:47.000 686 99587 50136.5 5013650 686 99587 50136.5 5013650 -32484 32654 4916.66 491666 -128 124 -1.1 -110 +687 100 10677 99588 2.06306 299.06306 150.56306 15056.3063 2.06306 299.06305 150.56306 15056.30621 2.06306 299.06306 150.56306 15056.306 2020-01-01 2020-01-02 2020-01-01 00:11:27 2020-01-02 03:39:48 2020-01-01 00:11:27.000 2020-01-02 03:39:48.000 687 99588 50137.5 5013750 687 99588 50137.5 5013750 -32483 32655 4917.66 491766 -127 125 -0.1 -10 +688 100 10678 99589 2.06606 299.06606 150.56606 15056.6066 2.06606 299.06607 150.56606 15056.60681 2.06606 299.06606 150.56606 15056.606 2020-01-01 2020-01-02 2020-01-01 00:11:28 2020-01-02 03:39:49 2020-01-01 00:11:28.000 2020-01-02 03:39:49.000 688 99589 50138.5 5013850 688 99589 50138.5 5013850 -32482 32656 4918.66 491866 -126 126 0.9 90 +689 100 10679 99590 2.06906 299.06906 150.56906 15056.9069 2.06906 299.06906 150.56907 15056.9071 2.06906 299.06906 150.56906 15056.906 2020-01-01 2020-01-02 2020-01-01 00:11:29 2020-01-02 03:39:50 2020-01-01 00:11:29.000 2020-01-02 03:39:50.000 689 99590 50139.5 5013950 689 99590 50139.5 5013950 -32481 32657 4919.66 491966 -125 127 1.9 190 +69 102 10059 99969 0.2072 300.2072 150.2072 15170.92792 0.2072 300.2072 150.20721 15170.92832 0.2072 300.2072 150.2072 15170.9272 2020-01-01 2020-01-02 2020-01-01 00:01:09 2020-01-02 03:46:09 2020-01-01 00:01:09.000 2020-01-02 03:46:09.000 69 99969 50019 5051919 69 99969 50019 5051919 -32500 32435 4598.009900990099 464399 -127 125 -2.386138613861386 -241 +690 100 10680 99591 2.07207 299.07207 150.57207 15057.2072 2.07207 299.07208 150.57207 15057.2072 2.07207 299.07207 150.57207 15057.207 2020-01-01 2020-01-02 2020-01-01 00:11:30 2020-01-02 03:39:51 2020-01-01 00:11:30.000 2020-01-02 03:39:51.000 690 99591 50140.5 5014050 690 99591 50140.5 5014050 -32480 32658 4920.66 492066 -128 127 0.34 34 +691 100 10681 99592 2.07507 299.07507 150.57507 15057.5075 2.07507 299.07507 150.57507 15057.50734 2.07507 299.07507 150.57506999999998 15057.507 2020-01-01 2020-01-02 2020-01-01 00:11:31 2020-01-02 03:39:52 2020-01-01 00:11:31.000 2020-01-02 03:39:52.000 691 99592 50141.5 5014150 691 99592 50141.5 5014150 -32479 32659 4921.66 492166 -128 127 -1.22 -122 +692 100 10682 99593 2.07807 299.07807 150.57807 15057.8078 2.07807 299.07806 150.57807 15057.80767 2.07807 299.07807 150.57807 15057.807 2020-01-01 2020-01-02 2020-01-01 00:11:32 2020-01-02 03:39:53 2020-01-01 00:11:32.000 2020-01-02 03:39:53.000 692 99593 50142.5 5014250 692 99593 50142.5 5014250 -32478 32660 4922.66 492266 -128 123 -2.78 -278 +693 100 10683 99594 2.08108 299.08108 150.58108 15058.1081 2.08108 299.0811 150.58108 15058.10827 2.08108 299.08108 150.58108000000001 15058.108 2020-01-01 2020-01-02 2020-01-01 00:11:33 2020-01-02 03:39:54 2020-01-01 00:11:33.000 2020-01-02 03:39:54.000 693 99594 50143.5 5014350 693 99594 50143.5 5014350 -32477 32661 4923.66 492366 -127 124 -1.78 -178 +694 100 10684 99595 2.08408 299.08408 150.58408 15058.4084 2.08408 299.08408 150.58408 15058.40857 2.08408 299.08408 150.58408 15058.408 2020-01-01 2020-01-02 2020-01-01 00:11:34 2020-01-02 03:39:55 2020-01-01 00:11:34.000 2020-01-02 03:39:55.000 694 99595 50144.5 5014450 694 99595 50144.5 5014450 -32476 32662 4924.66 492466 -126 125 -0.78 -78 +695 100 10685 99596 2.08708 299.08708 150.58708 15058.7087 2.08708 299.0871 150.58708 15058.70867 2.08708 299.08708 150.58708000000001 15058.708 2020-01-01 2020-01-02 2020-01-01 00:11:35 2020-01-02 03:39:56 2020-01-01 00:11:35.000 2020-01-02 03:39:56.000 695 99596 50145.5 5014550 695 99596 50145.5 5014550 -32475 32663 4925.66 492566 -125 126 0.22 22 +696 100 10686 99597 2.09009 299.09009 150.59009 15059.009 2.09009 299.0901 150.59008 15059.00885 2.09009 299.09009 150.59009 15059.009 2020-01-01 2020-01-02 2020-01-01 00:11:36 2020-01-02 03:39:57 2020-01-01 00:11:36.000 2020-01-02 03:39:57.000 696 99597 50146.5 5014650 696 99597 50146.5 5014650 -32474 32664 4926.66 492666 -124 127 1.22 122 +697 100 10687 99598 2.09309 299.09309 150.59309 15059.3093 2.09309 299.09308 150.59309 15059.30915 2.09309 299.09309 150.59309 15059.309 2020-01-01 2020-01-02 2020-01-01 00:11:37 2020-01-02 03:39:58 2020-01-01 00:11:37.000 2020-01-02 03:39:58.000 697 99598 50147.5 5014750 697 99598 50147.5 5014750 -32473 32665 4927.66 492766 -128 127 -0.34 -34 +698 100 10688 99599 2.09609 299.09609 150.59609 15059.6096 2.09609 299.0961 150.59609 15059.6099 2.09609 299.09609 150.59609 15059.609 2020-01-01 2020-01-02 2020-01-01 00:11:38 2020-01-02 03:39:59 2020-01-01 00:11:38.000 2020-01-02 03:39:59.000 698 99599 50148.5 5014850 698 99599 50148.5 5014850 -32472 32666 4928.66 492866 -128 123 -1.9 -190 +699 100 10689 99600 2.09909 299.09909 150.59909 15059.9099 2.09909 299.0991 150.5991 15059.91003 2.09909 299.09909 150.59909 15059.909 2020-01-01 2020-01-02 2020-01-01 00:11:39 2020-01-02 03:40:00 2020-01-01 00:11:39.000 2020-01-02 03:40:00.000 699 99600 50149.5 5014950 699 99600 50149.5 5014950 -32471 32667 4929.66 492966 -127 124 -0.9 -90 7 102 1006 9997 0.02102 300.02102 150.02102 15152.12312 0.02102 300.02103 150.02102 15152.12342 0.02102 300.02102 150.02102000000002 15152.12302 2020-01-01 2020-01-02 2020-01-01 00:00:07 2020-01-02 03:45:07 2020-01-01 00:00:07.000 2020-01-02 03:45:07.000 7 99907 49957 5045657 7 99907 49957 5045657 -32562 32373 4536.009900990099 458137 -126 125 -1.0198019801980198 -103 70 102 10060 99970 0.21021 300.21021 150.21021 15171.23123 0.21021 300.2102 150.2102 15171.23097 0.21021 300.21021 150.21021 15171.23121 2020-01-01 2020-01-02 2020-01-01 00:01:10 2020-01-02 03:46:10 2020-01-01 00:01:10.000 2020-01-02 03:46:10.000 70 99970 50020 5052020 70 99970 50020 5052020 -32499 32436 4599.009900990099 464500 -126 126 -1.386138613861386 -140 -700 100 10690 99601 2.1021 299.1021 150.6021 15060.21021 2.1021 299.1021 150.6021 15060.21014 2.10210 299.10210 150.60209999999998 15060.21000 2020-01-01 2020-01-02 2020-01-01 00:11:40 2020-01-02 03:40:01 2020-01-01 00:11:40.000 2020-01-02 03:40:01.000 700 99601 50150.5 5015050 700 99601 50150.5 5015050 -32470 32668 4930.66 493066 -126 125 0.1 10 -701 100 10691 99602 2.1051 299.1051 150.6051 15060.51051 2.1051 299.1051 150.6051 15060.51031 2.10510 299.10510 150.6051 15060.51000 2020-01-01 2020-01-02 2020-01-01 00:11:41 2020-01-02 03:40:02 2020-01-01 00:11:41.000 2020-01-02 03:40:02.000 701 99602 50151.5 5015150 701 99602 50151.5 5015150 -32469 32669 4931.66 493166 -125 126 1.1 110 -702 100 10692 99603 2.1081 299.1081 150.6081 15060.81081 2.1081 299.1081 150.6081 15060.81062 2.10810 299.10810 150.6081 15060.81000 2020-01-01 2020-01-02 2020-01-01 00:11:42 2020-01-02 03:40:03 2020-01-01 00:11:42.000 2020-01-02 03:40:03.000 702 99603 50152.5 5015250 702 99603 50152.5 5015250 -32468 32670 4932.66 493266 -124 127 2.1 210 -703 100 10693 99604 2.11111 299.11111 150.61111 15061.11111 2.11111 299.1111 150.61111 15061.11137 2.11111 299.11111 150.61111 15061.11100 2020-01-01 2020-01-02 2020-01-01 00:11:43 2020-01-02 03:40:04 2020-01-01 00:11:43.000 2020-01-02 03:40:04.000 703 99604 50153.5 5015350 703 99604 50153.5 5015350 -32467 32671 4933.66 493366 -128 127 0.54 54 -704 100 10694 99605 2.11411 299.11411 150.61411 15061.41141 2.11411 299.1141 150.61411 15061.41151 2.11411 299.11411 150.61411 15061.41100 2020-01-01 2020-01-02 2020-01-01 00:11:44 2020-01-02 03:40:05 2020-01-01 00:11:44.000 2020-01-02 03:40:05.000 704 99605 50154.5 5015450 704 99605 50154.5 5015450 -32466 32672 4934.66 493466 -128 123 -1.02 -102 -705 100 10695 99606 2.11711 299.11711 150.61711 15061.71171 2.11711 299.11713 150.61711 15061.71165 2.11711 299.11711 150.61711 15061.71100 2020-01-01 2020-01-02 2020-01-01 00:11:45 2020-01-02 03:40:06 2020-01-01 00:11:45.000 2020-01-02 03:40:06.000 705 99606 50155.5 5015550 705 99606 50155.5 5015550 -32465 32673 4935.66 493566 -127 124 -0.02 -2 -706 100 10696 99607 2.12012 299.12012 150.62012 15062.01201 2.12012 299.12012 150.62011 15062.01179 2.12012 299.12012 150.62012000000001 15062.01200 2020-01-01 2020-01-02 2020-01-01 00:11:46 2020-01-02 03:40:07 2020-01-01 00:11:46.000 2020-01-02 03:40:07.000 706 99607 50156.5 5015650 706 99607 50156.5 5015650 -32464 32674 4936.66 493666 -126 125 0.98 98 -707 100 10697 99608 2.12312 299.12312 150.62312 15062.31231 2.12312 299.1231 150.62312 15062.31208 2.12312 299.12312 150.62312 15062.31200 2020-01-01 2020-01-02 2020-01-01 00:11:47 2020-01-02 03:40:08 2020-01-01 00:11:47.000 2020-01-02 03:40:08.000 707 99608 50157.5 5015750 707 99608 50157.5 5015750 -32463 32675 4937.66 493766 -125 126 1.98 198 -708 100 10698 99609 2.12612 299.12612 150.62612 15062.61261 2.12612 299.12613 150.62612 15062.61283 2.12612 299.12612 150.62612 15062.61200 2020-01-01 2020-01-02 2020-01-01 00:11:48 2020-01-02 03:40:09 2020-01-01 00:11:48.000 2020-01-02 03:40:09.000 708 99609 50158.5 5015850 708 99609 50158.5 5015850 -32462 32676 4938.66 493866 -124 127 2.98 298 -709 100 10699 99610 2.12912 299.12912 150.62912 15062.91291 2.12912 299.12912 150.62912 15062.91298 2.12912 299.12912 150.62912 15062.91200 2020-01-01 2020-01-02 2020-01-01 00:11:49 2020-01-02 03:40:10 2020-01-01 00:11:49.000 2020-01-02 03:40:10.000 709 99610 50159.5 5015950 709 99610 50159.5 5015950 -32461 32677 4939.66 493966 -128 127 1.42 142 +700 100 10690 99601 2.1021 299.1021 150.6021 15060.21021 2.1021 299.1021 150.6021 15060.21014 2.1021 299.1021 150.60209999999998 15060.21 2020-01-01 2020-01-02 2020-01-01 00:11:40 2020-01-02 03:40:01 2020-01-01 00:11:40.000 2020-01-02 03:40:01.000 700 99601 50150.5 5015050 700 99601 50150.5 5015050 -32470 32668 4930.66 493066 -126 125 0.1 10 +701 100 10691 99602 2.1051 299.1051 150.6051 15060.51051 2.1051 299.1051 150.6051 15060.51031 2.1051 299.1051 150.6051 15060.51 2020-01-01 2020-01-02 2020-01-01 00:11:41 2020-01-02 03:40:02 2020-01-01 00:11:41.000 2020-01-02 03:40:02.000 701 99602 50151.5 5015150 701 99602 50151.5 5015150 -32469 32669 4931.66 493166 -125 126 1.1 110 +702 100 10692 99603 2.1081 299.1081 150.6081 15060.81081 2.1081 299.1081 150.6081 15060.81062 2.1081 299.1081 150.6081 15060.81 2020-01-01 2020-01-02 2020-01-01 00:11:42 2020-01-02 03:40:03 2020-01-01 00:11:42.000 2020-01-02 03:40:03.000 702 99603 50152.5 5015250 702 99603 50152.5 5015250 -32468 32670 4932.66 493266 -124 127 2.1 210 +703 100 10693 99604 2.11111 299.11111 150.61111 15061.11111 2.11111 299.1111 150.61111 15061.11137 2.11111 299.11111 150.61111 15061.111 2020-01-01 2020-01-02 2020-01-01 00:11:43 2020-01-02 03:40:04 2020-01-01 00:11:43.000 2020-01-02 03:40:04.000 703 99604 50153.5 5015350 703 99604 50153.5 5015350 -32467 32671 4933.66 493366 -128 127 0.54 54 +704 100 10694 99605 2.11411 299.11411 150.61411 15061.41141 2.11411 299.1141 150.61411 15061.41151 2.11411 299.11411 150.61411 15061.411 2020-01-01 2020-01-02 2020-01-01 00:11:44 2020-01-02 03:40:05 2020-01-01 00:11:44.000 2020-01-02 03:40:05.000 704 99605 50154.5 5015450 704 99605 50154.5 5015450 -32466 32672 4934.66 493466 -128 123 -1.02 -102 +705 100 10695 99606 2.11711 299.11711 150.61711 15061.71171 2.11711 299.11713 150.61711 15061.71165 2.11711 299.11711 150.61711 15061.711 2020-01-01 2020-01-02 2020-01-01 00:11:45 2020-01-02 03:40:06 2020-01-01 00:11:45.000 2020-01-02 03:40:06.000 705 99606 50155.5 5015550 705 99606 50155.5 5015550 -32465 32673 4935.66 493566 -127 124 -0.02 -2 +706 100 10696 99607 2.12012 299.12012 150.62012 15062.01201 2.12012 299.12012 150.62011 15062.01179 2.12012 299.12012 150.62012000000001 15062.012 2020-01-01 2020-01-02 2020-01-01 00:11:46 2020-01-02 03:40:07 2020-01-01 00:11:46.000 2020-01-02 03:40:07.000 706 99607 50156.5 5015650 706 99607 50156.5 5015650 -32464 32674 4936.66 493666 -126 125 0.98 98 +707 100 10697 99608 2.12312 299.12312 150.62312 15062.31231 2.12312 299.1231 150.62312 15062.31208 2.12312 299.12312 150.62312 15062.312 2020-01-01 2020-01-02 2020-01-01 00:11:47 2020-01-02 03:40:08 2020-01-01 00:11:47.000 2020-01-02 03:40:08.000 707 99608 50157.5 5015750 707 99608 50157.5 5015750 -32463 32675 4937.66 493766 -125 126 1.98 198 +708 100 10698 99609 2.12612 299.12612 150.62612 15062.61261 2.12612 299.12613 150.62612 15062.61283 2.12612 299.12612 150.62612 15062.612 2020-01-01 2020-01-02 2020-01-01 00:11:48 2020-01-02 03:40:09 2020-01-01 00:11:48.000 2020-01-02 03:40:09.000 708 99609 50158.5 5015850 708 99609 50158.5 5015850 -32462 32676 4938.66 493866 -124 127 2.98 298 +709 100 10699 99610 2.12912 299.12912 150.62912 15062.91291 2.12912 299.12912 150.62912 15062.91298 2.12912 299.12912 150.62912 15062.912 2020-01-01 2020-01-02 2020-01-01 00:11:49 2020-01-02 03:40:10 2020-01-01 00:11:49.000 2020-01-02 03:40:10.000 709 99610 50159.5 5015950 709 99610 50159.5 5015950 -32461 32677 4939.66 493966 -128 127 1.42 142 71 102 10061 99971 0.21321 300.21321 150.21321 15171.53453 0.21321 300.21323 150.21321 15171.5346 0.21321 300.21321 150.21321 15171.53421 2020-01-01 2020-01-02 2020-01-01 00:01:11 2020-01-02 03:46:11 2020-01-01 00:01:11.000 2020-01-02 03:46:11.000 71 99971 50021 5052121 71 99971 50021 5052121 -32498 32437 4600.009900990099 464601 -125 127 -0.38613861386138615 -39 -710 100 10700 99611 2.13213 299.13213 150.63213 15063.21321 2.13213 299.13214 150.63213 15063.21311 2.13213 299.13213 150.63213 15063.21300 2020-01-01 2020-01-02 2020-01-01 00:11:50 2020-01-02 03:40:11 2020-01-01 00:11:50.000 2020-01-02 03:40:11.000 710 99611 50160.5 5016050 710 99611 50160.5 5016050 -32460 32678 4940.66 494066 -128 127 -0.14 -14 -711 100 10701 99612 2.13513 299.13513 150.63513 15063.51351 2.13513 299.13513 150.63513 15063.51325 2.13513 299.13513 150.63513 15063.51300 2020-01-01 2020-01-02 2020-01-01 00:11:51 2020-01-02 03:40:12 2020-01-01 00:11:51.000 2020-01-02 03:40:12.000 711 99612 50161.5 5016150 711 99612 50161.5 5016150 -32459 32679 4941.66 494166 -128 124 -1.7 -170 -712 100 10702 99613 2.13813 299.13813 150.63813 15063.81381 2.13813 299.13815 150.63814 15063.81401 2.13813 299.13813 150.63813 15063.81300 2020-01-01 2020-01-02 2020-01-01 00:11:52 2020-01-02 03:40:13 2020-01-01 00:11:52.000 2020-01-02 03:40:13.000 712 99613 50162.5 5016250 712 99613 50162.5 5016250 -32458 32680 4942.66 494266 -127 125 -0.7 -70 -713 100 10703 99614 2.14114 299.14114 150.64114 15064.11411 2.14114 299.14114 150.64114 15064.11431 2.14114 299.14114 150.64114 15064.11400 2020-01-01 2020-01-02 2020-01-01 00:11:53 2020-01-02 03:40:14 2020-01-01 00:11:53.000 2020-01-02 03:40:14.000 713 99614 50163.5 5016350 713 99614 50163.5 5016350 -32457 32681 4943.66 494366 -126 126 0.3 30 -714 100 10704 99615 2.14414 299.14414 150.64414 15064.41441 2.14414 299.14413 150.64414 15064.41448 2.14414 299.14414 150.64414 15064.41400 2020-01-01 2020-01-02 2020-01-01 00:11:54 2020-01-02 03:40:15 2020-01-01 00:11:54.000 2020-01-02 03:40:15.000 714 99615 50164.5 5016450 714 99615 50164.5 5016450 -32456 32682 4944.66 494466 -125 127 1.3 130 -715 100 10705 99616 2.14714 299.14714 150.64714 15064.71471 2.14714 299.14716 150.64714 15064.71458 2.14714 299.14714 150.64714 15064.71400 2020-01-01 2020-01-02 2020-01-01 00:11:55 2020-01-02 03:40:16 2020-01-01 00:11:55.000 2020-01-02 03:40:16.000 715 99616 50165.5 5016550 715 99616 50165.5 5016550 -32455 32683 4945.66 494566 -128 127 -0.26 -26 -716 100 10706 99617 2.15015 299.15015 150.65015 15065.01501 2.15015 299.15015 150.65014 15065.01472 2.15015 299.15015 150.65015 15065.01500 2020-01-01 2020-01-02 2020-01-01 00:11:56 2020-01-02 03:40:17 2020-01-01 00:11:56.000 2020-01-02 03:40:17.000 716 99617 50166.5 5016650 716 99617 50166.5 5016650 -32454 32684 4946.66 494666 -128 127 -1.82 -182 -717 100 10707 99618 2.15315 299.15315 150.65315 15065.31531 2.15315 299.15317 150.65315 15065.31547 2.15315 299.15315 150.65315 15065.31500 2020-01-01 2020-01-02 2020-01-01 00:11:57 2020-01-02 03:40:18 2020-01-01 00:11:57.000 2020-01-02 03:40:18.000 717 99618 50167.5 5016750 717 99618 50167.5 5016750 -32453 32685 4947.66 494766 -128 123 -3.38 -338 -718 100 10708 99619 2.15615 299.15615 150.65615 15065.61561 2.15615 299.15616 150.65615 15065.61578 2.15615 299.15615 150.65615 15065.61500 2020-01-01 2020-01-02 2020-01-01 00:11:58 2020-01-02 03:40:19 2020-01-01 00:11:58.000 2020-01-02 03:40:19.000 718 99619 50168.5 5016850 718 99619 50168.5 5016850 -32452 32686 4948.66 494866 -127 124 -2.38 -238 -719 100 10709 99620 2.15915 299.15915 150.65915 15065.91591 2.15915 299.15915 150.65915 15065.91595 2.15915 299.15915 150.65915 15065.91500 2020-01-01 2020-01-02 2020-01-01 00:11:59 2020-01-02 03:40:20 2020-01-01 00:11:59.000 2020-01-02 03:40:20.000 719 99620 50169.5 5016950 719 99620 50169.5 5016950 -32451 32687 4949.66 494966 -126 125 -1.38 -138 +710 100 10700 99611 2.13213 299.13213 150.63213 15063.21321 2.13213 299.13214 150.63213 15063.21311 2.13213 299.13213 150.63213 15063.213 2020-01-01 2020-01-02 2020-01-01 00:11:50 2020-01-02 03:40:11 2020-01-01 00:11:50.000 2020-01-02 03:40:11.000 710 99611 50160.5 5016050 710 99611 50160.5 5016050 -32460 32678 4940.66 494066 -128 127 -0.14 -14 +711 100 10701 99612 2.13513 299.13513 150.63513 15063.51351 2.13513 299.13513 150.63513 15063.51325 2.13513 299.13513 150.63513 15063.513 2020-01-01 2020-01-02 2020-01-01 00:11:51 2020-01-02 03:40:12 2020-01-01 00:11:51.000 2020-01-02 03:40:12.000 711 99612 50161.5 5016150 711 99612 50161.5 5016150 -32459 32679 4941.66 494166 -128 124 -1.7 -170 +712 100 10702 99613 2.13813 299.13813 150.63813 15063.81381 2.13813 299.13815 150.63814 15063.81401 2.13813 299.13813 150.63813 15063.813 2020-01-01 2020-01-02 2020-01-01 00:11:52 2020-01-02 03:40:13 2020-01-01 00:11:52.000 2020-01-02 03:40:13.000 712 99613 50162.5 5016250 712 99613 50162.5 5016250 -32458 32680 4942.66 494266 -127 125 -0.7 -70 +713 100 10703 99614 2.14114 299.14114 150.64114 15064.11411 2.14114 299.14114 150.64114 15064.11431 2.14114 299.14114 150.64114 15064.114 2020-01-01 2020-01-02 2020-01-01 00:11:53 2020-01-02 03:40:14 2020-01-01 00:11:53.000 2020-01-02 03:40:14.000 713 99614 50163.5 5016350 713 99614 50163.5 5016350 -32457 32681 4943.66 494366 -126 126 0.3 30 +714 100 10704 99615 2.14414 299.14414 150.64414 15064.41441 2.14414 299.14413 150.64414 15064.41448 2.14414 299.14414 150.64414 15064.414 2020-01-01 2020-01-02 2020-01-01 00:11:54 2020-01-02 03:40:15 2020-01-01 00:11:54.000 2020-01-02 03:40:15.000 714 99615 50164.5 5016450 714 99615 50164.5 5016450 -32456 32682 4944.66 494466 -125 127 1.3 130 +715 100 10705 99616 2.14714 299.14714 150.64714 15064.71471 2.14714 299.14716 150.64714 15064.71458 2.14714 299.14714 150.64714 15064.714 2020-01-01 2020-01-02 2020-01-01 00:11:55 2020-01-02 03:40:16 2020-01-01 00:11:55.000 2020-01-02 03:40:16.000 715 99616 50165.5 5016550 715 99616 50165.5 5016550 -32455 32683 4945.66 494566 -128 127 -0.26 -26 +716 100 10706 99617 2.15015 299.15015 150.65015 15065.01501 2.15015 299.15015 150.65014 15065.01472 2.15015 299.15015 150.65015 15065.015 2020-01-01 2020-01-02 2020-01-01 00:11:56 2020-01-02 03:40:17 2020-01-01 00:11:56.000 2020-01-02 03:40:17.000 716 99617 50166.5 5016650 716 99617 50166.5 5016650 -32454 32684 4946.66 494666 -128 127 -1.82 -182 +717 100 10707 99618 2.15315 299.15315 150.65315 15065.31531 2.15315 299.15317 150.65315 15065.31547 2.15315 299.15315 150.65315 15065.315 2020-01-01 2020-01-02 2020-01-01 00:11:57 2020-01-02 03:40:18 2020-01-01 00:11:57.000 2020-01-02 03:40:18.000 717 99618 50167.5 5016750 717 99618 50167.5 5016750 -32453 32685 4947.66 494766 -128 123 -3.38 -338 +718 100 10708 99619 2.15615 299.15615 150.65615 15065.61561 2.15615 299.15616 150.65615 15065.61578 2.15615 299.15615 150.65615 15065.615 2020-01-01 2020-01-02 2020-01-01 00:11:58 2020-01-02 03:40:19 2020-01-01 00:11:58.000 2020-01-02 03:40:19.000 718 99619 50168.5 5016850 718 99619 50168.5 5016850 -32452 32686 4948.66 494866 -127 124 -2.38 -238 +719 100 10709 99620 2.15915 299.15915 150.65915 15065.91591 2.15915 299.15915 150.65915 15065.91595 2.15915 299.15915 150.65915 15065.915 2020-01-01 2020-01-02 2020-01-01 00:11:59 2020-01-02 03:40:20 2020-01-01 00:11:59.000 2020-01-02 03:40:20.000 719 99620 50169.5 5016950 719 99620 50169.5 5016950 -32451 32687 4949.66 494966 -126 125 -1.38 -138 72 102 10062 99972 0.21621 300.21621 150.21621 15171.83783 0.21621 300.21622 150.21621 15171.83791 0.21621 300.21621 150.21621 15171.83721 2020-01-01 2020-01-02 2020-01-01 00:01:12 2020-01-02 03:46:12 2020-01-01 00:01:12.000 2020-01-02 03:46:12.000 72 99972 50022 5052222 72 99972 50022 5052222 -32497 32438 4601.009900990099 464702 -128 127 -1.9207920792079207 -194 -720 100 10710 99621 2.16216 299.16216 150.66216 15066.21621 2.16216 299.16217 150.66216 15066.21606 2.16216 299.16216 150.66216 15066.21600 2020-01-01 2020-01-02 2020-01-01 00:12:00 2020-01-02 03:40:21 2020-01-01 00:12:00.000 2020-01-02 03:40:21.000 720 99621 50170.5 5017050 720 99621 50170.5 5017050 -32450 32688 4950.66 495066 -125 126 -0.38 -38 -721 100 10711 99622 2.16516 299.16516 150.66516 15066.51651 2.16516 299.16516 150.66516 15066.51635 2.16516 299.16516 150.66516 15066.51600 2020-01-01 2020-01-02 2020-01-01 00:12:01 2020-01-02 03:40:22 2020-01-01 00:12:01.000 2020-01-02 03:40:22.000 721 99622 50171.5 5017150 721 99622 50171.5 5017150 -32449 32689 4951.66 495166 -124 127 0.62 62 -722 100 10712 99623 2.16816 299.16816 150.66816 15066.81681 2.16816 299.16818 150.66816 15066.81695 2.16816 299.16816 150.66816 15066.81600 2020-01-01 2020-01-02 2020-01-01 00:12:02 2020-01-02 03:40:23 2020-01-01 00:12:02.000 2020-01-02 03:40:23.000 722 99623 50172.5 5017250 722 99623 50172.5 5017250 -32448 32690 4952.66 495266 -128 127 -0.94 -94 -723 100 10713 99624 2.17117 299.17117 150.67117 15067.11711 2.17117 299.17117 150.67117 15067.11724 2.17117 299.17117 150.67117 15067.11700 2020-01-01 2020-01-02 2020-01-01 00:12:03 2020-01-02 03:40:24 2020-01-01 00:12:03.000 2020-01-02 03:40:24.000 723 99624 50173.5 5017350 723 99624 50173.5 5017350 -32447 32691 4953.66 495366 -128 123 -2.5 -250 -724 100 10714 99625 2.17417 299.17417 150.67417 15067.41741 2.17417 299.17416 150.67417 15067.41742 2.17417 299.17417 150.67417 15067.41700 2020-01-01 2020-01-02 2020-01-01 00:12:04 2020-01-02 03:40:25 2020-01-01 00:12:04.000 2020-01-02 03:40:25.000 724 99625 50174.5 5017450 724 99625 50174.5 5017450 -32446 32692 4954.66 495466 -127 124 -1.5 -150 -725 100 10715 99626 2.17717 299.17717 150.67717 15067.71771 2.17717 299.1772 150.67717 15067.71752 2.17717 299.17717 150.67717000000002 15067.71700 2020-01-01 2020-01-02 2020-01-01 00:12:05 2020-01-02 03:40:26 2020-01-01 00:12:05.000 2020-01-02 03:40:26.000 725 99626 50175.5 5017550 725 99626 50175.5 5017550 -32445 32693 4955.66 495566 -126 125 -0.5 -50 -726 100 10716 99627 2.18018 299.18018 150.68018 15068.01801 2.18018 299.18018 150.68017 15068.01782 2.18018 299.18018 150.68018 15068.01800 2020-01-01 2020-01-02 2020-01-01 00:12:06 2020-01-02 03:40:27 2020-01-01 00:12:06.000 2020-01-02 03:40:27.000 726 99627 50176.5 5017650 726 99627 50176.5 5017650 -32444 32694 4956.66 495666 -125 126 0.5 50 -727 100 10717 99628 2.18318 299.18318 150.68318 15068.31831 2.18318 299.1832 150.68318 15068.31842 2.18318 299.18318 150.68318 15068.31800 2020-01-01 2020-01-02 2020-01-01 00:12:07 2020-01-02 03:40:28 2020-01-01 00:12:07.000 2020-01-02 03:40:28.000 727 99628 50177.5 5017750 727 99628 50177.5 5017750 -32443 32695 4957.66 495766 -124 127 1.5 150 -728 100 10718 99629 2.18618 299.18618 150.68618 15068.61861 2.18618 299.1862 150.68618 15068.61875 2.18618 299.18618 150.68618 15068.61800 2020-01-01 2020-01-02 2020-01-01 00:12:08 2020-01-02 03:40:29 2020-01-01 00:12:08.000 2020-01-02 03:40:29.000 728 99629 50178.5 5017850 728 99629 50178.5 5017850 -32442 32696 4958.66 495866 -128 127 -0.06 -6 -729 100 10719 99630 2.18918 299.18918 150.68918 15068.91891 2.18918 299.18918 150.68918 15068.91889 2.18918 299.18918 150.68918 15068.91800 2020-01-01 2020-01-02 2020-01-01 00:12:09 2020-01-02 03:40:30 2020-01-01 00:12:09.000 2020-01-02 03:40:30.000 729 99630 50179.5 5017950 729 99630 50179.5 5017950 -32441 32697 4959.66 495966 -128 123 -1.62 -162 +720 100 10710 99621 2.16216 299.16216 150.66216 15066.21621 2.16216 299.16217 150.66216 15066.21606 2.16216 299.16216 150.66216 15066.216 2020-01-01 2020-01-02 2020-01-01 00:12:00 2020-01-02 03:40:21 2020-01-01 00:12:00.000 2020-01-02 03:40:21.000 720 99621 50170.5 5017050 720 99621 50170.5 5017050 -32450 32688 4950.66 495066 -125 126 -0.38 -38 +721 100 10711 99622 2.16516 299.16516 150.66516 15066.51651 2.16516 299.16516 150.66516 15066.51635 2.16516 299.16516 150.66516 15066.516 2020-01-01 2020-01-02 2020-01-01 00:12:01 2020-01-02 03:40:22 2020-01-01 00:12:01.000 2020-01-02 03:40:22.000 721 99622 50171.5 5017150 721 99622 50171.5 5017150 -32449 32689 4951.66 495166 -124 127 0.62 62 +722 100 10712 99623 2.16816 299.16816 150.66816 15066.81681 2.16816 299.16818 150.66816 15066.81695 2.16816 299.16816 150.66816 15066.816 2020-01-01 2020-01-02 2020-01-01 00:12:02 2020-01-02 03:40:23 2020-01-01 00:12:02.000 2020-01-02 03:40:23.000 722 99623 50172.5 5017250 722 99623 50172.5 5017250 -32448 32690 4952.66 495266 -128 127 -0.94 -94 +723 100 10713 99624 2.17117 299.17117 150.67117 15067.11711 2.17117 299.17117 150.67117 15067.11724 2.17117 299.17117 150.67117 15067.117 2020-01-01 2020-01-02 2020-01-01 00:12:03 2020-01-02 03:40:24 2020-01-01 00:12:03.000 2020-01-02 03:40:24.000 723 99624 50173.5 5017350 723 99624 50173.5 5017350 -32447 32691 4953.66 495366 -128 123 -2.5 -250 +724 100 10714 99625 2.17417 299.17417 150.67417 15067.41741 2.17417 299.17416 150.67417 15067.41742 2.17417 299.17417 150.67417 15067.417 2020-01-01 2020-01-02 2020-01-01 00:12:04 2020-01-02 03:40:25 2020-01-01 00:12:04.000 2020-01-02 03:40:25.000 724 99625 50174.5 5017450 724 99625 50174.5 5017450 -32446 32692 4954.66 495466 -127 124 -1.5 -150 +725 100 10715 99626 2.17717 299.17717 150.67717 15067.71771 2.17717 299.1772 150.67717 15067.71752 2.17717 299.17717 150.67717000000002 15067.717 2020-01-01 2020-01-02 2020-01-01 00:12:05 2020-01-02 03:40:26 2020-01-01 00:12:05.000 2020-01-02 03:40:26.000 725 99626 50175.5 5017550 725 99626 50175.5 5017550 -32445 32693 4955.66 495566 -126 125 -0.5 -50 +726 100 10716 99627 2.18018 299.18018 150.68018 15068.01801 2.18018 299.18018 150.68017 15068.01782 2.18018 299.18018 150.68018 15068.018 2020-01-01 2020-01-02 2020-01-01 00:12:06 2020-01-02 03:40:27 2020-01-01 00:12:06.000 2020-01-02 03:40:27.000 726 99627 50176.5 5017650 726 99627 50176.5 5017650 -32444 32694 4956.66 495666 -125 126 0.5 50 +727 100 10717 99628 2.18318 299.18318 150.68318 15068.31831 2.18318 299.1832 150.68318 15068.31842 2.18318 299.18318 150.68318 15068.318 2020-01-01 2020-01-02 2020-01-01 00:12:07 2020-01-02 03:40:28 2020-01-01 00:12:07.000 2020-01-02 03:40:28.000 727 99628 50177.5 5017750 727 99628 50177.5 5017750 -32443 32695 4957.66 495766 -124 127 1.5 150 +728 100 10718 99629 2.18618 299.18618 150.68618 15068.61861 2.18618 299.1862 150.68618 15068.61875 2.18618 299.18618 150.68618 15068.618 2020-01-01 2020-01-02 2020-01-01 00:12:08 2020-01-02 03:40:29 2020-01-01 00:12:08.000 2020-01-02 03:40:29.000 728 99629 50178.5 5017850 728 99629 50178.5 5017850 -32442 32696 4958.66 495866 -128 127 -0.06 -6 +729 100 10719 99630 2.18918 299.18918 150.68918 15068.91891 2.18918 299.18918 150.68918 15068.91889 2.18918 299.18918 150.68918 15068.918 2020-01-01 2020-01-02 2020-01-01 00:12:09 2020-01-02 03:40:30 2020-01-01 00:12:09.000 2020-01-02 03:40:30.000 729 99630 50179.5 5017950 729 99630 50179.5 5017950 -32441 32697 4959.66 495966 -128 123 -1.62 -162 73 102 10063 99973 0.21921 300.21921 150.21921 15172.14114 0.21921 300.2192 150.21921 15172.14121 0.21921 300.21921 150.21921 15172.14021 2020-01-01 2020-01-02 2020-01-01 00:01:13 2020-01-02 03:46:13 2020-01-01 00:01:13.000 2020-01-02 03:46:13.000 73 99973 50023 5052323 73 99973 50023 5052323 -32496 32439 4602.009900990099 464803 -128 127 -3.4554455445544554 -349 -730 100 10720 99631 2.19219 299.19219 150.69219 15069.21921 2.19219 299.1922 150.69219 15069.21965 2.19219 299.19219 150.69218999999998 15069.21900 2020-01-01 2020-01-02 2020-01-01 00:12:10 2020-01-02 03:40:31 2020-01-01 00:12:10.000 2020-01-02 03:40:31.000 730 99631 50180.5 5018050 730 99631 50180.5 5018050 -32440 32698 4960.66 496066 -127 124 -0.62 -62 -731 100 10721 99632 2.19519 299.19519 150.69519 15069.51951 2.19519 299.1952 150.69519 15069.51928 2.19519 299.19519 150.69519 15069.51900 2020-01-01 2020-01-02 2020-01-01 00:12:11 2020-01-02 03:40:32 2020-01-01 00:12:11.000 2020-01-02 03:40:32.000 731 99632 50181.5 5018150 731 99632 50181.5 5018150 -32439 32699 4961.66 496166 -126 125 0.38 38 -732 100 10722 99633 2.19819 299.19819 150.69819 15069.81981 2.19819 299.1982 150.69819 15069.81988 2.19819 299.19819 150.69818999999998 15069.81900 2020-01-01 2020-01-02 2020-01-01 00:12:12 2020-01-02 03:40:33 2020-01-01 00:12:12.000 2020-01-02 03:40:33.000 732 99633 50182.5 5018250 732 99633 50182.5 5018250 -32438 32700 4962.66 496266 -125 126 1.38 138 -733 100 10723 99634 2.2012 299.2012 150.7012 15070.12012 2.2012 299.2012 150.7012 15070.12022 2.20120 299.20120 150.7012 15070.12000 2020-01-01 2020-01-02 2020-01-01 00:12:13 2020-01-02 03:40:34 2020-01-01 00:12:13.000 2020-01-02 03:40:34.000 733 99634 50183.5 5018350 733 99634 50183.5 5018350 -32437 32701 4963.66 496366 -124 127 2.38 238 -734 100 10724 99635 2.2042 299.2042 150.7042 15070.42042 2.2042 299.2042 150.7042 15070.42036 2.20420 299.20420 150.70420000000001 15070.42000 2020-01-01 2020-01-02 2020-01-01 00:12:14 2020-01-02 03:40:35 2020-01-01 00:12:14.000 2020-01-02 03:40:35.000 734 99635 50184.5 5018450 734 99635 50184.5 5018450 -32436 32702 4964.66 496466 -128 127 0.82 82 -735 100 10725 99636 2.2072 299.2072 150.7072 15070.72072 2.2072 299.2072 150.70721 15070.72111 2.20720 299.20720 150.7072 15070.72000 2020-01-01 2020-01-02 2020-01-01 00:12:15 2020-01-02 03:40:36 2020-01-01 00:12:15.000 2020-01-02 03:40:36.000 735 99636 50185.5 5018550 735 99636 50185.5 5018550 -32435 32703 4965.66 496566 -128 127 -0.74 -74 -736 100 10726 99637 2.21021 299.21021 150.71021 15071.02102 2.21021 299.2102 150.7102 15071.02076 2.21021 299.21021 150.71021000000002 15071.02100 2020-01-01 2020-01-02 2020-01-01 00:12:16 2020-01-02 03:40:37 2020-01-01 00:12:16.000 2020-01-02 03:40:37.000 736 99637 50186.5 5018650 736 99637 50186.5 5018650 -32434 32704 4966.66 496666 -128 124 -2.3 -230 -737 100 10727 99638 2.21321 299.21321 150.71321 15071.32132 2.21321 299.21323 150.71321 15071.32139 2.21321 299.21321 150.71321 15071.32100 2020-01-01 2020-01-02 2020-01-01 00:12:17 2020-01-02 03:40:38 2020-01-01 00:12:17.000 2020-01-02 03:40:38.000 737 99638 50187.5 5018750 737 99638 50187.5 5018750 -32433 32705 4967.66 496766 -127 125 -1.3 -130 -738 100 10728 99639 2.21621 299.21621 150.71621 15071.62162 2.21621 299.21622 150.71621 15071.62169 2.21621 299.21621 150.71621 15071.62100 2020-01-01 2020-01-02 2020-01-01 00:12:18 2020-01-02 03:40:39 2020-01-01 00:12:18.000 2020-01-02 03:40:39.000 738 99639 50188.5 5018850 738 99639 50188.5 5018850 -32432 32706 4968.66 496866 -126 126 -0.3 -30 -739 100 10729 99640 2.21921 299.21921 150.71921 15071.92192 2.21921 299.2192 150.71921 15071.92199 2.21921 299.21921 150.71921 15071.92100 2020-01-01 2020-01-02 2020-01-01 00:12:19 2020-01-02 03:40:40 2020-01-01 00:12:19.000 2020-01-02 03:40:40.000 739 99640 50189.5 5018950 739 99640 50189.5 5018950 -32431 32707 4969.66 496966 -125 127 0.7 70 +730 100 10720 99631 2.19219 299.19219 150.69219 15069.21921 2.19219 299.1922 150.69219 15069.21965 2.19219 299.19219 150.69218999999998 15069.219 2020-01-01 2020-01-02 2020-01-01 00:12:10 2020-01-02 03:40:31 2020-01-01 00:12:10.000 2020-01-02 03:40:31.000 730 99631 50180.5 5018050 730 99631 50180.5 5018050 -32440 32698 4960.66 496066 -127 124 -0.62 -62 +731 100 10721 99632 2.19519 299.19519 150.69519 15069.51951 2.19519 299.1952 150.69519 15069.51928 2.19519 299.19519 150.69519 15069.519 2020-01-01 2020-01-02 2020-01-01 00:12:11 2020-01-02 03:40:32 2020-01-01 00:12:11.000 2020-01-02 03:40:32.000 731 99632 50181.5 5018150 731 99632 50181.5 5018150 -32439 32699 4961.66 496166 -126 125 0.38 38 +732 100 10722 99633 2.19819 299.19819 150.69819 15069.81981 2.19819 299.1982 150.69819 15069.81988 2.19819 299.19819 150.69818999999998 15069.819 2020-01-01 2020-01-02 2020-01-01 00:12:12 2020-01-02 03:40:33 2020-01-01 00:12:12.000 2020-01-02 03:40:33.000 732 99633 50182.5 5018250 732 99633 50182.5 5018250 -32438 32700 4962.66 496266 -125 126 1.38 138 +733 100 10723 99634 2.2012 299.2012 150.7012 15070.12012 2.2012 299.2012 150.7012 15070.12022 2.2012 299.2012 150.7012 15070.12 2020-01-01 2020-01-02 2020-01-01 00:12:13 2020-01-02 03:40:34 2020-01-01 00:12:13.000 2020-01-02 03:40:34.000 733 99634 50183.5 5018350 733 99634 50183.5 5018350 -32437 32701 4963.66 496366 -124 127 2.38 238 +734 100 10724 99635 2.2042 299.2042 150.7042 15070.42042 2.2042 299.2042 150.7042 15070.42036 2.2042 299.2042 150.70420000000001 15070.42 2020-01-01 2020-01-02 2020-01-01 00:12:14 2020-01-02 03:40:35 2020-01-01 00:12:14.000 2020-01-02 03:40:35.000 734 99635 50184.5 5018450 734 99635 50184.5 5018450 -32436 32702 4964.66 496466 -128 127 0.82 82 +735 100 10725 99636 2.2072 299.2072 150.7072 15070.72072 2.2072 299.2072 150.70721 15070.72111 2.2072 299.2072 150.7072 15070.72 2020-01-01 2020-01-02 2020-01-01 00:12:15 2020-01-02 03:40:36 2020-01-01 00:12:15.000 2020-01-02 03:40:36.000 735 99636 50185.5 5018550 735 99636 50185.5 5018550 -32435 32703 4965.66 496566 -128 127 -0.74 -74 +736 100 10726 99637 2.21021 299.21021 150.71021 15071.02102 2.21021 299.2102 150.7102 15071.02076 2.21021 299.21021 150.71021000000002 15071.021 2020-01-01 2020-01-02 2020-01-01 00:12:16 2020-01-02 03:40:37 2020-01-01 00:12:16.000 2020-01-02 03:40:37.000 736 99637 50186.5 5018650 736 99637 50186.5 5018650 -32434 32704 4966.66 496666 -128 124 -2.3 -230 +737 100 10727 99638 2.21321 299.21321 150.71321 15071.32132 2.21321 299.21323 150.71321 15071.32139 2.21321 299.21321 150.71321 15071.321 2020-01-01 2020-01-02 2020-01-01 00:12:17 2020-01-02 03:40:38 2020-01-01 00:12:17.000 2020-01-02 03:40:38.000 737 99638 50187.5 5018750 737 99638 50187.5 5018750 -32433 32705 4967.66 496766 -127 125 -1.3 -130 +738 100 10728 99639 2.21621 299.21621 150.71621 15071.62162 2.21621 299.21622 150.71621 15071.62169 2.21621 299.21621 150.71621 15071.621 2020-01-01 2020-01-02 2020-01-01 00:12:18 2020-01-02 03:40:39 2020-01-01 00:12:18.000 2020-01-02 03:40:39.000 738 99639 50188.5 5018850 738 99639 50188.5 5018850 -32432 32706 4968.66 496866 -126 126 -0.3 -30 +739 100 10729 99640 2.21921 299.21921 150.71921 15071.92192 2.21921 299.2192 150.71921 15071.92199 2.21921 299.21921 150.71921 15071.921 2020-01-01 2020-01-02 2020-01-01 00:12:19 2020-01-02 03:40:40 2020-01-01 00:12:19.000 2020-01-02 03:40:40.000 739 99640 50189.5 5018950 739 99640 50189.5 5018950 -32431 32707 4969.66 496966 -125 127 0.7 70 74 102 10064 99974 0.22222 300.22222 150.22222 15172.44444 0.22222 300.22223 150.22222 15172.4448 0.22222 300.22222 150.22222 15172.44422 2020-01-01 2020-01-02 2020-01-01 00:01:14 2020-01-02 03:46:14 2020-01-01 00:01:14.000 2020-01-02 03:46:14.000 74 99974 50024 5052424 74 99974 50024 5052424 -32495 32440 4603.009900990099 464904 -128 123 -4.99009900990099 -504 -740 100 10730 99641 2.22222 299.22222 150.72222 15072.22222 2.22222 299.22223 150.72222 15072.22258 2.22222 299.22222 150.72222 15072.22200 2020-01-01 2020-01-02 2020-01-01 00:12:20 2020-01-02 03:40:41 2020-01-01 00:12:20.000 2020-01-02 03:40:41.000 740 99641 50190.5 5019050 740 99641 50190.5 5019050 -32430 32708 4970.66 497066 -128 127 -0.86 -86 -741 100 10731 99642 2.22522 299.22522 150.72522 15072.52252 2.22522 299.22522 150.72522 15072.52223 2.22522 299.22522 150.72522 15072.52200 2020-01-01 2020-01-02 2020-01-01 00:12:21 2020-01-02 03:40:42 2020-01-01 00:12:21.000 2020-01-02 03:40:42.000 741 99642 50191.5 5019150 741 99642 50191.5 5019150 -32429 32709 4971.66 497166 -128 127 -2.42 -242 -742 100 10732 99643 2.22822 299.22822 150.72822 15072.82282 2.22822 299.22824 150.72822 15072.82286 2.22822 299.22822 150.72822 15072.82200 2020-01-01 2020-01-02 2020-01-01 00:12:22 2020-01-02 03:40:43 2020-01-01 00:12:22.000 2020-01-02 03:40:43.000 742 99643 50192.5 5019250 742 99643 50192.5 5019250 -32428 32710 4972.66 497266 -128 123 -3.98 -398 -743 100 10733 99644 2.23123 299.23123 150.73123 15073.12312 2.23123 299.23123 150.73123 15073.12316 2.23123 299.23123 150.73122999999998 15073.12300 2020-01-01 2020-01-02 2020-01-01 00:12:23 2020-01-02 03:40:44 2020-01-01 00:12:23.000 2020-01-02 03:40:44.000 743 99644 50193.5 5019350 743 99644 50193.5 5019350 -32427 32711 4973.66 497366 -127 124 -2.98 -298 -744 100 10734 99645 2.23423 299.23423 150.73423 15073.42342 2.23423 299.23422 150.73423 15073.42345 2.23423 299.23423 150.73423 15073.42300 2020-01-01 2020-01-02 2020-01-01 00:12:24 2020-01-02 03:40:45 2020-01-01 00:12:24.000 2020-01-02 03:40:45.000 744 99645 50194.5 5019450 744 99645 50194.5 5019450 -32426 32712 4974.66 497466 -126 125 -1.98 -198 -745 100 10735 99646 2.23723 299.23723 150.73723 15073.72372 2.23723 299.23724 150.73724 15073.72405 2.23723 299.23723 150.73723 15073.72300 2020-01-01 2020-01-02 2020-01-01 00:12:25 2020-01-02 03:40:46 2020-01-01 00:12:25.000 2020-01-02 03:40:46.000 745 99646 50195.5 5019550 745 99646 50195.5 5019550 -32425 32713 4975.66 497566 -125 126 -0.98 -98 -746 100 10736 99647 2.24024 299.24024 150.74024 15074.02402 2.24024 299.24023 150.74023 15074.02373 2.24024 299.24024 150.74024 15074.02400 2020-01-01 2020-01-02 2020-01-01 00:12:26 2020-01-02 03:40:47 2020-01-01 00:12:26.000 2020-01-02 03:40:47.000 746 99647 50196.5 5019650 746 99647 50196.5 5019650 -32424 32714 4976.66 497666 -124 127 0.02 2 -747 100 10737 99648 2.24324 299.24324 150.74324 15074.32432 2.24324 299.24326 150.74324 15074.32433 2.24324 299.24324 150.74324000000001 15074.32400 2020-01-01 2020-01-02 2020-01-01 00:12:27 2020-01-02 03:40:48 2020-01-01 00:12:27.000 2020-01-02 03:40:48.000 747 99648 50197.5 5019750 747 99648 50197.5 5019750 -32423 32715 4977.66 497766 -128 127 -1.54 -154 -748 100 10738 99649 2.24624 299.24624 150.74624 15074.62462 2.24624 299.24625 150.74624 15074.62463 2.24624 299.24624 150.74624 15074.62400 2020-01-01 2020-01-02 2020-01-01 00:12:28 2020-01-02 03:40:49 2020-01-01 00:12:28.000 2020-01-02 03:40:49.000 748 99649 50198.5 5019850 748 99649 50198.5 5019850 -32422 32716 4978.66 497866 -128 123 -3.1 -310 -749 100 10739 99650 2.24924 299.24924 150.74924 15074.92492 2.24924 299.24924 150.74924 15074.92492 2.24924 299.24924 150.74924000000001 15074.92400 2020-01-01 2020-01-02 2020-01-01 00:12:29 2020-01-02 03:40:50 2020-01-01 00:12:29.000 2020-01-02 03:40:50.000 749 99650 50199.5 5019950 749 99650 50199.5 5019950 -32421 32717 4979.66 497966 -127 124 -2.1 -210 +740 100 10730 99641 2.22222 299.22222 150.72222 15072.22222 2.22222 299.22223 150.72222 15072.22258 2.22222 299.22222 150.72222 15072.222 2020-01-01 2020-01-02 2020-01-01 00:12:20 2020-01-02 03:40:41 2020-01-01 00:12:20.000 2020-01-02 03:40:41.000 740 99641 50190.5 5019050 740 99641 50190.5 5019050 -32430 32708 4970.66 497066 -128 127 -0.86 -86 +741 100 10731 99642 2.22522 299.22522 150.72522 15072.52252 2.22522 299.22522 150.72522 15072.52223 2.22522 299.22522 150.72522 15072.522 2020-01-01 2020-01-02 2020-01-01 00:12:21 2020-01-02 03:40:42 2020-01-01 00:12:21.000 2020-01-02 03:40:42.000 741 99642 50191.5 5019150 741 99642 50191.5 5019150 -32429 32709 4971.66 497166 -128 127 -2.42 -242 +742 100 10732 99643 2.22822 299.22822 150.72822 15072.82282 2.22822 299.22824 150.72822 15072.82286 2.22822 299.22822 150.72822 15072.822 2020-01-01 2020-01-02 2020-01-01 00:12:22 2020-01-02 03:40:43 2020-01-01 00:12:22.000 2020-01-02 03:40:43.000 742 99643 50192.5 5019250 742 99643 50192.5 5019250 -32428 32710 4972.66 497266 -128 123 -3.98 -398 +743 100 10733 99644 2.23123 299.23123 150.73123 15073.12312 2.23123 299.23123 150.73123 15073.12316 2.23123 299.23123 150.73122999999998 15073.123 2020-01-01 2020-01-02 2020-01-01 00:12:23 2020-01-02 03:40:44 2020-01-01 00:12:23.000 2020-01-02 03:40:44.000 743 99644 50193.5 5019350 743 99644 50193.5 5019350 -32427 32711 4973.66 497366 -127 124 -2.98 -298 +744 100 10734 99645 2.23423 299.23423 150.73423 15073.42342 2.23423 299.23422 150.73423 15073.42345 2.23423 299.23423 150.73423 15073.423 2020-01-01 2020-01-02 2020-01-01 00:12:24 2020-01-02 03:40:45 2020-01-01 00:12:24.000 2020-01-02 03:40:45.000 744 99645 50194.5 5019450 744 99645 50194.5 5019450 -32426 32712 4974.66 497466 -126 125 -1.98 -198 +745 100 10735 99646 2.23723 299.23723 150.73723 15073.72372 2.23723 299.23724 150.73724 15073.72405 2.23723 299.23723 150.73723 15073.723 2020-01-01 2020-01-02 2020-01-01 00:12:25 2020-01-02 03:40:46 2020-01-01 00:12:25.000 2020-01-02 03:40:46.000 745 99646 50195.5 5019550 745 99646 50195.5 5019550 -32425 32713 4975.66 497566 -125 126 -0.98 -98 +746 100 10736 99647 2.24024 299.24024 150.74024 15074.02402 2.24024 299.24023 150.74023 15074.02373 2.24024 299.24024 150.74024 15074.024 2020-01-01 2020-01-02 2020-01-01 00:12:26 2020-01-02 03:40:47 2020-01-01 00:12:26.000 2020-01-02 03:40:47.000 746 99647 50196.5 5019650 746 99647 50196.5 5019650 -32424 32714 4976.66 497666 -124 127 0.02 2 +747 100 10737 99648 2.24324 299.24324 150.74324 15074.32432 2.24324 299.24326 150.74324 15074.32433 2.24324 299.24324 150.74324000000001 15074.324 2020-01-01 2020-01-02 2020-01-01 00:12:27 2020-01-02 03:40:48 2020-01-01 00:12:27.000 2020-01-02 03:40:48.000 747 99648 50197.5 5019750 747 99648 50197.5 5019750 -32423 32715 4977.66 497766 -128 127 -1.54 -154 +748 100 10738 99649 2.24624 299.24624 150.74624 15074.62462 2.24624 299.24625 150.74624 15074.62463 2.24624 299.24624 150.74624 15074.624 2020-01-01 2020-01-02 2020-01-01 00:12:28 2020-01-02 03:40:49 2020-01-01 00:12:28.000 2020-01-02 03:40:49.000 748 99649 50198.5 5019850 748 99649 50198.5 5019850 -32422 32716 4978.66 497866 -128 123 -3.1 -310 +749 100 10739 99650 2.24924 299.24924 150.74924 15074.92492 2.24924 299.24924 150.74924 15074.92492 2.24924 299.24924 150.74924000000001 15074.924 2020-01-01 2020-01-02 2020-01-01 00:12:29 2020-01-02 03:40:50 2020-01-01 00:12:29.000 2020-01-02 03:40:50.000 749 99650 50199.5 5019950 749 99650 50199.5 5019950 -32421 32717 4979.66 497966 -127 124 -2.1 -210 75 102 10065 99975 0.22522 300.22522 150.22522 15172.74774 0.22522 300.22522 150.22522 15172.74745 0.22522 300.22522 150.22521999999998 15172.74722 2020-01-01 2020-01-02 2020-01-01 00:01:15 2020-01-02 03:46:15 2020-01-01 00:01:15.000 2020-01-02 03:46:15.000 75 99975 50025 5052525 75 99975 50025 5052525 -32494 32441 4604.009900990099 465005 -127 124 -3.99009900990099 -403 -750 100 10740 99651 2.25225 299.25225 150.75225 15075.22522 2.25225 299.25226 150.75225 15075.22552 2.25225 299.25225 150.75225 15075.22500 2020-01-01 2020-01-02 2020-01-01 00:12:30 2020-01-02 03:40:51 2020-01-01 00:12:30.000 2020-01-02 03:40:51.000 750 99651 50200.5 5020050 750 99651 50200.5 5020050 -32420 32718 4980.66 498066 -126 125 -1.1 -110 -751 100 10741 99652 2.25525 299.25525 150.75525 15075.52552 2.25525 299.25525 150.75525 15075.5252 2.25525 299.25525 150.75525 15075.52500 2020-01-01 2020-01-02 2020-01-01 00:12:31 2020-01-02 03:40:52 2020-01-01 00:12:31.000 2020-01-02 03:40:52.000 751 99652 50201.5 5020150 751 99652 50201.5 5020150 -32419 32719 4981.66 498166 -125 126 -0.1 -10 -752 100 10742 99653 2.25825 299.25825 150.75825 15075.82582 2.25825 299.25827 150.75825 15075.8258 2.25825 299.25825 150.75825 15075.82500 2020-01-01 2020-01-02 2020-01-01 00:12:32 2020-01-02 03:40:53 2020-01-01 00:12:32.000 2020-01-02 03:40:53.000 752 99653 50202.5 5020250 752 99653 50202.5 5020250 -32418 32720 4982.66 498266 -124 127 0.9 90 -753 100 10743 99654 2.26126 299.26126 150.76126 15076.12612 2.26126 299.26126 150.76126 15076.12609 2.26126 299.26126 150.76126 15076.12600 2020-01-01 2020-01-02 2020-01-01 00:12:33 2020-01-02 03:40:54 2020-01-01 00:12:33.000 2020-01-02 03:40:54.000 753 99654 50203.5 5020350 753 99654 50203.5 5020350 -32417 32721 4983.66 498366 -128 127 -0.66 -66 -754 100 10744 99655 2.26426 299.26426 150.76426 15076.42642 2.26426 299.26425 150.76426 15076.4264 2.26426 299.26426 150.76426 15076.42600 2020-01-01 2020-01-02 2020-01-01 00:12:34 2020-01-02 03:40:55 2020-01-01 00:12:34.000 2020-01-02 03:40:55.000 754 99655 50204.5 5020450 754 99655 50204.5 5020450 -32416 32722 4984.66 498466 -128 123 -2.22 -222 -755 100 10745 99656 2.26726 299.26726 150.76726 15076.72672 2.26726 299.26727 150.76727 15076.72703 2.26726 299.26726 150.76726 15076.72600 2020-01-01 2020-01-02 2020-01-01 00:12:35 2020-01-02 03:40:56 2020-01-01 00:12:35.000 2020-01-02 03:40:56.000 755 99656 50205.5 5020550 755 99656 50205.5 5020550 -32415 32723 4985.66 498566 -127 124 -1.22 -122 -756 100 10746 99657 2.27027 299.27027 150.77027 15077.02702 2.27027 299.27026 150.77026 15077.02667 2.27027 299.27027 150.77027 15077.02700 2020-01-01 2020-01-02 2020-01-01 00:12:36 2020-01-02 03:40:57 2020-01-01 00:12:36.000 2020-01-02 03:40:57.000 756 99657 50206.5 5020650 756 99657 50206.5 5020650 -32414 32724 4986.66 498666 -126 125 -0.22 -22 -757 100 10747 99658 2.27327 299.27327 150.77327 15077.32732 2.27327 299.2733 150.77327 15077.32727 2.27327 299.27327 150.77327 15077.32700 2020-01-01 2020-01-02 2020-01-01 00:12:37 2020-01-02 03:40:58 2020-01-01 00:12:37.000 2020-01-02 03:40:58.000 757 99658 50207.5 5020750 757 99658 50207.5 5020750 -32413 32725 4987.66 498766 -125 126 0.78 78 -758 100 10748 99659 2.27627 299.27627 150.77627 15077.62762 2.27627 299.27628 150.77627 15077.62756 2.27627 299.27627 150.77627 15077.62700 2020-01-01 2020-01-02 2020-01-01 00:12:38 2020-01-02 03:40:59 2020-01-01 00:12:38.000 2020-01-02 03:40:59.000 758 99659 50208.5 5020850 758 99659 50208.5 5020850 -32412 32726 4988.66 498866 -124 127 1.78 178 -759 100 10749 99660 2.27927 299.27927 150.77927 15077.92792 2.27927 299.27927 150.77927 15077.92787 2.27927 299.27927 150.77927 15077.92700 2020-01-01 2020-01-02 2020-01-01 00:12:39 2020-01-02 03:41:00 2020-01-01 00:12:39.000 2020-01-02 03:41:00.000 759 99660 50209.5 5020950 759 99660 50209.5 5020950 -32411 32727 4989.66 498966 -128 127 0.22 22 +750 100 10740 99651 2.25225 299.25225 150.75225 15075.22522 2.25225 299.25226 150.75225 15075.22552 2.25225 299.25225 150.75225 15075.225 2020-01-01 2020-01-02 2020-01-01 00:12:30 2020-01-02 03:40:51 2020-01-01 00:12:30.000 2020-01-02 03:40:51.000 750 99651 50200.5 5020050 750 99651 50200.5 5020050 -32420 32718 4980.66 498066 -126 125 -1.1 -110 +751 100 10741 99652 2.25525 299.25525 150.75525 15075.52552 2.25525 299.25525 150.75525 15075.5252 2.25525 299.25525 150.75525 15075.525 2020-01-01 2020-01-02 2020-01-01 00:12:31 2020-01-02 03:40:52 2020-01-01 00:12:31.000 2020-01-02 03:40:52.000 751 99652 50201.5 5020150 751 99652 50201.5 5020150 -32419 32719 4981.66 498166 -125 126 -0.1 -10 +752 100 10742 99653 2.25825 299.25825 150.75825 15075.82582 2.25825 299.25827 150.75825 15075.8258 2.25825 299.25825 150.75825 15075.825 2020-01-01 2020-01-02 2020-01-01 00:12:32 2020-01-02 03:40:53 2020-01-01 00:12:32.000 2020-01-02 03:40:53.000 752 99653 50202.5 5020250 752 99653 50202.5 5020250 -32418 32720 4982.66 498266 -124 127 0.9 90 +753 100 10743 99654 2.26126 299.26126 150.76126 15076.12612 2.26126 299.26126 150.76126 15076.12609 2.26126 299.26126 150.76126 15076.126 2020-01-01 2020-01-02 2020-01-01 00:12:33 2020-01-02 03:40:54 2020-01-01 00:12:33.000 2020-01-02 03:40:54.000 753 99654 50203.5 5020350 753 99654 50203.5 5020350 -32417 32721 4983.66 498366 -128 127 -0.66 -66 +754 100 10744 99655 2.26426 299.26426 150.76426 15076.42642 2.26426 299.26425 150.76426 15076.4264 2.26426 299.26426 150.76426 15076.426 2020-01-01 2020-01-02 2020-01-01 00:12:34 2020-01-02 03:40:55 2020-01-01 00:12:34.000 2020-01-02 03:40:55.000 754 99655 50204.5 5020450 754 99655 50204.5 5020450 -32416 32722 4984.66 498466 -128 123 -2.22 -222 +755 100 10745 99656 2.26726 299.26726 150.76726 15076.72672 2.26726 299.26727 150.76727 15076.72703 2.26726 299.26726 150.76726 15076.726 2020-01-01 2020-01-02 2020-01-01 00:12:35 2020-01-02 03:40:56 2020-01-01 00:12:35.000 2020-01-02 03:40:56.000 755 99656 50205.5 5020550 755 99656 50205.5 5020550 -32415 32723 4985.66 498566 -127 124 -1.22 -122 +756 100 10746 99657 2.27027 299.27027 150.77027 15077.02702 2.27027 299.27026 150.77026 15077.02667 2.27027 299.27027 150.77027 15077.027 2020-01-01 2020-01-02 2020-01-01 00:12:36 2020-01-02 03:40:57 2020-01-01 00:12:36.000 2020-01-02 03:40:57.000 756 99657 50206.5 5020650 756 99657 50206.5 5020650 -32414 32724 4986.66 498666 -126 125 -0.22 -22 +757 100 10747 99658 2.27327 299.27327 150.77327 15077.32732 2.27327 299.2733 150.77327 15077.32727 2.27327 299.27327 150.77327 15077.327 2020-01-01 2020-01-02 2020-01-01 00:12:37 2020-01-02 03:40:58 2020-01-01 00:12:37.000 2020-01-02 03:40:58.000 757 99658 50207.5 5020750 757 99658 50207.5 5020750 -32413 32725 4987.66 498766 -125 126 0.78 78 +758 100 10748 99659 2.27627 299.27627 150.77627 15077.62762 2.27627 299.27628 150.77627 15077.62756 2.27627 299.27627 150.77627 15077.627 2020-01-01 2020-01-02 2020-01-01 00:12:38 2020-01-02 03:40:59 2020-01-01 00:12:38.000 2020-01-02 03:40:59.000 758 99659 50208.5 5020850 758 99659 50208.5 5020850 -32412 32726 4988.66 498866 -124 127 1.78 178 +759 100 10749 99660 2.27927 299.27927 150.77927 15077.92792 2.27927 299.27927 150.77927 15077.92787 2.27927 299.27927 150.77927 15077.927 2020-01-01 2020-01-02 2020-01-01 00:12:39 2020-01-02 03:41:00 2020-01-01 00:12:39.000 2020-01-02 03:41:00.000 759 99660 50209.5 5020950 759 99660 50209.5 5020950 -32411 32727 4989.66 498966 -128 127 0.22 22 76 102 10066 99976 0.22822 300.22822 150.22822 15173.05105 0.22822 300.22824 150.22822 15173.05109 0.22822 300.22822 150.22822 15173.05022 2020-01-01 2020-01-02 2020-01-01 00:01:16 2020-01-02 03:46:16 2020-01-01 00:01:16.000 2020-01-02 03:46:16.000 76 99976 50026 5052626 76 99976 50026 5052626 -32493 32442 4605.009900990099 465106 -126 125 -2.99009900990099 -302 -760 100 10750 99661 2.28228 299.28228 150.78228 15078.22822 2.28228 299.2823 150.78228 15078.2285 2.28228 299.28228 150.78228 15078.22800 2020-01-01 2020-01-02 2020-01-01 00:12:40 2020-01-02 03:41:01 2020-01-01 00:12:40.000 2020-01-02 03:41:01.000 760 99661 50210.5 5021050 760 99661 50210.5 5021050 -32410 32728 4990.66 499066 -128 127 -1.34 -134 -761 100 10751 99662 2.28528 299.28528 150.78528 15078.52852 2.28528 299.28528 150.78528 15078.52814 2.28528 299.28528 150.78528 15078.52800 2020-01-01 2020-01-02 2020-01-01 00:12:41 2020-01-02 03:41:02 2020-01-01 00:12:41.000 2020-01-02 03:41:02.000 761 99662 50211.5 5021150 761 99662 50211.5 5021150 -32409 32729 4991.66 499166 -128 124 -2.9 -290 -762 100 10752 99663 2.28828 299.28828 150.78828 15078.82882 2.28828 299.2883 150.78828 15078.82889 2.28828 299.28828 150.78828 15078.82800 2020-01-01 2020-01-02 2020-01-01 00:12:42 2020-01-02 03:41:03 2020-01-01 00:12:42.000 2020-01-02 03:41:03.000 762 99663 50212.5 5021250 762 99663 50212.5 5021250 -32408 32730 4992.66 499266 -127 125 -1.9 -190 -763 100 10753 99664 2.29129 299.29129 150.79129 15079.12912 2.29129 299.2913 150.79129 15079.12904 2.29129 299.29129 150.79129 15079.12900 2020-01-01 2020-01-02 2020-01-01 00:12:43 2020-01-02 03:41:04 2020-01-01 00:12:43.000 2020-01-02 03:41:04.000 763 99664 50213.5 5021350 763 99664 50213.5 5021350 -32407 32731 4993.66 499366 -126 126 -0.9 -90 -764 100 10754 99665 2.29429 299.29429 150.79429 15079.42942 2.29429 299.29428 150.79429 15079.42933 2.29429 299.29429 150.79429 15079.42900 2020-01-01 2020-01-02 2020-01-01 00:12:44 2020-01-02 03:41:05 2020-01-01 00:12:44.000 2020-01-02 03:41:05.000 764 99665 50214.5 5021450 764 99665 50214.5 5021450 -32406 32732 4994.66 499466 -125 127 0.1 10 -765 100 10755 99666 2.29729 299.29729 150.79729 15079.72972 2.29729 299.2973 150.79729 15079.72996 2.29729 299.29729 150.79729 15079.72900 2020-01-01 2020-01-02 2020-01-01 00:12:45 2020-01-02 03:41:06 2020-01-01 00:12:45.000 2020-01-02 03:41:06.000 765 99666 50215.5 5021550 765 99666 50215.5 5021550 -32405 32733 4995.66 499566 -128 127 -1.46 -146 -766 100 10756 99667 2.3003 299.3003 150.8003 15080.03003 2.3003 299.3003 150.80029 15080.02961 2.30030 299.30030 150.8003 15080.03000 2020-01-01 2020-01-02 2020-01-01 00:12:46 2020-01-02 03:41:07 2020-01-01 00:12:46.000 2020-01-02 03:41:07.000 766 99667 50216.5 5021650 766 99667 50216.5 5021650 -32404 32734 4996.66 499666 -128 127 -3.02 -302 -767 100 10757 99668 2.3033 299.3033 150.8033 15080.33033 2.3033 299.3033 150.8033 15080.33036 2.30330 299.30330 150.8033 15080.33000 2020-01-01 2020-01-02 2020-01-01 00:12:47 2020-01-02 03:41:08 2020-01-01 00:12:47.000 2020-01-02 03:41:08.000 767 99668 50217.5 5021750 767 99668 50217.5 5021750 -32403 32735 4997.66 499766 -128 123 -4.58 -458 -768 100 10758 99669 2.3063 299.3063 150.8063 15080.63063 2.3063 299.3063 150.8063 15080.6305 2.30630 299.30630 150.8063 15080.63000 2020-01-01 2020-01-02 2020-01-01 00:12:48 2020-01-02 03:41:09 2020-01-01 00:12:48.000 2020-01-02 03:41:09.000 768 99669 50218.5 5021850 768 99669 50218.5 5021850 -32402 32736 4998.66 499866 -127 124 -3.58 -358 -769 100 10759 99670 2.3093 299.3093 150.8093 15080.93093 2.3093 299.3093 150.8093 15080.93084 2.30930 299.30930 150.8093 15080.93000 2020-01-01 2020-01-02 2020-01-01 00:12:49 2020-01-02 03:41:10 2020-01-01 00:12:49.000 2020-01-02 03:41:10.000 769 99670 50219.5 5021950 769 99670 50219.5 5021950 -32401 32737 4999.66 499966 -126 125 -2.58 -258 +760 100 10750 99661 2.28228 299.28228 150.78228 15078.22822 2.28228 299.2823 150.78228 15078.2285 2.28228 299.28228 150.78228 15078.228 2020-01-01 2020-01-02 2020-01-01 00:12:40 2020-01-02 03:41:01 2020-01-01 00:12:40.000 2020-01-02 03:41:01.000 760 99661 50210.5 5021050 760 99661 50210.5 5021050 -32410 32728 4990.66 499066 -128 127 -1.34 -134 +761 100 10751 99662 2.28528 299.28528 150.78528 15078.52852 2.28528 299.28528 150.78528 15078.52814 2.28528 299.28528 150.78528 15078.528 2020-01-01 2020-01-02 2020-01-01 00:12:41 2020-01-02 03:41:02 2020-01-01 00:12:41.000 2020-01-02 03:41:02.000 761 99662 50211.5 5021150 761 99662 50211.5 5021150 -32409 32729 4991.66 499166 -128 124 -2.9 -290 +762 100 10752 99663 2.28828 299.28828 150.78828 15078.82882 2.28828 299.2883 150.78828 15078.82889 2.28828 299.28828 150.78828 15078.828 2020-01-01 2020-01-02 2020-01-01 00:12:42 2020-01-02 03:41:03 2020-01-01 00:12:42.000 2020-01-02 03:41:03.000 762 99663 50212.5 5021250 762 99663 50212.5 5021250 -32408 32730 4992.66 499266 -127 125 -1.9 -190 +763 100 10753 99664 2.29129 299.29129 150.79129 15079.12912 2.29129 299.2913 150.79129 15079.12904 2.29129 299.29129 150.79129 15079.129 2020-01-01 2020-01-02 2020-01-01 00:12:43 2020-01-02 03:41:04 2020-01-01 00:12:43.000 2020-01-02 03:41:04.000 763 99664 50213.5 5021350 763 99664 50213.5 5021350 -32407 32731 4993.66 499366 -126 126 -0.9 -90 +764 100 10754 99665 2.29429 299.29429 150.79429 15079.42942 2.29429 299.29428 150.79429 15079.42933 2.29429 299.29429 150.79429 15079.429 2020-01-01 2020-01-02 2020-01-01 00:12:44 2020-01-02 03:41:05 2020-01-01 00:12:44.000 2020-01-02 03:41:05.000 764 99665 50214.5 5021450 764 99665 50214.5 5021450 -32406 32732 4994.66 499466 -125 127 0.1 10 +765 100 10755 99666 2.29729 299.29729 150.79729 15079.72972 2.29729 299.2973 150.79729 15079.72996 2.29729 299.29729 150.79729 15079.729 2020-01-01 2020-01-02 2020-01-01 00:12:45 2020-01-02 03:41:06 2020-01-01 00:12:45.000 2020-01-02 03:41:06.000 765 99666 50215.5 5021550 765 99666 50215.5 5021550 -32405 32733 4995.66 499566 -128 127 -1.46 -146 +766 100 10756 99667 2.3003 299.3003 150.8003 15080.03003 2.3003 299.3003 150.80029 15080.02961 2.3003 299.3003 150.8003 15080.03 2020-01-01 2020-01-02 2020-01-01 00:12:46 2020-01-02 03:41:07 2020-01-01 00:12:46.000 2020-01-02 03:41:07.000 766 99667 50216.5 5021650 766 99667 50216.5 5021650 -32404 32734 4996.66 499666 -128 127 -3.02 -302 +767 100 10757 99668 2.3033 299.3033 150.8033 15080.33033 2.3033 299.3033 150.8033 15080.33036 2.3033 299.3033 150.8033 15080.33 2020-01-01 2020-01-02 2020-01-01 00:12:47 2020-01-02 03:41:08 2020-01-01 00:12:47.000 2020-01-02 03:41:08.000 767 99668 50217.5 5021750 767 99668 50217.5 5021750 -32403 32735 4997.66 499766 -128 123 -4.58 -458 +768 100 10758 99669 2.3063 299.3063 150.8063 15080.63063 2.3063 299.3063 150.8063 15080.6305 2.3063 299.3063 150.8063 15080.63 2020-01-01 2020-01-02 2020-01-01 00:12:48 2020-01-02 03:41:09 2020-01-01 00:12:48.000 2020-01-02 03:41:09.000 768 99669 50218.5 5021850 768 99669 50218.5 5021850 -32402 32736 4998.66 499866 -127 124 -3.58 -358 +769 100 10759 99670 2.3093 299.3093 150.8093 15080.93093 2.3093 299.3093 150.8093 15080.93084 2.3093 299.3093 150.8093 15080.93 2020-01-01 2020-01-02 2020-01-01 00:12:49 2020-01-02 03:41:10 2020-01-01 00:12:49.000 2020-01-02 03:41:10.000 769 99670 50219.5 5021950 769 99670 50219.5 5021950 -32401 32737 4999.66 499966 -126 125 -2.58 -258 77 102 10067 99977 0.23123 300.23123 150.23123 15173.35435 0.23123 300.23123 150.23123 15173.35439 0.23123 300.23123 150.23123 15173.35423 2020-01-01 2020-01-02 2020-01-01 00:01:17 2020-01-02 03:46:17 2020-01-01 00:01:17.000 2020-01-02 03:46:17.000 77 99977 50027 5052727 77 99977 50027 5052727 -32492 32443 4606.009900990099 465207 -125 126 -1.99009900990099 -201 -770 100 10760 99671 2.31231 299.31231 150.81231 15081.23123 2.31231 299.31232 150.81231 15081.23144 2.31231 299.31231 150.81231 15081.23100 2020-01-01 2020-01-02 2020-01-01 00:12:50 2020-01-02 03:41:11 2020-01-01 00:12:50.000 2020-01-02 03:41:11.000 770 99671 50220.5 5022050 770 99671 50220.5 5022050 -32400 32738 5000.66 500066 -125 126 -1.58 -158 -771 100 10761 99672 2.31531 299.31531 150.81531 15081.53153 2.31531 299.3153 150.81531 15081.53173 2.31531 299.31531 150.81531 15081.53100 2020-01-01 2020-01-02 2020-01-01 00:12:51 2020-01-02 03:41:12 2020-01-01 00:12:51.000 2020-01-02 03:41:12.000 771 99672 50221.5 5022150 771 99672 50221.5 5022150 -32399 32739 5001.66 500166 -124 127 -0.58 -58 -772 100 10762 99673 2.31831 299.31831 150.81831 15081.83183 2.31831 299.31833 150.81831 15081.83183 2.31831 299.31831 150.81831 15081.83100 2020-01-01 2020-01-02 2020-01-01 00:12:52 2020-01-02 03:41:13 2020-01-01 00:12:52.000 2020-01-02 03:41:13.000 772 99673 50222.5 5022250 772 99673 50222.5 5022250 -32398 32740 5002.66 500266 -128 127 -2.14 -214 -773 100 10763 99674 2.32132 299.32132 150.82132 15082.13213 2.32132 299.32132 150.82131 15082.13197 2.32132 299.32132 150.82132 15082.13200 2020-01-01 2020-01-02 2020-01-01 00:12:53 2020-01-02 03:41:14 2020-01-01 00:12:53.000 2020-01-02 03:41:14.000 773 99674 50223.5 5022350 773 99674 50223.5 5022350 -32397 32741 5003.66 500366 -128 123 -3.7 -370 -774 100 10764 99675 2.32432 299.32432 150.82432 15082.43243 2.32432 299.3243 150.82432 15082.43231 2.32432 299.32432 150.82432 15082.43200 2020-01-01 2020-01-02 2020-01-01 00:12:54 2020-01-02 03:41:15 2020-01-01 00:12:54.000 2020-01-02 03:41:15.000 774 99675 50224.5 5022450 774 99675 50224.5 5022450 -32396 32742 5004.66 500466 -127 124 -2.7 -270 -775 100 10765 99676 2.32732 299.32732 150.82732 15082.73273 2.32732 299.32733 150.82732 15082.73291 2.32732 299.32732 150.82732 15082.73200 2020-01-01 2020-01-02 2020-01-01 00:12:55 2020-01-02 03:41:16 2020-01-01 00:12:55.000 2020-01-02 03:41:16.000 775 99676 50225.5 5022550 775 99676 50225.5 5022550 -32395 32743 5005.66 500566 -126 125 -1.7 -170 -776 100 10766 99677 2.33033 299.33033 150.83033 15083.03303 2.33033 299.33032 150.83033 15083.0332 2.33033 299.33033 150.83033 15083.03300 2020-01-01 2020-01-02 2020-01-01 00:12:56 2020-01-02 03:41:17 2020-01-01 00:12:56.000 2020-01-02 03:41:17.000 776 99677 50226.5 5022650 776 99677 50226.5 5022650 -32394 32744 5006.66 500666 -125 126 -0.7 -70 -777 100 10767 99678 2.33333 299.33333 150.83333 15083.33333 2.33333 299.33334 150.83333 15083.3333 2.33333 299.33333 150.83333000000002 15083.33300 2020-01-01 2020-01-02 2020-01-01 00:12:57 2020-01-02 03:41:18 2020-01-01 00:12:57.000 2020-01-02 03:41:18.000 777 99678 50227.5 5022750 777 99678 50227.5 5022750 -32393 32745 5007.66 500766 -124 127 0.3 30 -778 100 10768 99679 2.33633 299.33633 150.83633 15083.63363 2.33633 299.33633 150.83633 15083.63348 2.33633 299.33633 150.83633 15083.63300 2020-01-01 2020-01-02 2020-01-01 00:12:58 2020-01-02 03:41:19 2020-01-01 00:12:58.000 2020-01-02 03:41:19.000 778 99679 50228.5 5022850 778 99679 50228.5 5022850 -32392 32746 5008.66 500866 -128 127 -1.26 -126 -779 100 10769 99680 2.33933 299.33933 150.83933 15083.93393 2.33933 299.33932 150.83933 15083.93378 2.33933 299.33933 150.83933000000002 15083.93300 2020-01-01 2020-01-02 2020-01-01 00:12:59 2020-01-02 03:41:20 2020-01-01 00:12:59.000 2020-01-02 03:41:20.000 779 99680 50229.5 5022950 779 99680 50229.5 5022950 -32391 32747 5009.66 500966 -128 123 -2.82 -282 +770 100 10760 99671 2.31231 299.31231 150.81231 15081.23123 2.31231 299.31232 150.81231 15081.23144 2.31231 299.31231 150.81231 15081.231 2020-01-01 2020-01-02 2020-01-01 00:12:50 2020-01-02 03:41:11 2020-01-01 00:12:50.000 2020-01-02 03:41:11.000 770 99671 50220.5 5022050 770 99671 50220.5 5022050 -32400 32738 5000.66 500066 -125 126 -1.58 -158 +771 100 10761 99672 2.31531 299.31531 150.81531 15081.53153 2.31531 299.3153 150.81531 15081.53173 2.31531 299.31531 150.81531 15081.531 2020-01-01 2020-01-02 2020-01-01 00:12:51 2020-01-02 03:41:12 2020-01-01 00:12:51.000 2020-01-02 03:41:12.000 771 99672 50221.5 5022150 771 99672 50221.5 5022150 -32399 32739 5001.66 500166 -124 127 -0.58 -58 +772 100 10762 99673 2.31831 299.31831 150.81831 15081.83183 2.31831 299.31833 150.81831 15081.83183 2.31831 299.31831 150.81831 15081.831 2020-01-01 2020-01-02 2020-01-01 00:12:52 2020-01-02 03:41:13 2020-01-01 00:12:52.000 2020-01-02 03:41:13.000 772 99673 50222.5 5022250 772 99673 50222.5 5022250 -32398 32740 5002.66 500266 -128 127 -2.14 -214 +773 100 10763 99674 2.32132 299.32132 150.82132 15082.13213 2.32132 299.32132 150.82131 15082.13197 2.32132 299.32132 150.82132 15082.132 2020-01-01 2020-01-02 2020-01-01 00:12:53 2020-01-02 03:41:14 2020-01-01 00:12:53.000 2020-01-02 03:41:14.000 773 99674 50223.5 5022350 773 99674 50223.5 5022350 -32397 32741 5003.66 500366 -128 123 -3.7 -370 +774 100 10764 99675 2.32432 299.32432 150.82432 15082.43243 2.32432 299.3243 150.82432 15082.43231 2.32432 299.32432 150.82432 15082.432 2020-01-01 2020-01-02 2020-01-01 00:12:54 2020-01-02 03:41:15 2020-01-01 00:12:54.000 2020-01-02 03:41:15.000 774 99675 50224.5 5022450 774 99675 50224.5 5022450 -32396 32742 5004.66 500466 -127 124 -2.7 -270 +775 100 10765 99676 2.32732 299.32732 150.82732 15082.73273 2.32732 299.32733 150.82732 15082.73291 2.32732 299.32732 150.82732 15082.732 2020-01-01 2020-01-02 2020-01-01 00:12:55 2020-01-02 03:41:16 2020-01-01 00:12:55.000 2020-01-02 03:41:16.000 775 99676 50225.5 5022550 775 99676 50225.5 5022550 -32395 32743 5005.66 500566 -126 125 -1.7 -170 +776 100 10766 99677 2.33033 299.33033 150.83033 15083.03303 2.33033 299.33032 150.83033 15083.0332 2.33033 299.33033 150.83033 15083.033 2020-01-01 2020-01-02 2020-01-01 00:12:56 2020-01-02 03:41:17 2020-01-01 00:12:56.000 2020-01-02 03:41:17.000 776 99677 50226.5 5022650 776 99677 50226.5 5022650 -32394 32744 5006.66 500666 -125 126 -0.7 -70 +777 100 10767 99678 2.33333 299.33333 150.83333 15083.33333 2.33333 299.33334 150.83333 15083.3333 2.33333 299.33333 150.83333000000002 15083.333 2020-01-01 2020-01-02 2020-01-01 00:12:57 2020-01-02 03:41:18 2020-01-01 00:12:57.000 2020-01-02 03:41:18.000 777 99678 50227.5 5022750 777 99678 50227.5 5022750 -32393 32745 5007.66 500766 -124 127 0.3 30 +778 100 10768 99679 2.33633 299.33633 150.83633 15083.63363 2.33633 299.33633 150.83633 15083.63348 2.33633 299.33633 150.83633 15083.633 2020-01-01 2020-01-02 2020-01-01 00:12:58 2020-01-02 03:41:19 2020-01-01 00:12:58.000 2020-01-02 03:41:19.000 778 99679 50228.5 5022850 778 99679 50228.5 5022850 -32392 32746 5008.66 500866 -128 127 -1.26 -126 +779 100 10769 99680 2.33933 299.33933 150.83933 15083.93393 2.33933 299.33932 150.83933 15083.93378 2.33933 299.33933 150.83933000000002 15083.933 2020-01-01 2020-01-02 2020-01-01 00:12:59 2020-01-02 03:41:20 2020-01-01 00:12:59.000 2020-01-02 03:41:20.000 779 99680 50229.5 5022950 779 99680 50229.5 5022950 -32391 32747 5009.66 500966 -128 123 -2.82 -282 78 102 10068 99978 0.23423 300.23423 150.23423 15173.65765 0.23423 300.23422 150.23423 15173.65769 0.23423 300.23423 150.23423 15173.65723 2020-01-01 2020-01-02 2020-01-01 00:01:18 2020-01-02 03:46:18 2020-01-01 00:01:18.000 2020-01-02 03:46:18.000 78 99978 50028 5052828 78 99978 50028 5052828 -32491 32444 4607.009900990099 465308 -124 127 -0.9900990099009901 -100 -780 100 10770 99681 2.34234 299.34234 150.84234 15084.23423 2.34234 299.34235 150.84234 15084.23437 2.34234 299.34234 150.84234 15084.23400 2020-01-01 2020-01-02 2020-01-01 00:13:00 2020-01-02 03:41:21 2020-01-01 00:13:00.000 2020-01-02 03:41:21.000 780 99681 50230.5 5023050 780 99681 50230.5 5023050 -32390 32748 5010.66 501066 -127 124 -1.82 -182 -781 100 10771 99682 2.34534 299.34534 150.84534 15084.53453 2.34534 299.34534 150.84534 15084.53467 2.34534 299.34534 150.84534 15084.53400 2020-01-01 2020-01-02 2020-01-01 00:13:01 2020-01-02 03:41:22 2020-01-01 00:13:01.000 2020-01-02 03:41:22.000 781 99682 50231.5 5023150 781 99682 50231.5 5023150 -32389 32749 5011.66 501166 -126 125 -0.82 -82 -782 100 10772 99683 2.34834 299.34834 150.84834 15084.83483 2.34834 299.34836 150.84834 15084.83477 2.34834 299.34834 150.84834 15084.83400 2020-01-01 2020-01-02 2020-01-01 00:13:02 2020-01-02 03:41:23 2020-01-01 00:13:02.000 2020-01-02 03:41:23.000 782 99683 50232.5 5023250 782 99683 50232.5 5023250 -32388 32750 5012.66 501266 -125 126 0.18 18 -783 100 10773 99684 2.35135 299.35135 150.85135 15085.13513 2.35135 299.35135 150.85134 15085.13495 2.35135 299.35135 150.85135 15085.13500 2020-01-01 2020-01-02 2020-01-01 00:13:03 2020-01-02 03:41:24 2020-01-01 00:13:03.000 2020-01-02 03:41:24.000 783 99684 50233.5 5023350 783 99684 50233.5 5023350 -32387 32751 5013.66 501366 -124 127 1.18 118 -784 100 10774 99685 2.35435 299.35435 150.85435 15085.43543 2.35435 299.35434 150.85435 15085.43525 2.35435 299.35435 150.85434999999998 15085.43500 2020-01-01 2020-01-02 2020-01-01 00:13:04 2020-01-02 03:41:25 2020-01-01 00:13:04.000 2020-01-02 03:41:25.000 784 99685 50234.5 5023450 784 99685 50234.5 5023450 -32386 32752 5014.66 501466 -128 127 -0.38 -38 -785 100 10775 99686 2.35735 299.35735 150.85735 15085.73573 2.35735 299.35736 150.85736 15085.736 2.35735 299.35735 150.85735 15085.73500 2020-01-01 2020-01-02 2020-01-01 00:13:05 2020-01-02 03:41:26 2020-01-01 00:13:05.000 2020-01-02 03:41:26.000 785 99686 50235.5 5023550 785 99686 50235.5 5023550 -32385 32753 5015.66 501566 -128 127 -1.94 -194 -786 100 10776 99687 2.36036 299.36036 150.86036 15086.03603 2.36036 299.36035 150.86036 15086.03614 2.36036 299.36036 150.86036000000001 15086.03600 2020-01-01 2020-01-02 2020-01-01 00:13:06 2020-01-02 03:41:27 2020-01-01 00:13:06.000 2020-01-02 03:41:27.000 786 99687 50236.5 5023650 786 99687 50236.5 5023650 -32384 32754 5016.66 501666 -128 124 -3.5 -350 -787 100 10777 99688 2.36336 299.36336 150.86336 15086.33633 2.36336 299.36337 150.86336 15086.33628 2.36336 299.36336 150.86336 15086.33600 2020-01-01 2020-01-02 2020-01-01 00:13:07 2020-01-02 03:41:28 2020-01-01 00:13:07.000 2020-01-02 03:41:28.000 787 99688 50237.5 5023750 787 99688 50237.5 5023750 -32383 32755 5017.66 501766 -127 125 -2.5 -250 -788 100 10778 99689 2.36636 299.36636 150.86636 15086.63663 2.36636 299.36636 150.86636 15086.63641 2.36636 299.36636 150.86636000000001 15086.63600 2020-01-01 2020-01-02 2020-01-01 00:13:08 2020-01-02 03:41:29 2020-01-01 00:13:08.000 2020-01-02 03:41:29.000 788 99689 50238.5 5023850 788 99689 50238.5 5023850 -32382 32756 5018.66 501866 -126 126 -1.5 -150 -789 100 10779 99690 2.36936 299.36936 150.86936 15086.93693 2.36936 299.36935 150.86936 15086.93672 2.36936 299.36936 150.86936 15086.93600 2020-01-01 2020-01-02 2020-01-01 00:13:09 2020-01-02 03:41:30 2020-01-01 00:13:09.000 2020-01-02 03:41:30.000 789 99690 50239.5 5023950 789 99690 50239.5 5023950 -32381 32757 5019.66 501966 -125 127 -0.5 -50 +780 100 10770 99681 2.34234 299.34234 150.84234 15084.23423 2.34234 299.34235 150.84234 15084.23437 2.34234 299.34234 150.84234 15084.234 2020-01-01 2020-01-02 2020-01-01 00:13:00 2020-01-02 03:41:21 2020-01-01 00:13:00.000 2020-01-02 03:41:21.000 780 99681 50230.5 5023050 780 99681 50230.5 5023050 -32390 32748 5010.66 501066 -127 124 -1.82 -182 +781 100 10771 99682 2.34534 299.34534 150.84534 15084.53453 2.34534 299.34534 150.84534 15084.53467 2.34534 299.34534 150.84534 15084.534 2020-01-01 2020-01-02 2020-01-01 00:13:01 2020-01-02 03:41:22 2020-01-01 00:13:01.000 2020-01-02 03:41:22.000 781 99682 50231.5 5023150 781 99682 50231.5 5023150 -32389 32749 5011.66 501166 -126 125 -0.82 -82 +782 100 10772 99683 2.34834 299.34834 150.84834 15084.83483 2.34834 299.34836 150.84834 15084.83477 2.34834 299.34834 150.84834 15084.834 2020-01-01 2020-01-02 2020-01-01 00:13:02 2020-01-02 03:41:23 2020-01-01 00:13:02.000 2020-01-02 03:41:23.000 782 99683 50232.5 5023250 782 99683 50232.5 5023250 -32388 32750 5012.66 501266 -125 126 0.18 18 +783 100 10773 99684 2.35135 299.35135 150.85135 15085.13513 2.35135 299.35135 150.85134 15085.13495 2.35135 299.35135 150.85135 15085.135 2020-01-01 2020-01-02 2020-01-01 00:13:03 2020-01-02 03:41:24 2020-01-01 00:13:03.000 2020-01-02 03:41:24.000 783 99684 50233.5 5023350 783 99684 50233.5 5023350 -32387 32751 5013.66 501366 -124 127 1.18 118 +784 100 10774 99685 2.35435 299.35435 150.85435 15085.43543 2.35435 299.35434 150.85435 15085.43525 2.35435 299.35435 150.85434999999998 15085.435 2020-01-01 2020-01-02 2020-01-01 00:13:04 2020-01-02 03:41:25 2020-01-01 00:13:04.000 2020-01-02 03:41:25.000 784 99685 50234.5 5023450 784 99685 50234.5 5023450 -32386 32752 5014.66 501466 -128 127 -0.38 -38 +785 100 10775 99686 2.35735 299.35735 150.85735 15085.73573 2.35735 299.35736 150.85736 15085.736 2.35735 299.35735 150.85735 15085.735 2020-01-01 2020-01-02 2020-01-01 00:13:05 2020-01-02 03:41:26 2020-01-01 00:13:05.000 2020-01-02 03:41:26.000 785 99686 50235.5 5023550 785 99686 50235.5 5023550 -32385 32753 5015.66 501566 -128 127 -1.94 -194 +786 100 10776 99687 2.36036 299.36036 150.86036 15086.03603 2.36036 299.36035 150.86036 15086.03614 2.36036 299.36036 150.86036000000001 15086.036 2020-01-01 2020-01-02 2020-01-01 00:13:06 2020-01-02 03:41:27 2020-01-01 00:13:06.000 2020-01-02 03:41:27.000 786 99687 50236.5 5023650 786 99687 50236.5 5023650 -32384 32754 5016.66 501666 -128 124 -3.5 -350 +787 100 10777 99688 2.36336 299.36336 150.86336 15086.33633 2.36336 299.36337 150.86336 15086.33628 2.36336 299.36336 150.86336 15086.336 2020-01-01 2020-01-02 2020-01-01 00:13:07 2020-01-02 03:41:28 2020-01-01 00:13:07.000 2020-01-02 03:41:28.000 787 99688 50237.5 5023750 787 99688 50237.5 5023750 -32383 32755 5017.66 501766 -127 125 -2.5 -250 +788 100 10778 99689 2.36636 299.36636 150.86636 15086.63663 2.36636 299.36636 150.86636 15086.63641 2.36636 299.36636 150.86636000000001 15086.636 2020-01-01 2020-01-02 2020-01-01 00:13:08 2020-01-02 03:41:29 2020-01-01 00:13:08.000 2020-01-02 03:41:29.000 788 99689 50238.5 5023850 788 99689 50238.5 5023850 -32382 32756 5018.66 501866 -126 126 -1.5 -150 +789 100 10779 99690 2.36936 299.36936 150.86936 15086.93693 2.36936 299.36935 150.86936 15086.93672 2.36936 299.36936 150.86936 15086.936 2020-01-01 2020-01-02 2020-01-01 00:13:09 2020-01-02 03:41:30 2020-01-01 00:13:09.000 2020-01-02 03:41:30.000 789 99690 50239.5 5023950 789 99690 50239.5 5023950 -32381 32757 5019.66 501966 -125 127 -0.5 -50 79 102 10069 99979 0.23723 300.23723 150.23723 15173.96096 0.23723 300.23724 150.23724 15173.96129 0.23723 300.23723 150.23723 15173.96023 2020-01-01 2020-01-02 2020-01-01 00:01:19 2020-01-02 03:46:19 2020-01-01 00:01:19.000 2020-01-02 03:46:19.000 79 99979 50029 5052929 79 99979 50029 5052929 -32490 32445 4608.009900990099 465409 -128 127 -2.5247524752475248 -255 -790 100 10780 99691 2.37237 299.37237 150.87237 15087.23723 2.37237 299.37238 150.87237 15087.23747 2.37237 299.37237 150.87237 15087.23700 2020-01-01 2020-01-02 2020-01-01 00:13:10 2020-01-02 03:41:31 2020-01-01 00:13:10.000 2020-01-02 03:41:31.000 790 99691 50240.5 5024050 790 99691 50240.5 5024050 -32380 32758 5020.66 502066 -128 127 -2.06 -206 -791 100 10781 99692 2.37537 299.37537 150.87537 15087.53753 2.37537 299.37537 150.87537 15087.53761 2.37537 299.37537 150.87537 15087.53700 2020-01-01 2020-01-02 2020-01-01 00:13:11 2020-01-02 03:41:32 2020-01-01 00:13:11.000 2020-01-02 03:41:32.000 791 99692 50241.5 5024150 791 99692 50241.5 5024150 -32379 32759 5021.66 502166 -128 127 -3.62 -362 -792 100 10782 99693 2.37837 299.37837 150.87837 15087.83783 2.37837 299.3784 150.87837 15087.83775 2.37837 299.37837 150.87837 15087.83700 2020-01-01 2020-01-02 2020-01-01 00:13:12 2020-01-02 03:41:33 2020-01-01 00:13:12.000 2020-01-02 03:41:33.000 792 99693 50242.5 5024250 792 99693 50242.5 5024250 -32378 32760 5022.66 502266 -128 123 -5.18 -518 -793 100 10783 99694 2.38138 299.38138 150.88138 15088.13813 2.38138 299.38138 150.88137 15088.13789 2.38138 299.38138 150.88138 15088.13800 2020-01-01 2020-01-02 2020-01-01 00:13:13 2020-01-02 03:41:34 2020-01-01 00:13:13.000 2020-01-02 03:41:34.000 793 99694 50243.5 5024350 793 99694 50243.5 5024350 -32377 32761 5023.66 502366 -127 124 -4.18 -418 -794 100 10784 99695 2.38438 299.38438 150.88438 15088.43843 2.38438 299.3844 150.88438 15088.43864 2.38438 299.38438 150.88438 15088.43800 2020-01-01 2020-01-02 2020-01-01 00:13:14 2020-01-02 03:41:35 2020-01-01 00:13:14.000 2020-01-02 03:41:35.000 794 99695 50244.5 5024450 794 99695 50244.5 5024450 -32376 32762 5024.66 502466 -126 125 -3.18 -318 -795 100 10785 99696 2.38738 299.38738 150.88738 15088.73873 2.38738 299.3874 150.88738 15088.73894 2.38738 299.38738 150.88738 15088.73800 2020-01-01 2020-01-02 2020-01-01 00:13:15 2020-01-02 03:41:36 2020-01-01 00:13:15.000 2020-01-02 03:41:36.000 795 99696 50245.5 5024550 795 99696 50245.5 5024550 -32375 32763 5025.66 502566 -125 126 -2.18 -218 -796 100 10786 99697 2.39039 299.39039 150.89039 15089.03903 2.39039 299.39038 150.89039 15089.03908 2.39039 299.39039 150.89039 15089.03900 2020-01-01 2020-01-02 2020-01-01 00:13:16 2020-01-02 03:41:37 2020-01-01 00:13:16.000 2020-01-02 03:41:37.000 796 99697 50246.5 5024650 796 99697 50246.5 5024650 -32374 32764 5026.66 502666 -124 127 -1.18 -118 -797 100 10787 99698 2.39339 299.39339 150.89339 15089.33933 2.39339 299.3934 150.89339 15089.33921 2.39339 299.39339 150.89339 15089.33900 2020-01-01 2020-01-02 2020-01-01 00:13:17 2020-01-02 03:41:38 2020-01-01 00:13:17.000 2020-01-02 03:41:38.000 797 99698 50247.5 5024750 797 99698 50247.5 5024750 -32373 32765 5027.66 502766 -128 127 -2.74 -274 -798 100 10788 99699 2.39639 299.39639 150.89639 15089.63963 2.39639 299.3964 150.89639 15089.63936 2.39639 299.39639 150.89639 15089.63900 2020-01-01 2020-01-02 2020-01-01 00:13:18 2020-01-02 03:41:39 2020-01-01 00:13:18.000 2020-01-02 03:41:39.000 798 99699 50248.5 5024850 798 99699 50248.5 5024850 -32372 32766 5028.66 502866 -128 123 -4.3 -430 -799 100 10789 99700 2.39939 299.39939 150.89939 15089.93993 2.39939 299.3994 150.8994 15089.94011 2.39939 299.39939 150.89939 15089.93900 2020-01-01 2020-01-02 2020-01-01 00:13:19 2020-01-02 03:41:40 2020-01-01 00:13:19.000 2020-01-02 03:41:40.000 799 99700 50249.5 5024950 799 99700 50249.5 5024950 -32371 32767 5029.66 502966 -127 124 -3.3 -330 +790 100 10780 99691 2.37237 299.37237 150.87237 15087.23723 2.37237 299.37238 150.87237 15087.23747 2.37237 299.37237 150.87237 15087.237 2020-01-01 2020-01-02 2020-01-01 00:13:10 2020-01-02 03:41:31 2020-01-01 00:13:10.000 2020-01-02 03:41:31.000 790 99691 50240.5 5024050 790 99691 50240.5 5024050 -32380 32758 5020.66 502066 -128 127 -2.06 -206 +791 100 10781 99692 2.37537 299.37537 150.87537 15087.53753 2.37537 299.37537 150.87537 15087.53761 2.37537 299.37537 150.87537 15087.537 2020-01-01 2020-01-02 2020-01-01 00:13:11 2020-01-02 03:41:32 2020-01-01 00:13:11.000 2020-01-02 03:41:32.000 791 99692 50241.5 5024150 791 99692 50241.5 5024150 -32379 32759 5021.66 502166 -128 127 -3.62 -362 +792 100 10782 99693 2.37837 299.37837 150.87837 15087.83783 2.37837 299.3784 150.87837 15087.83775 2.37837 299.37837 150.87837 15087.837 2020-01-01 2020-01-02 2020-01-01 00:13:12 2020-01-02 03:41:33 2020-01-01 00:13:12.000 2020-01-02 03:41:33.000 792 99693 50242.5 5024250 792 99693 50242.5 5024250 -32378 32760 5022.66 502266 -128 123 -5.18 -518 +793 100 10783 99694 2.38138 299.38138 150.88138 15088.13813 2.38138 299.38138 150.88137 15088.13789 2.38138 299.38138 150.88138 15088.138 2020-01-01 2020-01-02 2020-01-01 00:13:13 2020-01-02 03:41:34 2020-01-01 00:13:13.000 2020-01-02 03:41:34.000 793 99694 50243.5 5024350 793 99694 50243.5 5024350 -32377 32761 5023.66 502366 -127 124 -4.18 -418 +794 100 10784 99695 2.38438 299.38438 150.88438 15088.43843 2.38438 299.3844 150.88438 15088.43864 2.38438 299.38438 150.88438 15088.438 2020-01-01 2020-01-02 2020-01-01 00:13:14 2020-01-02 03:41:35 2020-01-01 00:13:14.000 2020-01-02 03:41:35.000 794 99695 50244.5 5024450 794 99695 50244.5 5024450 -32376 32762 5024.66 502466 -126 125 -3.18 -318 +795 100 10785 99696 2.38738 299.38738 150.88738 15088.73873 2.38738 299.3874 150.88738 15088.73894 2.38738 299.38738 150.88738 15088.738 2020-01-01 2020-01-02 2020-01-01 00:13:15 2020-01-02 03:41:36 2020-01-01 00:13:15.000 2020-01-02 03:41:36.000 795 99696 50245.5 5024550 795 99696 50245.5 5024550 -32375 32763 5025.66 502566 -125 126 -2.18 -218 +796 100 10786 99697 2.39039 299.39039 150.89039 15089.03903 2.39039 299.39038 150.89039 15089.03908 2.39039 299.39039 150.89039 15089.039 2020-01-01 2020-01-02 2020-01-01 00:13:16 2020-01-02 03:41:37 2020-01-01 00:13:16.000 2020-01-02 03:41:37.000 796 99697 50246.5 5024650 796 99697 50246.5 5024650 -32374 32764 5026.66 502666 -124 127 -1.18 -118 +797 100 10787 99698 2.39339 299.39339 150.89339 15089.33933 2.39339 299.3934 150.89339 15089.33921 2.39339 299.39339 150.89339 15089.339 2020-01-01 2020-01-02 2020-01-01 00:13:17 2020-01-02 03:41:38 2020-01-01 00:13:17.000 2020-01-02 03:41:38.000 797 99698 50247.5 5024750 797 99698 50247.5 5024750 -32373 32765 5027.66 502766 -128 127 -2.74 -274 +798 100 10788 99699 2.39639 299.39639 150.89639 15089.63963 2.39639 299.3964 150.89639 15089.63936 2.39639 299.39639 150.89639 15089.639 2020-01-01 2020-01-02 2020-01-01 00:13:18 2020-01-02 03:41:39 2020-01-01 00:13:18.000 2020-01-02 03:41:39.000 798 99699 50248.5 5024850 798 99699 50248.5 5024850 -32372 32766 5028.66 502866 -128 123 -4.3 -430 +799 100 10789 99700 2.39939 299.39939 150.89939 15089.93993 2.39939 299.3994 150.8994 15089.94011 2.39939 299.39939 150.89939 15089.939 2020-01-01 2020-01-02 2020-01-01 00:13:19 2020-01-02 03:41:40 2020-01-01 00:13:19.000 2020-01-02 03:41:40.000 799 99700 50249.5 5024950 799 99700 50249.5 5024950 -32371 32767 5029.66 502966 -127 124 -3.3 -330 8 102 1007 9998 0.02402 300.02402 150.02402 15152.42642 0.02402 300.02402 150.02402 15152.42607 0.02402 300.02402 150.02402 15152.42602 2020-01-01 2020-01-02 2020-01-01 00:00:08 2020-01-02 03:45:08 2020-01-01 00:00:08.000 2020-01-02 03:45:08.000 8 99908 49958 5045758 8 99908 49958 5045758 -32561 32374 4537.009900990099 458238 -125 126 -0.019801980198019802 -2 80 102 10070 99980 0.24024 300.24024 150.24024 15174.26426 0.24024 300.24023 150.24023 15174.26397 0.24024 300.24024 150.24024 15174.26424 2020-01-01 2020-01-02 2020-01-01 00:01:20 2020-01-02 03:46:20 2020-01-01 00:01:20.000 2020-01-02 03:46:20.000 80 99980 50030 5053030 80 99980 50030 5053030 -32489 32446 4609.009900990099 465510 -128 123 -4.0594059405940595 -410 -800 100 10790 99701 2.4024 299.4024 150.9024 15090.24024 2.4024 299.4024 150.9024 15090.24041 2.40240 299.40240 150.9024 15090.24000 2020-01-01 2020-01-02 2020-01-01 00:13:20 2020-01-02 03:41:41 2020-01-01 00:13:20.000 2020-01-02 03:41:41.000 800 99701 50250.5 5025050 800 99701 50250.5 5025050 -32768 32167 4375.3 437530 -126 125 -2.3 -230 -801 100 10791 99702 2.4054 299.4054 150.9054 15090.54054 2.4054 299.4054 150.9054 15090.54058 2.40540 299.40540 150.90540000000001 15090.54000 2020-01-01 2020-01-02 2020-01-01 00:13:21 2020-01-02 03:41:42 2020-01-01 00:13:21.000 2020-01-02 03:41:42.000 801 99702 50251.5 5025150 801 99702 50251.5 5025150 -32767 32168 4376.3 437630 -125 126 -1.3 -130 -802 100 10792 99703 2.4084 299.4084 150.9084 15090.84084 2.4084 299.40842 150.9084 15090.84069 2.40840 299.40840 150.9084 15090.84000 2020-01-01 2020-01-02 2020-01-01 00:13:22 2020-01-02 03:41:43 2020-01-01 00:13:22.000 2020-01-02 03:41:43.000 802 99703 50252.5 5025250 802 99703 50252.5 5025250 -32766 32169 4377.3 437730 -124 127 -0.3 -30 -803 100 10793 99704 2.41141 299.41141 150.91141 15091.14114 2.41141 299.4114 150.9114 15091.14098 2.41141 299.41141 150.91141 15091.14100 2020-01-01 2020-01-02 2020-01-01 00:13:23 2020-01-02 03:41:44 2020-01-01 00:13:23.000 2020-01-02 03:41:44.000 803 99704 50253.5 5025350 803 99704 50253.5 5025350 -32765 32170 4378.3 437830 -128 127 -1.86 -186 -804 100 10794 99705 2.41441 299.41441 150.91441 15091.44144 2.41441 299.41443 150.91441 15091.44158 2.41441 299.41441 150.91441 15091.44100 2020-01-01 2020-01-02 2020-01-01 00:13:24 2020-01-02 03:41:45 2020-01-01 00:13:24.000 2020-01-02 03:41:45.000 804 99705 50254.5 5025450 804 99705 50254.5 5025450 -32764 32171 4379.3 437930 -128 123 -3.42 -342 -805 100 10795 99706 2.41741 299.41741 150.91741 15091.74174 2.41741 299.41742 150.91741 15091.74188 2.41741 299.41741 150.91741 15091.74100 2020-01-01 2020-01-02 2020-01-01 00:13:25 2020-01-02 03:41:46 2020-01-01 00:13:25.000 2020-01-02 03:41:46.000 805 99706 50255.5 5025550 805 99706 50255.5 5025550 -32763 32172 4380.3 438030 -127 124 -2.42 -242 -806 100 10796 99707 2.42042 299.42042 150.92042 15092.04204 2.42042 299.4204 150.92042 15092.04205 2.42042 299.42042 150.92042 15092.04200 2020-01-01 2020-01-02 2020-01-01 00:13:26 2020-01-02 03:41:47 2020-01-01 00:13:26.000 2020-01-02 03:41:47.000 806 99707 50256.5 5025650 806 99707 50256.5 5025650 -32762 32173 4381.3 438130 -126 125 -1.42 -142 -807 100 10797 99708 2.42342 299.42342 150.92342 15092.34234 2.42342 299.42343 150.92342 15092.34216 2.42342 299.42342 150.92342 15092.34200 2020-01-01 2020-01-02 2020-01-01 00:13:27 2020-01-02 03:41:48 2020-01-01 00:13:27.000 2020-01-02 03:41:48.000 807 99708 50257.5 5025750 807 99708 50257.5 5025750 -32761 32174 4382.3 438230 -125 126 -0.42 -42 -808 100 10798 99709 2.42642 299.42642 150.92642 15092.64264 2.42642 299.42642 150.92642 15092.64245 2.42642 299.42642 150.92642 15092.64200 2020-01-01 2020-01-02 2020-01-01 00:13:28 2020-01-02 03:41:49 2020-01-01 00:13:28.000 2020-01-02 03:41:49.000 808 99709 50258.5 5025850 808 99709 50258.5 5025850 -32760 32175 4383.3 438330 -124 127 0.58 58 -809 100 10799 99710 2.42942 299.42942 150.92942 15092.94294 2.42942 299.42944 150.92943 15092.94305 2.42942 299.42942 150.92942 15092.94200 2020-01-01 2020-01-02 2020-01-01 00:13:29 2020-01-02 03:41:50 2020-01-01 00:13:29.000 2020-01-02 03:41:50.000 809 99710 50259.5 5025950 809 99710 50259.5 5025950 -32759 32176 4384.3 438430 -128 127 -0.98 -98 +800 100 10790 99701 2.4024 299.4024 150.9024 15090.24024 2.4024 299.4024 150.9024 15090.24041 2.4024 299.4024 150.9024 15090.24 2020-01-01 2020-01-02 2020-01-01 00:13:20 2020-01-02 03:41:41 2020-01-01 00:13:20.000 2020-01-02 03:41:41.000 800 99701 50250.5 5025050 800 99701 50250.5 5025050 -32768 32167 4375.3 437530 -126 125 -2.3 -230 +801 100 10791 99702 2.4054 299.4054 150.9054 15090.54054 2.4054 299.4054 150.9054 15090.54058 2.4054 299.4054 150.90540000000001 15090.54 2020-01-01 2020-01-02 2020-01-01 00:13:21 2020-01-02 03:41:42 2020-01-01 00:13:21.000 2020-01-02 03:41:42.000 801 99702 50251.5 5025150 801 99702 50251.5 5025150 -32767 32168 4376.3 437630 -125 126 -1.3 -130 +802 100 10792 99703 2.4084 299.4084 150.9084 15090.84084 2.4084 299.40842 150.9084 15090.84069 2.4084 299.4084 150.9084 15090.84 2020-01-01 2020-01-02 2020-01-01 00:13:22 2020-01-02 03:41:43 2020-01-01 00:13:22.000 2020-01-02 03:41:43.000 802 99703 50252.5 5025250 802 99703 50252.5 5025250 -32766 32169 4377.3 437730 -124 127 -0.3 -30 +803 100 10793 99704 2.41141 299.41141 150.91141 15091.14114 2.41141 299.4114 150.9114 15091.14098 2.41141 299.41141 150.91141 15091.141 2020-01-01 2020-01-02 2020-01-01 00:13:23 2020-01-02 03:41:44 2020-01-01 00:13:23.000 2020-01-02 03:41:44.000 803 99704 50253.5 5025350 803 99704 50253.5 5025350 -32765 32170 4378.3 437830 -128 127 -1.86 -186 +804 100 10794 99705 2.41441 299.41441 150.91441 15091.44144 2.41441 299.41443 150.91441 15091.44158 2.41441 299.41441 150.91441 15091.441 2020-01-01 2020-01-02 2020-01-01 00:13:24 2020-01-02 03:41:45 2020-01-01 00:13:24.000 2020-01-02 03:41:45.000 804 99705 50254.5 5025450 804 99705 50254.5 5025450 -32764 32171 4379.3 437930 -128 123 -3.42 -342 +805 100 10795 99706 2.41741 299.41741 150.91741 15091.74174 2.41741 299.41742 150.91741 15091.74188 2.41741 299.41741 150.91741 15091.741 2020-01-01 2020-01-02 2020-01-01 00:13:25 2020-01-02 03:41:46 2020-01-01 00:13:25.000 2020-01-02 03:41:46.000 805 99706 50255.5 5025550 805 99706 50255.5 5025550 -32763 32172 4380.3 438030 -127 124 -2.42 -242 +806 100 10796 99707 2.42042 299.42042 150.92042 15092.04204 2.42042 299.4204 150.92042 15092.04205 2.42042 299.42042 150.92042 15092.042 2020-01-01 2020-01-02 2020-01-01 00:13:26 2020-01-02 03:41:47 2020-01-01 00:13:26.000 2020-01-02 03:41:47.000 806 99707 50256.5 5025650 806 99707 50256.5 5025650 -32762 32173 4381.3 438130 -126 125 -1.42 -142 +807 100 10797 99708 2.42342 299.42342 150.92342 15092.34234 2.42342 299.42343 150.92342 15092.34216 2.42342 299.42342 150.92342 15092.342 2020-01-01 2020-01-02 2020-01-01 00:13:27 2020-01-02 03:41:48 2020-01-01 00:13:27.000 2020-01-02 03:41:48.000 807 99708 50257.5 5025750 807 99708 50257.5 5025750 -32761 32174 4382.3 438230 -125 126 -0.42 -42 +808 100 10798 99709 2.42642 299.42642 150.92642 15092.64264 2.42642 299.42642 150.92642 15092.64245 2.42642 299.42642 150.92642 15092.642 2020-01-01 2020-01-02 2020-01-01 00:13:28 2020-01-02 03:41:49 2020-01-01 00:13:28.000 2020-01-02 03:41:49.000 808 99709 50258.5 5025850 808 99709 50258.5 5025850 -32760 32175 4383.3 438330 -124 127 0.58 58 +809 100 10799 99710 2.42942 299.42942 150.92942 15092.94294 2.42942 299.42944 150.92943 15092.94305 2.42942 299.42942 150.92942 15092.942 2020-01-01 2020-01-02 2020-01-01 00:13:29 2020-01-02 03:41:50 2020-01-01 00:13:29.000 2020-01-02 03:41:50.000 809 99710 50259.5 5025950 809 99710 50259.5 5025950 -32759 32176 4384.3 438430 -128 127 -0.98 -98 81 102 10071 99981 0.24324 300.24324 150.24324 15174.56756 0.24324 300.24326 150.24324 15174.56758 0.24324 300.24324 150.24324000000001 15174.56724 2020-01-01 2020-01-02 2020-01-01 00:01:21 2020-01-02 03:46:21 2020-01-01 00:01:21.000 2020-01-02 03:46:21.000 81 99981 50031 5053131 81 99981 50031 5053131 -32488 32447 4610.009900990099 465611 -127 124 -3.0594059405940595 -309 -810 100 10800 99711 2.43243 299.43243 150.93243 15093.24324 2.43243 299.43243 150.93243 15093.24338 2.43243 299.43243 150.93243 15093.24300 2020-01-01 2020-01-02 2020-01-01 00:13:30 2020-01-02 03:41:51 2020-01-01 00:13:30.000 2020-01-02 03:41:51.000 810 99711 50260.5 5026050 810 99711 50260.5 5026050 -32758 32177 4385.3 438530 -128 127 -2.54 -254 -811 100 10801 99712 2.43543 299.43543 150.93543 15093.54354 2.43543 299.43542 150.93543 15093.54353 2.43543 299.43543 150.93543 15093.54300 2020-01-01 2020-01-02 2020-01-01 00:13:31 2020-01-02 03:41:52 2020-01-01 00:13:31.000 2020-01-02 03:41:52.000 811 99712 50261.5 5026150 811 99712 50261.5 5026150 -32757 32178 4386.3 438630 -128 124 -4.1 -410 -812 100 10802 99713 2.43843 299.43843 150.93843 15093.84384 2.43843 299.43845 150.93844 15093.84428 2.43843 299.43843 150.93843 15093.84300 2020-01-01 2020-01-02 2020-01-01 00:13:32 2020-01-02 03:41:53 2020-01-01 00:13:32.000 2020-01-02 03:41:53.000 812 99713 50262.5 5026250 812 99713 50262.5 5026250 -32756 32179 4387.3 438730 -127 125 -3.1 -310 -813 100 10803 99714 2.44144 299.44144 150.94144 15094.14414 2.44144 299.44144 150.94143 15094.14392 2.44144 299.44144 150.94144 15094.14400 2020-01-01 2020-01-02 2020-01-01 00:13:33 2020-01-02 03:41:54 2020-01-01 00:13:33.000 2020-01-02 03:41:54.000 813 99714 50263.5 5026350 813 99714 50263.5 5026350 -32755 32180 4388.3 438830 -126 126 -2.1 -210 -814 100 10804 99715 2.44444 299.44444 150.94444 15094.44444 2.44444 299.44446 150.94444 15094.44452 2.44444 299.44444 150.94444 15094.44400 2020-01-01 2020-01-02 2020-01-01 00:13:34 2020-01-02 03:41:55 2020-01-01 00:13:34.000 2020-01-02 03:41:55.000 814 99715 50264.5 5026450 814 99715 50264.5 5026450 -32754 32181 4389.3 438930 -125 127 -1.1 -110 -815 100 10805 99716 2.44744 299.44744 150.94744 15094.74474 2.44744 299.44745 150.94744 15094.74485 2.44744 299.44744 150.94744 15094.74400 2020-01-01 2020-01-02 2020-01-01 00:13:35 2020-01-02 03:41:56 2020-01-01 00:13:35.000 2020-01-02 03:41:56.000 815 99716 50265.5 5026550 815 99716 50265.5 5026550 -32753 32182 4390.3 439030 -128 127 -2.66 -266 -816 100 10806 99717 2.45045 299.45045 150.95045 15095.04504 2.45045 299.45044 150.95045 15095.045 2.45045 299.45045 150.95045 15095.04500 2020-01-01 2020-01-02 2020-01-01 00:13:36 2020-01-02 03:41:57 2020-01-01 00:13:36.000 2020-01-02 03:41:57.000 816 99717 50266.5 5026650 816 99717 50266.5 5026650 -32752 32183 4391.3 439130 -128 127 -4.22 -422 -817 100 10807 99718 2.45345 299.45345 150.95345 15095.34534 2.45345 299.45346 150.95345 15095.34574 2.45345 299.45345 150.95345 15095.34500 2020-01-01 2020-01-02 2020-01-01 00:13:37 2020-01-02 03:41:58 2020-01-01 00:13:37.000 2020-01-02 03:41:58.000 817 99718 50267.5 5026750 817 99718 50267.5 5026750 -32751 32184 4392.3 439230 -128 123 -5.78 -578 -818 100 10808 99719 2.45645 299.45645 150.95645 15095.64564 2.45645 299.45645 150.95645 15095.64539 2.45645 299.45645 150.95645000000002 15095.64500 2020-01-01 2020-01-02 2020-01-01 00:13:38 2020-01-02 03:41:59 2020-01-01 00:13:38.000 2020-01-02 03:41:59.000 818 99719 50268.5 5026850 818 99719 50268.5 5026850 -32750 32185 4393.3 439330 -127 124 -4.78 -478 -819 100 10809 99720 2.45945 299.45945 150.95945 15095.94594 2.45945 299.45947 150.95946 15095.94602 2.45945 299.45945 150.95945 15095.94500 2020-01-01 2020-01-02 2020-01-01 00:13:39 2020-01-02 03:42:00 2020-01-01 00:13:39.000 2020-01-02 03:42:00.000 819 99720 50269.5 5026950 819 99720 50269.5 5026950 -32749 32186 4394.3 439430 -126 125 -3.78 -378 +810 100 10800 99711 2.43243 299.43243 150.93243 15093.24324 2.43243 299.43243 150.93243 15093.24338 2.43243 299.43243 150.93243 15093.243 2020-01-01 2020-01-02 2020-01-01 00:13:30 2020-01-02 03:41:51 2020-01-01 00:13:30.000 2020-01-02 03:41:51.000 810 99711 50260.5 5026050 810 99711 50260.5 5026050 -32758 32177 4385.3 438530 -128 127 -2.54 -254 +811 100 10801 99712 2.43543 299.43543 150.93543 15093.54354 2.43543 299.43542 150.93543 15093.54353 2.43543 299.43543 150.93543 15093.543 2020-01-01 2020-01-02 2020-01-01 00:13:31 2020-01-02 03:41:52 2020-01-01 00:13:31.000 2020-01-02 03:41:52.000 811 99712 50261.5 5026150 811 99712 50261.5 5026150 -32757 32178 4386.3 438630 -128 124 -4.1 -410 +812 100 10802 99713 2.43843 299.43843 150.93843 15093.84384 2.43843 299.43845 150.93844 15093.84428 2.43843 299.43843 150.93843 15093.843 2020-01-01 2020-01-02 2020-01-01 00:13:32 2020-01-02 03:41:53 2020-01-01 00:13:32.000 2020-01-02 03:41:53.000 812 99713 50262.5 5026250 812 99713 50262.5 5026250 -32756 32179 4387.3 438730 -127 125 -3.1 -310 +813 100 10803 99714 2.44144 299.44144 150.94144 15094.14414 2.44144 299.44144 150.94143 15094.14392 2.44144 299.44144 150.94144 15094.144 2020-01-01 2020-01-02 2020-01-01 00:13:33 2020-01-02 03:41:54 2020-01-01 00:13:33.000 2020-01-02 03:41:54.000 813 99714 50263.5 5026350 813 99714 50263.5 5026350 -32755 32180 4388.3 438830 -126 126 -2.1 -210 +814 100 10804 99715 2.44444 299.44444 150.94444 15094.44444 2.44444 299.44446 150.94444 15094.44452 2.44444 299.44444 150.94444 15094.444 2020-01-01 2020-01-02 2020-01-01 00:13:34 2020-01-02 03:41:55 2020-01-01 00:13:34.000 2020-01-02 03:41:55.000 814 99715 50264.5 5026450 814 99715 50264.5 5026450 -32754 32181 4389.3 438930 -125 127 -1.1 -110 +815 100 10805 99716 2.44744 299.44744 150.94744 15094.74474 2.44744 299.44745 150.94744 15094.74485 2.44744 299.44744 150.94744 15094.744 2020-01-01 2020-01-02 2020-01-01 00:13:35 2020-01-02 03:41:56 2020-01-01 00:13:35.000 2020-01-02 03:41:56.000 815 99716 50265.5 5026550 815 99716 50265.5 5026550 -32753 32182 4390.3 439030 -128 127 -2.66 -266 +816 100 10806 99717 2.45045 299.45045 150.95045 15095.04504 2.45045 299.45044 150.95045 15095.045 2.45045 299.45045 150.95045 15095.045 2020-01-01 2020-01-02 2020-01-01 00:13:36 2020-01-02 03:41:57 2020-01-01 00:13:36.000 2020-01-02 03:41:57.000 816 99717 50266.5 5026650 816 99717 50266.5 5026650 -32752 32183 4391.3 439130 -128 127 -4.22 -422 +817 100 10807 99718 2.45345 299.45345 150.95345 15095.34534 2.45345 299.45346 150.95345 15095.34574 2.45345 299.45345 150.95345 15095.345 2020-01-01 2020-01-02 2020-01-01 00:13:37 2020-01-02 03:41:58 2020-01-01 00:13:37.000 2020-01-02 03:41:58.000 817 99718 50267.5 5026750 817 99718 50267.5 5026750 -32751 32184 4392.3 439230 -128 123 -5.78 -578 +818 100 10808 99719 2.45645 299.45645 150.95645 15095.64564 2.45645 299.45645 150.95645 15095.64539 2.45645 299.45645 150.95645000000002 15095.645 2020-01-01 2020-01-02 2020-01-01 00:13:38 2020-01-02 03:41:59 2020-01-01 00:13:38.000 2020-01-02 03:41:59.000 818 99719 50268.5 5026850 818 99719 50268.5 5026850 -32750 32185 4393.3 439330 -127 124 -4.78 -478 +819 100 10809 99720 2.45945 299.45945 150.95945 15095.94594 2.45945 299.45947 150.95946 15095.94602 2.45945 299.45945 150.95945 15095.945 2020-01-01 2020-01-02 2020-01-01 00:13:39 2020-01-02 03:42:00 2020-01-01 00:13:39.000 2020-01-02 03:42:00.000 819 99720 50269.5 5026950 819 99720 50269.5 5026950 -32749 32186 4394.3 439430 -126 125 -3.78 -378 82 102 10072 99982 0.24624 300.24624 150.24624 15174.87087 0.24624 300.24625 150.24624 15174.87088 0.24624 300.24624 150.24624 15174.87024 2020-01-01 2020-01-02 2020-01-01 00:01:22 2020-01-02 03:46:22 2020-01-01 00:01:22.000 2020-01-02 03:46:22.000 82 99982 50032 5053232 82 99982 50032 5053232 -32487 32448 4611.009900990099 465712 -126 125 -2.0594059405940595 -208 -820 100 10810 99721 2.46246 299.46246 150.96246 15096.24624 2.46246 299.46246 150.96246 15096.24633 2.46246 299.46246 150.96246 15096.24600 2020-01-01 2020-01-02 2020-01-01 00:13:40 2020-01-02 03:42:01 2020-01-01 00:13:40.000 2020-01-02 03:42:01.000 820 99721 50270.5 5027050 820 99721 50270.5 5027050 -32748 32187 4395.3 439530 -125 126 -2.78 -278 -821 100 10811 99722 2.46546 299.46546 150.96546 15096.54654 2.46546 299.46545 150.96546 15096.54646 2.46546 299.46546 150.96546 15096.54600 2020-01-01 2020-01-02 2020-01-01 00:13:41 2020-01-02 03:42:02 2020-01-01 00:13:41.000 2020-01-02 03:42:02.000 821 99722 50271.5 5027150 821 99722 50271.5 5027150 -32747 32188 4396.3 439630 -124 127 -1.78 -178 -822 100 10812 99723 2.46846 299.46846 150.96846 15096.84684 2.46846 299.46848 150.96847 15096.84721 2.46846 299.46846 150.96846 15096.84600 2020-01-01 2020-01-02 2020-01-01 00:13:42 2020-01-02 03:42:03 2020-01-01 00:13:42.000 2020-01-02 03:42:03.000 822 99723 50272.5 5027250 822 99723 50272.5 5027250 -32746 32189 4397.3 439730 -128 127 -3.34 -334 -823 100 10813 99724 2.47147 299.47147 150.97147 15097.14714 2.47147 299.47147 150.97146 15097.14686 2.47147 299.47147 150.97147 15097.14700 2020-01-01 2020-01-02 2020-01-01 00:13:43 2020-01-02 03:42:04 2020-01-01 00:13:43.000 2020-01-02 03:42:04.000 823 99724 50273.5 5027350 823 99724 50273.5 5027350 -32745 32190 4398.3 439830 -128 123 -4.9 -490 -824 100 10814 99725 2.47447 299.47447 150.97447 15097.44744 2.47447 299.4745 150.97447 15097.44749 2.47447 299.47447 150.97447 15097.44700 2020-01-01 2020-01-02 2020-01-01 00:13:44 2020-01-02 03:42:05 2020-01-01 00:13:44.000 2020-01-02 03:42:05.000 824 99725 50274.5 5027450 824 99725 50274.5 5027450 -32744 32191 4399.3 439930 -127 124 -3.9 -390 -825 100 10815 99726 2.47747 299.47747 150.97747 15097.74774 2.47747 299.47748 150.97747 15097.74779 2.47747 299.47747 150.97746999999998 15097.74700 2020-01-01 2020-01-02 2020-01-01 00:13:45 2020-01-02 03:42:06 2020-01-01 00:13:45.000 2020-01-02 03:42:06.000 825 99726 50275.5 5027550 825 99726 50275.5 5027550 -32743 32192 4400.3 440030 -126 125 -2.9 -290 -826 100 10816 99727 2.48048 299.48048 150.98048 15098.04804 2.48048 299.48047 150.98048 15098.04809 2.48048 299.48048 150.98048 15098.04800 2020-01-01 2020-01-02 2020-01-01 00:13:46 2020-01-02 03:42:07 2020-01-01 00:13:46.000 2020-01-02 03:42:07.000 826 99727 50276.5 5027650 826 99727 50276.5 5027650 -32742 32193 4401.3 440130 -125 126 -1.9 -190 -827 100 10817 99728 2.48348 299.48348 150.98348 15098.34834 2.48348 299.4835 150.98348 15098.34869 2.48348 299.48348 150.98348 15098.34800 2020-01-01 2020-01-02 2020-01-01 00:13:47 2020-01-02 03:42:08 2020-01-01 00:13:47.000 2020-01-02 03:42:08.000 827 99728 50277.5 5027750 827 99728 50277.5 5027750 -32741 32194 4402.3 440230 -124 127 -0.9 -90 -828 100 10818 99729 2.48648 299.48648 150.98648 15098.64864 2.48648 299.48648 150.98648 15098.64837 2.48648 299.48648 150.98648 15098.64800 2020-01-01 2020-01-02 2020-01-01 00:13:48 2020-01-02 03:42:09 2020-01-01 00:13:48.000 2020-01-02 03:42:09.000 828 99729 50278.5 5027850 828 99729 50278.5 5027850 -32740 32195 4403.3 440330 -128 127 -2.46 -246 -829 100 10819 99730 2.48948 299.48948 150.98948 15098.94894 2.48948 299.4895 150.98948 15098.94896 2.48948 299.48948 150.98948000000001 15098.94800 2020-01-01 2020-01-02 2020-01-01 00:13:49 2020-01-02 03:42:10 2020-01-01 00:13:49.000 2020-01-02 03:42:10.000 829 99730 50279.5 5027950 829 99730 50279.5 5027950 -32739 32196 4404.3 440430 -128 123 -4.02 -402 +820 100 10810 99721 2.46246 299.46246 150.96246 15096.24624 2.46246 299.46246 150.96246 15096.24633 2.46246 299.46246 150.96246 15096.246 2020-01-01 2020-01-02 2020-01-01 00:13:40 2020-01-02 03:42:01 2020-01-01 00:13:40.000 2020-01-02 03:42:01.000 820 99721 50270.5 5027050 820 99721 50270.5 5027050 -32748 32187 4395.3 439530 -125 126 -2.78 -278 +821 100 10811 99722 2.46546 299.46546 150.96546 15096.54654 2.46546 299.46545 150.96546 15096.54646 2.46546 299.46546 150.96546 15096.546 2020-01-01 2020-01-02 2020-01-01 00:13:41 2020-01-02 03:42:02 2020-01-01 00:13:41.000 2020-01-02 03:42:02.000 821 99722 50271.5 5027150 821 99722 50271.5 5027150 -32747 32188 4396.3 439630 -124 127 -1.78 -178 +822 100 10812 99723 2.46846 299.46846 150.96846 15096.84684 2.46846 299.46848 150.96847 15096.84721 2.46846 299.46846 150.96846 15096.846 2020-01-01 2020-01-02 2020-01-01 00:13:42 2020-01-02 03:42:03 2020-01-01 00:13:42.000 2020-01-02 03:42:03.000 822 99723 50272.5 5027250 822 99723 50272.5 5027250 -32746 32189 4397.3 439730 -128 127 -3.34 -334 +823 100 10813 99724 2.47147 299.47147 150.97147 15097.14714 2.47147 299.47147 150.97146 15097.14686 2.47147 299.47147 150.97147 15097.147 2020-01-01 2020-01-02 2020-01-01 00:13:43 2020-01-02 03:42:04 2020-01-01 00:13:43.000 2020-01-02 03:42:04.000 823 99724 50273.5 5027350 823 99724 50273.5 5027350 -32745 32190 4398.3 439830 -128 123 -4.9 -490 +824 100 10814 99725 2.47447 299.47447 150.97447 15097.44744 2.47447 299.4745 150.97447 15097.44749 2.47447 299.47447 150.97447 15097.447 2020-01-01 2020-01-02 2020-01-01 00:13:44 2020-01-02 03:42:05 2020-01-01 00:13:44.000 2020-01-02 03:42:05.000 824 99725 50274.5 5027450 824 99725 50274.5 5027450 -32744 32191 4399.3 439930 -127 124 -3.9 -390 +825 100 10815 99726 2.47747 299.47747 150.97747 15097.74774 2.47747 299.47748 150.97747 15097.74779 2.47747 299.47747 150.97746999999998 15097.747 2020-01-01 2020-01-02 2020-01-01 00:13:45 2020-01-02 03:42:06 2020-01-01 00:13:45.000 2020-01-02 03:42:06.000 825 99726 50275.5 5027550 825 99726 50275.5 5027550 -32743 32192 4400.3 440030 -126 125 -2.9 -290 +826 100 10816 99727 2.48048 299.48048 150.98048 15098.04804 2.48048 299.48047 150.98048 15098.04809 2.48048 299.48048 150.98048 15098.048 2020-01-01 2020-01-02 2020-01-01 00:13:46 2020-01-02 03:42:07 2020-01-01 00:13:46.000 2020-01-02 03:42:07.000 826 99727 50276.5 5027650 826 99727 50276.5 5027650 -32742 32193 4401.3 440130 -125 126 -1.9 -190 +827 100 10817 99728 2.48348 299.48348 150.98348 15098.34834 2.48348 299.4835 150.98348 15098.34869 2.48348 299.48348 150.98348 15098.348 2020-01-01 2020-01-02 2020-01-01 00:13:47 2020-01-02 03:42:08 2020-01-01 00:13:47.000 2020-01-02 03:42:08.000 827 99728 50277.5 5027750 827 99728 50277.5 5027750 -32741 32194 4402.3 440230 -124 127 -0.9 -90 +828 100 10818 99729 2.48648 299.48648 150.98648 15098.64864 2.48648 299.48648 150.98648 15098.64837 2.48648 299.48648 150.98648 15098.648 2020-01-01 2020-01-02 2020-01-01 00:13:48 2020-01-02 03:42:09 2020-01-01 00:13:48.000 2020-01-02 03:42:09.000 828 99729 50278.5 5027850 828 99729 50278.5 5027850 -32740 32195 4403.3 440330 -128 127 -2.46 -246 +829 100 10819 99730 2.48948 299.48948 150.98948 15098.94894 2.48948 299.4895 150.98948 15098.94896 2.48948 299.48948 150.98948000000001 15098.948 2020-01-01 2020-01-02 2020-01-01 00:13:49 2020-01-02 03:42:10 2020-01-01 00:13:49.000 2020-01-02 03:42:10.000 829 99730 50279.5 5027950 829 99730 50279.5 5027950 -32739 32196 4404.3 440430 -128 123 -4.02 -402 83 102 10073 99983 0.24924 300.24924 150.24924 15175.17417 0.24924 300.24924 150.24924 15175.17417 0.24924 300.24924 150.24924000000001 15175.17324 2020-01-01 2020-01-02 2020-01-01 00:01:23 2020-01-02 03:46:23 2020-01-01 00:01:23.000 2020-01-02 03:46:23.000 83 99983 50033 5053333 83 99983 50033 5053333 -32486 32449 4612.009900990099 465813 -125 126 -1.0594059405940595 -107 -830 100 10820 99731 2.49249 299.49249 150.99249 15099.24924 2.49249 299.4925 150.99249 15099.24926 2.49249 299.49249 150.99249 15099.24900 2020-01-01 2020-01-02 2020-01-01 00:13:50 2020-01-02 03:42:11 2020-01-01 00:13:50.000 2020-01-02 03:42:11.000 830 99731 50280.5 5028050 830 99731 50280.5 5028050 -32738 32197 4405.3 440530 -127 124 -3.02 -302 -831 100 10821 99732 2.49549 299.49549 150.99549 15099.54954 2.49549 299.49548 150.99549 15099.54956 2.49549 299.49549 150.99549000000002 15099.54900 2020-01-01 2020-01-02 2020-01-01 00:13:51 2020-01-02 03:42:12 2020-01-01 00:13:51.000 2020-01-02 03:42:12.000 831 99732 50281.5 5028150 831 99732 50281.5 5028150 -32737 32198 4406.3 440630 -126 125 -2.02 -202 -832 100 10822 99733 2.49849 299.49849 150.99849 15099.84984 2.49849 299.4985 150.9985 15099.85016 2.49849 299.49849 150.99849 15099.84900 2020-01-01 2020-01-02 2020-01-01 00:13:52 2020-01-02 03:42:13 2020-01-01 00:13:52.000 2020-01-02 03:42:13.000 832 99733 50282.5 5028250 832 99733 50282.5 5028250 -32736 32199 4407.3 440730 -125 126 -1.02 -102 -833 100 10823 99734 2.5015 299.5015 151.0015 15100.15015 2.5015 299.5015 151.00149 15100.14983 2.50150 299.50150 151.0015 15100.15000 2020-01-01 2020-01-02 2020-01-01 00:13:53 2020-01-02 03:42:14 2020-01-01 00:13:53.000 2020-01-02 03:42:14.000 833 99734 50283.5 5028350 833 99734 50283.5 5028350 -32735 32200 4408.3 440830 -124 127 -0.02 -2 -834 100 10824 99735 2.5045 299.5045 151.0045 15100.45045 2.5045 299.50452 151.0045 15100.45043 2.50450 299.50450 151.0045 15100.45000 2020-01-01 2020-01-02 2020-01-01 00:13:54 2020-01-02 03:42:15 2020-01-01 00:13:54.000 2020-01-02 03:42:15.000 834 99735 50284.5 5028450 834 99735 50284.5 5028450 -32734 32201 4409.3 440930 -128 127 -1.58 -158 -835 100 10825 99736 2.5075 299.5075 151.0075 15100.75075 2.5075 299.5075 151.0075 15100.75073 2.50750 299.50750 151.0075 15100.75000 2020-01-01 2020-01-02 2020-01-01 00:13:55 2020-01-02 03:42:16 2020-01-01 00:13:55.000 2020-01-02 03:42:16.000 835 99736 50285.5 5028550 835 99736 50285.5 5028550 -32733 32202 4410.3 441030 -128 123 -3.14 -314 -836 100 10826 99737 2.51051 299.51051 151.01051 15101.05105 2.51051 299.5105 151.01051 15101.05103 2.51051 299.51051 151.01050999999998 15101.05100 2020-01-01 2020-01-02 2020-01-01 00:13:56 2020-01-02 03:42:17 2020-01-01 00:13:56.000 2020-01-02 03:42:17.000 836 99737 50286.5 5028650 836 99737 50286.5 5028650 -32732 32203 4411.3 441130 -127 124 -2.14 -214 -837 100 10827 99738 2.51351 299.51351 151.01351 15101.35135 2.51351 299.51352 151.01351 15101.35162 2.51351 299.51351 151.01351 15101.35100 2020-01-01 2020-01-02 2020-01-01 00:13:57 2020-01-02 03:42:18 2020-01-01 00:13:57.000 2020-01-02 03:42:18.000 837 99738 50287.5 5028750 837 99738 50287.5 5028750 -32731 32204 4412.3 441230 -126 125 -1.14 -114 -838 100 10828 99739 2.51651 299.51651 151.01651 15101.65165 2.51651 299.5165 151.01651 15101.6513 2.51651 299.51651 151.01651 15101.65100 2020-01-01 2020-01-02 2020-01-01 00:13:58 2020-01-02 03:42:19 2020-01-01 00:13:58.000 2020-01-02 03:42:19.000 838 99739 50288.5 5028850 838 99739 50288.5 5028850 -32730 32205 4413.3 441330 -125 126 -0.14 -14 -839 100 10829 99740 2.51951 299.51951 151.01951 15101.95195 2.51951 299.51953 151.01951 15101.9519 2.51951 299.51951 151.01951 15101.95100 2020-01-01 2020-01-02 2020-01-01 00:13:59 2020-01-02 03:42:20 2020-01-01 00:13:59.000 2020-01-02 03:42:20.000 839 99740 50289.5 5028950 839 99740 50289.5 5028950 -32729 32206 4414.3 441430 -124 127 0.86 86 +830 100 10820 99731 2.49249 299.49249 150.99249 15099.24924 2.49249 299.4925 150.99249 15099.24926 2.49249 299.49249 150.99249 15099.249 2020-01-01 2020-01-02 2020-01-01 00:13:50 2020-01-02 03:42:11 2020-01-01 00:13:50.000 2020-01-02 03:42:11.000 830 99731 50280.5 5028050 830 99731 50280.5 5028050 -32738 32197 4405.3 440530 -127 124 -3.02 -302 +831 100 10821 99732 2.49549 299.49549 150.99549 15099.54954 2.49549 299.49548 150.99549 15099.54956 2.49549 299.49549 150.99549000000002 15099.549 2020-01-01 2020-01-02 2020-01-01 00:13:51 2020-01-02 03:42:12 2020-01-01 00:13:51.000 2020-01-02 03:42:12.000 831 99732 50281.5 5028150 831 99732 50281.5 5028150 -32737 32198 4406.3 440630 -126 125 -2.02 -202 +832 100 10822 99733 2.49849 299.49849 150.99849 15099.84984 2.49849 299.4985 150.9985 15099.85016 2.49849 299.49849 150.99849 15099.849 2020-01-01 2020-01-02 2020-01-01 00:13:52 2020-01-02 03:42:13 2020-01-01 00:13:52.000 2020-01-02 03:42:13.000 832 99733 50282.5 5028250 832 99733 50282.5 5028250 -32736 32199 4407.3 440730 -125 126 -1.02 -102 +833 100 10823 99734 2.5015 299.5015 151.0015 15100.15015 2.5015 299.5015 151.00149 15100.14983 2.5015 299.5015 151.0015 15100.15 2020-01-01 2020-01-02 2020-01-01 00:13:53 2020-01-02 03:42:14 2020-01-01 00:13:53.000 2020-01-02 03:42:14.000 833 99734 50283.5 5028350 833 99734 50283.5 5028350 -32735 32200 4408.3 440830 -124 127 -0.02 -2 +834 100 10824 99735 2.5045 299.5045 151.0045 15100.45045 2.5045 299.50452 151.0045 15100.45043 2.5045 299.5045 151.0045 15100.45 2020-01-01 2020-01-02 2020-01-01 00:13:54 2020-01-02 03:42:15 2020-01-01 00:13:54.000 2020-01-02 03:42:15.000 834 99735 50284.5 5028450 834 99735 50284.5 5028450 -32734 32201 4409.3 440930 -128 127 -1.58 -158 +835 100 10825 99736 2.5075 299.5075 151.0075 15100.75075 2.5075 299.5075 151.0075 15100.75073 2.5075 299.5075 151.0075 15100.75 2020-01-01 2020-01-02 2020-01-01 00:13:55 2020-01-02 03:42:16 2020-01-01 00:13:55.000 2020-01-02 03:42:16.000 835 99736 50285.5 5028550 835 99736 50285.5 5028550 -32733 32202 4410.3 441030 -128 123 -3.14 -314 +836 100 10826 99737 2.51051 299.51051 151.01051 15101.05105 2.51051 299.5105 151.01051 15101.05103 2.51051 299.51051 151.01050999999998 15101.051 2020-01-01 2020-01-02 2020-01-01 00:13:56 2020-01-02 03:42:17 2020-01-01 00:13:56.000 2020-01-02 03:42:17.000 836 99737 50286.5 5028650 836 99737 50286.5 5028650 -32732 32203 4411.3 441130 -127 124 -2.14 -214 +837 100 10827 99738 2.51351 299.51351 151.01351 15101.35135 2.51351 299.51352 151.01351 15101.35162 2.51351 299.51351 151.01351 15101.351 2020-01-01 2020-01-02 2020-01-01 00:13:57 2020-01-02 03:42:18 2020-01-01 00:13:57.000 2020-01-02 03:42:18.000 837 99738 50287.5 5028750 837 99738 50287.5 5028750 -32731 32204 4412.3 441230 -126 125 -1.14 -114 +838 100 10828 99739 2.51651 299.51651 151.01651 15101.65165 2.51651 299.5165 151.01651 15101.6513 2.51651 299.51651 151.01651 15101.651 2020-01-01 2020-01-02 2020-01-01 00:13:58 2020-01-02 03:42:19 2020-01-01 00:13:58.000 2020-01-02 03:42:19.000 838 99739 50288.5 5028850 838 99739 50288.5 5028850 -32730 32205 4413.3 441330 -125 126 -0.14 -14 +839 100 10829 99740 2.51951 299.51951 151.01951 15101.95195 2.51951 299.51953 151.01951 15101.9519 2.51951 299.51951 151.01951 15101.951 2020-01-01 2020-01-02 2020-01-01 00:13:59 2020-01-02 03:42:20 2020-01-01 00:13:59.000 2020-01-02 03:42:20.000 839 99740 50289.5 5028950 839 99740 50289.5 5028950 -32729 32206 4414.3 441430 -124 127 0.86 86 84 102 10074 99984 0.25225 300.25225 150.25225 15175.47747 0.25225 300.25226 150.25225 15175.47778 0.25225 300.25225 150.25225 15175.47725 2020-01-01 2020-01-02 2020-01-01 00:01:24 2020-01-02 03:46:24 2020-01-01 00:01:24.000 2020-01-02 03:46:24.000 84 99984 50034 5053434 84 99984 50034 5053434 -32485 32450 4613.009900990099 465914 -124 127 -0.0594059405940594 -6 -840 100 10830 99741 2.52252 299.52252 151.02252 15102.25225 2.52252 299.52252 151.02252 15102.2522 2.52252 299.52252 151.02252000000001 15102.25200 2020-01-01 2020-01-02 2020-01-01 00:14:00 2020-01-02 03:42:21 2020-01-01 00:14:00.000 2020-01-02 03:42:21.000 840 99741 50290.5 5029050 840 99741 50290.5 5029050 -32728 32207 4415.3 441530 -128 127 -0.7 -70 -841 100 10831 99742 2.52552 299.52552 151.02552 15102.55255 2.52552 299.5255 151.02552 15102.5525 2.52552 299.52552 151.02552 15102.55200 2020-01-01 2020-01-02 2020-01-01 00:14:01 2020-01-02 03:42:22 2020-01-01 00:14:01.000 2020-01-02 03:42:22.000 841 99742 50291.5 5029150 841 99742 50291.5 5029150 -32727 32208 4416.3 441630 -128 127 -2.26 -226 -842 100 10832 99743 2.52852 299.52852 151.02852 15102.85285 2.52852 299.52853 151.02853 15102.85313 2.52852 299.52852 151.02852000000001 15102.85200 2020-01-01 2020-01-02 2020-01-01 00:14:02 2020-01-02 03:42:23 2020-01-01 00:14:02.000 2020-01-02 03:42:23.000 842 99743 50292.5 5029250 842 99743 50292.5 5029250 -32726 32209 4417.3 441730 -128 123 -3.82 -382 -843 100 10833 99744 2.53153 299.53153 151.03153 15103.15315 2.53153 299.53152 151.03152 15103.15278 2.53153 299.53153 151.03153 15103.15300 2020-01-01 2020-01-02 2020-01-01 00:14:03 2020-01-02 03:42:24 2020-01-01 00:14:03.000 2020-01-02 03:42:24.000 843 99744 50293.5 5029350 843 99744 50293.5 5029350 -32725 32210 4418.3 441830 -127 124 -2.82 -282 -844 100 10834 99745 2.53453 299.53453 151.03453 15103.45345 2.53453 299.53455 151.03453 15103.45353 2.53453 299.53453 151.03453 15103.45300 2020-01-01 2020-01-02 2020-01-01 00:14:04 2020-01-02 03:42:25 2020-01-01 00:14:04.000 2020-01-02 03:42:25.000 844 99745 50294.5 5029450 844 99745 50294.5 5029450 -32724 32211 4419.3 441930 -126 125 -1.82 -182 -845 100 10835 99746 2.53753 299.53753 151.03753 15103.75375 2.53753 299.53754 151.03753 15103.75366 2.53753 299.53753 151.03753 15103.75300 2020-01-01 2020-01-02 2020-01-01 00:14:05 2020-01-02 03:42:26 2020-01-01 00:14:05.000 2020-01-02 03:42:26.000 845 99746 50295.5 5029550 845 99746 50295.5 5029550 -32723 32212 4420.3 442030 -125 126 -0.82 -82 -846 100 10836 99747 2.54054 299.54054 151.04054 15104.05405 2.54054 299.54053 151.04053 15104.05397 2.54054 299.54054 151.04054 15104.05400 2020-01-01 2020-01-02 2020-01-01 00:14:06 2020-01-02 03:42:27 2020-01-01 00:14:06.000 2020-01-02 03:42:27.000 846 99747 50296.5 5029650 846 99747 50296.5 5029650 -32722 32213 4421.3 442130 -124 127 0.18 18 -847 100 10837 99748 2.54354 299.54354 151.04354 15104.35435 2.54354 299.54355 151.04354 15104.3546 2.54354 299.54354 151.04354 15104.35400 2020-01-01 2020-01-02 2020-01-01 00:14:07 2020-01-02 03:42:28 2020-01-01 00:14:07.000 2020-01-02 03:42:28.000 847 99748 50297.5 5029750 847 99748 50297.5 5029750 -32721 32214 4422.3 442230 -128 127 -1.38 -138 -848 100 10838 99749 2.54654 299.54654 151.04654 15104.65465 2.54654 299.54654 151.04654 15104.65425 2.54654 299.54654 151.04654 15104.65400 2020-01-01 2020-01-02 2020-01-01 00:14:08 2020-01-02 03:42:29 2020-01-01 00:14:08.000 2020-01-02 03:42:29.000 848 99749 50298.5 5029850 848 99749 50298.5 5029850 -32720 32215 4423.3 442330 -128 123 -2.94 -294 -849 100 10839 99750 2.54954 299.54954 151.04954 15104.95495 2.54954 299.54956 151.04954 15104.95499 2.54954 299.54954 151.04954 15104.95400 2020-01-01 2020-01-02 2020-01-01 00:14:09 2020-01-02 03:42:30 2020-01-01 00:14:09.000 2020-01-02 03:42:30.000 849 99750 50299.5 5029950 849 99750 50299.5 5029950 -32719 32216 4424.3 442430 -127 124 -1.94 -194 +840 100 10830 99741 2.52252 299.52252 151.02252 15102.25225 2.52252 299.52252 151.02252 15102.2522 2.52252 299.52252 151.02252000000001 15102.252 2020-01-01 2020-01-02 2020-01-01 00:14:00 2020-01-02 03:42:21 2020-01-01 00:14:00.000 2020-01-02 03:42:21.000 840 99741 50290.5 5029050 840 99741 50290.5 5029050 -32728 32207 4415.3 441530 -128 127 -0.7 -70 +841 100 10831 99742 2.52552 299.52552 151.02552 15102.55255 2.52552 299.5255 151.02552 15102.5525 2.52552 299.52552 151.02552 15102.552 2020-01-01 2020-01-02 2020-01-01 00:14:01 2020-01-02 03:42:22 2020-01-01 00:14:01.000 2020-01-02 03:42:22.000 841 99742 50291.5 5029150 841 99742 50291.5 5029150 -32727 32208 4416.3 441630 -128 127 -2.26 -226 +842 100 10832 99743 2.52852 299.52852 151.02852 15102.85285 2.52852 299.52853 151.02853 15102.85313 2.52852 299.52852 151.02852000000001 15102.852 2020-01-01 2020-01-02 2020-01-01 00:14:02 2020-01-02 03:42:23 2020-01-01 00:14:02.000 2020-01-02 03:42:23.000 842 99743 50292.5 5029250 842 99743 50292.5 5029250 -32726 32209 4417.3 441730 -128 123 -3.82 -382 +843 100 10833 99744 2.53153 299.53153 151.03153 15103.15315 2.53153 299.53152 151.03152 15103.15278 2.53153 299.53153 151.03153 15103.153 2020-01-01 2020-01-02 2020-01-01 00:14:03 2020-01-02 03:42:24 2020-01-01 00:14:03.000 2020-01-02 03:42:24.000 843 99744 50293.5 5029350 843 99744 50293.5 5029350 -32725 32210 4418.3 441830 -127 124 -2.82 -282 +844 100 10834 99745 2.53453 299.53453 151.03453 15103.45345 2.53453 299.53455 151.03453 15103.45353 2.53453 299.53453 151.03453 15103.453 2020-01-01 2020-01-02 2020-01-01 00:14:04 2020-01-02 03:42:25 2020-01-01 00:14:04.000 2020-01-02 03:42:25.000 844 99745 50294.5 5029450 844 99745 50294.5 5029450 -32724 32211 4419.3 441930 -126 125 -1.82 -182 +845 100 10835 99746 2.53753 299.53753 151.03753 15103.75375 2.53753 299.53754 151.03753 15103.75366 2.53753 299.53753 151.03753 15103.753 2020-01-01 2020-01-02 2020-01-01 00:14:05 2020-01-02 03:42:26 2020-01-01 00:14:05.000 2020-01-02 03:42:26.000 845 99746 50295.5 5029550 845 99746 50295.5 5029550 -32723 32212 4420.3 442030 -125 126 -0.82 -82 +846 100 10836 99747 2.54054 299.54054 151.04054 15104.05405 2.54054 299.54053 151.04053 15104.05397 2.54054 299.54054 151.04054 15104.054 2020-01-01 2020-01-02 2020-01-01 00:14:06 2020-01-02 03:42:27 2020-01-01 00:14:06.000 2020-01-02 03:42:27.000 846 99747 50296.5 5029650 846 99747 50296.5 5029650 -32722 32213 4421.3 442130 -124 127 0.18 18 +847 100 10837 99748 2.54354 299.54354 151.04354 15104.35435 2.54354 299.54355 151.04354 15104.3546 2.54354 299.54354 151.04354 15104.354 2020-01-01 2020-01-02 2020-01-01 00:14:07 2020-01-02 03:42:28 2020-01-01 00:14:07.000 2020-01-02 03:42:28.000 847 99748 50297.5 5029750 847 99748 50297.5 5029750 -32721 32214 4422.3 442230 -128 127 -1.38 -138 +848 100 10838 99749 2.54654 299.54654 151.04654 15104.65465 2.54654 299.54654 151.04654 15104.65425 2.54654 299.54654 151.04654 15104.654 2020-01-01 2020-01-02 2020-01-01 00:14:08 2020-01-02 03:42:29 2020-01-01 00:14:08.000 2020-01-02 03:42:29.000 848 99749 50298.5 5029850 848 99749 50298.5 5029850 -32720 32215 4423.3 442330 -128 123 -2.94 -294 +849 100 10839 99750 2.54954 299.54954 151.04954 15104.95495 2.54954 299.54956 151.04954 15104.95499 2.54954 299.54954 151.04954 15104.954 2020-01-01 2020-01-02 2020-01-01 00:14:09 2020-01-02 03:42:30 2020-01-01 00:14:09.000 2020-01-02 03:42:30.000 849 99750 50299.5 5029950 849 99750 50299.5 5029950 -32719 32216 4424.3 442430 -127 124 -1.94 -194 85 102 10075 99985 0.25525 300.25525 150.25525 15175.78078 0.25525 300.25525 150.25525 15175.78046 0.25525 300.25525 150.25525 15175.78025 2020-01-01 2020-01-02 2020-01-01 00:01:25 2020-01-02 03:46:25 2020-01-01 00:01:25.000 2020-01-02 03:46:25.000 85 99985 50035 5053535 85 99985 50035 5053535 -32484 32451 4614.009900990099 466015 -128 127 -1.5940594059405941 -161 -850 100 10840 99751 2.55255 299.55255 151.05255 15105.25525 2.55255 299.55255 151.05255 15105.25514 2.55255 299.55255 151.05255 15105.25500 2020-01-01 2020-01-02 2020-01-01 00:14:10 2020-01-02 03:42:31 2020-01-01 00:14:10.000 2020-01-02 03:42:31.000 850 99751 50300.5 5030050 850 99751 50300.5 5030050 -32718 32217 4425.3 442530 -126 125 -0.94 -94 -851 100 10841 99752 2.55555 299.55555 151.05555 15105.55555 2.55555 299.55554 151.05555 15105.55547 2.55555 299.55555 151.05555 15105.55500 2020-01-01 2020-01-02 2020-01-01 00:14:11 2020-01-02 03:42:32 2020-01-01 00:14:11.000 2020-01-02 03:42:32.000 851 99752 50301.5 5030150 851 99752 50301.5 5030150 -32717 32218 4426.3 442630 -125 126 0.06 6 -852 100 10842 99753 2.55855 299.55855 151.05855 15105.85585 2.55855 299.55856 151.05856 15105.85607 2.55855 299.55855 151.05855 15105.85500 2020-01-01 2020-01-02 2020-01-01 00:14:12 2020-01-02 03:42:33 2020-01-01 00:14:12.000 2020-01-02 03:42:33.000 852 99753 50302.5 5030250 852 99753 50302.5 5030250 -32716 32219 4427.3 442730 -124 127 1.06 106 -853 100 10843 99754 2.56156 299.56156 151.06156 15106.15615 2.56156 299.56155 151.06155 15106.15571 2.56156 299.56156 151.06156000000001 15106.15600 2020-01-01 2020-01-02 2020-01-01 00:14:13 2020-01-02 03:42:34 2020-01-01 00:14:13.000 2020-01-02 03:42:34.000 853 99754 50303.5 5030350 853 99754 50303.5 5030350 -32715 32220 4428.3 442830 -128 127 -0.5 -50 -854 100 10844 99755 2.56456 299.56456 151.06456 15106.45645 2.56456 299.56458 151.06456 15106.45646 2.56456 299.56456 151.06456 15106.45600 2020-01-01 2020-01-02 2020-01-01 00:14:14 2020-01-02 03:42:35 2020-01-01 00:14:14.000 2020-01-02 03:42:35.000 854 99755 50304.5 5030450 854 99755 50304.5 5030450 -32714 32221 4429.3 442930 -128 123 -2.06 -206 -855 100 10845 99756 2.56756 299.56756 151.06756 15106.75675 2.56756 299.56757 151.06756 15106.75661 2.56756 299.56756 151.06756 15106.75600 2020-01-01 2020-01-02 2020-01-01 00:14:15 2020-01-02 03:42:36 2020-01-01 00:14:15.000 2020-01-02 03:42:36.000 855 99756 50305.5 5030550 855 99756 50305.5 5030550 -32713 32222 4430.3 443030 -127 124 -1.06 -106 -856 100 10846 99757 2.57057 299.57057 151.07057 15107.05705 2.57057 299.57056 151.07056 15107.05694 2.57057 299.57057 151.07057 15107.05700 2020-01-01 2020-01-02 2020-01-01 00:14:16 2020-01-02 03:42:37 2020-01-01 00:14:16.000 2020-01-02 03:42:37.000 856 99757 50306.5 5030650 856 99757 50306.5 5030650 -32712 32223 4431.3 443130 -126 125 -0.06 -6 -857 100 10847 99758 2.57357 299.57357 151.07357 15107.35735 2.57357 299.57358 151.07357 15107.35754 2.57357 299.57357 151.07357 15107.35700 2020-01-01 2020-01-02 2020-01-01 00:14:17 2020-01-02 03:42:38 2020-01-01 00:14:17.000 2020-01-02 03:42:38.000 857 99758 50307.5 5030750 857 99758 50307.5 5030750 -32711 32224 4432.3 443230 -125 126 0.94 94 -858 100 10848 99759 2.57657 299.57657 151.07657 15107.65765 2.57657 299.57657 151.07657 15107.65783 2.57657 299.57657 151.07657 15107.65700 2020-01-01 2020-01-02 2020-01-01 00:14:18 2020-01-02 03:42:39 2020-01-01 00:14:18.000 2020-01-02 03:42:39.000 858 99759 50308.5 5030850 858 99759 50308.5 5030850 -32710 32225 4433.3 443330 -124 127 1.94 194 -859 100 10849 99760 2.57957 299.57957 151.07957 15107.95795 2.57957 299.5796 151.07957 15107.95794 2.57957 299.57957 151.07957 15107.95700 2020-01-01 2020-01-02 2020-01-01 00:14:19 2020-01-02 03:42:40 2020-01-01 00:14:19.000 2020-01-02 03:42:40.000 859 99760 50309.5 5030950 859 99760 50309.5 5030950 -32709 32226 4434.3 443430 -128 127 0.38 38 +850 100 10840 99751 2.55255 299.55255 151.05255 15105.25525 2.55255 299.55255 151.05255 15105.25514 2.55255 299.55255 151.05255 15105.255 2020-01-01 2020-01-02 2020-01-01 00:14:10 2020-01-02 03:42:31 2020-01-01 00:14:10.000 2020-01-02 03:42:31.000 850 99751 50300.5 5030050 850 99751 50300.5 5030050 -32718 32217 4425.3 442530 -126 125 -0.94 -94 +851 100 10841 99752 2.55555 299.55555 151.05555 15105.55555 2.55555 299.55554 151.05555 15105.55547 2.55555 299.55555 151.05555 15105.555 2020-01-01 2020-01-02 2020-01-01 00:14:11 2020-01-02 03:42:32 2020-01-01 00:14:11.000 2020-01-02 03:42:32.000 851 99752 50301.5 5030150 851 99752 50301.5 5030150 -32717 32218 4426.3 442630 -125 126 0.06 6 +852 100 10842 99753 2.55855 299.55855 151.05855 15105.85585 2.55855 299.55856 151.05856 15105.85607 2.55855 299.55855 151.05855 15105.855 2020-01-01 2020-01-02 2020-01-01 00:14:12 2020-01-02 03:42:33 2020-01-01 00:14:12.000 2020-01-02 03:42:33.000 852 99753 50302.5 5030250 852 99753 50302.5 5030250 -32716 32219 4427.3 442730 -124 127 1.06 106 +853 100 10843 99754 2.56156 299.56156 151.06156 15106.15615 2.56156 299.56155 151.06155 15106.15571 2.56156 299.56156 151.06156000000001 15106.156 2020-01-01 2020-01-02 2020-01-01 00:14:13 2020-01-02 03:42:34 2020-01-01 00:14:13.000 2020-01-02 03:42:34.000 853 99754 50303.5 5030350 853 99754 50303.5 5030350 -32715 32220 4428.3 442830 -128 127 -0.5 -50 +854 100 10844 99755 2.56456 299.56456 151.06456 15106.45645 2.56456 299.56458 151.06456 15106.45646 2.56456 299.56456 151.06456 15106.456 2020-01-01 2020-01-02 2020-01-01 00:14:14 2020-01-02 03:42:35 2020-01-01 00:14:14.000 2020-01-02 03:42:35.000 854 99755 50304.5 5030450 854 99755 50304.5 5030450 -32714 32221 4429.3 442930 -128 123 -2.06 -206 +855 100 10845 99756 2.56756 299.56756 151.06756 15106.75675 2.56756 299.56757 151.06756 15106.75661 2.56756 299.56756 151.06756 15106.756 2020-01-01 2020-01-02 2020-01-01 00:14:15 2020-01-02 03:42:36 2020-01-01 00:14:15.000 2020-01-02 03:42:36.000 855 99756 50305.5 5030550 855 99756 50305.5 5030550 -32713 32222 4430.3 443030 -127 124 -1.06 -106 +856 100 10846 99757 2.57057 299.57057 151.07057 15107.05705 2.57057 299.57056 151.07056 15107.05694 2.57057 299.57057 151.07057 15107.057 2020-01-01 2020-01-02 2020-01-01 00:14:16 2020-01-02 03:42:37 2020-01-01 00:14:16.000 2020-01-02 03:42:37.000 856 99757 50306.5 5030650 856 99757 50306.5 5030650 -32712 32223 4431.3 443130 -126 125 -0.06 -6 +857 100 10847 99758 2.57357 299.57357 151.07357 15107.35735 2.57357 299.57358 151.07357 15107.35754 2.57357 299.57357 151.07357 15107.357 2020-01-01 2020-01-02 2020-01-01 00:14:17 2020-01-02 03:42:38 2020-01-01 00:14:17.000 2020-01-02 03:42:38.000 857 99758 50307.5 5030750 857 99758 50307.5 5030750 -32711 32224 4432.3 443230 -125 126 0.94 94 +858 100 10848 99759 2.57657 299.57657 151.07657 15107.65765 2.57657 299.57657 151.07657 15107.65783 2.57657 299.57657 151.07657 15107.657 2020-01-01 2020-01-02 2020-01-01 00:14:18 2020-01-02 03:42:39 2020-01-01 00:14:18.000 2020-01-02 03:42:39.000 858 99759 50308.5 5030850 858 99759 50308.5 5030850 -32710 32225 4433.3 443330 -124 127 1.94 194 +859 100 10849 99760 2.57957 299.57957 151.07957 15107.95795 2.57957 299.5796 151.07957 15107.95794 2.57957 299.57957 151.07957 15107.957 2020-01-01 2020-01-02 2020-01-01 00:14:19 2020-01-02 03:42:40 2020-01-01 00:14:19.000 2020-01-02 03:42:40.000 859 99760 50309.5 5030950 859 99760 50309.5 5030950 -32709 32226 4434.3 443430 -128 127 0.38 38 86 102 10076 99986 0.25825 300.25825 150.25825 15176.08408 0.25825 300.25827 150.25825 15176.08406 0.25825 300.25825 150.25825 15176.08325 2020-01-01 2020-01-02 2020-01-01 00:01:26 2020-01-02 03:46:26 2020-01-01 00:01:26.000 2020-01-02 03:46:26.000 86 99986 50036 5053636 86 99986 50036 5053636 -32483 32452 4615.009900990099 466116 -128 123 -3.128712871287129 -316 -860 100 10850 99761 2.58258 299.58258 151.08258 15108.25825 2.58258 299.58258 151.08258 15108.25811 2.58258 299.58258 151.08258 15108.25800 2020-01-01 2020-01-02 2020-01-01 00:14:20 2020-01-02 03:42:41 2020-01-01 00:14:20.000 2020-01-02 03:42:41.000 860 99761 50310.5 5031050 860 99761 50310.5 5031050 -32708 32227 4435.3 443530 -128 123 -1.18 -118 -861 100 10851 99762 2.58558 299.58558 151.08558 15108.55855 2.58558 299.58557 151.08558 15108.55841 2.58558 299.58558 151.08558000000002 15108.55800 2020-01-01 2020-01-02 2020-01-01 00:14:21 2020-01-02 03:42:42 2020-01-01 00:14:21.000 2020-01-02 03:42:42.000 861 99762 50311.5 5031150 861 99762 50311.5 5031150 -32707 32228 4436.3 443630 -127 124 -0.18 -18 -862 100 10852 99763 2.58858 299.58858 151.08858 15108.85885 2.58858 299.5886 151.08859 15108.85901 2.58858 299.58858 151.08858 15108.85800 2020-01-01 2020-01-02 2020-01-01 00:14:22 2020-01-02 03:42:43 2020-01-01 00:14:22.000 2020-01-02 03:42:43.000 862 99763 50312.5 5031250 862 99763 50312.5 5031250 -32706 32229 4437.3 443730 -126 125 0.82 82 -863 100 10853 99764 2.59159 299.59159 151.09159 15109.15915 2.59159 299.59158 151.09159 15109.1593 2.59159 299.59159 151.09159 15109.15900 2020-01-01 2020-01-02 2020-01-01 00:14:23 2020-01-02 03:42:44 2020-01-01 00:14:23.000 2020-01-02 03:42:44.000 863 99764 50313.5 5031350 863 99764 50313.5 5031350 -32705 32230 4438.3 443830 -125 126 1.82 182 -864 100 10854 99765 2.59459 299.59459 151.09459 15109.45945 2.59459 299.5946 151.09459 15109.45941 2.59459 299.59459 151.09459 15109.45900 2020-01-01 2020-01-02 2020-01-01 00:14:24 2020-01-02 03:42:45 2020-01-01 00:14:24.000 2020-01-02 03:42:45.000 864 99765 50314.5 5031450 864 99765 50314.5 5031450 -32704 32231 4439.3 443930 -124 127 2.82 282 -865 100 10855 99766 2.59759 299.59759 151.09759 15109.75975 2.59759 299.5976 151.09759 15109.75958 2.59759 299.59759 151.09759 15109.75900 2020-01-01 2020-01-02 2020-01-01 00:14:25 2020-01-02 03:42:46 2020-01-01 00:14:25.000 2020-01-02 03:42:46.000 865 99766 50315.5 5031550 865 99766 50315.5 5031550 -32703 32232 4440.3 444030 -128 127 1.26 126 -866 100 10856 99767 2.6006 299.6006 151.1006 15110.06006 2.6006 299.6006 151.10059 15110.05988 2.60060 299.60060 151.1006 15110.06000 2020-01-01 2020-01-02 2020-01-01 00:14:26 2020-01-02 03:42:47 2020-01-01 00:14:26.000 2020-01-02 03:42:47.000 866 99767 50316.5 5031650 866 99767 50316.5 5031650 -32702 32233 4441.3 444130 -128 127 -0.3 -30 -867 100 10857 99768 2.6036 299.6036 151.1036 15110.36036 2.6036 299.6036 151.1036 15110.36063 2.60360 299.60360 151.1036 15110.36000 2020-01-01 2020-01-02 2020-01-01 00:14:27 2020-01-02 03:42:48 2020-01-01 00:14:27.000 2020-01-02 03:42:48.000 867 99768 50317.5 5031750 867 99768 50317.5 5031750 -32701 32234 4442.3 444230 -128 123 -1.86 -186 -868 100 10858 99769 2.6066 299.6066 151.1066 15110.66066 2.6066 299.6066 151.1066 15110.66078 2.60660 299.60660 151.1066 15110.66000 2020-01-01 2020-01-02 2020-01-01 00:14:28 2020-01-02 03:42:49 2020-01-01 00:14:28.000 2020-01-02 03:42:49.000 868 99769 50318.5 5031850 868 99769 50318.5 5031850 -32700 32235 4443.3 444330 -127 124 -0.86 -86 -869 100 10859 99770 2.6096 299.6096 151.1096 15110.96096 2.6096 299.60962 151.1096 15110.96091 2.60960 299.60960 151.1096 15110.96000 2020-01-01 2020-01-02 2020-01-01 00:14:29 2020-01-02 03:42:50 2020-01-01 00:14:29.000 2020-01-02 03:42:50.000 869 99770 50319.5 5031950 869 99770 50319.5 5031950 -32699 32236 4444.3 444430 -126 125 0.14 14 +860 100 10850 99761 2.58258 299.58258 151.08258 15108.25825 2.58258 299.58258 151.08258 15108.25811 2.58258 299.58258 151.08258 15108.258 2020-01-01 2020-01-02 2020-01-01 00:14:20 2020-01-02 03:42:41 2020-01-01 00:14:20.000 2020-01-02 03:42:41.000 860 99761 50310.5 5031050 860 99761 50310.5 5031050 -32708 32227 4435.3 443530 -128 123 -1.18 -118 +861 100 10851 99762 2.58558 299.58558 151.08558 15108.55855 2.58558 299.58557 151.08558 15108.55841 2.58558 299.58558 151.08558000000002 15108.558 2020-01-01 2020-01-02 2020-01-01 00:14:21 2020-01-02 03:42:42 2020-01-01 00:14:21.000 2020-01-02 03:42:42.000 861 99762 50311.5 5031150 861 99762 50311.5 5031150 -32707 32228 4436.3 443630 -127 124 -0.18 -18 +862 100 10852 99763 2.58858 299.58858 151.08858 15108.85885 2.58858 299.5886 151.08859 15108.85901 2.58858 299.58858 151.08858 15108.858 2020-01-01 2020-01-02 2020-01-01 00:14:22 2020-01-02 03:42:43 2020-01-01 00:14:22.000 2020-01-02 03:42:43.000 862 99763 50312.5 5031250 862 99763 50312.5 5031250 -32706 32229 4437.3 443730 -126 125 0.82 82 +863 100 10853 99764 2.59159 299.59159 151.09159 15109.15915 2.59159 299.59158 151.09159 15109.1593 2.59159 299.59159 151.09159 15109.159 2020-01-01 2020-01-02 2020-01-01 00:14:23 2020-01-02 03:42:44 2020-01-01 00:14:23.000 2020-01-02 03:42:44.000 863 99764 50313.5 5031350 863 99764 50313.5 5031350 -32705 32230 4438.3 443830 -125 126 1.82 182 +864 100 10854 99765 2.59459 299.59459 151.09459 15109.45945 2.59459 299.5946 151.09459 15109.45941 2.59459 299.59459 151.09459 15109.459 2020-01-01 2020-01-02 2020-01-01 00:14:24 2020-01-02 03:42:45 2020-01-01 00:14:24.000 2020-01-02 03:42:45.000 864 99765 50314.5 5031450 864 99765 50314.5 5031450 -32704 32231 4439.3 443930 -124 127 2.82 282 +865 100 10855 99766 2.59759 299.59759 151.09759 15109.75975 2.59759 299.5976 151.09759 15109.75958 2.59759 299.59759 151.09759 15109.759 2020-01-01 2020-01-02 2020-01-01 00:14:25 2020-01-02 03:42:46 2020-01-01 00:14:25.000 2020-01-02 03:42:46.000 865 99766 50315.5 5031550 865 99766 50315.5 5031550 -32703 32232 4440.3 444030 -128 127 1.26 126 +866 100 10856 99767 2.6006 299.6006 151.1006 15110.06006 2.6006 299.6006 151.10059 15110.05988 2.6006 299.6006 151.1006 15110.06 2020-01-01 2020-01-02 2020-01-01 00:14:26 2020-01-02 03:42:47 2020-01-01 00:14:26.000 2020-01-02 03:42:47.000 866 99767 50316.5 5031650 866 99767 50316.5 5031650 -32702 32233 4441.3 444130 -128 127 -0.3 -30 +867 100 10857 99768 2.6036 299.6036 151.1036 15110.36036 2.6036 299.6036 151.1036 15110.36063 2.6036 299.6036 151.1036 15110.36 2020-01-01 2020-01-02 2020-01-01 00:14:27 2020-01-02 03:42:48 2020-01-01 00:14:27.000 2020-01-02 03:42:48.000 867 99768 50317.5 5031750 867 99768 50317.5 5031750 -32701 32234 4442.3 444230 -128 123 -1.86 -186 +868 100 10858 99769 2.6066 299.6066 151.1066 15110.66066 2.6066 299.6066 151.1066 15110.66078 2.6066 299.6066 151.1066 15110.66 2020-01-01 2020-01-02 2020-01-01 00:14:28 2020-01-02 03:42:49 2020-01-01 00:14:28.000 2020-01-02 03:42:49.000 868 99769 50318.5 5031850 868 99769 50318.5 5031850 -32700 32235 4443.3 444330 -127 124 -0.86 -86 +869 100 10859 99770 2.6096 299.6096 151.1096 15110.96096 2.6096 299.60962 151.1096 15110.96091 2.6096 299.6096 151.1096 15110.96 2020-01-01 2020-01-02 2020-01-01 00:14:29 2020-01-02 03:42:50 2020-01-01 00:14:29.000 2020-01-02 03:42:50.000 869 99770 50319.5 5031950 869 99770 50319.5 5031950 -32699 32236 4444.3 444430 -126 125 0.14 14 87 102 10077 99987 0.26126 300.26126 150.26126 15176.38738 0.26126 300.26126 150.26126 15176.38736 0.26126 300.26126 150.26126 15176.38726 2020-01-01 2020-01-02 2020-01-01 00:01:27 2020-01-02 03:46:27 2020-01-01 00:01:27.000 2020-01-02 03:46:27.000 87 99987 50037 5053737 87 99987 50037 5053737 -32482 32453 4616.009900990099 466217 -127 124 -2.128712871287129 -215 -870 100 10860 99771 2.61261 299.61261 151.11261 15111.26126 2.61261 299.6126 151.11261 15111.26105 2.61261 299.61261 151.11261000000002 15111.26100 2020-01-01 2020-01-02 2020-01-01 00:14:30 2020-01-02 03:42:51 2020-01-01 00:14:30.000 2020-01-02 03:42:51.000 870 99771 50320.5 5032050 870 99771 50320.5 5032050 -32698 32237 4445.3 444530 -125 126 1.14 114 -871 100 10861 99772 2.61561 299.61561 151.11561 15111.56156 2.61561 299.6156 151.11561 15111.56135 2.61561 299.61561 151.11561 15111.56100 2020-01-01 2020-01-02 2020-01-01 00:14:31 2020-01-02 03:42:52 2020-01-01 00:14:31.000 2020-01-02 03:42:52.000 871 99772 50321.5 5032150 871 99772 50321.5 5032150 -32697 32238 4446.3 444630 -124 127 2.14 214 -872 100 10862 99773 2.61861 299.61861 151.11861 15111.86186 2.61861 299.61862 151.11862 15111.8621 2.61861 299.61861 151.11861000000002 15111.86100 2020-01-01 2020-01-02 2020-01-01 00:14:32 2020-01-02 03:42:53 2020-01-01 00:14:32.000 2020-01-02 03:42:53.000 872 99773 50322.5 5032250 872 99773 50322.5 5032250 -32696 32239 4447.3 444730 -128 127 0.58 58 -873 100 10863 99774 2.62162 299.62162 151.12162 15112.16216 2.62162 299.6216 151.12162 15112.16224 2.62162 299.62162 151.12162 15112.16200 2020-01-01 2020-01-02 2020-01-01 00:14:33 2020-01-02 03:42:54 2020-01-01 00:14:33.000 2020-01-02 03:42:54.000 873 99774 50323.5 5032350 873 99774 50323.5 5032350 -32695 32240 4448.3 444830 -128 123 -0.98 -98 -874 100 10864 99775 2.62462 299.62462 151.12462 15112.46246 2.62462 299.62463 151.12462 15112.46238 2.62462 299.62462 151.12462 15112.46200 2020-01-01 2020-01-02 2020-01-01 00:14:34 2020-01-02 03:42:55 2020-01-01 00:14:34.000 2020-01-02 03:42:55.000 874 99775 50324.5 5032450 874 99775 50324.5 5032450 -32694 32241 4449.3 444930 -127 124 0.02 2 -875 100 10865 99776 2.62762 299.62762 151.12762 15112.76276 2.62762 299.62762 151.12762 15112.76252 2.62762 299.62762 151.12762 15112.76200 2020-01-01 2020-01-02 2020-01-01 00:14:35 2020-01-02 03:42:56 2020-01-01 00:14:35.000 2020-01-02 03:42:56.000 875 99776 50325.5 5032550 875 99776 50325.5 5032550 -32693 32242 4450.3 445030 -126 125 1.02 102 -876 100 10866 99777 2.63063 299.63063 151.13063 15113.06306 2.63063 299.63065 151.13063 15113.06327 2.63063 299.63063 151.13063 15113.06300 2020-01-01 2020-01-02 2020-01-01 00:14:36 2020-01-02 03:42:57 2020-01-01 00:14:36.000 2020-01-02 03:42:57.000 876 99777 50326.5 5032650 876 99777 50326.5 5032650 -32692 32243 4451.3 445130 -125 126 2.02 202 -877 100 10867 99778 2.63363 299.63363 151.13363 15113.36336 2.63363 299.63364 151.13363 15113.36358 2.63363 299.63363 151.13362999999998 15113.36300 2020-01-01 2020-01-02 2020-01-01 00:14:37 2020-01-02 03:42:58 2020-01-01 00:14:37.000 2020-01-02 03:42:58.000 877 99778 50327.5 5032750 877 99778 50327.5 5032750 -32691 32244 4452.3 445230 -124 127 3.02 302 -878 100 10868 99779 2.63663 299.63663 151.13663 15113.66366 2.63663 299.63663 151.13663 15113.66371 2.63663 299.63663 151.13663 15113.66300 2020-01-01 2020-01-02 2020-01-01 00:14:38 2020-01-02 03:42:59 2020-01-01 00:14:38.000 2020-01-02 03:42:59.000 878 99779 50328.5 5032850 878 99779 50328.5 5032850 -32690 32245 4453.3 445330 -128 127 1.46 146 -879 100 10869 99780 2.63963 299.63963 151.13963 15113.96396 2.63963 299.63965 151.13963 15113.96385 2.63963 299.63963 151.13963 15113.96300 2020-01-01 2020-01-02 2020-01-01 00:14:39 2020-01-02 03:43:00 2020-01-01 00:14:39.000 2020-01-02 03:43:00.000 879 99780 50329.5 5032950 879 99780 50329.5 5032950 -32689 32246 4454.3 445430 -128 123 -0.1 -10 +870 100 10860 99771 2.61261 299.61261 151.11261 15111.26126 2.61261 299.6126 151.11261 15111.26105 2.61261 299.61261 151.11261000000002 15111.261 2020-01-01 2020-01-02 2020-01-01 00:14:30 2020-01-02 03:42:51 2020-01-01 00:14:30.000 2020-01-02 03:42:51.000 870 99771 50320.5 5032050 870 99771 50320.5 5032050 -32698 32237 4445.3 444530 -125 126 1.14 114 +871 100 10861 99772 2.61561 299.61561 151.11561 15111.56156 2.61561 299.6156 151.11561 15111.56135 2.61561 299.61561 151.11561 15111.561 2020-01-01 2020-01-02 2020-01-01 00:14:31 2020-01-02 03:42:52 2020-01-01 00:14:31.000 2020-01-02 03:42:52.000 871 99772 50321.5 5032150 871 99772 50321.5 5032150 -32697 32238 4446.3 444630 -124 127 2.14 214 +872 100 10862 99773 2.61861 299.61861 151.11861 15111.86186 2.61861 299.61862 151.11862 15111.8621 2.61861 299.61861 151.11861000000002 15111.861 2020-01-01 2020-01-02 2020-01-01 00:14:32 2020-01-02 03:42:53 2020-01-01 00:14:32.000 2020-01-02 03:42:53.000 872 99773 50322.5 5032250 872 99773 50322.5 5032250 -32696 32239 4447.3 444730 -128 127 0.58 58 +873 100 10863 99774 2.62162 299.62162 151.12162 15112.16216 2.62162 299.6216 151.12162 15112.16224 2.62162 299.62162 151.12162 15112.162 2020-01-01 2020-01-02 2020-01-01 00:14:33 2020-01-02 03:42:54 2020-01-01 00:14:33.000 2020-01-02 03:42:54.000 873 99774 50323.5 5032350 873 99774 50323.5 5032350 -32695 32240 4448.3 444830 -128 123 -0.98 -98 +874 100 10864 99775 2.62462 299.62462 151.12462 15112.46246 2.62462 299.62463 151.12462 15112.46238 2.62462 299.62462 151.12462 15112.462 2020-01-01 2020-01-02 2020-01-01 00:14:34 2020-01-02 03:42:55 2020-01-01 00:14:34.000 2020-01-02 03:42:55.000 874 99775 50324.5 5032450 874 99775 50324.5 5032450 -32694 32241 4449.3 444930 -127 124 0.02 2 +875 100 10865 99776 2.62762 299.62762 151.12762 15112.76276 2.62762 299.62762 151.12762 15112.76252 2.62762 299.62762 151.12762 15112.762 2020-01-01 2020-01-02 2020-01-01 00:14:35 2020-01-02 03:42:56 2020-01-01 00:14:35.000 2020-01-02 03:42:56.000 875 99776 50325.5 5032550 875 99776 50325.5 5032550 -32693 32242 4450.3 445030 -126 125 1.02 102 +876 100 10866 99777 2.63063 299.63063 151.13063 15113.06306 2.63063 299.63065 151.13063 15113.06327 2.63063 299.63063 151.13063 15113.063 2020-01-01 2020-01-02 2020-01-01 00:14:36 2020-01-02 03:42:57 2020-01-01 00:14:36.000 2020-01-02 03:42:57.000 876 99777 50326.5 5032650 876 99777 50326.5 5032650 -32692 32243 4451.3 445130 -125 126 2.02 202 +877 100 10867 99778 2.63363 299.63363 151.13363 15113.36336 2.63363 299.63364 151.13363 15113.36358 2.63363 299.63363 151.13362999999998 15113.363 2020-01-01 2020-01-02 2020-01-01 00:14:37 2020-01-02 03:42:58 2020-01-01 00:14:37.000 2020-01-02 03:42:58.000 877 99778 50327.5 5032750 877 99778 50327.5 5032750 -32691 32244 4452.3 445230 -124 127 3.02 302 +878 100 10868 99779 2.63663 299.63663 151.13663 15113.66366 2.63663 299.63663 151.13663 15113.66371 2.63663 299.63663 151.13663 15113.663 2020-01-01 2020-01-02 2020-01-01 00:14:38 2020-01-02 03:42:59 2020-01-01 00:14:38.000 2020-01-02 03:42:59.000 878 99779 50328.5 5032850 878 99779 50328.5 5032850 -32690 32245 4453.3 445330 -128 127 1.46 146 +879 100 10869 99780 2.63963 299.63963 151.13963 15113.96396 2.63963 299.63965 151.13963 15113.96385 2.63963 299.63963 151.13963 15113.963 2020-01-01 2020-01-02 2020-01-01 00:14:39 2020-01-02 03:43:00 2020-01-01 00:14:39.000 2020-01-02 03:43:00.000 879 99780 50329.5 5032950 879 99780 50329.5 5032950 -32689 32246 4454.3 445430 -128 123 -0.1 -10 88 102 10078 99988 0.26426 300.26426 150.26426 15176.69069 0.26426 300.26425 150.26426 15176.69066 0.26426 300.26426 150.26426 15176.69026 2020-01-01 2020-01-02 2020-01-01 00:01:28 2020-01-02 03:46:28 2020-01-01 00:01:28.000 2020-01-02 03:46:28.000 88 99988 50038 5053838 88 99988 50038 5053838 -32481 32454 4617.009900990099 466318 -126 125 -1.1287128712871286 -114 -880 100 10870 99781 2.64264 299.64264 151.14264 15114.26426 2.64264 299.64264 151.14263 15114.26399 2.64264 299.64264 151.14264 15114.26400 2020-01-01 2020-01-02 2020-01-01 00:14:40 2020-01-02 03:43:01 2020-01-01 00:14:40.000 2020-01-02 03:43:01.000 880 99781 50330.5 5033050 880 99781 50330.5 5033050 -32688 32247 4455.3 445530 -127 124 0.9 90 -881 100 10871 99782 2.64564 299.64564 151.14564 15114.56456 2.64564 299.64566 151.14564 15114.56474 2.64564 299.64564 151.14564000000001 15114.56400 2020-01-01 2020-01-02 2020-01-01 00:14:41 2020-01-02 03:43:02 2020-01-01 00:14:41.000 2020-01-02 03:43:02.000 881 99782 50331.5 5033150 881 99782 50331.5 5033150 -32687 32248 4456.3 445630 -126 125 1.9 190 -882 100 10872 99783 2.64864 299.64864 151.14864 15114.86486 2.64864 299.64865 151.14865 15114.86504 2.64864 299.64864 151.14864 15114.86400 2020-01-01 2020-01-02 2020-01-01 00:14:42 2020-01-02 03:43:03 2020-01-01 00:14:42.000 2020-01-02 03:43:03.000 882 99783 50332.5 5033250 882 99783 50332.5 5033250 -32686 32249 4457.3 445730 -125 126 2.9 290 -883 100 10873 99784 2.65165 299.65165 151.15165 15115.16516 2.65165 299.65164 151.15165 15115.16522 2.65165 299.65165 151.15165000000002 15115.16500 2020-01-01 2020-01-02 2020-01-01 00:14:43 2020-01-02 03:43:04 2020-01-01 00:14:43.000 2020-01-02 03:43:04.000 883 99784 50333.5 5033350 883 99784 50333.5 5033350 -32685 32250 4458.3 445830 -124 127 3.9 390 -884 100 10874 99785 2.65465 299.65465 151.15465 15115.46546 2.65465 299.65466 151.15465 15115.46532 2.65465 299.65465 151.15465 15115.46500 2020-01-01 2020-01-02 2020-01-01 00:14:44 2020-01-02 03:43:05 2020-01-01 00:14:44.000 2020-01-02 03:43:05.000 884 99785 50334.5 5033450 884 99785 50334.5 5033450 -32684 32251 4459.3 445930 -128 127 2.34 234 -885 100 10875 99786 2.65765 299.65765 151.15765 15115.76576 2.65765 299.65765 151.15765 15115.76562 2.65765 299.65765 151.15765 15115.76500 2020-01-01 2020-01-02 2020-01-01 00:14:45 2020-01-02 03:43:06 2020-01-01 00:14:45.000 2020-01-02 03:43:06.000 885 99786 50335.5 5033550 885 99786 50335.5 5033550 -32683 32252 4460.3 446030 -128 123 0.78 78 -886 100 10876 99787 2.66066 299.66066 151.16066 15116.06606 2.66066 299.66068 151.16066 15116.06621 2.66066 299.66066 151.16066 15116.06600 2020-01-01 2020-01-02 2020-01-01 00:14:46 2020-01-02 03:43:07 2020-01-01 00:14:46.000 2020-01-02 03:43:07.000 886 99787 50336.5 5033650 886 99787 50336.5 5033650 -32682 32253 4461.3 446130 -127 124 1.78 178 -887 100 10877 99788 2.66366 299.66366 151.16366 15116.36636 2.66366 299.66367 151.16366 15116.36651 2.66366 299.66366 151.16366 15116.36600 2020-01-01 2020-01-02 2020-01-01 00:14:47 2020-01-02 03:43:08 2020-01-01 00:14:47.000 2020-01-02 03:43:08.000 887 99788 50337.5 5033750 887 99788 50337.5 5033750 -32681 32254 4462.3 446230 -126 125 2.78 278 -888 100 10878 99789 2.66666 299.66666 151.16666 15116.66666 2.66666 299.66666 151.16666 15116.66669 2.66666 299.66666 151.16665999999998 15116.66600 2020-01-01 2020-01-02 2020-01-01 00:14:48 2020-01-02 03:43:09 2020-01-01 00:14:48.000 2020-01-02 03:43:09.000 888 99789 50338.5 5033850 888 99789 50338.5 5033850 -32680 32255 4463.3 446330 -125 126 3.78 378 -889 100 10879 99790 2.66966 299.66966 151.16966 15116.96696 2.66966 299.66968 151.16966 15116.96679 2.66966 299.66966 151.16966 15116.96600 2020-01-01 2020-01-02 2020-01-01 00:14:49 2020-01-02 03:43:10 2020-01-01 00:14:49.000 2020-01-02 03:43:10.000 889 99790 50339.5 5033950 889 99790 50339.5 5033950 -32679 32256 4464.3 446430 -124 127 4.78 478 +880 100 10870 99781 2.64264 299.64264 151.14264 15114.26426 2.64264 299.64264 151.14263 15114.26399 2.64264 299.64264 151.14264 15114.264 2020-01-01 2020-01-02 2020-01-01 00:14:40 2020-01-02 03:43:01 2020-01-01 00:14:40.000 2020-01-02 03:43:01.000 880 99781 50330.5 5033050 880 99781 50330.5 5033050 -32688 32247 4455.3 445530 -127 124 0.9 90 +881 100 10871 99782 2.64564 299.64564 151.14564 15114.56456 2.64564 299.64566 151.14564 15114.56474 2.64564 299.64564 151.14564000000001 15114.564 2020-01-01 2020-01-02 2020-01-01 00:14:41 2020-01-02 03:43:02 2020-01-01 00:14:41.000 2020-01-02 03:43:02.000 881 99782 50331.5 5033150 881 99782 50331.5 5033150 -32687 32248 4456.3 445630 -126 125 1.9 190 +882 100 10872 99783 2.64864 299.64864 151.14864 15114.86486 2.64864 299.64865 151.14865 15114.86504 2.64864 299.64864 151.14864 15114.864 2020-01-01 2020-01-02 2020-01-01 00:14:42 2020-01-02 03:43:03 2020-01-01 00:14:42.000 2020-01-02 03:43:03.000 882 99783 50332.5 5033250 882 99783 50332.5 5033250 -32686 32249 4457.3 445730 -125 126 2.9 290 +883 100 10873 99784 2.65165 299.65165 151.15165 15115.16516 2.65165 299.65164 151.15165 15115.16522 2.65165 299.65165 151.15165000000002 15115.165 2020-01-01 2020-01-02 2020-01-01 00:14:43 2020-01-02 03:43:04 2020-01-01 00:14:43.000 2020-01-02 03:43:04.000 883 99784 50333.5 5033350 883 99784 50333.5 5033350 -32685 32250 4458.3 445830 -124 127 3.9 390 +884 100 10874 99785 2.65465 299.65465 151.15465 15115.46546 2.65465 299.65466 151.15465 15115.46532 2.65465 299.65465 151.15465 15115.465 2020-01-01 2020-01-02 2020-01-01 00:14:44 2020-01-02 03:43:05 2020-01-01 00:14:44.000 2020-01-02 03:43:05.000 884 99785 50334.5 5033450 884 99785 50334.5 5033450 -32684 32251 4459.3 445930 -128 127 2.34 234 +885 100 10875 99786 2.65765 299.65765 151.15765 15115.76576 2.65765 299.65765 151.15765 15115.76562 2.65765 299.65765 151.15765 15115.765 2020-01-01 2020-01-02 2020-01-01 00:14:45 2020-01-02 03:43:06 2020-01-01 00:14:45.000 2020-01-02 03:43:06.000 885 99786 50335.5 5033550 885 99786 50335.5 5033550 -32683 32252 4460.3 446030 -128 123 0.78 78 +886 100 10876 99787 2.66066 299.66066 151.16066 15116.06606 2.66066 299.66068 151.16066 15116.06621 2.66066 299.66066 151.16066 15116.066 2020-01-01 2020-01-02 2020-01-01 00:14:46 2020-01-02 03:43:07 2020-01-01 00:14:46.000 2020-01-02 03:43:07.000 886 99787 50336.5 5033650 886 99787 50336.5 5033650 -32682 32253 4461.3 446130 -127 124 1.78 178 +887 100 10877 99788 2.66366 299.66366 151.16366 15116.36636 2.66366 299.66367 151.16366 15116.36651 2.66366 299.66366 151.16366 15116.366 2020-01-01 2020-01-02 2020-01-01 00:14:47 2020-01-02 03:43:08 2020-01-01 00:14:47.000 2020-01-02 03:43:08.000 887 99788 50337.5 5033750 887 99788 50337.5 5033750 -32681 32254 4462.3 446230 -126 125 2.78 278 +888 100 10878 99789 2.66666 299.66666 151.16666 15116.66666 2.66666 299.66666 151.16666 15116.66669 2.66666 299.66666 151.16665999999998 15116.666 2020-01-01 2020-01-02 2020-01-01 00:14:48 2020-01-02 03:43:09 2020-01-01 00:14:48.000 2020-01-02 03:43:09.000 888 99789 50338.5 5033850 888 99789 50338.5 5033850 -32680 32255 4463.3 446330 -125 126 3.78 378 +889 100 10879 99790 2.66966 299.66966 151.16966 15116.96696 2.66966 299.66968 151.16966 15116.96679 2.66966 299.66966 151.16966 15116.966 2020-01-01 2020-01-02 2020-01-01 00:14:49 2020-01-02 03:43:10 2020-01-01 00:14:49.000 2020-01-02 03:43:10.000 889 99790 50339.5 5033950 889 99790 50339.5 5033950 -32679 32256 4464.3 446430 -124 127 4.78 478 89 102 10079 99989 0.26726 300.26726 150.26726 15176.99399 0.26726 300.26727 150.26727 15176.9943 0.26726 300.26726 150.26726 15176.99326 2020-01-01 2020-01-02 2020-01-01 00:01:29 2020-01-02 03:46:29 2020-01-01 00:01:29.000 2020-01-02 03:46:29.000 89 99989 50039 5053939 89 99989 50039 5053939 -32480 32455 4618.009900990099 466419 -125 126 -0.12871287128712872 -13 -890 100 10880 99791 2.67267 299.67267 151.17267 15117.26726 2.67267 299.67267 151.17267 15117.26708 2.67267 299.67267 151.17267 15117.26700 2020-01-01 2020-01-02 2020-01-01 00:14:50 2020-01-02 03:43:11 2020-01-01 00:14:50.000 2020-01-02 03:43:11.000 890 99791 50340.5 5034050 890 99791 50340.5 5034050 -32678 32257 4465.3 446530 -128 127 3.22 322 -891 100 10881 99792 2.67567 299.67567 151.17567 15117.56756 2.67567 299.6757 151.17567 15117.56768 2.67567 299.67567 151.17567 15117.56700 2020-01-01 2020-01-02 2020-01-01 00:14:51 2020-01-02 03:43:12 2020-01-01 00:14:51.000 2020-01-02 03:43:12.000 891 99792 50341.5 5034150 891 99792 50341.5 5034150 -32677 32258 4466.3 446630 -128 127 1.66 166 -892 100 10882 99793 2.67867 299.67867 151.17867 15117.86786 2.67867 299.67868 151.17868 15117.86802 2.67867 299.67867 151.17867 15117.86700 2020-01-01 2020-01-02 2020-01-01 00:14:52 2020-01-02 03:43:13 2020-01-01 00:14:52.000 2020-01-02 03:43:13.000 892 99793 50342.5 5034250 892 99793 50342.5 5034250 -32676 32259 4467.3 446730 -128 124 0.1 10 -893 100 10883 99794 2.68168 299.68168 151.18168 15118.16816 2.68168 299.68167 151.18168 15118.16816 2.68168 299.68168 151.18168 15118.16800 2020-01-01 2020-01-02 2020-01-01 00:14:53 2020-01-02 03:43:14 2020-01-01 00:14:53.000 2020-01-02 03:43:14.000 893 99794 50343.5 5034350 893 99794 50343.5 5034350 -32675 32260 4468.3 446830 -127 125 1.1 110 -894 100 10884 99795 2.68468 299.68468 151.18468 15118.46846 2.68468 299.6847 151.18468 15118.46826 2.68468 299.68468 151.18468000000001 15118.46800 2020-01-01 2020-01-02 2020-01-01 00:14:54 2020-01-02 03:43:15 2020-01-01 00:14:54.000 2020-01-02 03:43:15.000 894 99795 50344.5 5034450 894 99795 50344.5 5034450 -32674 32261 4469.3 446930 -126 126 2.1 210 -895 100 10885 99796 2.68768 299.68768 151.18768 15118.76876 2.68768 299.68768 151.18768 15118.76855 2.68768 299.68768 151.18768 15118.76800 2020-01-01 2020-01-02 2020-01-01 00:14:55 2020-01-02 03:43:16 2020-01-01 00:14:55.000 2020-01-02 03:43:16.000 895 99796 50345.5 5034550 895 99796 50345.5 5034550 -32673 32262 4470.3 447030 -125 127 3.1 310 -896 100 10886 99797 2.69069 299.69069 151.19069 15119.06906 2.69069 299.6907 151.19069 15119.06915 2.69069 299.69069 151.19069 15119.06900 2020-01-01 2020-01-02 2020-01-01 00:14:56 2020-01-02 03:43:17 2020-01-01 00:14:56.000 2020-01-02 03:43:17.000 896 99797 50346.5 5034650 896 99797 50346.5 5034650 -32672 32263 4471.3 447130 -128 127 1.54 154 -897 100 10887 99798 2.69369 299.69369 151.19369 15119.36936 2.69369 299.6937 151.19369 15119.36949 2.69369 299.69369 151.19369 15119.36900 2020-01-01 2020-01-02 2020-01-01 00:14:57 2020-01-02 03:43:18 2020-01-01 00:14:57.000 2020-01-02 03:43:18.000 897 99798 50347.5 5034750 897 99798 50347.5 5034750 -32671 32264 4472.3 447230 -128 127 -0.02 -2 -898 100 10888 99799 2.69669 299.69669 151.19669 15119.66966 2.69669 299.6967 151.19669 15119.66963 2.69669 299.69669 151.19669 15119.66900 2020-01-01 2020-01-02 2020-01-01 00:14:58 2020-01-02 03:43:19 2020-01-01 00:14:58.000 2020-01-02 03:43:19.000 898 99799 50348.5 5034850 898 99799 50348.5 5034850 -32670 32265 4473.3 447330 -128 123 -1.58 -158 -899 100 10889 99800 2.69969 299.69969 151.19969 15119.96996 2.69969 299.6997 151.1997 15119.97038 2.69969 299.69969 151.19969 15119.96900 2020-01-01 2020-01-02 2020-01-01 00:14:59 2020-01-02 03:43:20 2020-01-01 00:14:59.000 2020-01-02 03:43:20.000 899 99800 50349.5 5034950 899 99800 50349.5 5034950 -32669 32266 4474.3 447430 -127 124 -0.58 -58 +890 100 10880 99791 2.67267 299.67267 151.17267 15117.26726 2.67267 299.67267 151.17267 15117.26708 2.67267 299.67267 151.17267 15117.267 2020-01-01 2020-01-02 2020-01-01 00:14:50 2020-01-02 03:43:11 2020-01-01 00:14:50.000 2020-01-02 03:43:11.000 890 99791 50340.5 5034050 890 99791 50340.5 5034050 -32678 32257 4465.3 446530 -128 127 3.22 322 +891 100 10881 99792 2.67567 299.67567 151.17567 15117.56756 2.67567 299.6757 151.17567 15117.56768 2.67567 299.67567 151.17567 15117.567 2020-01-01 2020-01-02 2020-01-01 00:14:51 2020-01-02 03:43:12 2020-01-01 00:14:51.000 2020-01-02 03:43:12.000 891 99792 50341.5 5034150 891 99792 50341.5 5034150 -32677 32258 4466.3 446630 -128 127 1.66 166 +892 100 10882 99793 2.67867 299.67867 151.17867 15117.86786 2.67867 299.67868 151.17868 15117.86802 2.67867 299.67867 151.17867 15117.867 2020-01-01 2020-01-02 2020-01-01 00:14:52 2020-01-02 03:43:13 2020-01-01 00:14:52.000 2020-01-02 03:43:13.000 892 99793 50342.5 5034250 892 99793 50342.5 5034250 -32676 32259 4467.3 446730 -128 124 0.1 10 +893 100 10883 99794 2.68168 299.68168 151.18168 15118.16816 2.68168 299.68167 151.18168 15118.16816 2.68168 299.68168 151.18168 15118.168 2020-01-01 2020-01-02 2020-01-01 00:14:53 2020-01-02 03:43:14 2020-01-01 00:14:53.000 2020-01-02 03:43:14.000 893 99794 50343.5 5034350 893 99794 50343.5 5034350 -32675 32260 4468.3 446830 -127 125 1.1 110 +894 100 10884 99795 2.68468 299.68468 151.18468 15118.46846 2.68468 299.6847 151.18468 15118.46826 2.68468 299.68468 151.18468000000001 15118.468 2020-01-01 2020-01-02 2020-01-01 00:14:54 2020-01-02 03:43:15 2020-01-01 00:14:54.000 2020-01-02 03:43:15.000 894 99795 50344.5 5034450 894 99795 50344.5 5034450 -32674 32261 4469.3 446930 -126 126 2.1 210 +895 100 10885 99796 2.68768 299.68768 151.18768 15118.76876 2.68768 299.68768 151.18768 15118.76855 2.68768 299.68768 151.18768 15118.768 2020-01-01 2020-01-02 2020-01-01 00:14:55 2020-01-02 03:43:16 2020-01-01 00:14:55.000 2020-01-02 03:43:16.000 895 99796 50345.5 5034550 895 99796 50345.5 5034550 -32673 32262 4470.3 447030 -125 127 3.1 310 +896 100 10886 99797 2.69069 299.69069 151.19069 15119.06906 2.69069 299.6907 151.19069 15119.06915 2.69069 299.69069 151.19069 15119.069 2020-01-01 2020-01-02 2020-01-01 00:14:56 2020-01-02 03:43:17 2020-01-01 00:14:56.000 2020-01-02 03:43:17.000 896 99797 50346.5 5034650 896 99797 50346.5 5034650 -32672 32263 4471.3 447130 -128 127 1.54 154 +897 100 10887 99798 2.69369 299.69369 151.19369 15119.36936 2.69369 299.6937 151.19369 15119.36949 2.69369 299.69369 151.19369 15119.369 2020-01-01 2020-01-02 2020-01-01 00:14:57 2020-01-02 03:43:18 2020-01-01 00:14:57.000 2020-01-02 03:43:18.000 897 99798 50347.5 5034750 897 99798 50347.5 5034750 -32671 32264 4472.3 447230 -128 127 -0.02 -2 +898 100 10888 99799 2.69669 299.69669 151.19669 15119.66966 2.69669 299.6967 151.19669 15119.66963 2.69669 299.69669 151.19669 15119.669 2020-01-01 2020-01-02 2020-01-01 00:14:58 2020-01-02 03:43:19 2020-01-01 00:14:58.000 2020-01-02 03:43:19.000 898 99799 50348.5 5034850 898 99799 50348.5 5034850 -32670 32265 4473.3 447330 -128 123 -1.58 -158 +899 100 10889 99800 2.69969 299.69969 151.19969 15119.96996 2.69969 299.6997 151.1997 15119.97038 2.69969 299.69969 151.19969 15119.969 2020-01-01 2020-01-02 2020-01-01 00:14:59 2020-01-02 03:43:20 2020-01-01 00:14:59.000 2020-01-02 03:43:20.000 899 99800 50349.5 5034950 899 99800 50349.5 5034950 -32669 32266 4474.3 447430 -127 124 -0.58 -58 9 102 1008 9999 0.02702 300.02702 150.02702 15152.72972 0.02702 300.02704 150.02702 15152.72966 0.02702 300.02702 150.02702 15152.72902 2020-01-01 2020-01-02 2020-01-01 00:00:09 2020-01-02 03:45:09 2020-01-01 00:00:09.000 2020-01-02 03:45:09.000 9 99909 49959 5045859 9 99909 49959 5045859 -32560 32375 4538.009900990099 458339 -124 127 0.9801980198019802 99 90 102 10080 99990 0.27027 300.27027 150.27027 15177.29729 0.27027 300.27026 150.27026 15177.29694 0.27027 300.27027 150.27026999999998 15177.29727 2020-01-01 2020-01-02 2020-01-01 00:01:30 2020-01-02 03:46:30 2020-01-01 00:01:30.000 2020-01-02 03:46:30.000 90 99990 50040 5054040 90 99990 50040 5054040 -32479 32456 4619.009900990099 466520 -124 127 0.8712871287128713 88 -900 100 10890 99801 2.7027 299.7027 151.2027 15120.27027 2.7027 299.7027 151.2027 15120.27003 2.70270 299.70270 151.2027 15120.27000 2020-01-01 2020-01-02 2020-01-01 00:15:00 2020-01-02 03:43:21 2020-01-01 00:15:00.000 2020-01-02 03:43:21.000 900 99801 50350.5 5035050 900 99801 50350.5 5035050 -32668 32267 4475.3 447530 -126 125 0.42 42 -901 100 10891 99802 2.7057 299.7057 151.2057 15120.57057 2.7057 299.70572 151.2057 15120.57066 2.70570 299.70570 151.2057 15120.57000 2020-01-01 2020-01-02 2020-01-01 00:15:01 2020-01-02 03:43:22 2020-01-01 00:15:01.000 2020-01-02 03:43:22.000 901 99802 50351.5 5035150 901 99802 50351.5 5035150 -32667 32268 4476.3 447630 -125 126 1.42 142 -902 100 10892 99803 2.7087 299.7087 151.2087 15120.87087 2.7087 299.7087 151.2087 15120.87095 2.70870 299.70870 151.20870000000002 15120.87000 2020-01-01 2020-01-02 2020-01-01 00:15:02 2020-01-02 03:43:23 2020-01-01 00:15:02.000 2020-01-02 03:43:23.000 902 99803 50352.5 5035250 902 99803 50352.5 5035250 -32666 32269 4477.3 447730 -124 127 2.42 242 -903 100 10893 99804 2.71171 299.71171 151.21171 15121.17117 2.71171 299.7117 151.21171 15121.1711 2.71171 299.71171 151.21171 15121.17100 2020-01-01 2020-01-02 2020-01-01 00:15:03 2020-01-02 03:43:24 2020-01-01 00:15:03.000 2020-01-02 03:43:24.000 903 99804 50353.5 5035350 903 99804 50353.5 5035350 -32665 32270 4478.3 447830 -128 127 0.86 86 -904 100 10894 99805 2.71471 299.71471 151.21471 15121.47147 2.71471 299.71472 151.21471 15121.47185 2.71471 299.71471 151.21471 15121.47100 2020-01-01 2020-01-02 2020-01-01 00:15:04 2020-01-02 03:43:25 2020-01-01 00:15:04.000 2020-01-02 03:43:25.000 904 99805 50354.5 5035450 904 99805 50354.5 5035450 -32664 32271 4479.3 447930 -128 123 -0.7 -70 -905 100 10895 99806 2.71771 299.71771 151.21771 15121.77177 2.71771 299.7177 151.21771 15121.77149 2.71771 299.71771 151.21771 15121.77100 2020-01-01 2020-01-02 2020-01-01 00:15:05 2020-01-02 03:43:26 2020-01-01 00:15:05.000 2020-01-02 03:43:26.000 905 99806 50355.5 5035550 905 99806 50355.5 5035550 -32663 32272 4480.3 448030 -127 124 0.3 30 -906 100 10896 99807 2.72072 299.72072 151.22072 15122.07207 2.72072 299.72073 151.22072 15122.07212 2.72072 299.72072 151.22072 15122.07200 2020-01-01 2020-01-02 2020-01-01 00:15:06 2020-01-02 03:43:27 2020-01-01 00:15:06.000 2020-01-02 03:43:27.000 906 99807 50356.5 5035650 906 99807 50356.5 5035650 -32662 32273 4481.3 448130 -126 125 1.3 130 -907 100 10897 99808 2.72372 299.72372 151.22372 15122.37237 2.72372 299.72372 151.22372 15122.37243 2.72372 299.72372 151.22372 15122.37200 2020-01-01 2020-01-02 2020-01-01 00:15:07 2020-01-02 03:43:28 2020-01-01 00:15:07.000 2020-01-02 03:43:28.000 907 99808 50357.5 5035750 907 99808 50357.5 5035750 -32661 32274 4482.3 448230 -125 126 2.3 230 -908 100 10898 99809 2.72672 299.72672 151.22672 15122.67267 2.72672 299.7267 151.22672 15122.67272 2.72672 299.72672 151.22672 15122.67200 2020-01-01 2020-01-02 2020-01-01 00:15:08 2020-01-02 03:43:29 2020-01-01 00:15:08.000 2020-01-02 03:43:29.000 908 99809 50358.5 5035850 908 99809 50358.5 5035850 -32660 32275 4483.3 448330 -124 127 3.3 330 -909 100 10899 99810 2.72972 299.72972 151.22972 15122.97297 2.72972 299.72974 151.22973 15122.97332 2.72972 299.72972 151.22972 15122.97200 2020-01-01 2020-01-02 2020-01-01 00:15:09 2020-01-02 03:43:30 2020-01-01 00:15:09.000 2020-01-02 03:43:30.000 909 99810 50359.5 5035950 909 99810 50359.5 5035950 -32659 32276 4484.3 448430 -128 127 1.74 174 +900 100 10890 99801 2.7027 299.7027 151.2027 15120.27027 2.7027 299.7027 151.2027 15120.27003 2.7027 299.7027 151.2027 15120.27 2020-01-01 2020-01-02 2020-01-01 00:15:00 2020-01-02 03:43:21 2020-01-01 00:15:00.000 2020-01-02 03:43:21.000 900 99801 50350.5 5035050 900 99801 50350.5 5035050 -32668 32267 4475.3 447530 -126 125 0.42 42 +901 100 10891 99802 2.7057 299.7057 151.2057 15120.57057 2.7057 299.70572 151.2057 15120.57066 2.7057 299.7057 151.2057 15120.57 2020-01-01 2020-01-02 2020-01-01 00:15:01 2020-01-02 03:43:22 2020-01-01 00:15:01.000 2020-01-02 03:43:22.000 901 99802 50351.5 5035150 901 99802 50351.5 5035150 -32667 32268 4476.3 447630 -125 126 1.42 142 +902 100 10892 99803 2.7087 299.7087 151.2087 15120.87087 2.7087 299.7087 151.2087 15120.87095 2.7087 299.7087 151.20870000000002 15120.87 2020-01-01 2020-01-02 2020-01-01 00:15:02 2020-01-02 03:43:23 2020-01-01 00:15:02.000 2020-01-02 03:43:23.000 902 99803 50352.5 5035250 902 99803 50352.5 5035250 -32666 32269 4477.3 447730 -124 127 2.42 242 +903 100 10893 99804 2.71171 299.71171 151.21171 15121.17117 2.71171 299.7117 151.21171 15121.1711 2.71171 299.71171 151.21171 15121.171 2020-01-01 2020-01-02 2020-01-01 00:15:03 2020-01-02 03:43:24 2020-01-01 00:15:03.000 2020-01-02 03:43:24.000 903 99804 50353.5 5035350 903 99804 50353.5 5035350 -32665 32270 4478.3 447830 -128 127 0.86 86 +904 100 10894 99805 2.71471 299.71471 151.21471 15121.47147 2.71471 299.71472 151.21471 15121.47185 2.71471 299.71471 151.21471 15121.471 2020-01-01 2020-01-02 2020-01-01 00:15:04 2020-01-02 03:43:25 2020-01-01 00:15:04.000 2020-01-02 03:43:25.000 904 99805 50354.5 5035450 904 99805 50354.5 5035450 -32664 32271 4479.3 447930 -128 123 -0.7 -70 +905 100 10895 99806 2.71771 299.71771 151.21771 15121.77177 2.71771 299.7177 151.21771 15121.77149 2.71771 299.71771 151.21771 15121.771 2020-01-01 2020-01-02 2020-01-01 00:15:05 2020-01-02 03:43:26 2020-01-01 00:15:05.000 2020-01-02 03:43:26.000 905 99806 50355.5 5035550 905 99806 50355.5 5035550 -32663 32272 4480.3 448030 -127 124 0.3 30 +906 100 10896 99807 2.72072 299.72072 151.22072 15122.07207 2.72072 299.72073 151.22072 15122.07212 2.72072 299.72072 151.22072 15122.072 2020-01-01 2020-01-02 2020-01-01 00:15:06 2020-01-02 03:43:27 2020-01-01 00:15:06.000 2020-01-02 03:43:27.000 906 99807 50356.5 5035650 906 99807 50356.5 5035650 -32662 32273 4481.3 448130 -126 125 1.3 130 +907 100 10897 99808 2.72372 299.72372 151.22372 15122.37237 2.72372 299.72372 151.22372 15122.37243 2.72372 299.72372 151.22372 15122.372 2020-01-01 2020-01-02 2020-01-01 00:15:07 2020-01-02 03:43:28 2020-01-01 00:15:07.000 2020-01-02 03:43:28.000 907 99808 50357.5 5035750 907 99808 50357.5 5035750 -32661 32274 4482.3 448230 -125 126 2.3 230 +908 100 10898 99809 2.72672 299.72672 151.22672 15122.67267 2.72672 299.7267 151.22672 15122.67272 2.72672 299.72672 151.22672 15122.672 2020-01-01 2020-01-02 2020-01-01 00:15:08 2020-01-02 03:43:29 2020-01-01 00:15:08.000 2020-01-02 03:43:29.000 908 99809 50358.5 5035850 908 99809 50358.5 5035850 -32660 32275 4483.3 448330 -124 127 3.3 330 +909 100 10899 99810 2.72972 299.72972 151.22972 15122.97297 2.72972 299.72974 151.22973 15122.97332 2.72972 299.72972 151.22972 15122.972 2020-01-01 2020-01-02 2020-01-01 00:15:09 2020-01-02 03:43:30 2020-01-01 00:15:09.000 2020-01-02 03:43:30.000 909 99810 50359.5 5035950 909 99810 50359.5 5035950 -32659 32276 4484.3 448430 -128 127 1.74 174 91 102 10081 99991 0.27327 300.27327 150.27327 15177.6006 0.27327 300.2733 150.27327 15177.60054 0.27327 300.27327 150.27327 15177.60027 2020-01-01 2020-01-02 2020-01-01 00:01:31 2020-01-02 03:46:31 2020-01-01 00:01:31.000 2020-01-02 03:46:31.000 91 99991 50041 5054141 91 99991 50041 5054141 -32478 32457 4620.009900990099 466621 -128 127 -0.6633663366336634 -67 -910 100 10900 99811 2.73273 299.73273 151.23273 15123.27327 2.73273 299.73273 151.23272 15123.27296 2.73273 299.73273 151.23273 15123.27300 2020-01-01 2020-01-02 2020-01-01 00:15:10 2020-01-02 03:43:31 2020-01-01 00:15:10.000 2020-01-02 03:43:31.000 910 99811 50360.5 5036050 910 99811 50360.5 5036050 -32658 32277 4485.3 448530 -128 123 0.18 18 -911 100 10901 99812 2.73573 299.73573 151.23573 15123.57357 2.73573 299.73575 151.23573 15123.57359 2.73573 299.73573 151.23573 15123.57300 2020-01-01 2020-01-02 2020-01-01 00:15:11 2020-01-02 03:43:32 2020-01-01 00:15:11.000 2020-01-02 03:43:32.000 911 99812 50361.5 5036150 911 99812 50361.5 5036150 -32657 32278 4486.3 448630 -127 124 1.18 118 -912 100 10902 99813 2.73873 299.73873 151.23873 15123.87387 2.73873 299.73874 151.23873 15123.8739 2.73873 299.73873 151.23873 15123.87300 2020-01-01 2020-01-02 2020-01-01 00:15:12 2020-01-02 03:43:33 2020-01-01 00:15:12.000 2020-01-02 03:43:33.000 912 99813 50362.5 5036250 912 99813 50362.5 5036250 -32656 32279 4487.3 448730 -126 125 2.18 218 -913 100 10903 99814 2.74174 299.74174 151.24174 15124.17417 2.74174 299.74173 151.24174 15124.17419 2.74174 299.74174 151.24174000000002 15124.17400 2020-01-01 2020-01-02 2020-01-01 00:15:13 2020-01-02 03:43:34 2020-01-01 00:15:13.000 2020-01-02 03:43:34.000 913 99814 50363.5 5036350 913 99814 50363.5 5036350 -32655 32280 4488.3 448830 -125 126 3.18 318 -914 100 10904 99815 2.74474 299.74474 151.24474 15124.47447 2.74474 299.74475 151.24474 15124.47479 2.74474 299.74474 151.24474 15124.47400 2020-01-01 2020-01-02 2020-01-01 00:15:14 2020-01-02 03:43:35 2020-01-01 00:15:14.000 2020-01-02 03:43:35.000 914 99815 50364.5 5036450 914 99815 50364.5 5036450 -32654 32281 4489.3 448930 -124 127 4.18 418 -915 100 10905 99816 2.74774 299.74774 151.24774 15124.77477 2.74774 299.74774 151.24774 15124.77447 2.74774 299.74774 151.24774 15124.77400 2020-01-01 2020-01-02 2020-01-01 00:15:15 2020-01-02 03:43:36 2020-01-01 00:15:15.000 2020-01-02 03:43:36.000 915 99816 50365.5 5036550 915 99816 50365.5 5036550 -32653 32282 4490.3 449030 -128 127 2.62 262 -916 100 10906 99817 2.75075 299.75075 151.25075 15125.07507 2.75075 299.75076 151.25075 15125.07507 2.75075 299.75075 151.25075 15125.07500 2020-01-01 2020-01-02 2020-01-01 00:15:16 2020-01-02 03:43:37 2020-01-01 00:15:16.000 2020-01-02 03:43:37.000 916 99817 50366.5 5036650 916 99817 50366.5 5036650 -32652 32283 4491.3 449130 -128 127 1.06 106 -917 100 10907 99818 2.75375 299.75375 151.25375 15125.37537 2.75375 299.75375 151.25375 15125.37536 2.75375 299.75375 151.25375 15125.37500 2020-01-01 2020-01-02 2020-01-01 00:15:17 2020-01-02 03:43:38 2020-01-01 00:15:17.000 2020-01-02 03:43:38.000 917 99818 50367.5 5036750 917 99818 50367.5 5036750 -32651 32284 4492.3 449230 -128 124 -0.5 -50 -918 100 10908 99819 2.75675 299.75675 151.25675 15125.67567 2.75675 299.75674 151.25675 15125.67566 2.75675 299.75675 151.25674999999998 15125.67500 2020-01-01 2020-01-02 2020-01-01 00:15:18 2020-01-02 03:43:39 2020-01-01 00:15:18.000 2020-01-02 03:43:39.000 918 99819 50368.5 5036850 918 99819 50368.5 5036850 -32650 32285 4493.3 449330 -127 125 0.5 50 -919 100 10909 99820 2.75975 299.75975 151.25975 15125.97597 2.75975 299.75977 151.25976 15125.97626 2.75975 299.75975 151.25975 15125.97500 2020-01-01 2020-01-02 2020-01-01 00:15:19 2020-01-02 03:43:40 2020-01-01 00:15:19.000 2020-01-02 03:43:40.000 919 99820 50369.5 5036950 919 99820 50369.5 5036950 -32649 32286 4494.3 449430 -126 126 1.5 150 +910 100 10900 99811 2.73273 299.73273 151.23273 15123.27327 2.73273 299.73273 151.23272 15123.27296 2.73273 299.73273 151.23273 15123.273 2020-01-01 2020-01-02 2020-01-01 00:15:10 2020-01-02 03:43:31 2020-01-01 00:15:10.000 2020-01-02 03:43:31.000 910 99811 50360.5 5036050 910 99811 50360.5 5036050 -32658 32277 4485.3 448530 -128 123 0.18 18 +911 100 10901 99812 2.73573 299.73573 151.23573 15123.57357 2.73573 299.73575 151.23573 15123.57359 2.73573 299.73573 151.23573 15123.573 2020-01-01 2020-01-02 2020-01-01 00:15:11 2020-01-02 03:43:32 2020-01-01 00:15:11.000 2020-01-02 03:43:32.000 911 99812 50361.5 5036150 911 99812 50361.5 5036150 -32657 32278 4486.3 448630 -127 124 1.18 118 +912 100 10902 99813 2.73873 299.73873 151.23873 15123.87387 2.73873 299.73874 151.23873 15123.8739 2.73873 299.73873 151.23873 15123.873 2020-01-01 2020-01-02 2020-01-01 00:15:12 2020-01-02 03:43:33 2020-01-01 00:15:12.000 2020-01-02 03:43:33.000 912 99813 50362.5 5036250 912 99813 50362.5 5036250 -32656 32279 4487.3 448730 -126 125 2.18 218 +913 100 10903 99814 2.74174 299.74174 151.24174 15124.17417 2.74174 299.74173 151.24174 15124.17419 2.74174 299.74174 151.24174000000002 15124.174 2020-01-01 2020-01-02 2020-01-01 00:15:13 2020-01-02 03:43:34 2020-01-01 00:15:13.000 2020-01-02 03:43:34.000 913 99814 50363.5 5036350 913 99814 50363.5 5036350 -32655 32280 4488.3 448830 -125 126 3.18 318 +914 100 10904 99815 2.74474 299.74474 151.24474 15124.47447 2.74474 299.74475 151.24474 15124.47479 2.74474 299.74474 151.24474 15124.474 2020-01-01 2020-01-02 2020-01-01 00:15:14 2020-01-02 03:43:35 2020-01-01 00:15:14.000 2020-01-02 03:43:35.000 914 99815 50364.5 5036450 914 99815 50364.5 5036450 -32654 32281 4489.3 448930 -124 127 4.18 418 +915 100 10905 99816 2.74774 299.74774 151.24774 15124.77477 2.74774 299.74774 151.24774 15124.77447 2.74774 299.74774 151.24774 15124.774 2020-01-01 2020-01-02 2020-01-01 00:15:15 2020-01-02 03:43:36 2020-01-01 00:15:15.000 2020-01-02 03:43:36.000 915 99816 50365.5 5036550 915 99816 50365.5 5036550 -32653 32282 4490.3 449030 -128 127 2.62 262 +916 100 10906 99817 2.75075 299.75075 151.25075 15125.07507 2.75075 299.75076 151.25075 15125.07507 2.75075 299.75075 151.25075 15125.075 2020-01-01 2020-01-02 2020-01-01 00:15:16 2020-01-02 03:43:37 2020-01-01 00:15:16.000 2020-01-02 03:43:37.000 916 99817 50366.5 5036650 916 99817 50366.5 5036650 -32652 32283 4491.3 449130 -128 127 1.06 106 +917 100 10907 99818 2.75375 299.75375 151.25375 15125.37537 2.75375 299.75375 151.25375 15125.37536 2.75375 299.75375 151.25375 15125.375 2020-01-01 2020-01-02 2020-01-01 00:15:17 2020-01-02 03:43:38 2020-01-01 00:15:17.000 2020-01-02 03:43:38.000 917 99818 50367.5 5036750 917 99818 50367.5 5036750 -32651 32284 4492.3 449230 -128 124 -0.5 -50 +918 100 10908 99819 2.75675 299.75675 151.25675 15125.67567 2.75675 299.75674 151.25675 15125.67566 2.75675 299.75675 151.25674999999998 15125.675 2020-01-01 2020-01-02 2020-01-01 00:15:18 2020-01-02 03:43:39 2020-01-01 00:15:18.000 2020-01-02 03:43:39.000 918 99819 50368.5 5036850 918 99819 50368.5 5036850 -32650 32285 4493.3 449330 -127 125 0.5 50 +919 100 10909 99820 2.75975 299.75975 151.25975 15125.97597 2.75975 299.75977 151.25976 15125.97626 2.75975 299.75975 151.25975 15125.975 2020-01-01 2020-01-02 2020-01-01 00:15:19 2020-01-02 03:43:40 2020-01-01 00:15:19.000 2020-01-02 03:43:40.000 919 99820 50369.5 5036950 919 99820 50369.5 5036950 -32649 32286 4494.3 449430 -126 126 1.5 150 92 102 10082 99992 0.27627 300.27627 150.27627 15177.9039 0.27627 300.27628 150.27627 15177.90384 0.27627 300.27627 150.27627 15177.90327 2020-01-01 2020-01-02 2020-01-01 00:01:32 2020-01-02 03:46:32 2020-01-01 00:01:32.000 2020-01-02 03:46:32.000 92 99992 50042 5054242 92 99992 50042 5054242 -32477 32458 4621.009900990099 466722 -128 123 -2.198019801980198 -222 -920 100 10910 99821 2.76276 299.76276 151.26276 15126.27627 2.76276 299.76276 151.26275 15126.27594 2.76276 299.76276 151.26276 15126.27600 2020-01-01 2020-01-02 2020-01-01 00:15:20 2020-01-02 03:43:41 2020-01-01 00:15:20.000 2020-01-02 03:43:41.000 920 99821 50370.5 5037050 920 99821 50370.5 5037050 -32648 32287 4495.3 449530 -125 127 2.5 250 -921 100 10911 99822 2.76576 299.76576 151.26576 15126.57657 2.76576 299.76578 151.26576 15126.57654 2.76576 299.76576 151.26576 15126.57600 2020-01-01 2020-01-02 2020-01-01 00:15:21 2020-01-02 03:43:42 2020-01-01 00:15:21.000 2020-01-02 03:43:42.000 921 99822 50371.5 5037150 921 99822 50371.5 5037150 -32647 32288 4496.3 449630 -128 127 0.94 94 -922 100 10912 99823 2.76876 299.76876 151.26876 15126.87687 2.76876 299.76877 151.26876 15126.87683 2.76876 299.76876 151.26876000000001 15126.87600 2020-01-01 2020-01-02 2020-01-01 00:15:22 2020-01-02 03:43:43 2020-01-01 00:15:22.000 2020-01-02 03:43:43.000 922 99823 50372.5 5037250 922 99823 50372.5 5037250 -32646 32289 4497.3 449730 -128 127 -0.62 -62 -923 100 10913 99824 2.77177 299.77177 151.27177 15127.17717 2.77177 299.77176 151.27177 15127.17713 2.77177 299.77177 151.27177 15127.17700 2020-01-01 2020-01-02 2020-01-01 00:15:23 2020-01-02 03:43:44 2020-01-01 00:15:23.000 2020-01-02 03:43:44.000 923 99824 50373.5 5037350 923 99824 50373.5 5037350 -32645 32290 4498.3 449830 -128 123 -2.18 -218 -924 100 10914 99825 2.77477 299.77477 151.27477 15127.47747 2.77477 299.77478 151.27477 15127.47776 2.77477 299.77477 151.27477000000002 15127.47700 2020-01-01 2020-01-02 2020-01-01 00:15:24 2020-01-02 03:43:45 2020-01-01 00:15:24.000 2020-01-02 03:43:45.000 924 99825 50374.5 5037450 924 99825 50374.5 5037450 -32644 32291 4499.3 449930 -127 124 -1.18 -118 -925 100 10915 99826 2.77777 299.77777 151.27777 15127.77777 2.77777 299.77777 151.27777 15127.77741 2.77777 299.77777 151.27777 15127.77700 2020-01-01 2020-01-02 2020-01-01 00:15:25 2020-01-02 03:43:46 2020-01-01 00:15:25.000 2020-01-02 03:43:46.000 925 99826 50375.5 5037550 925 99826 50375.5 5037550 -32643 32292 4500.3 450030 -126 125 -0.18 -18 -926 100 10916 99827 2.78078 299.78078 151.28078 15128.07807 2.78078 299.7808 151.28078 15128.078 2.78078 299.78078 151.28078 15128.07800 2020-01-01 2020-01-02 2020-01-01 00:15:26 2020-01-02 03:43:47 2020-01-01 00:15:26.000 2020-01-02 03:43:47.000 926 99827 50376.5 5037650 926 99827 50376.5 5037650 -32642 32293 4501.3 450130 -125 126 0.82 82 -927 100 10917 99828 2.78378 299.78378 151.28378 15128.37837 2.78378 299.78378 151.28378 15128.3783 2.78378 299.78378 151.28378 15128.37800 2020-01-01 2020-01-02 2020-01-01 00:15:27 2020-01-02 03:43:48 2020-01-01 00:15:27.000 2020-01-02 03:43:48.000 927 99828 50377.5 5037750 927 99828 50377.5 5037750 -32641 32294 4502.3 450230 -124 127 1.82 182 -928 100 10918 99829 2.78678 299.78678 151.28678 15128.67867 2.78678 299.78677 151.28678 15128.6786 2.78678 299.78678 151.28678 15128.67800 2020-01-01 2020-01-02 2020-01-01 00:15:28 2020-01-02 03:43:49 2020-01-01 00:15:28.000 2020-01-02 03:43:49.000 928 99829 50378.5 5037850 928 99829 50378.5 5037850 -32640 32295 4503.3 450330 -128 127 0.26 26 -929 100 10919 99830 2.78978 299.78978 151.28978 15128.97897 2.78978 299.7898 151.28979 15128.97923 2.78978 299.78978 151.28977999999998 15128.97800 2020-01-01 2020-01-02 2020-01-01 00:15:29 2020-01-02 03:43:50 2020-01-01 00:15:29.000 2020-01-02 03:43:50.000 929 99830 50379.5 5037950 929 99830 50379.5 5037950 -32639 32296 4504.3 450430 -128 123 -1.3 -130 +920 100 10910 99821 2.76276 299.76276 151.26276 15126.27627 2.76276 299.76276 151.26275 15126.27594 2.76276 299.76276 151.26276 15126.276 2020-01-01 2020-01-02 2020-01-01 00:15:20 2020-01-02 03:43:41 2020-01-01 00:15:20.000 2020-01-02 03:43:41.000 920 99821 50370.5 5037050 920 99821 50370.5 5037050 -32648 32287 4495.3 449530 -125 127 2.5 250 +921 100 10911 99822 2.76576 299.76576 151.26576 15126.57657 2.76576 299.76578 151.26576 15126.57654 2.76576 299.76576 151.26576 15126.576 2020-01-01 2020-01-02 2020-01-01 00:15:21 2020-01-02 03:43:42 2020-01-01 00:15:21.000 2020-01-02 03:43:42.000 921 99822 50371.5 5037150 921 99822 50371.5 5037150 -32647 32288 4496.3 449630 -128 127 0.94 94 +922 100 10912 99823 2.76876 299.76876 151.26876 15126.87687 2.76876 299.76877 151.26876 15126.87683 2.76876 299.76876 151.26876000000001 15126.876 2020-01-01 2020-01-02 2020-01-01 00:15:22 2020-01-02 03:43:43 2020-01-01 00:15:22.000 2020-01-02 03:43:43.000 922 99823 50372.5 5037250 922 99823 50372.5 5037250 -32646 32289 4497.3 449730 -128 127 -0.62 -62 +923 100 10913 99824 2.77177 299.77177 151.27177 15127.17717 2.77177 299.77176 151.27177 15127.17713 2.77177 299.77177 151.27177 15127.177 2020-01-01 2020-01-02 2020-01-01 00:15:23 2020-01-02 03:43:44 2020-01-01 00:15:23.000 2020-01-02 03:43:44.000 923 99824 50373.5 5037350 923 99824 50373.5 5037350 -32645 32290 4498.3 449830 -128 123 -2.18 -218 +924 100 10914 99825 2.77477 299.77477 151.27477 15127.47747 2.77477 299.77478 151.27477 15127.47776 2.77477 299.77477 151.27477000000002 15127.477 2020-01-01 2020-01-02 2020-01-01 00:15:24 2020-01-02 03:43:45 2020-01-01 00:15:24.000 2020-01-02 03:43:45.000 924 99825 50374.5 5037450 924 99825 50374.5 5037450 -32644 32291 4499.3 449930 -127 124 -1.18 -118 +925 100 10915 99826 2.77777 299.77777 151.27777 15127.77777 2.77777 299.77777 151.27777 15127.77741 2.77777 299.77777 151.27777 15127.777 2020-01-01 2020-01-02 2020-01-01 00:15:25 2020-01-02 03:43:46 2020-01-01 00:15:25.000 2020-01-02 03:43:46.000 925 99826 50375.5 5037550 925 99826 50375.5 5037550 -32643 32292 4500.3 450030 -126 125 -0.18 -18 +926 100 10916 99827 2.78078 299.78078 151.28078 15128.07807 2.78078 299.7808 151.28078 15128.078 2.78078 299.78078 151.28078 15128.078 2020-01-01 2020-01-02 2020-01-01 00:15:26 2020-01-02 03:43:47 2020-01-01 00:15:26.000 2020-01-02 03:43:47.000 926 99827 50376.5 5037650 926 99827 50376.5 5037650 -32642 32293 4501.3 450130 -125 126 0.82 82 +927 100 10917 99828 2.78378 299.78378 151.28378 15128.37837 2.78378 299.78378 151.28378 15128.3783 2.78378 299.78378 151.28378 15128.378 2020-01-01 2020-01-02 2020-01-01 00:15:27 2020-01-02 03:43:48 2020-01-01 00:15:27.000 2020-01-02 03:43:48.000 927 99828 50377.5 5037750 927 99828 50377.5 5037750 -32641 32294 4502.3 450230 -124 127 1.82 182 +928 100 10918 99829 2.78678 299.78678 151.28678 15128.67867 2.78678 299.78677 151.28678 15128.6786 2.78678 299.78678 151.28678 15128.678 2020-01-01 2020-01-02 2020-01-01 00:15:28 2020-01-02 03:43:49 2020-01-01 00:15:28.000 2020-01-02 03:43:49.000 928 99829 50378.5 5037850 928 99829 50378.5 5037850 -32640 32295 4503.3 450330 -128 127 0.26 26 +929 100 10919 99830 2.78978 299.78978 151.28978 15128.97897 2.78978 299.7898 151.28979 15128.97923 2.78978 299.78978 151.28977999999998 15128.978 2020-01-01 2020-01-02 2020-01-01 00:15:29 2020-01-02 03:43:50 2020-01-01 00:15:29.000 2020-01-02 03:43:50.000 929 99830 50379.5 5037950 929 99830 50379.5 5037950 -32639 32296 4504.3 450430 -128 123 -1.3 -130 93 102 10083 99993 0.27927 300.27927 150.27927 15178.2072 0.27927 300.27927 150.27927 15178.20715 0.27927 300.27927 150.27927 15178.20627 2020-01-01 2020-01-02 2020-01-01 00:01:33 2020-01-02 03:46:33 2020-01-01 00:01:33.000 2020-01-02 03:46:33.000 93 99993 50043 5054343 93 99993 50043 5054343 -32476 32459 4622.009900990099 466823 -127 124 -1.198019801980198 -121 -930 100 10920 99831 2.79279 299.79279 151.29279 15129.27927 2.79279 299.7928 151.29278 15129.27888 2.79279 299.79279 151.29279 15129.27900 2020-01-01 2020-01-02 2020-01-01 00:15:30 2020-01-02 03:43:51 2020-01-01 00:15:30.000 2020-01-02 03:43:51.000 930 99831 50380.5 5038050 930 99831 50380.5 5038050 -32638 32297 4505.3 450530 -127 124 -0.3 -30 -931 100 10921 99832 2.79579 299.79579 151.29579 15129.57957 2.79579 299.7958 151.29579 15129.57963 2.79579 299.79579 151.29579 15129.57900 2020-01-01 2020-01-02 2020-01-01 00:15:31 2020-01-02 03:43:52 2020-01-01 00:15:31.000 2020-01-02 03:43:52.000 931 99832 50381.5 5038150 931 99832 50381.5 5038150 -32637 32298 4506.3 450630 -126 125 0.7 70 -932 100 10922 99833 2.79879 299.79879 151.29879 15129.87987 2.79879 299.7988 151.29879 15129.87977 2.79879 299.79879 151.29879 15129.87900 2020-01-01 2020-01-02 2020-01-01 00:15:32 2020-01-02 03:43:53 2020-01-01 00:15:32.000 2020-01-02 03:43:53.000 932 99833 50382.5 5038250 932 99833 50382.5 5038250 -32636 32299 4507.3 450730 -125 126 1.7 170 -933 100 10923 99834 2.8018 299.8018 151.3018 15130.18018 2.8018 299.8018 151.3018 15130.18011 2.80180 299.80180 151.30180000000001 15130.18000 2020-01-01 2020-01-02 2020-01-01 00:15:33 2020-01-02 03:43:54 2020-01-01 00:15:33.000 2020-01-02 03:43:54.000 933 99834 50383.5 5038350 933 99834 50383.5 5038350 -32635 32300 4508.3 450830 -124 127 2.7 270 -934 100 10924 99835 2.8048 299.8048 151.3048 15130.48048 2.8048 299.8048 151.3048 15130.48071 2.80480 299.80480 151.3048 15130.48000 2020-01-01 2020-01-02 2020-01-01 00:15:34 2020-01-02 03:43:55 2020-01-01 00:15:34.000 2020-01-02 03:43:55.000 934 99835 50384.5 5038450 934 99835 50384.5 5038450 -32634 32301 4509.3 450930 -128 127 1.14 114 -935 100 10925 99836 2.8078 299.8078 151.3078 15130.78078 2.8078 299.8078 151.3078 15130.78034 2.80780 299.80780 151.30780000000001 15130.78000 2020-01-01 2020-01-02 2020-01-01 00:15:35 2020-01-02 03:43:56 2020-01-01 00:15:35.000 2020-01-02 03:43:56.000 935 99836 50385.5 5038550 935 99836 50385.5 5038550 -32633 32302 4510.3 451030 -128 123 -0.42 -42 -936 100 10926 99837 2.81081 299.81081 151.31081 15131.08108 2.81081 299.81082 151.31081 15131.0811 2.81081 299.81081 151.31081 15131.08100 2020-01-01 2020-01-02 2020-01-01 00:15:36 2020-01-02 03:43:57 2020-01-01 00:15:36.000 2020-01-02 03:43:57.000 936 99837 50386.5 5038650 936 99837 50386.5 5038650 -32632 32303 4511.3 451130 -127 124 0.58 58 -937 100 10927 99838 2.81381 299.81381 151.31381 15131.38138 2.81381 299.8138 151.31381 15131.38124 2.81381 299.81381 151.31381 15131.38100 2020-01-01 2020-01-02 2020-01-01 00:15:37 2020-01-02 03:43:58 2020-01-01 00:15:37.000 2020-01-02 03:43:58.000 937 99838 50387.5 5038750 937 99838 50387.5 5038750 -32631 32304 4512.3 451230 -126 125 1.58 158 -938 100 10928 99839 2.81681 299.81681 151.31681 15131.68168 2.81681 299.8168 151.31681 15131.68157 2.81681 299.81681 151.31681 15131.68100 2020-01-01 2020-01-02 2020-01-01 00:15:38 2020-01-02 03:43:59 2020-01-01 00:15:38.000 2020-01-02 03:43:59.000 938 99839 50388.5 5038850 938 99839 50388.5 5038850 -32630 32305 4513.3 451330 -125 126 2.58 258 -939 100 10929 99840 2.81981 299.81981 151.31981 15131.98198 2.81982 299.81982 151.31982 15131.98217 2.81981 299.81981 151.31981 15131.98100 2020-01-01 2020-01-02 2020-01-01 00:15:39 2020-01-02 03:44:00 2020-01-01 00:15:39.000 2020-01-02 03:44:00.000 939 99840 50389.5 5038950 939 99840 50389.5 5038950 -32629 32306 4514.3 451430 -124 127 3.58 358 +930 100 10920 99831 2.79279 299.79279 151.29279 15129.27927 2.79279 299.7928 151.29278 15129.27888 2.79279 299.79279 151.29279 15129.279 2020-01-01 2020-01-02 2020-01-01 00:15:30 2020-01-02 03:43:51 2020-01-01 00:15:30.000 2020-01-02 03:43:51.000 930 99831 50380.5 5038050 930 99831 50380.5 5038050 -32638 32297 4505.3 450530 -127 124 -0.3 -30 +931 100 10921 99832 2.79579 299.79579 151.29579 15129.57957 2.79579 299.7958 151.29579 15129.57963 2.79579 299.79579 151.29579 15129.579 2020-01-01 2020-01-02 2020-01-01 00:15:31 2020-01-02 03:43:52 2020-01-01 00:15:31.000 2020-01-02 03:43:52.000 931 99832 50381.5 5038150 931 99832 50381.5 5038150 -32637 32298 4506.3 450630 -126 125 0.7 70 +932 100 10922 99833 2.79879 299.79879 151.29879 15129.87987 2.79879 299.7988 151.29879 15129.87977 2.79879 299.79879 151.29879 15129.879 2020-01-01 2020-01-02 2020-01-01 00:15:32 2020-01-02 03:43:53 2020-01-01 00:15:32.000 2020-01-02 03:43:53.000 932 99833 50382.5 5038250 932 99833 50382.5 5038250 -32636 32299 4507.3 450730 -125 126 1.7 170 +933 100 10923 99834 2.8018 299.8018 151.3018 15130.18018 2.8018 299.8018 151.3018 15130.18011 2.8018 299.8018 151.30180000000001 15130.18 2020-01-01 2020-01-02 2020-01-01 00:15:33 2020-01-02 03:43:54 2020-01-01 00:15:33.000 2020-01-02 03:43:54.000 933 99834 50383.5 5038350 933 99834 50383.5 5038350 -32635 32300 4508.3 450830 -124 127 2.7 270 +934 100 10924 99835 2.8048 299.8048 151.3048 15130.48048 2.8048 299.8048 151.3048 15130.48071 2.8048 299.8048 151.3048 15130.48 2020-01-01 2020-01-02 2020-01-01 00:15:34 2020-01-02 03:43:55 2020-01-01 00:15:34.000 2020-01-02 03:43:55.000 934 99835 50384.5 5038450 934 99835 50384.5 5038450 -32634 32301 4509.3 450930 -128 127 1.14 114 +935 100 10925 99836 2.8078 299.8078 151.3078 15130.78078 2.8078 299.8078 151.3078 15130.78034 2.8078 299.8078 151.30780000000001 15130.78 2020-01-01 2020-01-02 2020-01-01 00:15:35 2020-01-02 03:43:56 2020-01-01 00:15:35.000 2020-01-02 03:43:56.000 935 99836 50385.5 5038550 935 99836 50385.5 5038550 -32633 32302 4510.3 451030 -128 123 -0.42 -42 +936 100 10926 99837 2.81081 299.81081 151.31081 15131.08108 2.81081 299.81082 151.31081 15131.0811 2.81081 299.81081 151.31081 15131.081 2020-01-01 2020-01-02 2020-01-01 00:15:36 2020-01-02 03:43:57 2020-01-01 00:15:36.000 2020-01-02 03:43:57.000 936 99837 50386.5 5038650 936 99837 50386.5 5038650 -32632 32303 4511.3 451130 -127 124 0.58 58 +937 100 10927 99838 2.81381 299.81381 151.31381 15131.38138 2.81381 299.8138 151.31381 15131.38124 2.81381 299.81381 151.31381 15131.381 2020-01-01 2020-01-02 2020-01-01 00:15:37 2020-01-02 03:43:58 2020-01-01 00:15:37.000 2020-01-02 03:43:58.000 937 99838 50387.5 5038750 937 99838 50387.5 5038750 -32631 32304 4512.3 451230 -126 125 1.58 158 +938 100 10928 99839 2.81681 299.81681 151.31681 15131.68168 2.81681 299.8168 151.31681 15131.68157 2.81681 299.81681 151.31681 15131.681 2020-01-01 2020-01-02 2020-01-01 00:15:38 2020-01-02 03:43:59 2020-01-01 00:15:38.000 2020-01-02 03:43:59.000 938 99839 50388.5 5038850 938 99839 50388.5 5038850 -32630 32305 4513.3 451330 -125 126 2.58 258 +939 100 10929 99840 2.81981 299.81981 151.31981 15131.98198 2.81982 299.81982 151.31982 15131.98217 2.81981 299.81981 151.31981 15131.981 2020-01-01 2020-01-02 2020-01-01 00:15:39 2020-01-02 03:44:00 2020-01-01 00:15:39.000 2020-01-02 03:44:00.000 939 99840 50389.5 5038950 939 99840 50389.5 5038950 -32629 32306 4514.3 451430 -124 127 3.58 358 94 102 10084 99994 0.28228 300.28228 150.28228 15178.51051 0.28228 300.2823 150.28228 15178.51078 0.28228 300.28228 150.28228000000001 15178.51028 2020-01-01 2020-01-02 2020-01-01 00:01:34 2020-01-02 03:46:34 2020-01-01 00:01:34.000 2020-01-02 03:46:34.000 94 99994 50044 5054444 94 99994 50044 5054444 -32475 32460 4623.009900990099 466924 -126 125 -0.19801980198019803 -20 -940 100 10930 99841 2.82282 299.82282 151.32282 15132.28228 2.82282 299.8228 151.32282 15132.28247 2.82282 299.82282 151.32281999999998 15132.28200 2020-01-01 2020-01-02 2020-01-01 00:15:40 2020-01-02 03:44:01 2020-01-01 00:15:40.000 2020-01-02 03:44:01.000 940 99841 50390.5 5039050 940 99841 50390.5 5039050 -32628 32307 4515.3 451530 -128 127 2.02 202 -941 100 10931 99842 2.82582 299.82582 151.32582 15132.58258 2.82582 299.82584 151.32582 15132.58257 2.82582 299.82582 151.32582 15132.58200 2020-01-01 2020-01-02 2020-01-01 00:15:41 2020-01-02 03:44:02 2020-01-01 00:15:41.000 2020-01-02 03:44:02.000 941 99842 50391.5 5039150 941 99842 50391.5 5039150 -32627 32308 4516.3 451630 -128 127 0.46 46 -942 100 10932 99843 2.82882 299.82882 151.32882 15132.88288 2.82882 299.82883 151.32882 15132.88275 2.82882 299.82882 151.32882 15132.88200 2020-01-01 2020-01-02 2020-01-01 00:15:42 2020-01-02 03:44:03 2020-01-01 00:15:42.000 2020-01-02 03:44:03.000 942 99843 50392.5 5039250 942 99843 50392.5 5039250 -32626 32309 4517.3 451730 -128 124 -1.1 -110 -943 100 10933 99844 2.83183 299.83183 151.33183 15133.18318 2.83183 299.83182 151.33183 15133.18304 2.83183 299.83183 151.33183 15133.18300 2020-01-01 2020-01-02 2020-01-01 00:15:43 2020-01-02 03:44:04 2020-01-01 00:15:43.000 2020-01-02 03:44:04.000 943 99844 50393.5 5039350 943 99844 50393.5 5039350 -32625 32310 4518.3 451830 -127 125 -0.1 -10 -944 100 10934 99845 2.83483 299.83483 151.33483 15133.48348 2.83483 299.83484 151.33483 15133.48364 2.83483 299.83483 151.33483 15133.48300 2020-01-01 2020-01-02 2020-01-01 00:15:44 2020-01-02 03:44:05 2020-01-01 00:15:44.000 2020-01-02 03:44:05.000 944 99845 50394.5 5039450 944 99845 50394.5 5039450 -32624 32311 4519.3 451930 -126 126 0.9 90 -945 100 10935 99846 2.83783 299.83783 151.33783 15133.78378 2.83783 299.83783 151.33783 15133.78393 2.83783 299.83783 151.33783 15133.78300 2020-01-01 2020-01-02 2020-01-01 00:15:45 2020-01-02 03:44:06 2020-01-01 00:15:45.000 2020-01-02 03:44:06.000 945 99846 50395.5 5039550 945 99846 50395.5 5039550 -32623 32312 4520.3 452030 -125 127 1.9 190 -946 100 10936 99847 2.84084 299.84084 151.34084 15134.08408 2.84084 299.84085 151.34084 15134.08404 2.84084 299.84084 151.34084000000001 15134.08400 2020-01-01 2020-01-02 2020-01-01 00:15:46 2020-01-02 03:44:07 2020-01-01 00:15:46.000 2020-01-02 03:44:07.000 946 99847 50396.5 5039650 946 99847 50396.5 5039650 -32622 32313 4521.3 452130 -128 127 0.34 34 -947 100 10937 99848 2.84384 299.84384 151.34384 15134.38438 2.84384 299.84384 151.34384 15134.38421 2.84384 299.84384 151.34384 15134.38400 2020-01-01 2020-01-02 2020-01-01 00:15:47 2020-01-02 03:44:08 2020-01-01 00:15:47.000 2020-01-02 03:44:08.000 947 99848 50397.5 5039750 947 99848 50397.5 5039750 -32621 32314 4522.3 452230 -128 127 -1.22 -122 -948 100 10938 99849 2.84684 299.84684 151.34684 15134.68468 2.84684 299.84683 151.34684 15134.68452 2.84684 299.84684 151.34684 15134.68400 2020-01-01 2020-01-02 2020-01-01 00:15:48 2020-01-02 03:44:09 2020-01-01 00:15:48.000 2020-01-02 03:44:09.000 948 99849 50398.5 5039850 948 99849 50398.5 5039850 -32620 32315 4523.3 452330 -128 123 -2.78 -278 -949 100 10939 99850 2.84984 299.84984 151.34984 15134.98498 2.84985 299.84985 151.34985 15134.98527 2.84984 299.84984 151.34984 15134.98400 2020-01-01 2020-01-02 2020-01-01 00:15:49 2020-01-02 03:44:10 2020-01-01 00:15:49.000 2020-01-02 03:44:10.000 949 99850 50399.5 5039950 949 99850 50399.5 5039950 -32619 32316 4524.3 452430 -127 124 -1.78 -178 +940 100 10930 99841 2.82282 299.82282 151.32282 15132.28228 2.82282 299.8228 151.32282 15132.28247 2.82282 299.82282 151.32281999999998 15132.282 2020-01-01 2020-01-02 2020-01-01 00:15:40 2020-01-02 03:44:01 2020-01-01 00:15:40.000 2020-01-02 03:44:01.000 940 99841 50390.5 5039050 940 99841 50390.5 5039050 -32628 32307 4515.3 451530 -128 127 2.02 202 +941 100 10931 99842 2.82582 299.82582 151.32582 15132.58258 2.82582 299.82584 151.32582 15132.58257 2.82582 299.82582 151.32582 15132.582 2020-01-01 2020-01-02 2020-01-01 00:15:41 2020-01-02 03:44:02 2020-01-01 00:15:41.000 2020-01-02 03:44:02.000 941 99842 50391.5 5039150 941 99842 50391.5 5039150 -32627 32308 4516.3 451630 -128 127 0.46 46 +942 100 10932 99843 2.82882 299.82882 151.32882 15132.88288 2.82882 299.82883 151.32882 15132.88275 2.82882 299.82882 151.32882 15132.882 2020-01-01 2020-01-02 2020-01-01 00:15:42 2020-01-02 03:44:03 2020-01-01 00:15:42.000 2020-01-02 03:44:03.000 942 99843 50392.5 5039250 942 99843 50392.5 5039250 -32626 32309 4517.3 451730 -128 124 -1.1 -110 +943 100 10933 99844 2.83183 299.83183 151.33183 15133.18318 2.83183 299.83182 151.33183 15133.18304 2.83183 299.83183 151.33183 15133.183 2020-01-01 2020-01-02 2020-01-01 00:15:43 2020-01-02 03:44:04 2020-01-01 00:15:43.000 2020-01-02 03:44:04.000 943 99844 50393.5 5039350 943 99844 50393.5 5039350 -32625 32310 4518.3 451830 -127 125 -0.1 -10 +944 100 10934 99845 2.83483 299.83483 151.33483 15133.48348 2.83483 299.83484 151.33483 15133.48364 2.83483 299.83483 151.33483 15133.483 2020-01-01 2020-01-02 2020-01-01 00:15:44 2020-01-02 03:44:05 2020-01-01 00:15:44.000 2020-01-02 03:44:05.000 944 99845 50394.5 5039450 944 99845 50394.5 5039450 -32624 32311 4519.3 451930 -126 126 0.9 90 +945 100 10935 99846 2.83783 299.83783 151.33783 15133.78378 2.83783 299.83783 151.33783 15133.78393 2.83783 299.83783 151.33783 15133.783 2020-01-01 2020-01-02 2020-01-01 00:15:45 2020-01-02 03:44:06 2020-01-01 00:15:45.000 2020-01-02 03:44:06.000 945 99846 50395.5 5039550 945 99846 50395.5 5039550 -32623 32312 4520.3 452030 -125 127 1.9 190 +946 100 10936 99847 2.84084 299.84084 151.34084 15134.08408 2.84084 299.84085 151.34084 15134.08404 2.84084 299.84084 151.34084000000001 15134.084 2020-01-01 2020-01-02 2020-01-01 00:15:46 2020-01-02 03:44:07 2020-01-01 00:15:46.000 2020-01-02 03:44:07.000 946 99847 50396.5 5039650 946 99847 50396.5 5039650 -32622 32313 4521.3 452130 -128 127 0.34 34 +947 100 10937 99848 2.84384 299.84384 151.34384 15134.38438 2.84384 299.84384 151.34384 15134.38421 2.84384 299.84384 151.34384 15134.384 2020-01-01 2020-01-02 2020-01-01 00:15:47 2020-01-02 03:44:08 2020-01-01 00:15:47.000 2020-01-02 03:44:08.000 947 99848 50397.5 5039750 947 99848 50397.5 5039750 -32621 32314 4522.3 452230 -128 127 -1.22 -122 +948 100 10938 99849 2.84684 299.84684 151.34684 15134.68468 2.84684 299.84683 151.34684 15134.68452 2.84684 299.84684 151.34684 15134.684 2020-01-01 2020-01-02 2020-01-01 00:15:48 2020-01-02 03:44:09 2020-01-01 00:15:48.000 2020-01-02 03:44:09.000 948 99849 50398.5 5039850 948 99849 50398.5 5039850 -32620 32315 4523.3 452330 -128 123 -2.78 -278 +949 100 10939 99850 2.84984 299.84984 151.34984 15134.98498 2.84985 299.84985 151.34985 15134.98527 2.84984 299.84984 151.34984 15134.984 2020-01-01 2020-01-02 2020-01-01 00:15:49 2020-01-02 03:44:10 2020-01-01 00:15:49.000 2020-01-02 03:44:10.000 949 99850 50399.5 5039950 949 99850 50399.5 5039950 -32619 32316 4524.3 452430 -127 124 -1.78 -178 95 102 10085 99995 0.28528 300.28528 150.28528 15178.81381 0.28528 300.28528 150.28528 15178.81343 0.28528 300.28528 150.28528 15178.81328 2020-01-01 2020-01-02 2020-01-01 00:01:35 2020-01-02 03:46:35 2020-01-01 00:01:35.000 2020-01-02 03:46:35.000 95 99995 50045 5054545 95 99995 50045 5054545 -32474 32461 4624.009900990099 467025 -125 126 0.801980198019802 81 -950 100 10940 99851 2.85285 299.85285 151.35285 15135.28528 2.85285 299.85284 151.35285 15135.28541 2.85285 299.85285 151.35285 15135.28500 2020-01-01 2020-01-02 2020-01-01 00:15:50 2020-01-02 03:44:11 2020-01-01 00:15:50.000 2020-01-02 03:44:11.000 950 99851 50400.5 5040050 950 99851 50400.5 5040050 -32618 32317 4525.3 452530 -126 125 -0.78 -78 -951 100 10941 99852 2.85585 299.85585 151.35585 15135.58558 2.85585 299.85587 151.35585 15135.58551 2.85585 299.85585 151.35585 15135.58500 2020-01-01 2020-01-02 2020-01-01 00:15:51 2020-01-02 03:44:12 2020-01-01 00:15:51.000 2020-01-02 03:44:12.000 951 99852 50401.5 5040150 951 99852 50401.5 5040150 -32617 32318 4526.3 452630 -125 126 0.22 22 -952 100 10942 99853 2.85885 299.85885 151.35885 15135.88588 2.85885 299.85886 151.35885 15135.88568 2.85885 299.85885 151.35885 15135.88500 2020-01-01 2020-01-02 2020-01-01 00:15:52 2020-01-02 03:44:13 2020-01-01 00:15:52.000 2020-01-02 03:44:13.000 952 99853 50402.5 5040250 952 99853 50402.5 5040250 -32616 32319 4527.3 452730 -124 127 1.22 122 -953 100 10943 99854 2.86186 299.86186 151.36186 15136.18618 2.86186 299.86185 151.36185 15136.18598 2.86186 299.86186 151.36186 15136.18600 2020-01-01 2020-01-02 2020-01-01 00:15:53 2020-01-02 03:44:14 2020-01-01 00:15:53.000 2020-01-02 03:44:14.000 953 99854 50403.5 5040350 953 99854 50403.5 5040350 -32615 32320 4528.3 452830 -128 127 -0.34 -34 -954 100 10944 99855 2.86486 299.86486 151.36486 15136.48648 2.86486 299.86487 151.36486 15136.48674 2.86486 299.86486 151.36486000000002 15136.48600 2020-01-01 2020-01-02 2020-01-01 00:15:54 2020-01-02 03:44:15 2020-01-01 00:15:54.000 2020-01-02 03:44:15.000 954 99855 50404.5 5040450 954 99855 50404.5 5040450 -32614 32321 4529.3 452930 -128 123 -1.9 -190 -955 100 10945 99856 2.86786 299.86786 151.36786 15136.78678 2.86786 299.86786 151.36786 15136.78688 2.86786 299.86786 151.36786 15136.78600 2020-01-01 2020-01-02 2020-01-01 00:15:55 2020-01-02 03:44:16 2020-01-01 00:15:55.000 2020-01-02 03:44:16.000 955 99856 50405.5 5040550 955 99856 50405.5 5040550 -32613 32322 4530.3 453030 -127 124 -0.9 -90 -956 100 10946 99857 2.87087 299.87087 151.37087 15137.08708 2.87087 299.87088 151.37087 15137.08701 2.87087 299.87087 151.37087 15137.08700 2020-01-01 2020-01-02 2020-01-01 00:15:56 2020-01-02 03:44:17 2020-01-01 00:15:56.000 2020-01-02 03:44:17.000 956 99857 50406.5 5040650 956 99857 50406.5 5040650 -32612 32323 4531.3 453130 -126 125 0.1 10 -957 100 10947 99858 2.87387 299.87387 151.37387 15137.38738 2.87387 299.87387 151.37387 15137.38716 2.87387 299.87387 151.37387 15137.38700 2020-01-01 2020-01-02 2020-01-01 00:15:57 2020-01-02 03:44:18 2020-01-01 00:15:57.000 2020-01-02 03:44:18.000 957 99858 50407.5 5040750 957 99858 50407.5 5040750 -32611 32324 4532.3 453230 -125 126 1.1 110 -958 100 10948 99859 2.87687 299.87687 151.37687 15137.68768 2.87687 299.8769 151.37687 15137.68791 2.87687 299.87687 151.37687 15137.68700 2020-01-01 2020-01-02 2020-01-01 00:15:58 2020-01-02 03:44:19 2020-01-01 00:15:58.000 2020-01-02 03:44:19.000 958 99859 50408.5 5040850 958 99859 50408.5 5040850 -32610 32325 4533.3 453330 -124 127 2.1 210 -959 100 10949 99860 2.87987 299.87987 151.37987 15137.98798 2.87988 299.87988 151.37988 15137.9882 2.87987 299.87987 151.37986999999998 15137.98700 2020-01-01 2020-01-02 2020-01-01 00:15:59 2020-01-02 03:44:20 2020-01-01 00:15:59.000 2020-01-02 03:44:20.000 959 99860 50409.5 5040950 959 99860 50409.5 5040950 -32609 32326 4534.3 453430 -128 127 0.54 54 +950 100 10940 99851 2.85285 299.85285 151.35285 15135.28528 2.85285 299.85284 151.35285 15135.28541 2.85285 299.85285 151.35285 15135.285 2020-01-01 2020-01-02 2020-01-01 00:15:50 2020-01-02 03:44:11 2020-01-01 00:15:50.000 2020-01-02 03:44:11.000 950 99851 50400.5 5040050 950 99851 50400.5 5040050 -32618 32317 4525.3 452530 -126 125 -0.78 -78 +951 100 10941 99852 2.85585 299.85585 151.35585 15135.58558 2.85585 299.85587 151.35585 15135.58551 2.85585 299.85585 151.35585 15135.585 2020-01-01 2020-01-02 2020-01-01 00:15:51 2020-01-02 03:44:12 2020-01-01 00:15:51.000 2020-01-02 03:44:12.000 951 99852 50401.5 5040150 951 99852 50401.5 5040150 -32617 32318 4526.3 452630 -125 126 0.22 22 +952 100 10942 99853 2.85885 299.85885 151.35885 15135.88588 2.85885 299.85886 151.35885 15135.88568 2.85885 299.85885 151.35885 15135.885 2020-01-01 2020-01-02 2020-01-01 00:15:52 2020-01-02 03:44:13 2020-01-01 00:15:52.000 2020-01-02 03:44:13.000 952 99853 50402.5 5040250 952 99853 50402.5 5040250 -32616 32319 4527.3 452730 -124 127 1.22 122 +953 100 10943 99854 2.86186 299.86186 151.36186 15136.18618 2.86186 299.86185 151.36185 15136.18598 2.86186 299.86186 151.36186 15136.186 2020-01-01 2020-01-02 2020-01-01 00:15:53 2020-01-02 03:44:14 2020-01-01 00:15:53.000 2020-01-02 03:44:14.000 953 99854 50403.5 5040350 953 99854 50403.5 5040350 -32615 32320 4528.3 452830 -128 127 -0.34 -34 +954 100 10944 99855 2.86486 299.86486 151.36486 15136.48648 2.86486 299.86487 151.36486 15136.48674 2.86486 299.86486 151.36486000000002 15136.486 2020-01-01 2020-01-02 2020-01-01 00:15:54 2020-01-02 03:44:15 2020-01-01 00:15:54.000 2020-01-02 03:44:15.000 954 99855 50404.5 5040450 954 99855 50404.5 5040450 -32614 32321 4529.3 452930 -128 123 -1.9 -190 +955 100 10945 99856 2.86786 299.86786 151.36786 15136.78678 2.86786 299.86786 151.36786 15136.78688 2.86786 299.86786 151.36786 15136.786 2020-01-01 2020-01-02 2020-01-01 00:15:55 2020-01-02 03:44:16 2020-01-01 00:15:55.000 2020-01-02 03:44:16.000 955 99856 50405.5 5040550 955 99856 50405.5 5040550 -32613 32322 4530.3 453030 -127 124 -0.9 -90 +956 100 10946 99857 2.87087 299.87087 151.37087 15137.08708 2.87087 299.87088 151.37087 15137.08701 2.87087 299.87087 151.37087 15137.087 2020-01-01 2020-01-02 2020-01-01 00:15:56 2020-01-02 03:44:17 2020-01-01 00:15:56.000 2020-01-02 03:44:17.000 956 99857 50406.5 5040650 956 99857 50406.5 5040650 -32612 32323 4531.3 453130 -126 125 0.1 10 +957 100 10947 99858 2.87387 299.87387 151.37387 15137.38738 2.87387 299.87387 151.37387 15137.38716 2.87387 299.87387 151.37387 15137.387 2020-01-01 2020-01-02 2020-01-01 00:15:57 2020-01-02 03:44:18 2020-01-01 00:15:57.000 2020-01-02 03:44:18.000 957 99858 50407.5 5040750 957 99858 50407.5 5040750 -32611 32324 4532.3 453230 -125 126 1.1 110 +958 100 10948 99859 2.87687 299.87687 151.37687 15137.68768 2.87687 299.8769 151.37687 15137.68791 2.87687 299.87687 151.37687 15137.687 2020-01-01 2020-01-02 2020-01-01 00:15:58 2020-01-02 03:44:19 2020-01-01 00:15:58.000 2020-01-02 03:44:19.000 958 99859 50408.5 5040850 958 99859 50408.5 5040850 -32610 32325 4533.3 453330 -124 127 2.1 210 +959 100 10949 99860 2.87987 299.87987 151.37987 15137.98798 2.87988 299.87988 151.37988 15137.9882 2.87987 299.87987 151.37986999999998 15137.987 2020-01-01 2020-01-02 2020-01-01 00:15:59 2020-01-02 03:44:20 2020-01-01 00:15:59.000 2020-01-02 03:44:20.000 959 99860 50409.5 5040950 959 99860 50409.5 5040950 -32609 32326 4534.3 453430 -128 127 0.54 54 96 102 10086 99996 0.28828 300.28828 150.28828 15179.11711 0.28828 300.2883 150.28828 15179.11718 0.28828 300.28828 150.28828000000001 15179.11628 2020-01-01 2020-01-02 2020-01-01 00:01:36 2020-01-02 03:46:36 2020-01-01 00:01:36.000 2020-01-02 03:46:36.000 96 99996 50046 5054646 96 99996 50046 5054646 -32473 32462 4625.009900990099 467126 -124 127 1.801980198019802 182 -960 100 10950 99861 2.88288 299.88288 151.38288 15138.28828 2.88288 299.88287 151.38288 15138.28834 2.88288 299.88288 151.38288 15138.28800 2020-01-01 2020-01-02 2020-01-01 00:16:00 2020-01-02 03:44:21 2020-01-01 00:16:00.000 2020-01-02 03:44:21.000 960 99861 50410.5 5041050 960 99861 50410.5 5041050 -32608 32327 4535.3 453530 -128 123 -1.02 -102 -961 100 10951 99862 2.88588 299.88588 151.38588 15138.58858 2.88588 299.8859 151.38588 15138.58848 2.88588 299.88588 151.38588 15138.58800 2020-01-01 2020-01-02 2020-01-01 00:16:01 2020-01-02 03:44:22 2020-01-01 00:16:01.000 2020-01-02 03:44:22.000 961 99862 50411.5 5041150 961 99862 50411.5 5041150 -32607 32328 4536.3 453630 -127 124 -0.02 -2 -962 100 10952 99863 2.88888 299.88888 151.38888 15138.88888 2.88888 299.8889 151.38888 15138.88862 2.88888 299.88888 151.38888 15138.88800 2020-01-01 2020-01-02 2020-01-01 00:16:02 2020-01-02 03:44:23 2020-01-01 00:16:02.000 2020-01-02 03:44:23.000 962 99863 50412.5 5041250 962 99863 50412.5 5041250 -32606 32329 4537.3 453730 -126 125 0.98 98 -963 100 10953 99864 2.89189 299.89189 151.39189 15139.18918 2.89189 299.8919 151.39189 15139.18937 2.89189 299.89189 151.39189 15139.18900 2020-01-01 2020-01-02 2020-01-01 00:16:03 2020-01-02 03:44:24 2020-01-01 00:16:03.000 2020-01-02 03:44:24.000 963 99864 50413.5 5041350 963 99864 50413.5 5041350 -32605 32330 4538.3 453830 -125 126 1.98 198 -964 100 10954 99865 2.89489 299.89489 151.39489 15139.48948 2.89489 299.8949 151.39489 15139.48968 2.89489 299.89489 151.39489 15139.48900 2020-01-01 2020-01-02 2020-01-01 00:16:04 2020-01-02 03:44:25 2020-01-01 00:16:04.000 2020-01-02 03:44:25.000 964 99865 50414.5 5041450 964 99865 50414.5 5041450 -32604 32331 4539.3 453930 -124 127 2.98 298 -965 100 10955 99866 2.89789 299.89789 151.39789 15139.78978 2.89789 299.8979 151.39789 15139.78985 2.89789 299.89789 151.39789000000002 15139.78900 2020-01-01 2020-01-02 2020-01-01 00:16:05 2020-01-02 03:44:26 2020-01-01 00:16:05.000 2020-01-02 03:44:26.000 965 99866 50415.5 5041550 965 99866 50415.5 5041550 -32603 32332 4540.3 454030 -128 127 1.42 142 -966 100 10956 99867 2.9009 299.9009 151.4009 15140.09009 2.9009 299.9009 151.40089 15140.08996 2.90090 299.90090 151.4009 15140.09000 2020-01-01 2020-01-02 2020-01-01 00:16:06 2020-01-02 03:44:27 2020-01-01 00:16:06.000 2020-01-02 03:44:27.000 966 99867 50416.5 5041650 966 99867 50416.5 5041650 -32602 32333 4541.3 454130 -128 127 -0.14 -14 -967 100 10957 99868 2.9039 299.9039 151.4039 15140.39039 2.9039 299.9039 151.4039 15140.39009 2.90390 299.90390 151.4039 15140.39000 2020-01-01 2020-01-02 2020-01-01 00:16:07 2020-01-02 03:44:28 2020-01-01 00:16:07.000 2020-01-02 03:44:28.000 967 99868 50417.5 5041750 967 99868 50417.5 5041750 -32601 32334 4542.3 454230 -128 124 -1.7 -170 -968 100 10958 99869 2.9069 299.9069 151.4069 15140.69069 2.9069 299.90692 151.4069 15140.69084 2.90690 299.90690 151.4069 15140.69000 2020-01-01 2020-01-02 2020-01-01 00:16:08 2020-01-02 03:44:29 2020-01-01 00:16:08.000 2020-01-02 03:44:29.000 968 99869 50418.5 5041850 968 99869 50418.5 5041850 -32600 32335 4543.3 454330 -127 125 -0.7 -70 -969 100 10959 99870 2.9099 299.9099 151.4099 15140.99099 2.90991 299.9099 151.40991 15140.99114 2.90990 299.90990 151.4099 15140.99000 2020-01-01 2020-01-02 2020-01-01 00:16:09 2020-01-02 03:44:30 2020-01-01 00:16:09.000 2020-01-02 03:44:30.000 969 99870 50419.5 5041950 969 99870 50419.5 5041950 -32599 32336 4544.3 454430 -126 126 0.3 30 +960 100 10950 99861 2.88288 299.88288 151.38288 15138.28828 2.88288 299.88287 151.38288 15138.28834 2.88288 299.88288 151.38288 15138.288 2020-01-01 2020-01-02 2020-01-01 00:16:00 2020-01-02 03:44:21 2020-01-01 00:16:00.000 2020-01-02 03:44:21.000 960 99861 50410.5 5041050 960 99861 50410.5 5041050 -32608 32327 4535.3 453530 -128 123 -1.02 -102 +961 100 10951 99862 2.88588 299.88588 151.38588 15138.58858 2.88588 299.8859 151.38588 15138.58848 2.88588 299.88588 151.38588 15138.588 2020-01-01 2020-01-02 2020-01-01 00:16:01 2020-01-02 03:44:22 2020-01-01 00:16:01.000 2020-01-02 03:44:22.000 961 99862 50411.5 5041150 961 99862 50411.5 5041150 -32607 32328 4536.3 453630 -127 124 -0.02 -2 +962 100 10952 99863 2.88888 299.88888 151.38888 15138.88888 2.88888 299.8889 151.38888 15138.88862 2.88888 299.88888 151.38888 15138.888 2020-01-01 2020-01-02 2020-01-01 00:16:02 2020-01-02 03:44:23 2020-01-01 00:16:02.000 2020-01-02 03:44:23.000 962 99863 50412.5 5041250 962 99863 50412.5 5041250 -32606 32329 4537.3 453730 -126 125 0.98 98 +963 100 10953 99864 2.89189 299.89189 151.39189 15139.18918 2.89189 299.8919 151.39189 15139.18937 2.89189 299.89189 151.39189 15139.189 2020-01-01 2020-01-02 2020-01-01 00:16:03 2020-01-02 03:44:24 2020-01-01 00:16:03.000 2020-01-02 03:44:24.000 963 99864 50413.5 5041350 963 99864 50413.5 5041350 -32605 32330 4538.3 453830 -125 126 1.98 198 +964 100 10954 99865 2.89489 299.89489 151.39489 15139.48948 2.89489 299.8949 151.39489 15139.48968 2.89489 299.89489 151.39489 15139.489 2020-01-01 2020-01-02 2020-01-01 00:16:04 2020-01-02 03:44:25 2020-01-01 00:16:04.000 2020-01-02 03:44:25.000 964 99865 50414.5 5041450 964 99865 50414.5 5041450 -32604 32331 4539.3 453930 -124 127 2.98 298 +965 100 10955 99866 2.89789 299.89789 151.39789 15139.78978 2.89789 299.8979 151.39789 15139.78985 2.89789 299.89789 151.39789000000002 15139.789 2020-01-01 2020-01-02 2020-01-01 00:16:05 2020-01-02 03:44:26 2020-01-01 00:16:05.000 2020-01-02 03:44:26.000 965 99866 50415.5 5041550 965 99866 50415.5 5041550 -32603 32332 4540.3 454030 -128 127 1.42 142 +966 100 10956 99867 2.9009 299.9009 151.4009 15140.09009 2.9009 299.9009 151.40089 15140.08996 2.9009 299.9009 151.4009 15140.09 2020-01-01 2020-01-02 2020-01-01 00:16:06 2020-01-02 03:44:27 2020-01-01 00:16:06.000 2020-01-02 03:44:27.000 966 99867 50416.5 5041650 966 99867 50416.5 5041650 -32602 32333 4541.3 454130 -128 127 -0.14 -14 +967 100 10957 99868 2.9039 299.9039 151.4039 15140.39039 2.9039 299.9039 151.4039 15140.39009 2.9039 299.9039 151.4039 15140.39 2020-01-01 2020-01-02 2020-01-01 00:16:07 2020-01-02 03:44:28 2020-01-01 00:16:07.000 2020-01-02 03:44:28.000 967 99868 50417.5 5041750 967 99868 50417.5 5041750 -32601 32334 4542.3 454230 -128 124 -1.7 -170 +968 100 10958 99869 2.9069 299.9069 151.4069 15140.69069 2.9069 299.90692 151.4069 15140.69084 2.9069 299.9069 151.4069 15140.69 2020-01-01 2020-01-02 2020-01-01 00:16:08 2020-01-02 03:44:29 2020-01-01 00:16:08.000 2020-01-02 03:44:29.000 968 99869 50418.5 5041850 968 99869 50418.5 5041850 -32600 32335 4543.3 454330 -127 125 -0.7 -70 +969 100 10959 99870 2.9099 299.9099 151.4099 15140.99099 2.90991 299.9099 151.40991 15140.99114 2.9099 299.9099 151.4099 15140.99 2020-01-01 2020-01-02 2020-01-01 00:16:09 2020-01-02 03:44:30 2020-01-01 00:16:09.000 2020-01-02 03:44:30.000 969 99870 50419.5 5041950 969 99870 50419.5 5041950 -32599 32336 4544.3 454430 -126 126 0.3 30 97 102 10087 99997 0.29129 300.29129 150.29129 15179.42042 0.29129 300.2913 150.29129 15179.42033 0.29129 300.29129 150.29129 15179.42029 2020-01-01 2020-01-02 2020-01-01 00:01:37 2020-01-02 03:46:37 2020-01-01 00:01:37.000 2020-01-02 03:46:37.000 97 99997 50047 5054747 97 99997 50047 5054747 -32472 32463 4626.009900990099 467227 -128 127 0.26732673267326734 27 -970 100 10960 99871 2.91291 299.91291 151.41291 15141.29129 2.91291 299.9129 151.41291 15141.29132 2.91291 299.91291 151.41290999999998 15141.29100 2020-01-01 2020-01-02 2020-01-01 00:16:10 2020-01-02 03:44:31 2020-01-01 00:16:10.000 2020-01-02 03:44:31.000 970 99871 50420.5 5042050 970 99871 50420.5 5042050 -32598 32337 4545.3 454530 -125 127 1.3 130 -971 100 10961 99872 2.91591 299.91591 151.41591 15141.59159 2.91591 299.91592 151.41591 15141.59142 2.91591 299.91591 151.41591 15141.59100 2020-01-01 2020-01-02 2020-01-01 00:16:11 2020-01-02 03:44:32 2020-01-01 00:16:11.000 2020-01-02 03:44:32.000 971 99872 50421.5 5042150 971 99872 50421.5 5042150 -32597 32338 4546.3 454630 -128 127 -0.26 -26 -972 100 10962 99873 2.91891 299.91891 151.41891 15141.89189 2.91891 299.9189 151.41891 15141.89172 2.91891 299.91891 151.41890999999998 15141.89100 2020-01-01 2020-01-02 2020-01-01 00:16:12 2020-01-02 03:44:33 2020-01-01 00:16:12.000 2020-01-02 03:44:33.000 972 99873 50422.5 5042250 972 99873 50422.5 5042250 -32596 32339 4547.3 454730 -128 127 -1.82 -182 -973 100 10963 99874 2.92192 299.92192 151.42192 15142.19219 2.92192 299.92194 151.42192 15142.19232 2.92192 299.92192 151.42192 15142.19200 2020-01-01 2020-01-02 2020-01-01 00:16:13 2020-01-02 03:44:34 2020-01-01 00:16:13.000 2020-01-02 03:44:34.000 973 99874 50423.5 5042350 973 99874 50423.5 5042350 -32595 32340 4548.3 454830 -128 123 -3.38 -338 -974 100 10964 99875 2.92492 299.92492 151.42492 15142.49249 2.92492 299.92493 151.42492 15142.49265 2.92492 299.92492 151.42492000000001 15142.49200 2020-01-01 2020-01-02 2020-01-01 00:16:14 2020-01-02 03:44:35 2020-01-01 00:16:14.000 2020-01-02 03:44:35.000 974 99875 50424.5 5042450 974 99875 50424.5 5042450 -32594 32341 4549.3 454930 -127 124 -2.38 -238 -975 100 10965 99876 2.92792 299.92792 151.42792 15142.79279 2.92792 299.92792 151.42792 15142.79279 2.92792 299.92792 151.42792 15142.79200 2020-01-01 2020-01-02 2020-01-01 00:16:15 2020-01-02 03:44:36 2020-01-01 00:16:15.000 2020-01-02 03:44:36.000 975 99876 50425.5 5042550 975 99876 50425.5 5042550 -32593 32342 4550.3 455030 -126 125 -1.38 -138 -976 100 10966 99877 2.93093 299.93093 151.43093 15143.09309 2.93093 299.93094 151.43092 15143.09289 2.93093 299.93093 151.43093000000002 15143.09300 2020-01-01 2020-01-02 2020-01-01 00:16:16 2020-01-02 03:44:37 2020-01-01 00:16:16.000 2020-01-02 03:44:37.000 976 99877 50426.5 5042650 976 99877 50426.5 5042650 -32592 32343 4551.3 455130 -125 126 -0.38 -38 -977 100 10967 99878 2.93393 299.93393 151.43393 15143.39339 2.93393 299.93393 151.43393 15143.39318 2.93393 299.93393 151.43393 15143.39300 2020-01-01 2020-01-02 2020-01-01 00:16:17 2020-01-02 03:44:38 2020-01-01 00:16:17.000 2020-01-02 03:44:38.000 977 99878 50427.5 5042750 977 99878 50427.5 5042750 -32591 32344 4552.3 455230 -124 127 0.62 62 -978 100 10968 99879 2.93693 299.93693 151.43693 15143.69369 2.93693 299.93695 151.43693 15143.69378 2.93693 299.93693 151.43693 15143.69300 2020-01-01 2020-01-02 2020-01-01 00:16:18 2020-01-02 03:44:39 2020-01-01 00:16:18.000 2020-01-02 03:44:39.000 978 99879 50428.5 5042850 978 99879 50428.5 5042850 -32590 32345 4553.3 455330 -128 127 -0.94 -94 -979 100 10969 99880 2.93993 299.93993 151.43993 15143.99399 2.93994 299.93994 151.43994 15143.99412 2.93993 299.93993 151.43993 15143.99300 2020-01-01 2020-01-02 2020-01-01 00:16:19 2020-01-02 03:44:40 2020-01-01 00:16:19.000 2020-01-02 03:44:40.000 979 99880 50429.5 5042950 979 99880 50429.5 5042950 -32589 32346 4554.3 455430 -128 123 -2.5 -250 +970 100 10960 99871 2.91291 299.91291 151.41291 15141.29129 2.91291 299.9129 151.41291 15141.29132 2.91291 299.91291 151.41290999999998 15141.291 2020-01-01 2020-01-02 2020-01-01 00:16:10 2020-01-02 03:44:31 2020-01-01 00:16:10.000 2020-01-02 03:44:31.000 970 99871 50420.5 5042050 970 99871 50420.5 5042050 -32598 32337 4545.3 454530 -125 127 1.3 130 +971 100 10961 99872 2.91591 299.91591 151.41591 15141.59159 2.91591 299.91592 151.41591 15141.59142 2.91591 299.91591 151.41591 15141.591 2020-01-01 2020-01-02 2020-01-01 00:16:11 2020-01-02 03:44:32 2020-01-01 00:16:11.000 2020-01-02 03:44:32.000 971 99872 50421.5 5042150 971 99872 50421.5 5042150 -32597 32338 4546.3 454630 -128 127 -0.26 -26 +972 100 10962 99873 2.91891 299.91891 151.41891 15141.89189 2.91891 299.9189 151.41891 15141.89172 2.91891 299.91891 151.41890999999998 15141.891 2020-01-01 2020-01-02 2020-01-01 00:16:12 2020-01-02 03:44:33 2020-01-01 00:16:12.000 2020-01-02 03:44:33.000 972 99873 50422.5 5042250 972 99873 50422.5 5042250 -32596 32339 4547.3 454730 -128 127 -1.82 -182 +973 100 10963 99874 2.92192 299.92192 151.42192 15142.19219 2.92192 299.92194 151.42192 15142.19232 2.92192 299.92192 151.42192 15142.192 2020-01-01 2020-01-02 2020-01-01 00:16:13 2020-01-02 03:44:34 2020-01-01 00:16:13.000 2020-01-02 03:44:34.000 973 99874 50423.5 5042350 973 99874 50423.5 5042350 -32595 32340 4548.3 454830 -128 123 -3.38 -338 +974 100 10964 99875 2.92492 299.92492 151.42492 15142.49249 2.92492 299.92493 151.42492 15142.49265 2.92492 299.92492 151.42492000000001 15142.492 2020-01-01 2020-01-02 2020-01-01 00:16:14 2020-01-02 03:44:35 2020-01-01 00:16:14.000 2020-01-02 03:44:35.000 974 99875 50424.5 5042450 974 99875 50424.5 5042450 -32594 32341 4549.3 454930 -127 124 -2.38 -238 +975 100 10965 99876 2.92792 299.92792 151.42792 15142.79279 2.92792 299.92792 151.42792 15142.79279 2.92792 299.92792 151.42792 15142.792 2020-01-01 2020-01-02 2020-01-01 00:16:15 2020-01-02 03:44:36 2020-01-01 00:16:15.000 2020-01-02 03:44:36.000 975 99876 50425.5 5042550 975 99876 50425.5 5042550 -32593 32342 4550.3 455030 -126 125 -1.38 -138 +976 100 10966 99877 2.93093 299.93093 151.43093 15143.09309 2.93093 299.93094 151.43092 15143.09289 2.93093 299.93093 151.43093000000002 15143.093 2020-01-01 2020-01-02 2020-01-01 00:16:16 2020-01-02 03:44:37 2020-01-01 00:16:16.000 2020-01-02 03:44:37.000 976 99877 50426.5 5042650 976 99877 50426.5 5042650 -32592 32343 4551.3 455130 -125 126 -0.38 -38 +977 100 10967 99878 2.93393 299.93393 151.43393 15143.39339 2.93393 299.93393 151.43393 15143.39318 2.93393 299.93393 151.43393 15143.393 2020-01-01 2020-01-02 2020-01-01 00:16:17 2020-01-02 03:44:38 2020-01-01 00:16:17.000 2020-01-02 03:44:38.000 977 99878 50427.5 5042750 977 99878 50427.5 5042750 -32591 32344 4552.3 455230 -124 127 0.62 62 +978 100 10968 99879 2.93693 299.93693 151.43693 15143.69369 2.93693 299.93695 151.43693 15143.69378 2.93693 299.93693 151.43693 15143.693 2020-01-01 2020-01-02 2020-01-01 00:16:18 2020-01-02 03:44:39 2020-01-01 00:16:18.000 2020-01-02 03:44:39.000 978 99879 50428.5 5042850 978 99879 50428.5 5042850 -32590 32345 4553.3 455330 -128 127 -0.94 -94 +979 100 10969 99880 2.93993 299.93993 151.43993 15143.99399 2.93994 299.93994 151.43994 15143.99412 2.93993 299.93993 151.43993 15143.993 2020-01-01 2020-01-02 2020-01-01 00:16:19 2020-01-02 03:44:40 2020-01-01 00:16:19.000 2020-01-02 03:44:40.000 979 99880 50429.5 5042950 979 99880 50429.5 5042950 -32589 32346 4554.3 455430 -128 123 -2.5 -250 98 102 10088 99998 0.29429 300.29429 150.29429 15179.72372 0.29429 300.29428 150.29429 15179.72363 0.29429 300.29429 150.29429 15179.72329 2020-01-01 2020-01-02 2020-01-01 00:01:38 2020-01-02 03:46:38 2020-01-01 00:01:38.000 2020-01-02 03:46:38.000 98 99998 50048 5054848 98 99998 50048 5054848 -32471 32464 4627.009900990099 467328 -128 127 -1.2673267326732673 -128 -980 100 10970 99881 2.94294 299.94294 151.44294 15144.29429 2.94294 299.94293 151.44294 15144.29426 2.94294 299.94294 151.44294 15144.29400 2020-01-01 2020-01-02 2020-01-01 00:16:20 2020-01-02 03:44:41 2020-01-01 00:16:20.000 2020-01-02 03:44:41.000 980 99881 50430.5 5043050 980 99881 50430.5 5043050 -32588 32347 4555.3 455530 -127 124 -1.5 -150 -981 100 10971 99882 2.94594 299.94594 151.44594 15144.59459 2.94594 299.94595 151.44595 15144.59501 2.94594 299.94594 151.44593999999998 15144.59400 2020-01-01 2020-01-02 2020-01-01 00:16:21 2020-01-02 03:44:42 2020-01-01 00:16:21.000 2020-01-02 03:44:42.000 981 99882 50431.5 5043150 981 99882 50431.5 5043150 -32587 32348 4556.3 455630 -126 125 -0.5 -50 -982 100 10972 99883 2.94894 299.94894 151.44894 15144.89489 2.94894 299.94894 151.44894 15144.89466 2.94894 299.94894 151.44894 15144.89400 2020-01-01 2020-01-02 2020-01-01 00:16:22 2020-01-02 03:44:43 2020-01-01 00:16:22.000 2020-01-02 03:44:43.000 982 99883 50432.5 5043250 982 99883 50432.5 5043250 -32586 32349 4557.3 455730 -125 126 0.5 50 -983 100 10973 99884 2.95195 299.95195 151.45195 15145.19519 2.95195 299.95197 151.45195 15145.19525 2.95195 299.95195 151.45195 15145.19500 2020-01-01 2020-01-02 2020-01-01 00:16:23 2020-01-02 03:44:44 2020-01-01 00:16:23.000 2020-01-02 03:44:44.000 983 99884 50433.5 5043350 983 99884 50433.5 5043350 -32585 32350 4558.3 455830 -124 127 1.5 150 -984 100 10974 99885 2.95495 299.95495 151.45495 15145.49549 2.95495 299.95496 151.45495 15145.49559 2.95495 299.95495 151.45495 15145.49500 2020-01-01 2020-01-02 2020-01-01 00:16:24 2020-01-02 03:44:45 2020-01-01 00:16:24.000 2020-01-02 03:44:45.000 984 99885 50434.5 5043450 984 99885 50434.5 5043450 -32584 32351 4559.3 455930 -128 127 -0.06 -6 -985 100 10975 99886 2.95795 299.95795 151.45795 15145.79579 2.95795 299.95795 151.45795 15145.79573 2.95795 299.95795 151.45795 15145.79500 2020-01-01 2020-01-02 2020-01-01 00:16:25 2020-01-02 03:44:46 2020-01-01 00:16:25.000 2020-01-02 03:44:46.000 985 99886 50435.5 5043550 985 99886 50435.5 5043550 -32583 32352 4560.3 456030 -128 123 -1.62 -162 -986 100 10976 99887 2.96096 299.96096 151.46096 15146.09609 2.96096 299.96097 151.46096 15146.09648 2.96096 299.96096 151.46096 15146.09600 2020-01-01 2020-01-02 2020-01-01 00:16:26 2020-01-02 03:44:47 2020-01-01 00:16:26.000 2020-01-02 03:44:47.000 986 99887 50436.5 5043650 986 99887 50436.5 5043650 -32582 32353 4561.3 456130 -127 124 -0.62 -62 -987 100 10977 99888 2.96396 299.96396 151.46396 15146.39639 2.96396 299.96396 151.46396 15146.39612 2.96396 299.96396 151.46396000000001 15146.39600 2020-01-01 2020-01-02 2020-01-01 00:16:27 2020-01-02 03:44:48 2020-01-01 00:16:27.000 2020-01-02 03:44:48.000 987 99888 50437.5 5043750 987 99888 50437.5 5043750 -32581 32354 4562.3 456230 -126 125 0.38 38 -988 100 10978 99889 2.96696 299.96696 151.46696 15146.69669 2.96696 299.96698 151.46696 15146.69676 2.96696 299.96696 151.46696 15146.69600 2020-01-01 2020-01-02 2020-01-01 00:16:28 2020-01-02 03:44:49 2020-01-01 00:16:28.000 2020-01-02 03:44:49.000 988 99889 50438.5 5043850 988 99889 50438.5 5043850 -32580 32355 4563.3 456330 -125 126 1.38 138 -989 100 10979 99890 2.96996 299.96996 151.46996 15146.99699 2.96997 299.96997 151.46997 15146.99706 2.96996 299.96996 151.46996 15146.99600 2020-01-01 2020-01-02 2020-01-01 00:16:29 2020-01-02 03:44:50 2020-01-01 00:16:29.000 2020-01-02 03:44:50.000 989 99890 50439.5 5043950 989 99890 50439.5 5043950 -32579 32356 4564.3 456430 -124 127 2.38 238 +980 100 10970 99881 2.94294 299.94294 151.44294 15144.29429 2.94294 299.94293 151.44294 15144.29426 2.94294 299.94294 151.44294 15144.294 2020-01-01 2020-01-02 2020-01-01 00:16:20 2020-01-02 03:44:41 2020-01-01 00:16:20.000 2020-01-02 03:44:41.000 980 99881 50430.5 5043050 980 99881 50430.5 5043050 -32588 32347 4555.3 455530 -127 124 -1.5 -150 +981 100 10971 99882 2.94594 299.94594 151.44594 15144.59459 2.94594 299.94595 151.44595 15144.59501 2.94594 299.94594 151.44593999999998 15144.594 2020-01-01 2020-01-02 2020-01-01 00:16:21 2020-01-02 03:44:42 2020-01-01 00:16:21.000 2020-01-02 03:44:42.000 981 99882 50431.5 5043150 981 99882 50431.5 5043150 -32587 32348 4556.3 455630 -126 125 -0.5 -50 +982 100 10972 99883 2.94894 299.94894 151.44894 15144.89489 2.94894 299.94894 151.44894 15144.89466 2.94894 299.94894 151.44894 15144.894 2020-01-01 2020-01-02 2020-01-01 00:16:22 2020-01-02 03:44:43 2020-01-01 00:16:22.000 2020-01-02 03:44:43.000 982 99883 50432.5 5043250 982 99883 50432.5 5043250 -32586 32349 4557.3 455730 -125 126 0.5 50 +983 100 10973 99884 2.95195 299.95195 151.45195 15145.19519 2.95195 299.95197 151.45195 15145.19525 2.95195 299.95195 151.45195 15145.195 2020-01-01 2020-01-02 2020-01-01 00:16:23 2020-01-02 03:44:44 2020-01-01 00:16:23.000 2020-01-02 03:44:44.000 983 99884 50433.5 5043350 983 99884 50433.5 5043350 -32585 32350 4558.3 455830 -124 127 1.5 150 +984 100 10974 99885 2.95495 299.95495 151.45495 15145.49549 2.95495 299.95496 151.45495 15145.49559 2.95495 299.95495 151.45495 15145.495 2020-01-01 2020-01-02 2020-01-01 00:16:24 2020-01-02 03:44:45 2020-01-01 00:16:24.000 2020-01-02 03:44:45.000 984 99885 50434.5 5043450 984 99885 50434.5 5043450 -32584 32351 4559.3 455930 -128 127 -0.06 -6 +985 100 10975 99886 2.95795 299.95795 151.45795 15145.79579 2.95795 299.95795 151.45795 15145.79573 2.95795 299.95795 151.45795 15145.795 2020-01-01 2020-01-02 2020-01-01 00:16:25 2020-01-02 03:44:46 2020-01-01 00:16:25.000 2020-01-02 03:44:46.000 985 99886 50435.5 5043550 985 99886 50435.5 5043550 -32583 32352 4560.3 456030 -128 123 -1.62 -162 +986 100 10976 99887 2.96096 299.96096 151.46096 15146.09609 2.96096 299.96097 151.46096 15146.09648 2.96096 299.96096 151.46096 15146.096 2020-01-01 2020-01-02 2020-01-01 00:16:26 2020-01-02 03:44:47 2020-01-01 00:16:26.000 2020-01-02 03:44:47.000 986 99887 50436.5 5043650 986 99887 50436.5 5043650 -32582 32353 4561.3 456130 -127 124 -0.62 -62 +987 100 10977 99888 2.96396 299.96396 151.46396 15146.39639 2.96396 299.96396 151.46396 15146.39612 2.96396 299.96396 151.46396000000001 15146.396 2020-01-01 2020-01-02 2020-01-01 00:16:27 2020-01-02 03:44:48 2020-01-01 00:16:27.000 2020-01-02 03:44:48.000 987 99888 50437.5 5043750 987 99888 50437.5 5043750 -32581 32354 4562.3 456230 -126 125 0.38 38 +988 100 10978 99889 2.96696 299.96696 151.46696 15146.69669 2.96696 299.96698 151.46696 15146.69676 2.96696 299.96696 151.46696 15146.696 2020-01-01 2020-01-02 2020-01-01 00:16:28 2020-01-02 03:44:49 2020-01-01 00:16:28.000 2020-01-02 03:44:49.000 988 99889 50438.5 5043850 988 99889 50438.5 5043850 -32580 32355 4563.3 456330 -125 126 1.38 138 +989 100 10979 99890 2.96996 299.96996 151.46996 15146.99699 2.96997 299.96997 151.46997 15146.99706 2.96996 299.96996 151.46996 15146.996 2020-01-01 2020-01-02 2020-01-01 00:16:29 2020-01-02 03:44:50 2020-01-01 00:16:29.000 2020-01-02 03:44:50.000 989 99890 50439.5 5043950 989 99890 50439.5 5043950 -32579 32356 4564.3 456430 -124 127 2.38 238 99 102 10089 99999 0.29729 300.29729 150.29729 15180.02702 0.29729 300.2973 150.29729 15180.02726 0.29729 300.29729 150.29729 15180.02629 2020-01-01 2020-01-02 2020-01-01 00:01:39 2020-01-02 03:46:39 2020-01-01 00:01:39.000 2020-01-02 03:46:39.000 99 99999 50049 5054949 99 99999 50049 5054949 -32470 32465 4628.009900990099 467429 -128 123 -2.801980198019802 -283 -990 100 10980 99891 2.97297 299.97297 151.47297 15147.29729 2.97297 299.97296 151.47297 15147.29735 2.97297 299.97297 151.47297 15147.29700 2020-01-01 2020-01-02 2020-01-01 00:16:30 2020-01-02 03:44:51 2020-01-01 00:16:30.000 2020-01-02 03:44:51.000 990 99891 50440.5 5044050 990 99891 50440.5 5044050 -32578 32357 4565.3 456530 -128 127 0.82 82 -991 100 10981 99892 2.97597 299.97597 151.47597 15147.59759 2.97597 299.97598 151.47597 15147.59795 2.97597 299.97597 151.47597 15147.59700 2020-01-01 2020-01-02 2020-01-01 00:16:31 2020-01-02 03:44:52 2020-01-01 00:16:31.000 2020-01-02 03:44:52.000 991 99892 50441.5 5044150 991 99892 50441.5 5044150 -32577 32358 4566.3 456630 -128 127 -0.74 -74 -992 100 10982 99893 2.97897 299.97897 151.47897 15147.89789 2.97897 299.97897 151.47897 15147.89759 2.97897 299.97897 151.47897 15147.89700 2020-01-01 2020-01-02 2020-01-01 00:16:32 2020-01-02 03:44:53 2020-01-01 00:16:32.000 2020-01-02 03:44:53.000 992 99893 50442.5 5044250 992 99893 50442.5 5044250 -32576 32359 4567.3 456730 -128 124 -2.3 -230 -993 100 10983 99894 2.98198 299.98198 151.48198 15148.19819 2.98198 299.982 151.48198 15148.19823 2.98198 299.98198 151.48198 15148.19800 2020-01-01 2020-01-02 2020-01-01 00:16:33 2020-01-02 03:44:54 2020-01-01 00:16:33.000 2020-01-02 03:44:54.000 993 99894 50443.5 5044350 993 99894 50443.5 5044350 -32575 32360 4568.3 456830 -127 125 -1.3 -130 -994 100 10984 99895 2.98498 299.98498 151.48498 15148.49849 2.98498 299.985 151.48498 15148.49853 2.98498 299.98498 151.48498 15148.49800 2020-01-01 2020-01-02 2020-01-01 00:16:34 2020-01-02 03:44:55 2020-01-01 00:16:34.000 2020-01-02 03:44:55.000 994 99895 50444.5 5044450 994 99895 50444.5 5044450 -32574 32361 4569.3 456930 -126 126 -0.3 -30 -995 100 10985 99896 2.98798 299.98798 151.48798 15148.79879 2.98798 299.98798 151.48798 15148.79882 2.98798 299.98798 151.48798 15148.79800 2020-01-01 2020-01-02 2020-01-01 00:16:35 2020-01-02 03:44:56 2020-01-01 00:16:35.000 2020-01-02 03:44:56.000 995 99896 50445.5 5044550 995 99896 50445.5 5044550 -32573 32362 4570.3 457030 -125 127 0.7 70 -996 100 10986 99897 2.99099 299.99099 151.49099 15149.09909 2.99099 299.991 151.49099 15149.09942 2.99099 299.99099 151.49099 15149.09900 2020-01-01 2020-01-02 2020-01-01 00:16:36 2020-01-02 03:44:57 2020-01-01 00:16:36.000 2020-01-02 03:44:57.000 996 99897 50446.5 5044650 996 99897 50446.5 5044650 -32572 32363 4571.3 457130 -128 127 -0.86 -86 -997 100 10987 99898 2.99399 299.99399 151.49399 15149.39939 2.99399 299.994 151.49399 15149.3991 2.99399 299.99399 151.49399 15149.39900 2020-01-01 2020-01-02 2020-01-01 00:16:37 2020-01-02 03:44:58 2020-01-01 00:16:37.000 2020-01-02 03:44:58.000 997 99898 50447.5 5044750 997 99898 50447.5 5044750 -32571 32364 4572.3 457230 -128 127 -2.42 -242 -998 100 10988 99899 2.99699 299.99699 151.49699 15149.69969 2.99699 299.997 151.49699 15149.6997 2.99699 299.99699 151.49699 15149.69900 2020-01-01 2020-01-02 2020-01-01 00:16:38 2020-01-02 03:44:59 2020-01-01 00:16:38.000 2020-01-02 03:44:59.000 998 99899 50448.5 5044850 998 99899 50448.5 5044850 -32570 32365 4573.3 457330 -128 123 -3.98 -398 +990 100 10980 99891 2.97297 299.97297 151.47297 15147.29729 2.97297 299.97296 151.47297 15147.29735 2.97297 299.97297 151.47297 15147.297 2020-01-01 2020-01-02 2020-01-01 00:16:30 2020-01-02 03:44:51 2020-01-01 00:16:30.000 2020-01-02 03:44:51.000 990 99891 50440.5 5044050 990 99891 50440.5 5044050 -32578 32357 4565.3 456530 -128 127 0.82 82 +991 100 10981 99892 2.97597 299.97597 151.47597 15147.59759 2.97597 299.97598 151.47597 15147.59795 2.97597 299.97597 151.47597 15147.597 2020-01-01 2020-01-02 2020-01-01 00:16:31 2020-01-02 03:44:52 2020-01-01 00:16:31.000 2020-01-02 03:44:52.000 991 99892 50441.5 5044150 991 99892 50441.5 5044150 -32577 32358 4566.3 456630 -128 127 -0.74 -74 +992 100 10982 99893 2.97897 299.97897 151.47897 15147.89789 2.97897 299.97897 151.47897 15147.89759 2.97897 299.97897 151.47897 15147.897 2020-01-01 2020-01-02 2020-01-01 00:16:32 2020-01-02 03:44:53 2020-01-01 00:16:32.000 2020-01-02 03:44:53.000 992 99893 50442.5 5044250 992 99893 50442.5 5044250 -32576 32359 4567.3 456730 -128 124 -2.3 -230 +993 100 10983 99894 2.98198 299.98198 151.48198 15148.19819 2.98198 299.982 151.48198 15148.19823 2.98198 299.98198 151.48198 15148.198 2020-01-01 2020-01-02 2020-01-01 00:16:33 2020-01-02 03:44:54 2020-01-01 00:16:33.000 2020-01-02 03:44:54.000 993 99894 50443.5 5044350 993 99894 50443.5 5044350 -32575 32360 4568.3 456830 -127 125 -1.3 -130 +994 100 10984 99895 2.98498 299.98498 151.48498 15148.49849 2.98498 299.985 151.48498 15148.49853 2.98498 299.98498 151.48498 15148.498 2020-01-01 2020-01-02 2020-01-01 00:16:34 2020-01-02 03:44:55 2020-01-01 00:16:34.000 2020-01-02 03:44:55.000 994 99895 50444.5 5044450 994 99895 50444.5 5044450 -32574 32361 4569.3 456930 -126 126 -0.3 -30 +995 100 10985 99896 2.98798 299.98798 151.48798 15148.79879 2.98798 299.98798 151.48798 15148.79882 2.98798 299.98798 151.48798 15148.798 2020-01-01 2020-01-02 2020-01-01 00:16:35 2020-01-02 03:44:56 2020-01-01 00:16:35.000 2020-01-02 03:44:56.000 995 99896 50445.5 5044550 995 99896 50445.5 5044550 -32573 32362 4570.3 457030 -125 127 0.7 70 +996 100 10986 99897 2.99099 299.99099 151.49099 15149.09909 2.99099 299.991 151.49099 15149.09942 2.99099 299.99099 151.49099 15149.099 2020-01-01 2020-01-02 2020-01-01 00:16:36 2020-01-02 03:44:57 2020-01-01 00:16:36.000 2020-01-02 03:44:57.000 996 99897 50446.5 5044650 996 99897 50446.5 5044650 -32572 32363 4571.3 457130 -128 127 -0.86 -86 +997 100 10987 99898 2.99399 299.99399 151.49399 15149.39939 2.99399 299.994 151.49399 15149.3991 2.99399 299.99399 151.49399 15149.399 2020-01-01 2020-01-02 2020-01-01 00:16:37 2020-01-02 03:44:58 2020-01-01 00:16:37.000 2020-01-02 03:44:58.000 997 99898 50447.5 5044750 997 99898 50447.5 5044750 -32571 32364 4572.3 457230 -128 127 -2.42 -242 +998 100 10988 99899 2.99699 299.99699 151.49699 15149.69969 2.99699 299.997 151.49699 15149.6997 2.99699 299.99699 151.49699 15149.699 2020-01-01 2020-01-02 2020-01-01 00:16:38 2020-01-02 03:44:59 2020-01-01 00:16:38.000 2020-01-02 03:44:59.000 998 99899 50448.5 5044850 998 99899 50448.5 5044850 -32570 32365 4573.3 457330 -128 123 -3.98 -398 ---- select with states ---- -1 1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N -2 1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N -3 1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N -4 1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N -5 1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N -0 2 0 99900 0 300 150 15150 0 300 150 15150 0.00000 300.00000 150 15150.00000 2020-01-01 2020-01-02 2020-01-01 00:00:00 2020-01-02 03:45:00 2020-01-01 00:00:00.000 2020-01-02 03:45:00.000 0 99900 49950 5044950 0 99900 49950 5044950 -32569 32366 4529.009900990099 457430 -127 124 -2.9504950495049505 -298 -1 2 1 9991 0.003 300.003 150.003 15150.3033 0.003 300.003 150.003 15150.30329 0.00300 300.00300 150.003 15150.30300 2020-01-01 2020-01-02 2020-01-01 00:00:01 2020-01-02 03:45:01 2020-01-01 00:00:01.000 2020-01-02 03:45:01.000 1 99901 49951 5045051 1 99901 49951 5045051 -32568 32367 4530.009900990099 457531 -126 125 -1.9504950495049505 -197 +0 2 0 99900 0 300 150 15150 0 300 150 15150 0 300 150 15150 2020-01-01 2020-01-02 2020-01-01 00:00:00 2020-01-02 03:45:00 2020-01-01 00:00:00.000 2020-01-02 03:45:00.000 0 99900 49950 5044950 0 99900 49950 5044950 -32569 32366 4529.009900990099 457430 -127 124 -2.9504950495049505 -298 +1 2 1 9991 0.003 300.003 150.003 15150.3033 0.003 300.003 150.003 15150.30329 0.003 300.003 150.003 15150.303 2020-01-01 2020-01-02 2020-01-01 00:00:01 2020-01-02 03:45:01 2020-01-01 00:00:01.000 2020-01-02 03:45:01.000 1 99901 49951 5045051 1 99901 49951 5045051 -32568 32367 4530.009900990099 457531 -126 125 -1.9504950495049505 -197 10 2 10 99910 0.03003 300.03003 150.03003 15153.03303 0.03003 300.03003 150.03002 15153.03296 0.03003 300.03003 150.03003 15153.03303 2020-01-01 2020-01-02 2020-01-01 00:00:10 2020-01-02 03:45:10 2020-01-01 00:00:10.000 2020-01-02 03:45:10.000 10 99910 49960 5045960 10 99910 49960 5045960 -32559 32376 4539.009900990099 458440 -128 127 -0.5544554455445545 -56 -100 2 100 99001 0.3003 297.3003 148.8003 14880.03003 0.3003 297.3003 148.80029 14880.02962 0.30030 297.30030 148.8003 14880.03000 2020-01-01 2020-01-02 2020-01-01 00:01:40 2020-01-02 03:30:01 2020-01-01 00:01:40.000 2020-01-02 03:30:01.000 100 99001 49550.5 4955050 100 99001 49550.5 4955050 -32469 32466 4986.02 498602 -127 124 -0.86 -86 -101 2 10091 99002 0.3033 297.3033 148.8033 14880.33033 0.3033 297.3033 148.8033 14880.33035 0.30330 297.30330 148.8033 14880.33000 2020-01-01 2020-01-02 2020-01-01 00:01:41 2020-01-02 03:30:02 2020-01-01 00:01:41.000 2020-01-02 03:30:02.000 101 99002 49551.5 4955150 101 99002 49551.5 4955150 -32468 32467 4987.02 498702 -126 125 0.14 14 -102 2 10092 99003 0.3063 297.3063 148.8063 14880.63063 0.3063 297.3063 148.8063 14880.6305 0.30630 297.30630 148.8063 14880.63000 2020-01-01 2020-01-02 2020-01-01 00:01:42 2020-01-02 03:30:03 2020-01-01 00:01:42.000 2020-01-02 03:30:03.000 102 99003 49552.5 4955250 102 99003 49552.5 4955250 -32467 32468 4988.02 498802 -125 126 1.14 114 -103 2 10093 99004 0.3093 297.3093 148.8093 14880.93093 0.3093 297.3093 148.8093 14880.93085 0.30930 297.30930 148.8093 14880.93000 2020-01-01 2020-01-02 2020-01-01 00:01:43 2020-01-02 03:30:04 2020-01-01 00:01:43.000 2020-01-02 03:30:04.000 103 99004 49553.5 4955350 103 99004 49553.5 4955350 -32466 32469 4989.02 498902 -124 127 2.14 214 -104 2 10094 99005 0.31231 297.31231 148.81231 14881.23123 0.31231 297.31232 148.81231 14881.23144 0.31231 297.31231 148.81231 14881.23100 2020-01-01 2020-01-02 2020-01-01 00:01:44 2020-01-02 03:30:05 2020-01-01 00:01:44.000 2020-01-02 03:30:05.000 104 99005 49554.5 4955450 104 99005 49554.5 4955450 -32465 32470 4990.02 499002 -128 127 0.58 58 -105 2 10095 99006 0.31531 297.31531 148.81531 14881.53153 0.31531 297.3153 148.81531 14881.53174 0.31531 297.31531 148.81531 14881.53100 2020-01-01 2020-01-02 2020-01-01 00:01:45 2020-01-02 03:30:06 2020-01-01 00:01:45.000 2020-01-02 03:30:06.000 105 99006 49555.5 4955550 105 99006 49555.5 4955550 -32464 32471 4991.02 499102 -128 123 -0.98 -98 -106 2 10096 99007 0.31831 297.31831 148.81831 14881.83183 0.31831 297.31833 148.81831 14881.83182 0.31831 297.31831 148.81831 14881.83100 2020-01-01 2020-01-02 2020-01-01 00:01:46 2020-01-02 03:30:07 2020-01-01 00:01:46.000 2020-01-02 03:30:07.000 106 99007 49556.5 4955650 106 99007 49556.5 4955650 -32463 32472 4992.02 499202 -127 124 0.02 2 -107 2 10097 99008 0.32132 297.32132 148.82132 14882.13213 0.32132 297.32132 148.82131 14882.13197 0.32132 297.32132 148.82132 14882.13200 2020-01-01 2020-01-02 2020-01-01 00:01:47 2020-01-02 03:30:08 2020-01-01 00:01:47.000 2020-01-02 03:30:08.000 107 99008 49557.5 4955750 107 99008 49557.5 4955750 -32462 32473 4993.02 499302 -126 125 1.02 102 -108 2 10098 99009 0.32432 297.32432 148.82432 14882.43243 0.32432 297.3243 148.82432 14882.43232 0.32432 297.32432 148.82432 14882.43200 2020-01-01 2020-01-02 2020-01-01 00:01:48 2020-01-02 03:30:09 2020-01-01 00:01:48.000 2020-01-02 03:30:09.000 108 99009 49558.5 4955850 108 99009 49558.5 4955850 -32461 32474 4994.02 499402 -125 126 2.02 202 -109 2 10099 99010 0.32732 297.32732 148.82732 14882.73273 0.32732 297.32733 148.82732 14882.7329 0.32732 297.32732 148.82732 14882.73200 2020-01-01 2020-01-02 2020-01-01 00:01:49 2020-01-02 03:30:10 2020-01-01 00:01:49.000 2020-01-02 03:30:10.000 109 99010 49559.5 4955950 109 99010 49559.5 4955950 -32460 32475 4995.02 499502 -124 127 3.02 302 +100 2 100 99001 0.3003 297.3003 148.8003 14880.03003 0.3003 297.3003 148.80029 14880.02962 0.3003 297.3003 148.8003 14880.03 2020-01-01 2020-01-02 2020-01-01 00:01:40 2020-01-02 03:30:01 2020-01-01 00:01:40.000 2020-01-02 03:30:01.000 100 99001 49550.5 4955050 100 99001 49550.5 4955050 -32469 32466 4986.02 498602 -127 124 -0.86 -86 +101 2 10091 99002 0.3033 297.3033 148.8033 14880.33033 0.3033 297.3033 148.8033 14880.33035 0.3033 297.3033 148.8033 14880.33 2020-01-01 2020-01-02 2020-01-01 00:01:41 2020-01-02 03:30:02 2020-01-01 00:01:41.000 2020-01-02 03:30:02.000 101 99002 49551.5 4955150 101 99002 49551.5 4955150 -32468 32467 4987.02 498702 -126 125 0.14 14 +102 2 10092 99003 0.3063 297.3063 148.8063 14880.63063 0.3063 297.3063 148.8063 14880.6305 0.3063 297.3063 148.8063 14880.63 2020-01-01 2020-01-02 2020-01-01 00:01:42 2020-01-02 03:30:03 2020-01-01 00:01:42.000 2020-01-02 03:30:03.000 102 99003 49552.5 4955250 102 99003 49552.5 4955250 -32467 32468 4988.02 498802 -125 126 1.14 114 +103 2 10093 99004 0.3093 297.3093 148.8093 14880.93093 0.3093 297.3093 148.8093 14880.93085 0.3093 297.3093 148.8093 14880.93 2020-01-01 2020-01-02 2020-01-01 00:01:43 2020-01-02 03:30:04 2020-01-01 00:01:43.000 2020-01-02 03:30:04.000 103 99004 49553.5 4955350 103 99004 49553.5 4955350 -32466 32469 4989.02 498902 -124 127 2.14 214 +104 2 10094 99005 0.31231 297.31231 148.81231 14881.23123 0.31231 297.31232 148.81231 14881.23144 0.31231 297.31231 148.81231 14881.231 2020-01-01 2020-01-02 2020-01-01 00:01:44 2020-01-02 03:30:05 2020-01-01 00:01:44.000 2020-01-02 03:30:05.000 104 99005 49554.5 4955450 104 99005 49554.5 4955450 -32465 32470 4990.02 499002 -128 127 0.58 58 +105 2 10095 99006 0.31531 297.31531 148.81531 14881.53153 0.31531 297.3153 148.81531 14881.53174 0.31531 297.31531 148.81531 14881.531 2020-01-01 2020-01-02 2020-01-01 00:01:45 2020-01-02 03:30:06 2020-01-01 00:01:45.000 2020-01-02 03:30:06.000 105 99006 49555.5 4955550 105 99006 49555.5 4955550 -32464 32471 4991.02 499102 -128 123 -0.98 -98 +106 2 10096 99007 0.31831 297.31831 148.81831 14881.83183 0.31831 297.31833 148.81831 14881.83182 0.31831 297.31831 148.81831 14881.831 2020-01-01 2020-01-02 2020-01-01 00:01:46 2020-01-02 03:30:07 2020-01-01 00:01:46.000 2020-01-02 03:30:07.000 106 99007 49556.5 4955650 106 99007 49556.5 4955650 -32463 32472 4992.02 499202 -127 124 0.02 2 +107 2 10097 99008 0.32132 297.32132 148.82132 14882.13213 0.32132 297.32132 148.82131 14882.13197 0.32132 297.32132 148.82132 14882.132 2020-01-01 2020-01-02 2020-01-01 00:01:47 2020-01-02 03:30:08 2020-01-01 00:01:47.000 2020-01-02 03:30:08.000 107 99008 49557.5 4955750 107 99008 49557.5 4955750 -32462 32473 4993.02 499302 -126 125 1.02 102 +108 2 10098 99009 0.32432 297.32432 148.82432 14882.43243 0.32432 297.3243 148.82432 14882.43232 0.32432 297.32432 148.82432 14882.432 2020-01-01 2020-01-02 2020-01-01 00:01:48 2020-01-02 03:30:09 2020-01-01 00:01:48.000 2020-01-02 03:30:09.000 108 99009 49558.5 4955850 108 99009 49558.5 4955850 -32461 32474 4994.02 499402 -125 126 2.02 202 +109 2 10099 99010 0.32732 297.32732 148.82732 14882.73273 0.32732 297.32733 148.82732 14882.7329 0.32732 297.32732 148.82732 14882.732 2020-01-01 2020-01-02 2020-01-01 00:01:49 2020-01-02 03:30:10 2020-01-01 00:01:49.000 2020-01-02 03:30:10.000 109 99010 49559.5 4955950 109 99010 49559.5 4955950 -32460 32475 4995.02 499502 -124 127 3.02 302 11 2 10001 99911 0.03303 300.03303 150.03303 15153.33633 0.03303 300.03302 150.03303 15153.33627 0.03303 300.03303 150.03303 15153.33603 2020-01-01 2020-01-02 2020-01-01 00:00:11 2020-01-02 03:45:11 2020-01-01 00:00:11.000 2020-01-02 03:45:11.000 11 99911 49961 5046061 11 99911 49961 5046061 -32558 32377 4540.009900990099 458541 -128 123 -2.089108910891089 -211 -110 2 10100 99011 0.33033 297.33033 148.83033 14883.03303 0.33033 297.33032 148.83033 14883.03321 0.33033 297.33033 148.83033 14883.03300 2020-01-01 2020-01-02 2020-01-01 00:01:50 2020-01-02 03:30:11 2020-01-01 00:01:50.000 2020-01-02 03:30:11.000 110 99011 49560.5 4956050 110 99011 49560.5 4956050 -32459 32476 4996.02 499602 -128 127 1.46 146 -111 2 10101 99012 0.33333 297.33333 148.83333 14883.33333 0.33333 297.33334 148.83333 14883.33329 0.33333 297.33333 148.83333000000002 14883.33300 2020-01-01 2020-01-02 2020-01-01 00:01:51 2020-01-02 03:30:12 2020-01-01 00:01:51.000 2020-01-02 03:30:12.000 111 99012 49561.5 4956150 111 99012 49561.5 4956150 -32458 32477 4997.02 499702 -128 123 -0.1 -10 -112 2 10102 99013 0.33633 297.33633 148.83633 14883.63363 0.33633 297.33633 148.83633 14883.63348 0.33633 297.33633 148.83633 14883.63300 2020-01-01 2020-01-02 2020-01-01 00:01:52 2020-01-02 03:30:13 2020-01-01 00:01:52.000 2020-01-02 03:30:13.000 112 99013 49562.5 4956250 112 99013 49562.5 4956250 -32457 32478 4998.02 499802 -127 124 0.9 90 -113 2 10103 99014 0.33933 297.33933 148.83933 14883.93393 0.33933 297.33932 148.83933 14883.9338 0.33933 297.33933 148.83933000000002 14883.93300 2020-01-01 2020-01-02 2020-01-01 00:01:53 2020-01-02 03:30:14 2020-01-01 00:01:53.000 2020-01-02 03:30:14.000 113 99014 49563.5 4956350 113 99014 49563.5 4956350 -32456 32479 4999.02 499902 -126 125 1.9 190 -114 2 10104 99015 0.34234 297.34234 148.84234 14884.23423 0.34234 297.34235 148.84234 14884.23437 0.34234 297.34234 148.84234 14884.23400 2020-01-01 2020-01-02 2020-01-01 00:01:54 2020-01-02 03:30:15 2020-01-01 00:01:54.000 2020-01-02 03:30:15.000 114 99015 49564.5 4956450 114 99015 49564.5 4956450 -32455 32480 5000.02 500002 -125 126 2.9 290 -115 2 10105 99016 0.34534 297.34534 148.84534 14884.53453 0.34534 297.34534 148.84534 14884.53468 0.34534 297.34534 148.84534 14884.53400 2020-01-01 2020-01-02 2020-01-01 00:01:55 2020-01-02 03:30:16 2020-01-01 00:01:55.000 2020-01-02 03:30:16.000 115 99016 49565.5 4956550 115 99016 49565.5 4956550 -32454 32481 5001.02 500102 -124 127 3.9 390 -116 2 10106 99017 0.34834 297.34834 148.84834 14884.83483 0.34834 297.34836 148.84834 14884.83476 0.34834 297.34834 148.84834 14884.83400 2020-01-01 2020-01-02 2020-01-01 00:01:56 2020-01-02 03:30:17 2020-01-01 00:01:56.000 2020-01-02 03:30:17.000 116 99017 49566.5 4956650 116 99017 49566.5 4956650 -32453 32482 5002.02 500202 -128 127 2.34 234 -117 2 10107 99018 0.35135 297.35135 148.85135 14885.13513 0.35135 297.35135 148.85134 14885.13495 0.35135 297.35135 148.85135 14885.13500 2020-01-01 2020-01-02 2020-01-01 00:01:57 2020-01-02 03:30:18 2020-01-01 00:01:57.000 2020-01-02 03:30:18.000 117 99018 49567.5 4956750 117 99018 49567.5 4956750 -32452 32483 5003.02 500302 -128 123 0.78 78 -118 2 10108 99019 0.35435 297.35435 148.85435 14885.43543 0.35435 297.35434 148.85435 14885.43526 0.35435 297.35435 148.85434999999998 14885.43500 2020-01-01 2020-01-02 2020-01-01 00:01:58 2020-01-02 03:30:19 2020-01-01 00:01:58.000 2020-01-02 03:30:19.000 118 99019 49568.5 4956850 118 99019 49568.5 4956850 -32451 32484 5004.02 500402 -127 124 1.78 178 -119 2 10109 99020 0.35735 297.35735 148.85735 14885.73573 0.35735 297.35736 148.85736 14885.736 0.35735 297.35735 148.85735 14885.73500 2020-01-01 2020-01-02 2020-01-01 00:01:59 2020-01-02 03:30:20 2020-01-01 00:01:59.000 2020-01-02 03:30:20.000 119 99020 49569.5 4956950 119 99020 49569.5 4956950 -32450 32485 5005.02 500502 -126 125 2.78 278 +110 2 10100 99011 0.33033 297.33033 148.83033 14883.03303 0.33033 297.33032 148.83033 14883.03321 0.33033 297.33033 148.83033 14883.033 2020-01-01 2020-01-02 2020-01-01 00:01:50 2020-01-02 03:30:11 2020-01-01 00:01:50.000 2020-01-02 03:30:11.000 110 99011 49560.5 4956050 110 99011 49560.5 4956050 -32459 32476 4996.02 499602 -128 127 1.46 146 +111 2 10101 99012 0.33333 297.33333 148.83333 14883.33333 0.33333 297.33334 148.83333 14883.33329 0.33333 297.33333 148.83333000000002 14883.333 2020-01-01 2020-01-02 2020-01-01 00:01:51 2020-01-02 03:30:12 2020-01-01 00:01:51.000 2020-01-02 03:30:12.000 111 99012 49561.5 4956150 111 99012 49561.5 4956150 -32458 32477 4997.02 499702 -128 123 -0.1 -10 +112 2 10102 99013 0.33633 297.33633 148.83633 14883.63363 0.33633 297.33633 148.83633 14883.63348 0.33633 297.33633 148.83633 14883.633 2020-01-01 2020-01-02 2020-01-01 00:01:52 2020-01-02 03:30:13 2020-01-01 00:01:52.000 2020-01-02 03:30:13.000 112 99013 49562.5 4956250 112 99013 49562.5 4956250 -32457 32478 4998.02 499802 -127 124 0.9 90 +113 2 10103 99014 0.33933 297.33933 148.83933 14883.93393 0.33933 297.33932 148.83933 14883.9338 0.33933 297.33933 148.83933000000002 14883.933 2020-01-01 2020-01-02 2020-01-01 00:01:53 2020-01-02 03:30:14 2020-01-01 00:01:53.000 2020-01-02 03:30:14.000 113 99014 49563.5 4956350 113 99014 49563.5 4956350 -32456 32479 4999.02 499902 -126 125 1.9 190 +114 2 10104 99015 0.34234 297.34234 148.84234 14884.23423 0.34234 297.34235 148.84234 14884.23437 0.34234 297.34234 148.84234 14884.234 2020-01-01 2020-01-02 2020-01-01 00:01:54 2020-01-02 03:30:15 2020-01-01 00:01:54.000 2020-01-02 03:30:15.000 114 99015 49564.5 4956450 114 99015 49564.5 4956450 -32455 32480 5000.02 500002 -125 126 2.9 290 +115 2 10105 99016 0.34534 297.34534 148.84534 14884.53453 0.34534 297.34534 148.84534 14884.53468 0.34534 297.34534 148.84534 14884.534 2020-01-01 2020-01-02 2020-01-01 00:01:55 2020-01-02 03:30:16 2020-01-01 00:01:55.000 2020-01-02 03:30:16.000 115 99016 49565.5 4956550 115 99016 49565.5 4956550 -32454 32481 5001.02 500102 -124 127 3.9 390 +116 2 10106 99017 0.34834 297.34834 148.84834 14884.83483 0.34834 297.34836 148.84834 14884.83476 0.34834 297.34834 148.84834 14884.834 2020-01-01 2020-01-02 2020-01-01 00:01:56 2020-01-02 03:30:17 2020-01-01 00:01:56.000 2020-01-02 03:30:17.000 116 99017 49566.5 4956650 116 99017 49566.5 4956650 -32453 32482 5002.02 500202 -128 127 2.34 234 +117 2 10107 99018 0.35135 297.35135 148.85135 14885.13513 0.35135 297.35135 148.85134 14885.13495 0.35135 297.35135 148.85135 14885.135 2020-01-01 2020-01-02 2020-01-01 00:01:57 2020-01-02 03:30:18 2020-01-01 00:01:57.000 2020-01-02 03:30:18.000 117 99018 49567.5 4956750 117 99018 49567.5 4956750 -32452 32483 5003.02 500302 -128 123 0.78 78 +118 2 10108 99019 0.35435 297.35435 148.85435 14885.43543 0.35435 297.35434 148.85435 14885.43526 0.35435 297.35435 148.85434999999998 14885.435 2020-01-01 2020-01-02 2020-01-01 00:01:58 2020-01-02 03:30:19 2020-01-01 00:01:58.000 2020-01-02 03:30:19.000 118 99019 49568.5 4956850 118 99019 49568.5 4956850 -32451 32484 5004.02 500402 -127 124 1.78 178 +119 2 10109 99020 0.35735 297.35735 148.85735 14885.73573 0.35735 297.35736 148.85736 14885.736 0.35735 297.35735 148.85735 14885.735 2020-01-01 2020-01-02 2020-01-01 00:01:59 2020-01-02 03:30:20 2020-01-01 00:01:59.000 2020-01-02 03:30:20.000 119 99020 49569.5 4956950 119 99020 49569.5 4956950 -32450 32485 5005.02 500502 -126 125 2.78 278 12 2 10002 99912 0.03603 300.03603 150.03603 15153.63963 0.03603 300.03604 150.03603 15153.6399 0.03603 300.03603 150.03603 15153.63903 2020-01-01 2020-01-02 2020-01-01 00:00:12 2020-01-02 03:45:12 2020-01-01 00:00:12.000 2020-01-02 03:45:12.000 12 99912 49962 5046162 12 99912 49962 5046162 -32557 32378 4541.009900990099 458642 -127 124 -1.0891089108910892 -110 -120 2 10110 99021 0.36036 297.36036 148.86036 14886.03603 0.36036 297.36035 148.86036 14886.03615 0.36036 297.36036 148.86036000000001 14886.03600 2020-01-01 2020-01-02 2020-01-01 00:02:00 2020-01-02 03:30:21 2020-01-01 00:02:00.000 2020-01-02 03:30:21.000 120 99021 49570.5 4957050 120 99021 49570.5 4957050 -32449 32486 5006.02 500602 -125 126 3.78 378 -121 2 10111 99022 0.36336 297.36336 148.86336 14886.33633 0.36336 297.36337 148.86336 14886.33627 0.36336 297.36336 148.86336 14886.33600 2020-01-01 2020-01-02 2020-01-01 00:02:01 2020-01-02 03:30:22 2020-01-01 00:02:01.000 2020-01-02 03:30:22.000 121 99022 49571.5 4957150 121 99022 49571.5 4957150 -32448 32487 5007.02 500702 -124 127 4.78 478 -122 2 10112 99023 0.36636 297.36636 148.86636 14886.63663 0.36636 297.36636 148.86636 14886.63642 0.36636 297.36636 148.86636000000001 14886.63600 2020-01-01 2020-01-02 2020-01-01 00:02:02 2020-01-02 03:30:23 2020-01-01 00:02:02.000 2020-01-02 03:30:23.000 122 99023 49572.5 4957250 122 99023 49572.5 4957250 -32447 32488 5008.02 500802 -128 127 3.22 322 -123 2 10113 99024 0.36936 297.36936 148.86936 14886.93693 0.36936 297.36935 148.86936 14886.93673 0.36936 297.36936 148.86936 14886.93600 2020-01-01 2020-01-02 2020-01-01 00:02:03 2020-01-02 03:30:24 2020-01-01 00:02:03.000 2020-01-02 03:30:24.000 123 99024 49573.5 4957350 123 99024 49573.5 4957350 -32446 32489 5009.02 500902 -128 127 1.66 166 -124 2 10114 99025 0.37237 297.37237 148.87237 14887.23723 0.37237 297.37238 148.87237 14887.23746 0.37237 297.37237 148.87237 14887.23700 2020-01-01 2020-01-02 2020-01-01 00:02:04 2020-01-02 03:30:25 2020-01-01 00:02:04.000 2020-01-02 03:30:25.000 124 99025 49574.5 4957450 124 99025 49574.5 4957450 -32445 32490 5010.02 501002 -128 124 0.1 10 -125 2 10115 99026 0.37537 297.37537 148.87537 14887.53753 0.37537 297.37537 148.87537 14887.53762 0.37537 297.37537 148.87537 14887.53700 2020-01-01 2020-01-02 2020-01-01 00:02:05 2020-01-02 03:30:26 2020-01-01 00:02:05.000 2020-01-02 03:30:26.000 125 99026 49575.5 4957550 125 99026 49575.5 4957550 -32444 32491 5011.02 501102 -127 125 1.1 110 -126 2 10116 99027 0.37837 297.37837 148.87837 14887.83783 0.37837 297.3784 148.87837 14887.83774 0.37837 297.37837 148.87837 14887.83700 2020-01-01 2020-01-02 2020-01-01 00:02:06 2020-01-02 03:30:27 2020-01-01 00:02:06.000 2020-01-02 03:30:27.000 126 99027 49576.5 4957650 126 99027 49576.5 4957650 -32443 32492 5012.02 501202 -126 126 2.1 210 -127 2 10117 99028 0.38138 297.38138 148.88138 14888.13813 0.38138 297.38138 148.88137 14888.13789 0.38138 297.38138 148.88138 14888.13800 2020-01-01 2020-01-02 2020-01-01 00:02:07 2020-01-02 03:30:28 2020-01-01 00:02:07.000 2020-01-02 03:30:28.000 127 99028 49577.5 4957750 127 99028 49577.5 4957750 -32442 32493 5013.02 501302 -125 127 3.1 310 -128 2 10118 99029 0.38438 297.38438 148.88438 14888.43843 0.38438 297.3844 148.88438 14888.43862 0.38438 297.38438 148.88438 14888.43800 2020-01-01 2020-01-02 2020-01-01 00:02:08 2020-01-02 03:30:29 2020-01-01 00:02:08.000 2020-01-02 03:30:29.000 128 99029 49578.5 4957850 128 99029 49578.5 4957850 -32441 32494 5014.02 501402 -128 127 1.54 154 -129 2 10119 99030 0.38738 297.38738 148.88738 14888.73873 0.38738 297.3874 148.88738 14888.73894 0.38738 297.38738 148.88738 14888.73800 2020-01-01 2020-01-02 2020-01-01 00:02:09 2020-01-02 03:30:30 2020-01-01 00:02:09.000 2020-01-02 03:30:30.000 129 99030 49579.5 4957950 129 99030 49579.5 4957950 -32440 32495 5015.02 501502 -128 127 -0.02 -2 +120 2 10110 99021 0.36036 297.36036 148.86036 14886.03603 0.36036 297.36035 148.86036 14886.03615 0.36036 297.36036 148.86036000000001 14886.036 2020-01-01 2020-01-02 2020-01-01 00:02:00 2020-01-02 03:30:21 2020-01-01 00:02:00.000 2020-01-02 03:30:21.000 120 99021 49570.5 4957050 120 99021 49570.5 4957050 -32449 32486 5006.02 500602 -125 126 3.78 378 +121 2 10111 99022 0.36336 297.36336 148.86336 14886.33633 0.36336 297.36337 148.86336 14886.33627 0.36336 297.36336 148.86336 14886.336 2020-01-01 2020-01-02 2020-01-01 00:02:01 2020-01-02 03:30:22 2020-01-01 00:02:01.000 2020-01-02 03:30:22.000 121 99022 49571.5 4957150 121 99022 49571.5 4957150 -32448 32487 5007.02 500702 -124 127 4.78 478 +122 2 10112 99023 0.36636 297.36636 148.86636 14886.63663 0.36636 297.36636 148.86636 14886.63642 0.36636 297.36636 148.86636000000001 14886.636 2020-01-01 2020-01-02 2020-01-01 00:02:02 2020-01-02 03:30:23 2020-01-01 00:02:02.000 2020-01-02 03:30:23.000 122 99023 49572.5 4957250 122 99023 49572.5 4957250 -32447 32488 5008.02 500802 -128 127 3.22 322 +123 2 10113 99024 0.36936 297.36936 148.86936 14886.93693 0.36936 297.36935 148.86936 14886.93673 0.36936 297.36936 148.86936 14886.936 2020-01-01 2020-01-02 2020-01-01 00:02:03 2020-01-02 03:30:24 2020-01-01 00:02:03.000 2020-01-02 03:30:24.000 123 99024 49573.5 4957350 123 99024 49573.5 4957350 -32446 32489 5009.02 500902 -128 127 1.66 166 +124 2 10114 99025 0.37237 297.37237 148.87237 14887.23723 0.37237 297.37238 148.87237 14887.23746 0.37237 297.37237 148.87237 14887.237 2020-01-01 2020-01-02 2020-01-01 00:02:04 2020-01-02 03:30:25 2020-01-01 00:02:04.000 2020-01-02 03:30:25.000 124 99025 49574.5 4957450 124 99025 49574.5 4957450 -32445 32490 5010.02 501002 -128 124 0.1 10 +125 2 10115 99026 0.37537 297.37537 148.87537 14887.53753 0.37537 297.37537 148.87537 14887.53762 0.37537 297.37537 148.87537 14887.537 2020-01-01 2020-01-02 2020-01-01 00:02:05 2020-01-02 03:30:26 2020-01-01 00:02:05.000 2020-01-02 03:30:26.000 125 99026 49575.5 4957550 125 99026 49575.5 4957550 -32444 32491 5011.02 501102 -127 125 1.1 110 +126 2 10116 99027 0.37837 297.37837 148.87837 14887.83783 0.37837 297.3784 148.87837 14887.83774 0.37837 297.37837 148.87837 14887.837 2020-01-01 2020-01-02 2020-01-01 00:02:06 2020-01-02 03:30:27 2020-01-01 00:02:06.000 2020-01-02 03:30:27.000 126 99027 49576.5 4957650 126 99027 49576.5 4957650 -32443 32492 5012.02 501202 -126 126 2.1 210 +127 2 10117 99028 0.38138 297.38138 148.88138 14888.13813 0.38138 297.38138 148.88137 14888.13789 0.38138 297.38138 148.88138 14888.138 2020-01-01 2020-01-02 2020-01-01 00:02:07 2020-01-02 03:30:28 2020-01-01 00:02:07.000 2020-01-02 03:30:28.000 127 99028 49577.5 4957750 127 99028 49577.5 4957750 -32442 32493 5013.02 501302 -125 127 3.1 310 +128 2 10118 99029 0.38438 297.38438 148.88438 14888.43843 0.38438 297.3844 148.88438 14888.43862 0.38438 297.38438 148.88438 14888.438 2020-01-01 2020-01-02 2020-01-01 00:02:08 2020-01-02 03:30:29 2020-01-01 00:02:08.000 2020-01-02 03:30:29.000 128 99029 49578.5 4957850 128 99029 49578.5 4957850 -32441 32494 5014.02 501402 -128 127 1.54 154 +129 2 10119 99030 0.38738 297.38738 148.88738 14888.73873 0.38738 297.3874 148.88738 14888.73894 0.38738 297.38738 148.88738 14888.738 2020-01-01 2020-01-02 2020-01-01 00:02:09 2020-01-02 03:30:30 2020-01-01 00:02:09.000 2020-01-02 03:30:30.000 129 99030 49579.5 4957950 129 99030 49579.5 4957950 -32440 32495 5015.02 501502 -128 127 -0.02 -2 13 2 10003 99913 0.03903 300.03903 150.03903 15153.94294 0.03903 300.03903 150.03903 15153.94255 0.03903 300.03903 150.03903 15153.94203 2020-01-01 2020-01-02 2020-01-01 00:00:13 2020-01-02 03:45:13 2020-01-01 00:00:13.000 2020-01-02 03:45:13.000 13 99913 49963 5046263 13 99913 49963 5046263 -32556 32379 4542.009900990099 458743 -126 125 -0.0891089108910891 -9 -130 2 10120 99031 0.39039 297.39039 148.89039 14889.03903 0.39039 297.39038 148.89039 14889.03909 0.39039 297.39039 148.89039 14889.03900 2020-01-01 2020-01-02 2020-01-01 00:02:10 2020-01-02 03:30:31 2020-01-01 00:02:10.000 2020-01-02 03:30:31.000 130 99031 49580.5 4958050 130 99031 49580.5 4958050 -32439 32496 5016.02 501602 -128 123 -1.58 -158 -131 2 10121 99032 0.39339 297.39339 148.89339 14889.33933 0.39339 297.3934 148.89339 14889.33921 0.39339 297.39339 148.89339 14889.33900 2020-01-01 2020-01-02 2020-01-01 00:02:11 2020-01-02 03:30:32 2020-01-01 00:02:11.000 2020-01-02 03:30:32.000 131 99032 49581.5 4958150 131 99032 49581.5 4958150 -32438 32497 5017.02 501702 -127 124 -0.58 -58 -132 2 10122 99033 0.39639 297.39639 148.89639 14889.63963 0.39639 297.3964 148.89639 14889.63936 0.39639 297.39639 148.89639 14889.63900 2020-01-01 2020-01-02 2020-01-01 00:02:12 2020-01-02 03:30:33 2020-01-01 00:02:12.000 2020-01-02 03:30:33.000 132 99033 49582.5 4958250 132 99033 49582.5 4958250 -32437 32498 5018.02 501802 -126 125 0.42 42 -133 2 10123 99034 0.39939 297.39939 148.89939 14889.93993 0.39939 297.3994 148.8994 14889.94009 0.39939 297.39939 148.89939 14889.93900 2020-01-01 2020-01-02 2020-01-01 00:02:13 2020-01-02 03:30:34 2020-01-01 00:02:13.000 2020-01-02 03:30:34.000 133 99034 49583.5 4958350 133 99034 49583.5 4958350 -32436 32499 5019.02 501902 -125 126 1.42 142 -134 2 10124 99035 0.4024 297.4024 148.9024 14890.24024 0.4024 297.4024 148.9024 14890.24041 0.40240 297.40240 148.9024 14890.24000 2020-01-01 2020-01-02 2020-01-01 00:02:14 2020-01-02 03:30:35 2020-01-01 00:02:14.000 2020-01-02 03:30:35.000 134 99035 49584.5 4958450 134 99035 49584.5 4958450 -32435 32500 5020.02 502002 -124 127 2.42 242 -135 2 10125 99036 0.4054 297.4054 148.9054 14890.54054 0.4054 297.4054 148.9054 14890.54059 0.40540 297.40540 148.90540000000001 14890.54000 2020-01-01 2020-01-02 2020-01-01 00:02:15 2020-01-02 03:30:36 2020-01-01 00:02:15.000 2020-01-02 03:30:36.000 135 99036 49585.5 4958550 135 99036 49585.5 4958550 -32434 32501 5021.02 502102 -128 127 0.86 86 -136 2 10126 99037 0.4084 297.4084 148.9084 14890.84084 0.4084 297.40842 148.9084 14890.84068 0.40840 297.40840 148.9084 14890.84000 2020-01-01 2020-01-02 2020-01-01 00:02:16 2020-01-02 03:30:37 2020-01-01 00:02:16.000 2020-01-02 03:30:37.000 136 99037 49586.5 4958650 136 99037 49586.5 4958650 -32433 32502 5022.02 502202 -128 123 -0.7 -70 -137 2 10127 99038 0.41141 297.41141 148.91141 14891.14114 0.41141 297.4114 148.9114 14891.14099 0.41141 297.41141 148.91141 14891.14100 2020-01-01 2020-01-02 2020-01-01 00:02:17 2020-01-02 03:30:38 2020-01-01 00:02:17.000 2020-01-02 03:30:38.000 137 99038 49587.5 4958750 137 99038 49587.5 4958750 -32432 32503 5023.02 502302 -127 124 0.3 30 -138 2 10128 99039 0.41441 297.41441 148.91441 14891.44144 0.41441 297.41443 148.91441 14891.44157 0.41441 297.41441 148.91441 14891.44100 2020-01-01 2020-01-02 2020-01-01 00:02:18 2020-01-02 03:30:39 2020-01-01 00:02:18.000 2020-01-02 03:30:39.000 138 99039 49588.5 4958850 138 99039 49588.5 4958850 -32431 32504 5024.02 502402 -126 125 1.3 130 -139 2 10129 99040 0.41741 297.41741 148.91741 14891.74174 0.41741 297.41742 148.91741 14891.74188 0.41741 297.41741 148.91741 14891.74100 2020-01-01 2020-01-02 2020-01-01 00:02:19 2020-01-02 03:30:40 2020-01-01 00:02:19.000 2020-01-02 03:30:40.000 139 99040 49589.5 4958950 139 99040 49589.5 4958950 -32430 32505 5025.02 502502 -125 126 2.3 230 +130 2 10120 99031 0.39039 297.39039 148.89039 14889.03903 0.39039 297.39038 148.89039 14889.03909 0.39039 297.39039 148.89039 14889.039 2020-01-01 2020-01-02 2020-01-01 00:02:10 2020-01-02 03:30:31 2020-01-01 00:02:10.000 2020-01-02 03:30:31.000 130 99031 49580.5 4958050 130 99031 49580.5 4958050 -32439 32496 5016.02 501602 -128 123 -1.58 -158 +131 2 10121 99032 0.39339 297.39339 148.89339 14889.33933 0.39339 297.3934 148.89339 14889.33921 0.39339 297.39339 148.89339 14889.339 2020-01-01 2020-01-02 2020-01-01 00:02:11 2020-01-02 03:30:32 2020-01-01 00:02:11.000 2020-01-02 03:30:32.000 131 99032 49581.5 4958150 131 99032 49581.5 4958150 -32438 32497 5017.02 501702 -127 124 -0.58 -58 +132 2 10122 99033 0.39639 297.39639 148.89639 14889.63963 0.39639 297.3964 148.89639 14889.63936 0.39639 297.39639 148.89639 14889.639 2020-01-01 2020-01-02 2020-01-01 00:02:12 2020-01-02 03:30:33 2020-01-01 00:02:12.000 2020-01-02 03:30:33.000 132 99033 49582.5 4958250 132 99033 49582.5 4958250 -32437 32498 5018.02 501802 -126 125 0.42 42 +133 2 10123 99034 0.39939 297.39939 148.89939 14889.93993 0.39939 297.3994 148.8994 14889.94009 0.39939 297.39939 148.89939 14889.939 2020-01-01 2020-01-02 2020-01-01 00:02:13 2020-01-02 03:30:34 2020-01-01 00:02:13.000 2020-01-02 03:30:34.000 133 99034 49583.5 4958350 133 99034 49583.5 4958350 -32436 32499 5019.02 501902 -125 126 1.42 142 +134 2 10124 99035 0.4024 297.4024 148.9024 14890.24024 0.4024 297.4024 148.9024 14890.24041 0.4024 297.4024 148.9024 14890.24 2020-01-01 2020-01-02 2020-01-01 00:02:14 2020-01-02 03:30:35 2020-01-01 00:02:14.000 2020-01-02 03:30:35.000 134 99035 49584.5 4958450 134 99035 49584.5 4958450 -32435 32500 5020.02 502002 -124 127 2.42 242 +135 2 10125 99036 0.4054 297.4054 148.9054 14890.54054 0.4054 297.4054 148.9054 14890.54059 0.4054 297.4054 148.90540000000001 14890.54 2020-01-01 2020-01-02 2020-01-01 00:02:15 2020-01-02 03:30:36 2020-01-01 00:02:15.000 2020-01-02 03:30:36.000 135 99036 49585.5 4958550 135 99036 49585.5 4958550 -32434 32501 5021.02 502102 -128 127 0.86 86 +136 2 10126 99037 0.4084 297.4084 148.9084 14890.84084 0.4084 297.40842 148.9084 14890.84068 0.4084 297.4084 148.9084 14890.84 2020-01-01 2020-01-02 2020-01-01 00:02:16 2020-01-02 03:30:37 2020-01-01 00:02:16.000 2020-01-02 03:30:37.000 136 99037 49586.5 4958650 136 99037 49586.5 4958650 -32433 32502 5022.02 502202 -128 123 -0.7 -70 +137 2 10127 99038 0.41141 297.41141 148.91141 14891.14114 0.41141 297.4114 148.9114 14891.14099 0.41141 297.41141 148.91141 14891.141 2020-01-01 2020-01-02 2020-01-01 00:02:17 2020-01-02 03:30:38 2020-01-01 00:02:17.000 2020-01-02 03:30:38.000 137 99038 49587.5 4958750 137 99038 49587.5 4958750 -32432 32503 5023.02 502302 -127 124 0.3 30 +138 2 10128 99039 0.41441 297.41441 148.91441 14891.44144 0.41441 297.41443 148.91441 14891.44157 0.41441 297.41441 148.91441 14891.441 2020-01-01 2020-01-02 2020-01-01 00:02:18 2020-01-02 03:30:39 2020-01-01 00:02:18.000 2020-01-02 03:30:39.000 138 99039 49588.5 4958850 138 99039 49588.5 4958850 -32431 32504 5024.02 502402 -126 125 1.3 130 +139 2 10129 99040 0.41741 297.41741 148.91741 14891.74174 0.41741 297.41742 148.91741 14891.74188 0.41741 297.41741 148.91741 14891.741 2020-01-01 2020-01-02 2020-01-01 00:02:19 2020-01-02 03:30:40 2020-01-01 00:02:19.000 2020-01-02 03:30:40.000 139 99040 49589.5 4958950 139 99040 49589.5 4958950 -32430 32505 5025.02 502502 -125 126 2.3 230 14 2 10004 99914 0.04204 300.04204 150.04204 15154.24624 0.04204 300.04205 150.04204 15154.2463 0.04204 300.04204 150.04204 15154.24604 2020-01-01 2020-01-02 2020-01-01 00:00:14 2020-01-02 03:45:14 2020-01-01 00:00:14.000 2020-01-02 03:45:14.000 14 99914 49964 5046364 14 99914 49964 5046364 -32555 32380 4543.009900990099 458844 -125 126 0.9108910891089109 92 -140 2 10130 99041 0.42042 297.42042 148.92042 14892.04204 0.42042 297.4204 148.92042 14892.04206 0.42042 297.42042 148.92042 14892.04200 2020-01-01 2020-01-02 2020-01-01 00:02:20 2020-01-02 03:30:41 2020-01-01 00:02:20.000 2020-01-02 03:30:41.000 140 99041 49590.5 4959050 140 99041 49590.5 4959050 -32429 32506 5026.02 502602 -124 127 3.3 330 -141 2 10131 99042 0.42342 297.42342 148.92342 14892.34234 0.42342 297.42343 148.92342 14892.34215 0.42342 297.42342 148.92342 14892.34200 2020-01-01 2020-01-02 2020-01-01 00:02:21 2020-01-02 03:30:42 2020-01-01 00:02:21.000 2020-01-02 03:30:42.000 141 99042 49591.5 4959150 141 99042 49591.5 4959150 -32428 32507 5027.02 502702 -128 127 1.74 174 -142 2 10132 99043 0.42642 297.42642 148.92642 14892.64264 0.42642 297.42642 148.92642 14892.64246 0.42642 297.42642 148.92642 14892.64200 2020-01-01 2020-01-02 2020-01-01 00:02:22 2020-01-02 03:30:43 2020-01-01 00:02:22.000 2020-01-02 03:30:43.000 142 99043 49592.5 4959250 142 99043 49592.5 4959250 -32427 32508 5028.02 502802 -128 123 0.18 18 -143 2 10133 99044 0.42942 297.42942 148.92942 14892.94294 0.42942 297.42944 148.92943 14892.94304 0.42942 297.42942 148.92942 14892.94200 2020-01-01 2020-01-02 2020-01-01 00:02:23 2020-01-02 03:30:44 2020-01-01 00:02:23.000 2020-01-02 03:30:44.000 143 99044 49593.5 4959350 143 99044 49593.5 4959350 -32426 32509 5029.02 502902 -127 124 1.18 118 -144 2 10134 99045 0.43243 297.43243 148.93243 14893.24324 0.43243 297.43243 148.93243 14893.24338 0.43243 297.43243 148.93243 14893.24300 2020-01-01 2020-01-02 2020-01-01 00:02:24 2020-01-02 03:30:45 2020-01-01 00:02:24.000 2020-01-02 03:30:45.000 144 99045 49594.5 4959450 144 99045 49594.5 4959450 -32425 32510 5030.02 503002 -126 125 2.18 218 -145 2 10135 99046 0.43543 297.43543 148.93543 14893.54354 0.43543 297.43542 148.93543 14893.54354 0.43543 297.43543 148.93543 14893.54300 2020-01-01 2020-01-02 2020-01-01 00:02:25 2020-01-02 03:30:46 2020-01-01 00:02:25.000 2020-01-02 03:30:46.000 145 99046 49595.5 4959550 145 99046 49595.5 4959550 -32424 32511 5031.02 503102 -125 126 3.18 318 -146 2 10136 99047 0.43843 297.43843 148.93843 14893.84384 0.43843 297.43845 148.93844 14893.84427 0.43843 297.43843 148.93843 14893.84300 2020-01-01 2020-01-02 2020-01-01 00:02:26 2020-01-02 03:30:47 2020-01-01 00:02:26.000 2020-01-02 03:30:47.000 146 99047 49596.5 4959650 146 99047 49596.5 4959650 -32423 32512 5032.02 503202 -124 127 4.18 418 -147 2 10137 99048 0.44144 297.44144 148.94144 14894.14414 0.44144 297.44144 148.94143 14894.14392 0.44144 297.44144 148.94144 14894.14400 2020-01-01 2020-01-02 2020-01-01 00:02:27 2020-01-02 03:30:48 2020-01-01 00:02:27.000 2020-01-02 03:30:48.000 147 99048 49597.5 4959750 147 99048 49597.5 4959750 -32422 32513 5033.02 503302 -128 127 2.62 262 -148 2 10138 99049 0.44444 297.44444 148.94444 14894.44444 0.44444 297.44446 148.94444 14894.4445 0.44444 297.44444 148.94444 14894.44400 2020-01-01 2020-01-02 2020-01-01 00:02:28 2020-01-02 03:30:49 2020-01-01 00:02:28.000 2020-01-02 03:30:49.000 148 99049 49598.5 4959850 148 99049 49598.5 4959850 -32421 32514 5034.02 503402 -128 127 1.06 106 -149 2 10139 99050 0.44744 297.44744 148.94744 14894.74474 0.44744 297.44745 148.94744 14894.74485 0.44744 297.44744 148.94744 14894.74400 2020-01-01 2020-01-02 2020-01-01 00:02:29 2020-01-02 03:30:50 2020-01-01 00:02:29.000 2020-01-02 03:30:50.000 149 99050 49599.5 4959950 149 99050 49599.5 4959950 -32420 32515 5035.02 503502 -128 124 -0.5 -50 +140 2 10130 99041 0.42042 297.42042 148.92042 14892.04204 0.42042 297.4204 148.92042 14892.04206 0.42042 297.42042 148.92042 14892.042 2020-01-01 2020-01-02 2020-01-01 00:02:20 2020-01-02 03:30:41 2020-01-01 00:02:20.000 2020-01-02 03:30:41.000 140 99041 49590.5 4959050 140 99041 49590.5 4959050 -32429 32506 5026.02 502602 -124 127 3.3 330 +141 2 10131 99042 0.42342 297.42342 148.92342 14892.34234 0.42342 297.42343 148.92342 14892.34215 0.42342 297.42342 148.92342 14892.342 2020-01-01 2020-01-02 2020-01-01 00:02:21 2020-01-02 03:30:42 2020-01-01 00:02:21.000 2020-01-02 03:30:42.000 141 99042 49591.5 4959150 141 99042 49591.5 4959150 -32428 32507 5027.02 502702 -128 127 1.74 174 +142 2 10132 99043 0.42642 297.42642 148.92642 14892.64264 0.42642 297.42642 148.92642 14892.64246 0.42642 297.42642 148.92642 14892.642 2020-01-01 2020-01-02 2020-01-01 00:02:22 2020-01-02 03:30:43 2020-01-01 00:02:22.000 2020-01-02 03:30:43.000 142 99043 49592.5 4959250 142 99043 49592.5 4959250 -32427 32508 5028.02 502802 -128 123 0.18 18 +143 2 10133 99044 0.42942 297.42942 148.92942 14892.94294 0.42942 297.42944 148.92943 14892.94304 0.42942 297.42942 148.92942 14892.942 2020-01-01 2020-01-02 2020-01-01 00:02:23 2020-01-02 03:30:44 2020-01-01 00:02:23.000 2020-01-02 03:30:44.000 143 99044 49593.5 4959350 143 99044 49593.5 4959350 -32426 32509 5029.02 502902 -127 124 1.18 118 +144 2 10134 99045 0.43243 297.43243 148.93243 14893.24324 0.43243 297.43243 148.93243 14893.24338 0.43243 297.43243 148.93243 14893.243 2020-01-01 2020-01-02 2020-01-01 00:02:24 2020-01-02 03:30:45 2020-01-01 00:02:24.000 2020-01-02 03:30:45.000 144 99045 49594.5 4959450 144 99045 49594.5 4959450 -32425 32510 5030.02 503002 -126 125 2.18 218 +145 2 10135 99046 0.43543 297.43543 148.93543 14893.54354 0.43543 297.43542 148.93543 14893.54354 0.43543 297.43543 148.93543 14893.543 2020-01-01 2020-01-02 2020-01-01 00:02:25 2020-01-02 03:30:46 2020-01-01 00:02:25.000 2020-01-02 03:30:46.000 145 99046 49595.5 4959550 145 99046 49595.5 4959550 -32424 32511 5031.02 503102 -125 126 3.18 318 +146 2 10136 99047 0.43843 297.43843 148.93843 14893.84384 0.43843 297.43845 148.93844 14893.84427 0.43843 297.43843 148.93843 14893.843 2020-01-01 2020-01-02 2020-01-01 00:02:26 2020-01-02 03:30:47 2020-01-01 00:02:26.000 2020-01-02 03:30:47.000 146 99047 49596.5 4959650 146 99047 49596.5 4959650 -32423 32512 5032.02 503202 -124 127 4.18 418 +147 2 10137 99048 0.44144 297.44144 148.94144 14894.14414 0.44144 297.44144 148.94143 14894.14392 0.44144 297.44144 148.94144 14894.144 2020-01-01 2020-01-02 2020-01-01 00:02:27 2020-01-02 03:30:48 2020-01-01 00:02:27.000 2020-01-02 03:30:48.000 147 99048 49597.5 4959750 147 99048 49597.5 4959750 -32422 32513 5033.02 503302 -128 127 2.62 262 +148 2 10138 99049 0.44444 297.44444 148.94444 14894.44444 0.44444 297.44446 148.94444 14894.4445 0.44444 297.44444 148.94444 14894.444 2020-01-01 2020-01-02 2020-01-01 00:02:28 2020-01-02 03:30:49 2020-01-01 00:02:28.000 2020-01-02 03:30:49.000 148 99049 49598.5 4959850 148 99049 49598.5 4959850 -32421 32514 5034.02 503402 -128 127 1.06 106 +149 2 10139 99050 0.44744 297.44744 148.94744 14894.74474 0.44744 297.44745 148.94744 14894.74485 0.44744 297.44744 148.94744 14894.744 2020-01-01 2020-01-02 2020-01-01 00:02:29 2020-01-02 03:30:50 2020-01-01 00:02:29.000 2020-01-02 03:30:50.000 149 99050 49599.5 4959950 149 99050 49599.5 4959950 -32420 32515 5035.02 503502 -128 124 -0.5 -50 15 2 10005 99915 0.04504 300.04504 150.04504 15154.54954 0.04504 300.04504 150.04504 15154.54945 0.04504 300.04504 150.04504 15154.54904 2020-01-01 2020-01-02 2020-01-01 00:00:15 2020-01-02 03:45:15 2020-01-01 00:00:15.000 2020-01-02 03:45:15.000 15 99915 49965 5046465 15 99915 49965 5046465 -32554 32381 4544.009900990099 458945 -124 127 1.9108910891089108 193 -150 2 10140 99051 0.45045 297.45045 148.95045 14895.04504 0.45045 297.45044 148.95045 14895.04501 0.45045 297.45045 148.95045 14895.04500 2020-01-01 2020-01-02 2020-01-01 00:02:30 2020-01-02 03:30:51 2020-01-01 00:02:30.000 2020-01-02 03:30:51.000 150 99051 49600.5 4960050 150 99051 49600.5 4960050 -32419 32516 5036.02 503602 -127 125 0.5 50 -151 2 10141 99052 0.45345 297.45345 148.95345 14895.34534 0.45345 297.45346 148.95345 14895.34574 0.45345 297.45345 148.95345 14895.34500 2020-01-01 2020-01-02 2020-01-01 00:02:31 2020-01-02 03:30:52 2020-01-01 00:02:31.000 2020-01-02 03:30:52.000 151 99052 49601.5 4960150 151 99052 49601.5 4960150 -32418 32517 5037.02 503702 -126 126 1.5 150 -152 2 10142 99053 0.45645 297.45645 148.95645 14895.64564 0.45645 297.45645 148.95645 14895.6454 0.45645 297.45645 148.95645000000002 14895.64500 2020-01-01 2020-01-02 2020-01-01 00:02:32 2020-01-02 03:30:53 2020-01-01 00:02:32.000 2020-01-02 03:30:53.000 152 99053 49602.5 4960250 152 99053 49602.5 4960250 -32417 32518 5038.02 503802 -125 127 2.5 250 -153 2 10143 99054 0.45945 297.45945 148.95945 14895.94594 0.45945 297.45947 148.95946 14895.94601 0.45945 297.45945 148.95945 14895.94500 2020-01-01 2020-01-02 2020-01-01 00:02:33 2020-01-02 03:30:54 2020-01-01 00:02:33.000 2020-01-02 03:30:54.000 153 99054 49603.5 4960350 153 99054 49603.5 4960350 -32416 32519 5039.02 503902 -128 127 0.94 94 -154 2 10144 99055 0.46246 297.46246 148.96246 14896.24624 0.46246 297.46246 148.96246 14896.24633 0.46246 297.46246 148.96246 14896.24600 2020-01-01 2020-01-02 2020-01-01 00:02:34 2020-01-02 03:30:55 2020-01-01 00:02:34.000 2020-01-02 03:30:55.000 154 99055 49604.5 4960450 154 99055 49604.5 4960450 -32415 32520 5040.02 504002 -128 127 -0.62 -62 -155 2 10145 99056 0.46546 297.46546 148.96546 14896.54654 0.46546 297.46545 148.96546 14896.54647 0.46546 297.46546 148.96546 14896.54600 2020-01-01 2020-01-02 2020-01-01 00:02:35 2020-01-02 03:30:56 2020-01-01 00:02:35.000 2020-01-02 03:30:56.000 155 99056 49605.5 4960550 155 99056 49605.5 4960550 -32414 32521 5041.02 504102 -128 123 -2.18 -218 -156 2 10146 99057 0.46846 297.46846 148.96846 14896.84684 0.46846 297.46848 148.96847 14896.84721 0.46846 297.46846 148.96846 14896.84600 2020-01-01 2020-01-02 2020-01-01 00:02:36 2020-01-02 03:30:57 2020-01-01 00:02:36.000 2020-01-02 03:30:57.000 156 99057 49606.5 4960650 156 99057 49606.5 4960650 -32413 32522 5042.02 504202 -127 124 -1.18 -118 -157 2 10147 99058 0.47147 297.47147 148.97147 14897.14714 0.47147 297.47147 148.97146 14897.14687 0.47147 297.47147 148.97147 14897.14700 2020-01-01 2020-01-02 2020-01-01 00:02:37 2020-01-02 03:30:58 2020-01-01 00:02:37.000 2020-01-02 03:30:58.000 157 99058 49607.5 4960750 157 99058 49607.5 4960750 -32412 32523 5043.02 504302 -126 125 -0.18 -18 -158 2 10148 99059 0.47447 297.47447 148.97447 14897.44744 0.47447 297.4745 148.97447 14897.44748 0.47447 297.47447 148.97447 14897.44700 2020-01-01 2020-01-02 2020-01-01 00:02:38 2020-01-02 03:30:59 2020-01-01 00:02:38.000 2020-01-02 03:30:59.000 158 99059 49608.5 4960850 158 99059 49608.5 4960850 -32411 32524 5044.02 504402 -125 126 0.82 82 -159 2 10149 99060 0.47747 297.47747 148.97747 14897.74774 0.47747 297.47748 148.97747 14897.74779 0.47747 297.47747 148.97746999999998 14897.74700 2020-01-01 2020-01-02 2020-01-01 00:02:39 2020-01-02 03:31:00 2020-01-01 00:02:39.000 2020-01-02 03:31:00.000 159 99060 49609.5 4960950 159 99060 49609.5 4960950 -32410 32525 5045.02 504502 -124 127 1.82 182 +150 2 10140 99051 0.45045 297.45045 148.95045 14895.04504 0.45045 297.45044 148.95045 14895.04501 0.45045 297.45045 148.95045 14895.045 2020-01-01 2020-01-02 2020-01-01 00:02:30 2020-01-02 03:30:51 2020-01-01 00:02:30.000 2020-01-02 03:30:51.000 150 99051 49600.5 4960050 150 99051 49600.5 4960050 -32419 32516 5036.02 503602 -127 125 0.5 50 +151 2 10141 99052 0.45345 297.45345 148.95345 14895.34534 0.45345 297.45346 148.95345 14895.34574 0.45345 297.45345 148.95345 14895.345 2020-01-01 2020-01-02 2020-01-01 00:02:31 2020-01-02 03:30:52 2020-01-01 00:02:31.000 2020-01-02 03:30:52.000 151 99052 49601.5 4960150 151 99052 49601.5 4960150 -32418 32517 5037.02 503702 -126 126 1.5 150 +152 2 10142 99053 0.45645 297.45645 148.95645 14895.64564 0.45645 297.45645 148.95645 14895.6454 0.45645 297.45645 148.95645000000002 14895.645 2020-01-01 2020-01-02 2020-01-01 00:02:32 2020-01-02 03:30:53 2020-01-01 00:02:32.000 2020-01-02 03:30:53.000 152 99053 49602.5 4960250 152 99053 49602.5 4960250 -32417 32518 5038.02 503802 -125 127 2.5 250 +153 2 10143 99054 0.45945 297.45945 148.95945 14895.94594 0.45945 297.45947 148.95946 14895.94601 0.45945 297.45945 148.95945 14895.945 2020-01-01 2020-01-02 2020-01-01 00:02:33 2020-01-02 03:30:54 2020-01-01 00:02:33.000 2020-01-02 03:30:54.000 153 99054 49603.5 4960350 153 99054 49603.5 4960350 -32416 32519 5039.02 503902 -128 127 0.94 94 +154 2 10144 99055 0.46246 297.46246 148.96246 14896.24624 0.46246 297.46246 148.96246 14896.24633 0.46246 297.46246 148.96246 14896.246 2020-01-01 2020-01-02 2020-01-01 00:02:34 2020-01-02 03:30:55 2020-01-01 00:02:34.000 2020-01-02 03:30:55.000 154 99055 49604.5 4960450 154 99055 49604.5 4960450 -32415 32520 5040.02 504002 -128 127 -0.62 -62 +155 2 10145 99056 0.46546 297.46546 148.96546 14896.54654 0.46546 297.46545 148.96546 14896.54647 0.46546 297.46546 148.96546 14896.546 2020-01-01 2020-01-02 2020-01-01 00:02:35 2020-01-02 03:30:56 2020-01-01 00:02:35.000 2020-01-02 03:30:56.000 155 99056 49605.5 4960550 155 99056 49605.5 4960550 -32414 32521 5041.02 504102 -128 123 -2.18 -218 +156 2 10146 99057 0.46846 297.46846 148.96846 14896.84684 0.46846 297.46848 148.96847 14896.84721 0.46846 297.46846 148.96846 14896.846 2020-01-01 2020-01-02 2020-01-01 00:02:36 2020-01-02 03:30:57 2020-01-01 00:02:36.000 2020-01-02 03:30:57.000 156 99057 49606.5 4960650 156 99057 49606.5 4960650 -32413 32522 5042.02 504202 -127 124 -1.18 -118 +157 2 10147 99058 0.47147 297.47147 148.97147 14897.14714 0.47147 297.47147 148.97146 14897.14687 0.47147 297.47147 148.97147 14897.147 2020-01-01 2020-01-02 2020-01-01 00:02:37 2020-01-02 03:30:58 2020-01-01 00:02:37.000 2020-01-02 03:30:58.000 157 99058 49607.5 4960750 157 99058 49607.5 4960750 -32412 32523 5043.02 504302 -126 125 -0.18 -18 +158 2 10148 99059 0.47447 297.47447 148.97447 14897.44744 0.47447 297.4745 148.97447 14897.44748 0.47447 297.47447 148.97447 14897.447 2020-01-01 2020-01-02 2020-01-01 00:02:38 2020-01-02 03:30:59 2020-01-01 00:02:38.000 2020-01-02 03:30:59.000 158 99059 49608.5 4960850 158 99059 49608.5 4960850 -32411 32524 5044.02 504402 -125 126 0.82 82 +159 2 10149 99060 0.47747 297.47747 148.97747 14897.74774 0.47747 297.47748 148.97747 14897.74779 0.47747 297.47747 148.97746999999998 14897.747 2020-01-01 2020-01-02 2020-01-01 00:02:39 2020-01-02 03:31:00 2020-01-01 00:02:39.000 2020-01-02 03:31:00.000 159 99060 49609.5 4960950 159 99060 49609.5 4960950 -32410 32525 5045.02 504502 -124 127 1.82 182 16 2 10006 99916 0.04804 300.04804 150.04804 15154.85285 0.04804 300.04803 150.04804 15154.85279 0.04804 300.04804 150.04804 15154.85204 2020-01-01 2020-01-02 2020-01-01 00:00:16 2020-01-02 03:45:16 2020-01-01 00:00:16.000 2020-01-02 03:45:16.000 16 99916 49966 5046566 16 99916 49966 5046566 -32553 32382 4545.009900990099 459046 -128 127 0.37623762376237624 38 -160 2 10150 99061 0.48048 297.48048 148.98048 14898.04804 0.48048 297.48047 148.98048 14898.0481 0.48048 297.48048 148.98048 14898.04800 2020-01-01 2020-01-02 2020-01-01 00:02:40 2020-01-02 03:31:01 2020-01-01 00:02:40.000 2020-01-02 03:31:01.000 160 99061 49610.5 4961050 160 99061 49610.5 4961050 -32409 32526 5046.02 504602 -128 127 0.26 26 -161 2 10151 99062 0.48348 297.48348 148.98348 14898.34834 0.48348 297.4835 148.98348 14898.34868 0.48348 297.48348 148.98348 14898.34800 2020-01-01 2020-01-02 2020-01-01 00:02:41 2020-01-02 03:31:02 2020-01-01 00:02:41.000 2020-01-02 03:31:02.000 161 99062 49611.5 4961150 161 99062 49611.5 4961150 -32408 32527 5047.02 504702 -128 123 -1.3 -130 -162 2 10152 99063 0.48648 297.48648 148.98648 14898.64864 0.48648 297.48648 148.98648 14898.64837 0.48648 297.48648 148.98648 14898.64800 2020-01-01 2020-01-02 2020-01-01 00:02:42 2020-01-02 03:31:03 2020-01-01 00:02:42.000 2020-01-02 03:31:03.000 162 99063 49612.5 4961250 162 99063 49612.5 4961250 -32407 32528 5048.02 504802 -127 124 -0.3 -30 -163 2 10153 99064 0.48948 297.48948 148.98948 14898.94894 0.48948 297.4895 148.98948 14898.94895 0.48948 297.48948 148.98948000000001 14898.94800 2020-01-01 2020-01-02 2020-01-01 00:02:43 2020-01-02 03:31:04 2020-01-01 00:02:43.000 2020-01-02 03:31:04.000 163 99064 49613.5 4961350 163 99064 49613.5 4961350 -32406 32529 5049.02 504902 -126 125 0.7 70 -164 2 10154 99065 0.49249 297.49249 148.99249 14899.24924 0.49249 297.4925 148.99249 14899.24926 0.49249 297.49249 148.99249 14899.24900 2020-01-01 2020-01-02 2020-01-01 00:02:44 2020-01-02 03:31:05 2020-01-01 00:02:44.000 2020-01-02 03:31:05.000 164 99065 49614.5 4961450 164 99065 49614.5 4961450 -32405 32530 5050.02 505002 -125 126 1.7 170 -165 2 10155 99066 0.49549 297.49549 148.99549 14899.54954 0.49549 297.49548 148.99549 14899.54957 0.49549 297.49549 148.99549000000002 14899.54900 2020-01-01 2020-01-02 2020-01-01 00:02:45 2020-01-02 03:31:06 2020-01-01 00:02:45.000 2020-01-02 03:31:06.000 165 99066 49615.5 4961550 165 99066 49615.5 4961550 -32404 32531 5051.02 505102 -124 127 2.7 270 -166 2 10156 99067 0.49849 297.49849 148.99849 14899.84984 0.49849 297.4985 148.9985 14899.85015 0.49849 297.49849 148.99849 14899.84900 2020-01-01 2020-01-02 2020-01-01 00:02:46 2020-01-02 03:31:07 2020-01-01 00:02:46.000 2020-01-02 03:31:07.000 166 99067 49616.5 4961650 166 99067 49616.5 4961650 -32403 32532 5052.02 505202 -128 127 1.14 114 -167 2 10157 99068 0.5015 297.5015 149.0015 14900.15015 0.5015 297.5015 149.00149 14900.14984 0.50150 297.50150 149.0015 14900.15000 2020-01-01 2020-01-02 2020-01-01 00:02:47 2020-01-02 03:31:08 2020-01-01 00:02:47.000 2020-01-02 03:31:08.000 167 99068 49617.5 4961750 167 99068 49617.5 4961750 -32402 32533 5053.02 505302 -128 123 -0.42 -42 -168 2 10158 99069 0.5045 297.5045 149.0045 14900.45045 0.5045 297.50452 149.0045 14900.45042 0.50450 297.50450 149.0045 14900.45000 2020-01-01 2020-01-02 2020-01-01 00:02:48 2020-01-02 03:31:09 2020-01-01 00:02:48.000 2020-01-02 03:31:09.000 168 99069 49618.5 4961850 168 99069 49618.5 4961850 -32401 32534 5054.02 505402 -127 124 0.58 58 -169 2 10159 99070 0.5075 297.5075 149.0075 14900.75075 0.5075 297.5075 149.0075 14900.75073 0.50750 297.50750 149.0075 14900.75000 2020-01-01 2020-01-02 2020-01-01 00:02:49 2020-01-02 03:31:10 2020-01-01 00:02:49.000 2020-01-02 03:31:10.000 169 99070 49619.5 4961950 169 99070 49619.5 4961950 -32400 32535 5055.02 505502 -126 125 1.58 158 +160 2 10150 99061 0.48048 297.48048 148.98048 14898.04804 0.48048 297.48047 148.98048 14898.0481 0.48048 297.48048 148.98048 14898.048 2020-01-01 2020-01-02 2020-01-01 00:02:40 2020-01-02 03:31:01 2020-01-01 00:02:40.000 2020-01-02 03:31:01.000 160 99061 49610.5 4961050 160 99061 49610.5 4961050 -32409 32526 5046.02 504602 -128 127 0.26 26 +161 2 10151 99062 0.48348 297.48348 148.98348 14898.34834 0.48348 297.4835 148.98348 14898.34868 0.48348 297.48348 148.98348 14898.348 2020-01-01 2020-01-02 2020-01-01 00:02:41 2020-01-02 03:31:02 2020-01-01 00:02:41.000 2020-01-02 03:31:02.000 161 99062 49611.5 4961150 161 99062 49611.5 4961150 -32408 32527 5047.02 504702 -128 123 -1.3 -130 +162 2 10152 99063 0.48648 297.48648 148.98648 14898.64864 0.48648 297.48648 148.98648 14898.64837 0.48648 297.48648 148.98648 14898.648 2020-01-01 2020-01-02 2020-01-01 00:02:42 2020-01-02 03:31:03 2020-01-01 00:02:42.000 2020-01-02 03:31:03.000 162 99063 49612.5 4961250 162 99063 49612.5 4961250 -32407 32528 5048.02 504802 -127 124 -0.3 -30 +163 2 10153 99064 0.48948 297.48948 148.98948 14898.94894 0.48948 297.4895 148.98948 14898.94895 0.48948 297.48948 148.98948000000001 14898.948 2020-01-01 2020-01-02 2020-01-01 00:02:43 2020-01-02 03:31:04 2020-01-01 00:02:43.000 2020-01-02 03:31:04.000 163 99064 49613.5 4961350 163 99064 49613.5 4961350 -32406 32529 5049.02 504902 -126 125 0.7 70 +164 2 10154 99065 0.49249 297.49249 148.99249 14899.24924 0.49249 297.4925 148.99249 14899.24926 0.49249 297.49249 148.99249 14899.249 2020-01-01 2020-01-02 2020-01-01 00:02:44 2020-01-02 03:31:05 2020-01-01 00:02:44.000 2020-01-02 03:31:05.000 164 99065 49614.5 4961450 164 99065 49614.5 4961450 -32405 32530 5050.02 505002 -125 126 1.7 170 +165 2 10155 99066 0.49549 297.49549 148.99549 14899.54954 0.49549 297.49548 148.99549 14899.54957 0.49549 297.49549 148.99549000000002 14899.549 2020-01-01 2020-01-02 2020-01-01 00:02:45 2020-01-02 03:31:06 2020-01-01 00:02:45.000 2020-01-02 03:31:06.000 165 99066 49615.5 4961550 165 99066 49615.5 4961550 -32404 32531 5051.02 505102 -124 127 2.7 270 +166 2 10156 99067 0.49849 297.49849 148.99849 14899.84984 0.49849 297.4985 148.9985 14899.85015 0.49849 297.49849 148.99849 14899.849 2020-01-01 2020-01-02 2020-01-01 00:02:46 2020-01-02 03:31:07 2020-01-01 00:02:46.000 2020-01-02 03:31:07.000 166 99067 49616.5 4961650 166 99067 49616.5 4961650 -32403 32532 5052.02 505202 -128 127 1.14 114 +167 2 10157 99068 0.5015 297.5015 149.0015 14900.15015 0.5015 297.5015 149.00149 14900.14984 0.5015 297.5015 149.0015 14900.15 2020-01-01 2020-01-02 2020-01-01 00:02:47 2020-01-02 03:31:08 2020-01-01 00:02:47.000 2020-01-02 03:31:08.000 167 99068 49617.5 4961750 167 99068 49617.5 4961750 -32402 32533 5053.02 505302 -128 123 -0.42 -42 +168 2 10158 99069 0.5045 297.5045 149.0045 14900.45045 0.5045 297.50452 149.0045 14900.45042 0.5045 297.5045 149.0045 14900.45 2020-01-01 2020-01-02 2020-01-01 00:02:48 2020-01-02 03:31:09 2020-01-01 00:02:48.000 2020-01-02 03:31:09.000 168 99069 49618.5 4961850 168 99069 49618.5 4961850 -32401 32534 5054.02 505402 -127 124 0.58 58 +169 2 10159 99070 0.5075 297.5075 149.0075 14900.75075 0.5075 297.5075 149.0075 14900.75073 0.5075 297.5075 149.0075 14900.75 2020-01-01 2020-01-02 2020-01-01 00:02:49 2020-01-02 03:31:10 2020-01-01 00:02:49.000 2020-01-02 03:31:10.000 169 99070 49619.5 4961950 169 99070 49619.5 4961950 -32400 32535 5055.02 505502 -126 125 1.58 158 17 2 10007 99917 0.05105 300.05105 150.05105 15155.15615 0.05105 300.05106 150.05105 15155.15638 0.05105 300.05105 150.05105 15155.15605 2020-01-01 2020-01-02 2020-01-01 00:00:17 2020-01-02 03:45:17 2020-01-01 00:00:17.000 2020-01-02 03:45:17.000 17 99917 49967 5046667 17 99917 49967 5046667 -32552 32383 4546.009900990099 459147 -128 127 -1.1584158415841583 -117 -170 2 10160 99071 0.51051 297.51051 149.01051 14901.05105 0.51051 297.5105 149.01051 14901.05104 0.51051 297.51051 149.01050999999998 14901.05100 2020-01-01 2020-01-02 2020-01-01 00:02:50 2020-01-02 03:31:11 2020-01-01 00:02:50.000 2020-01-02 03:31:11.000 170 99071 49620.5 4962050 170 99071 49620.5 4962050 -32399 32536 5056.02 505602 -125 126 2.58 258 -171 2 10161 99072 0.51351 297.51351 149.01351 14901.35135 0.51351 297.51352 149.01351 14901.35162 0.51351 297.51351 149.01351 14901.35100 2020-01-01 2020-01-02 2020-01-01 00:02:51 2020-01-02 03:31:12 2020-01-01 00:02:51.000 2020-01-02 03:31:12.000 171 99072 49621.5 4962150 171 99072 49621.5 4962150 -32398 32537 5057.02 505702 -124 127 3.58 358 -172 2 10162 99073 0.51651 297.51651 149.01651 14901.65165 0.51651 297.5165 149.01651 14901.65131 0.51651 297.51651 149.01651 14901.65100 2020-01-01 2020-01-02 2020-01-01 00:02:52 2020-01-02 03:31:13 2020-01-01 00:02:52.000 2020-01-02 03:31:13.000 172 99073 49622.5 4962250 172 99073 49622.5 4962250 -32397 32538 5058.02 505802 -128 127 2.02 202 -173 2 10163 99074 0.51951 297.51951 149.01951 14901.95195 0.51951 297.51953 149.01951 14901.95189 0.51951 297.51951 149.01951 14901.95100 2020-01-01 2020-01-02 2020-01-01 00:02:53 2020-01-02 03:31:14 2020-01-01 00:02:53.000 2020-01-02 03:31:14.000 173 99074 49623.5 4962350 173 99074 49623.5 4962350 -32396 32539 5059.02 505902 -128 127 0.46 46 -174 2 10164 99075 0.52252 297.52252 149.02252 14902.25225 0.52252 297.52252 149.02252 14902.2522 0.52252 297.52252 149.02252000000001 14902.25200 2020-01-01 2020-01-02 2020-01-01 00:02:54 2020-01-02 03:31:15 2020-01-01 00:02:54.000 2020-01-02 03:31:15.000 174 99075 49624.5 4962450 174 99075 49624.5 4962450 -32395 32540 5060.02 506002 -128 124 -1.1 -110 -175 2 10165 99076 0.52552 297.52552 149.02552 14902.55255 0.52552 297.5255 149.02552 14902.55251 0.52552 297.52552 149.02552 14902.55200 2020-01-01 2020-01-02 2020-01-01 00:02:55 2020-01-02 03:31:16 2020-01-01 00:02:55.000 2020-01-02 03:31:16.000 175 99076 49625.5 4962550 175 99076 49625.5 4962550 -32394 32541 5061.02 506102 -127 125 -0.1 -10 -176 2 10166 99077 0.52852 297.52852 149.02852 14902.85285 0.52852 297.52853 149.02853 14902.85312 0.52852 297.52852 149.02852000000001 14902.85200 2020-01-01 2020-01-02 2020-01-01 00:02:56 2020-01-02 03:31:17 2020-01-01 00:02:56.000 2020-01-02 03:31:17.000 176 99077 49626.5 4962650 176 99077 49626.5 4962650 -32393 32542 5062.02 506202 -126 126 0.9 90 -177 2 10167 99078 0.53153 297.53153 149.03153 14903.15315 0.53153 297.53152 149.03152 14903.15278 0.53153 297.53153 149.03153 14903.15300 2020-01-01 2020-01-02 2020-01-01 00:02:57 2020-01-02 03:31:18 2020-01-01 00:02:57.000 2020-01-02 03:31:18.000 177 99078 49627.5 4962750 177 99078 49627.5 4962750 -32392 32543 5063.02 506302 -125 127 1.9 190 -178 2 10168 99079 0.53453 297.53453 149.03453 14903.45345 0.53453 297.53455 149.03453 14903.45352 0.53453 297.53453 149.03453 14903.45300 2020-01-01 2020-01-02 2020-01-01 00:02:58 2020-01-02 03:31:19 2020-01-01 00:02:58.000 2020-01-02 03:31:19.000 178 99079 49628.5 4962850 178 99079 49628.5 4962850 -32391 32544 5064.02 506402 -128 127 0.34 34 -179 2 10169 99080 0.53753 297.53753 149.03753 14903.75375 0.53753 297.53754 149.03753 14903.75366 0.53753 297.53753 149.03753 14903.75300 2020-01-01 2020-01-02 2020-01-01 00:02:59 2020-01-02 03:31:20 2020-01-01 00:02:59.000 2020-01-02 03:31:20.000 179 99080 49629.5 4962950 179 99080 49629.5 4962950 -32390 32545 5065.02 506502 -128 127 -1.22 -122 +170 2 10160 99071 0.51051 297.51051 149.01051 14901.05105 0.51051 297.5105 149.01051 14901.05104 0.51051 297.51051 149.01050999999998 14901.051 2020-01-01 2020-01-02 2020-01-01 00:02:50 2020-01-02 03:31:11 2020-01-01 00:02:50.000 2020-01-02 03:31:11.000 170 99071 49620.5 4962050 170 99071 49620.5 4962050 -32399 32536 5056.02 505602 -125 126 2.58 258 +171 2 10161 99072 0.51351 297.51351 149.01351 14901.35135 0.51351 297.51352 149.01351 14901.35162 0.51351 297.51351 149.01351 14901.351 2020-01-01 2020-01-02 2020-01-01 00:02:51 2020-01-02 03:31:12 2020-01-01 00:02:51.000 2020-01-02 03:31:12.000 171 99072 49621.5 4962150 171 99072 49621.5 4962150 -32398 32537 5057.02 505702 -124 127 3.58 358 +172 2 10162 99073 0.51651 297.51651 149.01651 14901.65165 0.51651 297.5165 149.01651 14901.65131 0.51651 297.51651 149.01651 14901.651 2020-01-01 2020-01-02 2020-01-01 00:02:52 2020-01-02 03:31:13 2020-01-01 00:02:52.000 2020-01-02 03:31:13.000 172 99073 49622.5 4962250 172 99073 49622.5 4962250 -32397 32538 5058.02 505802 -128 127 2.02 202 +173 2 10163 99074 0.51951 297.51951 149.01951 14901.95195 0.51951 297.51953 149.01951 14901.95189 0.51951 297.51951 149.01951 14901.951 2020-01-01 2020-01-02 2020-01-01 00:02:53 2020-01-02 03:31:14 2020-01-01 00:02:53.000 2020-01-02 03:31:14.000 173 99074 49623.5 4962350 173 99074 49623.5 4962350 -32396 32539 5059.02 505902 -128 127 0.46 46 +174 2 10164 99075 0.52252 297.52252 149.02252 14902.25225 0.52252 297.52252 149.02252 14902.2522 0.52252 297.52252 149.02252000000001 14902.252 2020-01-01 2020-01-02 2020-01-01 00:02:54 2020-01-02 03:31:15 2020-01-01 00:02:54.000 2020-01-02 03:31:15.000 174 99075 49624.5 4962450 174 99075 49624.5 4962450 -32395 32540 5060.02 506002 -128 124 -1.1 -110 +175 2 10165 99076 0.52552 297.52552 149.02552 14902.55255 0.52552 297.5255 149.02552 14902.55251 0.52552 297.52552 149.02552 14902.552 2020-01-01 2020-01-02 2020-01-01 00:02:55 2020-01-02 03:31:16 2020-01-01 00:02:55.000 2020-01-02 03:31:16.000 175 99076 49625.5 4962550 175 99076 49625.5 4962550 -32394 32541 5061.02 506102 -127 125 -0.1 -10 +176 2 10166 99077 0.52852 297.52852 149.02852 14902.85285 0.52852 297.52853 149.02853 14902.85312 0.52852 297.52852 149.02852000000001 14902.852 2020-01-01 2020-01-02 2020-01-01 00:02:56 2020-01-02 03:31:17 2020-01-01 00:02:56.000 2020-01-02 03:31:17.000 176 99077 49626.5 4962650 176 99077 49626.5 4962650 -32393 32542 5062.02 506202 -126 126 0.9 90 +177 2 10167 99078 0.53153 297.53153 149.03153 14903.15315 0.53153 297.53152 149.03152 14903.15278 0.53153 297.53153 149.03153 14903.153 2020-01-01 2020-01-02 2020-01-01 00:02:57 2020-01-02 03:31:18 2020-01-01 00:02:57.000 2020-01-02 03:31:18.000 177 99078 49627.5 4962750 177 99078 49627.5 4962750 -32392 32543 5063.02 506302 -125 127 1.9 190 +178 2 10168 99079 0.53453 297.53453 149.03453 14903.45345 0.53453 297.53455 149.03453 14903.45352 0.53453 297.53453 149.03453 14903.453 2020-01-01 2020-01-02 2020-01-01 00:02:58 2020-01-02 03:31:19 2020-01-01 00:02:58.000 2020-01-02 03:31:19.000 178 99079 49628.5 4962850 178 99079 49628.5 4962850 -32391 32544 5064.02 506402 -128 127 0.34 34 +179 2 10169 99080 0.53753 297.53753 149.03753 14903.75375 0.53753 297.53754 149.03753 14903.75366 0.53753 297.53753 149.03753 14903.753 2020-01-01 2020-01-02 2020-01-01 00:02:59 2020-01-02 03:31:20 2020-01-01 00:02:59.000 2020-01-02 03:31:20.000 179 99080 49629.5 4962950 179 99080 49629.5 4962950 -32390 32545 5065.02 506502 -128 127 -1.22 -122 18 2 10008 99918 0.05405 300.05405 150.05405 15155.45945 0.05405 300.05405 150.05404 15155.45903 0.05405 300.05405 150.05405 15155.45905 2020-01-01 2020-01-02 2020-01-01 00:00:18 2020-01-02 03:45:18 2020-01-01 00:00:18.000 2020-01-02 03:45:18.000 18 99918 49968 5046768 18 99918 49968 5046768 -32551 32384 4547.009900990099 459248 -128 124 -2.6930693069306932 -272 -180 2 10170 99081 0.54054 297.54054 149.04054 14904.05405 0.54054 297.54053 149.04053 14904.05398 0.54054 297.54054 149.04054 14904.05400 2020-01-01 2020-01-02 2020-01-01 00:03:00 2020-01-02 03:31:21 2020-01-01 00:03:00.000 2020-01-02 03:31:21.000 180 99081 49630.5 4963050 180 99081 49630.5 4963050 -32389 32546 5066.02 506602 -128 123 -2.78 -278 -181 2 10171 99082 0.54354 297.54354 149.04354 14904.35435 0.54354 297.54355 149.04354 14904.35459 0.54354 297.54354 149.04354 14904.35400 2020-01-01 2020-01-02 2020-01-01 00:03:01 2020-01-02 03:31:22 2020-01-01 00:03:01.000 2020-01-02 03:31:22.000 181 99082 49631.5 4963150 181 99082 49631.5 4963150 -32388 32547 5067.02 506702 -127 124 -1.78 -178 -182 2 10172 99083 0.54654 297.54654 149.04654 14904.65465 0.54654 297.54654 149.04654 14904.65425 0.54654 297.54654 149.04654 14904.65400 2020-01-01 2020-01-02 2020-01-01 00:03:02 2020-01-02 03:31:23 2020-01-01 00:03:02.000 2020-01-02 03:31:23.000 182 99083 49632.5 4963250 182 99083 49632.5 4963250 -32387 32548 5068.02 506802 -126 125 -0.78 -78 -183 2 10173 99084 0.54954 297.54954 149.04954 14904.95495 0.54954 297.54956 149.04954 14904.95498 0.54954 297.54954 149.04954 14904.95400 2020-01-01 2020-01-02 2020-01-01 00:03:03 2020-01-02 03:31:24 2020-01-01 00:03:03.000 2020-01-02 03:31:24.000 183 99084 49633.5 4963350 183 99084 49633.5 4963350 -32386 32549 5069.02 506902 -125 126 0.22 22 -184 2 10174 99085 0.55255 297.55255 149.05255 14905.25525 0.55255 297.55255 149.05255 14905.25514 0.55255 297.55255 149.05255 14905.25500 2020-01-01 2020-01-02 2020-01-01 00:03:04 2020-01-02 03:31:25 2020-01-01 00:03:04.000 2020-01-02 03:31:25.000 184 99085 49634.5 4963450 184 99085 49634.5 4963450 -32385 32550 5070.02 507002 -124 127 1.22 122 -185 2 10175 99086 0.55555 297.55555 149.05555 14905.55555 0.55555 297.55554 149.05555 14905.55549 0.55555 297.55555 149.05555 14905.55500 2020-01-01 2020-01-02 2020-01-01 00:03:05 2020-01-02 03:31:26 2020-01-01 00:03:05.000 2020-01-02 03:31:26.000 185 99086 49635.5 4963550 185 99086 49635.5 4963550 -32384 32551 5071.02 507102 -128 127 -0.34 -34 -186 2 10176 99087 0.55855 297.55855 149.05855 14905.85585 0.55855 297.55856 149.05856 14905.85607 0.55855 297.55855 149.05855 14905.85500 2020-01-01 2020-01-02 2020-01-01 00:03:06 2020-01-02 03:31:27 2020-01-01 00:03:06.000 2020-01-02 03:31:27.000 186 99087 49636.5 4963650 186 99087 49636.5 4963650 -32383 32552 5072.02 507202 -128 123 -1.9 -190 -187 2 10177 99088 0.56156 297.56156 149.06156 14906.15615 0.56156 297.56155 149.06155 14906.15572 0.56156 297.56156 149.06156000000001 14906.15600 2020-01-01 2020-01-02 2020-01-01 00:03:07 2020-01-02 03:31:28 2020-01-01 00:03:07.000 2020-01-02 03:31:28.000 187 99088 49637.5 4963750 187 99088 49637.5 4963750 -32382 32553 5073.02 507302 -127 124 -0.9 -90 -188 2 10178 99089 0.56456 297.56456 149.06456 14906.45645 0.56456 297.56458 149.06456 14906.45645 0.56456 297.56456 149.06456 14906.45600 2020-01-01 2020-01-02 2020-01-01 00:03:08 2020-01-02 03:31:29 2020-01-01 00:03:08.000 2020-01-02 03:31:29.000 188 99089 49638.5 4963850 188 99089 49638.5 4963850 -32381 32554 5074.02 507402 -126 125 0.1 10 -189 2 10179 99090 0.56756 297.56756 149.06756 14906.75675 0.56756 297.56757 149.06756 14906.75661 0.56756 297.56756 149.06756 14906.75600 2020-01-01 2020-01-02 2020-01-01 00:03:09 2020-01-02 03:31:30 2020-01-01 00:03:09.000 2020-01-02 03:31:30.000 189 99090 49639.5 4963950 189 99090 49639.5 4963950 -32380 32555 5075.02 507502 -125 126 1.1 110 +180 2 10170 99081 0.54054 297.54054 149.04054 14904.05405 0.54054 297.54053 149.04053 14904.05398 0.54054 297.54054 149.04054 14904.054 2020-01-01 2020-01-02 2020-01-01 00:03:00 2020-01-02 03:31:21 2020-01-01 00:03:00.000 2020-01-02 03:31:21.000 180 99081 49630.5 4963050 180 99081 49630.5 4963050 -32389 32546 5066.02 506602 -128 123 -2.78 -278 +181 2 10171 99082 0.54354 297.54354 149.04354 14904.35435 0.54354 297.54355 149.04354 14904.35459 0.54354 297.54354 149.04354 14904.354 2020-01-01 2020-01-02 2020-01-01 00:03:01 2020-01-02 03:31:22 2020-01-01 00:03:01.000 2020-01-02 03:31:22.000 181 99082 49631.5 4963150 181 99082 49631.5 4963150 -32388 32547 5067.02 506702 -127 124 -1.78 -178 +182 2 10172 99083 0.54654 297.54654 149.04654 14904.65465 0.54654 297.54654 149.04654 14904.65425 0.54654 297.54654 149.04654 14904.654 2020-01-01 2020-01-02 2020-01-01 00:03:02 2020-01-02 03:31:23 2020-01-01 00:03:02.000 2020-01-02 03:31:23.000 182 99083 49632.5 4963250 182 99083 49632.5 4963250 -32387 32548 5068.02 506802 -126 125 -0.78 -78 +183 2 10173 99084 0.54954 297.54954 149.04954 14904.95495 0.54954 297.54956 149.04954 14904.95498 0.54954 297.54954 149.04954 14904.954 2020-01-01 2020-01-02 2020-01-01 00:03:03 2020-01-02 03:31:24 2020-01-01 00:03:03.000 2020-01-02 03:31:24.000 183 99084 49633.5 4963350 183 99084 49633.5 4963350 -32386 32549 5069.02 506902 -125 126 0.22 22 +184 2 10174 99085 0.55255 297.55255 149.05255 14905.25525 0.55255 297.55255 149.05255 14905.25514 0.55255 297.55255 149.05255 14905.255 2020-01-01 2020-01-02 2020-01-01 00:03:04 2020-01-02 03:31:25 2020-01-01 00:03:04.000 2020-01-02 03:31:25.000 184 99085 49634.5 4963450 184 99085 49634.5 4963450 -32385 32550 5070.02 507002 -124 127 1.22 122 +185 2 10175 99086 0.55555 297.55555 149.05555 14905.55555 0.55555 297.55554 149.05555 14905.55549 0.55555 297.55555 149.05555 14905.555 2020-01-01 2020-01-02 2020-01-01 00:03:05 2020-01-02 03:31:26 2020-01-01 00:03:05.000 2020-01-02 03:31:26.000 185 99086 49635.5 4963550 185 99086 49635.5 4963550 -32384 32551 5071.02 507102 -128 127 -0.34 -34 +186 2 10176 99087 0.55855 297.55855 149.05855 14905.85585 0.55855 297.55856 149.05856 14905.85607 0.55855 297.55855 149.05855 14905.855 2020-01-01 2020-01-02 2020-01-01 00:03:06 2020-01-02 03:31:27 2020-01-01 00:03:06.000 2020-01-02 03:31:27.000 186 99087 49636.5 4963650 186 99087 49636.5 4963650 -32383 32552 5072.02 507202 -128 123 -1.9 -190 +187 2 10177 99088 0.56156 297.56156 149.06156 14906.15615 0.56156 297.56155 149.06155 14906.15572 0.56156 297.56156 149.06156000000001 14906.156 2020-01-01 2020-01-02 2020-01-01 00:03:07 2020-01-02 03:31:28 2020-01-01 00:03:07.000 2020-01-02 03:31:28.000 187 99088 49637.5 4963750 187 99088 49637.5 4963750 -32382 32553 5073.02 507302 -127 124 -0.9 -90 +188 2 10178 99089 0.56456 297.56456 149.06456 14906.45645 0.56456 297.56458 149.06456 14906.45645 0.56456 297.56456 149.06456 14906.456 2020-01-01 2020-01-02 2020-01-01 00:03:08 2020-01-02 03:31:29 2020-01-01 00:03:08.000 2020-01-02 03:31:29.000 188 99089 49638.5 4963850 188 99089 49638.5 4963850 -32381 32554 5074.02 507402 -126 125 0.1 10 +189 2 10179 99090 0.56756 297.56756 149.06756 14906.75675 0.56756 297.56757 149.06756 14906.75661 0.56756 297.56756 149.06756 14906.756 2020-01-01 2020-01-02 2020-01-01 00:03:09 2020-01-02 03:31:30 2020-01-01 00:03:09.000 2020-01-02 03:31:30.000 189 99090 49639.5 4963950 189 99090 49639.5 4963950 -32380 32555 5075.02 507502 -125 126 1.1 110 19 2 10009 99919 0.05705 300.05705 150.05705 15155.76276 0.05705 300.05707 150.05705 15155.76279 0.05705 300.05705 150.05705 15155.76205 2020-01-01 2020-01-02 2020-01-01 00:00:19 2020-01-02 03:45:19 2020-01-01 00:00:19.000 2020-01-02 03:45:19.000 19 99919 49969 5046869 19 99919 49969 5046869 -32550 32385 4548.009900990099 459349 -127 125 -1.693069306930693 -171 -190 2 10180 99091 0.57057 297.57057 149.07057 14907.05705 0.57057 297.57056 149.07056 14907.05695 0.57057 297.57057 149.07057 14907.05700 2020-01-01 2020-01-02 2020-01-01 00:03:10 2020-01-02 03:31:31 2020-01-01 00:03:10.000 2020-01-02 03:31:31.000 190 99091 49640.5 4964050 190 99091 49640.5 4964050 -32379 32556 5076.02 507602 -124 127 2.1 210 -191 2 10181 99092 0.57357 297.57357 149.07357 14907.35735 0.57357 297.57358 149.07357 14907.35753 0.57357 297.57357 149.07357 14907.35700 2020-01-01 2020-01-02 2020-01-01 00:03:11 2020-01-02 03:31:32 2020-01-01 00:03:11.000 2020-01-02 03:31:32.000 191 99092 49641.5 4964150 191 99092 49641.5 4964150 -32378 32557 5077.02 507702 -128 127 0.54 54 -192 2 10182 99093 0.57657 297.57657 149.07657 14907.65765 0.57657 297.57657 149.07657 14907.65784 0.57657 297.57657 149.07657 14907.65700 2020-01-01 2020-01-02 2020-01-01 00:03:12 2020-01-02 03:31:33 2020-01-01 00:03:12.000 2020-01-02 03:31:33.000 192 99093 49642.5 4964250 192 99093 49642.5 4964250 -32377 32558 5078.02 507802 -128 123 -1.02 -102 -193 2 10183 99094 0.57957 297.57957 149.07957 14907.95795 0.57957 297.5796 149.07957 14907.95793 0.57957 297.57957 149.07957 14907.95700 2020-01-01 2020-01-02 2020-01-01 00:03:13 2020-01-02 03:31:34 2020-01-01 00:03:13.000 2020-01-02 03:31:34.000 193 99094 49643.5 4964350 193 99094 49643.5 4964350 -32376 32559 5079.02 507902 -127 124 -0.02 -2 -194 2 10184 99095 0.58258 297.58258 149.08258 14908.25825 0.58258 297.58258 149.08258 14908.25811 0.58258 297.58258 149.08258 14908.25800 2020-01-01 2020-01-02 2020-01-01 00:03:14 2020-01-02 03:31:35 2020-01-01 00:03:14.000 2020-01-02 03:31:35.000 194 99095 49644.5 4964450 194 99095 49644.5 4964450 -32375 32560 5080.02 508002 -126 125 0.98 98 -195 2 10185 99096 0.58558 297.58558 149.08558 14908.55855 0.58558 297.58557 149.08558 14908.55842 0.58558 297.58558 149.08558000000002 14908.55800 2020-01-01 2020-01-02 2020-01-01 00:03:15 2020-01-02 03:31:36 2020-01-01 00:03:15.000 2020-01-02 03:31:36.000 195 99096 49645.5 4964550 195 99096 49645.5 4964550 -32374 32561 5081.02 508102 -125 126 1.98 198 -196 2 10186 99097 0.58858 297.58858 149.08858 14908.85885 0.58858 297.5886 149.08859 14908.859 0.58858 297.58858 149.08858 14908.85800 2020-01-01 2020-01-02 2020-01-01 00:03:16 2020-01-02 03:31:37 2020-01-01 00:03:16.000 2020-01-02 03:31:37.000 196 99097 49646.5 4964650 196 99097 49646.5 4964650 -32373 32562 5082.02 508202 -124 127 2.98 298 -197 2 10187 99098 0.59159 297.59159 149.09159 14909.15915 0.59159 297.59158 149.09159 14909.15931 0.59159 297.59159 149.09159 14909.15900 2020-01-01 2020-01-02 2020-01-01 00:03:17 2020-01-02 03:31:38 2020-01-01 00:03:17.000 2020-01-02 03:31:38.000 197 99098 49647.5 4964750 197 99098 49647.5 4964750 -32372 32563 5083.02 508302 -128 127 1.42 142 -198 2 10188 99099 0.59459 297.59459 149.09459 14909.45945 0.59459 297.5946 149.09459 14909.4594 0.59459 297.59459 149.09459 14909.45900 2020-01-01 2020-01-02 2020-01-01 00:03:18 2020-01-02 03:31:39 2020-01-01 00:03:18.000 2020-01-02 03:31:39.000 198 99099 49648.5 4964850 198 99099 49648.5 4964850 -32371 32564 5084.02 508402 -128 127 -0.14 -14 -199 2 10189 99100 0.59759 297.59759 149.09759 14909.75975 0.59759 297.5976 149.09759 14909.75958 0.59759 297.59759 149.09759 14909.75900 2020-01-01 2020-01-02 2020-01-01 00:03:19 2020-01-02 03:31:40 2020-01-01 00:03:19.000 2020-01-02 03:31:40.000 199 99100 49649.5 4964950 199 99100 49649.5 4964950 -32370 32565 5085.02 508502 -128 124 -1.7 -170 -2 2 1001 9992 0.006 300.006 150.006 15150.6066 0.006 300.006 150.006 15150.6069 0.00600 300.00600 150.006 15150.60600 2020-01-01 2020-01-02 2020-01-01 00:00:02 2020-01-02 03:45:02 2020-01-01 00:00:02.000 2020-01-02 03:45:02.000 2 99902 49952 5045152 2 99902 49952 5045152 -32567 32368 4531.009900990099 457632 -125 126 -0.9504950495049505 -96 +190 2 10180 99091 0.57057 297.57057 149.07057 14907.05705 0.57057 297.57056 149.07056 14907.05695 0.57057 297.57057 149.07057 14907.057 2020-01-01 2020-01-02 2020-01-01 00:03:10 2020-01-02 03:31:31 2020-01-01 00:03:10.000 2020-01-02 03:31:31.000 190 99091 49640.5 4964050 190 99091 49640.5 4964050 -32379 32556 5076.02 507602 -124 127 2.1 210 +191 2 10181 99092 0.57357 297.57357 149.07357 14907.35735 0.57357 297.57358 149.07357 14907.35753 0.57357 297.57357 149.07357 14907.357 2020-01-01 2020-01-02 2020-01-01 00:03:11 2020-01-02 03:31:32 2020-01-01 00:03:11.000 2020-01-02 03:31:32.000 191 99092 49641.5 4964150 191 99092 49641.5 4964150 -32378 32557 5077.02 507702 -128 127 0.54 54 +192 2 10182 99093 0.57657 297.57657 149.07657 14907.65765 0.57657 297.57657 149.07657 14907.65784 0.57657 297.57657 149.07657 14907.657 2020-01-01 2020-01-02 2020-01-01 00:03:12 2020-01-02 03:31:33 2020-01-01 00:03:12.000 2020-01-02 03:31:33.000 192 99093 49642.5 4964250 192 99093 49642.5 4964250 -32377 32558 5078.02 507802 -128 123 -1.02 -102 +193 2 10183 99094 0.57957 297.57957 149.07957 14907.95795 0.57957 297.5796 149.07957 14907.95793 0.57957 297.57957 149.07957 14907.957 2020-01-01 2020-01-02 2020-01-01 00:03:13 2020-01-02 03:31:34 2020-01-01 00:03:13.000 2020-01-02 03:31:34.000 193 99094 49643.5 4964350 193 99094 49643.5 4964350 -32376 32559 5079.02 507902 -127 124 -0.02 -2 +194 2 10184 99095 0.58258 297.58258 149.08258 14908.25825 0.58258 297.58258 149.08258 14908.25811 0.58258 297.58258 149.08258 14908.258 2020-01-01 2020-01-02 2020-01-01 00:03:14 2020-01-02 03:31:35 2020-01-01 00:03:14.000 2020-01-02 03:31:35.000 194 99095 49644.5 4964450 194 99095 49644.5 4964450 -32375 32560 5080.02 508002 -126 125 0.98 98 +195 2 10185 99096 0.58558 297.58558 149.08558 14908.55855 0.58558 297.58557 149.08558 14908.55842 0.58558 297.58558 149.08558000000002 14908.558 2020-01-01 2020-01-02 2020-01-01 00:03:15 2020-01-02 03:31:36 2020-01-01 00:03:15.000 2020-01-02 03:31:36.000 195 99096 49645.5 4964550 195 99096 49645.5 4964550 -32374 32561 5081.02 508102 -125 126 1.98 198 +196 2 10186 99097 0.58858 297.58858 149.08858 14908.85885 0.58858 297.5886 149.08859 14908.859 0.58858 297.58858 149.08858 14908.858 2020-01-01 2020-01-02 2020-01-01 00:03:16 2020-01-02 03:31:37 2020-01-01 00:03:16.000 2020-01-02 03:31:37.000 196 99097 49646.5 4964650 196 99097 49646.5 4964650 -32373 32562 5082.02 508202 -124 127 2.98 298 +197 2 10187 99098 0.59159 297.59159 149.09159 14909.15915 0.59159 297.59158 149.09159 14909.15931 0.59159 297.59159 149.09159 14909.159 2020-01-01 2020-01-02 2020-01-01 00:03:17 2020-01-02 03:31:38 2020-01-01 00:03:17.000 2020-01-02 03:31:38.000 197 99098 49647.5 4964750 197 99098 49647.5 4964750 -32372 32563 5083.02 508302 -128 127 1.42 142 +198 2 10188 99099 0.59459 297.59459 149.09459 14909.45945 0.59459 297.5946 149.09459 14909.4594 0.59459 297.59459 149.09459 14909.459 2020-01-01 2020-01-02 2020-01-01 00:03:18 2020-01-02 03:31:39 2020-01-01 00:03:18.000 2020-01-02 03:31:39.000 198 99099 49648.5 4964850 198 99099 49648.5 4964850 -32371 32564 5084.02 508402 -128 127 -0.14 -14 +199 2 10189 99100 0.59759 297.59759 149.09759 14909.75975 0.59759 297.5976 149.09759 14909.75958 0.59759 297.59759 149.09759 14909.759 2020-01-01 2020-01-02 2020-01-01 00:03:19 2020-01-02 03:31:40 2020-01-01 00:03:19.000 2020-01-02 03:31:40.000 199 99100 49649.5 4964950 199 99100 49649.5 4964950 -32370 32565 5085.02 508502 -128 124 -1.7 -170 +2 2 1001 9992 0.006 300.006 150.006 15150.6066 0.006 300.006 150.006 15150.6069 0.006 300.006 150.006 15150.606 2020-01-01 2020-01-02 2020-01-01 00:00:02 2020-01-02 03:45:02 2020-01-01 00:00:02.000 2020-01-02 03:45:02.000 2 99902 49952 5045152 2 99902 49952 5045152 -32567 32368 4531.009900990099 457632 -125 126 -0.9504950495049505 -96 20 2 10010 99920 0.06006 300.06006 150.06006 15156.06606 0.06006 300.06006 150.06005 15156.06593 0.06006 300.06006 150.06006 15156.06606 2020-01-01 2020-01-02 2020-01-01 00:00:20 2020-01-02 03:45:20 2020-01-01 00:00:20.000 2020-01-02 03:45:20.000 20 99920 49970 5046970 20 99920 49970 5046970 -32549 32386 4549.009900990099 459450 -126 126 -0.693069306930693 -70 -200 2 10190 99101 0.6006 297.6006 149.1006 14910.06006 0.6006 297.6006 149.10059 14910.0599 0.60060 297.60060 149.1006 14910.06000 2020-01-01 2020-01-02 2020-01-01 00:03:20 2020-01-02 03:31:41 2020-01-01 00:03:20.000 2020-01-02 03:31:41.000 200 99101 49650.5 4965050 200 99101 49650.5 4965050 -32369 32566 5086.02 508602 -127 125 -0.7 -70 -201 2 10191 99102 0.6036 297.6036 149.1036 14910.36036 0.6036 297.6036 149.1036 14910.36063 0.60360 297.60360 149.1036 14910.36000 2020-01-01 2020-01-02 2020-01-01 00:03:21 2020-01-02 03:31:42 2020-01-01 00:03:21.000 2020-01-02 03:31:42.000 201 99102 49651.5 4965150 201 99102 49651.5 4965150 -32368 32567 5087.02 508702 -126 126 0.3 30 -202 2 10192 99103 0.6066 297.6066 149.1066 14910.66066 0.6066 297.6066 149.1066 14910.66078 0.60660 297.60660 149.1066 14910.66000 2020-01-01 2020-01-02 2020-01-01 00:03:22 2020-01-02 03:31:43 2020-01-01 00:03:22.000 2020-01-02 03:31:43.000 202 99103 49652.5 4965250 202 99103 49652.5 4965250 -32367 32568 5088.02 508802 -125 127 1.3 130 -203 2 10193 99104 0.6096 297.6096 149.1096 14910.96096 0.6096 297.60962 149.1096 14910.9609 0.60960 297.60960 149.1096 14910.96000 2020-01-01 2020-01-02 2020-01-01 00:03:23 2020-01-02 03:31:44 2020-01-01 00:03:23.000 2020-01-02 03:31:44.000 203 99104 49653.5 4965350 203 99104 49653.5 4965350 -32366 32569 5089.02 508902 -128 127 -0.26 -26 -204 2 10194 99105 0.61261 297.61261 149.11261 14911.26126 0.61261 297.6126 149.11261 14911.26105 0.61261 297.61261 149.11261000000002 14911.26100 2020-01-01 2020-01-02 2020-01-01 00:03:24 2020-01-02 03:31:45 2020-01-01 00:03:24.000 2020-01-02 03:31:45.000 204 99105 49654.5 4965450 204 99105 49654.5 4965450 -32365 32570 5090.02 509002 -128 127 -1.82 -182 -205 2 10195 99106 0.61561 297.61561 149.11561 14911.56156 0.61561 297.6156 149.11561 14911.56137 0.61561 297.61561 149.11561 14911.56100 2020-01-01 2020-01-02 2020-01-01 00:03:25 2020-01-02 03:31:46 2020-01-01 00:03:25.000 2020-01-02 03:31:46.000 205 99106 49655.5 4965550 205 99106 49655.5 4965550 -32364 32571 5091.02 509102 -128 123 -3.38 -338 -206 2 10196 99107 0.61861 297.61861 149.11861 14911.86186 0.61861 297.61862 149.11862 14911.8621 0.61861 297.61861 149.11861000000002 14911.86100 2020-01-01 2020-01-02 2020-01-01 00:03:26 2020-01-02 03:31:47 2020-01-01 00:03:26.000 2020-01-02 03:31:47.000 206 99107 49656.5 4965650 206 99107 49656.5 4965650 -32363 32572 5092.02 509202 -127 124 -2.38 -238 -207 2 10197 99108 0.62162 297.62162 149.12162 14912.16216 0.62162 297.6216 149.12162 14912.16225 0.62162 297.62162 149.12162 14912.16200 2020-01-01 2020-01-02 2020-01-01 00:03:27 2020-01-02 03:31:48 2020-01-01 00:03:27.000 2020-01-02 03:31:48.000 207 99108 49657.5 4965750 207 99108 49657.5 4965750 -32362 32573 5093.02 509302 -126 125 -1.38 -138 -208 2 10198 99109 0.62462 297.62462 149.12462 14912.46246 0.62462 297.62463 149.12462 14912.46237 0.62462 297.62462 149.12462 14912.46200 2020-01-01 2020-01-02 2020-01-01 00:03:28 2020-01-02 03:31:49 2020-01-01 00:03:28.000 2020-01-02 03:31:49.000 208 99109 49658.5 4965850 208 99109 49658.5 4965850 -32361 32574 5094.02 509402 -125 126 -0.38 -38 -209 2 10199 99110 0.62762 297.62762 149.12762 14912.76276 0.62762 297.62762 149.12762 14912.76253 0.62762 297.62762 149.12762 14912.76200 2020-01-01 2020-01-02 2020-01-01 00:03:29 2020-01-02 03:31:50 2020-01-01 00:03:29.000 2020-01-02 03:31:50.000 209 99110 49659.5 4965950 209 99110 49659.5 4965950 -32360 32575 5095.02 509502 -124 127 0.62 62 +200 2 10190 99101 0.6006 297.6006 149.1006 14910.06006 0.6006 297.6006 149.10059 14910.0599 0.6006 297.6006 149.1006 14910.06 2020-01-01 2020-01-02 2020-01-01 00:03:20 2020-01-02 03:31:41 2020-01-01 00:03:20.000 2020-01-02 03:31:41.000 200 99101 49650.5 4965050 200 99101 49650.5 4965050 -32369 32566 5086.02 508602 -127 125 -0.7 -70 +201 2 10191 99102 0.6036 297.6036 149.1036 14910.36036 0.6036 297.6036 149.1036 14910.36063 0.6036 297.6036 149.1036 14910.36 2020-01-01 2020-01-02 2020-01-01 00:03:21 2020-01-02 03:31:42 2020-01-01 00:03:21.000 2020-01-02 03:31:42.000 201 99102 49651.5 4965150 201 99102 49651.5 4965150 -32368 32567 5087.02 508702 -126 126 0.3 30 +202 2 10192 99103 0.6066 297.6066 149.1066 14910.66066 0.6066 297.6066 149.1066 14910.66078 0.6066 297.6066 149.1066 14910.66 2020-01-01 2020-01-02 2020-01-01 00:03:22 2020-01-02 03:31:43 2020-01-01 00:03:22.000 2020-01-02 03:31:43.000 202 99103 49652.5 4965250 202 99103 49652.5 4965250 -32367 32568 5088.02 508802 -125 127 1.3 130 +203 2 10193 99104 0.6096 297.6096 149.1096 14910.96096 0.6096 297.60962 149.1096 14910.9609 0.6096 297.6096 149.1096 14910.96 2020-01-01 2020-01-02 2020-01-01 00:03:23 2020-01-02 03:31:44 2020-01-01 00:03:23.000 2020-01-02 03:31:44.000 203 99104 49653.5 4965350 203 99104 49653.5 4965350 -32366 32569 5089.02 508902 -128 127 -0.26 -26 +204 2 10194 99105 0.61261 297.61261 149.11261 14911.26126 0.61261 297.6126 149.11261 14911.26105 0.61261 297.61261 149.11261000000002 14911.261 2020-01-01 2020-01-02 2020-01-01 00:03:24 2020-01-02 03:31:45 2020-01-01 00:03:24.000 2020-01-02 03:31:45.000 204 99105 49654.5 4965450 204 99105 49654.5 4965450 -32365 32570 5090.02 509002 -128 127 -1.82 -182 +205 2 10195 99106 0.61561 297.61561 149.11561 14911.56156 0.61561 297.6156 149.11561 14911.56137 0.61561 297.61561 149.11561 14911.561 2020-01-01 2020-01-02 2020-01-01 00:03:25 2020-01-02 03:31:46 2020-01-01 00:03:25.000 2020-01-02 03:31:46.000 205 99106 49655.5 4965550 205 99106 49655.5 4965550 -32364 32571 5091.02 509102 -128 123 -3.38 -338 +206 2 10196 99107 0.61861 297.61861 149.11861 14911.86186 0.61861 297.61862 149.11862 14911.8621 0.61861 297.61861 149.11861000000002 14911.861 2020-01-01 2020-01-02 2020-01-01 00:03:26 2020-01-02 03:31:47 2020-01-01 00:03:26.000 2020-01-02 03:31:47.000 206 99107 49656.5 4965650 206 99107 49656.5 4965650 -32363 32572 5092.02 509202 -127 124 -2.38 -238 +207 2 10197 99108 0.62162 297.62162 149.12162 14912.16216 0.62162 297.6216 149.12162 14912.16225 0.62162 297.62162 149.12162 14912.162 2020-01-01 2020-01-02 2020-01-01 00:03:27 2020-01-02 03:31:48 2020-01-01 00:03:27.000 2020-01-02 03:31:48.000 207 99108 49657.5 4965750 207 99108 49657.5 4965750 -32362 32573 5093.02 509302 -126 125 -1.38 -138 +208 2 10198 99109 0.62462 297.62462 149.12462 14912.46246 0.62462 297.62463 149.12462 14912.46237 0.62462 297.62462 149.12462 14912.462 2020-01-01 2020-01-02 2020-01-01 00:03:28 2020-01-02 03:31:49 2020-01-01 00:03:28.000 2020-01-02 03:31:49.000 208 99109 49658.5 4965850 208 99109 49658.5 4965850 -32361 32574 5094.02 509402 -125 126 -0.38 -38 +209 2 10199 99110 0.62762 297.62762 149.12762 14912.76276 0.62762 297.62762 149.12762 14912.76253 0.62762 297.62762 149.12762 14912.762 2020-01-01 2020-01-02 2020-01-01 00:03:29 2020-01-02 03:31:50 2020-01-01 00:03:29.000 2020-01-02 03:31:50.000 209 99110 49659.5 4965950 209 99110 49659.5 4965950 -32360 32575 5095.02 509502 -124 127 0.62 62 21 2 10011 99921 0.06306 300.06306 150.06306 15156.36936 0.06306 300.06305 150.06306 15156.36927 0.06306 300.06306 150.06306 15156.36906 2020-01-01 2020-01-02 2020-01-01 00:00:21 2020-01-02 03:45:21 2020-01-01 00:00:21.000 2020-01-02 03:45:21.000 21 99921 49971 5047071 21 99921 49971 5047071 -32548 32387 4550.009900990099 459551 -125 127 0.3069306930693069 31 -210 2 10200 99111 0.63063 297.63063 149.13063 14913.06306 0.63063 297.63065 149.13063 14913.06326 0.63063 297.63063 149.13063 14913.06300 2020-01-01 2020-01-02 2020-01-01 00:03:30 2020-01-02 03:31:51 2020-01-01 00:03:30.000 2020-01-02 03:31:51.000 210 99111 49660.5 4966050 210 99111 49660.5 4966050 -32359 32576 5096.02 509602 -128 127 -0.94 -94 -211 2 10201 99112 0.63363 297.63363 149.13363 14913.36336 0.63363 297.63364 149.13363 14913.36357 0.63363 297.63363 149.13362999999998 14913.36300 2020-01-01 2020-01-02 2020-01-01 00:03:31 2020-01-02 03:31:52 2020-01-01 00:03:31.000 2020-01-02 03:31:52.000 211 99112 49661.5 4966150 211 99112 49661.5 4966150 -32358 32577 5097.02 509702 -128 123 -2.5 -250 -212 2 10202 99113 0.63663 297.63663 149.13663 14913.66366 0.63663 297.63663 149.13663 14913.66372 0.63663 297.63663 149.13663 14913.66300 2020-01-01 2020-01-02 2020-01-01 00:03:32 2020-01-02 03:31:53 2020-01-01 00:03:32.000 2020-01-02 03:31:53.000 212 99113 49662.5 4966250 212 99113 49662.5 4966250 -32357 32578 5098.02 509802 -127 124 -1.5 -150 -213 2 10203 99114 0.63963 297.63963 149.13963 14913.96396 0.63963 297.63965 149.13963 14913.96384 0.63963 297.63963 149.13963 14913.96300 2020-01-01 2020-01-02 2020-01-01 00:03:33 2020-01-02 03:31:54 2020-01-01 00:03:33.000 2020-01-02 03:31:54.000 213 99114 49663.5 4966350 213 99114 49663.5 4966350 -32356 32579 5099.02 509902 -126 125 -0.5 -50 -214 2 10204 99115 0.64264 297.64264 149.14264 14914.26426 0.64264 297.64264 149.14263 14914.26399 0.64264 297.64264 149.14264 14914.26400 2020-01-01 2020-01-02 2020-01-01 00:03:34 2020-01-02 03:31:55 2020-01-01 00:03:34.000 2020-01-02 03:31:55.000 214 99115 49664.5 4966450 214 99115 49664.5 4966450 -32355 32580 5100.02 510002 -125 126 0.5 50 -215 2 10205 99116 0.64564 297.64564 149.14564 14914.56456 0.64564 297.64566 149.14564 14914.56473 0.64564 297.64564 149.14564000000001 14914.56400 2020-01-01 2020-01-02 2020-01-01 00:03:35 2020-01-02 03:31:56 2020-01-01 00:03:35.000 2020-01-02 03:31:56.000 215 99116 49665.5 4966550 215 99116 49665.5 4966550 -32354 32581 5101.02 510102 -124 127 1.5 150 -216 2 10206 99117 0.64864 297.64864 149.14864 14914.86486 0.64864 297.64865 149.14865 14914.86504 0.64864 297.64864 149.14864 14914.86400 2020-01-01 2020-01-02 2020-01-01 00:03:36 2020-01-02 03:31:57 2020-01-01 00:03:36.000 2020-01-02 03:31:57.000 216 99117 49666.5 4966650 216 99117 49666.5 4966650 -32353 32582 5102.02 510202 -128 127 -0.06 -6 -217 2 10207 99118 0.65165 297.65165 149.15165 14915.16516 0.65165 297.65164 149.15165 14915.16523 0.65165 297.65165 149.15165000000002 14915.16500 2020-01-01 2020-01-02 2020-01-01 00:03:37 2020-01-02 03:31:58 2020-01-01 00:03:37.000 2020-01-02 03:31:58.000 217 99118 49667.5 4966750 217 99118 49667.5 4966750 -32352 32583 5103.02 510302 -128 123 -1.62 -162 -218 2 10208 99119 0.65465 297.65465 149.15465 14915.46546 0.65465 297.65466 149.15465 14915.46531 0.65465 297.65465 149.15465 14915.46500 2020-01-01 2020-01-02 2020-01-01 00:03:38 2020-01-02 03:31:59 2020-01-01 00:03:38.000 2020-01-02 03:31:59.000 218 99119 49668.5 4966850 218 99119 49668.5 4966850 -32351 32584 5104.02 510402 -127 124 -0.62 -62 -219 2 10209 99120 0.65765 297.65765 149.15765 14915.76576 0.65765 297.65765 149.15765 14915.76562 0.65765 297.65765 149.15765 14915.76500 2020-01-01 2020-01-02 2020-01-01 00:03:39 2020-01-02 03:32:00 2020-01-01 00:03:39.000 2020-01-02 03:32:00.000 219 99120 49669.5 4966950 219 99120 49669.5 4966950 -32350 32585 5105.02 510502 -126 125 0.38 38 +210 2 10200 99111 0.63063 297.63063 149.13063 14913.06306 0.63063 297.63065 149.13063 14913.06326 0.63063 297.63063 149.13063 14913.063 2020-01-01 2020-01-02 2020-01-01 00:03:30 2020-01-02 03:31:51 2020-01-01 00:03:30.000 2020-01-02 03:31:51.000 210 99111 49660.5 4966050 210 99111 49660.5 4966050 -32359 32576 5096.02 509602 -128 127 -0.94 -94 +211 2 10201 99112 0.63363 297.63363 149.13363 14913.36336 0.63363 297.63364 149.13363 14913.36357 0.63363 297.63363 149.13362999999998 14913.363 2020-01-01 2020-01-02 2020-01-01 00:03:31 2020-01-02 03:31:52 2020-01-01 00:03:31.000 2020-01-02 03:31:52.000 211 99112 49661.5 4966150 211 99112 49661.5 4966150 -32358 32577 5097.02 509702 -128 123 -2.5 -250 +212 2 10202 99113 0.63663 297.63663 149.13663 14913.66366 0.63663 297.63663 149.13663 14913.66372 0.63663 297.63663 149.13663 14913.663 2020-01-01 2020-01-02 2020-01-01 00:03:32 2020-01-02 03:31:53 2020-01-01 00:03:32.000 2020-01-02 03:31:53.000 212 99113 49662.5 4966250 212 99113 49662.5 4966250 -32357 32578 5098.02 509802 -127 124 -1.5 -150 +213 2 10203 99114 0.63963 297.63963 149.13963 14913.96396 0.63963 297.63965 149.13963 14913.96384 0.63963 297.63963 149.13963 14913.963 2020-01-01 2020-01-02 2020-01-01 00:03:33 2020-01-02 03:31:54 2020-01-01 00:03:33.000 2020-01-02 03:31:54.000 213 99114 49663.5 4966350 213 99114 49663.5 4966350 -32356 32579 5099.02 509902 -126 125 -0.5 -50 +214 2 10204 99115 0.64264 297.64264 149.14264 14914.26426 0.64264 297.64264 149.14263 14914.26399 0.64264 297.64264 149.14264 14914.264 2020-01-01 2020-01-02 2020-01-01 00:03:34 2020-01-02 03:31:55 2020-01-01 00:03:34.000 2020-01-02 03:31:55.000 214 99115 49664.5 4966450 214 99115 49664.5 4966450 -32355 32580 5100.02 510002 -125 126 0.5 50 +215 2 10205 99116 0.64564 297.64564 149.14564 14914.56456 0.64564 297.64566 149.14564 14914.56473 0.64564 297.64564 149.14564000000001 14914.564 2020-01-01 2020-01-02 2020-01-01 00:03:35 2020-01-02 03:31:56 2020-01-01 00:03:35.000 2020-01-02 03:31:56.000 215 99116 49665.5 4966550 215 99116 49665.5 4966550 -32354 32581 5101.02 510102 -124 127 1.5 150 +216 2 10206 99117 0.64864 297.64864 149.14864 14914.86486 0.64864 297.64865 149.14865 14914.86504 0.64864 297.64864 149.14864 14914.864 2020-01-01 2020-01-02 2020-01-01 00:03:36 2020-01-02 03:31:57 2020-01-01 00:03:36.000 2020-01-02 03:31:57.000 216 99117 49666.5 4966650 216 99117 49666.5 4966650 -32353 32582 5102.02 510202 -128 127 -0.06 -6 +217 2 10207 99118 0.65165 297.65165 149.15165 14915.16516 0.65165 297.65164 149.15165 14915.16523 0.65165 297.65165 149.15165000000002 14915.165 2020-01-01 2020-01-02 2020-01-01 00:03:37 2020-01-02 03:31:58 2020-01-01 00:03:37.000 2020-01-02 03:31:58.000 217 99118 49667.5 4966750 217 99118 49667.5 4966750 -32352 32583 5103.02 510302 -128 123 -1.62 -162 +218 2 10208 99119 0.65465 297.65465 149.15465 14915.46546 0.65465 297.65466 149.15465 14915.46531 0.65465 297.65465 149.15465 14915.465 2020-01-01 2020-01-02 2020-01-01 00:03:38 2020-01-02 03:31:59 2020-01-01 00:03:38.000 2020-01-02 03:31:59.000 218 99119 49668.5 4966850 218 99119 49668.5 4966850 -32351 32584 5104.02 510402 -127 124 -0.62 -62 +219 2 10209 99120 0.65765 297.65765 149.15765 14915.76576 0.65765 297.65765 149.15765 14915.76562 0.65765 297.65765 149.15765 14915.765 2020-01-01 2020-01-02 2020-01-01 00:03:39 2020-01-02 03:32:00 2020-01-01 00:03:39.000 2020-01-02 03:32:00.000 219 99120 49669.5 4966950 219 99120 49669.5 4966950 -32350 32585 5105.02 510502 -126 125 0.38 38 22 2 10012 99922 0.06606 300.06606 150.06606 15156.67267 0.06606 300.06607 150.06606 15156.67287 0.06606 300.06606 150.06606000000002 15156.67206 2020-01-01 2020-01-02 2020-01-01 00:00:22 2020-01-02 03:45:22 2020-01-01 00:00:22.000 2020-01-02 03:45:22.000 22 99922 49972 5047172 22 99922 49972 5047172 -32547 32388 4551.009900990099 459652 -128 127 -1.2277227722772277 -124 -220 2 10210 99121 0.66066 297.66066 149.16066 14916.06606 0.66066 297.66068 149.16066 14916.06619 0.66066 297.66066 149.16066 14916.06600 2020-01-01 2020-01-02 2020-01-01 00:03:40 2020-01-02 03:32:01 2020-01-01 00:03:40.000 2020-01-02 03:32:01.000 220 99121 49670.5 4967050 220 99121 49670.5 4967050 -32349 32586 5106.02 510602 -125 126 1.38 138 -221 2 10211 99122 0.66366 297.66366 149.16366 14916.36636 0.66366 297.66367 149.16366 14916.36651 0.66366 297.66366 149.16366 14916.36600 2020-01-01 2020-01-02 2020-01-01 00:03:41 2020-01-02 03:32:02 2020-01-01 00:03:41.000 2020-01-02 03:32:02.000 221 99122 49671.5 4967150 221 99122 49671.5 4967150 -32348 32587 5107.02 510702 -124 127 2.38 238 -222 2 10212 99123 0.66666 297.66666 149.16666 14916.66666 0.66666 297.66666 149.16666 14916.6667 0.66666 297.66666 149.16665999999998 14916.66600 2020-01-01 2020-01-02 2020-01-01 00:03:42 2020-01-02 03:32:03 2020-01-01 00:03:42.000 2020-01-02 03:32:03.000 222 99123 49672.5 4967250 222 99123 49672.5 4967250 -32347 32588 5108.02 510802 -128 127 0.82 82 -223 2 10213 99124 0.66966 297.66966 149.16966 14916.96696 0.66966 297.66968 149.16966 14916.96678 0.66966 297.66966 149.16966 14916.96600 2020-01-01 2020-01-02 2020-01-01 00:03:43 2020-01-02 03:32:04 2020-01-01 00:03:43.000 2020-01-02 03:32:04.000 223 99124 49673.5 4967350 223 99124 49673.5 4967350 -32346 32589 5109.02 510902 -128 127 -0.74 -74 -224 2 10214 99125 0.67267 297.67267 149.17267 14917.26726 0.67267 297.67267 149.17267 14917.26709 0.67267 297.67267 149.17267 14917.26700 2020-01-01 2020-01-02 2020-01-01 00:03:44 2020-01-02 03:32:05 2020-01-01 00:03:44.000 2020-01-02 03:32:05.000 224 99125 49674.5 4967450 224 99125 49674.5 4967450 -32345 32590 5110.02 511002 -128 124 -2.3 -230 -225 2 10215 99126 0.67567 297.67567 149.17567 14917.56756 0.67567 297.6757 149.17567 14917.56767 0.67567 297.67567 149.17567 14917.56700 2020-01-01 2020-01-02 2020-01-01 00:03:45 2020-01-02 03:32:06 2020-01-01 00:03:45.000 2020-01-02 03:32:06.000 225 99126 49675.5 4967550 225 99126 49675.5 4967550 -32344 32591 5111.02 511102 -127 125 -1.3 -130 -226 2 10216 99127 0.67867 297.67867 149.17867 14917.86786 0.67867 297.67868 149.17868 14917.86802 0.67867 297.67867 149.17867 14917.86700 2020-01-01 2020-01-02 2020-01-01 00:03:46 2020-01-02 03:32:07 2020-01-01 00:03:46.000 2020-01-02 03:32:07.000 226 99127 49676.5 4967650 226 99127 49676.5 4967650 -32343 32592 5112.02 511202 -126 126 -0.3 -30 -227 2 10217 99128 0.68168 297.68168 149.18168 14918.16816 0.68168 297.68167 149.18168 14918.16817 0.68168 297.68168 149.18168 14918.16800 2020-01-01 2020-01-02 2020-01-01 00:03:47 2020-01-02 03:32:08 2020-01-01 00:03:47.000 2020-01-02 03:32:08.000 227 99128 49677.5 4967750 227 99128 49677.5 4967750 -32342 32593 5113.02 511302 -125 127 0.7 70 -228 2 10218 99129 0.68468 297.68468 149.18468 14918.46846 0.68468 297.6847 149.18468 14918.46825 0.68468 297.68468 149.18468000000001 14918.46800 2020-01-01 2020-01-02 2020-01-01 00:03:48 2020-01-02 03:32:09 2020-01-01 00:03:48.000 2020-01-02 03:32:09.000 228 99129 49678.5 4967850 228 99129 49678.5 4967850 -32341 32594 5114.02 511402 -128 127 -0.86 -86 -229 2 10219 99130 0.68768 297.68768 149.18768 14918.76876 0.68768 297.68768 149.18768 14918.76855 0.68768 297.68768 149.18768 14918.76800 2020-01-01 2020-01-02 2020-01-01 00:03:49 2020-01-02 03:32:10 2020-01-01 00:03:49.000 2020-01-02 03:32:10.000 229 99130 49679.5 4967950 229 99130 49679.5 4967950 -32340 32595 5115.02 511502 -128 127 -2.42 -242 +220 2 10210 99121 0.66066 297.66066 149.16066 14916.06606 0.66066 297.66068 149.16066 14916.06619 0.66066 297.66066 149.16066 14916.066 2020-01-01 2020-01-02 2020-01-01 00:03:40 2020-01-02 03:32:01 2020-01-01 00:03:40.000 2020-01-02 03:32:01.000 220 99121 49670.5 4967050 220 99121 49670.5 4967050 -32349 32586 5106.02 510602 -125 126 1.38 138 +221 2 10211 99122 0.66366 297.66366 149.16366 14916.36636 0.66366 297.66367 149.16366 14916.36651 0.66366 297.66366 149.16366 14916.366 2020-01-01 2020-01-02 2020-01-01 00:03:41 2020-01-02 03:32:02 2020-01-01 00:03:41.000 2020-01-02 03:32:02.000 221 99122 49671.5 4967150 221 99122 49671.5 4967150 -32348 32587 5107.02 510702 -124 127 2.38 238 +222 2 10212 99123 0.66666 297.66666 149.16666 14916.66666 0.66666 297.66666 149.16666 14916.6667 0.66666 297.66666 149.16665999999998 14916.666 2020-01-01 2020-01-02 2020-01-01 00:03:42 2020-01-02 03:32:03 2020-01-01 00:03:42.000 2020-01-02 03:32:03.000 222 99123 49672.5 4967250 222 99123 49672.5 4967250 -32347 32588 5108.02 510802 -128 127 0.82 82 +223 2 10213 99124 0.66966 297.66966 149.16966 14916.96696 0.66966 297.66968 149.16966 14916.96678 0.66966 297.66966 149.16966 14916.966 2020-01-01 2020-01-02 2020-01-01 00:03:43 2020-01-02 03:32:04 2020-01-01 00:03:43.000 2020-01-02 03:32:04.000 223 99124 49673.5 4967350 223 99124 49673.5 4967350 -32346 32589 5109.02 510902 -128 127 -0.74 -74 +224 2 10214 99125 0.67267 297.67267 149.17267 14917.26726 0.67267 297.67267 149.17267 14917.26709 0.67267 297.67267 149.17267 14917.267 2020-01-01 2020-01-02 2020-01-01 00:03:44 2020-01-02 03:32:05 2020-01-01 00:03:44.000 2020-01-02 03:32:05.000 224 99125 49674.5 4967450 224 99125 49674.5 4967450 -32345 32590 5110.02 511002 -128 124 -2.3 -230 +225 2 10215 99126 0.67567 297.67567 149.17567 14917.56756 0.67567 297.6757 149.17567 14917.56767 0.67567 297.67567 149.17567 14917.567 2020-01-01 2020-01-02 2020-01-01 00:03:45 2020-01-02 03:32:06 2020-01-01 00:03:45.000 2020-01-02 03:32:06.000 225 99126 49675.5 4967550 225 99126 49675.5 4967550 -32344 32591 5111.02 511102 -127 125 -1.3 -130 +226 2 10216 99127 0.67867 297.67867 149.17867 14917.86786 0.67867 297.67868 149.17868 14917.86802 0.67867 297.67867 149.17867 14917.867 2020-01-01 2020-01-02 2020-01-01 00:03:46 2020-01-02 03:32:07 2020-01-01 00:03:46.000 2020-01-02 03:32:07.000 226 99127 49676.5 4967650 226 99127 49676.5 4967650 -32343 32592 5112.02 511202 -126 126 -0.3 -30 +227 2 10217 99128 0.68168 297.68168 149.18168 14918.16816 0.68168 297.68167 149.18168 14918.16817 0.68168 297.68168 149.18168 14918.168 2020-01-01 2020-01-02 2020-01-01 00:03:47 2020-01-02 03:32:08 2020-01-01 00:03:47.000 2020-01-02 03:32:08.000 227 99128 49677.5 4967750 227 99128 49677.5 4967750 -32342 32593 5113.02 511302 -125 127 0.7 70 +228 2 10218 99129 0.68468 297.68468 149.18468 14918.46846 0.68468 297.6847 149.18468 14918.46825 0.68468 297.68468 149.18468000000001 14918.468 2020-01-01 2020-01-02 2020-01-01 00:03:48 2020-01-02 03:32:09 2020-01-01 00:03:48.000 2020-01-02 03:32:09.000 228 99129 49678.5 4967850 228 99129 49678.5 4967850 -32341 32594 5114.02 511402 -128 127 -0.86 -86 +229 2 10219 99130 0.68768 297.68768 149.18768 14918.76876 0.68768 297.68768 149.18768 14918.76855 0.68768 297.68768 149.18768 14918.768 2020-01-01 2020-01-02 2020-01-01 00:03:49 2020-01-02 03:32:10 2020-01-01 00:03:49.000 2020-01-02 03:32:10.000 229 99130 49679.5 4967950 229 99130 49679.5 4967950 -32340 32595 5115.02 511502 -128 127 -2.42 -242 23 2 10013 99923 0.06906 300.06906 150.06906 15156.97597 0.06906 300.06906 150.06907 15156.97617 0.06906 300.06906 150.06906 15156.97506 2020-01-01 2020-01-02 2020-01-01 00:00:23 2020-01-02 03:45:23 2020-01-01 00:00:23.000 2020-01-02 03:45:23.000 23 99923 49973 5047273 23 99923 49973 5047273 -32546 32389 4552.009900990099 459753 -128 127 -2.762376237623762 -279 -230 2 10220 99131 0.69069 297.69069 149.19069 14919.06906 0.69069 297.6907 149.19069 14919.06914 0.69069 297.69069 149.19069 14919.06900 2020-01-01 2020-01-02 2020-01-01 00:03:50 2020-01-02 03:32:11 2020-01-01 00:03:50.000 2020-01-02 03:32:11.000 230 99131 49680.5 4968050 230 99131 49680.5 4968050 -32339 32596 5116.02 511602 -128 123 -3.98 -398 -231 2 10221 99132 0.69369 297.69369 149.19369 14919.36936 0.69369 297.6937 149.19369 14919.36949 0.69369 297.69369 149.19369 14919.36900 2020-01-01 2020-01-02 2020-01-01 00:03:51 2020-01-02 03:32:12 2020-01-01 00:03:51.000 2020-01-02 03:32:12.000 231 99132 49681.5 4968150 231 99132 49681.5 4968150 -32338 32597 5117.02 511702 -127 124 -2.98 -298 -232 2 10222 99133 0.69669 297.69669 149.19669 14919.66966 0.69669 297.6967 149.19669 14919.66964 0.69669 297.69669 149.19669 14919.66900 2020-01-01 2020-01-02 2020-01-01 00:03:52 2020-01-02 03:32:13 2020-01-01 00:03:52.000 2020-01-02 03:32:13.000 232 99133 49682.5 4968250 232 99133 49682.5 4968250 -32337 32598 5118.02 511802 -126 125 -1.98 -198 -233 2 10223 99134 0.69969 297.69969 149.19969 14919.96996 0.69969 297.6997 149.1997 14919.97037 0.69969 297.69969 149.19969 14919.96900 2020-01-01 2020-01-02 2020-01-01 00:03:53 2020-01-02 03:32:14 2020-01-01 00:03:53.000 2020-01-02 03:32:14.000 233 99134 49683.5 4968350 233 99134 49683.5 4968350 -32336 32599 5119.02 511902 -125 126 -0.98 -98 -234 2 10224 99135 0.7027 297.7027 149.2027 14920.27027 0.7027 297.7027 149.2027 14920.27003 0.70270 297.70270 149.2027 14920.27000 2020-01-01 2020-01-02 2020-01-01 00:03:54 2020-01-02 03:32:15 2020-01-01 00:03:54.000 2020-01-02 03:32:15.000 234 99135 49684.5 4968450 234 99135 49684.5 4968450 -32335 32600 5120.02 512002 -124 127 0.02 2 -235 2 10225 99136 0.7057 297.7057 149.2057 14920.57057 0.7057 297.70572 149.2057 14920.57065 0.70570 297.70570 149.2057 14920.57000 2020-01-01 2020-01-02 2020-01-01 00:03:55 2020-01-02 03:32:16 2020-01-01 00:03:55.000 2020-01-02 03:32:16.000 235 99136 49685.5 4968550 235 99136 49685.5 4968550 -32334 32601 5121.02 512102 -128 127 -1.54 -154 -236 2 10226 99137 0.7087 297.7087 149.2087 14920.87087 0.7087 297.7087 149.2087 14920.87095 0.70870 297.70870 149.20870000000002 14920.87000 2020-01-01 2020-01-02 2020-01-01 00:03:56 2020-01-02 03:32:17 2020-01-01 00:03:56.000 2020-01-02 03:32:17.000 236 99137 49686.5 4968650 236 99137 49686.5 4968650 -32333 32602 5122.02 512202 -128 123 -3.1 -310 -237 2 10227 99138 0.71171 297.71171 149.21171 14921.17117 0.71171 297.7117 149.21171 14921.17111 0.71171 297.71171 149.21171 14921.17100 2020-01-01 2020-01-02 2020-01-01 00:03:57 2020-01-02 03:32:18 2020-01-01 00:03:57.000 2020-01-02 03:32:18.000 237 99138 49687.5 4968750 237 99138 49687.5 4968750 -32332 32603 5123.02 512302 -127 124 -2.1 -210 -238 2 10228 99139 0.71471 297.71471 149.21471 14921.47147 0.71471 297.71472 149.21471 14921.47184 0.71471 297.71471 149.21471 14921.47100 2020-01-01 2020-01-02 2020-01-01 00:03:58 2020-01-02 03:32:19 2020-01-01 00:03:58.000 2020-01-02 03:32:19.000 238 99139 49688.5 4968850 238 99139 49688.5 4968850 -32331 32604 5124.02 512402 -126 125 -1.1 -110 -239 2 10229 99140 0.71771 297.71771 149.21771 14921.77177 0.71771 297.7177 149.21771 14921.7715 0.71771 297.71771 149.21771 14921.77100 2020-01-01 2020-01-02 2020-01-01 00:03:59 2020-01-02 03:32:20 2020-01-01 00:03:59.000 2020-01-02 03:32:20.000 239 99140 49689.5 4968950 239 99140 49689.5 4968950 -32330 32605 5125.02 512502 -125 126 -0.1 -10 +230 2 10220 99131 0.69069 297.69069 149.19069 14919.06906 0.69069 297.6907 149.19069 14919.06914 0.69069 297.69069 149.19069 14919.069 2020-01-01 2020-01-02 2020-01-01 00:03:50 2020-01-02 03:32:11 2020-01-01 00:03:50.000 2020-01-02 03:32:11.000 230 99131 49680.5 4968050 230 99131 49680.5 4968050 -32339 32596 5116.02 511602 -128 123 -3.98 -398 +231 2 10221 99132 0.69369 297.69369 149.19369 14919.36936 0.69369 297.6937 149.19369 14919.36949 0.69369 297.69369 149.19369 14919.369 2020-01-01 2020-01-02 2020-01-01 00:03:51 2020-01-02 03:32:12 2020-01-01 00:03:51.000 2020-01-02 03:32:12.000 231 99132 49681.5 4968150 231 99132 49681.5 4968150 -32338 32597 5117.02 511702 -127 124 -2.98 -298 +232 2 10222 99133 0.69669 297.69669 149.19669 14919.66966 0.69669 297.6967 149.19669 14919.66964 0.69669 297.69669 149.19669 14919.669 2020-01-01 2020-01-02 2020-01-01 00:03:52 2020-01-02 03:32:13 2020-01-01 00:03:52.000 2020-01-02 03:32:13.000 232 99133 49682.5 4968250 232 99133 49682.5 4968250 -32337 32598 5118.02 511802 -126 125 -1.98 -198 +233 2 10223 99134 0.69969 297.69969 149.19969 14919.96996 0.69969 297.6997 149.1997 14919.97037 0.69969 297.69969 149.19969 14919.969 2020-01-01 2020-01-02 2020-01-01 00:03:53 2020-01-02 03:32:14 2020-01-01 00:03:53.000 2020-01-02 03:32:14.000 233 99134 49683.5 4968350 233 99134 49683.5 4968350 -32336 32599 5119.02 511902 -125 126 -0.98 -98 +234 2 10224 99135 0.7027 297.7027 149.2027 14920.27027 0.7027 297.7027 149.2027 14920.27003 0.7027 297.7027 149.2027 14920.27 2020-01-01 2020-01-02 2020-01-01 00:03:54 2020-01-02 03:32:15 2020-01-01 00:03:54.000 2020-01-02 03:32:15.000 234 99135 49684.5 4968450 234 99135 49684.5 4968450 -32335 32600 5120.02 512002 -124 127 0.02 2 +235 2 10225 99136 0.7057 297.7057 149.2057 14920.57057 0.7057 297.70572 149.2057 14920.57065 0.7057 297.7057 149.2057 14920.57 2020-01-01 2020-01-02 2020-01-01 00:03:55 2020-01-02 03:32:16 2020-01-01 00:03:55.000 2020-01-02 03:32:16.000 235 99136 49685.5 4968550 235 99136 49685.5 4968550 -32334 32601 5121.02 512102 -128 127 -1.54 -154 +236 2 10226 99137 0.7087 297.7087 149.2087 14920.87087 0.7087 297.7087 149.2087 14920.87095 0.7087 297.7087 149.20870000000002 14920.87 2020-01-01 2020-01-02 2020-01-01 00:03:56 2020-01-02 03:32:17 2020-01-01 00:03:56.000 2020-01-02 03:32:17.000 236 99137 49686.5 4968650 236 99137 49686.5 4968650 -32333 32602 5122.02 512202 -128 123 -3.1 -310 +237 2 10227 99138 0.71171 297.71171 149.21171 14921.17117 0.71171 297.7117 149.21171 14921.17111 0.71171 297.71171 149.21171 14921.171 2020-01-01 2020-01-02 2020-01-01 00:03:57 2020-01-02 03:32:18 2020-01-01 00:03:57.000 2020-01-02 03:32:18.000 237 99138 49687.5 4968750 237 99138 49687.5 4968750 -32332 32603 5123.02 512302 -127 124 -2.1 -210 +238 2 10228 99139 0.71471 297.71471 149.21471 14921.47147 0.71471 297.71472 149.21471 14921.47184 0.71471 297.71471 149.21471 14921.471 2020-01-01 2020-01-02 2020-01-01 00:03:58 2020-01-02 03:32:19 2020-01-01 00:03:58.000 2020-01-02 03:32:19.000 238 99139 49688.5 4968850 238 99139 49688.5 4968850 -32331 32604 5124.02 512402 -126 125 -1.1 -110 +239 2 10229 99140 0.71771 297.71771 149.21771 14921.77177 0.71771 297.7177 149.21771 14921.7715 0.71771 297.71771 149.21771 14921.771 2020-01-01 2020-01-02 2020-01-01 00:03:59 2020-01-02 03:32:20 2020-01-01 00:03:59.000 2020-01-02 03:32:20.000 239 99140 49689.5 4968950 239 99140 49689.5 4968950 -32330 32605 5125.02 512502 -125 126 -0.1 -10 24 2 10014 99924 0.07207 300.07207 150.07207 15157.27927 0.07207 300.07208 150.07207 15157.27928 0.07207 300.07207 150.07207 15157.27907 2020-01-01 2020-01-02 2020-01-01 00:00:24 2020-01-02 03:45:24 2020-01-01 00:00:24.000 2020-01-02 03:45:24.000 24 99924 49974 5047374 24 99924 49974 5047374 -32545 32390 4553.009900990099 459854 -128 123 -4.297029702970297 -434 -240 2 10230 99141 0.72072 297.72072 149.22072 14922.07207 0.72072 297.72073 149.22072 14922.07211 0.72072 297.72072 149.22072 14922.07200 2020-01-01 2020-01-02 2020-01-01 00:04:00 2020-01-02 03:32:21 2020-01-01 00:04:00.000 2020-01-02 03:32:21.000 240 99141 49690.5 4969050 240 99141 49690.5 4969050 -32329 32606 5126.02 512602 -124 127 0.9 90 -241 2 10231 99142 0.72372 297.72372 149.22372 14922.37237 0.72372 297.72372 149.22372 14922.37243 0.72372 297.72372 149.22372 14922.37200 2020-01-01 2020-01-02 2020-01-01 00:04:01 2020-01-02 03:32:22 2020-01-01 00:04:01.000 2020-01-02 03:32:22.000 241 99142 49691.5 4969150 241 99142 49691.5 4969150 -32328 32607 5127.02 512702 -128 127 -0.66 -66 -242 2 10232 99143 0.72672 297.72672 149.22672 14922.67267 0.72672 297.7267 149.22672 14922.67273 0.72672 297.72672 149.22672 14922.67200 2020-01-01 2020-01-02 2020-01-01 00:04:02 2020-01-02 03:32:23 2020-01-01 00:04:02.000 2020-01-02 03:32:23.000 242 99143 49692.5 4969250 242 99143 49692.5 4969250 -32327 32608 5128.02 512802 -128 123 -2.22 -222 -243 2 10233 99144 0.72972 297.72972 149.22972 14922.97297 0.72972 297.72974 149.22973 14922.97332 0.72972 297.72972 149.22972 14922.97200 2020-01-01 2020-01-02 2020-01-01 00:04:03 2020-01-02 03:32:24 2020-01-01 00:04:03.000 2020-01-02 03:32:24.000 243 99144 49693.5 4969350 243 99144 49693.5 4969350 -32326 32609 5129.02 512902 -127 124 -1.22 -122 -244 2 10234 99145 0.73273 297.73273 149.23273 14923.27327 0.73273 297.73273 149.23272 14923.27297 0.73273 297.73273 149.23273 14923.27300 2020-01-01 2020-01-02 2020-01-01 00:04:04 2020-01-02 03:32:25 2020-01-01 00:04:04.000 2020-01-02 03:32:25.000 244 99145 49694.5 4969450 244 99145 49694.5 4969450 -32325 32610 5130.02 513002 -126 125 -0.22 -22 -245 2 10235 99146 0.73573 297.73573 149.23573 14923.57357 0.73573 297.73575 149.23573 14923.57358 0.73573 297.73573 149.23573 14923.57300 2020-01-01 2020-01-02 2020-01-01 00:04:05 2020-01-02 03:32:26 2020-01-01 00:04:05.000 2020-01-02 03:32:26.000 245 99146 49695.5 4969550 245 99146 49695.5 4969550 -32324 32611 5131.02 513102 -125 126 0.78 78 -246 2 10236 99147 0.73873 297.73873 149.23873 14923.87387 0.73873 297.73874 149.23873 14923.8739 0.73873 297.73873 149.23873 14923.87300 2020-01-01 2020-01-02 2020-01-01 00:04:06 2020-01-02 03:32:27 2020-01-01 00:04:06.000 2020-01-02 03:32:27.000 246 99147 49696.5 4969650 246 99147 49696.5 4969650 -32323 32612 5132.02 513202 -124 127 1.78 178 -247 2 10237 99148 0.74174 297.74174 149.24174 14924.17417 0.74174 297.74173 149.24174 14924.1742 0.74174 297.74174 149.24174000000002 14924.17400 2020-01-01 2020-01-02 2020-01-01 00:04:07 2020-01-02 03:32:28 2020-01-01 00:04:07.000 2020-01-02 03:32:28.000 247 99148 49697.5 4969750 247 99148 49697.5 4969750 -32322 32613 5133.02 513302 -128 127 0.22 22 -248 2 10238 99149 0.74474 297.74474 149.24474 14924.47447 0.74474 297.74475 149.24474 14924.47478 0.74474 297.74474 149.24474 14924.47400 2020-01-01 2020-01-02 2020-01-01 00:04:08 2020-01-02 03:32:29 2020-01-01 00:04:08.000 2020-01-02 03:32:29.000 248 99149 49698.5 4969850 248 99149 49698.5 4969850 -32321 32614 5134.02 513402 -128 127 -1.34 -134 -249 2 10239 99150 0.74774 297.74774 149.24774 14924.77477 0.74774 297.74774 149.24774 14924.77447 0.74774 297.74774 149.24774 14924.77400 2020-01-01 2020-01-02 2020-01-01 00:04:09 2020-01-02 03:32:30 2020-01-01 00:04:09.000 2020-01-02 03:32:30.000 249 99150 49699.5 4969950 249 99150 49699.5 4969950 -32320 32615 5135.02 513502 -128 124 -2.9 -290 +240 2 10230 99141 0.72072 297.72072 149.22072 14922.07207 0.72072 297.72073 149.22072 14922.07211 0.72072 297.72072 149.22072 14922.072 2020-01-01 2020-01-02 2020-01-01 00:04:00 2020-01-02 03:32:21 2020-01-01 00:04:00.000 2020-01-02 03:32:21.000 240 99141 49690.5 4969050 240 99141 49690.5 4969050 -32329 32606 5126.02 512602 -124 127 0.9 90 +241 2 10231 99142 0.72372 297.72372 149.22372 14922.37237 0.72372 297.72372 149.22372 14922.37243 0.72372 297.72372 149.22372 14922.372 2020-01-01 2020-01-02 2020-01-01 00:04:01 2020-01-02 03:32:22 2020-01-01 00:04:01.000 2020-01-02 03:32:22.000 241 99142 49691.5 4969150 241 99142 49691.5 4969150 -32328 32607 5127.02 512702 -128 127 -0.66 -66 +242 2 10232 99143 0.72672 297.72672 149.22672 14922.67267 0.72672 297.7267 149.22672 14922.67273 0.72672 297.72672 149.22672 14922.672 2020-01-01 2020-01-02 2020-01-01 00:04:02 2020-01-02 03:32:23 2020-01-01 00:04:02.000 2020-01-02 03:32:23.000 242 99143 49692.5 4969250 242 99143 49692.5 4969250 -32327 32608 5128.02 512802 -128 123 -2.22 -222 +243 2 10233 99144 0.72972 297.72972 149.22972 14922.97297 0.72972 297.72974 149.22973 14922.97332 0.72972 297.72972 149.22972 14922.972 2020-01-01 2020-01-02 2020-01-01 00:04:03 2020-01-02 03:32:24 2020-01-01 00:04:03.000 2020-01-02 03:32:24.000 243 99144 49693.5 4969350 243 99144 49693.5 4969350 -32326 32609 5129.02 512902 -127 124 -1.22 -122 +244 2 10234 99145 0.73273 297.73273 149.23273 14923.27327 0.73273 297.73273 149.23272 14923.27297 0.73273 297.73273 149.23273 14923.273 2020-01-01 2020-01-02 2020-01-01 00:04:04 2020-01-02 03:32:25 2020-01-01 00:04:04.000 2020-01-02 03:32:25.000 244 99145 49694.5 4969450 244 99145 49694.5 4969450 -32325 32610 5130.02 513002 -126 125 -0.22 -22 +245 2 10235 99146 0.73573 297.73573 149.23573 14923.57357 0.73573 297.73575 149.23573 14923.57358 0.73573 297.73573 149.23573 14923.573 2020-01-01 2020-01-02 2020-01-01 00:04:05 2020-01-02 03:32:26 2020-01-01 00:04:05.000 2020-01-02 03:32:26.000 245 99146 49695.5 4969550 245 99146 49695.5 4969550 -32324 32611 5131.02 513102 -125 126 0.78 78 +246 2 10236 99147 0.73873 297.73873 149.23873 14923.87387 0.73873 297.73874 149.23873 14923.8739 0.73873 297.73873 149.23873 14923.873 2020-01-01 2020-01-02 2020-01-01 00:04:06 2020-01-02 03:32:27 2020-01-01 00:04:06.000 2020-01-02 03:32:27.000 246 99147 49696.5 4969650 246 99147 49696.5 4969650 -32323 32612 5132.02 513202 -124 127 1.78 178 +247 2 10237 99148 0.74174 297.74174 149.24174 14924.17417 0.74174 297.74173 149.24174 14924.1742 0.74174 297.74174 149.24174000000002 14924.174 2020-01-01 2020-01-02 2020-01-01 00:04:07 2020-01-02 03:32:28 2020-01-01 00:04:07.000 2020-01-02 03:32:28.000 247 99148 49697.5 4969750 247 99148 49697.5 4969750 -32322 32613 5133.02 513302 -128 127 0.22 22 +248 2 10238 99149 0.74474 297.74474 149.24474 14924.47447 0.74474 297.74475 149.24474 14924.47478 0.74474 297.74474 149.24474 14924.474 2020-01-01 2020-01-02 2020-01-01 00:04:08 2020-01-02 03:32:29 2020-01-01 00:04:08.000 2020-01-02 03:32:29.000 248 99149 49698.5 4969850 248 99149 49698.5 4969850 -32321 32614 5134.02 513402 -128 127 -1.34 -134 +249 2 10239 99150 0.74774 297.74774 149.24774 14924.77477 0.74774 297.74774 149.24774 14924.77447 0.74774 297.74774 149.24774 14924.774 2020-01-01 2020-01-02 2020-01-01 00:04:09 2020-01-02 03:32:30 2020-01-01 00:04:09.000 2020-01-02 03:32:30.000 249 99150 49699.5 4969950 249 99150 49699.5 4969950 -32320 32615 5135.02 513502 -128 124 -2.9 -290 25 2 10015 99925 0.07507 300.07507 150.07507 15157.58258 0.07507 300.07507 150.07507 15157.58241 0.07507 300.07507 150.07507 15157.58207 2020-01-01 2020-01-02 2020-01-01 00:00:25 2020-01-02 03:45:25 2020-01-01 00:00:25.000 2020-01-02 03:45:25.000 25 99925 49975 5047475 25 99925 49975 5047475 -32544 32391 4554.009900990099 459955 -127 124 -3.297029702970297 -333 -250 2 10240 99151 0.75075 297.75075 149.25075 14925.07507 0.75075 297.75076 149.25075 14925.07506 0.75075 297.75075 149.25075 14925.07500 2020-01-01 2020-01-02 2020-01-01 00:04:10 2020-01-02 03:32:31 2020-01-01 00:04:10.000 2020-01-02 03:32:31.000 250 99151 49700.5 4970050 250 99151 49700.5 4970050 -32319 32616 5136.02 513602 -127 125 -1.9 -190 -251 2 10241 99152 0.75375 297.75375 149.25375 14925.37537 0.75375 297.75375 149.25375 14925.37536 0.75375 297.75375 149.25375 14925.37500 2020-01-01 2020-01-02 2020-01-01 00:04:11 2020-01-02 03:32:32 2020-01-01 00:04:11.000 2020-01-02 03:32:32.000 251 99152 49701.5 4970150 251 99152 49701.5 4970150 -32318 32617 5137.02 513702 -126 126 -0.9 -90 -252 2 10242 99153 0.75675 297.75675 149.25675 14925.67567 0.75675 297.75674 149.25675 14925.67567 0.75675 297.75675 149.25674999999998 14925.67500 2020-01-01 2020-01-02 2020-01-01 00:04:12 2020-01-02 03:32:33 2020-01-01 00:04:12.000 2020-01-02 03:32:33.000 252 99153 49702.5 4970250 252 99153 49702.5 4970250 -32317 32618 5138.02 513802 -125 127 0.1 10 -253 2 10243 99154 0.75975 297.75975 149.25975 14925.97597 0.75975 297.75977 149.25976 14925.97625 0.75975 297.75975 149.25975 14925.97500 2020-01-01 2020-01-02 2020-01-01 00:04:13 2020-01-02 03:32:34 2020-01-01 00:04:13.000 2020-01-02 03:32:34.000 253 99154 49703.5 4970350 253 99154 49703.5 4970350 -32316 32619 5139.02 513902 -128 127 -1.46 -146 -254 2 10244 99155 0.76276 297.76276 149.26276 14926.27627 0.76276 297.76276 149.26275 14926.27594 0.76276 297.76276 149.26276 14926.27600 2020-01-01 2020-01-02 2020-01-01 00:04:14 2020-01-02 03:32:35 2020-01-01 00:04:14.000 2020-01-02 03:32:35.000 254 99155 49704.5 4970450 254 99155 49704.5 4970450 -32315 32620 5140.02 514002 -128 127 -3.02 -302 -255 2 10245 99156 0.76576 297.76576 149.26576 14926.57657 0.76576 297.76578 149.26576 14926.57652 0.76576 297.76576 149.26576 14926.57600 2020-01-01 2020-01-02 2020-01-01 00:04:15 2020-01-02 03:32:36 2020-01-01 00:04:15.000 2020-01-02 03:32:36.000 255 99156 49705.5 4970550 255 99156 49705.5 4970550 -32314 32621 5141.02 514102 -128 123 -4.58 -458 -256 2 10246 99157 0.76876 297.76876 149.26876 14926.87687 0.76876 297.76877 149.26876 14926.87683 0.76876 297.76876 149.26876000000001 14926.87600 2020-01-01 2020-01-02 2020-01-01 00:04:16 2020-01-02 03:32:37 2020-01-01 00:04:16.000 2020-01-02 03:32:37.000 256 99157 49706.5 4970650 256 99157 49706.5 4970650 -32313 32622 5142.02 514202 -127 124 -3.58 -358 -257 2 10247 99158 0.77177 297.77177 149.27177 14927.17717 0.77177 297.77176 149.27177 14927.17714 0.77177 297.77177 149.27177 14927.17700 2020-01-01 2020-01-02 2020-01-01 00:04:17 2020-01-02 03:32:38 2020-01-01 00:04:17.000 2020-01-02 03:32:38.000 257 99158 49707.5 4970750 257 99158 49707.5 4970750 -32312 32623 5143.02 514302 -126 125 -2.58 -258 -258 2 10248 99159 0.77477 297.77477 149.27477 14927.47747 0.77477 297.77478 149.27477 14927.47776 0.77477 297.77477 149.27477000000002 14927.47700 2020-01-01 2020-01-02 2020-01-01 00:04:18 2020-01-02 03:32:39 2020-01-01 00:04:18.000 2020-01-02 03:32:39.000 258 99159 49708.5 4970850 258 99159 49708.5 4970850 -32311 32624 5144.02 514402 -125 126 -1.58 -158 -259 2 10249 99160 0.77777 297.77777 149.27777 14927.77777 0.77777 297.77777 149.27777 14927.77742 0.77777 297.77777 149.27777 14927.77700 2020-01-01 2020-01-02 2020-01-01 00:04:19 2020-01-02 03:32:40 2020-01-01 00:04:19.000 2020-01-02 03:32:40.000 259 99160 49709.5 4970950 259 99160 49709.5 4970950 -32310 32625 5145.02 514502 -124 127 -0.58 -58 +250 2 10240 99151 0.75075 297.75075 149.25075 14925.07507 0.75075 297.75076 149.25075 14925.07506 0.75075 297.75075 149.25075 14925.075 2020-01-01 2020-01-02 2020-01-01 00:04:10 2020-01-02 03:32:31 2020-01-01 00:04:10.000 2020-01-02 03:32:31.000 250 99151 49700.5 4970050 250 99151 49700.5 4970050 -32319 32616 5136.02 513602 -127 125 -1.9 -190 +251 2 10241 99152 0.75375 297.75375 149.25375 14925.37537 0.75375 297.75375 149.25375 14925.37536 0.75375 297.75375 149.25375 14925.375 2020-01-01 2020-01-02 2020-01-01 00:04:11 2020-01-02 03:32:32 2020-01-01 00:04:11.000 2020-01-02 03:32:32.000 251 99152 49701.5 4970150 251 99152 49701.5 4970150 -32318 32617 5137.02 513702 -126 126 -0.9 -90 +252 2 10242 99153 0.75675 297.75675 149.25675 14925.67567 0.75675 297.75674 149.25675 14925.67567 0.75675 297.75675 149.25674999999998 14925.675 2020-01-01 2020-01-02 2020-01-01 00:04:12 2020-01-02 03:32:33 2020-01-01 00:04:12.000 2020-01-02 03:32:33.000 252 99153 49702.5 4970250 252 99153 49702.5 4970250 -32317 32618 5138.02 513802 -125 127 0.1 10 +253 2 10243 99154 0.75975 297.75975 149.25975 14925.97597 0.75975 297.75977 149.25976 14925.97625 0.75975 297.75975 149.25975 14925.975 2020-01-01 2020-01-02 2020-01-01 00:04:13 2020-01-02 03:32:34 2020-01-01 00:04:13.000 2020-01-02 03:32:34.000 253 99154 49703.5 4970350 253 99154 49703.5 4970350 -32316 32619 5139.02 513902 -128 127 -1.46 -146 +254 2 10244 99155 0.76276 297.76276 149.26276 14926.27627 0.76276 297.76276 149.26275 14926.27594 0.76276 297.76276 149.26276 14926.276 2020-01-01 2020-01-02 2020-01-01 00:04:14 2020-01-02 03:32:35 2020-01-01 00:04:14.000 2020-01-02 03:32:35.000 254 99155 49704.5 4970450 254 99155 49704.5 4970450 -32315 32620 5140.02 514002 -128 127 -3.02 -302 +255 2 10245 99156 0.76576 297.76576 149.26576 14926.57657 0.76576 297.76578 149.26576 14926.57652 0.76576 297.76576 149.26576 14926.576 2020-01-01 2020-01-02 2020-01-01 00:04:15 2020-01-02 03:32:36 2020-01-01 00:04:15.000 2020-01-02 03:32:36.000 255 99156 49705.5 4970550 255 99156 49705.5 4970550 -32314 32621 5141.02 514102 -128 123 -4.58 -458 +256 2 10246 99157 0.76876 297.76876 149.26876 14926.87687 0.76876 297.76877 149.26876 14926.87683 0.76876 297.76876 149.26876000000001 14926.876 2020-01-01 2020-01-02 2020-01-01 00:04:16 2020-01-02 03:32:37 2020-01-01 00:04:16.000 2020-01-02 03:32:37.000 256 99157 49706.5 4970650 256 99157 49706.5 4970650 -32313 32622 5142.02 514202 -127 124 -3.58 -358 +257 2 10247 99158 0.77177 297.77177 149.27177 14927.17717 0.77177 297.77176 149.27177 14927.17714 0.77177 297.77177 149.27177 14927.177 2020-01-01 2020-01-02 2020-01-01 00:04:17 2020-01-02 03:32:38 2020-01-01 00:04:17.000 2020-01-02 03:32:38.000 257 99158 49707.5 4970750 257 99158 49707.5 4970750 -32312 32623 5143.02 514302 -126 125 -2.58 -258 +258 2 10248 99159 0.77477 297.77477 149.27477 14927.47747 0.77477 297.77478 149.27477 14927.47776 0.77477 297.77477 149.27477000000002 14927.477 2020-01-01 2020-01-02 2020-01-01 00:04:18 2020-01-02 03:32:39 2020-01-01 00:04:18.000 2020-01-02 03:32:39.000 258 99159 49708.5 4970850 258 99159 49708.5 4970850 -32311 32624 5144.02 514402 -125 126 -1.58 -158 +259 2 10249 99160 0.77777 297.77777 149.27777 14927.77777 0.77777 297.77777 149.27777 14927.77742 0.77777 297.77777 149.27777 14927.777 2020-01-01 2020-01-02 2020-01-01 00:04:19 2020-01-02 03:32:40 2020-01-01 00:04:19.000 2020-01-02 03:32:40.000 259 99160 49709.5 4970950 259 99160 49709.5 4970950 -32310 32625 5145.02 514502 -124 127 -0.58 -58 26 2 10016 99926 0.07807 300.07807 150.07807 15157.88588 0.07807 300.07806 150.07807 15157.88575 0.07807 300.07807 150.07807 15157.88507 2020-01-01 2020-01-02 2020-01-01 00:00:26 2020-01-02 03:45:26 2020-01-01 00:00:26.000 2020-01-02 03:45:26.000 26 99926 49976 5047576 26 99926 49976 5047576 -32543 32392 4555.009900990099 460056 -126 125 -2.297029702970297 -232 -260 2 10250 99161 0.78078 297.78078 149.28078 14928.07807 0.78078 297.7808 149.28077 14928.07799 0.78078 297.78078 149.28078 14928.07800 2020-01-01 2020-01-02 2020-01-01 00:04:20 2020-01-02 03:32:41 2020-01-01 00:04:20.000 2020-01-02 03:32:41.000 260 99161 49710.5 4971050 260 99161 49710.5 4971050 -32309 32626 5146.02 514602 -128 127 -2.14 -214 -261 2 10251 99162 0.78378 297.78378 149.28378 14928.37837 0.78378 297.78378 149.28378 14928.3783 0.78378 297.78378 149.28378 14928.37800 2020-01-01 2020-01-02 2020-01-01 00:04:21 2020-01-02 03:32:42 2020-01-01 00:04:21.000 2020-01-02 03:32:42.000 261 99162 49711.5 4971150 261 99162 49711.5 4971150 -32308 32627 5147.02 514702 -128 123 -3.7 -370 -262 2 10252 99163 0.78678 297.78678 149.28678 14928.67867 0.78678 297.78677 149.28678 14928.67861 0.78678 297.78678 149.28678 14928.67800 2020-01-01 2020-01-02 2020-01-01 00:04:22 2020-01-02 03:32:43 2020-01-01 00:04:22.000 2020-01-02 03:32:43.000 262 99163 49712.5 4971250 262 99163 49712.5 4971250 -32307 32628 5148.02 514802 -127 124 -2.7 -270 -263 2 10253 99164 0.78978 297.78978 149.28978 14928.97897 0.78978 297.7898 149.28979 14928.97923 0.78978 297.78978 149.28977999999998 14928.97800 2020-01-01 2020-01-02 2020-01-01 00:04:23 2020-01-02 03:32:44 2020-01-01 00:04:23.000 2020-01-02 03:32:44.000 263 99164 49713.5 4971350 263 99164 49713.5 4971350 -32306 32629 5149.02 514902 -126 125 -1.7 -170 -264 2 10254 99165 0.79279 297.79279 149.29279 14929.27927 0.79279 297.7928 149.29278 14929.27888 0.79279 297.79279 149.29279 14929.27900 2020-01-01 2020-01-02 2020-01-01 00:04:24 2020-01-02 03:32:45 2020-01-01 00:04:24.000 2020-01-02 03:32:45.000 264 99165 49714.5 4971450 264 99165 49714.5 4971450 -32305 32630 5150.02 515002 -125 126 -0.7 -70 -265 2 10255 99166 0.79579 297.79579 149.29579 14929.57957 0.79579 297.7958 149.29579 14929.57962 0.79579 297.79579 149.29579 14929.57900 2020-01-01 2020-01-02 2020-01-01 00:04:25 2020-01-02 03:32:46 2020-01-01 00:04:25.000 2020-01-02 03:32:46.000 265 99166 49715.5 4971550 265 99166 49715.5 4971550 -32304 32631 5151.02 515102 -124 127 0.3 30 -266 2 10256 99167 0.79879 297.79879 149.29879 14929.87987 0.79879 297.7988 149.29879 14929.87977 0.79879 297.79879 149.29879 14929.87900 2020-01-01 2020-01-02 2020-01-01 00:04:26 2020-01-02 03:32:47 2020-01-01 00:04:26.000 2020-01-02 03:32:47.000 266 99167 49716.5 4971650 266 99167 49716.5 4971650 -32303 32632 5152.02 515202 -128 127 -1.26 -126 -267 2 10257 99168 0.8018 297.8018 149.3018 14930.18018 0.8018 297.8018 149.3018 14930.18012 0.80180 297.80180 149.30180000000001 14930.18000 2020-01-01 2020-01-02 2020-01-01 00:04:27 2020-01-02 03:32:48 2020-01-01 00:04:27.000 2020-01-02 03:32:48.000 267 99168 49717.5 4971750 267 99168 49717.5 4971750 -32302 32633 5153.02 515302 -128 123 -2.82 -282 -268 2 10258 99169 0.8048 297.8048 149.3048 14930.48048 0.8048 297.8048 149.3048 14930.4807 0.80480 297.80480 149.3048 14930.48000 2020-01-01 2020-01-02 2020-01-01 00:04:28 2020-01-02 03:32:49 2020-01-01 00:04:28.000 2020-01-02 03:32:49.000 268 99169 49718.5 4971850 268 99169 49718.5 4971850 -32301 32634 5154.02 515402 -127 124 -1.82 -182 -269 2 10259 99170 0.8078 297.8078 149.3078 14930.78078 0.8078 297.8078 149.3078 14930.78035 0.80780 297.80780 149.30780000000001 14930.78000 2020-01-01 2020-01-02 2020-01-01 00:04:29 2020-01-02 03:32:50 2020-01-01 00:04:29.000 2020-01-02 03:32:50.000 269 99170 49719.5 4971950 269 99170 49719.5 4971950 -32300 32635 5155.02 515502 -126 125 -0.82 -82 +260 2 10250 99161 0.78078 297.78078 149.28078 14928.07807 0.78078 297.7808 149.28077 14928.07799 0.78078 297.78078 149.28078 14928.078 2020-01-01 2020-01-02 2020-01-01 00:04:20 2020-01-02 03:32:41 2020-01-01 00:04:20.000 2020-01-02 03:32:41.000 260 99161 49710.5 4971050 260 99161 49710.5 4971050 -32309 32626 5146.02 514602 -128 127 -2.14 -214 +261 2 10251 99162 0.78378 297.78378 149.28378 14928.37837 0.78378 297.78378 149.28378 14928.3783 0.78378 297.78378 149.28378 14928.378 2020-01-01 2020-01-02 2020-01-01 00:04:21 2020-01-02 03:32:42 2020-01-01 00:04:21.000 2020-01-02 03:32:42.000 261 99162 49711.5 4971150 261 99162 49711.5 4971150 -32308 32627 5147.02 514702 -128 123 -3.7 -370 +262 2 10252 99163 0.78678 297.78678 149.28678 14928.67867 0.78678 297.78677 149.28678 14928.67861 0.78678 297.78678 149.28678 14928.678 2020-01-01 2020-01-02 2020-01-01 00:04:22 2020-01-02 03:32:43 2020-01-01 00:04:22.000 2020-01-02 03:32:43.000 262 99163 49712.5 4971250 262 99163 49712.5 4971250 -32307 32628 5148.02 514802 -127 124 -2.7 -270 +263 2 10253 99164 0.78978 297.78978 149.28978 14928.97897 0.78978 297.7898 149.28979 14928.97923 0.78978 297.78978 149.28977999999998 14928.978 2020-01-01 2020-01-02 2020-01-01 00:04:23 2020-01-02 03:32:44 2020-01-01 00:04:23.000 2020-01-02 03:32:44.000 263 99164 49713.5 4971350 263 99164 49713.5 4971350 -32306 32629 5149.02 514902 -126 125 -1.7 -170 +264 2 10254 99165 0.79279 297.79279 149.29279 14929.27927 0.79279 297.7928 149.29278 14929.27888 0.79279 297.79279 149.29279 14929.279 2020-01-01 2020-01-02 2020-01-01 00:04:24 2020-01-02 03:32:45 2020-01-01 00:04:24.000 2020-01-02 03:32:45.000 264 99165 49714.5 4971450 264 99165 49714.5 4971450 -32305 32630 5150.02 515002 -125 126 -0.7 -70 +265 2 10255 99166 0.79579 297.79579 149.29579 14929.57957 0.79579 297.7958 149.29579 14929.57962 0.79579 297.79579 149.29579 14929.579 2020-01-01 2020-01-02 2020-01-01 00:04:25 2020-01-02 03:32:46 2020-01-01 00:04:25.000 2020-01-02 03:32:46.000 265 99166 49715.5 4971550 265 99166 49715.5 4971550 -32304 32631 5151.02 515102 -124 127 0.3 30 +266 2 10256 99167 0.79879 297.79879 149.29879 14929.87987 0.79879 297.7988 149.29879 14929.87977 0.79879 297.79879 149.29879 14929.879 2020-01-01 2020-01-02 2020-01-01 00:04:26 2020-01-02 03:32:47 2020-01-01 00:04:26.000 2020-01-02 03:32:47.000 266 99167 49716.5 4971650 266 99167 49716.5 4971650 -32303 32632 5152.02 515202 -128 127 -1.26 -126 +267 2 10257 99168 0.8018 297.8018 149.3018 14930.18018 0.8018 297.8018 149.3018 14930.18012 0.8018 297.8018 149.30180000000001 14930.18 2020-01-01 2020-01-02 2020-01-01 00:04:27 2020-01-02 03:32:48 2020-01-01 00:04:27.000 2020-01-02 03:32:48.000 267 99168 49717.5 4971750 267 99168 49717.5 4971750 -32302 32633 5153.02 515302 -128 123 -2.82 -282 +268 2 10258 99169 0.8048 297.8048 149.3048 14930.48048 0.8048 297.8048 149.3048 14930.4807 0.8048 297.8048 149.3048 14930.48 2020-01-01 2020-01-02 2020-01-01 00:04:28 2020-01-02 03:32:49 2020-01-01 00:04:28.000 2020-01-02 03:32:49.000 268 99169 49718.5 4971850 268 99169 49718.5 4971850 -32301 32634 5154.02 515402 -127 124 -1.82 -182 +269 2 10259 99170 0.8078 297.8078 149.3078 14930.78078 0.8078 297.8078 149.3078 14930.78035 0.8078 297.8078 149.30780000000001 14930.78 2020-01-01 2020-01-02 2020-01-01 00:04:29 2020-01-02 03:32:50 2020-01-01 00:04:29.000 2020-01-02 03:32:50.000 269 99170 49719.5 4971950 269 99170 49719.5 4971950 -32300 32635 5155.02 515502 -126 125 -0.82 -82 27 2 10017 99927 0.08108 300.08108 150.08108 15158.18918 0.08108 300.0811 150.08108 15158.18936 0.08108 300.08108 150.08108000000001 15158.18908 2020-01-01 2020-01-02 2020-01-01 00:00:27 2020-01-02 03:45:27 2020-01-01 00:00:27.000 2020-01-02 03:45:27.000 27 99927 49977 5047677 27 99927 49977 5047677 -32542 32393 4556.009900990099 460157 -125 126 -1.297029702970297 -131 -270 2 10260 99171 0.81081 297.81081 149.31081 14931.08108 0.81081 297.81082 149.31081 14931.08109 0.81081 297.81081 149.31081 14931.08100 2020-01-01 2020-01-02 2020-01-01 00:04:30 2020-01-02 03:32:51 2020-01-01 00:04:30.000 2020-01-02 03:32:51.000 270 99171 49720.5 4972050 270 99171 49720.5 4972050 -32299 32636 5156.02 515602 -125 126 0.18 18 -271 2 10261 99172 0.81381 297.81381 149.31381 14931.38138 0.81381 297.8138 149.31381 14931.38124 0.81381 297.81381 149.31381 14931.38100 2020-01-01 2020-01-02 2020-01-01 00:04:31 2020-01-02 03:32:52 2020-01-01 00:04:31.000 2020-01-02 03:32:52.000 271 99172 49721.5 4972150 271 99172 49721.5 4972150 -32298 32637 5157.02 515702 -124 127 1.18 118 -272 2 10262 99173 0.81681 297.81681 149.31681 14931.68168 0.81681 297.8168 149.31681 14931.68159 0.81681 297.81681 149.31681 14931.68100 2020-01-01 2020-01-02 2020-01-01 00:04:32 2020-01-02 03:32:53 2020-01-01 00:04:32.000 2020-01-02 03:32:53.000 272 99173 49722.5 4972250 272 99173 49722.5 4972250 -32297 32638 5158.02 515802 -128 127 -0.38 -38 -273 2 10263 99174 0.81981 297.81981 149.31981 14931.98198 0.81981 297.81982 149.31982 14931.98217 0.81981 297.81981 149.31981 14931.98100 2020-01-01 2020-01-02 2020-01-01 00:04:33 2020-01-02 03:32:54 2020-01-01 00:04:33.000 2020-01-02 03:32:54.000 273 99174 49723.5 4972350 273 99174 49723.5 4972350 -32296 32639 5159.02 515902 -128 127 -1.94 -194 -274 2 10264 99175 0.82282 297.82282 149.32282 14932.28228 0.82282 297.8228 149.32282 14932.28247 0.82282 297.82282 149.32281999999998 14932.28200 2020-01-01 2020-01-02 2020-01-01 00:04:34 2020-01-02 03:32:55 2020-01-01 00:04:34.000 2020-01-02 03:32:55.000 274 99175 49724.5 4972450 274 99175 49724.5 4972450 -32295 32640 5160.02 516002 -128 124 -3.5 -350 -275 2 10265 99176 0.82582 297.82582 149.32582 14932.58258 0.82582 297.82584 149.32582 14932.58256 0.82582 297.82582 149.32582 14932.58200 2020-01-01 2020-01-02 2020-01-01 00:04:35 2020-01-02 03:32:56 2020-01-01 00:04:35.000 2020-01-02 03:32:56.000 275 99176 49725.5 4972550 275 99176 49725.5 4972550 -32294 32641 5161.02 516102 -127 125 -2.5 -250 -276 2 10266 99177 0.82882 297.82882 149.32882 14932.88288 0.82882 297.82883 149.32882 14932.88275 0.82882 297.82882 149.32882 14932.88200 2020-01-01 2020-01-02 2020-01-01 00:04:36 2020-01-02 03:32:57 2020-01-01 00:04:36.000 2020-01-02 03:32:57.000 276 99177 49726.5 4972650 276 99177 49726.5 4972650 -32293 32642 5162.02 516202 -126 126 -1.5 -150 -277 2 10267 99178 0.83183 297.83183 149.33183 14933.18318 0.83183 297.83182 149.33183 14933.18305 0.83183 297.83183 149.33183 14933.18300 2020-01-01 2020-01-02 2020-01-01 00:04:37 2020-01-02 03:32:58 2020-01-01 00:04:37.000 2020-01-02 03:32:58.000 277 99178 49727.5 4972750 277 99178 49727.5 4972750 -32292 32643 5163.02 516302 -125 127 -0.5 -50 -278 2 10268 99179 0.83483 297.83483 149.33483 14933.48348 0.83483 297.83484 149.33483 14933.48364 0.83483 297.83483 149.33483 14933.48300 2020-01-01 2020-01-02 2020-01-01 00:04:38 2020-01-02 03:32:59 2020-01-01 00:04:38.000 2020-01-02 03:32:59.000 278 99179 49728.5 4972850 278 99179 49728.5 4972850 -32291 32644 5164.02 516402 -128 127 -2.06 -206 -279 2 10269 99180 0.83783 297.83783 149.33783 14933.78378 0.83783 297.83783 149.33783 14933.78394 0.83783 297.83783 149.33783 14933.78300 2020-01-01 2020-01-02 2020-01-01 00:04:39 2020-01-02 03:33:00 2020-01-01 00:04:39.000 2020-01-02 03:33:00.000 279 99180 49729.5 4972950 279 99180 49729.5 4972950 -32290 32645 5165.02 516502 -128 127 -3.62 -362 +270 2 10260 99171 0.81081 297.81081 149.31081 14931.08108 0.81081 297.81082 149.31081 14931.08109 0.81081 297.81081 149.31081 14931.081 2020-01-01 2020-01-02 2020-01-01 00:04:30 2020-01-02 03:32:51 2020-01-01 00:04:30.000 2020-01-02 03:32:51.000 270 99171 49720.5 4972050 270 99171 49720.5 4972050 -32299 32636 5156.02 515602 -125 126 0.18 18 +271 2 10261 99172 0.81381 297.81381 149.31381 14931.38138 0.81381 297.8138 149.31381 14931.38124 0.81381 297.81381 149.31381 14931.381 2020-01-01 2020-01-02 2020-01-01 00:04:31 2020-01-02 03:32:52 2020-01-01 00:04:31.000 2020-01-02 03:32:52.000 271 99172 49721.5 4972150 271 99172 49721.5 4972150 -32298 32637 5157.02 515702 -124 127 1.18 118 +272 2 10262 99173 0.81681 297.81681 149.31681 14931.68168 0.81681 297.8168 149.31681 14931.68159 0.81681 297.81681 149.31681 14931.681 2020-01-01 2020-01-02 2020-01-01 00:04:32 2020-01-02 03:32:53 2020-01-01 00:04:32.000 2020-01-02 03:32:53.000 272 99173 49722.5 4972250 272 99173 49722.5 4972250 -32297 32638 5158.02 515802 -128 127 -0.38 -38 +273 2 10263 99174 0.81981 297.81981 149.31981 14931.98198 0.81981 297.81982 149.31982 14931.98217 0.81981 297.81981 149.31981 14931.981 2020-01-01 2020-01-02 2020-01-01 00:04:33 2020-01-02 03:32:54 2020-01-01 00:04:33.000 2020-01-02 03:32:54.000 273 99174 49723.5 4972350 273 99174 49723.5 4972350 -32296 32639 5159.02 515902 -128 127 -1.94 -194 +274 2 10264 99175 0.82282 297.82282 149.32282 14932.28228 0.82282 297.8228 149.32282 14932.28247 0.82282 297.82282 149.32281999999998 14932.282 2020-01-01 2020-01-02 2020-01-01 00:04:34 2020-01-02 03:32:55 2020-01-01 00:04:34.000 2020-01-02 03:32:55.000 274 99175 49724.5 4972450 274 99175 49724.5 4972450 -32295 32640 5160.02 516002 -128 124 -3.5 -350 +275 2 10265 99176 0.82582 297.82582 149.32582 14932.58258 0.82582 297.82584 149.32582 14932.58256 0.82582 297.82582 149.32582 14932.582 2020-01-01 2020-01-02 2020-01-01 00:04:35 2020-01-02 03:32:56 2020-01-01 00:04:35.000 2020-01-02 03:32:56.000 275 99176 49725.5 4972550 275 99176 49725.5 4972550 -32294 32641 5161.02 516102 -127 125 -2.5 -250 +276 2 10266 99177 0.82882 297.82882 149.32882 14932.88288 0.82882 297.82883 149.32882 14932.88275 0.82882 297.82882 149.32882 14932.882 2020-01-01 2020-01-02 2020-01-01 00:04:36 2020-01-02 03:32:57 2020-01-01 00:04:36.000 2020-01-02 03:32:57.000 276 99177 49726.5 4972650 276 99177 49726.5 4972650 -32293 32642 5162.02 516202 -126 126 -1.5 -150 +277 2 10267 99178 0.83183 297.83183 149.33183 14933.18318 0.83183 297.83182 149.33183 14933.18305 0.83183 297.83183 149.33183 14933.183 2020-01-01 2020-01-02 2020-01-01 00:04:37 2020-01-02 03:32:58 2020-01-01 00:04:37.000 2020-01-02 03:32:58.000 277 99178 49727.5 4972750 277 99178 49727.5 4972750 -32292 32643 5163.02 516302 -125 127 -0.5 -50 +278 2 10268 99179 0.83483 297.83483 149.33483 14933.48348 0.83483 297.83484 149.33483 14933.48364 0.83483 297.83483 149.33483 14933.483 2020-01-01 2020-01-02 2020-01-01 00:04:38 2020-01-02 03:32:59 2020-01-01 00:04:38.000 2020-01-02 03:32:59.000 278 99179 49728.5 4972850 278 99179 49728.5 4972850 -32291 32644 5164.02 516402 -128 127 -2.06 -206 +279 2 10269 99180 0.83783 297.83783 149.33783 14933.78378 0.83783 297.83783 149.33783 14933.78394 0.83783 297.83783 149.33783 14933.783 2020-01-01 2020-01-02 2020-01-01 00:04:39 2020-01-02 03:33:00 2020-01-01 00:04:39.000 2020-01-02 03:33:00.000 279 99180 49729.5 4972950 279 99180 49729.5 4972950 -32290 32645 5165.02 516502 -128 127 -3.62 -362 28 2 10018 99928 0.08408 300.08408 150.08408 15158.49249 0.08408 300.08408 150.08408 15158.49265 0.08408 300.08408 150.08408 15158.49208 2020-01-01 2020-01-02 2020-01-01 00:00:28 2020-01-02 03:45:28 2020-01-01 00:00:28.000 2020-01-02 03:45:28.000 28 99928 49978 5047778 28 99928 49978 5047778 -32541 32394 4557.009900990099 460258 -124 127 -0.297029702970297 -30 -280 2 10270 99181 0.84084 297.84084 149.34084 14934.08408 0.84084 297.84085 149.34084 14934.08403 0.84084 297.84084 149.34084000000001 14934.08400 2020-01-01 2020-01-02 2020-01-01 00:04:40 2020-01-02 03:33:01 2020-01-01 00:04:40.000 2020-01-02 03:33:01.000 280 99181 49730.5 4973050 280 99181 49730.5 4973050 -32289 32646 5166.02 516602 -128 123 -5.18 -518 -281 2 10271 99182 0.84384 297.84384 149.34384 14934.38438 0.84384 297.84384 149.34384 14934.38421 0.84384 297.84384 149.34384 14934.38400 2020-01-01 2020-01-02 2020-01-01 00:04:41 2020-01-02 03:33:02 2020-01-01 00:04:41.000 2020-01-02 03:33:02.000 281 99182 49731.5 4973150 281 99182 49731.5 4973150 -32288 32647 5167.02 516702 -127 124 -4.18 -418 -282 2 10272 99183 0.84684 297.84684 149.34684 14934.68468 0.84684 297.84683 149.34684 14934.68453 0.84684 297.84684 149.34684 14934.68400 2020-01-01 2020-01-02 2020-01-01 00:04:42 2020-01-02 03:33:03 2020-01-01 00:04:42.000 2020-01-02 03:33:03.000 282 99183 49732.5 4973250 282 99183 49732.5 4973250 -32287 32648 5168.02 516802 -126 125 -3.18 -318 -283 2 10273 99184 0.84984 297.84984 149.34984 14934.98498 0.84984 297.84985 149.34985 14934.98526 0.84984 297.84984 149.34984 14934.98400 2020-01-01 2020-01-02 2020-01-01 00:04:43 2020-01-02 03:33:04 2020-01-01 00:04:43.000 2020-01-02 03:33:04.000 283 99184 49733.5 4973350 283 99184 49733.5 4973350 -32286 32649 5169.02 516902 -125 126 -2.18 -218 -284 2 10274 99185 0.85285 297.85285 149.35285 14935.28528 0.85285 297.85284 149.35285 14935.28542 0.85285 297.85285 149.35285 14935.28500 2020-01-01 2020-01-02 2020-01-01 00:04:44 2020-01-02 03:33:05 2020-01-01 00:04:44.000 2020-01-02 03:33:05.000 284 99185 49734.5 4973450 284 99185 49734.5 4973450 -32285 32650 5170.02 517002 -124 127 -1.18 -118 -285 2 10275 99186 0.85585 297.85585 149.35585 14935.58558 0.85585 297.85587 149.35585 14935.5855 0.85585 297.85585 149.35585 14935.58500 2020-01-01 2020-01-02 2020-01-01 00:04:45 2020-01-02 03:33:06 2020-01-01 00:04:45.000 2020-01-02 03:33:06.000 285 99186 49735.5 4973550 285 99186 49735.5 4973550 -32284 32651 5171.02 517102 -128 127 -2.74 -274 -286 2 10276 99187 0.85885 297.85885 149.35885 14935.88588 0.85885 297.85886 149.35885 14935.88568 0.85885 297.85885 149.35885 14935.88500 2020-01-01 2020-01-02 2020-01-01 00:04:46 2020-01-02 03:33:07 2020-01-01 00:04:46.000 2020-01-02 03:33:07.000 286 99187 49736.5 4973650 286 99187 49736.5 4973650 -32283 32652 5172.02 517202 -128 123 -4.3 -430 -287 2 10277 99188 0.86186 297.86186 149.36186 14936.18618 0.86186 297.86185 149.36186 14936.186 0.86186 297.86186 149.36186 14936.18600 2020-01-01 2020-01-02 2020-01-01 00:04:47 2020-01-02 03:33:08 2020-01-01 00:04:47.000 2020-01-02 03:33:08.000 287 99188 49737.5 4973750 287 99188 49737.5 4973750 -32282 32653 5173.02 517302 -127 124 -3.3 -330 -288 2 10278 99189 0.86486 297.86486 149.36486 14936.48648 0.86486 297.86487 149.36486 14936.48673 0.86486 297.86486 149.36486000000002 14936.48600 2020-01-01 2020-01-02 2020-01-01 00:04:48 2020-01-02 03:33:09 2020-01-01 00:04:48.000 2020-01-02 03:33:09.000 288 99189 49738.5 4973850 288 99189 49738.5 4973850 -32281 32654 5174.02 517402 -126 125 -2.3 -230 -289 2 10279 99190 0.86786 297.86786 149.36786 14936.78678 0.86786 297.86786 149.36786 14936.78688 0.86786 297.86786 149.36786 14936.78600 2020-01-01 2020-01-02 2020-01-01 00:04:49 2020-01-02 03:33:10 2020-01-01 00:04:49.000 2020-01-02 03:33:10.000 289 99190 49739.5 4973950 289 99190 49739.5 4973950 -32280 32655 5175.02 517502 -125 126 -1.3 -130 +280 2 10270 99181 0.84084 297.84084 149.34084 14934.08408 0.84084 297.84085 149.34084 14934.08403 0.84084 297.84084 149.34084000000001 14934.084 2020-01-01 2020-01-02 2020-01-01 00:04:40 2020-01-02 03:33:01 2020-01-01 00:04:40.000 2020-01-02 03:33:01.000 280 99181 49730.5 4973050 280 99181 49730.5 4973050 -32289 32646 5166.02 516602 -128 123 -5.18 -518 +281 2 10271 99182 0.84384 297.84384 149.34384 14934.38438 0.84384 297.84384 149.34384 14934.38421 0.84384 297.84384 149.34384 14934.384 2020-01-01 2020-01-02 2020-01-01 00:04:41 2020-01-02 03:33:02 2020-01-01 00:04:41.000 2020-01-02 03:33:02.000 281 99182 49731.5 4973150 281 99182 49731.5 4973150 -32288 32647 5167.02 516702 -127 124 -4.18 -418 +282 2 10272 99183 0.84684 297.84684 149.34684 14934.68468 0.84684 297.84683 149.34684 14934.68453 0.84684 297.84684 149.34684 14934.684 2020-01-01 2020-01-02 2020-01-01 00:04:42 2020-01-02 03:33:03 2020-01-01 00:04:42.000 2020-01-02 03:33:03.000 282 99183 49732.5 4973250 282 99183 49732.5 4973250 -32287 32648 5168.02 516802 -126 125 -3.18 -318 +283 2 10273 99184 0.84984 297.84984 149.34984 14934.98498 0.84984 297.84985 149.34985 14934.98526 0.84984 297.84984 149.34984 14934.984 2020-01-01 2020-01-02 2020-01-01 00:04:43 2020-01-02 03:33:04 2020-01-01 00:04:43.000 2020-01-02 03:33:04.000 283 99184 49733.5 4973350 283 99184 49733.5 4973350 -32286 32649 5169.02 516902 -125 126 -2.18 -218 +284 2 10274 99185 0.85285 297.85285 149.35285 14935.28528 0.85285 297.85284 149.35285 14935.28542 0.85285 297.85285 149.35285 14935.285 2020-01-01 2020-01-02 2020-01-01 00:04:44 2020-01-02 03:33:05 2020-01-01 00:04:44.000 2020-01-02 03:33:05.000 284 99185 49734.5 4973450 284 99185 49734.5 4973450 -32285 32650 5170.02 517002 -124 127 -1.18 -118 +285 2 10275 99186 0.85585 297.85585 149.35585 14935.58558 0.85585 297.85587 149.35585 14935.5855 0.85585 297.85585 149.35585 14935.585 2020-01-01 2020-01-02 2020-01-01 00:04:45 2020-01-02 03:33:06 2020-01-01 00:04:45.000 2020-01-02 03:33:06.000 285 99186 49735.5 4973550 285 99186 49735.5 4973550 -32284 32651 5171.02 517102 -128 127 -2.74 -274 +286 2 10276 99187 0.85885 297.85885 149.35885 14935.88588 0.85885 297.85886 149.35885 14935.88568 0.85885 297.85885 149.35885 14935.885 2020-01-01 2020-01-02 2020-01-01 00:04:46 2020-01-02 03:33:07 2020-01-01 00:04:46.000 2020-01-02 03:33:07.000 286 99187 49736.5 4973650 286 99187 49736.5 4973650 -32283 32652 5172.02 517202 -128 123 -4.3 -430 +287 2 10277 99188 0.86186 297.86186 149.36186 14936.18618 0.86186 297.86185 149.36186 14936.186 0.86186 297.86186 149.36186 14936.186 2020-01-01 2020-01-02 2020-01-01 00:04:47 2020-01-02 03:33:08 2020-01-01 00:04:47.000 2020-01-02 03:33:08.000 287 99188 49737.5 4973750 287 99188 49737.5 4973750 -32282 32653 5173.02 517302 -127 124 -3.3 -330 +288 2 10278 99189 0.86486 297.86486 149.36486 14936.48648 0.86486 297.86487 149.36486 14936.48673 0.86486 297.86486 149.36486000000002 14936.486 2020-01-01 2020-01-02 2020-01-01 00:04:48 2020-01-02 03:33:09 2020-01-01 00:04:48.000 2020-01-02 03:33:09.000 288 99189 49738.5 4973850 288 99189 49738.5 4973850 -32281 32654 5174.02 517402 -126 125 -2.3 -230 +289 2 10279 99190 0.86786 297.86786 149.36786 14936.78678 0.86786 297.86786 149.36786 14936.78688 0.86786 297.86786 149.36786 14936.786 2020-01-01 2020-01-02 2020-01-01 00:04:49 2020-01-02 03:33:10 2020-01-01 00:04:49.000 2020-01-02 03:33:10.000 289 99190 49739.5 4973950 289 99190 49739.5 4973950 -32280 32655 5175.02 517502 -125 126 -1.3 -130 29 2 10019 99929 0.08708 300.08708 150.08708 15158.79579 0.08708 300.0871 150.08708 15158.79576 0.08708 300.08708 150.08708 15158.79508 2020-01-01 2020-01-02 2020-01-01 00:00:29 2020-01-02 03:45:29 2020-01-01 00:00:29.000 2020-01-02 03:45:29.000 29 99929 49979 5047879 29 99929 49979 5047879 -32540 32395 4558.009900990099 460359 -128 127 -1.8316831683168318 -185 -290 2 10280 99191 0.87087 297.87087 149.37087 14937.08708 0.87087 297.87088 149.37087 14937.087 0.87087 297.87087 149.37087 14937.08700 2020-01-01 2020-01-02 2020-01-01 00:04:50 2020-01-02 03:33:11 2020-01-01 00:04:50.000 2020-01-02 03:33:11.000 290 99191 49740.5 4974050 290 99191 49740.5 4974050 -32279 32656 5176.02 517602 -124 127 -0.3 -30 -291 2 10281 99192 0.87387 297.87387 149.37387 14937.38738 0.87387 297.87387 149.37387 14937.38716 0.87387 297.87387 149.37387 14937.38700 2020-01-01 2020-01-02 2020-01-01 00:04:51 2020-01-02 03:33:12 2020-01-01 00:04:51.000 2020-01-02 03:33:12.000 291 99192 49741.5 4974150 291 99192 49741.5 4974150 -32278 32657 5177.02 517702 -128 127 -1.86 -186 -292 2 10282 99193 0.87687 297.87687 149.37687 14937.68768 0.87687 297.8769 149.37687 14937.68789 0.87687 297.87687 149.37687 14937.68700 2020-01-01 2020-01-02 2020-01-01 00:04:52 2020-01-02 03:33:13 2020-01-01 00:04:52.000 2020-01-02 03:33:13.000 292 99193 49742.5 4974250 292 99193 49742.5 4974250 -32277 32658 5178.02 517802 -128 123 -3.42 -342 -293 2 10283 99194 0.87987 297.87987 149.37987 14937.98798 0.87987 297.87988 149.37988 14937.9882 0.87987 297.87987 149.37986999999998 14937.98700 2020-01-01 2020-01-02 2020-01-01 00:04:53 2020-01-02 03:33:14 2020-01-01 00:04:53.000 2020-01-02 03:33:14.000 293 99194 49743.5 4974350 293 99194 49743.5 4974350 -32276 32659 5179.02 517902 -127 124 -2.42 -242 -294 2 10284 99195 0.88288 297.88288 149.38288 14938.28828 0.88288 297.88287 149.38288 14938.28835 0.88288 297.88288 149.38288 14938.28800 2020-01-01 2020-01-02 2020-01-01 00:04:54 2020-01-02 03:33:15 2020-01-01 00:04:54.000 2020-01-02 03:33:15.000 294 99195 49744.5 4974450 294 99195 49744.5 4974450 -32275 32660 5180.02 518002 -126 125 -1.42 -142 -295 2 10285 99196 0.88588 297.88588 149.38588 14938.58858 0.88588 297.8859 149.38588 14938.58847 0.88588 297.88588 149.38588 14938.58800 2020-01-01 2020-01-02 2020-01-01 00:04:55 2020-01-02 03:33:16 2020-01-01 00:04:55.000 2020-01-02 03:33:16.000 295 99196 49745.5 4974550 295 99196 49745.5 4974550 -32274 32661 5181.02 518102 -125 126 -0.42 -42 -296 2 10286 99197 0.88888 297.88888 149.38888 14938.88888 0.88888 297.8889 149.38888 14938.88863 0.88888 297.88888 149.38888 14938.88800 2020-01-01 2020-01-02 2020-01-01 00:04:56 2020-01-02 03:33:17 2020-01-01 00:04:56.000 2020-01-02 03:33:17.000 296 99197 49746.5 4974650 296 99197 49746.5 4974650 -32273 32662 5182.02 518202 -124 127 0.58 58 -297 2 10287 99198 0.89189 297.89189 149.39189 14939.18918 0.89189 297.8919 149.39189 14939.18936 0.89189 297.89189 149.39189 14939.18900 2020-01-01 2020-01-02 2020-01-01 00:04:57 2020-01-02 03:33:18 2020-01-01 00:04:57.000 2020-01-02 03:33:18.000 297 99198 49747.5 4974750 297 99198 49747.5 4974750 -32272 32663 5183.02 518302 -128 127 -0.98 -98 -298 2 10288 99199 0.89489 297.89489 149.39489 14939.48948 0.89489 297.8949 149.39489 14939.48967 0.89489 297.89489 149.39489 14939.48900 2020-01-01 2020-01-02 2020-01-01 00:04:58 2020-01-02 03:33:19 2020-01-01 00:04:58.000 2020-01-02 03:33:19.000 298 99199 49748.5 4974850 298 99199 49748.5 4974850 -32271 32664 5184.02 518402 -128 127 -2.54 -254 -299 2 10289 99200 0.89789 297.89789 149.39789 14939.78978 0.89789 297.8979 149.39789 14939.78986 0.89789 297.89789 149.39789000000002 14939.78900 2020-01-01 2020-01-02 2020-01-01 00:04:59 2020-01-02 03:33:20 2020-01-01 00:04:59.000 2020-01-02 03:33:20.000 299 99200 49749.5 4974950 299 99200 49749.5 4974950 -32270 32665 5185.02 518502 -128 124 -4.1 -410 -3 2 1002 9993 0.009 300.009 150.009 15150.9099 0.009 300.009 150.009 15150.90958 0.00900 300.00900 150.009 15150.90900 2020-01-01 2020-01-02 2020-01-01 00:00:03 2020-01-02 03:45:03 2020-01-01 00:00:03.000 2020-01-02 03:45:03.000 3 99903 49953 5045253 3 99903 49953 5045253 -32566 32369 4532.009900990099 457733 -124 127 0.04950495049504951 5 +290 2 10280 99191 0.87087 297.87087 149.37087 14937.08708 0.87087 297.87088 149.37087 14937.087 0.87087 297.87087 149.37087 14937.087 2020-01-01 2020-01-02 2020-01-01 00:04:50 2020-01-02 03:33:11 2020-01-01 00:04:50.000 2020-01-02 03:33:11.000 290 99191 49740.5 4974050 290 99191 49740.5 4974050 -32279 32656 5176.02 517602 -124 127 -0.3 -30 +291 2 10281 99192 0.87387 297.87387 149.37387 14937.38738 0.87387 297.87387 149.37387 14937.38716 0.87387 297.87387 149.37387 14937.387 2020-01-01 2020-01-02 2020-01-01 00:04:51 2020-01-02 03:33:12 2020-01-01 00:04:51.000 2020-01-02 03:33:12.000 291 99192 49741.5 4974150 291 99192 49741.5 4974150 -32278 32657 5177.02 517702 -128 127 -1.86 -186 +292 2 10282 99193 0.87687 297.87687 149.37687 14937.68768 0.87687 297.8769 149.37687 14937.68789 0.87687 297.87687 149.37687 14937.687 2020-01-01 2020-01-02 2020-01-01 00:04:52 2020-01-02 03:33:13 2020-01-01 00:04:52.000 2020-01-02 03:33:13.000 292 99193 49742.5 4974250 292 99193 49742.5 4974250 -32277 32658 5178.02 517802 -128 123 -3.42 -342 +293 2 10283 99194 0.87987 297.87987 149.37987 14937.98798 0.87987 297.87988 149.37988 14937.9882 0.87987 297.87987 149.37986999999998 14937.987 2020-01-01 2020-01-02 2020-01-01 00:04:53 2020-01-02 03:33:14 2020-01-01 00:04:53.000 2020-01-02 03:33:14.000 293 99194 49743.5 4974350 293 99194 49743.5 4974350 -32276 32659 5179.02 517902 -127 124 -2.42 -242 +294 2 10284 99195 0.88288 297.88288 149.38288 14938.28828 0.88288 297.88287 149.38288 14938.28835 0.88288 297.88288 149.38288 14938.288 2020-01-01 2020-01-02 2020-01-01 00:04:54 2020-01-02 03:33:15 2020-01-01 00:04:54.000 2020-01-02 03:33:15.000 294 99195 49744.5 4974450 294 99195 49744.5 4974450 -32275 32660 5180.02 518002 -126 125 -1.42 -142 +295 2 10285 99196 0.88588 297.88588 149.38588 14938.58858 0.88588 297.8859 149.38588 14938.58847 0.88588 297.88588 149.38588 14938.588 2020-01-01 2020-01-02 2020-01-01 00:04:55 2020-01-02 03:33:16 2020-01-01 00:04:55.000 2020-01-02 03:33:16.000 295 99196 49745.5 4974550 295 99196 49745.5 4974550 -32274 32661 5181.02 518102 -125 126 -0.42 -42 +296 2 10286 99197 0.88888 297.88888 149.38888 14938.88888 0.88888 297.8889 149.38888 14938.88863 0.88888 297.88888 149.38888 14938.888 2020-01-01 2020-01-02 2020-01-01 00:04:56 2020-01-02 03:33:17 2020-01-01 00:04:56.000 2020-01-02 03:33:17.000 296 99197 49746.5 4974650 296 99197 49746.5 4974650 -32273 32662 5182.02 518202 -124 127 0.58 58 +297 2 10287 99198 0.89189 297.89189 149.39189 14939.18918 0.89189 297.8919 149.39189 14939.18936 0.89189 297.89189 149.39189 14939.189 2020-01-01 2020-01-02 2020-01-01 00:04:57 2020-01-02 03:33:18 2020-01-01 00:04:57.000 2020-01-02 03:33:18.000 297 99198 49747.5 4974750 297 99198 49747.5 4974750 -32272 32663 5183.02 518302 -128 127 -0.98 -98 +298 2 10288 99199 0.89489 297.89489 149.39489 14939.48948 0.89489 297.8949 149.39489 14939.48967 0.89489 297.89489 149.39489 14939.489 2020-01-01 2020-01-02 2020-01-01 00:04:58 2020-01-02 03:33:19 2020-01-01 00:04:58.000 2020-01-02 03:33:19.000 298 99199 49748.5 4974850 298 99199 49748.5 4974850 -32271 32664 5184.02 518402 -128 127 -2.54 -254 +299 2 10289 99200 0.89789 297.89789 149.39789 14939.78978 0.89789 297.8979 149.39789 14939.78986 0.89789 297.89789 149.39789000000002 14939.789 2020-01-01 2020-01-02 2020-01-01 00:04:59 2020-01-02 03:33:20 2020-01-01 00:04:59.000 2020-01-02 03:33:20.000 299 99200 49749.5 4974950 299 99200 49749.5 4974950 -32270 32665 5185.02 518502 -128 124 -4.1 -410 +3 2 1002 9993 0.009 300.009 150.009 15150.9099 0.009 300.009 150.009 15150.90958 0.009 300.009 150.009 15150.909 2020-01-01 2020-01-02 2020-01-01 00:00:03 2020-01-02 03:45:03 2020-01-01 00:00:03.000 2020-01-02 03:45:03.000 3 99903 49953 5045253 3 99903 49953 5045253 -32566 32369 4532.009900990099 457733 -124 127 0.04950495049504951 5 30 2 10020 99930 0.09009 300.09009 150.09009 15159.09909 0.09009 300.0901 150.09008 15159.09894 0.09009 300.09009 150.09009 15159.09909 2020-01-01 2020-01-02 2020-01-01 00:00:30 2020-01-02 03:45:30 2020-01-01 00:00:30.000 2020-01-02 03:45:30.000 30 99930 49980 5047980 30 99930 49980 5047980 -32539 32396 4559.009900990099 460460 -128 123 -3.366336633663366 -340 -300 2 10290 99201 0.9009 297.9009 149.4009 14940.09009 0.9009 297.9009 149.40089 14940.08995 0.90090 297.90090 149.4009 14940.09000 2020-01-01 2020-01-02 2020-01-01 00:05:00 2020-01-02 03:33:21 2020-01-01 00:05:00.000 2020-01-02 03:33:21.000 300 99201 49750.5 4975050 300 99201 49750.5 4975050 -32269 32666 5186.02 518602 -127 125 -3.1 -310 -301 2 10291 99202 0.9039 297.9039 149.4039 14940.39039 0.9039 297.9039 149.4039 14940.39009 0.90390 297.90390 149.4039 14940.39000 2020-01-01 2020-01-02 2020-01-01 00:05:01 2020-01-02 03:33:22 2020-01-01 00:05:01.000 2020-01-02 03:33:22.000 301 99202 49751.5 4975150 301 99202 49751.5 4975150 -32268 32667 5187.02 518702 -126 126 -2.1 -210 -302 2 10292 99203 0.9069 297.9069 149.4069 14940.69069 0.9069 297.90692 149.4069 14940.69083 0.90690 297.90690 149.4069 14940.69000 2020-01-01 2020-01-02 2020-01-01 00:05:02 2020-01-02 03:33:23 2020-01-01 00:05:02.000 2020-01-02 03:33:23.000 302 99203 49752.5 4975250 302 99203 49752.5 4975250 -32267 32668 5188.02 518802 -125 127 -1.1 -110 -303 2 10293 99204 0.9099 297.9099 149.4099 14940.99099 0.9099 297.9099 149.40991 14940.99114 0.90990 297.90990 149.4099 14940.99000 2020-01-01 2020-01-02 2020-01-01 00:05:03 2020-01-02 03:33:24 2020-01-01 00:05:03.000 2020-01-02 03:33:24.000 303 99204 49753.5 4975350 303 99204 49753.5 4975350 -32266 32669 5189.02 518902 -128 127 -2.66 -266 -304 2 10294 99205 0.91291 297.91291 149.41291 14941.29129 0.91291 297.9129 149.41291 14941.29133 0.91291 297.91291 149.41290999999998 14941.29100 2020-01-01 2020-01-02 2020-01-01 00:05:04 2020-01-02 03:33:25 2020-01-01 00:05:04.000 2020-01-02 03:33:25.000 304 99205 49754.5 4975450 304 99205 49754.5 4975450 -32265 32670 5190.02 519002 -128 127 -4.22 -422 -305 2 10295 99206 0.91591 297.91591 149.41591 14941.59159 0.91591 297.91592 149.41591 14941.59141 0.91591 297.91591 149.41591 14941.59100 2020-01-01 2020-01-02 2020-01-01 00:05:05 2020-01-02 03:33:26 2020-01-01 00:05:05.000 2020-01-02 03:33:26.000 305 99206 49755.5 4975550 305 99206 49755.5 4975550 -32264 32671 5191.02 519102 -128 123 -5.78 -578 -306 2 10296 99207 0.91891 297.91891 149.41891 14941.89189 0.91891 297.9189 149.41891 14941.89172 0.91891 297.91891 149.41890999999998 14941.89100 2020-01-01 2020-01-02 2020-01-01 00:05:06 2020-01-02 03:33:27 2020-01-01 00:05:06.000 2020-01-02 03:33:27.000 306 99207 49756.5 4975650 306 99207 49756.5 4975650 -32263 32672 5192.02 519202 -127 124 -4.78 -478 -307 2 10297 99208 0.92192 297.92192 149.42192 14942.19219 0.92192 297.92194 149.42192 14942.1923 0.92192 297.92192 149.42192 14942.19200 2020-01-01 2020-01-02 2020-01-01 00:05:07 2020-01-02 03:33:28 2020-01-01 00:05:07.000 2020-01-02 03:33:28.000 307 99208 49757.5 4975750 307 99208 49757.5 4975750 -32262 32673 5193.02 519302 -126 125 -3.78 -378 -308 2 10298 99209 0.92492 297.92492 149.42492 14942.49249 0.92492 297.92493 149.42492 14942.49265 0.92492 297.92492 149.42492000000001 14942.49200 2020-01-01 2020-01-02 2020-01-01 00:05:08 2020-01-02 03:33:29 2020-01-01 00:05:08.000 2020-01-02 03:33:29.000 308 99209 49758.5 4975850 308 99209 49758.5 4975850 -32261 32674 5194.02 519402 -125 126 -2.78 -278 -309 2 10299 99210 0.92792 297.92792 149.42792 14942.79279 0.92792 297.92792 149.42792 14942.7928 0.92792 297.92792 149.42792 14942.79200 2020-01-01 2020-01-02 2020-01-01 00:05:09 2020-01-02 03:33:30 2020-01-01 00:05:09.000 2020-01-02 03:33:30.000 309 99210 49759.5 4975950 309 99210 49759.5 4975950 -32260 32675 5195.02 519502 -124 127 -1.78 -178 +300 2 10290 99201 0.9009 297.9009 149.4009 14940.09009 0.9009 297.9009 149.40089 14940.08995 0.9009 297.9009 149.4009 14940.09 2020-01-01 2020-01-02 2020-01-01 00:05:00 2020-01-02 03:33:21 2020-01-01 00:05:00.000 2020-01-02 03:33:21.000 300 99201 49750.5 4975050 300 99201 49750.5 4975050 -32269 32666 5186.02 518602 -127 125 -3.1 -310 +301 2 10291 99202 0.9039 297.9039 149.4039 14940.39039 0.9039 297.9039 149.4039 14940.39009 0.9039 297.9039 149.4039 14940.39 2020-01-01 2020-01-02 2020-01-01 00:05:01 2020-01-02 03:33:22 2020-01-01 00:05:01.000 2020-01-02 03:33:22.000 301 99202 49751.5 4975150 301 99202 49751.5 4975150 -32268 32667 5187.02 518702 -126 126 -2.1 -210 +302 2 10292 99203 0.9069 297.9069 149.4069 14940.69069 0.9069 297.90692 149.4069 14940.69083 0.9069 297.9069 149.4069 14940.69 2020-01-01 2020-01-02 2020-01-01 00:05:02 2020-01-02 03:33:23 2020-01-01 00:05:02.000 2020-01-02 03:33:23.000 302 99203 49752.5 4975250 302 99203 49752.5 4975250 -32267 32668 5188.02 518802 -125 127 -1.1 -110 +303 2 10293 99204 0.9099 297.9099 149.4099 14940.99099 0.9099 297.9099 149.40991 14940.99114 0.9099 297.9099 149.4099 14940.99 2020-01-01 2020-01-02 2020-01-01 00:05:03 2020-01-02 03:33:24 2020-01-01 00:05:03.000 2020-01-02 03:33:24.000 303 99204 49753.5 4975350 303 99204 49753.5 4975350 -32266 32669 5189.02 518902 -128 127 -2.66 -266 +304 2 10294 99205 0.91291 297.91291 149.41291 14941.29129 0.91291 297.9129 149.41291 14941.29133 0.91291 297.91291 149.41290999999998 14941.291 2020-01-01 2020-01-02 2020-01-01 00:05:04 2020-01-02 03:33:25 2020-01-01 00:05:04.000 2020-01-02 03:33:25.000 304 99205 49754.5 4975450 304 99205 49754.5 4975450 -32265 32670 5190.02 519002 -128 127 -4.22 -422 +305 2 10295 99206 0.91591 297.91591 149.41591 14941.59159 0.91591 297.91592 149.41591 14941.59141 0.91591 297.91591 149.41591 14941.591 2020-01-01 2020-01-02 2020-01-01 00:05:05 2020-01-02 03:33:26 2020-01-01 00:05:05.000 2020-01-02 03:33:26.000 305 99206 49755.5 4975550 305 99206 49755.5 4975550 -32264 32671 5191.02 519102 -128 123 -5.78 -578 +306 2 10296 99207 0.91891 297.91891 149.41891 14941.89189 0.91891 297.9189 149.41891 14941.89172 0.91891 297.91891 149.41890999999998 14941.891 2020-01-01 2020-01-02 2020-01-01 00:05:06 2020-01-02 03:33:27 2020-01-01 00:05:06.000 2020-01-02 03:33:27.000 306 99207 49756.5 4975650 306 99207 49756.5 4975650 -32263 32672 5192.02 519202 -127 124 -4.78 -478 +307 2 10297 99208 0.92192 297.92192 149.42192 14942.19219 0.92192 297.92194 149.42192 14942.1923 0.92192 297.92192 149.42192 14942.192 2020-01-01 2020-01-02 2020-01-01 00:05:07 2020-01-02 03:33:28 2020-01-01 00:05:07.000 2020-01-02 03:33:28.000 307 99208 49757.5 4975750 307 99208 49757.5 4975750 -32262 32673 5193.02 519302 -126 125 -3.78 -378 +308 2 10298 99209 0.92492 297.92492 149.42492 14942.49249 0.92492 297.92493 149.42492 14942.49265 0.92492 297.92492 149.42492000000001 14942.492 2020-01-01 2020-01-02 2020-01-01 00:05:08 2020-01-02 03:33:29 2020-01-01 00:05:08.000 2020-01-02 03:33:29.000 308 99209 49758.5 4975850 308 99209 49758.5 4975850 -32261 32674 5194.02 519402 -125 126 -2.78 -278 +309 2 10299 99210 0.92792 297.92792 149.42792 14942.79279 0.92792 297.92792 149.42792 14942.7928 0.92792 297.92792 149.42792 14942.792 2020-01-01 2020-01-02 2020-01-01 00:05:09 2020-01-02 03:33:30 2020-01-01 00:05:09.000 2020-01-02 03:33:30.000 309 99210 49759.5 4975950 309 99210 49759.5 4975950 -32260 32675 5195.02 519502 -124 127 -1.78 -178 31 2 10021 99931 0.09309 300.09309 150.09309 15159.4024 0.09309 300.09308 150.09309 15159.40224 0.09309 300.09309 150.09309 15159.40209 2020-01-01 2020-01-02 2020-01-01 00:00:31 2020-01-02 03:45:31 2020-01-01 00:00:31.000 2020-01-02 03:45:31.000 31 99931 49981 5048081 31 99931 49981 5048081 -32538 32397 4560.009900990099 460561 -127 124 -2.366336633663366 -239 -310 2 10300 99211 0.93093 297.93093 149.43093 14943.09309 0.93093 297.93094 149.43092 14943.09288 0.93093 297.93093 149.43093000000002 14943.09300 2020-01-01 2020-01-02 2020-01-01 00:05:10 2020-01-02 03:33:31 2020-01-01 00:05:10.000 2020-01-02 03:33:31.000 310 99211 49760.5 4976050 310 99211 49760.5 4976050 -32259 32676 5196.02 519602 -128 127 -3.34 -334 -311 2 10301 99212 0.93393 297.93393 149.43393 14943.39339 0.93393 297.93393 149.43393 14943.39319 0.93393 297.93393 149.43393 14943.39300 2020-01-01 2020-01-02 2020-01-01 00:05:11 2020-01-02 03:33:32 2020-01-01 00:05:11.000 2020-01-02 03:33:32.000 311 99212 49761.5 4976150 311 99212 49761.5 4976150 -32258 32677 5197.02 519702 -128 123 -4.9 -490 -312 2 10302 99213 0.93693 297.93693 149.43693 14943.69369 0.93693 297.93695 149.43693 14943.69377 0.93693 297.93693 149.43693 14943.69300 2020-01-01 2020-01-02 2020-01-01 00:05:12 2020-01-02 03:33:33 2020-01-01 00:05:12.000 2020-01-02 03:33:33.000 312 99213 49762.5 4976250 312 99213 49762.5 4976250 -32257 32678 5198.02 519802 -127 124 -3.9 -390 -313 2 10303 99214 0.93993 297.93993 149.43993 14943.99399 0.93993 297.93994 149.43994 14943.99412 0.93993 297.93993 149.43993 14943.99300 2020-01-01 2020-01-02 2020-01-01 00:05:13 2020-01-02 03:33:34 2020-01-01 00:05:13.000 2020-01-02 03:33:34.000 313 99214 49763.5 4976350 313 99214 49763.5 4976350 -32256 32679 5199.02 519902 -126 125 -2.9 -290 -314 2 10304 99215 0.94294 297.94294 149.44294 14944.29429 0.94294 297.94293 149.44294 14944.29427 0.94294 297.94294 149.44294 14944.29400 2020-01-01 2020-01-02 2020-01-01 00:05:14 2020-01-02 03:33:35 2020-01-01 00:05:14.000 2020-01-02 03:33:35.000 314 99215 49764.5 4976450 314 99215 49764.5 4976450 -32255 32680 5200.02 520002 -125 126 -1.9 -190 -315 2 10305 99216 0.94594 297.94594 149.44594 14944.59459 0.94594 297.94595 149.44595 14944.595 0.94594 297.94594 149.44593999999998 14944.59400 2020-01-01 2020-01-02 2020-01-01 00:05:15 2020-01-02 03:33:36 2020-01-01 00:05:15.000 2020-01-02 03:33:36.000 315 99216 49765.5 4976550 315 99216 49765.5 4976550 -32254 32681 5201.02 520102 -124 127 -0.9 -90 -316 2 10306 99217 0.94894 297.94894 149.44894 14944.89489 0.94894 297.94894 149.44894 14944.89466 0.94894 297.94894 149.44894 14944.89400 2020-01-01 2020-01-02 2020-01-01 00:05:16 2020-01-02 03:33:37 2020-01-01 00:05:16.000 2020-01-02 03:33:37.000 316 99217 49766.5 4976650 316 99217 49766.5 4976650 -32253 32682 5202.02 520202 -128 127 -2.46 -246 -317 2 10307 99218 0.95195 297.95195 149.45195 14945.19519 0.95195 297.95197 149.45195 14945.19524 0.95195 297.95195 149.45195 14945.19500 2020-01-01 2020-01-02 2020-01-01 00:05:17 2020-01-02 03:33:38 2020-01-01 00:05:17.000 2020-01-02 03:33:38.000 317 99218 49767.5 4976750 317 99218 49767.5 4976750 -32252 32683 5203.02 520302 -128 123 -4.02 -402 -318 2 10308 99219 0.95495 297.95495 149.45495 14945.49549 0.95495 297.95496 149.45495 14945.49558 0.95495 297.95495 149.45495 14945.49500 2020-01-01 2020-01-02 2020-01-01 00:05:18 2020-01-02 03:33:39 2020-01-01 00:05:18.000 2020-01-02 03:33:39.000 318 99219 49768.5 4976850 318 99219 49768.5 4976850 -32251 32684 5204.02 520402 -127 124 -3.02 -302 -319 2 10309 99220 0.95795 297.95795 149.45795 14945.79579 0.95795 297.95795 149.45795 14945.79574 0.95795 297.95795 149.45795 14945.79500 2020-01-01 2020-01-02 2020-01-01 00:05:19 2020-01-02 03:33:40 2020-01-01 00:05:19.000 2020-01-02 03:33:40.000 319 99220 49769.5 4976950 319 99220 49769.5 4976950 -32250 32685 5205.02 520502 -126 125 -2.02 -202 +310 2 10300 99211 0.93093 297.93093 149.43093 14943.09309 0.93093 297.93094 149.43092 14943.09288 0.93093 297.93093 149.43093000000002 14943.093 2020-01-01 2020-01-02 2020-01-01 00:05:10 2020-01-02 03:33:31 2020-01-01 00:05:10.000 2020-01-02 03:33:31.000 310 99211 49760.5 4976050 310 99211 49760.5 4976050 -32259 32676 5196.02 519602 -128 127 -3.34 -334 +311 2 10301 99212 0.93393 297.93393 149.43393 14943.39339 0.93393 297.93393 149.43393 14943.39319 0.93393 297.93393 149.43393 14943.393 2020-01-01 2020-01-02 2020-01-01 00:05:11 2020-01-02 03:33:32 2020-01-01 00:05:11.000 2020-01-02 03:33:32.000 311 99212 49761.5 4976150 311 99212 49761.5 4976150 -32258 32677 5197.02 519702 -128 123 -4.9 -490 +312 2 10302 99213 0.93693 297.93693 149.43693 14943.69369 0.93693 297.93695 149.43693 14943.69377 0.93693 297.93693 149.43693 14943.693 2020-01-01 2020-01-02 2020-01-01 00:05:12 2020-01-02 03:33:33 2020-01-01 00:05:12.000 2020-01-02 03:33:33.000 312 99213 49762.5 4976250 312 99213 49762.5 4976250 -32257 32678 5198.02 519802 -127 124 -3.9 -390 +313 2 10303 99214 0.93993 297.93993 149.43993 14943.99399 0.93993 297.93994 149.43994 14943.99412 0.93993 297.93993 149.43993 14943.993 2020-01-01 2020-01-02 2020-01-01 00:05:13 2020-01-02 03:33:34 2020-01-01 00:05:13.000 2020-01-02 03:33:34.000 313 99214 49763.5 4976350 313 99214 49763.5 4976350 -32256 32679 5199.02 519902 -126 125 -2.9 -290 +314 2 10304 99215 0.94294 297.94294 149.44294 14944.29429 0.94294 297.94293 149.44294 14944.29427 0.94294 297.94294 149.44294 14944.294 2020-01-01 2020-01-02 2020-01-01 00:05:14 2020-01-02 03:33:35 2020-01-01 00:05:14.000 2020-01-02 03:33:35.000 314 99215 49764.5 4976450 314 99215 49764.5 4976450 -32255 32680 5200.02 520002 -125 126 -1.9 -190 +315 2 10305 99216 0.94594 297.94594 149.44594 14944.59459 0.94594 297.94595 149.44595 14944.595 0.94594 297.94594 149.44593999999998 14944.594 2020-01-01 2020-01-02 2020-01-01 00:05:15 2020-01-02 03:33:36 2020-01-01 00:05:15.000 2020-01-02 03:33:36.000 315 99216 49765.5 4976550 315 99216 49765.5 4976550 -32254 32681 5201.02 520102 -124 127 -0.9 -90 +316 2 10306 99217 0.94894 297.94894 149.44894 14944.89489 0.94894 297.94894 149.44894 14944.89466 0.94894 297.94894 149.44894 14944.894 2020-01-01 2020-01-02 2020-01-01 00:05:16 2020-01-02 03:33:37 2020-01-01 00:05:16.000 2020-01-02 03:33:37.000 316 99217 49766.5 4976650 316 99217 49766.5 4976650 -32253 32682 5202.02 520202 -128 127 -2.46 -246 +317 2 10307 99218 0.95195 297.95195 149.45195 14945.19519 0.95195 297.95197 149.45195 14945.19524 0.95195 297.95195 149.45195 14945.195 2020-01-01 2020-01-02 2020-01-01 00:05:17 2020-01-02 03:33:38 2020-01-01 00:05:17.000 2020-01-02 03:33:38.000 317 99218 49767.5 4976750 317 99218 49767.5 4976750 -32252 32683 5203.02 520302 -128 123 -4.02 -402 +318 2 10308 99219 0.95495 297.95495 149.45495 14945.49549 0.95495 297.95496 149.45495 14945.49558 0.95495 297.95495 149.45495 14945.495 2020-01-01 2020-01-02 2020-01-01 00:05:18 2020-01-02 03:33:39 2020-01-01 00:05:18.000 2020-01-02 03:33:39.000 318 99219 49768.5 4976850 318 99219 49768.5 4976850 -32251 32684 5204.02 520402 -127 124 -3.02 -302 +319 2 10309 99220 0.95795 297.95795 149.45795 14945.79579 0.95795 297.95795 149.45795 14945.79574 0.95795 297.95795 149.45795 14945.795 2020-01-01 2020-01-02 2020-01-01 00:05:19 2020-01-02 03:33:40 2020-01-01 00:05:19.000 2020-01-02 03:33:40.000 319 99220 49769.5 4976950 319 99220 49769.5 4976950 -32250 32685 5205.02 520502 -126 125 -2.02 -202 32 2 10022 99932 0.09609 300.09609 150.09609 15159.7057 0.09609 300.0961 150.09609 15159.706 0.09609 300.09609 150.09609 15159.70509 2020-01-01 2020-01-02 2020-01-01 00:00:32 2020-01-02 03:45:32 2020-01-01 00:00:32.000 2020-01-02 03:45:32.000 32 99932 49982 5048182 32 99932 49982 5048182 -32537 32398 4561.009900990099 460662 -126 125 -1.3663366336633664 -138 -320 2 10310 99221 0.96096 297.96096 149.46096 14946.09609 0.96096 297.96097 149.46096 14946.09647 0.96096 297.96096 149.46096 14946.09600 2020-01-01 2020-01-02 2020-01-01 00:05:20 2020-01-02 03:33:41 2020-01-01 00:05:20.000 2020-01-02 03:33:41.000 320 99221 49770.5 4977050 320 99221 49770.5 4977050 -32249 32686 5206.02 520602 -125 126 -1.02 -102 -321 2 10311 99222 0.96396 297.96396 149.46396 14946.39639 0.96396 297.96396 149.46396 14946.39613 0.96396 297.96396 149.46396000000001 14946.39600 2020-01-01 2020-01-02 2020-01-01 00:05:21 2020-01-02 03:33:42 2020-01-01 00:05:21.000 2020-01-02 03:33:42.000 321 99222 49771.5 4977150 321 99222 49771.5 4977150 -32248 32687 5207.02 520702 -124 127 -0.02 -2 -322 2 10312 99223 0.96696 297.96696 149.46696 14946.69669 0.96696 297.96698 149.46696 14946.69674 0.96696 297.96696 149.46696 14946.69600 2020-01-01 2020-01-02 2020-01-01 00:05:22 2020-01-02 03:33:43 2020-01-01 00:05:22.000 2020-01-02 03:33:43.000 322 99223 49772.5 4977250 322 99223 49772.5 4977250 -32247 32688 5208.02 520802 -128 127 -1.58 -158 -323 2 10313 99224 0.96996 297.96996 149.46996 14946.99699 0.96997 297.96997 149.46997 14946.99706 0.96996 297.96996 149.46996 14946.99600 2020-01-01 2020-01-02 2020-01-01 00:05:23 2020-01-02 03:33:44 2020-01-01 00:05:23.000 2020-01-02 03:33:44.000 323 99224 49773.5 4977350 323 99224 49773.5 4977350 -32246 32689 5209.02 520902 -128 123 -3.14 -314 -324 2 10314 99225 0.97297 297.97297 149.47297 14947.29729 0.97297 297.97296 149.47297 14947.29737 0.97297 297.97297 149.47297 14947.29700 2020-01-01 2020-01-02 2020-01-01 00:05:24 2020-01-02 03:33:45 2020-01-01 00:05:24.000 2020-01-02 03:33:45.000 324 99225 49774.5 4977450 324 99225 49774.5 4977450 -32245 32690 5210.02 521002 -127 124 -2.14 -214 -325 2 10315 99226 0.97597 297.97597 149.47597 14947.59759 0.97597 297.97598 149.47597 14947.59794 0.97597 297.97597 149.47597 14947.59700 2020-01-01 2020-01-02 2020-01-01 00:05:25 2020-01-02 03:33:46 2020-01-01 00:05:25.000 2020-01-02 03:33:46.000 325 99226 49775.5 4977550 325 99226 49775.5 4977550 -32244 32691 5211.02 521102 -126 125 -1.14 -114 -326 2 10316 99227 0.97897 297.97897 149.47897 14947.89789 0.97897 297.97897 149.47897 14947.8976 0.97897 297.97897 149.47897 14947.89700 2020-01-01 2020-01-02 2020-01-01 00:05:26 2020-01-02 03:33:47 2020-01-01 00:05:26.000 2020-01-02 03:33:47.000 326 99227 49776.5 4977650 326 99227 49776.5 4977650 -32243 32692 5212.02 521202 -125 126 -0.14 -14 -327 2 10317 99228 0.98198 297.98198 149.48198 14948.19819 0.98198 297.982 149.48198 14948.19821 0.98198 297.98198 149.48198 14948.19800 2020-01-01 2020-01-02 2020-01-01 00:05:27 2020-01-02 03:33:48 2020-01-01 00:05:27.000 2020-01-02 03:33:48.000 327 99228 49777.5 4977750 327 99228 49777.5 4977750 -32242 32693 5213.02 521302 -124 127 0.86 86 -328 2 10318 99229 0.98498 297.98498 149.48498 14948.49849 0.98498 297.985 149.48498 14948.49853 0.98498 297.98498 149.48498 14948.49800 2020-01-01 2020-01-02 2020-01-01 00:05:28 2020-01-02 03:33:49 2020-01-01 00:05:28.000 2020-01-02 03:33:49.000 328 99229 49778.5 4977850 328 99229 49778.5 4977850 -32241 32694 5214.02 521402 -128 127 -0.7 -70 -329 2 10319 99230 0.98798 297.98798 149.48798 14948.79879 0.98798 297.98798 149.48798 14948.79883 0.98798 297.98798 149.48798 14948.79800 2020-01-01 2020-01-02 2020-01-01 00:05:29 2020-01-02 03:33:50 2020-01-01 00:05:29.000 2020-01-02 03:33:50.000 329 99230 49779.5 4977950 329 99230 49779.5 4977950 -32240 32695 5215.02 521502 -128 127 -2.26 -226 +320 2 10310 99221 0.96096 297.96096 149.46096 14946.09609 0.96096 297.96097 149.46096 14946.09647 0.96096 297.96096 149.46096 14946.096 2020-01-01 2020-01-02 2020-01-01 00:05:20 2020-01-02 03:33:41 2020-01-01 00:05:20.000 2020-01-02 03:33:41.000 320 99221 49770.5 4977050 320 99221 49770.5 4977050 -32249 32686 5206.02 520602 -125 126 -1.02 -102 +321 2 10311 99222 0.96396 297.96396 149.46396 14946.39639 0.96396 297.96396 149.46396 14946.39613 0.96396 297.96396 149.46396000000001 14946.396 2020-01-01 2020-01-02 2020-01-01 00:05:21 2020-01-02 03:33:42 2020-01-01 00:05:21.000 2020-01-02 03:33:42.000 321 99222 49771.5 4977150 321 99222 49771.5 4977150 -32248 32687 5207.02 520702 -124 127 -0.02 -2 +322 2 10312 99223 0.96696 297.96696 149.46696 14946.69669 0.96696 297.96698 149.46696 14946.69674 0.96696 297.96696 149.46696 14946.696 2020-01-01 2020-01-02 2020-01-01 00:05:22 2020-01-02 03:33:43 2020-01-01 00:05:22.000 2020-01-02 03:33:43.000 322 99223 49772.5 4977250 322 99223 49772.5 4977250 -32247 32688 5208.02 520802 -128 127 -1.58 -158 +323 2 10313 99224 0.96996 297.96996 149.46996 14946.99699 0.96997 297.96997 149.46997 14946.99706 0.96996 297.96996 149.46996 14946.996 2020-01-01 2020-01-02 2020-01-01 00:05:23 2020-01-02 03:33:44 2020-01-01 00:05:23.000 2020-01-02 03:33:44.000 323 99224 49773.5 4977350 323 99224 49773.5 4977350 -32246 32689 5209.02 520902 -128 123 -3.14 -314 +324 2 10314 99225 0.97297 297.97297 149.47297 14947.29729 0.97297 297.97296 149.47297 14947.29737 0.97297 297.97297 149.47297 14947.297 2020-01-01 2020-01-02 2020-01-01 00:05:24 2020-01-02 03:33:45 2020-01-01 00:05:24.000 2020-01-02 03:33:45.000 324 99225 49774.5 4977450 324 99225 49774.5 4977450 -32245 32690 5210.02 521002 -127 124 -2.14 -214 +325 2 10315 99226 0.97597 297.97597 149.47597 14947.59759 0.97597 297.97598 149.47597 14947.59794 0.97597 297.97597 149.47597 14947.597 2020-01-01 2020-01-02 2020-01-01 00:05:25 2020-01-02 03:33:46 2020-01-01 00:05:25.000 2020-01-02 03:33:46.000 325 99226 49775.5 4977550 325 99226 49775.5 4977550 -32244 32691 5211.02 521102 -126 125 -1.14 -114 +326 2 10316 99227 0.97897 297.97897 149.47897 14947.89789 0.97897 297.97897 149.47897 14947.8976 0.97897 297.97897 149.47897 14947.897 2020-01-01 2020-01-02 2020-01-01 00:05:26 2020-01-02 03:33:47 2020-01-01 00:05:26.000 2020-01-02 03:33:47.000 326 99227 49776.5 4977650 326 99227 49776.5 4977650 -32243 32692 5212.02 521202 -125 126 -0.14 -14 +327 2 10317 99228 0.98198 297.98198 149.48198 14948.19819 0.98198 297.982 149.48198 14948.19821 0.98198 297.98198 149.48198 14948.198 2020-01-01 2020-01-02 2020-01-01 00:05:27 2020-01-02 03:33:48 2020-01-01 00:05:27.000 2020-01-02 03:33:48.000 327 99228 49777.5 4977750 327 99228 49777.5 4977750 -32242 32693 5213.02 521302 -124 127 0.86 86 +328 2 10318 99229 0.98498 297.98498 149.48498 14948.49849 0.98498 297.985 149.48498 14948.49853 0.98498 297.98498 149.48498 14948.498 2020-01-01 2020-01-02 2020-01-01 00:05:28 2020-01-02 03:33:49 2020-01-01 00:05:28.000 2020-01-02 03:33:49.000 328 99229 49778.5 4977850 328 99229 49778.5 4977850 -32241 32694 5214.02 521402 -128 127 -0.7 -70 +329 2 10319 99230 0.98798 297.98798 149.48798 14948.79879 0.98798 297.98798 149.48798 14948.79883 0.98798 297.98798 149.48798 14948.798 2020-01-01 2020-01-02 2020-01-01 00:05:29 2020-01-02 03:33:50 2020-01-01 00:05:29.000 2020-01-02 03:33:50.000 329 99230 49779.5 4977950 329 99230 49779.5 4977950 -32240 32695 5215.02 521502 -128 127 -2.26 -226 33 2 10023 99933 0.09909 300.09909 150.09909 15160.009 0.09909 300.0991 150.0991 15160.00913 0.09909 300.09909 150.09909 15160.00809 2020-01-01 2020-01-02 2020-01-01 00:00:33 2020-01-02 03:45:33 2020-01-01 00:00:33.000 2020-01-02 03:45:33.000 33 99933 49983 5048283 33 99933 49983 5048283 -32536 32399 4562.009900990099 460763 -125 126 -0.36633663366336633 -37 -330 2 10320 99231 0.99099 297.99099 149.49099 14949.09909 0.99099 297.991 149.49099 14949.09941 0.99099 297.99099 149.49099 14949.09900 2020-01-01 2020-01-02 2020-01-01 00:05:30 2020-01-02 03:33:51 2020-01-01 00:05:30.000 2020-01-02 03:33:51.000 330 99231 49780.5 4978050 330 99231 49780.5 4978050 -32239 32696 5216.02 521602 -128 123 -3.82 -382 -331 2 10321 99232 0.99399 297.99399 149.49399 14949.39939 0.99399 297.994 149.49399 14949.39911 0.99399 297.99399 149.49399 14949.39900 2020-01-01 2020-01-02 2020-01-01 00:05:31 2020-01-02 03:33:52 2020-01-01 00:05:31.000 2020-01-02 03:33:52.000 331 99232 49781.5 4978150 331 99232 49781.5 4978150 -32238 32697 5217.02 521702 -127 124 -2.82 -282 -332 2 10322 99233 0.99699 297.99699 149.49699 14949.69969 0.99699 297.997 149.49699 14949.69969 0.99699 297.99699 149.49699 14949.69900 2020-01-01 2020-01-02 2020-01-01 00:05:32 2020-01-02 03:33:53 2020-01-01 00:05:32.000 2020-01-02 03:33:53.000 332 99233 49782.5 4978250 332 99233 49782.5 4978250 -32237 32698 5218.02 521802 -126 125 -1.82 -182 -333 2 10323 99234 1 298 149.5 14950 1 298 149.5 14950 1.00000 298.00000 149.5 14950.00000 2020-01-01 2020-01-02 2020-01-01 00:05:33 2020-01-02 03:33:54 2020-01-01 00:05:33.000 2020-01-02 03:33:54.000 333 99234 49783.5 4978350 333 99234 49783.5 4978350 -32236 32699 5219.02 521902 -125 126 -0.82 -82 -334 2 10324 99235 1.003 298.003 149.503 14950.3003 1.003 298.003 149.503 14950.30029 1.00300 298.00300 149.503 14950.30000 2020-01-01 2020-01-02 2020-01-01 00:05:34 2020-01-02 03:33:55 2020-01-01 00:05:34.000 2020-01-02 03:33:55.000 334 99235 49784.5 4978450 334 99235 49784.5 4978450 -32235 32700 5220.02 522002 -124 127 0.18 18 -335 2 10325 99236 1.006 298.006 149.506 14950.6006 1.006 298.006 149.506 14950.60088 1.00600 298.00600 149.506 14950.60000 2020-01-01 2020-01-02 2020-01-01 00:05:35 2020-01-02 03:33:56 2020-01-01 00:05:35.000 2020-01-02 03:33:56.000 335 99236 49785.5 4978550 335 99236 49785.5 4978550 -32234 32701 5221.02 522102 -128 127 -1.38 -138 -336 2 10326 99237 1.009 298.009 149.509 14950.9009 1.009 298.009 149.509 14950.90057 1.00900 298.00900 149.509 14950.90000 2020-01-01 2020-01-02 2020-01-01 00:05:36 2020-01-02 03:33:57 2020-01-01 00:05:36.000 2020-01-02 03:33:57.000 336 99237 49786.5 4978650 336 99237 49786.5 4978650 -32233 32702 5222.02 522202 -128 123 -2.94 -294 -337 2 10327 99238 1.01201 298.01201 149.51201 14951.2012 1.01201 298.01202 149.51201 14951.20117 1.01201 298.01201 149.51201 14951.20100 2020-01-01 2020-01-02 2020-01-01 00:05:37 2020-01-02 03:33:58 2020-01-01 00:05:37.000 2020-01-02 03:33:58.000 337 99238 49787.5 4978750 337 99238 49787.5 4978750 -32232 32703 5223.02 522302 -127 124 -1.94 -194 -338 2 10328 99239 1.01501 298.01501 149.51501 14951.5015 1.01501 298.015 149.51501 14951.50146 1.01501 298.01501 149.51501 14951.50100 2020-01-01 2020-01-02 2020-01-01 00:05:38 2020-01-02 03:33:59 2020-01-01 00:05:38.000 2020-01-02 03:33:59.000 338 99239 49788.5 4978850 338 99239 49788.5 4978850 -32231 32704 5224.02 522402 -126 125 -0.94 -94 -339 2 10329 99240 1.01801 298.01801 149.51801 14951.8018 1.01801 298.018 149.51801 14951.80177 1.01801 298.01801 149.51801 14951.80100 2020-01-01 2020-01-02 2020-01-01 00:05:39 2020-01-02 03:34:00 2020-01-01 00:05:39.000 2020-01-02 03:34:00.000 339 99240 49789.5 4978950 339 99240 49789.5 4978950 -32230 32705 5225.02 522502 -125 126 0.06 6 -34 2 10024 99934 0.1021 300.1021 150.1021 15160.31231 0.1021 300.1021 150.1021 15160.31224 0.10210 300.10210 150.10209999999998 15160.31210 2020-01-01 2020-01-02 2020-01-01 00:00:34 2020-01-02 03:45:34 2020-01-01 00:00:34.000 2020-01-02 03:45:34.000 34 99934 49984 5048384 34 99934 49984 5048384 -32535 32400 4563.009900990099 460864 -124 127 0.6336633663366337 64 -340 2 10330 99241 1.02102 298.02102 149.52102 14952.1021 1.02102 298.02103 149.52102 14952.10239 1.02102 298.02102 149.52102000000002 14952.10200 2020-01-01 2020-01-02 2020-01-01 00:05:40 2020-01-02 03:34:01 2020-01-01 00:05:40.000 2020-01-02 03:34:01.000 340 99241 49790.5 4979050 340 99241 49790.5 4979050 -32229 32706 5226.02 522602 -124 127 1.06 106 -341 2 10331 99242 1.02402 298.02402 149.52402 14952.4024 1.02402 298.02402 149.52402 14952.40205 1.02402 298.02402 149.52402 14952.40200 2020-01-01 2020-01-02 2020-01-01 00:05:41 2020-01-02 03:34:02 2020-01-01 00:05:41.000 2020-01-02 03:34:02.000 341 99242 49791.5 4979150 341 99242 49791.5 4979150 -32228 32707 5227.02 522702 -128 127 -0.5 -50 -342 2 10332 99243 1.02702 298.02702 149.52702 14952.7027 1.02702 298.02704 149.52702 14952.70264 1.02702 298.02702 149.52702 14952.70200 2020-01-01 2020-01-02 2020-01-01 00:05:42 2020-01-02 03:34:03 2020-01-01 00:05:42.000 2020-01-02 03:34:03.000 342 99243 49792.5 4979250 342 99243 49792.5 4979250 -32227 32708 5228.02 522802 -128 123 -2.06 -206 -343 2 10333 99244 1.03003 298.03003 149.53003 14953.003 1.03003 298.03003 149.53002 14953.00293 1.03003 298.03003 149.53003 14953.00300 2020-01-01 2020-01-02 2020-01-01 00:05:43 2020-01-02 03:34:04 2020-01-01 00:05:43.000 2020-01-02 03:34:04.000 343 99244 49793.5 4979350 343 99244 49793.5 4979350 -32226 32709 5229.02 522902 -127 124 -1.06 -106 -344 2 10334 99245 1.03303 298.03303 149.53303 14953.3033 1.03303 298.03302 149.53303 14953.30323 1.03303 298.03303 149.53303 14953.30300 2020-01-01 2020-01-02 2020-01-01 00:05:44 2020-01-02 03:34:05 2020-01-01 00:05:44.000 2020-01-02 03:34:05.000 344 99245 49794.5 4979450 344 99245 49794.5 4979450 -32225 32710 5230.02 523002 -126 125 -0.06 -6 -345 2 10335 99246 1.03603 298.03603 149.53603 14953.6036 1.03603 298.03604 149.53603 14953.60386 1.03603 298.03603 149.53602999999998 14953.60300 2020-01-01 2020-01-02 2020-01-01 00:05:45 2020-01-02 03:34:06 2020-01-01 00:05:45.000 2020-01-02 03:34:06.000 345 99246 49795.5 4979550 345 99246 49795.5 4979550 -32224 32711 5231.02 523102 -125 126 0.94 94 -346 2 10336 99247 1.03903 298.03903 149.53903 14953.9039 1.03903 298.03903 149.53903 14953.90352 1.03903 298.03903 149.53903 14953.90300 2020-01-01 2020-01-02 2020-01-01 00:05:46 2020-01-02 03:34:07 2020-01-01 00:05:46.000 2020-01-02 03:34:07.000 346 99247 49796.5 4979650 346 99247 49796.5 4979650 -32223 32712 5232.02 523202 -124 127 1.94 194 -347 2 10337 99248 1.04204 298.04204 149.54204 14954.2042 1.04204 298.04205 149.54204 14954.20427 1.04204 298.04204 149.54204 14954.20400 2020-01-01 2020-01-02 2020-01-01 00:05:47 2020-01-02 03:34:08 2020-01-01 00:05:47.000 2020-01-02 03:34:08.000 347 99248 49797.5 4979750 347 99248 49797.5 4979750 -32222 32713 5233.02 523302 -128 127 0.38 38 -348 2 10338 99249 1.04504 298.04504 149.54504 14954.5045 1.04504 298.04504 149.54504 14954.50441 1.04504 298.04504 149.54504 14954.50400 2020-01-01 2020-01-02 2020-01-01 00:05:48 2020-01-02 03:34:09 2020-01-01 00:05:48.000 2020-01-02 03:34:09.000 348 99249 49798.5 4979850 348 99249 49798.5 4979850 -32221 32714 5234.02 523402 -128 123 -1.18 -118 -349 2 10339 99250 1.04804 298.04804 149.54804 14954.8048 1.04804 298.04803 149.54804 14954.80474 1.04804 298.04804 149.54804000000001 14954.80400 2020-01-01 2020-01-02 2020-01-01 00:05:49 2020-01-02 03:34:10 2020-01-01 00:05:49.000 2020-01-02 03:34:10.000 349 99250 49799.5 4979950 349 99250 49799.5 4979950 -32220 32715 5235.02 523502 -127 124 -0.18 -18 -35 2 10025 99935 0.1051 300.1051 150.1051 15160.61561 0.1051 300.1051 150.1051 15160.61542 0.10510 300.10510 150.10510000000002 15160.61510 2020-01-01 2020-01-02 2020-01-01 00:00:35 2020-01-02 03:45:35 2020-01-01 00:00:35.000 2020-01-02 03:45:35.000 35 99935 49985 5048485 35 99935 49985 5048485 -32534 32401 4564.009900990099 460965 -128 127 -0.900990099009901 -91 -350 2 10340 99251 1.05105 298.05105 149.55105 14955.1051 1.05105 298.05106 149.55105 14955.10532 1.05105 298.05105 149.55105 14955.10500 2020-01-01 2020-01-02 2020-01-01 00:05:50 2020-01-02 03:34:11 2020-01-01 00:05:50.000 2020-01-02 03:34:11.000 350 99251 49800.5 4980050 350 99251 49800.5 4980050 -32219 32716 5236.02 523602 -126 125 0.82 82 -351 2 10341 99252 1.05405 298.05405 149.55405 14955.4054 1.05405 298.05405 149.55404 14955.40499 1.05405 298.05405 149.55405000000002 14955.40500 2020-01-01 2020-01-02 2020-01-01 00:05:51 2020-01-02 03:34:12 2020-01-01 00:05:51.000 2020-01-02 03:34:12.000 351 99252 49801.5 4980150 351 99252 49801.5 4980150 -32218 32717 5237.02 523702 -125 126 1.82 182 -352 2 10342 99253 1.05705 298.05705 149.55705 14955.7057 1.05705 298.05707 149.55705 14955.70574 1.05705 298.05705 149.55705 14955.70500 2020-01-01 2020-01-02 2020-01-01 00:05:52 2020-01-02 03:34:13 2020-01-01 00:05:52.000 2020-01-02 03:34:13.000 352 99253 49802.5 4980250 352 99253 49802.5 4980250 -32217 32718 5238.02 523802 -124 127 2.82 282 -353 2 10343 99254 1.06006 298.06006 149.56006 14956.006 1.06006 298.06006 149.56005 14956.00587 1.06006 298.06006 149.56006 14956.00600 2020-01-01 2020-01-02 2020-01-01 00:05:53 2020-01-02 03:34:14 2020-01-01 00:05:53.000 2020-01-02 03:34:14.000 353 99254 49803.5 4980350 353 99254 49803.5 4980350 -32216 32719 5239.02 523902 -128 127 1.26 126 -354 2 10344 99255 1.06306 298.06306 149.56306 14956.3063 1.06306 298.06305 149.56306 14956.3062 1.06306 298.06306 149.56306 14956.30600 2020-01-01 2020-01-02 2020-01-01 00:05:54 2020-01-02 03:34:15 2020-01-01 00:05:54.000 2020-01-02 03:34:15.000 354 99255 49804.5 4980450 354 99255 49804.5 4980450 -32215 32720 5240.02 524002 -128 127 -0.3 -30 -355 2 10345 99256 1.06606 298.06606 149.56606 14956.6066 1.06606 298.06607 149.56606 14956.6068 1.06606 298.06606 149.56606 14956.60600 2020-01-01 2020-01-02 2020-01-01 00:05:55 2020-01-02 03:34:16 2020-01-01 00:05:55.000 2020-01-02 03:34:16.000 355 99256 49805.5 4980550 355 99256 49805.5 4980550 -32214 32721 5241.02 524102 -128 123 -1.86 -186 -356 2 10346 99257 1.06906 298.06906 149.56906 14956.9069 1.06906 298.06906 149.56907 14956.90709 1.06906 298.06906 149.56906 14956.90600 2020-01-01 2020-01-02 2020-01-01 00:05:56 2020-01-02 03:34:17 2020-01-01 00:05:56.000 2020-01-02 03:34:17.000 356 99257 49806.5 4980650 356 99257 49806.5 4980650 -32213 32722 5242.02 524202 -127 124 -0.86 -86 -357 2 10347 99258 1.07207 298.07207 149.57207 14957.2072 1.07207 298.07208 149.57207 14957.20721 1.07207 298.07207 149.57207 14957.20700 2020-01-01 2020-01-02 2020-01-01 00:05:57 2020-01-02 03:34:18 2020-01-01 00:05:57.000 2020-01-02 03:34:18.000 357 99258 49807.5 4980750 357 99258 49807.5 4980750 -32212 32723 5243.02 524302 -126 125 0.14 14 -358 2 10348 99259 1.07507 298.07507 149.57507 14957.5075 1.07507 298.07507 149.57507 14957.50734 1.07507 298.07507 149.57506999999998 14957.50700 2020-01-01 2020-01-02 2020-01-01 00:05:58 2020-01-02 03:34:19 2020-01-01 00:05:58.000 2020-01-02 03:34:19.000 358 99259 49808.5 4980850 358 99259 49808.5 4980850 -32211 32724 5244.02 524402 -125 126 1.14 114 -359 2 10349 99260 1.07807 298.07807 149.57807 14957.8078 1.07807 298.07806 149.57807 14957.80767 1.07807 298.07807 149.57807 14957.80700 2020-01-01 2020-01-02 2020-01-01 00:05:59 2020-01-02 03:34:20 2020-01-01 00:05:59.000 2020-01-02 03:34:20.000 359 99260 49809.5 4980950 359 99260 49809.5 4980950 -32210 32725 5245.02 524502 -124 127 2.14 214 -36 2 10026 99936 0.1081 300.1081 150.1081 15160.91891 0.1081 300.1081 150.1081 15160.91873 0.10810 300.10810 150.1081 15160.91810 2020-01-01 2020-01-02 2020-01-01 00:00:36 2020-01-02 03:45:36 2020-01-01 00:00:36.000 2020-01-02 03:45:36.000 36 99936 49986 5048586 36 99936 49986 5048586 -32533 32402 4565.009900990099 461066 -128 123 -2.4356435643564356 -246 -360 2 10350 99261 1.08108 298.08108 149.58108 14958.1081 1.08108 298.0811 149.58108 14958.10827 1.08108 298.08108 149.58108000000001 14958.10800 2020-01-01 2020-01-02 2020-01-01 00:06:00 2020-01-02 03:34:21 2020-01-01 00:06:00.000 2020-01-02 03:34:21.000 360 99261 49810.5 4981050 360 99261 49810.5 4981050 -32209 32726 5246.02 524602 -128 127 0.58 58 -361 2 10351 99262 1.08408 298.08408 149.58408 14958.4084 1.08408 298.08408 149.58408 14958.40856 1.08408 298.08408 149.58408 14958.40800 2020-01-01 2020-01-02 2020-01-01 00:06:01 2020-01-02 03:34:22 2020-01-01 00:06:01.000 2020-01-02 03:34:22.000 361 99262 49811.5 4981150 361 99262 49811.5 4981150 -32208 32727 5247.02 524702 -128 123 -0.98 -98 -362 2 10352 99263 1.08708 298.08708 149.58708 14958.7087 1.08708 298.0871 149.58708 14958.70868 1.08708 298.08708 149.58708000000001 14958.70800 2020-01-01 2020-01-02 2020-01-01 00:06:02 2020-01-02 03:34:23 2020-01-01 00:06:02.000 2020-01-02 03:34:23.000 362 99263 49812.5 4981250 362 99263 49812.5 4981250 -32207 32728 5248.02 524802 -127 124 0.02 2 -363 2 10353 99264 1.09009 298.09009 149.59009 14959.009 1.09009 298.0901 149.59008 14959.00884 1.09009 298.09009 149.59009 14959.00900 2020-01-01 2020-01-02 2020-01-01 00:06:03 2020-01-02 03:34:24 2020-01-01 00:06:03.000 2020-01-02 03:34:24.000 363 99264 49813.5 4981350 363 99264 49813.5 4981350 -32206 32729 5249.02 524902 -126 125 1.02 102 -364 2 10354 99265 1.09309 298.09309 149.59309 14959.3093 1.09309 298.09308 149.59309 14959.30915 1.09309 298.09309 149.59309 14959.30900 2020-01-01 2020-01-02 2020-01-01 00:06:04 2020-01-02 03:34:25 2020-01-01 00:06:04.000 2020-01-02 03:34:25.000 364 99265 49814.5 4981450 364 99265 49814.5 4981450 -32205 32730 5250.02 525002 -125 126 2.02 202 -365 2 10355 99266 1.09609 298.09609 149.59609 14959.6096 1.09609 298.0961 149.59609 14959.6099 1.09609 298.09609 149.59609 14959.60900 2020-01-01 2020-01-02 2020-01-01 00:06:05 2020-01-02 03:34:26 2020-01-01 00:06:05.000 2020-01-02 03:34:26.000 365 99266 49815.5 4981550 365 99266 49815.5 4981550 -32204 32731 5251.02 525102 -124 127 3.02 302 -366 2 10356 99267 1.09909 298.09909 149.59909 14959.9099 1.09909 298.0991 149.5991 14959.91003 1.09909 298.09909 149.59909 14959.90900 2020-01-01 2020-01-02 2020-01-01 00:06:06 2020-01-02 03:34:27 2020-01-01 00:06:06.000 2020-01-02 03:34:27.000 366 99267 49816.5 4981650 366 99267 49816.5 4981650 -32203 32732 5252.02 525202 -128 127 1.46 146 -367 2 10357 99268 1.1021 298.1021 149.6021 14960.21021 1.1021 298.1021 149.6021 14960.21015 1.10210 298.10210 149.60209999999998 14960.21000 2020-01-01 2020-01-02 2020-01-01 00:06:07 2020-01-02 03:34:28 2020-01-01 00:06:07.000 2020-01-02 03:34:28.000 367 99268 49817.5 4981750 367 99268 49817.5 4981750 -32202 32733 5253.02 525302 -128 123 -0.1 -10 -368 2 10358 99269 1.1051 298.1051 149.6051 14960.51051 1.1051 298.1051 149.6051 14960.51031 1.10510 298.10510 149.6051 14960.51000 2020-01-01 2020-01-02 2020-01-01 00:06:08 2020-01-02 03:34:29 2020-01-01 00:06:08.000 2020-01-02 03:34:29.000 368 99269 49818.5 4981850 368 99269 49818.5 4981850 -32201 32734 5254.02 525402 -127 124 0.9 90 -369 2 10359 99270 1.1081 298.1081 149.6081 14960.81081 1.1081 298.1081 149.6081 14960.81062 1.10810 298.10810 149.6081 14960.81000 2020-01-01 2020-01-02 2020-01-01 00:06:09 2020-01-02 03:34:30 2020-01-01 00:06:09.000 2020-01-02 03:34:30.000 369 99270 49819.5 4981950 369 99270 49819.5 4981950 -32200 32735 5255.02 525502 -126 125 1.9 190 +330 2 10320 99231 0.99099 297.99099 149.49099 14949.09909 0.99099 297.991 149.49099 14949.09941 0.99099 297.99099 149.49099 14949.099 2020-01-01 2020-01-02 2020-01-01 00:05:30 2020-01-02 03:33:51 2020-01-01 00:05:30.000 2020-01-02 03:33:51.000 330 99231 49780.5 4978050 330 99231 49780.5 4978050 -32239 32696 5216.02 521602 -128 123 -3.82 -382 +331 2 10321 99232 0.99399 297.99399 149.49399 14949.39939 0.99399 297.994 149.49399 14949.39911 0.99399 297.99399 149.49399 14949.399 2020-01-01 2020-01-02 2020-01-01 00:05:31 2020-01-02 03:33:52 2020-01-01 00:05:31.000 2020-01-02 03:33:52.000 331 99232 49781.5 4978150 331 99232 49781.5 4978150 -32238 32697 5217.02 521702 -127 124 -2.82 -282 +332 2 10322 99233 0.99699 297.99699 149.49699 14949.69969 0.99699 297.997 149.49699 14949.69969 0.99699 297.99699 149.49699 14949.699 2020-01-01 2020-01-02 2020-01-01 00:05:32 2020-01-02 03:33:53 2020-01-01 00:05:32.000 2020-01-02 03:33:53.000 332 99233 49782.5 4978250 332 99233 49782.5 4978250 -32237 32698 5218.02 521802 -126 125 -1.82 -182 +333 2 10323 99234 1 298 149.5 14950 1 298 149.5 14950 1 298 149.5 14950 2020-01-01 2020-01-02 2020-01-01 00:05:33 2020-01-02 03:33:54 2020-01-01 00:05:33.000 2020-01-02 03:33:54.000 333 99234 49783.5 4978350 333 99234 49783.5 4978350 -32236 32699 5219.02 521902 -125 126 -0.82 -82 +334 2 10324 99235 1.003 298.003 149.503 14950.3003 1.003 298.003 149.503 14950.30029 1.003 298.003 149.503 14950.3 2020-01-01 2020-01-02 2020-01-01 00:05:34 2020-01-02 03:33:55 2020-01-01 00:05:34.000 2020-01-02 03:33:55.000 334 99235 49784.5 4978450 334 99235 49784.5 4978450 -32235 32700 5220.02 522002 -124 127 0.18 18 +335 2 10325 99236 1.006 298.006 149.506 14950.6006 1.006 298.006 149.506 14950.60088 1.006 298.006 149.506 14950.6 2020-01-01 2020-01-02 2020-01-01 00:05:35 2020-01-02 03:33:56 2020-01-01 00:05:35.000 2020-01-02 03:33:56.000 335 99236 49785.5 4978550 335 99236 49785.5 4978550 -32234 32701 5221.02 522102 -128 127 -1.38 -138 +336 2 10326 99237 1.009 298.009 149.509 14950.9009 1.009 298.009 149.509 14950.90057 1.009 298.009 149.509 14950.9 2020-01-01 2020-01-02 2020-01-01 00:05:36 2020-01-02 03:33:57 2020-01-01 00:05:36.000 2020-01-02 03:33:57.000 336 99237 49786.5 4978650 336 99237 49786.5 4978650 -32233 32702 5222.02 522202 -128 123 -2.94 -294 +337 2 10327 99238 1.01201 298.01201 149.51201 14951.2012 1.01201 298.01202 149.51201 14951.20117 1.01201 298.01201 149.51201 14951.201 2020-01-01 2020-01-02 2020-01-01 00:05:37 2020-01-02 03:33:58 2020-01-01 00:05:37.000 2020-01-02 03:33:58.000 337 99238 49787.5 4978750 337 99238 49787.5 4978750 -32232 32703 5223.02 522302 -127 124 -1.94 -194 +338 2 10328 99239 1.01501 298.01501 149.51501 14951.5015 1.01501 298.015 149.51501 14951.50146 1.01501 298.01501 149.51501 14951.501 2020-01-01 2020-01-02 2020-01-01 00:05:38 2020-01-02 03:33:59 2020-01-01 00:05:38.000 2020-01-02 03:33:59.000 338 99239 49788.5 4978850 338 99239 49788.5 4978850 -32231 32704 5224.02 522402 -126 125 -0.94 -94 +339 2 10329 99240 1.01801 298.01801 149.51801 14951.8018 1.01801 298.018 149.51801 14951.80177 1.01801 298.01801 149.51801 14951.801 2020-01-01 2020-01-02 2020-01-01 00:05:39 2020-01-02 03:34:00 2020-01-01 00:05:39.000 2020-01-02 03:34:00.000 339 99240 49789.5 4978950 339 99240 49789.5 4978950 -32230 32705 5225.02 522502 -125 126 0.06 6 +34 2 10024 99934 0.1021 300.1021 150.1021 15160.31231 0.1021 300.1021 150.1021 15160.31224 0.1021 300.1021 150.10209999999998 15160.3121 2020-01-01 2020-01-02 2020-01-01 00:00:34 2020-01-02 03:45:34 2020-01-01 00:00:34.000 2020-01-02 03:45:34.000 34 99934 49984 5048384 34 99934 49984 5048384 -32535 32400 4563.009900990099 460864 -124 127 0.6336633663366337 64 +340 2 10330 99241 1.02102 298.02102 149.52102 14952.1021 1.02102 298.02103 149.52102 14952.10239 1.02102 298.02102 149.52102000000002 14952.102 2020-01-01 2020-01-02 2020-01-01 00:05:40 2020-01-02 03:34:01 2020-01-01 00:05:40.000 2020-01-02 03:34:01.000 340 99241 49790.5 4979050 340 99241 49790.5 4979050 -32229 32706 5226.02 522602 -124 127 1.06 106 +341 2 10331 99242 1.02402 298.02402 149.52402 14952.4024 1.02402 298.02402 149.52402 14952.40205 1.02402 298.02402 149.52402 14952.402 2020-01-01 2020-01-02 2020-01-01 00:05:41 2020-01-02 03:34:02 2020-01-01 00:05:41.000 2020-01-02 03:34:02.000 341 99242 49791.5 4979150 341 99242 49791.5 4979150 -32228 32707 5227.02 522702 -128 127 -0.5 -50 +342 2 10332 99243 1.02702 298.02702 149.52702 14952.7027 1.02702 298.02704 149.52702 14952.70264 1.02702 298.02702 149.52702 14952.702 2020-01-01 2020-01-02 2020-01-01 00:05:42 2020-01-02 03:34:03 2020-01-01 00:05:42.000 2020-01-02 03:34:03.000 342 99243 49792.5 4979250 342 99243 49792.5 4979250 -32227 32708 5228.02 522802 -128 123 -2.06 -206 +343 2 10333 99244 1.03003 298.03003 149.53003 14953.003 1.03003 298.03003 149.53002 14953.00293 1.03003 298.03003 149.53003 14953.003 2020-01-01 2020-01-02 2020-01-01 00:05:43 2020-01-02 03:34:04 2020-01-01 00:05:43.000 2020-01-02 03:34:04.000 343 99244 49793.5 4979350 343 99244 49793.5 4979350 -32226 32709 5229.02 522902 -127 124 -1.06 -106 +344 2 10334 99245 1.03303 298.03303 149.53303 14953.3033 1.03303 298.03302 149.53303 14953.30323 1.03303 298.03303 149.53303 14953.303 2020-01-01 2020-01-02 2020-01-01 00:05:44 2020-01-02 03:34:05 2020-01-01 00:05:44.000 2020-01-02 03:34:05.000 344 99245 49794.5 4979450 344 99245 49794.5 4979450 -32225 32710 5230.02 523002 -126 125 -0.06 -6 +345 2 10335 99246 1.03603 298.03603 149.53603 14953.6036 1.03603 298.03604 149.53603 14953.60386 1.03603 298.03603 149.53602999999998 14953.603 2020-01-01 2020-01-02 2020-01-01 00:05:45 2020-01-02 03:34:06 2020-01-01 00:05:45.000 2020-01-02 03:34:06.000 345 99246 49795.5 4979550 345 99246 49795.5 4979550 -32224 32711 5231.02 523102 -125 126 0.94 94 +346 2 10336 99247 1.03903 298.03903 149.53903 14953.9039 1.03903 298.03903 149.53903 14953.90352 1.03903 298.03903 149.53903 14953.903 2020-01-01 2020-01-02 2020-01-01 00:05:46 2020-01-02 03:34:07 2020-01-01 00:05:46.000 2020-01-02 03:34:07.000 346 99247 49796.5 4979650 346 99247 49796.5 4979650 -32223 32712 5232.02 523202 -124 127 1.94 194 +347 2 10337 99248 1.04204 298.04204 149.54204 14954.2042 1.04204 298.04205 149.54204 14954.20427 1.04204 298.04204 149.54204 14954.204 2020-01-01 2020-01-02 2020-01-01 00:05:47 2020-01-02 03:34:08 2020-01-01 00:05:47.000 2020-01-02 03:34:08.000 347 99248 49797.5 4979750 347 99248 49797.5 4979750 -32222 32713 5233.02 523302 -128 127 0.38 38 +348 2 10338 99249 1.04504 298.04504 149.54504 14954.5045 1.04504 298.04504 149.54504 14954.50441 1.04504 298.04504 149.54504 14954.504 2020-01-01 2020-01-02 2020-01-01 00:05:48 2020-01-02 03:34:09 2020-01-01 00:05:48.000 2020-01-02 03:34:09.000 348 99249 49798.5 4979850 348 99249 49798.5 4979850 -32221 32714 5234.02 523402 -128 123 -1.18 -118 +349 2 10339 99250 1.04804 298.04804 149.54804 14954.8048 1.04804 298.04803 149.54804 14954.80474 1.04804 298.04804 149.54804000000001 14954.804 2020-01-01 2020-01-02 2020-01-01 00:05:49 2020-01-02 03:34:10 2020-01-01 00:05:49.000 2020-01-02 03:34:10.000 349 99250 49799.5 4979950 349 99250 49799.5 4979950 -32220 32715 5235.02 523502 -127 124 -0.18 -18 +35 2 10025 99935 0.1051 300.1051 150.1051 15160.61561 0.1051 300.1051 150.1051 15160.61542 0.1051 300.1051 150.10510000000002 15160.6151 2020-01-01 2020-01-02 2020-01-01 00:00:35 2020-01-02 03:45:35 2020-01-01 00:00:35.000 2020-01-02 03:45:35.000 35 99935 49985 5048485 35 99935 49985 5048485 -32534 32401 4564.009900990099 460965 -128 127 -0.900990099009901 -91 +350 2 10340 99251 1.05105 298.05105 149.55105 14955.1051 1.05105 298.05106 149.55105 14955.10532 1.05105 298.05105 149.55105 14955.105 2020-01-01 2020-01-02 2020-01-01 00:05:50 2020-01-02 03:34:11 2020-01-01 00:05:50.000 2020-01-02 03:34:11.000 350 99251 49800.5 4980050 350 99251 49800.5 4980050 -32219 32716 5236.02 523602 -126 125 0.82 82 +351 2 10341 99252 1.05405 298.05405 149.55405 14955.4054 1.05405 298.05405 149.55404 14955.40499 1.05405 298.05405 149.55405000000002 14955.405 2020-01-01 2020-01-02 2020-01-01 00:05:51 2020-01-02 03:34:12 2020-01-01 00:05:51.000 2020-01-02 03:34:12.000 351 99252 49801.5 4980150 351 99252 49801.5 4980150 -32218 32717 5237.02 523702 -125 126 1.82 182 +352 2 10342 99253 1.05705 298.05705 149.55705 14955.7057 1.05705 298.05707 149.55705 14955.70574 1.05705 298.05705 149.55705 14955.705 2020-01-01 2020-01-02 2020-01-01 00:05:52 2020-01-02 03:34:13 2020-01-01 00:05:52.000 2020-01-02 03:34:13.000 352 99253 49802.5 4980250 352 99253 49802.5 4980250 -32217 32718 5238.02 523802 -124 127 2.82 282 +353 2 10343 99254 1.06006 298.06006 149.56006 14956.006 1.06006 298.06006 149.56005 14956.00587 1.06006 298.06006 149.56006 14956.006 2020-01-01 2020-01-02 2020-01-01 00:05:53 2020-01-02 03:34:14 2020-01-01 00:05:53.000 2020-01-02 03:34:14.000 353 99254 49803.5 4980350 353 99254 49803.5 4980350 -32216 32719 5239.02 523902 -128 127 1.26 126 +354 2 10344 99255 1.06306 298.06306 149.56306 14956.3063 1.06306 298.06305 149.56306 14956.3062 1.06306 298.06306 149.56306 14956.306 2020-01-01 2020-01-02 2020-01-01 00:05:54 2020-01-02 03:34:15 2020-01-01 00:05:54.000 2020-01-02 03:34:15.000 354 99255 49804.5 4980450 354 99255 49804.5 4980450 -32215 32720 5240.02 524002 -128 127 -0.3 -30 +355 2 10345 99256 1.06606 298.06606 149.56606 14956.6066 1.06606 298.06607 149.56606 14956.6068 1.06606 298.06606 149.56606 14956.606 2020-01-01 2020-01-02 2020-01-01 00:05:55 2020-01-02 03:34:16 2020-01-01 00:05:55.000 2020-01-02 03:34:16.000 355 99256 49805.5 4980550 355 99256 49805.5 4980550 -32214 32721 5241.02 524102 -128 123 -1.86 -186 +356 2 10346 99257 1.06906 298.06906 149.56906 14956.9069 1.06906 298.06906 149.56907 14956.90709 1.06906 298.06906 149.56906 14956.906 2020-01-01 2020-01-02 2020-01-01 00:05:56 2020-01-02 03:34:17 2020-01-01 00:05:56.000 2020-01-02 03:34:17.000 356 99257 49806.5 4980650 356 99257 49806.5 4980650 -32213 32722 5242.02 524202 -127 124 -0.86 -86 +357 2 10347 99258 1.07207 298.07207 149.57207 14957.2072 1.07207 298.07208 149.57207 14957.20721 1.07207 298.07207 149.57207 14957.207 2020-01-01 2020-01-02 2020-01-01 00:05:57 2020-01-02 03:34:18 2020-01-01 00:05:57.000 2020-01-02 03:34:18.000 357 99258 49807.5 4980750 357 99258 49807.5 4980750 -32212 32723 5243.02 524302 -126 125 0.14 14 +358 2 10348 99259 1.07507 298.07507 149.57507 14957.5075 1.07507 298.07507 149.57507 14957.50734 1.07507 298.07507 149.57506999999998 14957.507 2020-01-01 2020-01-02 2020-01-01 00:05:58 2020-01-02 03:34:19 2020-01-01 00:05:58.000 2020-01-02 03:34:19.000 358 99259 49808.5 4980850 358 99259 49808.5 4980850 -32211 32724 5244.02 524402 -125 126 1.14 114 +359 2 10349 99260 1.07807 298.07807 149.57807 14957.8078 1.07807 298.07806 149.57807 14957.80767 1.07807 298.07807 149.57807 14957.807 2020-01-01 2020-01-02 2020-01-01 00:05:59 2020-01-02 03:34:20 2020-01-01 00:05:59.000 2020-01-02 03:34:20.000 359 99260 49809.5 4980950 359 99260 49809.5 4980950 -32210 32725 5245.02 524502 -124 127 2.14 214 +36 2 10026 99936 0.1081 300.1081 150.1081 15160.91891 0.1081 300.1081 150.1081 15160.91873 0.1081 300.1081 150.1081 15160.9181 2020-01-01 2020-01-02 2020-01-01 00:00:36 2020-01-02 03:45:36 2020-01-01 00:00:36.000 2020-01-02 03:45:36.000 36 99936 49986 5048586 36 99936 49986 5048586 -32533 32402 4565.009900990099 461066 -128 123 -2.4356435643564356 -246 +360 2 10350 99261 1.08108 298.08108 149.58108 14958.1081 1.08108 298.0811 149.58108 14958.10827 1.08108 298.08108 149.58108000000001 14958.108 2020-01-01 2020-01-02 2020-01-01 00:06:00 2020-01-02 03:34:21 2020-01-01 00:06:00.000 2020-01-02 03:34:21.000 360 99261 49810.5 4981050 360 99261 49810.5 4981050 -32209 32726 5246.02 524602 -128 127 0.58 58 +361 2 10351 99262 1.08408 298.08408 149.58408 14958.4084 1.08408 298.08408 149.58408 14958.40856 1.08408 298.08408 149.58408 14958.408 2020-01-01 2020-01-02 2020-01-01 00:06:01 2020-01-02 03:34:22 2020-01-01 00:06:01.000 2020-01-02 03:34:22.000 361 99262 49811.5 4981150 361 99262 49811.5 4981150 -32208 32727 5247.02 524702 -128 123 -0.98 -98 +362 2 10352 99263 1.08708 298.08708 149.58708 14958.7087 1.08708 298.0871 149.58708 14958.70868 1.08708 298.08708 149.58708000000001 14958.708 2020-01-01 2020-01-02 2020-01-01 00:06:02 2020-01-02 03:34:23 2020-01-01 00:06:02.000 2020-01-02 03:34:23.000 362 99263 49812.5 4981250 362 99263 49812.5 4981250 -32207 32728 5248.02 524802 -127 124 0.02 2 +363 2 10353 99264 1.09009 298.09009 149.59009 14959.009 1.09009 298.0901 149.59008 14959.00884 1.09009 298.09009 149.59009 14959.009 2020-01-01 2020-01-02 2020-01-01 00:06:03 2020-01-02 03:34:24 2020-01-01 00:06:03.000 2020-01-02 03:34:24.000 363 99264 49813.5 4981350 363 99264 49813.5 4981350 -32206 32729 5249.02 524902 -126 125 1.02 102 +364 2 10354 99265 1.09309 298.09309 149.59309 14959.3093 1.09309 298.09308 149.59309 14959.30915 1.09309 298.09309 149.59309 14959.309 2020-01-01 2020-01-02 2020-01-01 00:06:04 2020-01-02 03:34:25 2020-01-01 00:06:04.000 2020-01-02 03:34:25.000 364 99265 49814.5 4981450 364 99265 49814.5 4981450 -32205 32730 5250.02 525002 -125 126 2.02 202 +365 2 10355 99266 1.09609 298.09609 149.59609 14959.6096 1.09609 298.0961 149.59609 14959.6099 1.09609 298.09609 149.59609 14959.609 2020-01-01 2020-01-02 2020-01-01 00:06:05 2020-01-02 03:34:26 2020-01-01 00:06:05.000 2020-01-02 03:34:26.000 365 99266 49815.5 4981550 365 99266 49815.5 4981550 -32204 32731 5251.02 525102 -124 127 3.02 302 +366 2 10356 99267 1.09909 298.09909 149.59909 14959.9099 1.09909 298.0991 149.5991 14959.91003 1.09909 298.09909 149.59909 14959.909 2020-01-01 2020-01-02 2020-01-01 00:06:06 2020-01-02 03:34:27 2020-01-01 00:06:06.000 2020-01-02 03:34:27.000 366 99267 49816.5 4981650 366 99267 49816.5 4981650 -32203 32732 5252.02 525202 -128 127 1.46 146 +367 2 10357 99268 1.1021 298.1021 149.6021 14960.21021 1.1021 298.1021 149.6021 14960.21015 1.1021 298.1021 149.60209999999998 14960.21 2020-01-01 2020-01-02 2020-01-01 00:06:07 2020-01-02 03:34:28 2020-01-01 00:06:07.000 2020-01-02 03:34:28.000 367 99268 49817.5 4981750 367 99268 49817.5 4981750 -32202 32733 5253.02 525302 -128 123 -0.1 -10 +368 2 10358 99269 1.1051 298.1051 149.6051 14960.51051 1.1051 298.1051 149.6051 14960.51031 1.1051 298.1051 149.6051 14960.51 2020-01-01 2020-01-02 2020-01-01 00:06:08 2020-01-02 03:34:29 2020-01-01 00:06:08.000 2020-01-02 03:34:29.000 368 99269 49818.5 4981850 368 99269 49818.5 4981850 -32201 32734 5254.02 525402 -127 124 0.9 90 +369 2 10359 99270 1.1081 298.1081 149.6081 14960.81081 1.1081 298.1081 149.6081 14960.81062 1.1081 298.1081 149.6081 14960.81 2020-01-01 2020-01-02 2020-01-01 00:06:09 2020-01-02 03:34:30 2020-01-01 00:06:09.000 2020-01-02 03:34:30.000 369 99270 49819.5 4981950 369 99270 49819.5 4981950 -32200 32735 5255.02 525502 -126 125 1.9 190 37 2 10027 99937 0.11111 300.11111 150.11111 15161.22222 0.11111 300.1111 150.11111 15161.22248 0.11111 300.11111 150.11111 15161.22211 2020-01-01 2020-01-02 2020-01-01 00:00:37 2020-01-02 03:45:37 2020-01-01 00:00:37.000 2020-01-02 03:45:37.000 37 99937 49987 5048687 37 99937 49987 5048687 -32532 32403 4566.009900990099 461167 -127 124 -1.4356435643564356 -145 -370 2 10360 99271 1.11111 298.11111 149.61111 14961.11111 1.11111 298.1111 149.61111 14961.11137 1.11111 298.11111 149.61111 14961.11100 2020-01-01 2020-01-02 2020-01-01 00:06:10 2020-01-02 03:34:31 2020-01-01 00:06:10.000 2020-01-02 03:34:31.000 370 99271 49820.5 4982050 370 99271 49820.5 4982050 -32199 32736 5256.02 525602 -125 126 2.9 290 -371 2 10361 99272 1.11411 298.11411 149.61411 14961.41141 1.11411 298.1141 149.61411 14961.4115 1.11411 298.11411 149.61411 14961.41100 2020-01-01 2020-01-02 2020-01-01 00:06:11 2020-01-02 03:34:32 2020-01-01 00:06:11.000 2020-01-02 03:34:32.000 371 99272 49821.5 4982150 371 99272 49821.5 4982150 -32198 32737 5257.02 525702 -124 127 3.9 390 -372 2 10362 99273 1.11711 298.11711 149.61711 14961.71171 1.11711 298.11713 149.61711 14961.71165 1.11711 298.11711 149.61711 14961.71100 2020-01-01 2020-01-02 2020-01-01 00:06:12 2020-01-02 03:34:33 2020-01-01 00:06:12.000 2020-01-02 03:34:33.000 372 99273 49822.5 4982250 372 99273 49822.5 4982250 -32197 32738 5258.02 525802 -128 127 2.34 234 -373 2 10363 99274 1.12012 298.12012 149.62012 14962.01201 1.12012 298.12012 149.62011 14962.01179 1.12012 298.12012 149.62012000000001 14962.01200 2020-01-01 2020-01-02 2020-01-01 00:06:13 2020-01-02 03:34:34 2020-01-01 00:06:13.000 2020-01-02 03:34:34.000 373 99274 49823.5 4982350 373 99274 49823.5 4982350 -32196 32739 5259.02 525902 -128 123 0.78 78 -374 2 10364 99275 1.12312 298.12312 149.62312 14962.31231 1.12312 298.1231 149.62312 14962.31208 1.12312 298.12312 149.62312 14962.31200 2020-01-01 2020-01-02 2020-01-01 00:06:14 2020-01-02 03:34:35 2020-01-01 00:06:14.000 2020-01-02 03:34:35.000 374 99275 49824.5 4982450 374 99275 49824.5 4982450 -32195 32740 5260.02 526002 -127 124 1.78 178 -375 2 10365 99276 1.12612 298.12612 149.62612 14962.61261 1.12612 298.12613 149.62612 14962.61283 1.12612 298.12612 149.62612 14962.61200 2020-01-01 2020-01-02 2020-01-01 00:06:15 2020-01-02 03:34:36 2020-01-01 00:06:15.000 2020-01-02 03:34:36.000 375 99276 49825.5 4982550 375 99276 49825.5 4982550 -32194 32741 5261.02 526102 -126 125 2.78 278 -376 2 10366 99277 1.12912 298.12912 149.62912 14962.91291 1.12912 298.12912 149.62912 14962.91297 1.12912 298.12912 149.62912 14962.91200 2020-01-01 2020-01-02 2020-01-01 00:06:16 2020-01-02 03:34:37 2020-01-01 00:06:16.000 2020-01-02 03:34:37.000 376 99277 49826.5 4982650 376 99277 49826.5 4982650 -32193 32742 5262.02 526202 -125 126 3.78 378 -377 2 10367 99278 1.13213 298.13213 149.63213 14963.21321 1.13213 298.13214 149.63213 14963.21312 1.13213 298.13213 149.63213 14963.21300 2020-01-01 2020-01-02 2020-01-01 00:06:17 2020-01-02 03:34:38 2020-01-01 00:06:17.000 2020-01-02 03:34:38.000 377 99278 49827.5 4982750 377 99278 49827.5 4982750 -32192 32743 5263.02 526302 -124 127 4.78 478 -378 2 10368 99279 1.13513 298.13513 149.63513 14963.51351 1.13513 298.13513 149.63513 14963.51326 1.13513 298.13513 149.63513 14963.51300 2020-01-01 2020-01-02 2020-01-01 00:06:18 2020-01-02 03:34:39 2020-01-01 00:06:18.000 2020-01-02 03:34:39.000 378 99279 49828.5 4982850 378 99279 49828.5 4982850 -32191 32744 5264.02 526402 -128 127 3.22 322 -379 2 10369 99280 1.13813 298.13813 149.63813 14963.81381 1.13813 298.13815 149.63814 14963.81401 1.13813 298.13813 149.63813 14963.81300 2020-01-01 2020-01-02 2020-01-01 00:06:19 2020-01-02 03:34:40 2020-01-01 00:06:19.000 2020-01-02 03:34:40.000 379 99280 49829.5 4982950 379 99280 49829.5 4982950 -32190 32745 5265.02 526502 -128 127 1.66 166 +370 2 10360 99271 1.11111 298.11111 149.61111 14961.11111 1.11111 298.1111 149.61111 14961.11137 1.11111 298.11111 149.61111 14961.111 2020-01-01 2020-01-02 2020-01-01 00:06:10 2020-01-02 03:34:31 2020-01-01 00:06:10.000 2020-01-02 03:34:31.000 370 99271 49820.5 4982050 370 99271 49820.5 4982050 -32199 32736 5256.02 525602 -125 126 2.9 290 +371 2 10361 99272 1.11411 298.11411 149.61411 14961.41141 1.11411 298.1141 149.61411 14961.4115 1.11411 298.11411 149.61411 14961.411 2020-01-01 2020-01-02 2020-01-01 00:06:11 2020-01-02 03:34:32 2020-01-01 00:06:11.000 2020-01-02 03:34:32.000 371 99272 49821.5 4982150 371 99272 49821.5 4982150 -32198 32737 5257.02 525702 -124 127 3.9 390 +372 2 10362 99273 1.11711 298.11711 149.61711 14961.71171 1.11711 298.11713 149.61711 14961.71165 1.11711 298.11711 149.61711 14961.711 2020-01-01 2020-01-02 2020-01-01 00:06:12 2020-01-02 03:34:33 2020-01-01 00:06:12.000 2020-01-02 03:34:33.000 372 99273 49822.5 4982250 372 99273 49822.5 4982250 -32197 32738 5258.02 525802 -128 127 2.34 234 +373 2 10363 99274 1.12012 298.12012 149.62012 14962.01201 1.12012 298.12012 149.62011 14962.01179 1.12012 298.12012 149.62012000000001 14962.012 2020-01-01 2020-01-02 2020-01-01 00:06:13 2020-01-02 03:34:34 2020-01-01 00:06:13.000 2020-01-02 03:34:34.000 373 99274 49823.5 4982350 373 99274 49823.5 4982350 -32196 32739 5259.02 525902 -128 123 0.78 78 +374 2 10364 99275 1.12312 298.12312 149.62312 14962.31231 1.12312 298.1231 149.62312 14962.31208 1.12312 298.12312 149.62312 14962.312 2020-01-01 2020-01-02 2020-01-01 00:06:14 2020-01-02 03:34:35 2020-01-01 00:06:14.000 2020-01-02 03:34:35.000 374 99275 49824.5 4982450 374 99275 49824.5 4982450 -32195 32740 5260.02 526002 -127 124 1.78 178 +375 2 10365 99276 1.12612 298.12612 149.62612 14962.61261 1.12612 298.12613 149.62612 14962.61283 1.12612 298.12612 149.62612 14962.612 2020-01-01 2020-01-02 2020-01-01 00:06:15 2020-01-02 03:34:36 2020-01-01 00:06:15.000 2020-01-02 03:34:36.000 375 99276 49825.5 4982550 375 99276 49825.5 4982550 -32194 32741 5261.02 526102 -126 125 2.78 278 +376 2 10366 99277 1.12912 298.12912 149.62912 14962.91291 1.12912 298.12912 149.62912 14962.91297 1.12912 298.12912 149.62912 14962.912 2020-01-01 2020-01-02 2020-01-01 00:06:16 2020-01-02 03:34:37 2020-01-01 00:06:16.000 2020-01-02 03:34:37.000 376 99277 49826.5 4982650 376 99277 49826.5 4982650 -32193 32742 5262.02 526202 -125 126 3.78 378 +377 2 10367 99278 1.13213 298.13213 149.63213 14963.21321 1.13213 298.13214 149.63213 14963.21312 1.13213 298.13213 149.63213 14963.213 2020-01-01 2020-01-02 2020-01-01 00:06:17 2020-01-02 03:34:38 2020-01-01 00:06:17.000 2020-01-02 03:34:38.000 377 99278 49827.5 4982750 377 99278 49827.5 4982750 -32192 32743 5263.02 526302 -124 127 4.78 478 +378 2 10368 99279 1.13513 298.13513 149.63513 14963.51351 1.13513 298.13513 149.63513 14963.51326 1.13513 298.13513 149.63513 14963.513 2020-01-01 2020-01-02 2020-01-01 00:06:18 2020-01-02 03:34:39 2020-01-01 00:06:18.000 2020-01-02 03:34:39.000 378 99279 49828.5 4982850 378 99279 49828.5 4982850 -32191 32744 5264.02 526402 -128 127 3.22 322 +379 2 10369 99280 1.13813 298.13813 149.63813 14963.81381 1.13813 298.13815 149.63814 14963.81401 1.13813 298.13813 149.63813 14963.813 2020-01-01 2020-01-02 2020-01-01 00:06:19 2020-01-02 03:34:40 2020-01-01 00:06:19.000 2020-01-02 03:34:40.000 379 99280 49829.5 4982950 379 99280 49829.5 4982950 -32190 32745 5265.02 526502 -128 127 1.66 166 38 2 10028 99938 0.11411 300.11411 150.11411 15161.52552 0.11411 300.1141 150.11411 15161.52562 0.11411 300.11411 150.11411 15161.52511 2020-01-01 2020-01-02 2020-01-01 00:00:38 2020-01-02 03:45:38 2020-01-01 00:00:38.000 2020-01-02 03:45:38.000 38 99938 49988 5048788 38 99938 49988 5048788 -32531 32404 4567.009900990099 461268 -126 125 -0.43564356435643564 -44 -380 2 10370 99281 1.14114 298.14114 149.64114 14964.11411 1.14114 298.14114 149.64114 14964.11431 1.14114 298.14114 149.64114 14964.11400 2020-01-01 2020-01-02 2020-01-01 00:06:20 2020-01-02 03:34:41 2020-01-01 00:06:20.000 2020-01-02 03:34:41.000 380 99281 49830.5 4983050 380 99281 49830.5 4983050 -32189 32746 5266.02 526602 -128 124 0.1 10 -381 2 10371 99282 1.14414 298.14414 149.64414 14964.41441 1.14414 298.14413 149.64414 14964.41448 1.14414 298.14414 149.64414 14964.41400 2020-01-01 2020-01-02 2020-01-01 00:06:21 2020-01-02 03:34:42 2020-01-01 00:06:21.000 2020-01-02 03:34:42.000 381 99282 49831.5 4983150 381 99282 49831.5 4983150 -32188 32747 5267.02 526702 -127 125 1.1 110 -382 2 10372 99283 1.14714 298.14714 149.64714 14964.71471 1.14714 298.14716 149.64714 14964.71459 1.14714 298.14714 149.64714 14964.71400 2020-01-01 2020-01-02 2020-01-01 00:06:22 2020-01-02 03:34:43 2020-01-01 00:06:22.000 2020-01-02 03:34:43.000 382 99283 49832.5 4983250 382 99283 49832.5 4983250 -32187 32748 5268.02 526802 -126 126 2.1 210 -383 2 10373 99284 1.15015 298.15015 149.65015 14965.01501 1.15015 298.15015 149.65014 14965.01472 1.15015 298.15015 149.65015 14965.01500 2020-01-01 2020-01-02 2020-01-01 00:06:23 2020-01-02 03:34:44 2020-01-01 00:06:23.000 2020-01-02 03:34:44.000 383 99284 49833.5 4983350 383 99284 49833.5 4983350 -32186 32749 5269.02 526902 -125 127 3.1 310 -384 2 10374 99285 1.15315 298.15315 149.65315 14965.31531 1.15315 298.15317 149.65315 14965.31547 1.15315 298.15315 149.65315 14965.31500 2020-01-01 2020-01-02 2020-01-01 00:06:24 2020-01-02 03:34:45 2020-01-01 00:06:24.000 2020-01-02 03:34:45.000 384 99285 49834.5 4983450 384 99285 49834.5 4983450 -32185 32750 5270.02 527002 -128 127 1.54 154 -385 2 10375 99286 1.15615 298.15615 149.65615 14965.61561 1.15615 298.15616 149.65615 14965.61578 1.15615 298.15615 149.65615 14965.61500 2020-01-01 2020-01-02 2020-01-01 00:06:25 2020-01-02 03:34:46 2020-01-01 00:06:25.000 2020-01-02 03:34:46.000 385 99286 49835.5 4983550 385 99286 49835.5 4983550 -32184 32751 5271.02 527102 -128 127 -0.02 -2 -386 2 10376 99287 1.15915 298.15915 149.65915 14965.91591 1.15915 298.15915 149.65915 14965.91594 1.15915 298.15915 149.65915 14965.91500 2020-01-01 2020-01-02 2020-01-01 00:06:26 2020-01-02 03:34:47 2020-01-01 00:06:26.000 2020-01-02 03:34:47.000 386 99287 49836.5 4983650 386 99287 49836.5 4983650 -32183 32752 5272.02 527202 -128 123 -1.58 -158 -387 2 10377 99288 1.16216 298.16216 149.66216 14966.21621 1.16216 298.16217 149.66216 14966.21606 1.16216 298.16216 149.66216 14966.21600 2020-01-01 2020-01-02 2020-01-01 00:06:27 2020-01-02 03:34:48 2020-01-01 00:06:27.000 2020-01-02 03:34:48.000 387 99288 49837.5 4983750 387 99288 49837.5 4983750 -32182 32753 5273.02 527302 -127 124 -0.58 -58 -388 2 10378 99289 1.16516 298.16516 149.66516 14966.51651 1.16516 298.16516 149.66516 14966.51636 1.16516 298.16516 149.66516 14966.51600 2020-01-01 2020-01-02 2020-01-01 00:06:28 2020-01-02 03:34:49 2020-01-01 00:06:28.000 2020-01-02 03:34:49.000 388 99289 49838.5 4983850 388 99289 49838.5 4983850 -32181 32754 5274.02 527402 -126 125 0.42 42 -389 2 10379 99290 1.16816 298.16816 149.66816 14966.81681 1.16816 298.16818 149.66816 14966.81695 1.16816 298.16816 149.66816 14966.81600 2020-01-01 2020-01-02 2020-01-01 00:06:29 2020-01-02 03:34:50 2020-01-01 00:06:29.000 2020-01-02 03:34:50.000 389 99290 49839.5 4983950 389 99290 49839.5 4983950 -32180 32755 5275.02 527502 -125 126 1.42 142 +380 2 10370 99281 1.14114 298.14114 149.64114 14964.11411 1.14114 298.14114 149.64114 14964.11431 1.14114 298.14114 149.64114 14964.114 2020-01-01 2020-01-02 2020-01-01 00:06:20 2020-01-02 03:34:41 2020-01-01 00:06:20.000 2020-01-02 03:34:41.000 380 99281 49830.5 4983050 380 99281 49830.5 4983050 -32189 32746 5266.02 526602 -128 124 0.1 10 +381 2 10371 99282 1.14414 298.14414 149.64414 14964.41441 1.14414 298.14413 149.64414 14964.41448 1.14414 298.14414 149.64414 14964.414 2020-01-01 2020-01-02 2020-01-01 00:06:21 2020-01-02 03:34:42 2020-01-01 00:06:21.000 2020-01-02 03:34:42.000 381 99282 49831.5 4983150 381 99282 49831.5 4983150 -32188 32747 5267.02 526702 -127 125 1.1 110 +382 2 10372 99283 1.14714 298.14714 149.64714 14964.71471 1.14714 298.14716 149.64714 14964.71459 1.14714 298.14714 149.64714 14964.714 2020-01-01 2020-01-02 2020-01-01 00:06:22 2020-01-02 03:34:43 2020-01-01 00:06:22.000 2020-01-02 03:34:43.000 382 99283 49832.5 4983250 382 99283 49832.5 4983250 -32187 32748 5268.02 526802 -126 126 2.1 210 +383 2 10373 99284 1.15015 298.15015 149.65015 14965.01501 1.15015 298.15015 149.65014 14965.01472 1.15015 298.15015 149.65015 14965.015 2020-01-01 2020-01-02 2020-01-01 00:06:23 2020-01-02 03:34:44 2020-01-01 00:06:23.000 2020-01-02 03:34:44.000 383 99284 49833.5 4983350 383 99284 49833.5 4983350 -32186 32749 5269.02 526902 -125 127 3.1 310 +384 2 10374 99285 1.15315 298.15315 149.65315 14965.31531 1.15315 298.15317 149.65315 14965.31547 1.15315 298.15315 149.65315 14965.315 2020-01-01 2020-01-02 2020-01-01 00:06:24 2020-01-02 03:34:45 2020-01-01 00:06:24.000 2020-01-02 03:34:45.000 384 99285 49834.5 4983450 384 99285 49834.5 4983450 -32185 32750 5270.02 527002 -128 127 1.54 154 +385 2 10375 99286 1.15615 298.15615 149.65615 14965.61561 1.15615 298.15616 149.65615 14965.61578 1.15615 298.15615 149.65615 14965.615 2020-01-01 2020-01-02 2020-01-01 00:06:25 2020-01-02 03:34:46 2020-01-01 00:06:25.000 2020-01-02 03:34:46.000 385 99286 49835.5 4983550 385 99286 49835.5 4983550 -32184 32751 5271.02 527102 -128 127 -0.02 -2 +386 2 10376 99287 1.15915 298.15915 149.65915 14965.91591 1.15915 298.15915 149.65915 14965.91594 1.15915 298.15915 149.65915 14965.915 2020-01-01 2020-01-02 2020-01-01 00:06:26 2020-01-02 03:34:47 2020-01-01 00:06:26.000 2020-01-02 03:34:47.000 386 99287 49836.5 4983650 386 99287 49836.5 4983650 -32183 32752 5272.02 527202 -128 123 -1.58 -158 +387 2 10377 99288 1.16216 298.16216 149.66216 14966.21621 1.16216 298.16217 149.66216 14966.21606 1.16216 298.16216 149.66216 14966.216 2020-01-01 2020-01-02 2020-01-01 00:06:27 2020-01-02 03:34:48 2020-01-01 00:06:27.000 2020-01-02 03:34:48.000 387 99288 49837.5 4983750 387 99288 49837.5 4983750 -32182 32753 5273.02 527302 -127 124 -0.58 -58 +388 2 10378 99289 1.16516 298.16516 149.66516 14966.51651 1.16516 298.16516 149.66516 14966.51636 1.16516 298.16516 149.66516 14966.516 2020-01-01 2020-01-02 2020-01-01 00:06:28 2020-01-02 03:34:49 2020-01-01 00:06:28.000 2020-01-02 03:34:49.000 388 99289 49838.5 4983850 388 99289 49838.5 4983850 -32181 32754 5274.02 527402 -126 125 0.42 42 +389 2 10379 99290 1.16816 298.16816 149.66816 14966.81681 1.16816 298.16818 149.66816 14966.81695 1.16816 298.16816 149.66816 14966.816 2020-01-01 2020-01-02 2020-01-01 00:06:29 2020-01-02 03:34:50 2020-01-01 00:06:29.000 2020-01-02 03:34:50.000 389 99290 49839.5 4983950 389 99290 49839.5 4983950 -32180 32755 5275.02 527502 -125 126 1.42 142 39 2 10029 99939 0.11711 300.11711 150.11711 15161.82882 0.11711 300.11713 150.11711 15161.82876 0.11711 300.11711 150.11711 15161.82811 2020-01-01 2020-01-02 2020-01-01 00:00:39 2020-01-02 03:45:39 2020-01-01 00:00:39.000 2020-01-02 03:45:39.000 39 99939 49989 5048889 39 99939 49989 5048889 -32530 32405 4568.009900990099 461369 -125 126 0.5643564356435643 57 -390 2 10380 99291 1.17117 298.17117 149.67117 14967.11711 1.17117 298.17117 149.67117 14967.11725 1.17117 298.17117 149.67117 14967.11700 2020-01-01 2020-01-02 2020-01-01 00:06:30 2020-01-02 03:34:51 2020-01-01 00:06:30.000 2020-01-02 03:34:51.000 390 99291 49840.5 4984050 390 99291 49840.5 4984050 -32179 32756 5276.02 527602 -124 127 2.42 242 -391 2 10381 99292 1.17417 298.17417 149.67417 14967.41741 1.17417 298.17416 149.67417 14967.41741 1.17417 298.17417 149.67417 14967.41700 2020-01-01 2020-01-02 2020-01-01 00:06:31 2020-01-02 03:34:52 2020-01-01 00:06:31.000 2020-01-02 03:34:52.000 391 99292 49841.5 4984150 391 99292 49841.5 4984150 -32178 32757 5277.02 527702 -128 127 0.86 86 -392 2 10382 99293 1.17717 298.17717 149.67717 14967.71771 1.17717 298.1772 149.67717 14967.71753 1.17717 298.17717 149.67717000000002 14967.71700 2020-01-01 2020-01-02 2020-01-01 00:06:32 2020-01-02 03:34:53 2020-01-01 00:06:32.000 2020-01-02 03:34:53.000 392 99293 49842.5 4984250 392 99293 49842.5 4984250 -32177 32758 5278.02 527802 -128 123 -0.7 -70 -393 2 10383 99294 1.18018 298.18018 149.68018 14968.01801 1.18018 298.18018 149.68017 14968.01782 1.18018 298.18018 149.68018 14968.01800 2020-01-01 2020-01-02 2020-01-01 00:06:33 2020-01-02 03:34:54 2020-01-01 00:06:33.000 2020-01-02 03:34:54.000 393 99294 49843.5 4984350 393 99294 49843.5 4984350 -32176 32759 5279.02 527902 -127 124 0.3 30 -394 2 10384 99295 1.18318 298.18318 149.68318 14968.31831 1.18318 298.1832 149.68318 14968.31842 1.18318 298.18318 149.68318 14968.31800 2020-01-01 2020-01-02 2020-01-01 00:06:34 2020-01-02 03:34:55 2020-01-01 00:06:34.000 2020-01-02 03:34:55.000 394 99295 49844.5 4984450 394 99295 49844.5 4984450 -32175 32760 5280.02 528002 -126 125 1.3 130 -395 2 10385 99296 1.18618 298.18618 149.68618 14968.61861 1.18618 298.1862 149.68618 14968.61875 1.18618 298.18618 149.68618 14968.61800 2020-01-01 2020-01-02 2020-01-01 00:06:35 2020-01-02 03:34:56 2020-01-01 00:06:35.000 2020-01-02 03:34:56.000 395 99296 49845.5 4984550 395 99296 49845.5 4984550 -32174 32761 5281.02 528102 -125 126 2.3 230 -396 2 10386 99297 1.18918 298.18918 149.68918 14968.91891 1.18918 298.18918 149.68918 14968.91889 1.18918 298.18918 149.68918 14968.91800 2020-01-01 2020-01-02 2020-01-01 00:06:36 2020-01-02 03:34:57 2020-01-01 00:06:36.000 2020-01-02 03:34:57.000 396 99297 49846.5 4984650 396 99297 49846.5 4984650 -32173 32762 5282.02 528202 -124 127 3.3 330 -397 2 10387 99298 1.19219 298.19219 149.69219 14969.21921 1.19219 298.1922 149.69219 14969.21964 1.19219 298.19219 149.69218999999998 14969.21900 2020-01-01 2020-01-02 2020-01-01 00:06:37 2020-01-02 03:34:58 2020-01-01 00:06:37.000 2020-01-02 03:34:58.000 397 99298 49847.5 4984750 397 99298 49847.5 4984750 -32172 32763 5283.02 528302 -128 127 1.74 174 -398 2 10388 99299 1.19519 298.19519 149.69519 14969.51951 1.19519 298.1952 149.69519 14969.51929 1.19519 298.19519 149.69519 14969.51900 2020-01-01 2020-01-02 2020-01-01 00:06:38 2020-01-02 03:34:59 2020-01-01 00:06:38.000 2020-01-02 03:34:59.000 398 99299 49848.5 4984850 398 99299 49848.5 4984850 -32171 32764 5284.02 528402 -128 123 0.18 18 -399 2 10389 99300 1.19819 298.19819 149.69819 14969.81981 1.19819 298.1982 149.69819 14969.81989 1.19819 298.19819 149.69818999999998 14969.81900 2020-01-01 2020-01-02 2020-01-01 00:06:39 2020-01-02 03:35:00 2020-01-01 00:06:39.000 2020-01-02 03:35:00.000 399 99300 49849.5 4984950 399 99300 49849.5 4984950 -32170 32765 5285.02 528502 -127 124 1.18 118 +390 2 10380 99291 1.17117 298.17117 149.67117 14967.11711 1.17117 298.17117 149.67117 14967.11725 1.17117 298.17117 149.67117 14967.117 2020-01-01 2020-01-02 2020-01-01 00:06:30 2020-01-02 03:34:51 2020-01-01 00:06:30.000 2020-01-02 03:34:51.000 390 99291 49840.5 4984050 390 99291 49840.5 4984050 -32179 32756 5276.02 527602 -124 127 2.42 242 +391 2 10381 99292 1.17417 298.17417 149.67417 14967.41741 1.17417 298.17416 149.67417 14967.41741 1.17417 298.17417 149.67417 14967.417 2020-01-01 2020-01-02 2020-01-01 00:06:31 2020-01-02 03:34:52 2020-01-01 00:06:31.000 2020-01-02 03:34:52.000 391 99292 49841.5 4984150 391 99292 49841.5 4984150 -32178 32757 5277.02 527702 -128 127 0.86 86 +392 2 10382 99293 1.17717 298.17717 149.67717 14967.71771 1.17717 298.1772 149.67717 14967.71753 1.17717 298.17717 149.67717000000002 14967.717 2020-01-01 2020-01-02 2020-01-01 00:06:32 2020-01-02 03:34:53 2020-01-01 00:06:32.000 2020-01-02 03:34:53.000 392 99293 49842.5 4984250 392 99293 49842.5 4984250 -32177 32758 5278.02 527802 -128 123 -0.7 -70 +393 2 10383 99294 1.18018 298.18018 149.68018 14968.01801 1.18018 298.18018 149.68017 14968.01782 1.18018 298.18018 149.68018 14968.018 2020-01-01 2020-01-02 2020-01-01 00:06:33 2020-01-02 03:34:54 2020-01-01 00:06:33.000 2020-01-02 03:34:54.000 393 99294 49843.5 4984350 393 99294 49843.5 4984350 -32176 32759 5279.02 527902 -127 124 0.3 30 +394 2 10384 99295 1.18318 298.18318 149.68318 14968.31831 1.18318 298.1832 149.68318 14968.31842 1.18318 298.18318 149.68318 14968.318 2020-01-01 2020-01-02 2020-01-01 00:06:34 2020-01-02 03:34:55 2020-01-01 00:06:34.000 2020-01-02 03:34:55.000 394 99295 49844.5 4984450 394 99295 49844.5 4984450 -32175 32760 5280.02 528002 -126 125 1.3 130 +395 2 10385 99296 1.18618 298.18618 149.68618 14968.61861 1.18618 298.1862 149.68618 14968.61875 1.18618 298.18618 149.68618 14968.618 2020-01-01 2020-01-02 2020-01-01 00:06:35 2020-01-02 03:34:56 2020-01-01 00:06:35.000 2020-01-02 03:34:56.000 395 99296 49845.5 4984550 395 99296 49845.5 4984550 -32174 32761 5281.02 528102 -125 126 2.3 230 +396 2 10386 99297 1.18918 298.18918 149.68918 14968.91891 1.18918 298.18918 149.68918 14968.91889 1.18918 298.18918 149.68918 14968.918 2020-01-01 2020-01-02 2020-01-01 00:06:36 2020-01-02 03:34:57 2020-01-01 00:06:36.000 2020-01-02 03:34:57.000 396 99297 49846.5 4984650 396 99297 49846.5 4984650 -32173 32762 5282.02 528202 -124 127 3.3 330 +397 2 10387 99298 1.19219 298.19219 149.69219 14969.21921 1.19219 298.1922 149.69219 14969.21964 1.19219 298.19219 149.69218999999998 14969.219 2020-01-01 2020-01-02 2020-01-01 00:06:37 2020-01-02 03:34:58 2020-01-01 00:06:37.000 2020-01-02 03:34:58.000 397 99298 49847.5 4984750 397 99298 49847.5 4984750 -32172 32763 5283.02 528302 -128 127 1.74 174 +398 2 10388 99299 1.19519 298.19519 149.69519 14969.51951 1.19519 298.1952 149.69519 14969.51929 1.19519 298.19519 149.69519 14969.519 2020-01-01 2020-01-02 2020-01-01 00:06:38 2020-01-02 03:34:59 2020-01-01 00:06:38.000 2020-01-02 03:34:59.000 398 99299 49848.5 4984850 398 99299 49848.5 4984850 -32171 32764 5284.02 528402 -128 123 0.18 18 +399 2 10389 99300 1.19819 298.19819 149.69819 14969.81981 1.19819 298.1982 149.69819 14969.81989 1.19819 298.19819 149.69818999999998 14969.819 2020-01-01 2020-01-02 2020-01-01 00:06:39 2020-01-02 03:35:00 2020-01-01 00:06:39.000 2020-01-02 03:35:00.000 399 99300 49849.5 4984950 399 99300 49849.5 4984950 -32170 32765 5285.02 528502 -127 124 1.18 118 4 2 1003 9994 0.01201 300.01201 150.01201 15151.21321 0.01201 300.01202 150.01201 15151.21318 0.01201 300.01201 150.01201 15151.21301 2020-01-01 2020-01-02 2020-01-01 00:00:04 2020-01-02 03:45:04 2020-01-01 00:00:04.000 2020-01-02 03:45:04.000 4 99904 49954 5045354 4 99904 49954 5045354 -32565 32370 4533.009900990099 457834 -128 127 -1.4851485148514851 -150 40 2 10030 99940 0.12012 300.12012 150.12012 15162.13213 0.12012 300.12012 150.12011 15162.13191 0.12012 300.12012 150.12012000000001 15162.13212 2020-01-01 2020-01-02 2020-01-01 00:00:40 2020-01-02 03:45:40 2020-01-01 00:00:40.000 2020-01-02 03:45:40.000 40 99940 49990 5048990 40 99940 49990 5048990 -32529 32406 4569.009900990099 461470 -124 127 1.5643564356435644 158 -400 2 10390 99301 1.2012 298.2012 149.7012 14970.12012 1.2012 298.2012 149.7012 14970.12022 1.20120 298.20120 149.7012 14970.12000 2020-01-01 2020-01-02 2020-01-01 00:06:40 2020-01-02 03:35:01 2020-01-01 00:06:40.000 2020-01-02 03:35:01.000 400 99301 49850.5 4985050 400 99301 49850.5 4985050 -32169 32766 5286.02 528602 -126 125 2.18 218 -401 2 10391 99302 1.2042 298.2042 149.7042 14970.42042 1.2042 298.2042 149.7042 14970.42035 1.20420 298.20420 149.70420000000001 14970.42000 2020-01-01 2020-01-02 2020-01-01 00:06:41 2020-01-02 03:35:02 2020-01-01 00:06:41.000 2020-01-02 03:35:02.000 401 99302 49851.5 4985150 401 99302 49851.5 4985150 -32168 32767 5287.02 528702 -125 126 3.18 318 -402 2 10392 99303 1.2072 298.2072 149.7072 14970.72072 1.2072 298.2072 149.70721 14970.72111 1.20720 298.20720 149.7072 14970.72000 2020-01-01 2020-01-02 2020-01-01 00:06:42 2020-01-02 03:35:03 2020-01-01 00:06:42.000 2020-01-02 03:35:03.000 402 99303 49852.5 4985250 402 99303 49852.5 4985250 -32768 32370 4632.66 463266 -124 127 4.18 418 -403 2 10393 99304 1.21021 298.21021 149.71021 14971.02102 1.21021 298.2102 149.7102 14971.02077 1.21021 298.21021 149.71021000000002 14971.02100 2020-01-01 2020-01-02 2020-01-01 00:06:43 2020-01-02 03:35:04 2020-01-01 00:06:43.000 2020-01-02 03:35:04.000 403 99304 49853.5 4985350 403 99304 49853.5 4985350 -32767 32371 4633.66 463366 -128 127 2.62 262 -404 2 10394 99305 1.21321 298.21321 149.71321 14971.32132 1.21321 298.21323 149.71321 14971.32139 1.21321 298.21321 149.71321 14971.32100 2020-01-01 2020-01-02 2020-01-01 00:06:44 2020-01-02 03:35:05 2020-01-01 00:06:44.000 2020-01-02 03:35:05.000 404 99305 49854.5 4985450 404 99305 49854.5 4985450 -32766 32372 4634.66 463466 -128 127 1.06 106 -405 2 10395 99306 1.21621 298.21621 149.71621 14971.62162 1.21621 298.21622 149.71621 14971.62169 1.21621 298.21621 149.71621 14971.62100 2020-01-01 2020-01-02 2020-01-01 00:06:45 2020-01-02 03:35:06 2020-01-01 00:06:45.000 2020-01-02 03:35:06.000 405 99306 49855.5 4985550 405 99306 49855.5 4985550 -32765 32373 4635.66 463566 -128 124 -0.5 -50 -406 2 10396 99307 1.21921 298.21921 149.71921 14971.92192 1.21921 298.2192 149.71921 14971.92199 1.21921 298.21921 149.71921 14971.92100 2020-01-01 2020-01-02 2020-01-01 00:06:46 2020-01-02 03:35:07 2020-01-01 00:06:46.000 2020-01-02 03:35:07.000 406 99307 49856.5 4985650 406 99307 49856.5 4985650 -32764 32374 4636.66 463666 -127 125 0.5 50 -407 2 10397 99308 1.22222 298.22222 149.72222 14972.22222 1.22222 298.22223 149.72222 14972.22257 1.22222 298.22222 149.72222 14972.22200 2020-01-01 2020-01-02 2020-01-01 00:06:47 2020-01-02 03:35:08 2020-01-01 00:06:47.000 2020-01-02 03:35:08.000 407 99308 49857.5 4985750 407 99308 49857.5 4985750 -32763 32375 4637.66 463766 -126 126 1.5 150 -408 2 10398 99309 1.22522 298.22522 149.72522 14972.52252 1.22522 298.22522 149.72522 14972.52224 1.22522 298.22522 149.72522 14972.52200 2020-01-01 2020-01-02 2020-01-01 00:06:48 2020-01-02 03:35:09 2020-01-01 00:06:48.000 2020-01-02 03:35:09.000 408 99309 49858.5 4985850 408 99309 49858.5 4985850 -32762 32376 4638.66 463866 -125 127 2.5 250 -409 2 10399 99310 1.22822 298.22822 149.72822 14972.82282 1.22822 298.22824 149.72822 14972.82286 1.22822 298.22822 149.72822 14972.82200 2020-01-01 2020-01-02 2020-01-01 00:06:49 2020-01-02 03:35:10 2020-01-01 00:06:49.000 2020-01-02 03:35:10.000 409 99310 49859.5 4985950 409 99310 49859.5 4985950 -32761 32377 4639.66 463966 -128 127 0.94 94 +400 2 10390 99301 1.2012 298.2012 149.7012 14970.12012 1.2012 298.2012 149.7012 14970.12022 1.2012 298.2012 149.7012 14970.12 2020-01-01 2020-01-02 2020-01-01 00:06:40 2020-01-02 03:35:01 2020-01-01 00:06:40.000 2020-01-02 03:35:01.000 400 99301 49850.5 4985050 400 99301 49850.5 4985050 -32169 32766 5286.02 528602 -126 125 2.18 218 +401 2 10391 99302 1.2042 298.2042 149.7042 14970.42042 1.2042 298.2042 149.7042 14970.42035 1.2042 298.2042 149.70420000000001 14970.42 2020-01-01 2020-01-02 2020-01-01 00:06:41 2020-01-02 03:35:02 2020-01-01 00:06:41.000 2020-01-02 03:35:02.000 401 99302 49851.5 4985150 401 99302 49851.5 4985150 -32168 32767 5287.02 528702 -125 126 3.18 318 +402 2 10392 99303 1.2072 298.2072 149.7072 14970.72072 1.2072 298.2072 149.70721 14970.72111 1.2072 298.2072 149.7072 14970.72 2020-01-01 2020-01-02 2020-01-01 00:06:42 2020-01-02 03:35:03 2020-01-01 00:06:42.000 2020-01-02 03:35:03.000 402 99303 49852.5 4985250 402 99303 49852.5 4985250 -32768 32370 4632.66 463266 -124 127 4.18 418 +403 2 10393 99304 1.21021 298.21021 149.71021 14971.02102 1.21021 298.2102 149.7102 14971.02077 1.21021 298.21021 149.71021000000002 14971.021 2020-01-01 2020-01-02 2020-01-01 00:06:43 2020-01-02 03:35:04 2020-01-01 00:06:43.000 2020-01-02 03:35:04.000 403 99304 49853.5 4985350 403 99304 49853.5 4985350 -32767 32371 4633.66 463366 -128 127 2.62 262 +404 2 10394 99305 1.21321 298.21321 149.71321 14971.32132 1.21321 298.21323 149.71321 14971.32139 1.21321 298.21321 149.71321 14971.321 2020-01-01 2020-01-02 2020-01-01 00:06:44 2020-01-02 03:35:05 2020-01-01 00:06:44.000 2020-01-02 03:35:05.000 404 99305 49854.5 4985450 404 99305 49854.5 4985450 -32766 32372 4634.66 463466 -128 127 1.06 106 +405 2 10395 99306 1.21621 298.21621 149.71621 14971.62162 1.21621 298.21622 149.71621 14971.62169 1.21621 298.21621 149.71621 14971.621 2020-01-01 2020-01-02 2020-01-01 00:06:45 2020-01-02 03:35:06 2020-01-01 00:06:45.000 2020-01-02 03:35:06.000 405 99306 49855.5 4985550 405 99306 49855.5 4985550 -32765 32373 4635.66 463566 -128 124 -0.5 -50 +406 2 10396 99307 1.21921 298.21921 149.71921 14971.92192 1.21921 298.2192 149.71921 14971.92199 1.21921 298.21921 149.71921 14971.921 2020-01-01 2020-01-02 2020-01-01 00:06:46 2020-01-02 03:35:07 2020-01-01 00:06:46.000 2020-01-02 03:35:07.000 406 99307 49856.5 4985650 406 99307 49856.5 4985650 -32764 32374 4636.66 463666 -127 125 0.5 50 +407 2 10397 99308 1.22222 298.22222 149.72222 14972.22222 1.22222 298.22223 149.72222 14972.22257 1.22222 298.22222 149.72222 14972.222 2020-01-01 2020-01-02 2020-01-01 00:06:47 2020-01-02 03:35:08 2020-01-01 00:06:47.000 2020-01-02 03:35:08.000 407 99308 49857.5 4985750 407 99308 49857.5 4985750 -32763 32375 4637.66 463766 -126 126 1.5 150 +408 2 10398 99309 1.22522 298.22522 149.72522 14972.52252 1.22522 298.22522 149.72522 14972.52224 1.22522 298.22522 149.72522 14972.522 2020-01-01 2020-01-02 2020-01-01 00:06:48 2020-01-02 03:35:09 2020-01-01 00:06:48.000 2020-01-02 03:35:09.000 408 99309 49858.5 4985850 408 99309 49858.5 4985850 -32762 32376 4638.66 463866 -125 127 2.5 250 +409 2 10399 99310 1.22822 298.22822 149.72822 14972.82282 1.22822 298.22824 149.72822 14972.82286 1.22822 298.22822 149.72822 14972.822 2020-01-01 2020-01-02 2020-01-01 00:06:49 2020-01-02 03:35:10 2020-01-01 00:06:49.000 2020-01-02 03:35:10.000 409 99310 49859.5 4985950 409 99310 49859.5 4985950 -32761 32377 4639.66 463966 -128 127 0.94 94 41 2 10031 99941 0.12312 300.12312 150.12312 15162.43543 0.12312 300.1231 150.12312 15162.43521 0.12312 300.12312 150.12312 15162.43512 2020-01-01 2020-01-02 2020-01-01 00:00:41 2020-01-02 03:45:41 2020-01-01 00:00:41.000 2020-01-02 03:45:41.000 41 99941 49991 5049091 41 99941 49991 5049091 -32528 32407 4570.009900990099 461571 -128 127 0.0297029702970297 3 -410 2 10400 99311 1.23123 298.23123 149.73123 14973.12312 1.23123 298.23123 149.73123 14973.12316 1.23123 298.23123 149.73122999999998 14973.12300 2020-01-01 2020-01-02 2020-01-01 00:06:50 2020-01-02 03:35:11 2020-01-01 00:06:50.000 2020-01-02 03:35:11.000 410 99311 49860.5 4986050 410 99311 49860.5 4986050 -32760 32378 4640.66 464066 -128 127 -0.62 -62 -411 2 10401 99312 1.23423 298.23423 149.73423 14973.42342 1.23423 298.23422 149.73423 14973.42345 1.23423 298.23423 149.73423 14973.42300 2020-01-01 2020-01-02 2020-01-01 00:06:51 2020-01-02 03:35:12 2020-01-01 00:06:51.000 2020-01-02 03:35:12.000 411 99312 49861.5 4986150 411 99312 49861.5 4986150 -32759 32379 4641.66 464166 -128 123 -2.18 -218 -412 2 10402 99313 1.23723 298.23723 149.73723 14973.72372 1.23723 298.23724 149.73724 14973.72405 1.23723 298.23723 149.73723 14973.72300 2020-01-01 2020-01-02 2020-01-01 00:06:52 2020-01-02 03:35:13 2020-01-01 00:06:52.000 2020-01-02 03:35:13.000 412 99313 49862.5 4986250 412 99313 49862.5 4986250 -32758 32380 4642.66 464266 -127 124 -1.18 -118 -413 2 10403 99314 1.24024 298.24024 149.74024 14974.02402 1.24024 298.24023 149.74023 14974.02374 1.24024 298.24024 149.74024 14974.02400 2020-01-01 2020-01-02 2020-01-01 00:06:53 2020-01-02 03:35:14 2020-01-01 00:06:53.000 2020-01-02 03:35:14.000 413 99314 49863.5 4986350 413 99314 49863.5 4986350 -32757 32381 4643.66 464366 -126 125 -0.18 -18 -414 2 10404 99315 1.24324 298.24324 149.74324 14974.32432 1.24324 298.24326 149.74324 14974.32433 1.24324 298.24324 149.74324000000001 14974.32400 2020-01-01 2020-01-02 2020-01-01 00:06:54 2020-01-02 03:35:15 2020-01-01 00:06:54.000 2020-01-02 03:35:15.000 414 99315 49864.5 4986450 414 99315 49864.5 4986450 -32756 32382 4644.66 464466 -125 126 0.82 82 -415 2 10405 99316 1.24624 298.24624 149.74624 14974.62462 1.24624 298.24625 149.74624 14974.62463 1.24624 298.24624 149.74624 14974.62400 2020-01-01 2020-01-02 2020-01-01 00:06:55 2020-01-02 03:35:16 2020-01-01 00:06:55.000 2020-01-02 03:35:16.000 415 99316 49865.5 4986550 415 99316 49865.5 4986550 -32755 32383 4645.66 464566 -124 127 1.82 182 -416 2 10406 99317 1.24924 298.24924 149.74924 14974.92492 1.24924 298.24924 149.74924 14974.92492 1.24924 298.24924 149.74924000000001 14974.92400 2020-01-01 2020-01-02 2020-01-01 00:06:56 2020-01-02 03:35:17 2020-01-01 00:06:56.000 2020-01-02 03:35:17.000 416 99317 49866.5 4986650 416 99317 49866.5 4986650 -32754 32384 4646.66 464666 -128 127 0.26 26 -417 2 10407 99318 1.25225 298.25225 149.75225 14975.22522 1.25225 298.25226 149.75225 14975.22552 1.25225 298.25225 149.75225 14975.22500 2020-01-01 2020-01-02 2020-01-01 00:06:57 2020-01-02 03:35:18 2020-01-01 00:06:57.000 2020-01-02 03:35:18.000 417 99318 49867.5 4986750 417 99318 49867.5 4986750 -32753 32385 4647.66 464766 -128 123 -1.3 -130 -418 2 10408 99319 1.25525 298.25525 149.75525 14975.52552 1.25525 298.25525 149.75525 14975.52521 1.25525 298.25525 149.75525 14975.52500 2020-01-01 2020-01-02 2020-01-01 00:06:58 2020-01-02 03:35:19 2020-01-01 00:06:58.000 2020-01-02 03:35:19.000 418 99319 49868.5 4986850 418 99319 49868.5 4986850 -32752 32386 4648.66 464866 -127 124 -0.3 -30 -419 2 10409 99320 1.25825 298.25825 149.75825 14975.82582 1.25825 298.25827 149.75825 14975.8258 1.25825 298.25825 149.75825 14975.82500 2020-01-01 2020-01-02 2020-01-01 00:06:59 2020-01-02 03:35:20 2020-01-01 00:06:59.000 2020-01-02 03:35:20.000 419 99320 49869.5 4986950 419 99320 49869.5 4986950 -32751 32387 4649.66 464966 -126 125 0.7 70 +410 2 10400 99311 1.23123 298.23123 149.73123 14973.12312 1.23123 298.23123 149.73123 14973.12316 1.23123 298.23123 149.73122999999998 14973.123 2020-01-01 2020-01-02 2020-01-01 00:06:50 2020-01-02 03:35:11 2020-01-01 00:06:50.000 2020-01-02 03:35:11.000 410 99311 49860.5 4986050 410 99311 49860.5 4986050 -32760 32378 4640.66 464066 -128 127 -0.62 -62 +411 2 10401 99312 1.23423 298.23423 149.73423 14973.42342 1.23423 298.23422 149.73423 14973.42345 1.23423 298.23423 149.73423 14973.423 2020-01-01 2020-01-02 2020-01-01 00:06:51 2020-01-02 03:35:12 2020-01-01 00:06:51.000 2020-01-02 03:35:12.000 411 99312 49861.5 4986150 411 99312 49861.5 4986150 -32759 32379 4641.66 464166 -128 123 -2.18 -218 +412 2 10402 99313 1.23723 298.23723 149.73723 14973.72372 1.23723 298.23724 149.73724 14973.72405 1.23723 298.23723 149.73723 14973.723 2020-01-01 2020-01-02 2020-01-01 00:06:52 2020-01-02 03:35:13 2020-01-01 00:06:52.000 2020-01-02 03:35:13.000 412 99313 49862.5 4986250 412 99313 49862.5 4986250 -32758 32380 4642.66 464266 -127 124 -1.18 -118 +413 2 10403 99314 1.24024 298.24024 149.74024 14974.02402 1.24024 298.24023 149.74023 14974.02374 1.24024 298.24024 149.74024 14974.024 2020-01-01 2020-01-02 2020-01-01 00:06:53 2020-01-02 03:35:14 2020-01-01 00:06:53.000 2020-01-02 03:35:14.000 413 99314 49863.5 4986350 413 99314 49863.5 4986350 -32757 32381 4643.66 464366 -126 125 -0.18 -18 +414 2 10404 99315 1.24324 298.24324 149.74324 14974.32432 1.24324 298.24326 149.74324 14974.32433 1.24324 298.24324 149.74324000000001 14974.324 2020-01-01 2020-01-02 2020-01-01 00:06:54 2020-01-02 03:35:15 2020-01-01 00:06:54.000 2020-01-02 03:35:15.000 414 99315 49864.5 4986450 414 99315 49864.5 4986450 -32756 32382 4644.66 464466 -125 126 0.82 82 +415 2 10405 99316 1.24624 298.24624 149.74624 14974.62462 1.24624 298.24625 149.74624 14974.62463 1.24624 298.24624 149.74624 14974.624 2020-01-01 2020-01-02 2020-01-01 00:06:55 2020-01-02 03:35:16 2020-01-01 00:06:55.000 2020-01-02 03:35:16.000 415 99316 49865.5 4986550 415 99316 49865.5 4986550 -32755 32383 4645.66 464566 -124 127 1.82 182 +416 2 10406 99317 1.24924 298.24924 149.74924 14974.92492 1.24924 298.24924 149.74924 14974.92492 1.24924 298.24924 149.74924000000001 14974.924 2020-01-01 2020-01-02 2020-01-01 00:06:56 2020-01-02 03:35:17 2020-01-01 00:06:56.000 2020-01-02 03:35:17.000 416 99317 49866.5 4986650 416 99317 49866.5 4986650 -32754 32384 4646.66 464666 -128 127 0.26 26 +417 2 10407 99318 1.25225 298.25225 149.75225 14975.22522 1.25225 298.25226 149.75225 14975.22552 1.25225 298.25225 149.75225 14975.225 2020-01-01 2020-01-02 2020-01-01 00:06:57 2020-01-02 03:35:18 2020-01-01 00:06:57.000 2020-01-02 03:35:18.000 417 99318 49867.5 4986750 417 99318 49867.5 4986750 -32753 32385 4647.66 464766 -128 123 -1.3 -130 +418 2 10408 99319 1.25525 298.25525 149.75525 14975.52552 1.25525 298.25525 149.75525 14975.52521 1.25525 298.25525 149.75525 14975.525 2020-01-01 2020-01-02 2020-01-01 00:06:58 2020-01-02 03:35:19 2020-01-01 00:06:58.000 2020-01-02 03:35:19.000 418 99319 49868.5 4986850 418 99319 49868.5 4986850 -32752 32386 4648.66 464866 -127 124 -0.3 -30 +419 2 10409 99320 1.25825 298.25825 149.75825 14975.82582 1.25825 298.25827 149.75825 14975.8258 1.25825 298.25825 149.75825 14975.825 2020-01-01 2020-01-02 2020-01-01 00:06:59 2020-01-02 03:35:20 2020-01-01 00:06:59.000 2020-01-02 03:35:20.000 419 99320 49869.5 4986950 419 99320 49869.5 4986950 -32751 32387 4649.66 464966 -126 125 0.7 70 42 2 10032 99942 0.12612 300.12612 150.12612 15162.73873 0.12612 300.12613 150.12612 15162.73896 0.12612 300.12612 150.12612 15162.73812 2020-01-01 2020-01-02 2020-01-01 00:00:42 2020-01-02 03:45:42 2020-01-01 00:00:42.000 2020-01-02 03:45:42.000 42 99942 49992 5049192 42 99942 49992 5049192 -32527 32408 4571.009900990099 461672 -128 127 -1.504950495049505 -152 -420 2 10410 99321 1.26126 298.26126 149.76126 14976.12612 1.26126 298.26126 149.76126 14976.12609 1.26126 298.26126 149.76126 14976.12600 2020-01-01 2020-01-02 2020-01-01 00:07:00 2020-01-02 03:35:21 2020-01-01 00:07:00.000 2020-01-02 03:35:21.000 420 99321 49870.5 4987050 420 99321 49870.5 4987050 -32750 32388 4650.66 465066 -125 126 1.7 170 -421 2 10411 99322 1.26426 298.26426 149.76426 14976.42642 1.26426 298.26425 149.76426 14976.4264 1.26426 298.26426 149.76426 14976.42600 2020-01-01 2020-01-02 2020-01-01 00:07:01 2020-01-02 03:35:22 2020-01-01 00:07:01.000 2020-01-02 03:35:22.000 421 99322 49871.5 4987150 421 99322 49871.5 4987150 -32749 32389 4651.66 465166 -124 127 2.7 270 -422 2 10412 99323 1.26726 298.26726 149.76726 14976.72672 1.26726 298.26727 149.76727 14976.72702 1.26726 298.26726 149.76726 14976.72600 2020-01-01 2020-01-02 2020-01-01 00:07:02 2020-01-02 03:35:23 2020-01-01 00:07:02.000 2020-01-02 03:35:23.000 422 99323 49872.5 4987250 422 99323 49872.5 4987250 -32748 32390 4652.66 465266 -128 127 1.14 114 -423 2 10413 99324 1.27027 298.27027 149.77027 14977.02702 1.27027 298.27026 149.77026 14977.02667 1.27027 298.27027 149.77027 14977.02700 2020-01-01 2020-01-02 2020-01-01 00:07:03 2020-01-02 03:35:24 2020-01-01 00:07:03.000 2020-01-02 03:35:24.000 423 99324 49873.5 4987350 423 99324 49873.5 4987350 -32747 32391 4653.66 465366 -128 123 -0.42 -42 -424 2 10414 99325 1.27327 298.27327 149.77327 14977.32732 1.27327 298.2733 149.77327 14977.32727 1.27327 298.27327 149.77327 14977.32700 2020-01-01 2020-01-02 2020-01-01 00:07:04 2020-01-02 03:35:25 2020-01-01 00:07:04.000 2020-01-02 03:35:25.000 424 99325 49874.5 4987450 424 99325 49874.5 4987450 -32746 32392 4654.66 465466 -127 124 0.58 58 -425 2 10415 99326 1.27627 298.27627 149.77627 14977.62762 1.27627 298.27628 149.77627 14977.62756 1.27627 298.27627 149.77627 14977.62700 2020-01-01 2020-01-02 2020-01-01 00:07:05 2020-01-02 03:35:26 2020-01-01 00:07:05.000 2020-01-02 03:35:26.000 425 99326 49875.5 4987550 425 99326 49875.5 4987550 -32745 32393 4655.66 465566 -126 125 1.58 158 -426 2 10416 99327 1.27927 298.27927 149.77927 14977.92792 1.27927 298.27927 149.77927 14977.92787 1.27927 298.27927 149.77927 14977.92700 2020-01-01 2020-01-02 2020-01-01 00:07:06 2020-01-02 03:35:27 2020-01-01 00:07:06.000 2020-01-02 03:35:27.000 426 99327 49876.5 4987650 426 99327 49876.5 4987650 -32744 32394 4656.66 465666 -125 126 2.58 258 -427 2 10417 99328 1.28228 298.28228 149.78228 14978.22822 1.28228 298.2823 149.78228 14978.22849 1.28228 298.28228 149.78228 14978.22800 2020-01-01 2020-01-02 2020-01-01 00:07:07 2020-01-02 03:35:28 2020-01-01 00:07:07.000 2020-01-02 03:35:28.000 427 99328 49877.5 4987750 427 99328 49877.5 4987750 -32743 32395 4657.66 465766 -124 127 3.58 358 -428 2 10418 99329 1.28528 298.28528 149.78528 14978.52852 1.28528 298.28528 149.78528 14978.52815 1.28528 298.28528 149.78528 14978.52800 2020-01-01 2020-01-02 2020-01-01 00:07:08 2020-01-02 03:35:29 2020-01-01 00:07:08.000 2020-01-02 03:35:29.000 428 99329 49878.5 4987850 428 99329 49878.5 4987850 -32742 32396 4658.66 465866 -128 127 2.02 202 -429 2 10419 99330 1.28828 298.28828 149.78828 14978.82882 1.28828 298.2883 149.78828 14978.8289 1.28828 298.28828 149.78828 14978.82800 2020-01-01 2020-01-02 2020-01-01 00:07:09 2020-01-02 03:35:30 2020-01-01 00:07:09.000 2020-01-02 03:35:30.000 429 99330 49879.5 4987950 429 99330 49879.5 4987950 -32741 32397 4659.66 465966 -128 127 0.46 46 +420 2 10410 99321 1.26126 298.26126 149.76126 14976.12612 1.26126 298.26126 149.76126 14976.12609 1.26126 298.26126 149.76126 14976.126 2020-01-01 2020-01-02 2020-01-01 00:07:00 2020-01-02 03:35:21 2020-01-01 00:07:00.000 2020-01-02 03:35:21.000 420 99321 49870.5 4987050 420 99321 49870.5 4987050 -32750 32388 4650.66 465066 -125 126 1.7 170 +421 2 10411 99322 1.26426 298.26426 149.76426 14976.42642 1.26426 298.26425 149.76426 14976.4264 1.26426 298.26426 149.76426 14976.426 2020-01-01 2020-01-02 2020-01-01 00:07:01 2020-01-02 03:35:22 2020-01-01 00:07:01.000 2020-01-02 03:35:22.000 421 99322 49871.5 4987150 421 99322 49871.5 4987150 -32749 32389 4651.66 465166 -124 127 2.7 270 +422 2 10412 99323 1.26726 298.26726 149.76726 14976.72672 1.26726 298.26727 149.76727 14976.72702 1.26726 298.26726 149.76726 14976.726 2020-01-01 2020-01-02 2020-01-01 00:07:02 2020-01-02 03:35:23 2020-01-01 00:07:02.000 2020-01-02 03:35:23.000 422 99323 49872.5 4987250 422 99323 49872.5 4987250 -32748 32390 4652.66 465266 -128 127 1.14 114 +423 2 10413 99324 1.27027 298.27027 149.77027 14977.02702 1.27027 298.27026 149.77026 14977.02667 1.27027 298.27027 149.77027 14977.027 2020-01-01 2020-01-02 2020-01-01 00:07:03 2020-01-02 03:35:24 2020-01-01 00:07:03.000 2020-01-02 03:35:24.000 423 99324 49873.5 4987350 423 99324 49873.5 4987350 -32747 32391 4653.66 465366 -128 123 -0.42 -42 +424 2 10414 99325 1.27327 298.27327 149.77327 14977.32732 1.27327 298.2733 149.77327 14977.32727 1.27327 298.27327 149.77327 14977.327 2020-01-01 2020-01-02 2020-01-01 00:07:04 2020-01-02 03:35:25 2020-01-01 00:07:04.000 2020-01-02 03:35:25.000 424 99325 49874.5 4987450 424 99325 49874.5 4987450 -32746 32392 4654.66 465466 -127 124 0.58 58 +425 2 10415 99326 1.27627 298.27627 149.77627 14977.62762 1.27627 298.27628 149.77627 14977.62756 1.27627 298.27627 149.77627 14977.627 2020-01-01 2020-01-02 2020-01-01 00:07:05 2020-01-02 03:35:26 2020-01-01 00:07:05.000 2020-01-02 03:35:26.000 425 99326 49875.5 4987550 425 99326 49875.5 4987550 -32745 32393 4655.66 465566 -126 125 1.58 158 +426 2 10416 99327 1.27927 298.27927 149.77927 14977.92792 1.27927 298.27927 149.77927 14977.92787 1.27927 298.27927 149.77927 14977.927 2020-01-01 2020-01-02 2020-01-01 00:07:06 2020-01-02 03:35:27 2020-01-01 00:07:06.000 2020-01-02 03:35:27.000 426 99327 49876.5 4987650 426 99327 49876.5 4987650 -32744 32394 4656.66 465666 -125 126 2.58 258 +427 2 10417 99328 1.28228 298.28228 149.78228 14978.22822 1.28228 298.2823 149.78228 14978.22849 1.28228 298.28228 149.78228 14978.228 2020-01-01 2020-01-02 2020-01-01 00:07:07 2020-01-02 03:35:28 2020-01-01 00:07:07.000 2020-01-02 03:35:28.000 427 99328 49877.5 4987750 427 99328 49877.5 4987750 -32743 32395 4657.66 465766 -124 127 3.58 358 +428 2 10418 99329 1.28528 298.28528 149.78528 14978.52852 1.28528 298.28528 149.78528 14978.52815 1.28528 298.28528 149.78528 14978.528 2020-01-01 2020-01-02 2020-01-01 00:07:08 2020-01-02 03:35:29 2020-01-01 00:07:08.000 2020-01-02 03:35:29.000 428 99329 49878.5 4987850 428 99329 49878.5 4987850 -32742 32396 4658.66 465866 -128 127 2.02 202 +429 2 10419 99330 1.28828 298.28828 149.78828 14978.82882 1.28828 298.2883 149.78828 14978.8289 1.28828 298.28828 149.78828 14978.828 2020-01-01 2020-01-02 2020-01-01 00:07:09 2020-01-02 03:35:30 2020-01-01 00:07:09.000 2020-01-02 03:35:30.000 429 99330 49879.5 4987950 429 99330 49879.5 4987950 -32741 32397 4659.66 465966 -128 127 0.46 46 43 2 10033 99943 0.12912 300.12912 150.12912 15163.04204 0.12912 300.12912 150.12912 15163.04211 0.12912 300.12912 150.12912 15163.04112 2020-01-01 2020-01-02 2020-01-01 00:00:43 2020-01-02 03:45:43 2020-01-01 00:00:43.000 2020-01-02 03:45:43.000 43 99943 49993 5049293 43 99943 49993 5049293 -32526 32409 4572.009900990099 461773 -128 124 -3.0396039603960396 -307 -430 2 10420 99331 1.29129 298.29129 149.79129 14979.12912 1.29129 298.2913 149.79129 14979.12904 1.29129 298.29129 149.79129 14979.12900 2020-01-01 2020-01-02 2020-01-01 00:07:10 2020-01-02 03:35:31 2020-01-01 00:07:10.000 2020-01-02 03:35:31.000 430 99331 49880.5 4988050 430 99331 49880.5 4988050 -32740 32398 4660.66 466066 -128 124 -1.1 -110 -431 2 10421 99332 1.29429 298.29429 149.79429 14979.42942 1.29429 298.29428 149.79429 14979.42933 1.29429 298.29429 149.79429 14979.42900 2020-01-01 2020-01-02 2020-01-01 00:07:11 2020-01-02 03:35:32 2020-01-01 00:07:11.000 2020-01-02 03:35:32.000 431 99332 49881.5 4988150 431 99332 49881.5 4988150 -32739 32399 4661.66 466166 -127 125 -0.1 -10 -432 2 10422 99333 1.29729 298.29729 149.79729 14979.72972 1.29729 298.2973 149.79729 14979.72996 1.29729 298.29729 149.79729 14979.72900 2020-01-01 2020-01-02 2020-01-01 00:07:12 2020-01-02 03:35:33 2020-01-01 00:07:12.000 2020-01-02 03:35:33.000 432 99333 49882.5 4988250 432 99333 49882.5 4988250 -32738 32400 4662.66 466266 -126 126 0.9 90 -433 2 10423 99334 1.3003 298.3003 149.8003 14980.03003 1.3003 298.3003 149.80029 14980.02962 1.30030 298.30030 149.8003 14980.03000 2020-01-01 2020-01-02 2020-01-01 00:07:13 2020-01-02 03:35:34 2020-01-01 00:07:13.000 2020-01-02 03:35:34.000 433 99334 49883.5 4988350 433 99334 49883.5 4988350 -32737 32401 4663.66 466366 -125 127 1.9 190 -434 2 10424 99335 1.3033 298.3033 149.8033 14980.33033 1.3033 298.3033 149.8033 14980.33037 1.30330 298.30330 149.8033 14980.33000 2020-01-01 2020-01-02 2020-01-01 00:07:14 2020-01-02 03:35:35 2020-01-01 00:07:14.000 2020-01-02 03:35:35.000 434 99335 49884.5 4988450 434 99335 49884.5 4988450 -32736 32402 4664.66 466466 -128 127 0.34 34 -435 2 10425 99336 1.3063 298.3063 149.8063 14980.63063 1.3063 298.3063 149.8063 14980.63051 1.30630 298.30630 149.8063 14980.63000 2020-01-01 2020-01-02 2020-01-01 00:07:15 2020-01-02 03:35:36 2020-01-01 00:07:15.000 2020-01-02 03:35:36.000 435 99336 49885.5 4988550 435 99336 49885.5 4988550 -32735 32403 4665.66 466566 -128 127 -1.22 -122 -436 2 10426 99337 1.3093 298.3093 149.8093 14980.93093 1.3093 298.3093 149.8093 14980.93084 1.30930 298.30930 149.8093 14980.93000 2020-01-01 2020-01-02 2020-01-01 00:07:16 2020-01-02 03:35:37 2020-01-01 00:07:16.000 2020-01-02 03:35:37.000 436 99337 49886.5 4988650 436 99337 49886.5 4988650 -32734 32404 4666.66 466666 -128 123 -2.78 -278 -437 2 10427 99338 1.31231 298.31231 149.81231 14981.23123 1.31231 298.31232 149.81231 14981.23143 1.31231 298.31231 149.81231 14981.23100 2020-01-01 2020-01-02 2020-01-01 00:07:17 2020-01-02 03:35:38 2020-01-01 00:07:17.000 2020-01-02 03:35:38.000 437 99338 49887.5 4988750 437 99338 49887.5 4988750 -32733 32405 4667.66 466766 -127 124 -1.78 -178 -438 2 10428 99339 1.31531 298.31531 149.81531 14981.53153 1.31531 298.3153 149.81531 14981.53173 1.31531 298.31531 149.81531 14981.53100 2020-01-01 2020-01-02 2020-01-01 00:07:18 2020-01-02 03:35:39 2020-01-01 00:07:18.000 2020-01-02 03:35:39.000 438 99339 49888.5 4988850 438 99339 49888.5 4988850 -32732 32406 4668.66 466866 -126 125 -0.78 -78 -439 2 10429 99340 1.31831 298.31831 149.81831 14981.83183 1.31831 298.31833 149.81831 14981.83184 1.31831 298.31831 149.81831 14981.83100 2020-01-01 2020-01-02 2020-01-01 00:07:19 2020-01-02 03:35:40 2020-01-01 00:07:19.000 2020-01-02 03:35:40.000 439 99340 49889.5 4988950 439 99340 49889.5 4988950 -32731 32407 4669.66 466966 -125 126 0.22 22 +430 2 10420 99331 1.29129 298.29129 149.79129 14979.12912 1.29129 298.2913 149.79129 14979.12904 1.29129 298.29129 149.79129 14979.129 2020-01-01 2020-01-02 2020-01-01 00:07:10 2020-01-02 03:35:31 2020-01-01 00:07:10.000 2020-01-02 03:35:31.000 430 99331 49880.5 4988050 430 99331 49880.5 4988050 -32740 32398 4660.66 466066 -128 124 -1.1 -110 +431 2 10421 99332 1.29429 298.29429 149.79429 14979.42942 1.29429 298.29428 149.79429 14979.42933 1.29429 298.29429 149.79429 14979.429 2020-01-01 2020-01-02 2020-01-01 00:07:11 2020-01-02 03:35:32 2020-01-01 00:07:11.000 2020-01-02 03:35:32.000 431 99332 49881.5 4988150 431 99332 49881.5 4988150 -32739 32399 4661.66 466166 -127 125 -0.1 -10 +432 2 10422 99333 1.29729 298.29729 149.79729 14979.72972 1.29729 298.2973 149.79729 14979.72996 1.29729 298.29729 149.79729 14979.729 2020-01-01 2020-01-02 2020-01-01 00:07:12 2020-01-02 03:35:33 2020-01-01 00:07:12.000 2020-01-02 03:35:33.000 432 99333 49882.5 4988250 432 99333 49882.5 4988250 -32738 32400 4662.66 466266 -126 126 0.9 90 +433 2 10423 99334 1.3003 298.3003 149.8003 14980.03003 1.3003 298.3003 149.80029 14980.02962 1.3003 298.3003 149.8003 14980.03 2020-01-01 2020-01-02 2020-01-01 00:07:13 2020-01-02 03:35:34 2020-01-01 00:07:13.000 2020-01-02 03:35:34.000 433 99334 49883.5 4988350 433 99334 49883.5 4988350 -32737 32401 4663.66 466366 -125 127 1.9 190 +434 2 10424 99335 1.3033 298.3033 149.8033 14980.33033 1.3033 298.3033 149.8033 14980.33037 1.3033 298.3033 149.8033 14980.33 2020-01-01 2020-01-02 2020-01-01 00:07:14 2020-01-02 03:35:35 2020-01-01 00:07:14.000 2020-01-02 03:35:35.000 434 99335 49884.5 4988450 434 99335 49884.5 4988450 -32736 32402 4664.66 466466 -128 127 0.34 34 +435 2 10425 99336 1.3063 298.3063 149.8063 14980.63063 1.3063 298.3063 149.8063 14980.63051 1.3063 298.3063 149.8063 14980.63 2020-01-01 2020-01-02 2020-01-01 00:07:15 2020-01-02 03:35:36 2020-01-01 00:07:15.000 2020-01-02 03:35:36.000 435 99336 49885.5 4988550 435 99336 49885.5 4988550 -32735 32403 4665.66 466566 -128 127 -1.22 -122 +436 2 10426 99337 1.3093 298.3093 149.8093 14980.93093 1.3093 298.3093 149.8093 14980.93084 1.3093 298.3093 149.8093 14980.93 2020-01-01 2020-01-02 2020-01-01 00:07:16 2020-01-02 03:35:37 2020-01-01 00:07:16.000 2020-01-02 03:35:37.000 436 99337 49886.5 4988650 436 99337 49886.5 4988650 -32734 32404 4666.66 466666 -128 123 -2.78 -278 +437 2 10427 99338 1.31231 298.31231 149.81231 14981.23123 1.31231 298.31232 149.81231 14981.23143 1.31231 298.31231 149.81231 14981.231 2020-01-01 2020-01-02 2020-01-01 00:07:17 2020-01-02 03:35:38 2020-01-01 00:07:17.000 2020-01-02 03:35:38.000 437 99338 49887.5 4988750 437 99338 49887.5 4988750 -32733 32405 4667.66 466766 -127 124 -1.78 -178 +438 2 10428 99339 1.31531 298.31531 149.81531 14981.53153 1.31531 298.3153 149.81531 14981.53173 1.31531 298.31531 149.81531 14981.531 2020-01-01 2020-01-02 2020-01-01 00:07:18 2020-01-02 03:35:39 2020-01-01 00:07:18.000 2020-01-02 03:35:39.000 438 99339 49888.5 4988850 438 99339 49888.5 4988850 -32732 32406 4668.66 466866 -126 125 -0.78 -78 +439 2 10429 99340 1.31831 298.31831 149.81831 14981.83183 1.31831 298.31833 149.81831 14981.83184 1.31831 298.31831 149.81831 14981.831 2020-01-01 2020-01-02 2020-01-01 00:07:19 2020-01-02 03:35:40 2020-01-01 00:07:19.000 2020-01-02 03:35:40.000 439 99340 49889.5 4988950 439 99340 49889.5 4988950 -32731 32407 4669.66 466966 -125 126 0.22 22 44 2 10034 99944 0.13213 300.13213 150.13213 15163.34534 0.13213 300.13214 150.13213 15163.34525 0.13213 300.13213 150.13213 15163.34513 2020-01-01 2020-01-02 2020-01-01 00:00:44 2020-01-02 03:45:44 2020-01-01 00:00:44.000 2020-01-02 03:45:44.000 44 99944 49994 5049394 44 99944 49994 5049394 -32525 32410 4573.009900990099 461874 -127 125 -2.0396039603960396 -206 -440 2 10430 99341 1.32132 298.32132 149.82132 14982.13213 1.32132 298.32132 149.82131 14982.13197 1.32132 298.32132 149.82132 14982.13200 2020-01-01 2020-01-02 2020-01-01 00:07:20 2020-01-02 03:35:41 2020-01-01 00:07:20.000 2020-01-02 03:35:41.000 440 99341 49890.5 4989050 440 99341 49890.5 4989050 -32730 32408 4670.66 467066 -124 127 1.22 122 -441 2 10431 99342 1.32432 298.32432 149.82432 14982.43243 1.32432 298.3243 149.82432 14982.4323 1.32432 298.32432 149.82432 14982.43200 2020-01-01 2020-01-02 2020-01-01 00:07:21 2020-01-02 03:35:42 2020-01-01 00:07:21.000 2020-01-02 03:35:42.000 441 99342 49891.5 4989150 441 99342 49891.5 4989150 -32729 32409 4671.66 467166 -128 127 -0.34 -34 -442 2 10432 99343 1.32732 298.32732 149.82732 14982.73273 1.32732 298.32733 149.82732 14982.7329 1.32732 298.32732 149.82732 14982.73200 2020-01-01 2020-01-02 2020-01-01 00:07:22 2020-01-02 03:35:43 2020-01-01 00:07:22.000 2020-01-02 03:35:43.000 442 99343 49892.5 4989250 442 99343 49892.5 4989250 -32728 32410 4672.66 467266 -128 123 -1.9 -190 -443 2 10433 99344 1.33033 298.33033 149.83033 14983.03303 1.33033 298.33032 149.83033 14983.03319 1.33033 298.33033 149.83033 14983.03300 2020-01-01 2020-01-02 2020-01-01 00:07:23 2020-01-02 03:35:44 2020-01-01 00:07:23.000 2020-01-02 03:35:44.000 443 99344 49893.5 4989350 443 99344 49893.5 4989350 -32727 32411 4673.66 467366 -127 124 -0.9 -90 -444 2 10434 99345 1.33333 298.33333 149.83333 14983.33333 1.33333 298.33334 149.83333 14983.33331 1.33333 298.33333 149.83333000000002 14983.33300 2020-01-01 2020-01-02 2020-01-01 00:07:24 2020-01-02 03:35:45 2020-01-01 00:07:24.000 2020-01-02 03:35:45.000 444 99345 49894.5 4989450 444 99345 49894.5 4989450 -32726 32412 4674.66 467466 -126 125 0.1 10 -445 2 10435 99346 1.33633 298.33633 149.83633 14983.63363 1.33633 298.33633 149.83633 14983.63348 1.33633 298.33633 149.83633 14983.63300 2020-01-01 2020-01-02 2020-01-01 00:07:25 2020-01-02 03:35:46 2020-01-01 00:07:25.000 2020-01-02 03:35:46.000 445 99346 49895.5 4989550 445 99346 49895.5 4989550 -32725 32413 4675.66 467566 -125 126 1.1 110 -446 2 10436 99347 1.33933 298.33933 149.83933 14983.93393 1.33933 298.33932 149.83933 14983.93378 1.33933 298.33933 149.83933000000002 14983.93300 2020-01-01 2020-01-02 2020-01-01 00:07:26 2020-01-02 03:35:47 2020-01-01 00:07:26.000 2020-01-02 03:35:47.000 446 99347 49896.5 4989650 446 99347 49896.5 4989650 -32724 32414 4676.66 467666 -124 127 2.1 210 -447 2 10437 99348 1.34234 298.34234 149.84234 14984.23423 1.34234 298.34235 149.84234 14984.23437 1.34234 298.34234 149.84234 14984.23400 2020-01-01 2020-01-02 2020-01-01 00:07:27 2020-01-02 03:35:48 2020-01-01 00:07:27.000 2020-01-02 03:35:48.000 447 99348 49897.5 4989750 447 99348 49897.5 4989750 -32723 32415 4677.66 467766 -128 127 0.54 54 -448 2 10438 99349 1.34534 298.34534 149.84534 14984.53453 1.34534 298.34534 149.84534 14984.53466 1.34534 298.34534 149.84534 14984.53400 2020-01-01 2020-01-02 2020-01-01 00:07:28 2020-01-02 03:35:49 2020-01-01 00:07:28.000 2020-01-02 03:35:49.000 448 99349 49898.5 4989850 448 99349 49898.5 4989850 -32722 32416 4678.66 467866 -128 123 -1.02 -102 -449 2 10439 99350 1.34834 298.34834 149.84834 14984.83483 1.34834 298.34836 149.84834 14984.83478 1.34834 298.34834 149.84834 14984.83400 2020-01-01 2020-01-02 2020-01-01 00:07:29 2020-01-02 03:35:50 2020-01-01 00:07:29.000 2020-01-02 03:35:50.000 449 99350 49899.5 4989950 449 99350 49899.5 4989950 -32721 32417 4679.66 467966 -127 124 -0.02 -2 +440 2 10430 99341 1.32132 298.32132 149.82132 14982.13213 1.32132 298.32132 149.82131 14982.13197 1.32132 298.32132 149.82132 14982.132 2020-01-01 2020-01-02 2020-01-01 00:07:20 2020-01-02 03:35:41 2020-01-01 00:07:20.000 2020-01-02 03:35:41.000 440 99341 49890.5 4989050 440 99341 49890.5 4989050 -32730 32408 4670.66 467066 -124 127 1.22 122 +441 2 10431 99342 1.32432 298.32432 149.82432 14982.43243 1.32432 298.3243 149.82432 14982.4323 1.32432 298.32432 149.82432 14982.432 2020-01-01 2020-01-02 2020-01-01 00:07:21 2020-01-02 03:35:42 2020-01-01 00:07:21.000 2020-01-02 03:35:42.000 441 99342 49891.5 4989150 441 99342 49891.5 4989150 -32729 32409 4671.66 467166 -128 127 -0.34 -34 +442 2 10432 99343 1.32732 298.32732 149.82732 14982.73273 1.32732 298.32733 149.82732 14982.7329 1.32732 298.32732 149.82732 14982.732 2020-01-01 2020-01-02 2020-01-01 00:07:22 2020-01-02 03:35:43 2020-01-01 00:07:22.000 2020-01-02 03:35:43.000 442 99343 49892.5 4989250 442 99343 49892.5 4989250 -32728 32410 4672.66 467266 -128 123 -1.9 -190 +443 2 10433 99344 1.33033 298.33033 149.83033 14983.03303 1.33033 298.33032 149.83033 14983.03319 1.33033 298.33033 149.83033 14983.033 2020-01-01 2020-01-02 2020-01-01 00:07:23 2020-01-02 03:35:44 2020-01-01 00:07:23.000 2020-01-02 03:35:44.000 443 99344 49893.5 4989350 443 99344 49893.5 4989350 -32727 32411 4673.66 467366 -127 124 -0.9 -90 +444 2 10434 99345 1.33333 298.33333 149.83333 14983.33333 1.33333 298.33334 149.83333 14983.33331 1.33333 298.33333 149.83333000000002 14983.333 2020-01-01 2020-01-02 2020-01-01 00:07:24 2020-01-02 03:35:45 2020-01-01 00:07:24.000 2020-01-02 03:35:45.000 444 99345 49894.5 4989450 444 99345 49894.5 4989450 -32726 32412 4674.66 467466 -126 125 0.1 10 +445 2 10435 99346 1.33633 298.33633 149.83633 14983.63363 1.33633 298.33633 149.83633 14983.63348 1.33633 298.33633 149.83633 14983.633 2020-01-01 2020-01-02 2020-01-01 00:07:25 2020-01-02 03:35:46 2020-01-01 00:07:25.000 2020-01-02 03:35:46.000 445 99346 49895.5 4989550 445 99346 49895.5 4989550 -32725 32413 4675.66 467566 -125 126 1.1 110 +446 2 10436 99347 1.33933 298.33933 149.83933 14983.93393 1.33933 298.33932 149.83933 14983.93378 1.33933 298.33933 149.83933000000002 14983.933 2020-01-01 2020-01-02 2020-01-01 00:07:26 2020-01-02 03:35:47 2020-01-01 00:07:26.000 2020-01-02 03:35:47.000 446 99347 49896.5 4989650 446 99347 49896.5 4989650 -32724 32414 4676.66 467666 -124 127 2.1 210 +447 2 10437 99348 1.34234 298.34234 149.84234 14984.23423 1.34234 298.34235 149.84234 14984.23437 1.34234 298.34234 149.84234 14984.234 2020-01-01 2020-01-02 2020-01-01 00:07:27 2020-01-02 03:35:48 2020-01-01 00:07:27.000 2020-01-02 03:35:48.000 447 99348 49897.5 4989750 447 99348 49897.5 4989750 -32723 32415 4677.66 467766 -128 127 0.54 54 +448 2 10438 99349 1.34534 298.34534 149.84534 14984.53453 1.34534 298.34534 149.84534 14984.53466 1.34534 298.34534 149.84534 14984.534 2020-01-01 2020-01-02 2020-01-01 00:07:28 2020-01-02 03:35:49 2020-01-01 00:07:28.000 2020-01-02 03:35:49.000 448 99349 49898.5 4989850 448 99349 49898.5 4989850 -32722 32416 4678.66 467866 -128 123 -1.02 -102 +449 2 10439 99350 1.34834 298.34834 149.84834 14984.83483 1.34834 298.34836 149.84834 14984.83478 1.34834 298.34834 149.84834 14984.834 2020-01-01 2020-01-02 2020-01-01 00:07:29 2020-01-02 03:35:50 2020-01-01 00:07:29.000 2020-01-02 03:35:50.000 449 99350 49899.5 4989950 449 99350 49899.5 4989950 -32721 32417 4679.66 467966 -127 124 -0.02 -2 45 2 10035 99945 0.13513 300.13513 150.13513 15163.64864 0.13513 300.13513 150.13513 15163.64839 0.13513 300.13513 150.13513 15163.64813 2020-01-01 2020-01-02 2020-01-01 00:00:45 2020-01-02 03:45:45 2020-01-01 00:00:45.000 2020-01-02 03:45:45.000 45 99945 49995 5049495 45 99945 49995 5049495 -32524 32411 4574.009900990099 461975 -126 126 -1.0396039603960396 -105 -450 2 10440 99351 1.35135 298.35135 149.85135 14985.13513 1.35135 298.35135 149.85134 14985.13495 1.35135 298.35135 149.85135 14985.13500 2020-01-01 2020-01-02 2020-01-01 00:07:30 2020-01-02 03:35:51 2020-01-01 00:07:30.000 2020-01-02 03:35:51.000 450 99351 49900.5 4990050 450 99351 49900.5 4990050 -32720 32418 4680.66 468066 -126 125 0.98 98 -451 2 10441 99352 1.35435 298.35435 149.85435 14985.43543 1.35435 298.35434 149.85435 14985.43525 1.35435 298.35435 149.85434999999998 14985.43500 2020-01-01 2020-01-02 2020-01-01 00:07:31 2020-01-02 03:35:52 2020-01-01 00:07:31.000 2020-01-02 03:35:52.000 451 99352 49901.5 4990150 451 99352 49901.5 4990150 -32719 32419 4681.66 468166 -125 126 1.98 198 -452 2 10442 99353 1.35735 298.35735 149.85735 14985.73573 1.35735 298.35736 149.85736 14985.736 1.35735 298.35735 149.85735 14985.73500 2020-01-01 2020-01-02 2020-01-01 00:07:32 2020-01-02 03:35:53 2020-01-01 00:07:32.000 2020-01-02 03:35:53.000 452 99353 49902.5 4990250 452 99353 49902.5 4990250 -32718 32420 4682.66 468266 -124 127 2.98 298 -453 2 10443 99354 1.36036 298.36036 149.86036 14986.03603 1.36036 298.36035 149.86036 14986.03614 1.36036 298.36036 149.86036000000001 14986.03600 2020-01-01 2020-01-02 2020-01-01 00:07:33 2020-01-02 03:35:54 2020-01-01 00:07:33.000 2020-01-02 03:35:54.000 453 99354 49903.5 4990350 453 99354 49903.5 4990350 -32717 32421 4683.66 468366 -128 127 1.42 142 -454 2 10444 99355 1.36336 298.36336 149.86336 14986.33633 1.36336 298.36337 149.86336 14986.33629 1.36336 298.36336 149.86336 14986.33600 2020-01-01 2020-01-02 2020-01-01 00:07:34 2020-01-02 03:35:55 2020-01-01 00:07:34.000 2020-01-02 03:35:55.000 454 99355 49904.5 4990450 454 99355 49904.5 4990450 -32716 32422 4684.66 468466 -128 127 -0.14 -14 -455 2 10445 99356 1.36636 298.36636 149.86636 14986.63663 1.36636 298.36636 149.86636 14986.63641 1.36636 298.36636 149.86636000000001 14986.63600 2020-01-01 2020-01-02 2020-01-01 00:07:35 2020-01-02 03:35:56 2020-01-01 00:07:35.000 2020-01-02 03:35:56.000 455 99356 49905.5 4990550 455 99356 49905.5 4990550 -32715 32423 4685.66 468566 -128 124 -1.7 -170 -456 2 10446 99357 1.36936 298.36936 149.86936 14986.93693 1.36936 298.36935 149.86936 14986.93672 1.36936 298.36936 149.86936 14986.93600 2020-01-01 2020-01-02 2020-01-01 00:07:36 2020-01-02 03:35:57 2020-01-01 00:07:36.000 2020-01-02 03:35:57.000 456 99357 49906.5 4990650 456 99357 49906.5 4990650 -32714 32424 4686.66 468666 -127 125 -0.7 -70 -457 2 10447 99358 1.37237 298.37237 149.87237 14987.23723 1.37237 298.37238 149.87237 14987.23747 1.37237 298.37237 149.87237 14987.23700 2020-01-01 2020-01-02 2020-01-01 00:07:37 2020-01-02 03:35:58 2020-01-01 00:07:37.000 2020-01-02 03:35:58.000 457 99358 49907.5 4990750 457 99358 49907.5 4990750 -32713 32425 4687.66 468766 -126 126 0.3 30 -458 2 10448 99359 1.37537 298.37537 149.87537 14987.53753 1.37537 298.37537 149.87537 14987.5376 1.37537 298.37537 149.87537 14987.53700 2020-01-01 2020-01-02 2020-01-01 00:07:38 2020-01-02 03:35:59 2020-01-01 00:07:38.000 2020-01-02 03:35:59.000 458 99359 49908.5 4990850 458 99359 49908.5 4990850 -32712 32426 4688.66 468866 -125 127 1.3 130 -459 2 10449 99360 1.37837 298.37837 149.87837 14987.83783 1.37837 298.3784 149.87837 14987.83775 1.37837 298.37837 149.87837 14987.83700 2020-01-01 2020-01-02 2020-01-01 00:07:39 2020-01-02 03:36:00 2020-01-01 00:07:39.000 2020-01-02 03:36:00.000 459 99360 49909.5 4990950 459 99360 49909.5 4990950 -32711 32427 4689.66 468966 -128 127 -0.26 -26 +450 2 10440 99351 1.35135 298.35135 149.85135 14985.13513 1.35135 298.35135 149.85134 14985.13495 1.35135 298.35135 149.85135 14985.135 2020-01-01 2020-01-02 2020-01-01 00:07:30 2020-01-02 03:35:51 2020-01-01 00:07:30.000 2020-01-02 03:35:51.000 450 99351 49900.5 4990050 450 99351 49900.5 4990050 -32720 32418 4680.66 468066 -126 125 0.98 98 +451 2 10441 99352 1.35435 298.35435 149.85435 14985.43543 1.35435 298.35434 149.85435 14985.43525 1.35435 298.35435 149.85434999999998 14985.435 2020-01-01 2020-01-02 2020-01-01 00:07:31 2020-01-02 03:35:52 2020-01-01 00:07:31.000 2020-01-02 03:35:52.000 451 99352 49901.5 4990150 451 99352 49901.5 4990150 -32719 32419 4681.66 468166 -125 126 1.98 198 +452 2 10442 99353 1.35735 298.35735 149.85735 14985.73573 1.35735 298.35736 149.85736 14985.736 1.35735 298.35735 149.85735 14985.735 2020-01-01 2020-01-02 2020-01-01 00:07:32 2020-01-02 03:35:53 2020-01-01 00:07:32.000 2020-01-02 03:35:53.000 452 99353 49902.5 4990250 452 99353 49902.5 4990250 -32718 32420 4682.66 468266 -124 127 2.98 298 +453 2 10443 99354 1.36036 298.36036 149.86036 14986.03603 1.36036 298.36035 149.86036 14986.03614 1.36036 298.36036 149.86036000000001 14986.036 2020-01-01 2020-01-02 2020-01-01 00:07:33 2020-01-02 03:35:54 2020-01-01 00:07:33.000 2020-01-02 03:35:54.000 453 99354 49903.5 4990350 453 99354 49903.5 4990350 -32717 32421 4683.66 468366 -128 127 1.42 142 +454 2 10444 99355 1.36336 298.36336 149.86336 14986.33633 1.36336 298.36337 149.86336 14986.33629 1.36336 298.36336 149.86336 14986.336 2020-01-01 2020-01-02 2020-01-01 00:07:34 2020-01-02 03:35:55 2020-01-01 00:07:34.000 2020-01-02 03:35:55.000 454 99355 49904.5 4990450 454 99355 49904.5 4990450 -32716 32422 4684.66 468466 -128 127 -0.14 -14 +455 2 10445 99356 1.36636 298.36636 149.86636 14986.63663 1.36636 298.36636 149.86636 14986.63641 1.36636 298.36636 149.86636000000001 14986.636 2020-01-01 2020-01-02 2020-01-01 00:07:35 2020-01-02 03:35:56 2020-01-01 00:07:35.000 2020-01-02 03:35:56.000 455 99356 49905.5 4990550 455 99356 49905.5 4990550 -32715 32423 4685.66 468566 -128 124 -1.7 -170 +456 2 10446 99357 1.36936 298.36936 149.86936 14986.93693 1.36936 298.36935 149.86936 14986.93672 1.36936 298.36936 149.86936 14986.936 2020-01-01 2020-01-02 2020-01-01 00:07:36 2020-01-02 03:35:57 2020-01-01 00:07:36.000 2020-01-02 03:35:57.000 456 99357 49906.5 4990650 456 99357 49906.5 4990650 -32714 32424 4686.66 468666 -127 125 -0.7 -70 +457 2 10447 99358 1.37237 298.37237 149.87237 14987.23723 1.37237 298.37238 149.87237 14987.23747 1.37237 298.37237 149.87237 14987.237 2020-01-01 2020-01-02 2020-01-01 00:07:37 2020-01-02 03:35:58 2020-01-01 00:07:37.000 2020-01-02 03:35:58.000 457 99358 49907.5 4990750 457 99358 49907.5 4990750 -32713 32425 4687.66 468766 -126 126 0.3 30 +458 2 10448 99359 1.37537 298.37537 149.87537 14987.53753 1.37537 298.37537 149.87537 14987.5376 1.37537 298.37537 149.87537 14987.537 2020-01-01 2020-01-02 2020-01-01 00:07:38 2020-01-02 03:35:59 2020-01-01 00:07:38.000 2020-01-02 03:35:59.000 458 99359 49908.5 4990850 458 99359 49908.5 4990850 -32712 32426 4688.66 468866 -125 127 1.3 130 +459 2 10449 99360 1.37837 298.37837 149.87837 14987.83783 1.37837 298.3784 149.87837 14987.83775 1.37837 298.37837 149.87837 14987.837 2020-01-01 2020-01-02 2020-01-01 00:07:39 2020-01-02 03:36:00 2020-01-01 00:07:39.000 2020-01-02 03:36:00.000 459 99360 49909.5 4990950 459 99360 49909.5 4990950 -32711 32427 4689.66 468966 -128 127 -0.26 -26 46 2 10036 99946 0.13813 300.13813 150.13813 15163.95195 0.13813 300.13815 150.13814 15163.95214 0.13813 300.13813 150.13813 15163.95113 2020-01-01 2020-01-02 2020-01-01 00:00:46 2020-01-02 03:45:46 2020-01-01 00:00:46.000 2020-01-02 03:45:46.000 46 99946 49996 5049596 46 99946 49996 5049596 -32523 32412 4575.009900990099 462076 -125 127 -0.039603960396039604 -4 -460 2 10450 99361 1.38138 298.38138 149.88138 14988.13813 1.38138 298.38138 149.88137 14988.13789 1.38138 298.38138 149.88138 14988.13800 2020-01-01 2020-01-02 2020-01-01 00:07:40 2020-01-02 03:36:01 2020-01-01 00:07:40.000 2020-01-02 03:36:01.000 460 99361 49910.5 4991050 460 99361 49910.5 4991050 -32710 32428 4690.66 469066 -128 127 -1.82 -182 -461 2 10451 99362 1.38438 298.38438 149.88438 14988.43843 1.38438 298.3844 149.88438 14988.43864 1.38438 298.38438 149.88438 14988.43800 2020-01-01 2020-01-02 2020-01-01 00:07:41 2020-01-02 03:36:02 2020-01-01 00:07:41.000 2020-01-02 03:36:02.000 461 99362 49911.5 4991150 461 99362 49911.5 4991150 -32709 32429 4691.66 469166 -128 123 -3.38 -338 -462 2 10452 99363 1.38738 298.38738 149.88738 14988.73873 1.38738 298.3874 149.88738 14988.73894 1.38738 298.38738 149.88738 14988.73800 2020-01-01 2020-01-02 2020-01-01 00:07:42 2020-01-02 03:36:03 2020-01-01 00:07:42.000 2020-01-02 03:36:03.000 462 99363 49912.5 4991250 462 99363 49912.5 4991250 -32708 32430 4692.66 469266 -127 124 -2.38 -238 -463 2 10453 99364 1.39039 298.39039 149.89039 14989.03903 1.39039 298.39038 149.89039 14989.03907 1.39039 298.39039 149.89039 14989.03900 2020-01-01 2020-01-02 2020-01-01 00:07:43 2020-01-02 03:36:04 2020-01-01 00:07:43.000 2020-01-02 03:36:04.000 463 99364 49913.5 4991350 463 99364 49913.5 4991350 -32707 32431 4693.66 469366 -126 125 -1.38 -138 -464 2 10454 99365 1.39339 298.39339 149.89339 14989.33933 1.39339 298.3934 149.89339 14989.33922 1.39339 298.39339 149.89339 14989.33900 2020-01-01 2020-01-02 2020-01-01 00:07:44 2020-01-02 03:36:05 2020-01-01 00:07:44.000 2020-01-02 03:36:05.000 464 99365 49914.5 4991450 464 99365 49914.5 4991450 -32706 32432 4694.66 469466 -125 126 -0.38 -38 -465 2 10455 99366 1.39639 298.39639 149.89639 14989.63963 1.39639 298.3964 149.89639 14989.63936 1.39639 298.39639 149.89639 14989.63900 2020-01-01 2020-01-02 2020-01-01 00:07:45 2020-01-02 03:36:06 2020-01-01 00:07:45.000 2020-01-02 03:36:06.000 465 99366 49915.5 4991550 465 99366 49915.5 4991550 -32705 32433 4695.66 469566 -124 127 0.62 62 -466 2 10456 99367 1.39939 298.39939 149.89939 14989.93993 1.39939 298.3994 149.8994 14989.94011 1.39939 298.39939 149.89939 14989.93900 2020-01-01 2020-01-02 2020-01-01 00:07:46 2020-01-02 03:36:07 2020-01-01 00:07:46.000 2020-01-02 03:36:07.000 466 99367 49916.5 4991650 466 99367 49916.5 4991650 -32704 32434 4696.66 469666 -128 127 -0.94 -94 -467 2 10457 99368 1.4024 298.4024 149.9024 14990.24024 1.4024 298.4024 149.9024 14990.24041 1.40240 298.40240 149.9024 14990.24000 2020-01-01 2020-01-02 2020-01-01 00:07:47 2020-01-02 03:36:08 2020-01-01 00:07:47.000 2020-01-02 03:36:08.000 467 99368 49917.5 4991750 467 99368 49917.5 4991750 -32703 32435 4697.66 469766 -128 123 -2.5 -250 -468 2 10458 99369 1.4054 298.4054 149.9054 14990.54054 1.4054 298.4054 149.9054 14990.54058 1.40540 298.40540 149.90540000000001 14990.54000 2020-01-01 2020-01-02 2020-01-01 00:07:48 2020-01-02 03:36:09 2020-01-01 00:07:48.000 2020-01-02 03:36:09.000 468 99369 49918.5 4991850 468 99369 49918.5 4991850 -32702 32436 4698.66 469866 -127 124 -1.5 -150 -469 2 10459 99370 1.4084 298.4084 149.9084 14990.84084 1.4084 298.40842 149.9084 14990.8407 1.40840 298.40840 149.9084 14990.84000 2020-01-01 2020-01-02 2020-01-01 00:07:49 2020-01-02 03:36:10 2020-01-01 00:07:49.000 2020-01-02 03:36:10.000 469 99370 49919.5 4991950 469 99370 49919.5 4991950 -32701 32437 4699.66 469966 -126 125 -0.5 -50 +460 2 10450 99361 1.38138 298.38138 149.88138 14988.13813 1.38138 298.38138 149.88137 14988.13789 1.38138 298.38138 149.88138 14988.138 2020-01-01 2020-01-02 2020-01-01 00:07:40 2020-01-02 03:36:01 2020-01-01 00:07:40.000 2020-01-02 03:36:01.000 460 99361 49910.5 4991050 460 99361 49910.5 4991050 -32710 32428 4690.66 469066 -128 127 -1.82 -182 +461 2 10451 99362 1.38438 298.38438 149.88438 14988.43843 1.38438 298.3844 149.88438 14988.43864 1.38438 298.38438 149.88438 14988.438 2020-01-01 2020-01-02 2020-01-01 00:07:41 2020-01-02 03:36:02 2020-01-01 00:07:41.000 2020-01-02 03:36:02.000 461 99362 49911.5 4991150 461 99362 49911.5 4991150 -32709 32429 4691.66 469166 -128 123 -3.38 -338 +462 2 10452 99363 1.38738 298.38738 149.88738 14988.73873 1.38738 298.3874 149.88738 14988.73894 1.38738 298.38738 149.88738 14988.738 2020-01-01 2020-01-02 2020-01-01 00:07:42 2020-01-02 03:36:03 2020-01-01 00:07:42.000 2020-01-02 03:36:03.000 462 99363 49912.5 4991250 462 99363 49912.5 4991250 -32708 32430 4692.66 469266 -127 124 -2.38 -238 +463 2 10453 99364 1.39039 298.39039 149.89039 14989.03903 1.39039 298.39038 149.89039 14989.03907 1.39039 298.39039 149.89039 14989.039 2020-01-01 2020-01-02 2020-01-01 00:07:43 2020-01-02 03:36:04 2020-01-01 00:07:43.000 2020-01-02 03:36:04.000 463 99364 49913.5 4991350 463 99364 49913.5 4991350 -32707 32431 4693.66 469366 -126 125 -1.38 -138 +464 2 10454 99365 1.39339 298.39339 149.89339 14989.33933 1.39339 298.3934 149.89339 14989.33922 1.39339 298.39339 149.89339 14989.339 2020-01-01 2020-01-02 2020-01-01 00:07:44 2020-01-02 03:36:05 2020-01-01 00:07:44.000 2020-01-02 03:36:05.000 464 99365 49914.5 4991450 464 99365 49914.5 4991450 -32706 32432 4694.66 469466 -125 126 -0.38 -38 +465 2 10455 99366 1.39639 298.39639 149.89639 14989.63963 1.39639 298.3964 149.89639 14989.63936 1.39639 298.39639 149.89639 14989.639 2020-01-01 2020-01-02 2020-01-01 00:07:45 2020-01-02 03:36:06 2020-01-01 00:07:45.000 2020-01-02 03:36:06.000 465 99366 49915.5 4991550 465 99366 49915.5 4991550 -32705 32433 4695.66 469566 -124 127 0.62 62 +466 2 10456 99367 1.39939 298.39939 149.89939 14989.93993 1.39939 298.3994 149.8994 14989.94011 1.39939 298.39939 149.89939 14989.939 2020-01-01 2020-01-02 2020-01-01 00:07:46 2020-01-02 03:36:07 2020-01-01 00:07:46.000 2020-01-02 03:36:07.000 466 99367 49916.5 4991650 466 99367 49916.5 4991650 -32704 32434 4696.66 469666 -128 127 -0.94 -94 +467 2 10457 99368 1.4024 298.4024 149.9024 14990.24024 1.4024 298.4024 149.9024 14990.24041 1.4024 298.4024 149.9024 14990.24 2020-01-01 2020-01-02 2020-01-01 00:07:47 2020-01-02 03:36:08 2020-01-01 00:07:47.000 2020-01-02 03:36:08.000 467 99368 49917.5 4991750 467 99368 49917.5 4991750 -32703 32435 4697.66 469766 -128 123 -2.5 -250 +468 2 10458 99369 1.4054 298.4054 149.9054 14990.54054 1.4054 298.4054 149.9054 14990.54058 1.4054 298.4054 149.90540000000001 14990.54 2020-01-01 2020-01-02 2020-01-01 00:07:48 2020-01-02 03:36:09 2020-01-01 00:07:48.000 2020-01-02 03:36:09.000 468 99369 49918.5 4991850 468 99369 49918.5 4991850 -32702 32436 4698.66 469866 -127 124 -1.5 -150 +469 2 10459 99370 1.4084 298.4084 149.9084 14990.84084 1.4084 298.40842 149.9084 14990.8407 1.4084 298.4084 149.9084 14990.84 2020-01-01 2020-01-02 2020-01-01 00:07:49 2020-01-02 03:36:10 2020-01-01 00:07:49.000 2020-01-02 03:36:10.000 469 99370 49919.5 4991950 469 99370 49919.5 4991950 -32701 32437 4699.66 469966 -126 125 -0.5 -50 47 2 10037 99947 0.14114 300.14114 150.14114 15164.25525 0.14114 300.14114 150.14114 15164.25545 0.14114 300.14114 150.14114 15164.25514 2020-01-01 2020-01-02 2020-01-01 00:00:47 2020-01-02 03:45:47 2020-01-01 00:00:47.000 2020-01-02 03:45:47.000 47 99947 49997 5049697 47 99947 49997 5049697 -32522 32413 4576.009900990099 462177 -128 127 -1.5742574257425743 -159 -470 2 10460 99371 1.41141 298.41141 149.91141 14991.14114 1.41141 298.4114 149.9114 14991.14099 1.41141 298.41141 149.91141 14991.14100 2020-01-01 2020-01-02 2020-01-01 00:07:50 2020-01-02 03:36:11 2020-01-01 00:07:50.000 2020-01-02 03:36:11.000 470 99371 49920.5 4992050 470 99371 49920.5 4992050 -32700 32438 4700.66 470066 -125 126 0.5 50 -471 2 10461 99372 1.41441 298.41441 149.91441 14991.44144 1.41441 298.41443 149.91441 14991.44159 1.41441 298.41441 149.91441 14991.44100 2020-01-01 2020-01-02 2020-01-01 00:07:51 2020-01-02 03:36:12 2020-01-01 00:07:51.000 2020-01-02 03:36:12.000 471 99372 49921.5 4992150 471 99372 49921.5 4992150 -32699 32439 4701.66 470166 -124 127 1.5 150 -472 2 10462 99373 1.41741 298.41741 149.91741 14991.74174 1.41741 298.41742 149.91741 14991.74188 1.41741 298.41741 149.91741 14991.74100 2020-01-01 2020-01-02 2020-01-01 00:07:52 2020-01-02 03:36:13 2020-01-01 00:07:52.000 2020-01-02 03:36:13.000 472 99373 49922.5 4992250 472 99373 49922.5 4992250 -32698 32440 4702.66 470266 -128 127 -0.06 -6 -473 2 10463 99374 1.42042 298.42042 149.92042 14992.04204 1.42042 298.4204 149.92042 14992.04204 1.42042 298.42042 149.92042 14992.04200 2020-01-01 2020-01-02 2020-01-01 00:07:53 2020-01-02 03:36:14 2020-01-01 00:07:53.000 2020-01-02 03:36:14.000 473 99374 49923.5 4992350 473 99374 49923.5 4992350 -32697 32441 4703.66 470366 -128 123 -1.62 -162 -474 2 10464 99375 1.42342 298.42342 149.92342 14992.34234 1.42342 298.42343 149.92342 14992.34216 1.42342 298.42342 149.92342 14992.34200 2020-01-01 2020-01-02 2020-01-01 00:07:54 2020-01-02 03:36:15 2020-01-01 00:07:54.000 2020-01-02 03:36:15.000 474 99375 49924.5 4992450 474 99375 49924.5 4992450 -32696 32442 4704.66 470466 -127 124 -0.62 -62 -475 2 10465 99376 1.42642 298.42642 149.92642 14992.64264 1.42642 298.42642 149.92642 14992.64246 1.42642 298.42642 149.92642 14992.64200 2020-01-01 2020-01-02 2020-01-01 00:07:55 2020-01-02 03:36:16 2020-01-01 00:07:55.000 2020-01-02 03:36:16.000 475 99376 49925.5 4992550 475 99376 49925.5 4992550 -32695 32443 4705.66 470566 -126 125 0.38 38 -476 2 10466 99377 1.42942 298.42942 149.92942 14992.94294 1.42942 298.42944 149.92943 14992.94305 1.42942 298.42942 149.92942 14992.94200 2020-01-01 2020-01-02 2020-01-01 00:07:56 2020-01-02 03:36:17 2020-01-01 00:07:56.000 2020-01-02 03:36:17.000 476 99377 49926.5 4992650 476 99377 49926.5 4992650 -32694 32444 4706.66 470666 -125 126 1.38 138 -477 2 10467 99378 1.43243 298.43243 149.93243 14993.24324 1.43243 298.43243 149.93243 14993.24338 1.43243 298.43243 149.93243 14993.24300 2020-01-01 2020-01-02 2020-01-01 00:07:57 2020-01-02 03:36:18 2020-01-01 00:07:57.000 2020-01-02 03:36:18.000 477 99378 49927.5 4992750 477 99378 49927.5 4992750 -32693 32445 4707.66 470766 -124 127 2.38 238 -478 2 10468 99379 1.43543 298.43543 149.93543 14993.54354 1.43543 298.43542 149.93543 14993.54352 1.43543 298.43543 149.93543 14993.54300 2020-01-01 2020-01-02 2020-01-01 00:07:58 2020-01-02 03:36:19 2020-01-01 00:07:58.000 2020-01-02 03:36:19.000 478 99379 49928.5 4992850 478 99379 49928.5 4992850 -32692 32446 4708.66 470866 -128 127 0.82 82 -479 2 10469 99380 1.43843 298.43843 149.93843 14993.84384 1.43843 298.43845 149.93844 14993.84427 1.43843 298.43843 149.93843 14993.84300 2020-01-01 2020-01-02 2020-01-01 00:07:59 2020-01-02 03:36:20 2020-01-01 00:07:59.000 2020-01-02 03:36:20.000 479 99380 49929.5 4992950 479 99380 49929.5 4992950 -32691 32447 4709.66 470966 -128 127 -0.74 -74 +470 2 10460 99371 1.41141 298.41141 149.91141 14991.14114 1.41141 298.4114 149.9114 14991.14099 1.41141 298.41141 149.91141 14991.141 2020-01-01 2020-01-02 2020-01-01 00:07:50 2020-01-02 03:36:11 2020-01-01 00:07:50.000 2020-01-02 03:36:11.000 470 99371 49920.5 4992050 470 99371 49920.5 4992050 -32700 32438 4700.66 470066 -125 126 0.5 50 +471 2 10461 99372 1.41441 298.41441 149.91441 14991.44144 1.41441 298.41443 149.91441 14991.44159 1.41441 298.41441 149.91441 14991.441 2020-01-01 2020-01-02 2020-01-01 00:07:51 2020-01-02 03:36:12 2020-01-01 00:07:51.000 2020-01-02 03:36:12.000 471 99372 49921.5 4992150 471 99372 49921.5 4992150 -32699 32439 4701.66 470166 -124 127 1.5 150 +472 2 10462 99373 1.41741 298.41741 149.91741 14991.74174 1.41741 298.41742 149.91741 14991.74188 1.41741 298.41741 149.91741 14991.741 2020-01-01 2020-01-02 2020-01-01 00:07:52 2020-01-02 03:36:13 2020-01-01 00:07:52.000 2020-01-02 03:36:13.000 472 99373 49922.5 4992250 472 99373 49922.5 4992250 -32698 32440 4702.66 470266 -128 127 -0.06 -6 +473 2 10463 99374 1.42042 298.42042 149.92042 14992.04204 1.42042 298.4204 149.92042 14992.04204 1.42042 298.42042 149.92042 14992.042 2020-01-01 2020-01-02 2020-01-01 00:07:53 2020-01-02 03:36:14 2020-01-01 00:07:53.000 2020-01-02 03:36:14.000 473 99374 49923.5 4992350 473 99374 49923.5 4992350 -32697 32441 4703.66 470366 -128 123 -1.62 -162 +474 2 10464 99375 1.42342 298.42342 149.92342 14992.34234 1.42342 298.42343 149.92342 14992.34216 1.42342 298.42342 149.92342 14992.342 2020-01-01 2020-01-02 2020-01-01 00:07:54 2020-01-02 03:36:15 2020-01-01 00:07:54.000 2020-01-02 03:36:15.000 474 99375 49924.5 4992450 474 99375 49924.5 4992450 -32696 32442 4704.66 470466 -127 124 -0.62 -62 +475 2 10465 99376 1.42642 298.42642 149.92642 14992.64264 1.42642 298.42642 149.92642 14992.64246 1.42642 298.42642 149.92642 14992.642 2020-01-01 2020-01-02 2020-01-01 00:07:55 2020-01-02 03:36:16 2020-01-01 00:07:55.000 2020-01-02 03:36:16.000 475 99376 49925.5 4992550 475 99376 49925.5 4992550 -32695 32443 4705.66 470566 -126 125 0.38 38 +476 2 10466 99377 1.42942 298.42942 149.92942 14992.94294 1.42942 298.42944 149.92943 14992.94305 1.42942 298.42942 149.92942 14992.942 2020-01-01 2020-01-02 2020-01-01 00:07:56 2020-01-02 03:36:17 2020-01-01 00:07:56.000 2020-01-02 03:36:17.000 476 99377 49926.5 4992650 476 99377 49926.5 4992650 -32694 32444 4706.66 470666 -125 126 1.38 138 +477 2 10467 99378 1.43243 298.43243 149.93243 14993.24324 1.43243 298.43243 149.93243 14993.24338 1.43243 298.43243 149.93243 14993.243 2020-01-01 2020-01-02 2020-01-01 00:07:57 2020-01-02 03:36:18 2020-01-01 00:07:57.000 2020-01-02 03:36:18.000 477 99378 49927.5 4992750 477 99378 49927.5 4992750 -32693 32445 4707.66 470766 -124 127 2.38 238 +478 2 10468 99379 1.43543 298.43543 149.93543 14993.54354 1.43543 298.43542 149.93543 14993.54352 1.43543 298.43543 149.93543 14993.543 2020-01-01 2020-01-02 2020-01-01 00:07:58 2020-01-02 03:36:19 2020-01-01 00:07:58.000 2020-01-02 03:36:19.000 478 99379 49928.5 4992850 478 99379 49928.5 4992850 -32692 32446 4708.66 470866 -128 127 0.82 82 +479 2 10469 99380 1.43843 298.43843 149.93843 14993.84384 1.43843 298.43845 149.93844 14993.84427 1.43843 298.43843 149.93843 14993.843 2020-01-01 2020-01-02 2020-01-01 00:07:59 2020-01-02 03:36:20 2020-01-01 00:07:59.000 2020-01-02 03:36:20.000 479 99380 49929.5 4992950 479 99380 49929.5 4992950 -32691 32447 4709.66 470966 -128 127 -0.74 -74 48 2 10038 99948 0.14414 300.14414 150.14414 15164.55855 0.14414 300.14413 150.14414 15164.55863 0.14414 300.14414 150.14414 15164.55814 2020-01-01 2020-01-02 2020-01-01 00:00:48 2020-01-02 03:45:48 2020-01-01 00:00:48.000 2020-01-02 03:45:48.000 48 99948 49998 5049798 48 99948 49998 5049798 -32521 32414 4577.009900990099 462278 -128 127 -3.108910891089109 -314 -480 2 10470 99381 1.44144 298.44144 149.94144 14994.14414 1.44144 298.44144 149.94143 14994.14392 1.44144 298.44144 149.94144 14994.14400 2020-01-01 2020-01-02 2020-01-01 00:08:00 2020-01-02 03:36:21 2020-01-01 00:08:00.000 2020-01-02 03:36:21.000 480 99381 49930.5 4993050 480 99381 49930.5 4993050 -32690 32448 4710.66 471066 -128 124 -2.3 -230 -481 2 10471 99382 1.44444 298.44444 149.94444 14994.44444 1.44444 298.44446 149.94444 14994.44452 1.44444 298.44444 149.94444 14994.44400 2020-01-01 2020-01-02 2020-01-01 00:08:01 2020-01-02 03:36:22 2020-01-01 00:08:01.000 2020-01-02 03:36:22.000 481 99382 49931.5 4993150 481 99382 49931.5 4993150 -32689 32449 4711.66 471166 -127 125 -1.3 -130 -482 2 10472 99383 1.44744 298.44744 149.94744 14994.74474 1.44744 298.44745 149.94744 14994.74485 1.44744 298.44744 149.94744 14994.74400 2020-01-01 2020-01-02 2020-01-01 00:08:02 2020-01-02 03:36:23 2020-01-01 00:08:02.000 2020-01-02 03:36:23.000 482 99383 49932.5 4993250 482 99383 49932.5 4993250 -32688 32450 4712.66 471266 -126 126 -0.3 -30 -483 2 10473 99384 1.45045 298.45045 149.95045 14995.04504 1.45045 298.45044 149.95044 14995.04499 1.45045 298.45045 149.95045 14995.04500 2020-01-01 2020-01-02 2020-01-01 00:08:03 2020-01-02 03:36:24 2020-01-01 00:08:03.000 2020-01-02 03:36:24.000 483 99384 49933.5 4993350 483 99384 49933.5 4993350 -32687 32451 4713.66 471366 -125 127 0.7 70 -484 2 10474 99385 1.45345 298.45345 149.95345 14995.34534 1.45345 298.45346 149.95345 14995.34574 1.45345 298.45345 149.95345 14995.34500 2020-01-01 2020-01-02 2020-01-01 00:08:04 2020-01-02 03:36:25 2020-01-01 00:08:04.000 2020-01-02 03:36:25.000 484 99385 49934.5 4993450 484 99385 49934.5 4993450 -32686 32452 4714.66 471466 -128 127 -0.86 -86 -485 2 10475 99386 1.45645 298.45645 149.95645 14995.64564 1.45645 298.45645 149.95645 14995.6454 1.45645 298.45645 149.95645000000002 14995.64500 2020-01-01 2020-01-02 2020-01-01 00:08:05 2020-01-02 03:36:26 2020-01-01 00:08:05.000 2020-01-02 03:36:26.000 485 99386 49935.5 4993550 485 99386 49935.5 4993550 -32685 32453 4715.66 471566 -128 127 -2.42 -242 -486 2 10476 99387 1.45945 298.45945 149.95945 14995.94594 1.45945 298.45947 149.95946 14995.94602 1.45945 298.45945 149.95945 14995.94500 2020-01-01 2020-01-02 2020-01-01 00:08:06 2020-01-02 03:36:27 2020-01-01 00:08:06.000 2020-01-02 03:36:27.000 486 99387 49936.5 4993650 486 99387 49936.5 4993650 -32684 32454 4716.66 471666 -128 123 -3.98 -398 -487 2 10477 99388 1.46246 298.46246 149.96246 14996.24624 1.46246 298.46246 149.96246 14996.24633 1.46246 298.46246 149.96246 14996.24600 2020-01-01 2020-01-02 2020-01-01 00:08:07 2020-01-02 03:36:28 2020-01-01 00:08:07.000 2020-01-02 03:36:28.000 487 99388 49937.5 4993750 487 99388 49937.5 4993750 -32683 32455 4717.66 471766 -127 124 -2.98 -298 -488 2 10478 99389 1.46546 298.46546 149.96546 14996.54654 1.46546 298.46545 149.96546 14996.54645 1.46546 298.46546 149.96546 14996.54600 2020-01-01 2020-01-02 2020-01-01 00:08:08 2020-01-02 03:36:29 2020-01-01 00:08:08.000 2020-01-02 03:36:29.000 488 99389 49938.5 4993850 488 99389 49938.5 4993850 -32682 32456 4718.66 471866 -126 125 -1.98 -198 -489 2 10479 99390 1.46846 298.46846 149.96846 14996.84684 1.46846 298.46848 149.96847 14996.84721 1.46846 298.46846 149.96846 14996.84600 2020-01-01 2020-01-02 2020-01-01 00:08:09 2020-01-02 03:36:30 2020-01-01 00:08:09.000 2020-01-02 03:36:30.000 489 99390 49939.5 4993950 489 99390 49939.5 4993950 -32681 32457 4719.66 471966 -125 126 -0.98 -98 +480 2 10470 99381 1.44144 298.44144 149.94144 14994.14414 1.44144 298.44144 149.94143 14994.14392 1.44144 298.44144 149.94144 14994.144 2020-01-01 2020-01-02 2020-01-01 00:08:00 2020-01-02 03:36:21 2020-01-01 00:08:00.000 2020-01-02 03:36:21.000 480 99381 49930.5 4993050 480 99381 49930.5 4993050 -32690 32448 4710.66 471066 -128 124 -2.3 -230 +481 2 10471 99382 1.44444 298.44444 149.94444 14994.44444 1.44444 298.44446 149.94444 14994.44452 1.44444 298.44444 149.94444 14994.444 2020-01-01 2020-01-02 2020-01-01 00:08:01 2020-01-02 03:36:22 2020-01-01 00:08:01.000 2020-01-02 03:36:22.000 481 99382 49931.5 4993150 481 99382 49931.5 4993150 -32689 32449 4711.66 471166 -127 125 -1.3 -130 +482 2 10472 99383 1.44744 298.44744 149.94744 14994.74474 1.44744 298.44745 149.94744 14994.74485 1.44744 298.44744 149.94744 14994.744 2020-01-01 2020-01-02 2020-01-01 00:08:02 2020-01-02 03:36:23 2020-01-01 00:08:02.000 2020-01-02 03:36:23.000 482 99383 49932.5 4993250 482 99383 49932.5 4993250 -32688 32450 4712.66 471266 -126 126 -0.3 -30 +483 2 10473 99384 1.45045 298.45045 149.95045 14995.04504 1.45045 298.45044 149.95044 14995.04499 1.45045 298.45045 149.95045 14995.045 2020-01-01 2020-01-02 2020-01-01 00:08:03 2020-01-02 03:36:24 2020-01-01 00:08:03.000 2020-01-02 03:36:24.000 483 99384 49933.5 4993350 483 99384 49933.5 4993350 -32687 32451 4713.66 471366 -125 127 0.7 70 +484 2 10474 99385 1.45345 298.45345 149.95345 14995.34534 1.45345 298.45346 149.95345 14995.34574 1.45345 298.45345 149.95345 14995.345 2020-01-01 2020-01-02 2020-01-01 00:08:04 2020-01-02 03:36:25 2020-01-01 00:08:04.000 2020-01-02 03:36:25.000 484 99385 49934.5 4993450 484 99385 49934.5 4993450 -32686 32452 4714.66 471466 -128 127 -0.86 -86 +485 2 10475 99386 1.45645 298.45645 149.95645 14995.64564 1.45645 298.45645 149.95645 14995.6454 1.45645 298.45645 149.95645000000002 14995.645 2020-01-01 2020-01-02 2020-01-01 00:08:05 2020-01-02 03:36:26 2020-01-01 00:08:05.000 2020-01-02 03:36:26.000 485 99386 49935.5 4993550 485 99386 49935.5 4993550 -32685 32453 4715.66 471566 -128 127 -2.42 -242 +486 2 10476 99387 1.45945 298.45945 149.95945 14995.94594 1.45945 298.45947 149.95946 14995.94602 1.45945 298.45945 149.95945 14995.945 2020-01-01 2020-01-02 2020-01-01 00:08:06 2020-01-02 03:36:27 2020-01-01 00:08:06.000 2020-01-02 03:36:27.000 486 99387 49936.5 4993650 486 99387 49936.5 4993650 -32684 32454 4716.66 471666 -128 123 -3.98 -398 +487 2 10477 99388 1.46246 298.46246 149.96246 14996.24624 1.46246 298.46246 149.96246 14996.24633 1.46246 298.46246 149.96246 14996.246 2020-01-01 2020-01-02 2020-01-01 00:08:07 2020-01-02 03:36:28 2020-01-01 00:08:07.000 2020-01-02 03:36:28.000 487 99388 49937.5 4993750 487 99388 49937.5 4993750 -32683 32455 4717.66 471766 -127 124 -2.98 -298 +488 2 10478 99389 1.46546 298.46546 149.96546 14996.54654 1.46546 298.46545 149.96546 14996.54645 1.46546 298.46546 149.96546 14996.546 2020-01-01 2020-01-02 2020-01-01 00:08:08 2020-01-02 03:36:29 2020-01-01 00:08:08.000 2020-01-02 03:36:29.000 488 99389 49938.5 4993850 488 99389 49938.5 4993850 -32682 32456 4718.66 471866 -126 125 -1.98 -198 +489 2 10479 99390 1.46846 298.46846 149.96846 14996.84684 1.46846 298.46848 149.96847 14996.84721 1.46846 298.46846 149.96846 14996.846 2020-01-01 2020-01-02 2020-01-01 00:08:09 2020-01-02 03:36:30 2020-01-01 00:08:09.000 2020-01-02 03:36:30.000 489 99390 49939.5 4993950 489 99390 49939.5 4993950 -32681 32457 4719.66 471966 -125 126 -0.98 -98 49 2 10039 99949 0.14714 300.14714 150.14714 15164.86186 0.14714 300.14716 150.14714 15164.86173 0.14714 300.14714 150.14714 15164.86114 2020-01-01 2020-01-02 2020-01-01 00:00:49 2020-01-02 03:45:49 2020-01-01 00:00:49.000 2020-01-02 03:45:49.000 49 99949 49999 5049899 49 99949 49999 5049899 -32520 32415 4578.009900990099 462379 -128 123 -4.643564356435643 -469 -490 2 10480 99391 1.47147 298.47147 149.97147 14997.14714 1.47147 298.47147 149.97146 14997.14687 1.47147 298.47147 149.97147 14997.14700 2020-01-01 2020-01-02 2020-01-01 00:08:10 2020-01-02 03:36:31 2020-01-01 00:08:10.000 2020-01-02 03:36:31.000 490 99391 49940.5 4994050 490 99391 49940.5 4994050 -32680 32458 4720.66 472066 -124 127 0.02 2 -491 2 10481 99392 1.47447 298.47447 149.97447 14997.44744 1.47447 298.4745 149.97447 14997.44749 1.47447 298.47447 149.97447 14997.44700 2020-01-01 2020-01-02 2020-01-01 00:08:11 2020-01-02 03:36:32 2020-01-01 00:08:11.000 2020-01-02 03:36:32.000 491 99392 49941.5 4994150 491 99392 49941.5 4994150 -32679 32459 4721.66 472166 -128 127 -1.54 -154 -492 2 10482 99393 1.47747 298.47747 149.97747 14997.74774 1.47747 298.47748 149.97747 14997.74779 1.47747 298.47747 149.97746999999998 14997.74700 2020-01-01 2020-01-02 2020-01-01 00:08:12 2020-01-02 03:36:33 2020-01-01 00:08:12.000 2020-01-02 03:36:33.000 492 99393 49942.5 4994250 492 99393 49942.5 4994250 -32678 32460 4722.66 472266 -128 123 -3.1 -310 -493 2 10483 99394 1.48048 298.48048 149.98048 14998.04804 1.48048 298.48047 149.98048 14998.04809 1.48048 298.48048 149.98048 14998.04800 2020-01-01 2020-01-02 2020-01-01 00:08:13 2020-01-02 03:36:34 2020-01-01 00:08:13.000 2020-01-02 03:36:34.000 493 99394 49943.5 4994350 493 99394 49943.5 4994350 -32677 32461 4723.66 472366 -127 124 -2.1 -210 -494 2 10484 99395 1.48348 298.48348 149.98348 14998.34834 1.48348 298.4835 149.98348 14998.34868 1.48348 298.48348 149.98348 14998.34800 2020-01-01 2020-01-02 2020-01-01 00:08:14 2020-01-02 03:36:35 2020-01-01 00:08:14.000 2020-01-02 03:36:35.000 494 99395 49944.5 4994450 494 99395 49944.5 4994450 -32676 32462 4724.66 472466 -126 125 -1.1 -110 -495 2 10485 99396 1.48648 298.48648 149.98648 14998.64864 1.48648 298.48648 149.98648 14998.64837 1.48648 298.48648 149.98648 14998.64800 2020-01-01 2020-01-02 2020-01-01 00:08:15 2020-01-02 03:36:36 2020-01-01 00:08:15.000 2020-01-02 03:36:36.000 495 99396 49945.5 4994550 495 99396 49945.5 4994550 -32675 32463 4725.66 472566 -125 126 -0.1 -10 -496 2 10486 99397 1.48948 298.48948 149.98948 14998.94894 1.48948 298.4895 149.98948 14998.94896 1.48948 298.48948 149.98948000000001 14998.94800 2020-01-01 2020-01-02 2020-01-01 00:08:16 2020-01-02 03:36:37 2020-01-01 00:08:16.000 2020-01-02 03:36:37.000 496 99397 49946.5 4994650 496 99397 49946.5 4994650 -32674 32464 4726.66 472666 -124 127 0.9 90 -497 2 10487 99398 1.49249 298.49249 149.99249 14999.24924 1.49249 298.4925 149.99249 14999.24926 1.49249 298.49249 149.99249 14999.24900 2020-01-01 2020-01-02 2020-01-01 00:08:17 2020-01-02 03:36:38 2020-01-01 00:08:17.000 2020-01-02 03:36:38.000 497 99398 49947.5 4994750 497 99398 49947.5 4994750 -32673 32465 4727.66 472766 -128 127 -0.66 -66 -498 2 10488 99399 1.49549 298.49549 149.99549 14999.54954 1.49549 298.49548 149.99549 14999.54956 1.49549 298.49549 149.99549000000002 14999.54900 2020-01-01 2020-01-02 2020-01-01 00:08:18 2020-01-02 03:36:39 2020-01-01 00:08:18.000 2020-01-02 03:36:39.000 498 99399 49948.5 4994850 498 99399 49948.5 4994850 -32672 32466 4728.66 472866 -128 123 -2.22 -222 -499 2 10489 99400 1.49849 298.49849 149.99849 14999.84984 1.49849 298.4985 149.9985 14999.85015 1.49849 298.49849 149.99849 14999.84900 2020-01-01 2020-01-02 2020-01-01 00:08:19 2020-01-02 03:36:40 2020-01-01 00:08:19.000 2020-01-02 03:36:40.000 499 99400 49949.5 4994950 499 99400 49949.5 4994950 -32671 32467 4729.66 472966 -127 124 -1.22 -122 +490 2 10480 99391 1.47147 298.47147 149.97147 14997.14714 1.47147 298.47147 149.97146 14997.14687 1.47147 298.47147 149.97147 14997.147 2020-01-01 2020-01-02 2020-01-01 00:08:10 2020-01-02 03:36:31 2020-01-01 00:08:10.000 2020-01-02 03:36:31.000 490 99391 49940.5 4994050 490 99391 49940.5 4994050 -32680 32458 4720.66 472066 -124 127 0.02 2 +491 2 10481 99392 1.47447 298.47447 149.97447 14997.44744 1.47447 298.4745 149.97447 14997.44749 1.47447 298.47447 149.97447 14997.447 2020-01-01 2020-01-02 2020-01-01 00:08:11 2020-01-02 03:36:32 2020-01-01 00:08:11.000 2020-01-02 03:36:32.000 491 99392 49941.5 4994150 491 99392 49941.5 4994150 -32679 32459 4721.66 472166 -128 127 -1.54 -154 +492 2 10482 99393 1.47747 298.47747 149.97747 14997.74774 1.47747 298.47748 149.97747 14997.74779 1.47747 298.47747 149.97746999999998 14997.747 2020-01-01 2020-01-02 2020-01-01 00:08:12 2020-01-02 03:36:33 2020-01-01 00:08:12.000 2020-01-02 03:36:33.000 492 99393 49942.5 4994250 492 99393 49942.5 4994250 -32678 32460 4722.66 472266 -128 123 -3.1 -310 +493 2 10483 99394 1.48048 298.48048 149.98048 14998.04804 1.48048 298.48047 149.98048 14998.04809 1.48048 298.48048 149.98048 14998.048 2020-01-01 2020-01-02 2020-01-01 00:08:13 2020-01-02 03:36:34 2020-01-01 00:08:13.000 2020-01-02 03:36:34.000 493 99394 49943.5 4994350 493 99394 49943.5 4994350 -32677 32461 4723.66 472366 -127 124 -2.1 -210 +494 2 10484 99395 1.48348 298.48348 149.98348 14998.34834 1.48348 298.4835 149.98348 14998.34868 1.48348 298.48348 149.98348 14998.348 2020-01-01 2020-01-02 2020-01-01 00:08:14 2020-01-02 03:36:35 2020-01-01 00:08:14.000 2020-01-02 03:36:35.000 494 99395 49944.5 4994450 494 99395 49944.5 4994450 -32676 32462 4724.66 472466 -126 125 -1.1 -110 +495 2 10485 99396 1.48648 298.48648 149.98648 14998.64864 1.48648 298.48648 149.98648 14998.64837 1.48648 298.48648 149.98648 14998.648 2020-01-01 2020-01-02 2020-01-01 00:08:15 2020-01-02 03:36:36 2020-01-01 00:08:15.000 2020-01-02 03:36:36.000 495 99396 49945.5 4994550 495 99396 49945.5 4994550 -32675 32463 4725.66 472566 -125 126 -0.1 -10 +496 2 10486 99397 1.48948 298.48948 149.98948 14998.94894 1.48948 298.4895 149.98948 14998.94896 1.48948 298.48948 149.98948000000001 14998.948 2020-01-01 2020-01-02 2020-01-01 00:08:16 2020-01-02 03:36:37 2020-01-01 00:08:16.000 2020-01-02 03:36:37.000 496 99397 49946.5 4994650 496 99397 49946.5 4994650 -32674 32464 4726.66 472666 -124 127 0.9 90 +497 2 10487 99398 1.49249 298.49249 149.99249 14999.24924 1.49249 298.4925 149.99249 14999.24926 1.49249 298.49249 149.99249 14999.249 2020-01-01 2020-01-02 2020-01-01 00:08:17 2020-01-02 03:36:38 2020-01-01 00:08:17.000 2020-01-02 03:36:38.000 497 99398 49947.5 4994750 497 99398 49947.5 4994750 -32673 32465 4727.66 472766 -128 127 -0.66 -66 +498 2 10488 99399 1.49549 298.49549 149.99549 14999.54954 1.49549 298.49548 149.99549 14999.54956 1.49549 298.49549 149.99549000000002 14999.549 2020-01-01 2020-01-02 2020-01-01 00:08:18 2020-01-02 03:36:39 2020-01-01 00:08:18.000 2020-01-02 03:36:39.000 498 99399 49948.5 4994850 498 99399 49948.5 4994850 -32672 32466 4728.66 472866 -128 123 -2.22 -222 +499 2 10489 99400 1.49849 298.49849 149.99849 14999.84984 1.49849 298.4985 149.9985 14999.85015 1.49849 298.49849 149.99849 14999.849 2020-01-01 2020-01-02 2020-01-01 00:08:19 2020-01-02 03:36:40 2020-01-01 00:08:19.000 2020-01-02 03:36:40.000 499 99400 49949.5 4994950 499 99400 49949.5 4994950 -32671 32467 4729.66 472966 -127 124 -1.22 -122 5 2 1004 9995 0.01501 300.01501 150.01501 15151.51651 0.01501 300.015 150.01501 15151.51648 0.01501 300.01501 150.01501 15151.51601 2020-01-01 2020-01-02 2020-01-01 00:00:05 2020-01-02 03:45:05 2020-01-01 00:00:05.000 2020-01-02 03:45:05.000 5 99905 49955 5045455 5 99905 49955 5045455 -32564 32371 4534.009900990099 457935 -128 123 -3.01980198019802 -305 50 2 10040 99950 0.15015 300.15015 150.15015 15165.16516 0.15015 300.15015 150.15014 15165.16487 0.15015 300.15015 150.15015 15165.16515 2020-01-01 2020-01-02 2020-01-01 00:00:50 2020-01-02 03:45:50 2020-01-01 00:00:50.000 2020-01-02 03:45:50.000 50 99950 50000 5050000 50 99950 50000 5050000 -32519 32416 4579.009900990099 462480 -127 124 -3.6435643564356437 -368 -500 2 10490 99401 1.5015 298.5015 150.0015 15000.15015 1.5015 298.5015 150.00149 15000.14984 1.50150 298.50150 150.0015 15000.15000 2020-01-01 2020-01-02 2020-01-01 00:08:20 2020-01-02 03:36:41 2020-01-01 00:08:20.000 2020-01-02 03:36:41.000 500 99401 49950.5 4995050 500 99401 49950.5 4995050 -32670 32468 4730.66 473066 -126 125 -0.22 -22 -501 2 10491 99402 1.5045 298.5045 150.0045 15000.45045 1.5045 298.50452 150.0045 15000.45043 1.50450 298.50450 150.0045 15000.45000 2020-01-01 2020-01-02 2020-01-01 00:08:21 2020-01-02 03:36:42 2020-01-01 00:08:21.000 2020-01-02 03:36:42.000 501 99402 49951.5 4995150 501 99402 49951.5 4995150 -32669 32469 4731.66 473166 -125 126 0.78 78 -502 2 10492 99403 1.5075 298.5075 150.0075 15000.75075 1.5075 298.5075 150.0075 15000.75073 1.50750 298.50750 150.0075 15000.75000 2020-01-01 2020-01-02 2020-01-01 00:08:22 2020-01-02 03:36:43 2020-01-01 00:08:22.000 2020-01-02 03:36:43.000 502 99403 49952.5 4995250 502 99403 49952.5 4995250 -32668 32470 4732.66 473266 -124 127 1.78 178 -503 2 10493 99404 1.51051 298.51051 150.01051 15001.05105 1.51051 298.5105 150.01051 15001.05103 1.51051 298.51051 150.01050999999998 15001.05100 2020-01-01 2020-01-02 2020-01-01 00:08:23 2020-01-02 03:36:44 2020-01-01 00:08:23.000 2020-01-02 03:36:44.000 503 99404 49953.5 4995350 503 99404 49953.5 4995350 -32667 32471 4733.66 473366 -128 127 0.22 22 -504 2 10494 99405 1.51351 298.51351 150.01351 15001.35135 1.51351 298.51352 150.01351 15001.35162 1.51351 298.51351 150.01351 15001.35100 2020-01-01 2020-01-02 2020-01-01 00:08:24 2020-01-02 03:36:45 2020-01-01 00:08:24.000 2020-01-02 03:36:45.000 504 99405 49954.5 4995450 504 99405 49954.5 4995450 -32666 32472 4734.66 473466 -128 127 -1.34 -134 -505 2 10495 99406 1.51651 298.51651 150.01651 15001.65165 1.51651 298.5165 150.01651 15001.65131 1.51651 298.51651 150.01651 15001.65100 2020-01-01 2020-01-02 2020-01-01 00:08:25 2020-01-02 03:36:46 2020-01-01 00:08:25.000 2020-01-02 03:36:46.000 505 99406 49955.5 4995550 505 99406 49955.5 4995550 -32665 32473 4735.66 473566 -128 124 -2.9 -290 -506 2 10496 99407 1.51951 298.51951 150.01951 15001.95195 1.51951 298.51953 150.01951 15001.9519 1.51951 298.51951 150.01951 15001.95100 2020-01-01 2020-01-02 2020-01-01 00:08:26 2020-01-02 03:36:47 2020-01-01 00:08:26.000 2020-01-02 03:36:47.000 506 99407 49956.5 4995650 506 99407 49956.5 4995650 -32664 32474 4736.66 473666 -127 125 -1.9 -190 -507 2 10497 99408 1.52252 298.52252 150.02252 15002.25225 1.52252 298.52252 150.02252 15002.2522 1.52252 298.52252 150.02252000000001 15002.25200 2020-01-01 2020-01-02 2020-01-01 00:08:27 2020-01-02 03:36:48 2020-01-01 00:08:27.000 2020-01-02 03:36:48.000 507 99408 49957.5 4995750 507 99408 49957.5 4995750 -32663 32475 4737.66 473766 -126 126 -0.9 -90 -508 2 10498 99409 1.52552 298.52552 150.02552 15002.55255 1.52552 298.5255 150.02552 15002.5525 1.52552 298.52552 150.02552 15002.55200 2020-01-01 2020-01-02 2020-01-01 00:08:28 2020-01-02 03:36:49 2020-01-01 00:08:28.000 2020-01-02 03:36:49.000 508 99409 49958.5 4995850 508 99409 49958.5 4995850 -32662 32476 4738.66 473866 -125 127 0.1 10 -509 2 10499 99410 1.52852 298.52852 150.02852 15002.85285 1.52852 298.52853 150.02853 15002.85312 1.52852 298.52852 150.02852000000001 15002.85200 2020-01-01 2020-01-02 2020-01-01 00:08:29 2020-01-02 03:36:50 2020-01-01 00:08:29.000 2020-01-02 03:36:50.000 509 99410 49959.5 4995950 509 99410 49959.5 4995950 -32661 32477 4739.66 473966 -128 127 -1.46 -146 +500 2 10490 99401 1.5015 298.5015 150.0015 15000.15015 1.5015 298.5015 150.00149 15000.14984 1.5015 298.5015 150.0015 15000.15 2020-01-01 2020-01-02 2020-01-01 00:08:20 2020-01-02 03:36:41 2020-01-01 00:08:20.000 2020-01-02 03:36:41.000 500 99401 49950.5 4995050 500 99401 49950.5 4995050 -32670 32468 4730.66 473066 -126 125 -0.22 -22 +501 2 10491 99402 1.5045 298.5045 150.0045 15000.45045 1.5045 298.50452 150.0045 15000.45043 1.5045 298.5045 150.0045 15000.45 2020-01-01 2020-01-02 2020-01-01 00:08:21 2020-01-02 03:36:42 2020-01-01 00:08:21.000 2020-01-02 03:36:42.000 501 99402 49951.5 4995150 501 99402 49951.5 4995150 -32669 32469 4731.66 473166 -125 126 0.78 78 +502 2 10492 99403 1.5075 298.5075 150.0075 15000.75075 1.5075 298.5075 150.0075 15000.75073 1.5075 298.5075 150.0075 15000.75 2020-01-01 2020-01-02 2020-01-01 00:08:22 2020-01-02 03:36:43 2020-01-01 00:08:22.000 2020-01-02 03:36:43.000 502 99403 49952.5 4995250 502 99403 49952.5 4995250 -32668 32470 4732.66 473266 -124 127 1.78 178 +503 2 10493 99404 1.51051 298.51051 150.01051 15001.05105 1.51051 298.5105 150.01051 15001.05103 1.51051 298.51051 150.01050999999998 15001.051 2020-01-01 2020-01-02 2020-01-01 00:08:23 2020-01-02 03:36:44 2020-01-01 00:08:23.000 2020-01-02 03:36:44.000 503 99404 49953.5 4995350 503 99404 49953.5 4995350 -32667 32471 4733.66 473366 -128 127 0.22 22 +504 2 10494 99405 1.51351 298.51351 150.01351 15001.35135 1.51351 298.51352 150.01351 15001.35162 1.51351 298.51351 150.01351 15001.351 2020-01-01 2020-01-02 2020-01-01 00:08:24 2020-01-02 03:36:45 2020-01-01 00:08:24.000 2020-01-02 03:36:45.000 504 99405 49954.5 4995450 504 99405 49954.5 4995450 -32666 32472 4734.66 473466 -128 127 -1.34 -134 +505 2 10495 99406 1.51651 298.51651 150.01651 15001.65165 1.51651 298.5165 150.01651 15001.65131 1.51651 298.51651 150.01651 15001.651 2020-01-01 2020-01-02 2020-01-01 00:08:25 2020-01-02 03:36:46 2020-01-01 00:08:25.000 2020-01-02 03:36:46.000 505 99406 49955.5 4995550 505 99406 49955.5 4995550 -32665 32473 4735.66 473566 -128 124 -2.9 -290 +506 2 10496 99407 1.51951 298.51951 150.01951 15001.95195 1.51951 298.51953 150.01951 15001.9519 1.51951 298.51951 150.01951 15001.951 2020-01-01 2020-01-02 2020-01-01 00:08:26 2020-01-02 03:36:47 2020-01-01 00:08:26.000 2020-01-02 03:36:47.000 506 99407 49956.5 4995650 506 99407 49956.5 4995650 -32664 32474 4736.66 473666 -127 125 -1.9 -190 +507 2 10497 99408 1.52252 298.52252 150.02252 15002.25225 1.52252 298.52252 150.02252 15002.2522 1.52252 298.52252 150.02252000000001 15002.252 2020-01-01 2020-01-02 2020-01-01 00:08:27 2020-01-02 03:36:48 2020-01-01 00:08:27.000 2020-01-02 03:36:48.000 507 99408 49957.5 4995750 507 99408 49957.5 4995750 -32663 32475 4737.66 473766 -126 126 -0.9 -90 +508 2 10498 99409 1.52552 298.52552 150.02552 15002.55255 1.52552 298.5255 150.02552 15002.5525 1.52552 298.52552 150.02552 15002.552 2020-01-01 2020-01-02 2020-01-01 00:08:28 2020-01-02 03:36:49 2020-01-01 00:08:28.000 2020-01-02 03:36:49.000 508 99409 49958.5 4995850 508 99409 49958.5 4995850 -32662 32476 4738.66 473866 -125 127 0.1 10 +509 2 10499 99410 1.52852 298.52852 150.02852 15002.85285 1.52852 298.52853 150.02853 15002.85312 1.52852 298.52852 150.02852000000001 15002.852 2020-01-01 2020-01-02 2020-01-01 00:08:29 2020-01-02 03:36:50 2020-01-01 00:08:29.000 2020-01-02 03:36:50.000 509 99410 49959.5 4995950 509 99410 49959.5 4995950 -32661 32477 4739.66 473966 -128 127 -1.46 -146 51 2 10041 99951 0.15315 300.15315 150.15315 15165.46846 0.15315 300.15317 150.15315 15165.46863 0.15315 300.15315 150.15315 15165.46815 2020-01-01 2020-01-02 2020-01-01 00:00:51 2020-01-02 03:45:51 2020-01-01 00:00:51.000 2020-01-02 03:45:51.000 51 99951 50001 5050101 51 99951 50001 5050101 -32518 32417 4580.009900990099 462581 -126 125 -2.6435643564356437 -267 -510 2 10500 99411 1.53153 298.53153 150.03153 15003.15315 1.53153 298.53152 150.03152 15003.15278 1.53153 298.53153 150.03153 15003.15300 2020-01-01 2020-01-02 2020-01-01 00:08:30 2020-01-02 03:36:51 2020-01-01 00:08:30.000 2020-01-02 03:36:51.000 510 99411 49960.5 4996050 510 99411 49960.5 4996050 -32660 32478 4740.66 474066 -128 127 -3.02 -302 -511 2 10501 99412 1.53453 298.53453 150.03453 15003.45345 1.53453 298.53455 150.03453 15003.45354 1.53453 298.53453 150.03453 15003.45300 2020-01-01 2020-01-02 2020-01-01 00:08:31 2020-01-02 03:36:52 2020-01-01 00:08:31.000 2020-01-02 03:36:52.000 511 99412 49961.5 4996150 511 99412 49961.5 4996150 -32659 32479 4741.66 474166 -128 123 -4.58 -458 -512 2 10502 99413 1.53753 298.53753 150.03753 15003.75375 1.53753 298.53754 150.03753 15003.75366 1.53753 298.53753 150.03753 15003.75300 2020-01-01 2020-01-02 2020-01-01 00:08:32 2020-01-02 03:36:53 2020-01-01 00:08:32.000 2020-01-02 03:36:53.000 512 99413 49962.5 4996250 512 99413 49962.5 4996250 -32658 32480 4742.66 474266 -127 124 -3.58 -358 -513 2 10503 99414 1.54054 298.54054 150.04054 15004.05405 1.54054 298.54053 150.04053 15004.05397 1.54054 298.54054 150.04054 15004.05400 2020-01-01 2020-01-02 2020-01-01 00:08:33 2020-01-02 03:36:54 2020-01-01 00:08:33.000 2020-01-02 03:36:54.000 513 99414 49963.5 4996350 513 99414 49963.5 4996350 -32657 32481 4743.66 474366 -126 125 -2.58 -258 -514 2 10504 99415 1.54354 298.54354 150.04354 15004.35435 1.54354 298.54355 150.04354 15004.35459 1.54354 298.54354 150.04354 15004.35400 2020-01-01 2020-01-02 2020-01-01 00:08:34 2020-01-02 03:36:55 2020-01-01 00:08:34.000 2020-01-02 03:36:55.000 514 99415 49964.5 4996450 514 99415 49964.5 4996450 -32656 32482 4744.66 474466 -125 126 -1.58 -158 -515 2 10505 99416 1.54654 298.54654 150.04654 15004.65465 1.54654 298.54654 150.04654 15004.65425 1.54654 298.54654 150.04654 15004.65400 2020-01-01 2020-01-02 2020-01-01 00:08:35 2020-01-02 03:36:56 2020-01-01 00:08:35.000 2020-01-02 03:36:56.000 515 99416 49965.5 4996550 515 99416 49965.5 4996550 -32655 32483 4745.66 474566 -124 127 -0.58 -58 -516 2 10506 99417 1.54954 298.54954 150.04954 15004.95495 1.54954 298.54956 150.04955 15004.955 1.54954 298.54954 150.04954 15004.95400 2020-01-01 2020-01-02 2020-01-01 00:08:36 2020-01-02 03:36:57 2020-01-01 00:08:36.000 2020-01-02 03:36:57.000 516 99417 49966.5 4996650 516 99417 49966.5 4996650 -32654 32484 4746.66 474666 -128 127 -2.14 -214 -517 2 10507 99418 1.55255 298.55255 150.05255 15005.25525 1.55255 298.55255 150.05255 15005.25514 1.55255 298.55255 150.05255 15005.25500 2020-01-01 2020-01-02 2020-01-01 00:08:37 2020-01-02 03:36:58 2020-01-01 00:08:37.000 2020-01-02 03:36:58.000 517 99418 49967.5 4996750 517 99418 49967.5 4996750 -32653 32485 4747.66 474766 -128 123 -3.7 -370 -518 2 10508 99419 1.55555 298.55555 150.05555 15005.55555 1.55555 298.55554 150.05555 15005.55547 1.55555 298.55555 150.05555 15005.55500 2020-01-01 2020-01-02 2020-01-01 00:08:38 2020-01-02 03:36:59 2020-01-01 00:08:38.000 2020-01-02 03:36:59.000 518 99419 49968.5 4996850 518 99419 49968.5 4996850 -32652 32486 4748.66 474866 -127 124 -2.7 -270 -519 2 10509 99420 1.55855 298.55855 150.05855 15005.85585 1.55855 298.55856 150.05856 15005.85607 1.55855 298.55855 150.05855 15005.85500 2020-01-01 2020-01-02 2020-01-01 00:08:39 2020-01-02 03:37:00 2020-01-01 00:08:39.000 2020-01-02 03:37:00.000 519 99420 49969.5 4996950 519 99420 49969.5 4996950 -32651 32487 4749.66 474966 -126 125 -1.7 -170 +510 2 10500 99411 1.53153 298.53153 150.03153 15003.15315 1.53153 298.53152 150.03152 15003.15278 1.53153 298.53153 150.03153 15003.153 2020-01-01 2020-01-02 2020-01-01 00:08:30 2020-01-02 03:36:51 2020-01-01 00:08:30.000 2020-01-02 03:36:51.000 510 99411 49960.5 4996050 510 99411 49960.5 4996050 -32660 32478 4740.66 474066 -128 127 -3.02 -302 +511 2 10501 99412 1.53453 298.53453 150.03453 15003.45345 1.53453 298.53455 150.03453 15003.45354 1.53453 298.53453 150.03453 15003.453 2020-01-01 2020-01-02 2020-01-01 00:08:31 2020-01-02 03:36:52 2020-01-01 00:08:31.000 2020-01-02 03:36:52.000 511 99412 49961.5 4996150 511 99412 49961.5 4996150 -32659 32479 4741.66 474166 -128 123 -4.58 -458 +512 2 10502 99413 1.53753 298.53753 150.03753 15003.75375 1.53753 298.53754 150.03753 15003.75366 1.53753 298.53753 150.03753 15003.753 2020-01-01 2020-01-02 2020-01-01 00:08:32 2020-01-02 03:36:53 2020-01-01 00:08:32.000 2020-01-02 03:36:53.000 512 99413 49962.5 4996250 512 99413 49962.5 4996250 -32658 32480 4742.66 474266 -127 124 -3.58 -358 +513 2 10503 99414 1.54054 298.54054 150.04054 15004.05405 1.54054 298.54053 150.04053 15004.05397 1.54054 298.54054 150.04054 15004.054 2020-01-01 2020-01-02 2020-01-01 00:08:33 2020-01-02 03:36:54 2020-01-01 00:08:33.000 2020-01-02 03:36:54.000 513 99414 49963.5 4996350 513 99414 49963.5 4996350 -32657 32481 4743.66 474366 -126 125 -2.58 -258 +514 2 10504 99415 1.54354 298.54354 150.04354 15004.35435 1.54354 298.54355 150.04354 15004.35459 1.54354 298.54354 150.04354 15004.354 2020-01-01 2020-01-02 2020-01-01 00:08:34 2020-01-02 03:36:55 2020-01-01 00:08:34.000 2020-01-02 03:36:55.000 514 99415 49964.5 4996450 514 99415 49964.5 4996450 -32656 32482 4744.66 474466 -125 126 -1.58 -158 +515 2 10505 99416 1.54654 298.54654 150.04654 15004.65465 1.54654 298.54654 150.04654 15004.65425 1.54654 298.54654 150.04654 15004.654 2020-01-01 2020-01-02 2020-01-01 00:08:35 2020-01-02 03:36:56 2020-01-01 00:08:35.000 2020-01-02 03:36:56.000 515 99416 49965.5 4996550 515 99416 49965.5 4996550 -32655 32483 4745.66 474566 -124 127 -0.58 -58 +516 2 10506 99417 1.54954 298.54954 150.04954 15004.95495 1.54954 298.54956 150.04955 15004.955 1.54954 298.54954 150.04954 15004.954 2020-01-01 2020-01-02 2020-01-01 00:08:36 2020-01-02 03:36:57 2020-01-01 00:08:36.000 2020-01-02 03:36:57.000 516 99417 49966.5 4996650 516 99417 49966.5 4996650 -32654 32484 4746.66 474666 -128 127 -2.14 -214 +517 2 10507 99418 1.55255 298.55255 150.05255 15005.25525 1.55255 298.55255 150.05255 15005.25514 1.55255 298.55255 150.05255 15005.255 2020-01-01 2020-01-02 2020-01-01 00:08:37 2020-01-02 03:36:58 2020-01-01 00:08:37.000 2020-01-02 03:36:58.000 517 99418 49967.5 4996750 517 99418 49967.5 4996750 -32653 32485 4747.66 474766 -128 123 -3.7 -370 +518 2 10508 99419 1.55555 298.55555 150.05555 15005.55555 1.55555 298.55554 150.05555 15005.55547 1.55555 298.55555 150.05555 15005.555 2020-01-01 2020-01-02 2020-01-01 00:08:38 2020-01-02 03:36:59 2020-01-01 00:08:38.000 2020-01-02 03:36:59.000 518 99419 49968.5 4996850 518 99419 49968.5 4996850 -32652 32486 4748.66 474866 -127 124 -2.7 -270 +519 2 10509 99420 1.55855 298.55855 150.05855 15005.85585 1.55855 298.55856 150.05856 15005.85607 1.55855 298.55855 150.05855 15005.855 2020-01-01 2020-01-02 2020-01-01 00:08:39 2020-01-02 03:37:00 2020-01-01 00:08:39.000 2020-01-02 03:37:00.000 519 99420 49969.5 4996950 519 99420 49969.5 4996950 -32651 32487 4749.66 474966 -126 125 -1.7 -170 52 2 10042 99952 0.15615 300.15615 150.15615 15165.77177 0.15615 300.15616 150.15615 15165.77193 0.15615 300.15615 150.15615 15165.77115 2020-01-01 2020-01-02 2020-01-01 00:00:52 2020-01-02 03:45:52 2020-01-01 00:00:52.000 2020-01-02 03:45:52.000 52 99952 50002 5050202 52 99952 50002 5050202 -32517 32418 4581.009900990099 462682 -125 126 -1.6435643564356435 -166 -520 2 10510 99421 1.56156 298.56156 150.06156 15006.15615 1.56156 298.56155 150.06155 15006.15572 1.56156 298.56156 150.06156000000001 15006.15600 2020-01-01 2020-01-02 2020-01-01 00:08:40 2020-01-02 03:37:01 2020-01-01 00:08:40.000 2020-01-02 03:37:01.000 520 99421 49970.5 4997050 520 99421 49970.5 4997050 -32650 32488 4750.66 475066 -125 126 -0.7 -70 -521 2 10511 99422 1.56456 298.56456 150.06456 15006.45645 1.56456 298.56458 150.06456 15006.45647 1.56456 298.56456 150.06456 15006.45600 2020-01-01 2020-01-02 2020-01-01 00:08:41 2020-01-02 03:37:02 2020-01-01 00:08:41.000 2020-01-02 03:37:02.000 521 99422 49971.5 4997150 521 99422 49971.5 4997150 -32649 32489 4751.66 475166 -124 127 0.3 30 -522 2 10512 99423 1.56756 298.56756 150.06756 15006.75675 1.56756 298.56757 150.06756 15006.75661 1.56756 298.56756 150.06756 15006.75600 2020-01-01 2020-01-02 2020-01-01 00:08:42 2020-01-02 03:37:03 2020-01-01 00:08:42.000 2020-01-02 03:37:03.000 522 99423 49972.5 4997250 522 99423 49972.5 4997250 -32648 32490 4752.66 475266 -128 127 -1.26 -126 -523 2 10513 99424 1.57057 298.57057 150.07057 15007.05705 1.57057 298.57056 150.07056 15007.05694 1.57057 298.57057 150.07057 15007.05700 2020-01-01 2020-01-02 2020-01-01 00:08:43 2020-01-02 03:37:04 2020-01-01 00:08:43.000 2020-01-02 03:37:04.000 523 99424 49973.5 4997350 523 99424 49973.5 4997350 -32647 32491 4753.66 475366 -128 123 -2.82 -282 -524 2 10514 99425 1.57357 298.57357 150.07357 15007.35735 1.57357 298.57358 150.07357 15007.35753 1.57357 298.57357 150.07357 15007.35700 2020-01-01 2020-01-02 2020-01-01 00:08:44 2020-01-02 03:37:05 2020-01-01 00:08:44.000 2020-01-02 03:37:05.000 524 99425 49974.5 4997450 524 99425 49974.5 4997450 -32646 32492 4754.66 475466 -127 124 -1.82 -182 -525 2 10515 99426 1.57657 298.57657 150.07657 15007.65765 1.57657 298.57657 150.07657 15007.65783 1.57657 298.57657 150.07657 15007.65700 2020-01-01 2020-01-02 2020-01-01 00:08:45 2020-01-02 03:37:06 2020-01-01 00:08:45.000 2020-01-02 03:37:06.000 525 99426 49975.5 4997550 525 99426 49975.5 4997550 -32645 32493 4755.66 475566 -126 125 -0.82 -82 -526 2 10516 99427 1.57957 298.57957 150.07957 15007.95795 1.57957 298.5796 150.07957 15007.95795 1.57957 298.57957 150.07957 15007.95700 2020-01-01 2020-01-02 2020-01-01 00:08:46 2020-01-02 03:37:07 2020-01-01 00:08:46.000 2020-01-02 03:37:07.000 526 99427 49976.5 4997650 526 99427 49976.5 4997650 -32644 32494 4756.66 475666 -125 126 0.18 18 -527 2 10517 99428 1.58258 298.58258 150.08258 15008.25825 1.58258 298.58258 150.08258 15008.25811 1.58258 298.58258 150.08258 15008.25800 2020-01-01 2020-01-02 2020-01-01 00:08:47 2020-01-02 03:37:08 2020-01-01 00:08:47.000 2020-01-02 03:37:08.000 527 99428 49977.5 4997750 527 99428 49977.5 4997750 -32643 32495 4757.66 475766 -124 127 1.18 118 -528 2 10518 99429 1.58558 298.58558 150.08558 15008.55855 1.58558 298.58557 150.08558 15008.5584 1.58558 298.58558 150.08558000000002 15008.55800 2020-01-01 2020-01-02 2020-01-01 00:08:48 2020-01-02 03:37:09 2020-01-01 00:08:48.000 2020-01-02 03:37:09.000 528 99429 49978.5 4997850 528 99429 49978.5 4997850 -32642 32496 4758.66 475866 -128 127 -0.38 -38 -529 2 10519 99430 1.58858 298.58858 150.08858 15008.85885 1.58858 298.5886 150.08859 15008.859 1.58858 298.58858 150.08858 15008.85800 2020-01-01 2020-01-02 2020-01-01 00:08:49 2020-01-02 03:37:10 2020-01-01 00:08:49.000 2020-01-02 03:37:10.000 529 99430 49979.5 4997950 529 99430 49979.5 4997950 -32641 32497 4759.66 475966 -128 127 -1.94 -194 +520 2 10510 99421 1.56156 298.56156 150.06156 15006.15615 1.56156 298.56155 150.06155 15006.15572 1.56156 298.56156 150.06156000000001 15006.156 2020-01-01 2020-01-02 2020-01-01 00:08:40 2020-01-02 03:37:01 2020-01-01 00:08:40.000 2020-01-02 03:37:01.000 520 99421 49970.5 4997050 520 99421 49970.5 4997050 -32650 32488 4750.66 475066 -125 126 -0.7 -70 +521 2 10511 99422 1.56456 298.56456 150.06456 15006.45645 1.56456 298.56458 150.06456 15006.45647 1.56456 298.56456 150.06456 15006.456 2020-01-01 2020-01-02 2020-01-01 00:08:41 2020-01-02 03:37:02 2020-01-01 00:08:41.000 2020-01-02 03:37:02.000 521 99422 49971.5 4997150 521 99422 49971.5 4997150 -32649 32489 4751.66 475166 -124 127 0.3 30 +522 2 10512 99423 1.56756 298.56756 150.06756 15006.75675 1.56756 298.56757 150.06756 15006.75661 1.56756 298.56756 150.06756 15006.756 2020-01-01 2020-01-02 2020-01-01 00:08:42 2020-01-02 03:37:03 2020-01-01 00:08:42.000 2020-01-02 03:37:03.000 522 99423 49972.5 4997250 522 99423 49972.5 4997250 -32648 32490 4752.66 475266 -128 127 -1.26 -126 +523 2 10513 99424 1.57057 298.57057 150.07057 15007.05705 1.57057 298.57056 150.07056 15007.05694 1.57057 298.57057 150.07057 15007.057 2020-01-01 2020-01-02 2020-01-01 00:08:43 2020-01-02 03:37:04 2020-01-01 00:08:43.000 2020-01-02 03:37:04.000 523 99424 49973.5 4997350 523 99424 49973.5 4997350 -32647 32491 4753.66 475366 -128 123 -2.82 -282 +524 2 10514 99425 1.57357 298.57357 150.07357 15007.35735 1.57357 298.57358 150.07357 15007.35753 1.57357 298.57357 150.07357 15007.357 2020-01-01 2020-01-02 2020-01-01 00:08:44 2020-01-02 03:37:05 2020-01-01 00:08:44.000 2020-01-02 03:37:05.000 524 99425 49974.5 4997450 524 99425 49974.5 4997450 -32646 32492 4754.66 475466 -127 124 -1.82 -182 +525 2 10515 99426 1.57657 298.57657 150.07657 15007.65765 1.57657 298.57657 150.07657 15007.65783 1.57657 298.57657 150.07657 15007.657 2020-01-01 2020-01-02 2020-01-01 00:08:45 2020-01-02 03:37:06 2020-01-01 00:08:45.000 2020-01-02 03:37:06.000 525 99426 49975.5 4997550 525 99426 49975.5 4997550 -32645 32493 4755.66 475566 -126 125 -0.82 -82 +526 2 10516 99427 1.57957 298.57957 150.07957 15007.95795 1.57957 298.5796 150.07957 15007.95795 1.57957 298.57957 150.07957 15007.957 2020-01-01 2020-01-02 2020-01-01 00:08:46 2020-01-02 03:37:07 2020-01-01 00:08:46.000 2020-01-02 03:37:07.000 526 99427 49976.5 4997650 526 99427 49976.5 4997650 -32644 32494 4756.66 475666 -125 126 0.18 18 +527 2 10517 99428 1.58258 298.58258 150.08258 15008.25825 1.58258 298.58258 150.08258 15008.25811 1.58258 298.58258 150.08258 15008.258 2020-01-01 2020-01-02 2020-01-01 00:08:47 2020-01-02 03:37:08 2020-01-01 00:08:47.000 2020-01-02 03:37:08.000 527 99428 49977.5 4997750 527 99428 49977.5 4997750 -32643 32495 4757.66 475766 -124 127 1.18 118 +528 2 10518 99429 1.58558 298.58558 150.08558 15008.55855 1.58558 298.58557 150.08558 15008.5584 1.58558 298.58558 150.08558000000002 15008.558 2020-01-01 2020-01-02 2020-01-01 00:08:48 2020-01-02 03:37:09 2020-01-01 00:08:48.000 2020-01-02 03:37:09.000 528 99429 49978.5 4997850 528 99429 49978.5 4997850 -32642 32496 4758.66 475866 -128 127 -0.38 -38 +529 2 10519 99430 1.58858 298.58858 150.08858 15008.85885 1.58858 298.5886 150.08859 15008.859 1.58858 298.58858 150.08858 15008.858 2020-01-01 2020-01-02 2020-01-01 00:08:49 2020-01-02 03:37:10 2020-01-01 00:08:49.000 2020-01-02 03:37:10.000 529 99430 49979.5 4997950 529 99430 49979.5 4997950 -32641 32497 4759.66 475966 -128 127 -1.94 -194 53 2 10043 99953 0.15915 300.15915 150.15915 15166.07507 0.15915 300.15915 150.15915 15166.07511 0.15915 300.15915 150.15915 15166.07415 2020-01-01 2020-01-02 2020-01-01 00:00:53 2020-01-02 03:45:53 2020-01-01 00:00:53.000 2020-01-02 03:45:53.000 53 99953 50003 5050303 53 99953 50003 5050303 -32516 32419 4582.009900990099 462783 -124 127 -0.6435643564356436 -65 -530 2 10520 99431 1.59159 298.59159 150.09159 15009.15915 1.59159 298.59158 150.09159 15009.15929 1.59159 298.59159 150.09159 15009.15900 2020-01-01 2020-01-02 2020-01-01 00:08:50 2020-01-02 03:37:11 2020-01-01 00:08:50.000 2020-01-02 03:37:11.000 530 99431 49980.5 4998050 530 99431 49980.5 4998050 -32640 32498 4760.66 476066 -128 124 -3.5 -350 -531 2 10521 99432 1.59459 298.59459 150.09459 15009.45945 1.59459 298.5946 150.09459 15009.45941 1.59459 298.59459 150.09459 15009.45900 2020-01-01 2020-01-02 2020-01-01 00:08:51 2020-01-02 03:37:12 2020-01-01 00:08:51.000 2020-01-02 03:37:12.000 531 99432 49981.5 4998150 531 99432 49981.5 4998150 -32639 32499 4761.66 476166 -127 125 -2.5 -250 -532 2 10522 99433 1.59759 298.59759 150.09759 15009.75975 1.59759 298.5976 150.09759 15009.75958 1.59759 298.59759 150.09759 15009.75900 2020-01-01 2020-01-02 2020-01-01 00:08:52 2020-01-02 03:37:13 2020-01-01 00:08:52.000 2020-01-02 03:37:13.000 532 99433 49982.5 4998250 532 99433 49982.5 4998250 -32638 32500 4762.66 476266 -126 126 -1.5 -150 -533 2 10523 99434 1.6006 298.6006 150.1006 15010.06006 1.6006 298.6006 150.10059 15010.05988 1.60060 298.60060 150.1006 15010.06000 2020-01-01 2020-01-02 2020-01-01 00:08:53 2020-01-02 03:37:14 2020-01-01 00:08:53.000 2020-01-02 03:37:14.000 533 99434 49983.5 4998350 533 99434 49983.5 4998350 -32637 32501 4763.66 476366 -125 127 -0.5 -50 -534 2 10524 99435 1.6036 298.6036 150.1036 15010.36036 1.6036 298.6036 150.1036 15010.36063 1.60360 298.60360 150.1036 15010.36000 2020-01-01 2020-01-02 2020-01-01 00:08:54 2020-01-02 03:37:15 2020-01-01 00:08:54.000 2020-01-02 03:37:15.000 534 99435 49984.5 4998450 534 99435 49984.5 4998450 -32636 32502 4764.66 476466 -128 127 -2.06 -206 -535 2 10525 99436 1.6066 298.6066 150.1066 15010.66066 1.6066 298.6066 150.1066 15010.66077 1.60660 298.60660 150.1066 15010.66000 2020-01-01 2020-01-02 2020-01-01 00:08:55 2020-01-02 03:37:16 2020-01-01 00:08:55.000 2020-01-02 03:37:16.000 535 99436 49985.5 4998550 535 99436 49985.5 4998550 -32635 32503 4765.66 476566 -128 127 -3.62 -362 -536 2 10526 99437 1.6096 298.6096 150.1096 15010.96096 1.6096 298.60962 150.1096 15010.96092 1.60960 298.60960 150.1096 15010.96000 2020-01-01 2020-01-02 2020-01-01 00:08:56 2020-01-02 03:37:17 2020-01-01 00:08:56.000 2020-01-02 03:37:17.000 536 99437 49986.5 4998650 536 99437 49986.5 4998650 -32634 32504 4766.66 476666 -128 123 -5.18 -518 -537 2 10527 99438 1.61261 298.61261 150.11261 15011.26126 1.61261 298.6126 150.11261 15011.26105 1.61261 298.61261 150.11261000000002 15011.26100 2020-01-01 2020-01-02 2020-01-01 00:08:57 2020-01-02 03:37:18 2020-01-01 00:08:57.000 2020-01-02 03:37:18.000 537 99438 49987.5 4998750 537 99438 49987.5 4998750 -32633 32505 4767.66 476766 -127 124 -4.18 -418 -538 2 10528 99439 1.61561 298.61561 150.11561 15011.56156 1.61561 298.6156 150.11561 15011.56135 1.61561 298.61561 150.11561 15011.56100 2020-01-01 2020-01-02 2020-01-01 00:08:58 2020-01-02 03:37:19 2020-01-01 00:08:58.000 2020-01-02 03:37:19.000 538 99439 49988.5 4998850 538 99439 49988.5 4998850 -32632 32506 4768.66 476866 -126 125 -3.18 -318 -539 2 10529 99440 1.61861 298.61861 150.11861 15011.86186 1.61861 298.61862 150.11862 15011.8621 1.61861 298.61861 150.11861000000002 15011.86100 2020-01-01 2020-01-02 2020-01-01 00:08:59 2020-01-02 03:37:20 2020-01-01 00:08:59.000 2020-01-02 03:37:20.000 539 99440 49989.5 4998950 539 99440 49989.5 4998950 -32631 32507 4769.66 476966 -125 126 -2.18 -218 +530 2 10520 99431 1.59159 298.59159 150.09159 15009.15915 1.59159 298.59158 150.09159 15009.15929 1.59159 298.59159 150.09159 15009.159 2020-01-01 2020-01-02 2020-01-01 00:08:50 2020-01-02 03:37:11 2020-01-01 00:08:50.000 2020-01-02 03:37:11.000 530 99431 49980.5 4998050 530 99431 49980.5 4998050 -32640 32498 4760.66 476066 -128 124 -3.5 -350 +531 2 10521 99432 1.59459 298.59459 150.09459 15009.45945 1.59459 298.5946 150.09459 15009.45941 1.59459 298.59459 150.09459 15009.459 2020-01-01 2020-01-02 2020-01-01 00:08:51 2020-01-02 03:37:12 2020-01-01 00:08:51.000 2020-01-02 03:37:12.000 531 99432 49981.5 4998150 531 99432 49981.5 4998150 -32639 32499 4761.66 476166 -127 125 -2.5 -250 +532 2 10522 99433 1.59759 298.59759 150.09759 15009.75975 1.59759 298.5976 150.09759 15009.75958 1.59759 298.59759 150.09759 15009.759 2020-01-01 2020-01-02 2020-01-01 00:08:52 2020-01-02 03:37:13 2020-01-01 00:08:52.000 2020-01-02 03:37:13.000 532 99433 49982.5 4998250 532 99433 49982.5 4998250 -32638 32500 4762.66 476266 -126 126 -1.5 -150 +533 2 10523 99434 1.6006 298.6006 150.1006 15010.06006 1.6006 298.6006 150.10059 15010.05988 1.6006 298.6006 150.1006 15010.06 2020-01-01 2020-01-02 2020-01-01 00:08:53 2020-01-02 03:37:14 2020-01-01 00:08:53.000 2020-01-02 03:37:14.000 533 99434 49983.5 4998350 533 99434 49983.5 4998350 -32637 32501 4763.66 476366 -125 127 -0.5 -50 +534 2 10524 99435 1.6036 298.6036 150.1036 15010.36036 1.6036 298.6036 150.1036 15010.36063 1.6036 298.6036 150.1036 15010.36 2020-01-01 2020-01-02 2020-01-01 00:08:54 2020-01-02 03:37:15 2020-01-01 00:08:54.000 2020-01-02 03:37:15.000 534 99435 49984.5 4998450 534 99435 49984.5 4998450 -32636 32502 4764.66 476466 -128 127 -2.06 -206 +535 2 10525 99436 1.6066 298.6066 150.1066 15010.66066 1.6066 298.6066 150.1066 15010.66077 1.6066 298.6066 150.1066 15010.66 2020-01-01 2020-01-02 2020-01-01 00:08:55 2020-01-02 03:37:16 2020-01-01 00:08:55.000 2020-01-02 03:37:16.000 535 99436 49985.5 4998550 535 99436 49985.5 4998550 -32635 32503 4765.66 476566 -128 127 -3.62 -362 +536 2 10526 99437 1.6096 298.6096 150.1096 15010.96096 1.6096 298.60962 150.1096 15010.96092 1.6096 298.6096 150.1096 15010.96 2020-01-01 2020-01-02 2020-01-01 00:08:56 2020-01-02 03:37:17 2020-01-01 00:08:56.000 2020-01-02 03:37:17.000 536 99437 49986.5 4998650 536 99437 49986.5 4998650 -32634 32504 4766.66 476666 -128 123 -5.18 -518 +537 2 10527 99438 1.61261 298.61261 150.11261 15011.26126 1.61261 298.6126 150.11261 15011.26105 1.61261 298.61261 150.11261000000002 15011.261 2020-01-01 2020-01-02 2020-01-01 00:08:57 2020-01-02 03:37:18 2020-01-01 00:08:57.000 2020-01-02 03:37:18.000 537 99438 49987.5 4998750 537 99438 49987.5 4998750 -32633 32505 4767.66 476766 -127 124 -4.18 -418 +538 2 10528 99439 1.61561 298.61561 150.11561 15011.56156 1.61561 298.6156 150.11561 15011.56135 1.61561 298.61561 150.11561 15011.561 2020-01-01 2020-01-02 2020-01-01 00:08:58 2020-01-02 03:37:19 2020-01-01 00:08:58.000 2020-01-02 03:37:19.000 538 99439 49988.5 4998850 538 99439 49988.5 4998850 -32632 32506 4768.66 476866 -126 125 -3.18 -318 +539 2 10529 99440 1.61861 298.61861 150.11861 15011.86186 1.61861 298.61862 150.11862 15011.8621 1.61861 298.61861 150.11861000000002 15011.861 2020-01-01 2020-01-02 2020-01-01 00:08:59 2020-01-02 03:37:20 2020-01-01 00:08:59.000 2020-01-02 03:37:20.000 539 99440 49989.5 4998950 539 99440 49989.5 4998950 -32631 32507 4769.66 476966 -125 126 -2.18 -218 54 2 10044 99954 0.16216 300.16216 150.16216 15166.37837 0.16216 300.16217 150.16216 15166.37822 0.16216 300.16216 150.16216 15166.37816 2020-01-01 2020-01-02 2020-01-01 00:00:54 2020-01-02 03:45:54 2020-01-01 00:00:54.000 2020-01-02 03:45:54.000 54 99954 50004 5050404 54 99954 50004 5050404 -32515 32420 4583.009900990099 462884 -128 127 -2.1782178217821784 -220 -540 2 10530 99441 1.62162 298.62162 150.12162 15012.16216 1.62162 298.6216 150.12162 15012.16224 1.62162 298.62162 150.12162 15012.16200 2020-01-01 2020-01-02 2020-01-01 00:09:00 2020-01-02 03:37:21 2020-01-01 00:09:00.000 2020-01-02 03:37:21.000 540 99441 49990.5 4999050 540 99441 49990.5 4999050 -32630 32508 4770.66 477066 -124 127 -1.18 -118 -541 2 10531 99442 1.62462 298.62462 150.12462 15012.46246 1.62462 298.62463 150.12462 15012.46239 1.62462 298.62462 150.12462 15012.46200 2020-01-01 2020-01-02 2020-01-01 00:09:01 2020-01-02 03:37:22 2020-01-01 00:09:01.000 2020-01-02 03:37:22.000 541 99442 49991.5 4999150 541 99442 49991.5 4999150 -32629 32509 4771.66 477166 -128 127 -2.74 -274 -542 2 10532 99443 1.62762 298.62762 150.12762 15012.76276 1.62762 298.62762 150.12762 15012.76252 1.62762 298.62762 150.12762 15012.76200 2020-01-01 2020-01-02 2020-01-01 00:09:02 2020-01-02 03:37:23 2020-01-01 00:09:02.000 2020-01-02 03:37:23.000 542 99443 49992.5 4999250 542 99443 49992.5 4999250 -32628 32510 4772.66 477266 -128 123 -4.3 -430 -543 2 10533 99444 1.63063 298.63063 150.13063 15013.06306 1.63063 298.63065 150.13063 15013.06327 1.63063 298.63063 150.13063 15013.06300 2020-01-01 2020-01-02 2020-01-01 00:09:03 2020-01-02 03:37:24 2020-01-01 00:09:03.000 2020-01-02 03:37:24.000 543 99444 49993.5 4999350 543 99444 49993.5 4999350 -32627 32511 4773.66 477366 -127 124 -3.3 -330 -544 2 10534 99445 1.63363 298.63363 150.13363 15013.36336 1.63363 298.63364 150.13363 15013.36358 1.63363 298.63363 150.13362999999998 15013.36300 2020-01-01 2020-01-02 2020-01-01 00:09:04 2020-01-02 03:37:25 2020-01-01 00:09:04.000 2020-01-02 03:37:25.000 544 99445 49994.5 4999450 544 99445 49994.5 4999450 -32626 32512 4774.66 477466 -126 125 -2.3 -230 -545 2 10535 99446 1.63663 298.63663 150.13663 15013.66366 1.63663 298.63663 150.13663 15013.6637 1.63663 298.63663 150.13663 15013.66300 2020-01-01 2020-01-02 2020-01-01 00:09:05 2020-01-02 03:37:26 2020-01-01 00:09:05.000 2020-01-02 03:37:26.000 545 99446 49995.5 4999550 545 99446 49995.5 4999550 -32625 32513 4775.66 477566 -125 126 -1.3 -130 -546 2 10536 99447 1.63963 298.63963 150.13963 15013.96396 1.63963 298.63965 150.13963 15013.96385 1.63963 298.63963 150.13963 15013.96300 2020-01-01 2020-01-02 2020-01-01 00:09:06 2020-01-02 03:37:27 2020-01-01 00:09:06.000 2020-01-02 03:37:27.000 546 99447 49996.5 4999650 546 99447 49996.5 4999650 -32624 32514 4776.66 477666 -124 127 -0.3 -30 -547 2 10537 99448 1.64264 298.64264 150.14264 15014.26426 1.64264 298.64264 150.14263 15014.26399 1.64264 298.64264 150.14264 15014.26400 2020-01-01 2020-01-02 2020-01-01 00:09:07 2020-01-02 03:37:28 2020-01-01 00:09:07.000 2020-01-02 03:37:28.000 547 99448 49997.5 4999750 547 99448 49997.5 4999750 -32623 32515 4777.66 477766 -128 127 -1.86 -186 -548 2 10538 99449 1.64564 298.64564 150.14564 15014.56456 1.64564 298.64566 150.14564 15014.56474 1.64564 298.64564 150.14564000000001 15014.56400 2020-01-01 2020-01-02 2020-01-01 00:09:08 2020-01-02 03:37:29 2020-01-01 00:09:08.000 2020-01-02 03:37:29.000 548 99449 49998.5 4999850 548 99449 49998.5 4999850 -32622 32516 4778.66 477866 -128 123 -3.42 -342 -549 2 10539 99450 1.64864 298.64864 150.14864 15014.86486 1.64864 298.64865 150.14865 15014.86504 1.64864 298.64864 150.14864 15014.86400 2020-01-01 2020-01-02 2020-01-01 00:09:09 2020-01-02 03:37:30 2020-01-01 00:09:09.000 2020-01-02 03:37:30.000 549 99450 49999.5 4999950 549 99450 49999.5 4999950 -32621 32517 4779.66 477966 -127 124 -2.42 -242 +540 2 10530 99441 1.62162 298.62162 150.12162 15012.16216 1.62162 298.6216 150.12162 15012.16224 1.62162 298.62162 150.12162 15012.162 2020-01-01 2020-01-02 2020-01-01 00:09:00 2020-01-02 03:37:21 2020-01-01 00:09:00.000 2020-01-02 03:37:21.000 540 99441 49990.5 4999050 540 99441 49990.5 4999050 -32630 32508 4770.66 477066 -124 127 -1.18 -118 +541 2 10531 99442 1.62462 298.62462 150.12462 15012.46246 1.62462 298.62463 150.12462 15012.46239 1.62462 298.62462 150.12462 15012.462 2020-01-01 2020-01-02 2020-01-01 00:09:01 2020-01-02 03:37:22 2020-01-01 00:09:01.000 2020-01-02 03:37:22.000 541 99442 49991.5 4999150 541 99442 49991.5 4999150 -32629 32509 4771.66 477166 -128 127 -2.74 -274 +542 2 10532 99443 1.62762 298.62762 150.12762 15012.76276 1.62762 298.62762 150.12762 15012.76252 1.62762 298.62762 150.12762 15012.762 2020-01-01 2020-01-02 2020-01-01 00:09:02 2020-01-02 03:37:23 2020-01-01 00:09:02.000 2020-01-02 03:37:23.000 542 99443 49992.5 4999250 542 99443 49992.5 4999250 -32628 32510 4772.66 477266 -128 123 -4.3 -430 +543 2 10533 99444 1.63063 298.63063 150.13063 15013.06306 1.63063 298.63065 150.13063 15013.06327 1.63063 298.63063 150.13063 15013.063 2020-01-01 2020-01-02 2020-01-01 00:09:03 2020-01-02 03:37:24 2020-01-01 00:09:03.000 2020-01-02 03:37:24.000 543 99444 49993.5 4999350 543 99444 49993.5 4999350 -32627 32511 4773.66 477366 -127 124 -3.3 -330 +544 2 10534 99445 1.63363 298.63363 150.13363 15013.36336 1.63363 298.63364 150.13363 15013.36358 1.63363 298.63363 150.13362999999998 15013.363 2020-01-01 2020-01-02 2020-01-01 00:09:04 2020-01-02 03:37:25 2020-01-01 00:09:04.000 2020-01-02 03:37:25.000 544 99445 49994.5 4999450 544 99445 49994.5 4999450 -32626 32512 4774.66 477466 -126 125 -2.3 -230 +545 2 10535 99446 1.63663 298.63663 150.13663 15013.66366 1.63663 298.63663 150.13663 15013.6637 1.63663 298.63663 150.13663 15013.663 2020-01-01 2020-01-02 2020-01-01 00:09:05 2020-01-02 03:37:26 2020-01-01 00:09:05.000 2020-01-02 03:37:26.000 545 99446 49995.5 4999550 545 99446 49995.5 4999550 -32625 32513 4775.66 477566 -125 126 -1.3 -130 +546 2 10536 99447 1.63963 298.63963 150.13963 15013.96396 1.63963 298.63965 150.13963 15013.96385 1.63963 298.63963 150.13963 15013.963 2020-01-01 2020-01-02 2020-01-01 00:09:06 2020-01-02 03:37:27 2020-01-01 00:09:06.000 2020-01-02 03:37:27.000 546 99447 49996.5 4999650 546 99447 49996.5 4999650 -32624 32514 4776.66 477666 -124 127 -0.3 -30 +547 2 10537 99448 1.64264 298.64264 150.14264 15014.26426 1.64264 298.64264 150.14263 15014.26399 1.64264 298.64264 150.14264 15014.264 2020-01-01 2020-01-02 2020-01-01 00:09:07 2020-01-02 03:37:28 2020-01-01 00:09:07.000 2020-01-02 03:37:28.000 547 99448 49997.5 4999750 547 99448 49997.5 4999750 -32623 32515 4777.66 477766 -128 127 -1.86 -186 +548 2 10538 99449 1.64564 298.64564 150.14564 15014.56456 1.64564 298.64566 150.14564 15014.56474 1.64564 298.64564 150.14564000000001 15014.564 2020-01-01 2020-01-02 2020-01-01 00:09:08 2020-01-02 03:37:29 2020-01-01 00:09:08.000 2020-01-02 03:37:29.000 548 99449 49998.5 4999850 548 99449 49998.5 4999850 -32622 32516 4778.66 477866 -128 123 -3.42 -342 +549 2 10539 99450 1.64864 298.64864 150.14864 15014.86486 1.64864 298.64865 150.14865 15014.86504 1.64864 298.64864 150.14864 15014.864 2020-01-01 2020-01-02 2020-01-01 00:09:09 2020-01-02 03:37:30 2020-01-01 00:09:09.000 2020-01-02 03:37:30.000 549 99450 49999.5 4999950 549 99450 49999.5 4999950 -32621 32517 4779.66 477966 -127 124 -2.42 -242 55 2 10045 99955 0.16516 300.16516 150.16516 15166.68168 0.16516 300.16516 150.16516 15166.68151 0.16516 300.16516 150.16516000000001 15166.68116 2020-01-01 2020-01-02 2020-01-01 00:00:55 2020-01-02 03:45:55 2020-01-01 00:00:55.000 2020-01-02 03:45:55.000 55 99955 50005 5050505 55 99955 50005 5050505 -32514 32421 4584.009900990099 462985 -128 123 -3.712871287128713 -375 -550 2 10540 99451 1.65165 298.65165 150.15165 15015.16516 1.65165 298.65164 150.15165 15015.16521 1.65165 298.65165 150.15165000000002 15015.16500 2020-01-01 2020-01-02 2020-01-01 00:09:10 2020-01-02 03:37:31 2020-01-01 00:09:10.000 2020-01-02 03:37:31.000 550 99451 50000.5 5000050 550 99451 50000.5 5000050 -32620 32518 4780.66 478066 -126 125 -1.42 -142 -551 2 10541 99452 1.65465 298.65465 150.15465 15015.46546 1.65465 298.65466 150.15465 15015.46533 1.65465 298.65465 150.15465 15015.46500 2020-01-01 2020-01-02 2020-01-01 00:09:11 2020-01-02 03:37:32 2020-01-01 00:09:11.000 2020-01-02 03:37:32.000 551 99452 50001.5 5000150 551 99452 50001.5 5000150 -32619 32519 4781.66 478166 -125 126 -0.42 -42 -552 2 10542 99453 1.65765 298.65765 150.15765 15015.76576 1.65765 298.65765 150.15765 15015.76562 1.65765 298.65765 150.15765 15015.76500 2020-01-01 2020-01-02 2020-01-01 00:09:12 2020-01-02 03:37:33 2020-01-01 00:09:12.000 2020-01-02 03:37:33.000 552 99453 50002.5 5000250 552 99453 50002.5 5000250 -32618 32520 4782.66 478266 -124 127 0.58 58 -553 2 10543 99454 1.66066 298.66066 150.16066 15016.06606 1.66066 298.66068 150.16066 15016.06621 1.66066 298.66066 150.16066 15016.06600 2020-01-01 2020-01-02 2020-01-01 00:09:13 2020-01-02 03:37:34 2020-01-01 00:09:13.000 2020-01-02 03:37:34.000 553 99454 50003.5 5000350 553 99454 50003.5 5000350 -32617 32521 4783.66 478366 -128 127 -0.98 -98 -554 2 10544 99455 1.66366 298.66366 150.16366 15016.36636 1.66366 298.66367 150.16366 15016.36651 1.66366 298.66366 150.16366 15016.36600 2020-01-01 2020-01-02 2020-01-01 00:09:14 2020-01-02 03:37:35 2020-01-01 00:09:14.000 2020-01-02 03:37:35.000 554 99455 50004.5 5000450 554 99455 50004.5 5000450 -32616 32522 4784.66 478466 -128 127 -2.54 -254 -555 2 10545 99456 1.66666 298.66666 150.16666 15016.66666 1.66666 298.66666 150.16666 15016.66668 1.66666 298.66666 150.16665999999998 15016.66600 2020-01-01 2020-01-02 2020-01-01 00:09:15 2020-01-02 03:37:36 2020-01-01 00:09:15.000 2020-01-02 03:37:36.000 555 99456 50005.5 5000550 555 99456 50005.5 5000550 -32615 32523 4785.66 478566 -128 124 -4.1 -410 -556 2 10546 99457 1.66966 298.66966 150.16966 15016.96696 1.66966 298.66968 150.16966 15016.9668 1.66966 298.66966 150.16966 15016.96600 2020-01-01 2020-01-02 2020-01-01 00:09:16 2020-01-02 03:37:37 2020-01-01 00:09:16.000 2020-01-02 03:37:37.000 556 99457 50006.5 5000650 556 99457 50006.5 5000650 -32614 32524 4786.66 478666 -127 125 -3.1 -310 -557 2 10547 99458 1.67267 298.67267 150.17267 15017.26726 1.67267 298.67267 150.17267 15017.26709 1.67267 298.67267 150.17267 15017.26700 2020-01-01 2020-01-02 2020-01-01 00:09:17 2020-01-02 03:37:38 2020-01-01 00:09:17.000 2020-01-02 03:37:38.000 557 99458 50007.5 5000750 557 99458 50007.5 5000750 -32613 32525 4787.66 478766 -126 126 -2.1 -210 -558 2 10548 99459 1.67567 298.67567 150.17567 15017.56756 1.67567 298.6757 150.17567 15017.56769 1.67567 298.67567 150.17567 15017.56700 2020-01-01 2020-01-02 2020-01-01 00:09:18 2020-01-02 03:37:39 2020-01-01 00:09:18.000 2020-01-02 03:37:39.000 558 99459 50008.5 5000850 558 99459 50008.5 5000850 -32612 32526 4788.66 478866 -125 127 -1.1 -110 -559 2 10549 99460 1.67867 298.67867 150.17867 15017.86786 1.67867 298.67868 150.17868 15017.86802 1.67867 298.67867 150.17867 15017.86700 2020-01-01 2020-01-02 2020-01-01 00:09:19 2020-01-02 03:37:40 2020-01-01 00:09:19.000 2020-01-02 03:37:40.000 559 99460 50009.5 5000950 559 99460 50009.5 5000950 -32611 32527 4789.66 478966 -128 127 -2.66 -266 +550 2 10540 99451 1.65165 298.65165 150.15165 15015.16516 1.65165 298.65164 150.15165 15015.16521 1.65165 298.65165 150.15165000000002 15015.165 2020-01-01 2020-01-02 2020-01-01 00:09:10 2020-01-02 03:37:31 2020-01-01 00:09:10.000 2020-01-02 03:37:31.000 550 99451 50000.5 5000050 550 99451 50000.5 5000050 -32620 32518 4780.66 478066 -126 125 -1.42 -142 +551 2 10541 99452 1.65465 298.65465 150.15465 15015.46546 1.65465 298.65466 150.15465 15015.46533 1.65465 298.65465 150.15465 15015.465 2020-01-01 2020-01-02 2020-01-01 00:09:11 2020-01-02 03:37:32 2020-01-01 00:09:11.000 2020-01-02 03:37:32.000 551 99452 50001.5 5000150 551 99452 50001.5 5000150 -32619 32519 4781.66 478166 -125 126 -0.42 -42 +552 2 10542 99453 1.65765 298.65765 150.15765 15015.76576 1.65765 298.65765 150.15765 15015.76562 1.65765 298.65765 150.15765 15015.765 2020-01-01 2020-01-02 2020-01-01 00:09:12 2020-01-02 03:37:33 2020-01-01 00:09:12.000 2020-01-02 03:37:33.000 552 99453 50002.5 5000250 552 99453 50002.5 5000250 -32618 32520 4782.66 478266 -124 127 0.58 58 +553 2 10543 99454 1.66066 298.66066 150.16066 15016.06606 1.66066 298.66068 150.16066 15016.06621 1.66066 298.66066 150.16066 15016.066 2020-01-01 2020-01-02 2020-01-01 00:09:13 2020-01-02 03:37:34 2020-01-01 00:09:13.000 2020-01-02 03:37:34.000 553 99454 50003.5 5000350 553 99454 50003.5 5000350 -32617 32521 4783.66 478366 -128 127 -0.98 -98 +554 2 10544 99455 1.66366 298.66366 150.16366 15016.36636 1.66366 298.66367 150.16366 15016.36651 1.66366 298.66366 150.16366 15016.366 2020-01-01 2020-01-02 2020-01-01 00:09:14 2020-01-02 03:37:35 2020-01-01 00:09:14.000 2020-01-02 03:37:35.000 554 99455 50004.5 5000450 554 99455 50004.5 5000450 -32616 32522 4784.66 478466 -128 127 -2.54 -254 +555 2 10545 99456 1.66666 298.66666 150.16666 15016.66666 1.66666 298.66666 150.16666 15016.66668 1.66666 298.66666 150.16665999999998 15016.666 2020-01-01 2020-01-02 2020-01-01 00:09:15 2020-01-02 03:37:36 2020-01-01 00:09:15.000 2020-01-02 03:37:36.000 555 99456 50005.5 5000550 555 99456 50005.5 5000550 -32615 32523 4785.66 478566 -128 124 -4.1 -410 +556 2 10546 99457 1.66966 298.66966 150.16966 15016.96696 1.66966 298.66968 150.16966 15016.9668 1.66966 298.66966 150.16966 15016.966 2020-01-01 2020-01-02 2020-01-01 00:09:16 2020-01-02 03:37:37 2020-01-01 00:09:16.000 2020-01-02 03:37:37.000 556 99457 50006.5 5000650 556 99457 50006.5 5000650 -32614 32524 4786.66 478666 -127 125 -3.1 -310 +557 2 10547 99458 1.67267 298.67267 150.17267 15017.26726 1.67267 298.67267 150.17267 15017.26709 1.67267 298.67267 150.17267 15017.267 2020-01-01 2020-01-02 2020-01-01 00:09:17 2020-01-02 03:37:38 2020-01-01 00:09:17.000 2020-01-02 03:37:38.000 557 99458 50007.5 5000750 557 99458 50007.5 5000750 -32613 32525 4787.66 478766 -126 126 -2.1 -210 +558 2 10548 99459 1.67567 298.67567 150.17567 15017.56756 1.67567 298.6757 150.17567 15017.56769 1.67567 298.67567 150.17567 15017.567 2020-01-01 2020-01-02 2020-01-01 00:09:18 2020-01-02 03:37:39 2020-01-01 00:09:18.000 2020-01-02 03:37:39.000 558 99459 50008.5 5000850 558 99459 50008.5 5000850 -32612 32526 4788.66 478866 -125 127 -1.1 -110 +559 2 10549 99460 1.67867 298.67867 150.17867 15017.86786 1.67867 298.67868 150.17868 15017.86802 1.67867 298.67867 150.17867 15017.867 2020-01-01 2020-01-02 2020-01-01 00:09:19 2020-01-02 03:37:40 2020-01-01 00:09:19.000 2020-01-02 03:37:40.000 559 99460 50009.5 5000950 559 99460 50009.5 5000950 -32611 32527 4789.66 478966 -128 127 -2.66 -266 56 2 10046 99956 0.16816 300.16816 150.16816 15166.98498 0.16816 300.16818 150.16816 15166.98512 0.16816 300.16816 150.16816 15166.98416 2020-01-01 2020-01-02 2020-01-01 00:00:56 2020-01-02 03:45:56 2020-01-01 00:00:56.000 2020-01-02 03:45:56.000 56 99956 50006 5050606 56 99956 50006 5050606 -32513 32422 4585.009900990099 463086 -127 124 -2.712871287128713 -274 -560 2 10550 99461 1.68168 298.68168 150.18168 15018.16816 1.68168 298.68167 150.18168 15018.16815 1.68168 298.68168 150.18168 15018.16800 2020-01-01 2020-01-02 2020-01-01 00:09:20 2020-01-02 03:37:41 2020-01-01 00:09:20.000 2020-01-02 03:37:41.000 560 99461 50010.5 5001050 560 99461 50010.5 5001050 -32610 32528 4790.66 479066 -128 127 -4.22 -422 -561 2 10551 99462 1.68468 298.68468 150.18468 15018.46846 1.68468 298.6847 150.18468 15018.46826 1.68468 298.68468 150.18468000000001 15018.46800 2020-01-01 2020-01-02 2020-01-01 00:09:21 2020-01-02 03:37:42 2020-01-01 00:09:21.000 2020-01-02 03:37:42.000 561 99462 50011.5 5001150 561 99462 50011.5 5001150 -32609 32529 4791.66 479166 -128 123 -5.78 -578 -562 2 10552 99463 1.68768 298.68768 150.18768 15018.76876 1.68768 298.68768 150.18768 15018.76856 1.68768 298.68768 150.18768 15018.76800 2020-01-01 2020-01-02 2020-01-01 00:09:22 2020-01-02 03:37:43 2020-01-01 00:09:22.000 2020-01-02 03:37:43.000 562 99463 50012.5 5001250 562 99463 50012.5 5001250 -32608 32530 4792.66 479266 -127 124 -4.78 -478 -563 2 10553 99464 1.69069 298.69069 150.19069 15019.06906 1.69069 298.6907 150.19069 15019.06915 1.69069 298.69069 150.19069 15019.06900 2020-01-01 2020-01-02 2020-01-01 00:09:23 2020-01-02 03:37:44 2020-01-01 00:09:23.000 2020-01-02 03:37:44.000 563 99464 50013.5 5001350 563 99464 50013.5 5001350 -32607 32531 4793.66 479366 -126 125 -3.78 -378 -564 2 10554 99465 1.69369 298.69369 150.19369 15019.36936 1.69369 298.6937 150.19369 15019.36948 1.69369 298.69369 150.19369 15019.36900 2020-01-01 2020-01-02 2020-01-01 00:09:24 2020-01-02 03:37:45 2020-01-01 00:09:24.000 2020-01-02 03:37:45.000 564 99465 50014.5 5001450 564 99465 50014.5 5001450 -32606 32532 4794.66 479466 -125 126 -2.78 -278 -565 2 10555 99466 1.69669 298.69669 150.19669 15019.66966 1.69669 298.6967 150.19669 15019.66962 1.69669 298.69669 150.19669 15019.66900 2020-01-01 2020-01-02 2020-01-01 00:09:25 2020-01-02 03:37:46 2020-01-01 00:09:25.000 2020-01-02 03:37:46.000 565 99466 50015.5 5001550 565 99466 50015.5 5001550 -32605 32533 4795.66 479566 -124 127 -1.78 -178 -566 2 10556 99467 1.69969 298.69969 150.19969 15019.96996 1.69969 298.6997 150.1997 15019.97037 1.69969 298.69969 150.19969 15019.96900 2020-01-01 2020-01-02 2020-01-01 00:09:26 2020-01-02 03:37:47 2020-01-01 00:09:26.000 2020-01-02 03:37:47.000 566 99467 50016.5 5001650 566 99467 50016.5 5001650 -32604 32534 4796.66 479666 -128 127 -3.34 -334 -567 2 10557 99468 1.7027 298.7027 150.2027 15020.27027 1.7027 298.7027 150.2027 15020.27003 1.70270 298.70270 150.2027 15020.27000 2020-01-01 2020-01-02 2020-01-01 00:09:27 2020-01-02 03:37:48 2020-01-01 00:09:27.000 2020-01-02 03:37:48.000 567 99468 50017.5 5001750 567 99468 50017.5 5001750 -32603 32535 4797.66 479766 -128 123 -4.9 -490 -568 2 10558 99469 1.7057 298.7057 150.2057 15020.57057 1.7057 298.70572 150.2057 15020.57066 1.70570 298.70570 150.2057 15020.57000 2020-01-01 2020-01-02 2020-01-01 00:09:28 2020-01-02 03:37:49 2020-01-01 00:09:28.000 2020-01-02 03:37:49.000 568 99469 50018.5 5001850 568 99469 50018.5 5001850 -32602 32536 4798.66 479866 -127 124 -3.9 -390 -569 2 10559 99470 1.7087 298.7087 150.2087 15020.87087 1.7087 298.7087 150.2087 15020.87095 1.70870 298.70870 150.20870000000002 15020.87000 2020-01-01 2020-01-02 2020-01-01 00:09:29 2020-01-02 03:37:50 2020-01-01 00:09:29.000 2020-01-02 03:37:50.000 569 99470 50019.5 5001950 569 99470 50019.5 5001950 -32601 32537 4799.66 479966 -126 125 -2.9 -290 +560 2 10550 99461 1.68168 298.68168 150.18168 15018.16816 1.68168 298.68167 150.18168 15018.16815 1.68168 298.68168 150.18168 15018.168 2020-01-01 2020-01-02 2020-01-01 00:09:20 2020-01-02 03:37:41 2020-01-01 00:09:20.000 2020-01-02 03:37:41.000 560 99461 50010.5 5001050 560 99461 50010.5 5001050 -32610 32528 4790.66 479066 -128 127 -4.22 -422 +561 2 10551 99462 1.68468 298.68468 150.18468 15018.46846 1.68468 298.6847 150.18468 15018.46826 1.68468 298.68468 150.18468000000001 15018.468 2020-01-01 2020-01-02 2020-01-01 00:09:21 2020-01-02 03:37:42 2020-01-01 00:09:21.000 2020-01-02 03:37:42.000 561 99462 50011.5 5001150 561 99462 50011.5 5001150 -32609 32529 4791.66 479166 -128 123 -5.78 -578 +562 2 10552 99463 1.68768 298.68768 150.18768 15018.76876 1.68768 298.68768 150.18768 15018.76856 1.68768 298.68768 150.18768 15018.768 2020-01-01 2020-01-02 2020-01-01 00:09:22 2020-01-02 03:37:43 2020-01-01 00:09:22.000 2020-01-02 03:37:43.000 562 99463 50012.5 5001250 562 99463 50012.5 5001250 -32608 32530 4792.66 479266 -127 124 -4.78 -478 +563 2 10553 99464 1.69069 298.69069 150.19069 15019.06906 1.69069 298.6907 150.19069 15019.06915 1.69069 298.69069 150.19069 15019.069 2020-01-01 2020-01-02 2020-01-01 00:09:23 2020-01-02 03:37:44 2020-01-01 00:09:23.000 2020-01-02 03:37:44.000 563 99464 50013.5 5001350 563 99464 50013.5 5001350 -32607 32531 4793.66 479366 -126 125 -3.78 -378 +564 2 10554 99465 1.69369 298.69369 150.19369 15019.36936 1.69369 298.6937 150.19369 15019.36948 1.69369 298.69369 150.19369 15019.369 2020-01-01 2020-01-02 2020-01-01 00:09:24 2020-01-02 03:37:45 2020-01-01 00:09:24.000 2020-01-02 03:37:45.000 564 99465 50014.5 5001450 564 99465 50014.5 5001450 -32606 32532 4794.66 479466 -125 126 -2.78 -278 +565 2 10555 99466 1.69669 298.69669 150.19669 15019.66966 1.69669 298.6967 150.19669 15019.66962 1.69669 298.69669 150.19669 15019.669 2020-01-01 2020-01-02 2020-01-01 00:09:25 2020-01-02 03:37:46 2020-01-01 00:09:25.000 2020-01-02 03:37:46.000 565 99466 50015.5 5001550 565 99466 50015.5 5001550 -32605 32533 4795.66 479566 -124 127 -1.78 -178 +566 2 10556 99467 1.69969 298.69969 150.19969 15019.96996 1.69969 298.6997 150.1997 15019.97037 1.69969 298.69969 150.19969 15019.969 2020-01-01 2020-01-02 2020-01-01 00:09:26 2020-01-02 03:37:47 2020-01-01 00:09:26.000 2020-01-02 03:37:47.000 566 99467 50016.5 5001650 566 99467 50016.5 5001650 -32604 32534 4796.66 479666 -128 127 -3.34 -334 +567 2 10557 99468 1.7027 298.7027 150.2027 15020.27027 1.7027 298.7027 150.2027 15020.27003 1.7027 298.7027 150.2027 15020.27 2020-01-01 2020-01-02 2020-01-01 00:09:27 2020-01-02 03:37:48 2020-01-01 00:09:27.000 2020-01-02 03:37:48.000 567 99468 50017.5 5001750 567 99468 50017.5 5001750 -32603 32535 4797.66 479766 -128 123 -4.9 -490 +568 2 10558 99469 1.7057 298.7057 150.2057 15020.57057 1.7057 298.70572 150.2057 15020.57066 1.7057 298.7057 150.2057 15020.57 2020-01-01 2020-01-02 2020-01-01 00:09:28 2020-01-02 03:37:49 2020-01-01 00:09:28.000 2020-01-02 03:37:49.000 568 99469 50018.5 5001850 568 99469 50018.5 5001850 -32602 32536 4798.66 479866 -127 124 -3.9 -390 +569 2 10559 99470 1.7087 298.7087 150.2087 15020.87087 1.7087 298.7087 150.2087 15020.87095 1.7087 298.7087 150.20870000000002 15020.87 2020-01-01 2020-01-02 2020-01-01 00:09:29 2020-01-02 03:37:50 2020-01-01 00:09:29.000 2020-01-02 03:37:50.000 569 99470 50019.5 5001950 569 99470 50019.5 5001950 -32601 32537 4799.66 479966 -126 125 -2.9 -290 57 2 10047 99957 0.17117 300.17117 150.17117 15167.28828 0.17117 300.17117 150.17117 15167.28841 0.17117 300.17117 150.17117 15167.28817 2020-01-01 2020-01-02 2020-01-01 00:00:57 2020-01-02 03:45:57 2020-01-01 00:00:57.000 2020-01-02 03:45:57.000 57 99957 50007 5050707 57 99957 50007 5050707 -32512 32423 4586.009900990099 463187 -126 125 -1.7128712871287128 -173 -570 2 10560 99471 1.71171 298.71171 150.21171 15021.17117 1.71171 298.7117 150.21171 15021.17109 1.71171 298.71171 150.21171 15021.17100 2020-01-01 2020-01-02 2020-01-01 00:09:30 2020-01-02 03:37:51 2020-01-01 00:09:30.000 2020-01-02 03:37:51.000 570 99471 50020.5 5002050 570 99471 50020.5 5002050 -32600 32538 4800.66 480066 -125 126 -1.9 -190 -571 2 10561 99472 1.71471 298.71471 150.21471 15021.47147 1.71471 298.71472 150.21471 15021.47184 1.71471 298.71471 150.21471 15021.47100 2020-01-01 2020-01-02 2020-01-01 00:09:31 2020-01-02 03:37:52 2020-01-01 00:09:31.000 2020-01-02 03:37:52.000 571 99472 50021.5 5002150 571 99472 50021.5 5002150 -32599 32539 4801.66 480166 -124 127 -0.9 -90 -572 2 10562 99473 1.71771 298.71771 150.21771 15021.77177 1.71771 298.7177 150.21771 15021.7715 1.71771 298.71771 150.21771 15021.77100 2020-01-01 2020-01-02 2020-01-01 00:09:32 2020-01-02 03:37:53 2020-01-01 00:09:32.000 2020-01-02 03:37:53.000 572 99473 50022.5 5002250 572 99473 50022.5 5002250 -32598 32540 4802.66 480266 -128 127 -2.46 -246 -573 2 10563 99474 1.72072 298.72072 150.22072 15022.07207 1.72072 298.72073 150.22072 15022.07212 1.72072 298.72072 150.22072 15022.07200 2020-01-01 2020-01-02 2020-01-01 00:09:33 2020-01-02 03:37:54 2020-01-01 00:09:33.000 2020-01-02 03:37:54.000 573 99474 50023.5 5002350 573 99474 50023.5 5002350 -32597 32541 4803.66 480366 -128 123 -4.02 -402 -574 2 10564 99475 1.72372 298.72372 150.22372 15022.37237 1.72372 298.72372 150.22372 15022.37243 1.72372 298.72372 150.22372 15022.37200 2020-01-01 2020-01-02 2020-01-01 00:09:34 2020-01-02 03:37:55 2020-01-01 00:09:34.000 2020-01-02 03:37:55.000 574 99475 50024.5 5002450 574 99475 50024.5 5002450 -32596 32542 4804.66 480466 -127 124 -3.02 -302 -575 2 10565 99476 1.72672 298.72672 150.22672 15022.67267 1.72672 298.7267 150.22672 15022.67272 1.72672 298.72672 150.22672 15022.67200 2020-01-01 2020-01-02 2020-01-01 00:09:35 2020-01-02 03:37:56 2020-01-01 00:09:35.000 2020-01-02 03:37:56.000 575 99476 50025.5 5002550 575 99476 50025.5 5002550 -32595 32543 4805.66 480566 -126 125 -2.02 -202 -576 2 10566 99477 1.72972 298.72972 150.22972 15022.97297 1.72972 298.72974 150.22973 15022.97332 1.72972 298.72972 150.22972 15022.97200 2020-01-01 2020-01-02 2020-01-01 00:09:36 2020-01-02 03:37:57 2020-01-01 00:09:36.000 2020-01-02 03:37:57.000 576 99477 50026.5 5002650 576 99477 50026.5 5002650 -32594 32544 4806.66 480666 -125 126 -1.02 -102 -577 2 10567 99478 1.73273 298.73273 150.23273 15023.27327 1.73273 298.73273 150.23272 15023.27297 1.73273 298.73273 150.23273 15023.27300 2020-01-01 2020-01-02 2020-01-01 00:09:37 2020-01-02 03:37:58 2020-01-01 00:09:37.000 2020-01-02 03:37:58.000 577 99478 50027.5 5002750 577 99478 50027.5 5002750 -32593 32545 4807.66 480766 -124 127 -0.02 -2 -578 2 10568 99479 1.73573 298.73573 150.23573 15023.57357 1.73573 298.73575 150.23573 15023.57359 1.73573 298.73573 150.23573 15023.57300 2020-01-01 2020-01-02 2020-01-01 00:09:38 2020-01-02 03:37:59 2020-01-01 00:09:38.000 2020-01-02 03:37:59.000 578 99479 50028.5 5002850 578 99479 50028.5 5002850 -32592 32546 4808.66 480866 -128 127 -1.58 -158 -579 2 10569 99480 1.73873 298.73873 150.23873 15023.87387 1.73873 298.73874 150.23873 15023.8739 1.73873 298.73873 150.23873 15023.87300 2020-01-01 2020-01-02 2020-01-01 00:09:39 2020-01-02 03:38:00 2020-01-01 00:09:39.000 2020-01-02 03:38:00.000 579 99480 50029.5 5002950 579 99480 50029.5 5002950 -32591 32547 4809.66 480966 -128 123 -3.14 -314 +570 2 10560 99471 1.71171 298.71171 150.21171 15021.17117 1.71171 298.7117 150.21171 15021.17109 1.71171 298.71171 150.21171 15021.171 2020-01-01 2020-01-02 2020-01-01 00:09:30 2020-01-02 03:37:51 2020-01-01 00:09:30.000 2020-01-02 03:37:51.000 570 99471 50020.5 5002050 570 99471 50020.5 5002050 -32600 32538 4800.66 480066 -125 126 -1.9 -190 +571 2 10561 99472 1.71471 298.71471 150.21471 15021.47147 1.71471 298.71472 150.21471 15021.47184 1.71471 298.71471 150.21471 15021.471 2020-01-01 2020-01-02 2020-01-01 00:09:31 2020-01-02 03:37:52 2020-01-01 00:09:31.000 2020-01-02 03:37:52.000 571 99472 50021.5 5002150 571 99472 50021.5 5002150 -32599 32539 4801.66 480166 -124 127 -0.9 -90 +572 2 10562 99473 1.71771 298.71771 150.21771 15021.77177 1.71771 298.7177 150.21771 15021.7715 1.71771 298.71771 150.21771 15021.771 2020-01-01 2020-01-02 2020-01-01 00:09:32 2020-01-02 03:37:53 2020-01-01 00:09:32.000 2020-01-02 03:37:53.000 572 99473 50022.5 5002250 572 99473 50022.5 5002250 -32598 32540 4802.66 480266 -128 127 -2.46 -246 +573 2 10563 99474 1.72072 298.72072 150.22072 15022.07207 1.72072 298.72073 150.22072 15022.07212 1.72072 298.72072 150.22072 15022.072 2020-01-01 2020-01-02 2020-01-01 00:09:33 2020-01-02 03:37:54 2020-01-01 00:09:33.000 2020-01-02 03:37:54.000 573 99474 50023.5 5002350 573 99474 50023.5 5002350 -32597 32541 4803.66 480366 -128 123 -4.02 -402 +574 2 10564 99475 1.72372 298.72372 150.22372 15022.37237 1.72372 298.72372 150.22372 15022.37243 1.72372 298.72372 150.22372 15022.372 2020-01-01 2020-01-02 2020-01-01 00:09:34 2020-01-02 03:37:55 2020-01-01 00:09:34.000 2020-01-02 03:37:55.000 574 99475 50024.5 5002450 574 99475 50024.5 5002450 -32596 32542 4804.66 480466 -127 124 -3.02 -302 +575 2 10565 99476 1.72672 298.72672 150.22672 15022.67267 1.72672 298.7267 150.22672 15022.67272 1.72672 298.72672 150.22672 15022.672 2020-01-01 2020-01-02 2020-01-01 00:09:35 2020-01-02 03:37:56 2020-01-01 00:09:35.000 2020-01-02 03:37:56.000 575 99476 50025.5 5002550 575 99476 50025.5 5002550 -32595 32543 4805.66 480566 -126 125 -2.02 -202 +576 2 10566 99477 1.72972 298.72972 150.22972 15022.97297 1.72972 298.72974 150.22973 15022.97332 1.72972 298.72972 150.22972 15022.972 2020-01-01 2020-01-02 2020-01-01 00:09:36 2020-01-02 03:37:57 2020-01-01 00:09:36.000 2020-01-02 03:37:57.000 576 99477 50026.5 5002650 576 99477 50026.5 5002650 -32594 32544 4806.66 480666 -125 126 -1.02 -102 +577 2 10567 99478 1.73273 298.73273 150.23273 15023.27327 1.73273 298.73273 150.23272 15023.27297 1.73273 298.73273 150.23273 15023.273 2020-01-01 2020-01-02 2020-01-01 00:09:37 2020-01-02 03:37:58 2020-01-01 00:09:37.000 2020-01-02 03:37:58.000 577 99478 50027.5 5002750 577 99478 50027.5 5002750 -32593 32545 4807.66 480766 -124 127 -0.02 -2 +578 2 10568 99479 1.73573 298.73573 150.23573 15023.57357 1.73573 298.73575 150.23573 15023.57359 1.73573 298.73573 150.23573 15023.573 2020-01-01 2020-01-02 2020-01-01 00:09:38 2020-01-02 03:37:59 2020-01-01 00:09:38.000 2020-01-02 03:37:59.000 578 99479 50028.5 5002850 578 99479 50028.5 5002850 -32592 32546 4808.66 480866 -128 127 -1.58 -158 +579 2 10569 99480 1.73873 298.73873 150.23873 15023.87387 1.73873 298.73874 150.23873 15023.8739 1.73873 298.73873 150.23873 15023.873 2020-01-01 2020-01-02 2020-01-01 00:09:39 2020-01-02 03:38:00 2020-01-01 00:09:39.000 2020-01-02 03:38:00.000 579 99480 50029.5 5002950 579 99480 50029.5 5002950 -32591 32547 4809.66 480966 -128 123 -3.14 -314 58 2 10048 99958 0.17417 300.17417 150.17417 15167.59159 0.17417 300.17416 150.17417 15167.59159 0.17417 300.17417 150.17417 15167.59117 2020-01-01 2020-01-02 2020-01-01 00:00:58 2020-01-02 03:45:58 2020-01-01 00:00:58.000 2020-01-02 03:45:58.000 58 99958 50008 5050808 58 99958 50008 5050808 -32511 32424 4587.009900990099 463288 -125 126 -0.7128712871287128 -72 -580 2 10570 99481 1.74174 298.74174 150.24174 15024.17417 1.74174 298.74173 150.24174 15024.17419 1.74174 298.74174 150.24174000000002 15024.17400 2020-01-01 2020-01-02 2020-01-01 00:09:40 2020-01-02 03:38:01 2020-01-01 00:09:40.000 2020-01-02 03:38:01.000 580 99481 50030.5 5003050 580 99481 50030.5 5003050 -32590 32548 4810.66 481066 -127 124 -2.14 -214 -581 2 10571 99482 1.74474 298.74474 150.24474 15024.47447 1.74474 298.74475 150.24474 15024.47478 1.74474 298.74474 150.24474 15024.47400 2020-01-01 2020-01-02 2020-01-01 00:09:41 2020-01-02 03:38:02 2020-01-01 00:09:41.000 2020-01-02 03:38:02.000 581 99482 50031.5 5003150 581 99482 50031.5 5003150 -32589 32549 4811.66 481166 -126 125 -1.14 -114 -582 2 10572 99483 1.74774 298.74774 150.24774 15024.77477 1.74774 298.74774 150.24774 15024.77447 1.74774 298.74774 150.24774 15024.77400 2020-01-01 2020-01-02 2020-01-01 00:09:42 2020-01-02 03:38:03 2020-01-01 00:09:42.000 2020-01-02 03:38:03.000 582 99483 50032.5 5003250 582 99483 50032.5 5003250 -32588 32550 4812.66 481266 -125 126 -0.14 -14 -583 2 10573 99484 1.75075 298.75075 150.25075 15025.07507 1.75075 298.75076 150.25075 15025.07507 1.75075 298.75075 150.25075 15025.07500 2020-01-01 2020-01-02 2020-01-01 00:09:43 2020-01-02 03:38:04 2020-01-01 00:09:43.000 2020-01-02 03:38:04.000 583 99484 50033.5 5003350 583 99484 50033.5 5003350 -32587 32551 4813.66 481366 -124 127 0.86 86 -584 2 10574 99485 1.75375 298.75375 150.25375 15025.37537 1.75375 298.75375 150.25375 15025.37536 1.75375 298.75375 150.25375 15025.37500 2020-01-01 2020-01-02 2020-01-01 00:09:44 2020-01-02 03:38:05 2020-01-01 00:09:44.000 2020-01-02 03:38:05.000 584 99485 50034.5 5003450 584 99485 50034.5 5003450 -32586 32552 4814.66 481466 -128 127 -0.7 -70 -585 2 10575 99486 1.75675 298.75675 150.25675 15025.67567 1.75675 298.75674 150.25675 15025.67566 1.75675 298.75675 150.25674999999998 15025.67500 2020-01-01 2020-01-02 2020-01-01 00:09:45 2020-01-02 03:38:06 2020-01-01 00:09:45.000 2020-01-02 03:38:06.000 585 99486 50035.5 5003550 585 99486 50035.5 5003550 -32585 32553 4815.66 481566 -128 127 -2.26 -226 -586 2 10576 99487 1.75975 298.75975 150.25975 15025.97597 1.75975 298.75977 150.25976 15025.97625 1.75975 298.75975 150.25975 15025.97500 2020-01-01 2020-01-02 2020-01-01 00:09:46 2020-01-02 03:38:07 2020-01-01 00:09:46.000 2020-01-02 03:38:07.000 586 99487 50036.5 5003650 586 99487 50036.5 5003650 -32584 32554 4816.66 481666 -128 123 -3.82 -382 -587 2 10577 99488 1.76276 298.76276 150.26276 15026.27627 1.76276 298.76276 150.26275 15026.27594 1.76276 298.76276 150.26276 15026.27600 2020-01-01 2020-01-02 2020-01-01 00:09:47 2020-01-02 03:38:08 2020-01-01 00:09:47.000 2020-01-02 03:38:08.000 587 99488 50037.5 5003750 587 99488 50037.5 5003750 -32583 32555 4817.66 481766 -127 124 -2.82 -282 -588 2 10578 99489 1.76576 298.76576 150.26576 15026.57657 1.76576 298.76578 150.26576 15026.57654 1.76576 298.76576 150.26576 15026.57600 2020-01-01 2020-01-02 2020-01-01 00:09:48 2020-01-02 03:38:09 2020-01-01 00:09:48.000 2020-01-02 03:38:09.000 588 99489 50038.5 5003850 588 99489 50038.5 5003850 -32582 32556 4818.66 481866 -126 125 -1.82 -182 -589 2 10579 99490 1.76876 298.76876 150.26876 15026.87687 1.76876 298.76877 150.26876 15026.87683 1.76876 298.76876 150.26876000000001 15026.87600 2020-01-01 2020-01-02 2020-01-01 00:09:49 2020-01-02 03:38:10 2020-01-01 00:09:49.000 2020-01-02 03:38:10.000 589 99490 50039.5 5003950 589 99490 50039.5 5003950 -32581 32557 4819.66 481966 -125 126 -0.82 -82 +580 2 10570 99481 1.74174 298.74174 150.24174 15024.17417 1.74174 298.74173 150.24174 15024.17419 1.74174 298.74174 150.24174000000002 15024.174 2020-01-01 2020-01-02 2020-01-01 00:09:40 2020-01-02 03:38:01 2020-01-01 00:09:40.000 2020-01-02 03:38:01.000 580 99481 50030.5 5003050 580 99481 50030.5 5003050 -32590 32548 4810.66 481066 -127 124 -2.14 -214 +581 2 10571 99482 1.74474 298.74474 150.24474 15024.47447 1.74474 298.74475 150.24474 15024.47478 1.74474 298.74474 150.24474 15024.474 2020-01-01 2020-01-02 2020-01-01 00:09:41 2020-01-02 03:38:02 2020-01-01 00:09:41.000 2020-01-02 03:38:02.000 581 99482 50031.5 5003150 581 99482 50031.5 5003150 -32589 32549 4811.66 481166 -126 125 -1.14 -114 +582 2 10572 99483 1.74774 298.74774 150.24774 15024.77477 1.74774 298.74774 150.24774 15024.77447 1.74774 298.74774 150.24774 15024.774 2020-01-01 2020-01-02 2020-01-01 00:09:42 2020-01-02 03:38:03 2020-01-01 00:09:42.000 2020-01-02 03:38:03.000 582 99483 50032.5 5003250 582 99483 50032.5 5003250 -32588 32550 4812.66 481266 -125 126 -0.14 -14 +583 2 10573 99484 1.75075 298.75075 150.25075 15025.07507 1.75075 298.75076 150.25075 15025.07507 1.75075 298.75075 150.25075 15025.075 2020-01-01 2020-01-02 2020-01-01 00:09:43 2020-01-02 03:38:04 2020-01-01 00:09:43.000 2020-01-02 03:38:04.000 583 99484 50033.5 5003350 583 99484 50033.5 5003350 -32587 32551 4813.66 481366 -124 127 0.86 86 +584 2 10574 99485 1.75375 298.75375 150.25375 15025.37537 1.75375 298.75375 150.25375 15025.37536 1.75375 298.75375 150.25375 15025.375 2020-01-01 2020-01-02 2020-01-01 00:09:44 2020-01-02 03:38:05 2020-01-01 00:09:44.000 2020-01-02 03:38:05.000 584 99485 50034.5 5003450 584 99485 50034.5 5003450 -32586 32552 4814.66 481466 -128 127 -0.7 -70 +585 2 10575 99486 1.75675 298.75675 150.25675 15025.67567 1.75675 298.75674 150.25675 15025.67566 1.75675 298.75675 150.25674999999998 15025.675 2020-01-01 2020-01-02 2020-01-01 00:09:45 2020-01-02 03:38:06 2020-01-01 00:09:45.000 2020-01-02 03:38:06.000 585 99486 50035.5 5003550 585 99486 50035.5 5003550 -32585 32553 4815.66 481566 -128 127 -2.26 -226 +586 2 10576 99487 1.75975 298.75975 150.25975 15025.97597 1.75975 298.75977 150.25976 15025.97625 1.75975 298.75975 150.25975 15025.975 2020-01-01 2020-01-02 2020-01-01 00:09:46 2020-01-02 03:38:07 2020-01-01 00:09:46.000 2020-01-02 03:38:07.000 586 99487 50036.5 5003650 586 99487 50036.5 5003650 -32584 32554 4816.66 481666 -128 123 -3.82 -382 +587 2 10577 99488 1.76276 298.76276 150.26276 15026.27627 1.76276 298.76276 150.26275 15026.27594 1.76276 298.76276 150.26276 15026.276 2020-01-01 2020-01-02 2020-01-01 00:09:47 2020-01-02 03:38:08 2020-01-01 00:09:47.000 2020-01-02 03:38:08.000 587 99488 50037.5 5003750 587 99488 50037.5 5003750 -32583 32555 4817.66 481766 -127 124 -2.82 -282 +588 2 10578 99489 1.76576 298.76576 150.26576 15026.57657 1.76576 298.76578 150.26576 15026.57654 1.76576 298.76576 150.26576 15026.576 2020-01-01 2020-01-02 2020-01-01 00:09:48 2020-01-02 03:38:09 2020-01-01 00:09:48.000 2020-01-02 03:38:09.000 588 99489 50038.5 5003850 588 99489 50038.5 5003850 -32582 32556 4818.66 481866 -126 125 -1.82 -182 +589 2 10579 99490 1.76876 298.76876 150.26876 15026.87687 1.76876 298.76877 150.26876 15026.87683 1.76876 298.76876 150.26876000000001 15026.876 2020-01-01 2020-01-02 2020-01-01 00:09:49 2020-01-02 03:38:10 2020-01-01 00:09:49.000 2020-01-02 03:38:10.000 589 99490 50039.5 5003950 589 99490 50039.5 5003950 -32581 32557 4819.66 481966 -125 126 -0.82 -82 59 2 10049 99959 0.17717 300.17717 150.17717 15167.89489 0.17717 300.1772 150.17717 15167.8947 0.17717 300.17717 150.17717 15167.89417 2020-01-01 2020-01-02 2020-01-01 00:00:59 2020-01-02 03:45:59 2020-01-01 00:00:59.000 2020-01-02 03:45:59.000 59 99959 50009 5050909 59 99959 50009 5050909 -32510 32425 4588.009900990099 463389 -124 127 0.2871287128712871 29 -590 2 10580 99491 1.77177 298.77177 150.27177 15027.17717 1.77177 298.77176 150.27177 15027.17713 1.77177 298.77177 150.27177 15027.17700 2020-01-01 2020-01-02 2020-01-01 00:09:50 2020-01-02 03:38:11 2020-01-01 00:09:50.000 2020-01-02 03:38:11.000 590 99491 50040.5 5004050 590 99491 50040.5 5004050 -32580 32558 4820.66 482066 -124 127 0.18 18 -591 2 10581 99492 1.77477 298.77477 150.27477 15027.47747 1.77477 298.77478 150.27477 15027.47775 1.77477 298.77477 150.27477000000002 15027.47700 2020-01-01 2020-01-02 2020-01-01 00:09:51 2020-01-02 03:38:12 2020-01-01 00:09:51.000 2020-01-02 03:38:12.000 591 99492 50041.5 5004150 591 99492 50041.5 5004150 -32579 32559 4821.66 482166 -128 127 -1.38 -138 -592 2 10582 99493 1.77777 298.77777 150.27777 15027.77777 1.77777 298.77777 150.27777 15027.77742 1.77777 298.77777 150.27777 15027.77700 2020-01-01 2020-01-02 2020-01-01 00:09:52 2020-01-02 03:38:13 2020-01-01 00:09:52.000 2020-01-02 03:38:13.000 592 99493 50042.5 5004250 592 99493 50042.5 5004250 -32578 32560 4822.66 482266 -128 123 -2.94 -294 -593 2 10583 99494 1.78078 298.78078 150.28078 15028.07807 1.78078 298.7808 150.28078 15028.078 1.78078 298.78078 150.28078 15028.07800 2020-01-01 2020-01-02 2020-01-01 00:09:53 2020-01-02 03:38:14 2020-01-01 00:09:53.000 2020-01-02 03:38:14.000 593 99494 50043.5 5004350 593 99494 50043.5 5004350 -32577 32561 4823.66 482366 -127 124 -1.94 -194 -594 2 10584 99495 1.78378 298.78378 150.28378 15028.37837 1.78378 298.78378 150.28378 15028.3783 1.78378 298.78378 150.28378 15028.37800 2020-01-01 2020-01-02 2020-01-01 00:09:54 2020-01-02 03:38:15 2020-01-01 00:09:54.000 2020-01-02 03:38:15.000 594 99495 50044.5 5004450 594 99495 50044.5 5004450 -32576 32562 4824.66 482466 -126 125 -0.94 -94 -595 2 10585 99496 1.78678 298.78678 150.28678 15028.67867 1.78678 298.78677 150.28678 15028.6786 1.78678 298.78678 150.28678 15028.67800 2020-01-01 2020-01-02 2020-01-01 00:09:55 2020-01-02 03:38:16 2020-01-01 00:09:55.000 2020-01-02 03:38:16.000 595 99496 50045.5 5004550 595 99496 50045.5 5004550 -32575 32563 4825.66 482566 -125 126 0.06 6 -596 2 10586 99497 1.78978 298.78978 150.28978 15028.97897 1.78978 298.7898 150.28979 15028.97922 1.78978 298.78978 150.28977999999998 15028.97800 2020-01-01 2020-01-02 2020-01-01 00:09:56 2020-01-02 03:38:17 2020-01-01 00:09:56.000 2020-01-02 03:38:17.000 596 99497 50046.5 5004650 596 99497 50046.5 5004650 -32574 32564 4826.66 482666 -124 127 1.06 106 -597 2 10587 99498 1.79279 298.79279 150.29279 15029.27927 1.79279 298.7928 150.29278 15029.27888 1.79279 298.79279 150.29279 15029.27900 2020-01-01 2020-01-02 2020-01-01 00:09:57 2020-01-02 03:38:18 2020-01-01 00:09:57.000 2020-01-02 03:38:18.000 597 99498 50047.5 5004750 597 99498 50047.5 5004750 -32573 32565 4827.66 482766 -128 127 -0.5 -50 -598 2 10588 99499 1.79579 298.79579 150.29579 15029.57957 1.79579 298.7958 150.29579 15029.57964 1.79579 298.79579 150.29579 15029.57900 2020-01-01 2020-01-02 2020-01-01 00:09:58 2020-01-02 03:38:19 2020-01-01 00:09:58.000 2020-01-02 03:38:19.000 598 99499 50048.5 5004850 598 99499 50048.5 5004850 -32572 32566 4828.66 482866 -128 123 -2.06 -206 -599 2 10589 99500 1.79879 298.79879 150.29879 15029.87987 1.79879 298.7988 150.29879 15029.87977 1.79879 298.79879 150.29879 15029.87900 2020-01-01 2020-01-02 2020-01-01 00:09:59 2020-01-02 03:38:20 2020-01-01 00:09:59.000 2020-01-02 03:38:20.000 599 99500 50049.5 5004950 599 99500 50049.5 5004950 -32571 32567 4829.66 482966 -127 124 -1.06 -106 +590 2 10580 99491 1.77177 298.77177 150.27177 15027.17717 1.77177 298.77176 150.27177 15027.17713 1.77177 298.77177 150.27177 15027.177 2020-01-01 2020-01-02 2020-01-01 00:09:50 2020-01-02 03:38:11 2020-01-01 00:09:50.000 2020-01-02 03:38:11.000 590 99491 50040.5 5004050 590 99491 50040.5 5004050 -32580 32558 4820.66 482066 -124 127 0.18 18 +591 2 10581 99492 1.77477 298.77477 150.27477 15027.47747 1.77477 298.77478 150.27477 15027.47775 1.77477 298.77477 150.27477000000002 15027.477 2020-01-01 2020-01-02 2020-01-01 00:09:51 2020-01-02 03:38:12 2020-01-01 00:09:51.000 2020-01-02 03:38:12.000 591 99492 50041.5 5004150 591 99492 50041.5 5004150 -32579 32559 4821.66 482166 -128 127 -1.38 -138 +592 2 10582 99493 1.77777 298.77777 150.27777 15027.77777 1.77777 298.77777 150.27777 15027.77742 1.77777 298.77777 150.27777 15027.777 2020-01-01 2020-01-02 2020-01-01 00:09:52 2020-01-02 03:38:13 2020-01-01 00:09:52.000 2020-01-02 03:38:13.000 592 99493 50042.5 5004250 592 99493 50042.5 5004250 -32578 32560 4822.66 482266 -128 123 -2.94 -294 +593 2 10583 99494 1.78078 298.78078 150.28078 15028.07807 1.78078 298.7808 150.28078 15028.078 1.78078 298.78078 150.28078 15028.078 2020-01-01 2020-01-02 2020-01-01 00:09:53 2020-01-02 03:38:14 2020-01-01 00:09:53.000 2020-01-02 03:38:14.000 593 99494 50043.5 5004350 593 99494 50043.5 5004350 -32577 32561 4823.66 482366 -127 124 -1.94 -194 +594 2 10584 99495 1.78378 298.78378 150.28378 15028.37837 1.78378 298.78378 150.28378 15028.3783 1.78378 298.78378 150.28378 15028.378 2020-01-01 2020-01-02 2020-01-01 00:09:54 2020-01-02 03:38:15 2020-01-01 00:09:54.000 2020-01-02 03:38:15.000 594 99495 50044.5 5004450 594 99495 50044.5 5004450 -32576 32562 4824.66 482466 -126 125 -0.94 -94 +595 2 10585 99496 1.78678 298.78678 150.28678 15028.67867 1.78678 298.78677 150.28678 15028.6786 1.78678 298.78678 150.28678 15028.678 2020-01-01 2020-01-02 2020-01-01 00:09:55 2020-01-02 03:38:16 2020-01-01 00:09:55.000 2020-01-02 03:38:16.000 595 99496 50045.5 5004550 595 99496 50045.5 5004550 -32575 32563 4825.66 482566 -125 126 0.06 6 +596 2 10586 99497 1.78978 298.78978 150.28978 15028.97897 1.78978 298.7898 150.28979 15028.97922 1.78978 298.78978 150.28977999999998 15028.978 2020-01-01 2020-01-02 2020-01-01 00:09:56 2020-01-02 03:38:17 2020-01-01 00:09:56.000 2020-01-02 03:38:17.000 596 99497 50046.5 5004650 596 99497 50046.5 5004650 -32574 32564 4826.66 482666 -124 127 1.06 106 +597 2 10587 99498 1.79279 298.79279 150.29279 15029.27927 1.79279 298.7928 150.29278 15029.27888 1.79279 298.79279 150.29279 15029.279 2020-01-01 2020-01-02 2020-01-01 00:09:57 2020-01-02 03:38:18 2020-01-01 00:09:57.000 2020-01-02 03:38:18.000 597 99498 50047.5 5004750 597 99498 50047.5 5004750 -32573 32565 4827.66 482766 -128 127 -0.5 -50 +598 2 10588 99499 1.79579 298.79579 150.29579 15029.57957 1.79579 298.7958 150.29579 15029.57964 1.79579 298.79579 150.29579 15029.579 2020-01-01 2020-01-02 2020-01-01 00:09:58 2020-01-02 03:38:19 2020-01-01 00:09:58.000 2020-01-02 03:38:19.000 598 99499 50048.5 5004850 598 99499 50048.5 5004850 -32572 32566 4828.66 482866 -128 123 -2.06 -206 +599 2 10589 99500 1.79879 298.79879 150.29879 15029.87987 1.79879 298.7988 150.29879 15029.87977 1.79879 298.79879 150.29879 15029.879 2020-01-01 2020-01-02 2020-01-01 00:09:59 2020-01-02 03:38:20 2020-01-01 00:09:59.000 2020-01-02 03:38:20.000 599 99500 50049.5 5004950 599 99500 50049.5 5004950 -32571 32567 4829.66 482966 -127 124 -1.06 -106 6 2 1005 9996 0.01801 300.01801 150.01801 15151.81981 0.01801 300.018 150.01801 15151.81978 0.01801 300.01801 150.01801 15151.81901 2020-01-01 2020-01-02 2020-01-01 00:00:06 2020-01-02 03:45:06 2020-01-01 00:00:06.000 2020-01-02 03:45:06.000 6 99906 49956 5045556 6 99906 49956 5045556 -32563 32372 4535.009900990099 458036 -127 124 -2.01980198019802 -204 60 2 10050 99960 0.18018 300.18018 150.18018 15168.19819 0.18018 300.18018 150.18017 15168.198 0.18018 300.18018 150.18018 15168.19818 2020-01-01 2020-01-02 2020-01-01 00:01:00 2020-01-02 03:46:00 2020-01-01 00:01:00.000 2020-01-02 03:46:00.000 60 99960 50010 5051010 60 99960 50010 5051010 -32509 32426 4589.009900990099 463490 -128 127 -1.2475247524752475 -126 -600 2 10590 99501 1.8018 298.8018 150.3018 15030.18018 1.8018 298.8018 150.3018 15030.1801 1.80180 298.80180 150.30180000000001 15030.18000 2020-01-01 2020-01-02 2020-01-01 00:10:00 2020-01-02 03:38:21 2020-01-01 00:10:00.000 2020-01-02 03:38:21.000 600 99501 50050.5 5005050 600 99501 50050.5 5005050 -32570 32568 4830.66 483066 -126 125 -0.06 -6 -601 2 10591 99502 1.8048 298.8048 150.3048 15030.48048 1.8048 298.8048 150.3048 15030.4807 1.80480 298.80480 150.3048 15030.48000 2020-01-01 2020-01-02 2020-01-01 00:10:01 2020-01-02 03:38:22 2020-01-01 00:10:01.000 2020-01-02 03:38:22.000 601 99502 50051.5 5005150 601 99502 50051.5 5005150 -32569 32569 4831.66 483166 -125 126 0.94 94 -602 2 10592 99503 1.8078 298.8078 150.3078 15030.78078 1.8078 298.8078 150.3078 15030.78035 1.80780 298.80780 150.30780000000001 15030.78000 2020-01-01 2020-01-02 2020-01-01 00:10:02 2020-01-02 03:38:23 2020-01-01 00:10:02.000 2020-01-02 03:38:23.000 602 99503 50052.5 5005250 602 99503 50052.5 5005250 -32568 32570 4832.66 483266 -124 127 1.94 194 -603 2 10593 99504 1.81081 298.81081 150.31081 15031.08108 1.81081 298.81082 150.31081 15031.0811 1.81081 298.81081 150.31081 15031.08100 2020-01-01 2020-01-02 2020-01-01 00:10:03 2020-01-02 03:38:24 2020-01-01 00:10:03.000 2020-01-02 03:38:24.000 603 99504 50053.5 5005350 603 99504 50053.5 5005350 -32567 32571 4833.66 483366 -128 127 0.38 38 -604 2 10594 99505 1.81381 298.81381 150.31381 15031.38138 1.81381 298.8138 150.31381 15031.38124 1.81381 298.81381 150.31381 15031.38100 2020-01-01 2020-01-02 2020-01-01 00:10:04 2020-01-02 03:38:25 2020-01-01 00:10:04.000 2020-01-02 03:38:25.000 604 99505 50054.5 5005450 604 99505 50054.5 5005450 -32566 32572 4834.66 483466 -128 123 -1.18 -118 -605 2 10595 99506 1.81681 298.81681 150.31681 15031.68168 1.81681 298.8168 150.31681 15031.68157 1.81681 298.81681 150.31681 15031.68100 2020-01-01 2020-01-02 2020-01-01 00:10:05 2020-01-02 03:38:26 2020-01-01 00:10:05.000 2020-01-02 03:38:26.000 605 99506 50055.5 5005550 605 99506 50055.5 5005550 -32565 32573 4835.66 483566 -127 124 -0.18 -18 -606 2 10596 99507 1.81981 298.81981 150.31981 15031.98198 1.81981 298.81982 150.31982 15031.98217 1.81981 298.81981 150.31981 15031.98100 2020-01-01 2020-01-02 2020-01-01 00:10:06 2020-01-02 03:38:27 2020-01-01 00:10:06.000 2020-01-02 03:38:27.000 606 99507 50056.5 5005650 606 99507 50056.5 5005650 -32564 32574 4836.66 483666 -126 125 0.82 82 -607 2 10597 99508 1.82282 298.82282 150.32282 15032.28228 1.82282 298.8228 150.32282 15032.28246 1.82282 298.82282 150.32281999999998 15032.28200 2020-01-01 2020-01-02 2020-01-01 00:10:07 2020-01-02 03:38:28 2020-01-01 00:10:07.000 2020-01-02 03:38:28.000 607 99508 50057.5 5005750 607 99508 50057.5 5005750 -32563 32575 4837.66 483766 -125 126 1.82 182 -608 2 10598 99509 1.82582 298.82582 150.32582 15032.58258 1.82582 298.82584 150.32582 15032.58258 1.82582 298.82582 150.32582 15032.58200 2020-01-01 2020-01-02 2020-01-01 00:10:08 2020-01-02 03:38:29 2020-01-01 00:10:08.000 2020-01-02 03:38:29.000 608 99509 50058.5 5005850 608 99509 50058.5 5005850 -32562 32576 4838.66 483866 -124 127 2.82 282 -609 2 10599 99510 1.82882 298.82882 150.32882 15032.88288 1.82882 298.82883 150.32882 15032.88274 1.82882 298.82882 150.32882 15032.88200 2020-01-01 2020-01-02 2020-01-01 00:10:09 2020-01-02 03:38:30 2020-01-01 00:10:09.000 2020-01-02 03:38:30.000 609 99510 50059.5 5005950 609 99510 50059.5 5005950 -32561 32577 4839.66 483966 -128 127 1.26 126 +600 2 10590 99501 1.8018 298.8018 150.3018 15030.18018 1.8018 298.8018 150.3018 15030.1801 1.8018 298.8018 150.30180000000001 15030.18 2020-01-01 2020-01-02 2020-01-01 00:10:00 2020-01-02 03:38:21 2020-01-01 00:10:00.000 2020-01-02 03:38:21.000 600 99501 50050.5 5005050 600 99501 50050.5 5005050 -32570 32568 4830.66 483066 -126 125 -0.06 -6 +601 2 10591 99502 1.8048 298.8048 150.3048 15030.48048 1.8048 298.8048 150.3048 15030.4807 1.8048 298.8048 150.3048 15030.48 2020-01-01 2020-01-02 2020-01-01 00:10:01 2020-01-02 03:38:22 2020-01-01 00:10:01.000 2020-01-02 03:38:22.000 601 99502 50051.5 5005150 601 99502 50051.5 5005150 -32569 32569 4831.66 483166 -125 126 0.94 94 +602 2 10592 99503 1.8078 298.8078 150.3078 15030.78078 1.8078 298.8078 150.3078 15030.78035 1.8078 298.8078 150.30780000000001 15030.78 2020-01-01 2020-01-02 2020-01-01 00:10:02 2020-01-02 03:38:23 2020-01-01 00:10:02.000 2020-01-02 03:38:23.000 602 99503 50052.5 5005250 602 99503 50052.5 5005250 -32568 32570 4832.66 483266 -124 127 1.94 194 +603 2 10593 99504 1.81081 298.81081 150.31081 15031.08108 1.81081 298.81082 150.31081 15031.0811 1.81081 298.81081 150.31081 15031.081 2020-01-01 2020-01-02 2020-01-01 00:10:03 2020-01-02 03:38:24 2020-01-01 00:10:03.000 2020-01-02 03:38:24.000 603 99504 50053.5 5005350 603 99504 50053.5 5005350 -32567 32571 4833.66 483366 -128 127 0.38 38 +604 2 10594 99505 1.81381 298.81381 150.31381 15031.38138 1.81381 298.8138 150.31381 15031.38124 1.81381 298.81381 150.31381 15031.381 2020-01-01 2020-01-02 2020-01-01 00:10:04 2020-01-02 03:38:25 2020-01-01 00:10:04.000 2020-01-02 03:38:25.000 604 99505 50054.5 5005450 604 99505 50054.5 5005450 -32566 32572 4834.66 483466 -128 123 -1.18 -118 +605 2 10595 99506 1.81681 298.81681 150.31681 15031.68168 1.81681 298.8168 150.31681 15031.68157 1.81681 298.81681 150.31681 15031.681 2020-01-01 2020-01-02 2020-01-01 00:10:05 2020-01-02 03:38:26 2020-01-01 00:10:05.000 2020-01-02 03:38:26.000 605 99506 50055.5 5005550 605 99506 50055.5 5005550 -32565 32573 4835.66 483566 -127 124 -0.18 -18 +606 2 10596 99507 1.81981 298.81981 150.31981 15031.98198 1.81981 298.81982 150.31982 15031.98217 1.81981 298.81981 150.31981 15031.981 2020-01-01 2020-01-02 2020-01-01 00:10:06 2020-01-02 03:38:27 2020-01-01 00:10:06.000 2020-01-02 03:38:27.000 606 99507 50056.5 5005650 606 99507 50056.5 5005650 -32564 32574 4836.66 483666 -126 125 0.82 82 +607 2 10597 99508 1.82282 298.82282 150.32282 15032.28228 1.82282 298.8228 150.32282 15032.28246 1.82282 298.82282 150.32281999999998 15032.282 2020-01-01 2020-01-02 2020-01-01 00:10:07 2020-01-02 03:38:28 2020-01-01 00:10:07.000 2020-01-02 03:38:28.000 607 99508 50057.5 5005750 607 99508 50057.5 5005750 -32563 32575 4837.66 483766 -125 126 1.82 182 +608 2 10598 99509 1.82582 298.82582 150.32582 15032.58258 1.82582 298.82584 150.32582 15032.58258 1.82582 298.82582 150.32582 15032.582 2020-01-01 2020-01-02 2020-01-01 00:10:08 2020-01-02 03:38:29 2020-01-01 00:10:08.000 2020-01-02 03:38:29.000 608 99509 50058.5 5005850 608 99509 50058.5 5005850 -32562 32576 4838.66 483866 -124 127 2.82 282 +609 2 10599 99510 1.82882 298.82882 150.32882 15032.88288 1.82882 298.82883 150.32882 15032.88274 1.82882 298.82882 150.32882 15032.882 2020-01-01 2020-01-02 2020-01-01 00:10:09 2020-01-02 03:38:30 2020-01-01 00:10:09.000 2020-01-02 03:38:30.000 609 99510 50059.5 5005950 609 99510 50059.5 5005950 -32561 32577 4839.66 483966 -128 127 1.26 126 61 2 10051 99961 0.18318 300.18318 150.18318 15168.5015 0.18318 300.1832 150.18318 15168.5016 0.18318 300.18318 150.18318 15168.50118 2020-01-01 2020-01-02 2020-01-01 00:01:01 2020-01-02 03:46:01 2020-01-01 00:01:01.000 2020-01-02 03:46:01.000 61 99961 50011 5051111 61 99961 50011 5051111 -32508 32427 4590.009900990099 463591 -128 123 -2.782178217821782 -281 -610 2 10600 99511 1.83183 298.83183 150.33183 15033.18318 1.83183 298.83182 150.33183 15033.18304 1.83183 298.83183 150.33183 15033.18300 2020-01-01 2020-01-02 2020-01-01 00:10:10 2020-01-02 03:38:31 2020-01-01 00:10:10.000 2020-01-02 03:38:31.000 610 99511 50060.5 5006050 610 99511 50060.5 5006050 -32560 32578 4840.66 484066 -128 127 -0.3 -30 -611 2 10601 99512 1.83483 298.83483 150.33483 15033.48348 1.83483 298.83484 150.33483 15033.48363 1.83483 298.83483 150.33483 15033.48300 2020-01-01 2020-01-02 2020-01-01 00:10:11 2020-01-02 03:38:32 2020-01-01 00:10:11.000 2020-01-02 03:38:32.000 611 99512 50061.5 5006150 611 99512 50061.5 5006150 -32559 32579 4841.66 484166 -128 123 -1.86 -186 -612 2 10602 99513 1.83783 298.83783 150.33783 15033.78378 1.83783 298.83783 150.33783 15033.78393 1.83783 298.83783 150.33783 15033.78300 2020-01-01 2020-01-02 2020-01-01 00:10:12 2020-01-02 03:38:33 2020-01-01 00:10:12.000 2020-01-02 03:38:33.000 612 99513 50062.5 5006250 612 99513 50062.5 5006250 -32558 32580 4842.66 484266 -127 124 -0.86 -86 -613 2 10603 99514 1.84084 298.84084 150.34084 15034.08408 1.84084 298.84085 150.34084 15034.08405 1.84084 298.84084 150.34084000000001 15034.08400 2020-01-01 2020-01-02 2020-01-01 00:10:13 2020-01-02 03:38:34 2020-01-01 00:10:13.000 2020-01-02 03:38:34.000 613 99514 50063.5 5006350 613 99514 50063.5 5006350 -32557 32581 4843.66 484366 -126 125 0.14 14 -614 2 10604 99515 1.84384 298.84384 150.34384 15034.38438 1.84384 298.84384 150.34384 15034.38421 1.84384 298.84384 150.34384 15034.38400 2020-01-01 2020-01-02 2020-01-01 00:10:14 2020-01-02 03:38:35 2020-01-01 00:10:14.000 2020-01-02 03:38:35.000 614 99515 50064.5 5006450 614 99515 50064.5 5006450 -32556 32582 4844.66 484466 -125 126 1.14 114 -615 2 10605 99516 1.84684 298.84684 150.34684 15034.68468 1.84684 298.84683 150.34684 15034.68452 1.84684 298.84684 150.34684 15034.68400 2020-01-01 2020-01-02 2020-01-01 00:10:15 2020-01-02 03:38:36 2020-01-01 00:10:15.000 2020-01-02 03:38:36.000 615 99516 50065.5 5006550 615 99516 50065.5 5006550 -32555 32583 4845.66 484566 -124 127 2.14 214 -616 2 10606 99517 1.84984 298.84984 150.34984 15034.98498 1.84984 298.84985 150.34985 15034.98527 1.84984 298.84984 150.34984 15034.98400 2020-01-01 2020-01-02 2020-01-01 00:10:16 2020-01-02 03:38:37 2020-01-01 00:10:16.000 2020-01-02 03:38:37.000 616 99517 50066.5 5006650 616 99517 50066.5 5006650 -32554 32584 4846.66 484666 -128 127 0.58 58 -617 2 10607 99518 1.85285 298.85285 150.35285 15035.28528 1.85285 298.85284 150.35285 15035.2854 1.85285 298.85285 150.35285 15035.28500 2020-01-01 2020-01-02 2020-01-01 00:10:17 2020-01-02 03:38:38 2020-01-01 00:10:17.000 2020-01-02 03:38:38.000 617 99518 50067.5 5006750 617 99518 50067.5 5006750 -32553 32585 4847.66 484766 -128 123 -0.98 -98 -618 2 10608 99519 1.85585 298.85585 150.35585 15035.58558 1.85585 298.85587 150.35585 15035.58551 1.85585 298.85585 150.35585 15035.58500 2020-01-01 2020-01-02 2020-01-01 00:10:18 2020-01-02 03:38:39 2020-01-01 00:10:18.000 2020-01-02 03:38:39.000 618 99519 50068.5 5006850 618 99519 50068.5 5006850 -32552 32586 4848.66 484866 -127 124 0.02 2 -619 2 10609 99520 1.85885 298.85885 150.35885 15035.88588 1.85885 298.85886 150.35885 15035.88568 1.85885 298.85885 150.35885 15035.88500 2020-01-01 2020-01-02 2020-01-01 00:10:19 2020-01-02 03:38:40 2020-01-01 00:10:19.000 2020-01-02 03:38:40.000 619 99520 50069.5 5006950 619 99520 50069.5 5006950 -32551 32587 4849.66 484966 -126 125 1.02 102 +610 2 10600 99511 1.83183 298.83183 150.33183 15033.18318 1.83183 298.83182 150.33183 15033.18304 1.83183 298.83183 150.33183 15033.183 2020-01-01 2020-01-02 2020-01-01 00:10:10 2020-01-02 03:38:31 2020-01-01 00:10:10.000 2020-01-02 03:38:31.000 610 99511 50060.5 5006050 610 99511 50060.5 5006050 -32560 32578 4840.66 484066 -128 127 -0.3 -30 +611 2 10601 99512 1.83483 298.83483 150.33483 15033.48348 1.83483 298.83484 150.33483 15033.48363 1.83483 298.83483 150.33483 15033.483 2020-01-01 2020-01-02 2020-01-01 00:10:11 2020-01-02 03:38:32 2020-01-01 00:10:11.000 2020-01-02 03:38:32.000 611 99512 50061.5 5006150 611 99512 50061.5 5006150 -32559 32579 4841.66 484166 -128 123 -1.86 -186 +612 2 10602 99513 1.83783 298.83783 150.33783 15033.78378 1.83783 298.83783 150.33783 15033.78393 1.83783 298.83783 150.33783 15033.783 2020-01-01 2020-01-02 2020-01-01 00:10:12 2020-01-02 03:38:33 2020-01-01 00:10:12.000 2020-01-02 03:38:33.000 612 99513 50062.5 5006250 612 99513 50062.5 5006250 -32558 32580 4842.66 484266 -127 124 -0.86 -86 +613 2 10603 99514 1.84084 298.84084 150.34084 15034.08408 1.84084 298.84085 150.34084 15034.08405 1.84084 298.84084 150.34084000000001 15034.084 2020-01-01 2020-01-02 2020-01-01 00:10:13 2020-01-02 03:38:34 2020-01-01 00:10:13.000 2020-01-02 03:38:34.000 613 99514 50063.5 5006350 613 99514 50063.5 5006350 -32557 32581 4843.66 484366 -126 125 0.14 14 +614 2 10604 99515 1.84384 298.84384 150.34384 15034.38438 1.84384 298.84384 150.34384 15034.38421 1.84384 298.84384 150.34384 15034.384 2020-01-01 2020-01-02 2020-01-01 00:10:14 2020-01-02 03:38:35 2020-01-01 00:10:14.000 2020-01-02 03:38:35.000 614 99515 50064.5 5006450 614 99515 50064.5 5006450 -32556 32582 4844.66 484466 -125 126 1.14 114 +615 2 10605 99516 1.84684 298.84684 150.34684 15034.68468 1.84684 298.84683 150.34684 15034.68452 1.84684 298.84684 150.34684 15034.684 2020-01-01 2020-01-02 2020-01-01 00:10:15 2020-01-02 03:38:36 2020-01-01 00:10:15.000 2020-01-02 03:38:36.000 615 99516 50065.5 5006550 615 99516 50065.5 5006550 -32555 32583 4845.66 484566 -124 127 2.14 214 +616 2 10606 99517 1.84984 298.84984 150.34984 15034.98498 1.84984 298.84985 150.34985 15034.98527 1.84984 298.84984 150.34984 15034.984 2020-01-01 2020-01-02 2020-01-01 00:10:16 2020-01-02 03:38:37 2020-01-01 00:10:16.000 2020-01-02 03:38:37.000 616 99517 50066.5 5006650 616 99517 50066.5 5006650 -32554 32584 4846.66 484666 -128 127 0.58 58 +617 2 10607 99518 1.85285 298.85285 150.35285 15035.28528 1.85285 298.85284 150.35285 15035.2854 1.85285 298.85285 150.35285 15035.285 2020-01-01 2020-01-02 2020-01-01 00:10:17 2020-01-02 03:38:38 2020-01-01 00:10:17.000 2020-01-02 03:38:38.000 617 99518 50067.5 5006750 617 99518 50067.5 5006750 -32553 32585 4847.66 484766 -128 123 -0.98 -98 +618 2 10608 99519 1.85585 298.85585 150.35585 15035.58558 1.85585 298.85587 150.35585 15035.58551 1.85585 298.85585 150.35585 15035.585 2020-01-01 2020-01-02 2020-01-01 00:10:18 2020-01-02 03:38:39 2020-01-01 00:10:18.000 2020-01-02 03:38:39.000 618 99519 50068.5 5006850 618 99519 50068.5 5006850 -32552 32586 4848.66 484866 -127 124 0.02 2 +619 2 10609 99520 1.85885 298.85885 150.35885 15035.88588 1.85885 298.85886 150.35885 15035.88568 1.85885 298.85885 150.35885 15035.885 2020-01-01 2020-01-02 2020-01-01 00:10:19 2020-01-02 03:38:40 2020-01-01 00:10:19.000 2020-01-02 03:38:40.000 619 99520 50069.5 5006950 619 99520 50069.5 5006950 -32551 32587 4849.66 484966 -126 125 1.02 102 62 2 10052 99962 0.18618 300.18618 150.18618 15168.8048 0.18618 300.1862 150.18618 15168.80494 0.18618 300.18618 150.18617999999998 15168.80418 2020-01-01 2020-01-02 2020-01-01 00:01:02 2020-01-02 03:46:02 2020-01-01 00:01:02.000 2020-01-02 03:46:02.000 62 99962 50012 5051212 62 99962 50012 5051212 -32507 32428 4591.009900990099 463692 -127 124 -1.7821782178217822 -180 -620 2 10610 99521 1.86186 298.86186 150.36186 15036.18618 1.86186 298.86185 150.36185 15036.18598 1.86186 298.86186 150.36186 15036.18600 2020-01-01 2020-01-02 2020-01-01 00:10:20 2020-01-02 03:38:41 2020-01-01 00:10:20.000 2020-01-02 03:38:41.000 620 99521 50070.5 5007050 620 99521 50070.5 5007050 -32550 32588 4850.66 485066 -125 126 2.02 202 -621 2 10611 99522 1.86486 298.86486 150.36486 15036.48648 1.86486 298.86487 150.36486 15036.48673 1.86486 298.86486 150.36486000000002 15036.48600 2020-01-01 2020-01-02 2020-01-01 00:10:21 2020-01-02 03:38:42 2020-01-01 00:10:21.000 2020-01-02 03:38:42.000 621 99522 50071.5 5007150 621 99522 50071.5 5007150 -32549 32589 4851.66 485166 -124 127 3.02 302 -622 2 10612 99523 1.86786 298.86786 150.36786 15036.78678 1.86786 298.86786 150.36786 15036.78687 1.86786 298.86786 150.36786 15036.78600 2020-01-01 2020-01-02 2020-01-01 00:10:22 2020-01-02 03:38:43 2020-01-01 00:10:22.000 2020-01-02 03:38:43.000 622 99523 50072.5 5007250 622 99523 50072.5 5007250 -32548 32590 4852.66 485266 -128 127 1.46 146 -623 2 10613 99524 1.87087 298.87087 150.37087 15037.08708 1.87087 298.87088 150.37087 15037.08702 1.87087 298.87087 150.37087 15037.08700 2020-01-01 2020-01-02 2020-01-01 00:10:23 2020-01-02 03:38:44 2020-01-01 00:10:23.000 2020-01-02 03:38:44.000 623 99524 50073.5 5007350 623 99524 50073.5 5007350 -32547 32591 4853.66 485366 -128 123 -0.1 -10 -624 2 10614 99525 1.87387 298.87387 150.37387 15037.38738 1.87387 298.87387 150.37387 15037.38716 1.87387 298.87387 150.37387 15037.38700 2020-01-01 2020-01-02 2020-01-01 00:10:24 2020-01-02 03:38:45 2020-01-01 00:10:24.000 2020-01-02 03:38:45.000 624 99525 50074.5 5007450 624 99525 50074.5 5007450 -32546 32592 4854.66 485466 -127 124 0.9 90 -625 2 10615 99526 1.87687 298.87687 150.37687 15037.68768 1.87687 298.8769 150.37687 15037.68791 1.87687 298.87687 150.37687 15037.68700 2020-01-01 2020-01-02 2020-01-01 00:10:25 2020-01-02 03:38:46 2020-01-01 00:10:25.000 2020-01-02 03:38:46.000 625 99526 50075.5 5007550 625 99526 50075.5 5007550 -32545 32593 4855.66 485566 -126 125 1.9 190 -626 2 10616 99527 1.87987 298.87987 150.37987 15037.98798 1.87987 298.87988 150.37988 15037.9882 1.87987 298.87987 150.37986999999998 15037.98700 2020-01-01 2020-01-02 2020-01-01 00:10:26 2020-01-02 03:38:47 2020-01-01 00:10:26.000 2020-01-02 03:38:47.000 626 99527 50076.5 5007650 626 99527 50076.5 5007650 -32544 32594 4856.66 485666 -125 126 2.9 290 -627 2 10617 99528 1.88288 298.88288 150.38288 15038.28828 1.88288 298.88287 150.38288 15038.28834 1.88288 298.88288 150.38288 15038.28800 2020-01-01 2020-01-02 2020-01-01 00:10:27 2020-01-02 03:38:48 2020-01-01 00:10:27.000 2020-01-02 03:38:48.000 627 99528 50077.5 5007750 627 99528 50077.5 5007750 -32543 32595 4857.66 485766 -124 127 3.9 390 -628 2 10618 99529 1.88588 298.88588 150.38588 15038.58858 1.88588 298.8859 150.38588 15038.58849 1.88588 298.88588 150.38588 15038.58800 2020-01-01 2020-01-02 2020-01-01 00:10:28 2020-01-02 03:38:49 2020-01-01 00:10:28.000 2020-01-02 03:38:49.000 628 99529 50078.5 5007850 628 99529 50078.5 5007850 -32542 32596 4858.66 485866 -128 127 2.34 234 -629 2 10619 99530 1.88888 298.88888 150.38888 15038.88888 1.88888 298.8889 150.38888 15038.88862 1.88888 298.88888 150.38888 15038.88800 2020-01-01 2020-01-02 2020-01-01 00:10:29 2020-01-02 03:38:50 2020-01-01 00:10:29.000 2020-01-02 03:38:50.000 629 99530 50079.5 5007950 629 99530 50079.5 5007950 -32541 32597 4859.66 485966 -128 123 0.78 78 +620 2 10610 99521 1.86186 298.86186 150.36186 15036.18618 1.86186 298.86185 150.36185 15036.18598 1.86186 298.86186 150.36186 15036.186 2020-01-01 2020-01-02 2020-01-01 00:10:20 2020-01-02 03:38:41 2020-01-01 00:10:20.000 2020-01-02 03:38:41.000 620 99521 50070.5 5007050 620 99521 50070.5 5007050 -32550 32588 4850.66 485066 -125 126 2.02 202 +621 2 10611 99522 1.86486 298.86486 150.36486 15036.48648 1.86486 298.86487 150.36486 15036.48673 1.86486 298.86486 150.36486000000002 15036.486 2020-01-01 2020-01-02 2020-01-01 00:10:21 2020-01-02 03:38:42 2020-01-01 00:10:21.000 2020-01-02 03:38:42.000 621 99522 50071.5 5007150 621 99522 50071.5 5007150 -32549 32589 4851.66 485166 -124 127 3.02 302 +622 2 10612 99523 1.86786 298.86786 150.36786 15036.78678 1.86786 298.86786 150.36786 15036.78687 1.86786 298.86786 150.36786 15036.786 2020-01-01 2020-01-02 2020-01-01 00:10:22 2020-01-02 03:38:43 2020-01-01 00:10:22.000 2020-01-02 03:38:43.000 622 99523 50072.5 5007250 622 99523 50072.5 5007250 -32548 32590 4852.66 485266 -128 127 1.46 146 +623 2 10613 99524 1.87087 298.87087 150.37087 15037.08708 1.87087 298.87088 150.37087 15037.08702 1.87087 298.87087 150.37087 15037.087 2020-01-01 2020-01-02 2020-01-01 00:10:23 2020-01-02 03:38:44 2020-01-01 00:10:23.000 2020-01-02 03:38:44.000 623 99524 50073.5 5007350 623 99524 50073.5 5007350 -32547 32591 4853.66 485366 -128 123 -0.1 -10 +624 2 10614 99525 1.87387 298.87387 150.37387 15037.38738 1.87387 298.87387 150.37387 15037.38716 1.87387 298.87387 150.37387 15037.387 2020-01-01 2020-01-02 2020-01-01 00:10:24 2020-01-02 03:38:45 2020-01-01 00:10:24.000 2020-01-02 03:38:45.000 624 99525 50074.5 5007450 624 99525 50074.5 5007450 -32546 32592 4854.66 485466 -127 124 0.9 90 +625 2 10615 99526 1.87687 298.87687 150.37687 15037.68768 1.87687 298.8769 150.37687 15037.68791 1.87687 298.87687 150.37687 15037.687 2020-01-01 2020-01-02 2020-01-01 00:10:25 2020-01-02 03:38:46 2020-01-01 00:10:25.000 2020-01-02 03:38:46.000 625 99526 50075.5 5007550 625 99526 50075.5 5007550 -32545 32593 4855.66 485566 -126 125 1.9 190 +626 2 10616 99527 1.87987 298.87987 150.37987 15037.98798 1.87987 298.87988 150.37988 15037.9882 1.87987 298.87987 150.37986999999998 15037.987 2020-01-01 2020-01-02 2020-01-01 00:10:26 2020-01-02 03:38:47 2020-01-01 00:10:26.000 2020-01-02 03:38:47.000 626 99527 50076.5 5007650 626 99527 50076.5 5007650 -32544 32594 4856.66 485666 -125 126 2.9 290 +627 2 10617 99528 1.88288 298.88288 150.38288 15038.28828 1.88288 298.88287 150.38288 15038.28834 1.88288 298.88288 150.38288 15038.288 2020-01-01 2020-01-02 2020-01-01 00:10:27 2020-01-02 03:38:48 2020-01-01 00:10:27.000 2020-01-02 03:38:48.000 627 99528 50077.5 5007750 627 99528 50077.5 5007750 -32543 32595 4857.66 485766 -124 127 3.9 390 +628 2 10618 99529 1.88588 298.88588 150.38588 15038.58858 1.88588 298.8859 150.38588 15038.58849 1.88588 298.88588 150.38588 15038.588 2020-01-01 2020-01-02 2020-01-01 00:10:28 2020-01-02 03:38:49 2020-01-01 00:10:28.000 2020-01-02 03:38:49.000 628 99529 50078.5 5007850 628 99529 50078.5 5007850 -32542 32596 4858.66 485866 -128 127 2.34 234 +629 2 10619 99530 1.88888 298.88888 150.38888 15038.88888 1.88888 298.8889 150.38888 15038.88862 1.88888 298.88888 150.38888 15038.888 2020-01-01 2020-01-02 2020-01-01 00:10:29 2020-01-02 03:38:50 2020-01-01 00:10:29.000 2020-01-02 03:38:50.000 629 99530 50079.5 5007950 629 99530 50079.5 5007950 -32541 32597 4859.66 485966 -128 123 0.78 78 63 2 10053 99963 0.18918 300.18918 150.18918 15169.1081 0.18918 300.18918 150.18918 15169.10808 0.18918 300.18918 150.18918000000002 15169.10718 2020-01-01 2020-01-02 2020-01-01 00:01:03 2020-01-02 03:46:03 2020-01-01 00:01:03.000 2020-01-02 03:46:03.000 63 99963 50013 5051313 63 99963 50013 5051313 -32506 32429 4592.009900990099 463793 -126 125 -0.7821782178217822 -79 -630 2 10620 99531 1.89189 298.89189 150.39189 15039.18918 1.89189 298.8919 150.39189 15039.18937 1.89189 298.89189 150.39189 15039.18900 2020-01-01 2020-01-02 2020-01-01 00:10:30 2020-01-02 03:38:51 2020-01-01 00:10:30.000 2020-01-02 03:38:51.000 630 99531 50080.5 5008050 630 99531 50080.5 5008050 -32540 32598 4860.66 486066 -127 124 1.78 178 -631 2 10621 99532 1.89489 298.89489 150.39489 15039.48948 1.89489 298.8949 150.39489 15039.48968 1.89489 298.89489 150.39489 15039.48900 2020-01-01 2020-01-02 2020-01-01 00:10:31 2020-01-02 03:38:52 2020-01-01 00:10:31.000 2020-01-02 03:38:52.000 631 99532 50081.5 5008150 631 99532 50081.5 5008150 -32539 32599 4861.66 486166 -126 125 2.78 278 -632 2 10622 99533 1.89789 298.89789 150.39789 15039.78978 1.89789 298.8979 150.39789 15039.78984 1.89789 298.89789 150.39789000000002 15039.78900 2020-01-01 2020-01-02 2020-01-01 00:10:32 2020-01-02 03:38:53 2020-01-01 00:10:32.000 2020-01-02 03:38:53.000 632 99533 50082.5 5008250 632 99533 50082.5 5008250 -32538 32600 4862.66 486266 -125 126 3.78 378 -633 2 10623 99534 1.9009 298.9009 150.4009 15040.09009 1.9009 298.9009 150.40089 15040.08996 1.90090 298.90090 150.4009 15040.09000 2020-01-01 2020-01-02 2020-01-01 00:10:33 2020-01-02 03:38:54 2020-01-01 00:10:33.000 2020-01-02 03:38:54.000 633 99534 50083.5 5008350 633 99534 50083.5 5008350 -32537 32601 4863.66 486366 -124 127 4.78 478 -634 2 10624 99535 1.9039 298.9039 150.4039 15040.39039 1.9039 298.9039 150.4039 15040.39009 1.90390 298.90390 150.4039 15040.39000 2020-01-01 2020-01-02 2020-01-01 00:10:34 2020-01-02 03:38:55 2020-01-01 00:10:34.000 2020-01-02 03:38:55.000 634 99535 50084.5 5008450 634 99535 50084.5 5008450 -32536 32602 4864.66 486466 -128 127 3.22 322 -635 2 10625 99536 1.9069 298.9069 150.4069 15040.69069 1.9069 298.90692 150.4069 15040.69084 1.90690 298.90690 150.4069 15040.69000 2020-01-01 2020-01-02 2020-01-01 00:10:35 2020-01-02 03:38:56 2020-01-01 00:10:35.000 2020-01-02 03:38:56.000 635 99536 50085.5 5008550 635 99536 50085.5 5008550 -32535 32603 4865.66 486566 -128 127 1.66 166 -636 2 10626 99537 1.9099 298.9099 150.4099 15040.99099 1.90991 298.9099 150.40991 15040.99115 1.90990 298.90990 150.4099 15040.99000 2020-01-01 2020-01-02 2020-01-01 00:10:36 2020-01-02 03:38:57 2020-01-01 00:10:36.000 2020-01-02 03:38:57.000 636 99537 50086.5 5008650 636 99537 50086.5 5008650 -32534 32604 4866.66 486666 -128 124 0.1 10 -637 2 10627 99538 1.91291 298.91291 150.41291 15041.29129 1.91291 298.9129 150.41291 15041.29131 1.91291 298.91291 150.41290999999998 15041.29100 2020-01-01 2020-01-02 2020-01-01 00:10:37 2020-01-02 03:38:58 2020-01-01 00:10:37.000 2020-01-02 03:38:58.000 637 99538 50087.5 5008750 637 99538 50087.5 5008750 -32533 32605 4867.66 486766 -127 125 1.1 110 -638 2 10628 99539 1.91591 298.91591 150.41591 15041.59159 1.91591 298.91592 150.41591 15041.59143 1.91591 298.91591 150.41591 15041.59100 2020-01-01 2020-01-02 2020-01-01 00:10:38 2020-01-02 03:38:59 2020-01-01 00:10:38.000 2020-01-02 03:38:59.000 638 99539 50088.5 5008850 638 99539 50088.5 5008850 -32532 32606 4868.66 486866 -126 126 2.1 210 -639 2 10629 99540 1.91891 298.91891 150.41891 15041.89189 1.91891 298.9189 150.41891 15041.89172 1.91891 298.91891 150.41890999999998 15041.89100 2020-01-01 2020-01-02 2020-01-01 00:10:39 2020-01-02 03:39:00 2020-01-01 00:10:39.000 2020-01-02 03:39:00.000 639 99540 50089.5 5008950 639 99540 50089.5 5008950 -32531 32607 4869.66 486966 -125 127 3.1 310 +630 2 10620 99531 1.89189 298.89189 150.39189 15039.18918 1.89189 298.8919 150.39189 15039.18937 1.89189 298.89189 150.39189 15039.189 2020-01-01 2020-01-02 2020-01-01 00:10:30 2020-01-02 03:38:51 2020-01-01 00:10:30.000 2020-01-02 03:38:51.000 630 99531 50080.5 5008050 630 99531 50080.5 5008050 -32540 32598 4860.66 486066 -127 124 1.78 178 +631 2 10621 99532 1.89489 298.89489 150.39489 15039.48948 1.89489 298.8949 150.39489 15039.48968 1.89489 298.89489 150.39489 15039.489 2020-01-01 2020-01-02 2020-01-01 00:10:31 2020-01-02 03:38:52 2020-01-01 00:10:31.000 2020-01-02 03:38:52.000 631 99532 50081.5 5008150 631 99532 50081.5 5008150 -32539 32599 4861.66 486166 -126 125 2.78 278 +632 2 10622 99533 1.89789 298.89789 150.39789 15039.78978 1.89789 298.8979 150.39789 15039.78984 1.89789 298.89789 150.39789000000002 15039.789 2020-01-01 2020-01-02 2020-01-01 00:10:32 2020-01-02 03:38:53 2020-01-01 00:10:32.000 2020-01-02 03:38:53.000 632 99533 50082.5 5008250 632 99533 50082.5 5008250 -32538 32600 4862.66 486266 -125 126 3.78 378 +633 2 10623 99534 1.9009 298.9009 150.4009 15040.09009 1.9009 298.9009 150.40089 15040.08996 1.9009 298.9009 150.4009 15040.09 2020-01-01 2020-01-02 2020-01-01 00:10:33 2020-01-02 03:38:54 2020-01-01 00:10:33.000 2020-01-02 03:38:54.000 633 99534 50083.5 5008350 633 99534 50083.5 5008350 -32537 32601 4863.66 486366 -124 127 4.78 478 +634 2 10624 99535 1.9039 298.9039 150.4039 15040.39039 1.9039 298.9039 150.4039 15040.39009 1.9039 298.9039 150.4039 15040.39 2020-01-01 2020-01-02 2020-01-01 00:10:34 2020-01-02 03:38:55 2020-01-01 00:10:34.000 2020-01-02 03:38:55.000 634 99535 50084.5 5008450 634 99535 50084.5 5008450 -32536 32602 4864.66 486466 -128 127 3.22 322 +635 2 10625 99536 1.9069 298.9069 150.4069 15040.69069 1.9069 298.90692 150.4069 15040.69084 1.9069 298.9069 150.4069 15040.69 2020-01-01 2020-01-02 2020-01-01 00:10:35 2020-01-02 03:38:56 2020-01-01 00:10:35.000 2020-01-02 03:38:56.000 635 99536 50085.5 5008550 635 99536 50085.5 5008550 -32535 32603 4865.66 486566 -128 127 1.66 166 +636 2 10626 99537 1.9099 298.9099 150.4099 15040.99099 1.90991 298.9099 150.40991 15040.99115 1.9099 298.9099 150.4099 15040.99 2020-01-01 2020-01-02 2020-01-01 00:10:36 2020-01-02 03:38:57 2020-01-01 00:10:36.000 2020-01-02 03:38:57.000 636 99537 50086.5 5008650 636 99537 50086.5 5008650 -32534 32604 4866.66 486666 -128 124 0.1 10 +637 2 10627 99538 1.91291 298.91291 150.41291 15041.29129 1.91291 298.9129 150.41291 15041.29131 1.91291 298.91291 150.41290999999998 15041.291 2020-01-01 2020-01-02 2020-01-01 00:10:37 2020-01-02 03:38:58 2020-01-01 00:10:37.000 2020-01-02 03:38:58.000 637 99538 50087.5 5008750 637 99538 50087.5 5008750 -32533 32605 4867.66 486766 -127 125 1.1 110 +638 2 10628 99539 1.91591 298.91591 150.41591 15041.59159 1.91591 298.91592 150.41591 15041.59143 1.91591 298.91591 150.41591 15041.591 2020-01-01 2020-01-02 2020-01-01 00:10:38 2020-01-02 03:38:59 2020-01-01 00:10:38.000 2020-01-02 03:38:59.000 638 99539 50088.5 5008850 638 99539 50088.5 5008850 -32532 32606 4868.66 486866 -126 126 2.1 210 +639 2 10629 99540 1.91891 298.91891 150.41891 15041.89189 1.91891 298.9189 150.41891 15041.89172 1.91891 298.91891 150.41890999999998 15041.891 2020-01-01 2020-01-02 2020-01-01 00:10:39 2020-01-02 03:39:00 2020-01-01 00:10:39.000 2020-01-02 03:39:00.000 639 99540 50089.5 5008950 639 99540 50089.5 5008950 -32531 32607 4869.66 486966 -125 127 3.1 310 64 2 10054 99964 0.19219 300.19219 150.19219 15169.41141 0.19219 300.1922 150.19219 15169.41184 0.19219 300.19219 150.19219 15169.41119 2020-01-01 2020-01-02 2020-01-01 00:01:04 2020-01-02 03:46:04 2020-01-01 00:01:04.000 2020-01-02 03:46:04.000 64 99964 50014 5051414 64 99964 50014 5051414 -32505 32430 4593.009900990099 463894 -125 126 0.21782178217821782 22 -640 2 10630 99541 1.92192 298.92192 150.42192 15042.19219 1.92192 298.92194 150.42192 15042.19232 1.92192 298.92192 150.42192 15042.19200 2020-01-01 2020-01-02 2020-01-01 00:10:40 2020-01-02 03:39:01 2020-01-01 00:10:40.000 2020-01-02 03:39:01.000 640 99541 50090.5 5009050 640 99541 50090.5 5009050 -32530 32608 4870.66 487066 -128 127 1.54 154 -641 2 10631 99542 1.92492 298.92492 150.42492 15042.49249 1.92492 298.92493 150.42492 15042.49265 1.92492 298.92492 150.42492000000001 15042.49200 2020-01-01 2020-01-02 2020-01-01 00:10:41 2020-01-02 03:39:02 2020-01-01 00:10:41.000 2020-01-02 03:39:02.000 641 99542 50091.5 5009150 641 99542 50091.5 5009150 -32529 32609 4871.66 487166 -128 127 -0.02 -2 -642 2 10632 99543 1.92792 298.92792 150.42792 15042.79279 1.92792 298.92792 150.42792 15042.79278 1.92792 298.92792 150.42792 15042.79200 2020-01-01 2020-01-02 2020-01-01 00:10:42 2020-01-02 03:39:03 2020-01-01 00:10:42.000 2020-01-02 03:39:03.000 642 99543 50092.5 5009250 642 99543 50092.5 5009250 -32528 32610 4872.66 487266 -128 123 -1.58 -158 -643 2 10633 99544 1.93093 298.93093 150.43093 15043.09309 1.93093 298.93094 150.43092 15043.0929 1.93093 298.93093 150.43093000000002 15043.09300 2020-01-01 2020-01-02 2020-01-01 00:10:43 2020-01-02 03:39:04 2020-01-01 00:10:43.000 2020-01-02 03:39:04.000 643 99544 50093.5 5009350 643 99544 50093.5 5009350 -32527 32611 4873.66 487366 -127 124 -0.58 -58 -644 2 10634 99545 1.93393 298.93393 150.43393 15043.39339 1.93393 298.93393 150.43393 15043.39319 1.93393 298.93393 150.43393 15043.39300 2020-01-01 2020-01-02 2020-01-01 00:10:44 2020-01-02 03:39:05 2020-01-01 00:10:44.000 2020-01-02 03:39:05.000 644 99545 50094.5 5009450 644 99545 50094.5 5009450 -32526 32612 4874.66 487466 -126 125 0.42 42 -645 2 10635 99546 1.93693 298.93693 150.43693 15043.69369 1.93693 298.93695 150.43693 15043.69379 1.93693 298.93693 150.43693 15043.69300 2020-01-01 2020-01-02 2020-01-01 00:10:45 2020-01-02 03:39:06 2020-01-01 00:10:45.000 2020-01-02 03:39:06.000 645 99546 50095.5 5009550 645 99546 50095.5 5009550 -32525 32613 4875.66 487566 -125 126 1.42 142 -646 2 10636 99547 1.93993 298.93993 150.43993 15043.99399 1.93994 298.93994 150.43994 15043.99412 1.93993 298.93993 150.43993 15043.99300 2020-01-01 2020-01-02 2020-01-01 00:10:46 2020-01-02 03:39:07 2020-01-01 00:10:46.000 2020-01-02 03:39:07.000 646 99547 50096.5 5009650 646 99547 50096.5 5009650 -32524 32614 4876.66 487666 -124 127 2.42 242 -647 2 10637 99548 1.94294 298.94294 150.44294 15044.29429 1.94294 298.94293 150.44294 15044.29425 1.94294 298.94294 150.44294 15044.29400 2020-01-01 2020-01-02 2020-01-01 00:10:47 2020-01-02 03:39:08 2020-01-01 00:10:47.000 2020-01-02 03:39:08.000 647 99548 50097.5 5009750 647 99548 50097.5 5009750 -32523 32615 4877.66 487766 -128 127 0.86 86 -648 2 10638 99549 1.94594 298.94594 150.44594 15044.59459 1.94594 298.94595 150.44595 15044.595 1.94594 298.94594 150.44593999999998 15044.59400 2020-01-01 2020-01-02 2020-01-01 00:10:48 2020-01-02 03:39:09 2020-01-01 00:10:48.000 2020-01-02 03:39:09.000 648 99549 50098.5 5009850 648 99549 50098.5 5009850 -32522 32616 4878.66 487866 -128 123 -0.7 -70 -649 2 10639 99550 1.94894 298.94894 150.44894 15044.89489 1.94894 298.94894 150.44894 15044.89467 1.94894 298.94894 150.44894 15044.89400 2020-01-01 2020-01-02 2020-01-01 00:10:49 2020-01-02 03:39:10 2020-01-01 00:10:49.000 2020-01-02 03:39:10.000 649 99550 50099.5 5009950 649 99550 50099.5 5009950 -32521 32617 4879.66 487966 -127 124 0.3 30 +640 2 10630 99541 1.92192 298.92192 150.42192 15042.19219 1.92192 298.92194 150.42192 15042.19232 1.92192 298.92192 150.42192 15042.192 2020-01-01 2020-01-02 2020-01-01 00:10:40 2020-01-02 03:39:01 2020-01-01 00:10:40.000 2020-01-02 03:39:01.000 640 99541 50090.5 5009050 640 99541 50090.5 5009050 -32530 32608 4870.66 487066 -128 127 1.54 154 +641 2 10631 99542 1.92492 298.92492 150.42492 15042.49249 1.92492 298.92493 150.42492 15042.49265 1.92492 298.92492 150.42492000000001 15042.492 2020-01-01 2020-01-02 2020-01-01 00:10:41 2020-01-02 03:39:02 2020-01-01 00:10:41.000 2020-01-02 03:39:02.000 641 99542 50091.5 5009150 641 99542 50091.5 5009150 -32529 32609 4871.66 487166 -128 127 -0.02 -2 +642 2 10632 99543 1.92792 298.92792 150.42792 15042.79279 1.92792 298.92792 150.42792 15042.79278 1.92792 298.92792 150.42792 15042.792 2020-01-01 2020-01-02 2020-01-01 00:10:42 2020-01-02 03:39:03 2020-01-01 00:10:42.000 2020-01-02 03:39:03.000 642 99543 50092.5 5009250 642 99543 50092.5 5009250 -32528 32610 4872.66 487266 -128 123 -1.58 -158 +643 2 10633 99544 1.93093 298.93093 150.43093 15043.09309 1.93093 298.93094 150.43092 15043.0929 1.93093 298.93093 150.43093000000002 15043.093 2020-01-01 2020-01-02 2020-01-01 00:10:43 2020-01-02 03:39:04 2020-01-01 00:10:43.000 2020-01-02 03:39:04.000 643 99544 50093.5 5009350 643 99544 50093.5 5009350 -32527 32611 4873.66 487366 -127 124 -0.58 -58 +644 2 10634 99545 1.93393 298.93393 150.43393 15043.39339 1.93393 298.93393 150.43393 15043.39319 1.93393 298.93393 150.43393 15043.393 2020-01-01 2020-01-02 2020-01-01 00:10:44 2020-01-02 03:39:05 2020-01-01 00:10:44.000 2020-01-02 03:39:05.000 644 99545 50094.5 5009450 644 99545 50094.5 5009450 -32526 32612 4874.66 487466 -126 125 0.42 42 +645 2 10635 99546 1.93693 298.93693 150.43693 15043.69369 1.93693 298.93695 150.43693 15043.69379 1.93693 298.93693 150.43693 15043.693 2020-01-01 2020-01-02 2020-01-01 00:10:45 2020-01-02 03:39:06 2020-01-01 00:10:45.000 2020-01-02 03:39:06.000 645 99546 50095.5 5009550 645 99546 50095.5 5009550 -32525 32613 4875.66 487566 -125 126 1.42 142 +646 2 10636 99547 1.93993 298.93993 150.43993 15043.99399 1.93994 298.93994 150.43994 15043.99412 1.93993 298.93993 150.43993 15043.993 2020-01-01 2020-01-02 2020-01-01 00:10:46 2020-01-02 03:39:07 2020-01-01 00:10:46.000 2020-01-02 03:39:07.000 646 99547 50096.5 5009650 646 99547 50096.5 5009650 -32524 32614 4876.66 487666 -124 127 2.42 242 +647 2 10637 99548 1.94294 298.94294 150.44294 15044.29429 1.94294 298.94293 150.44294 15044.29425 1.94294 298.94294 150.44294 15044.294 2020-01-01 2020-01-02 2020-01-01 00:10:47 2020-01-02 03:39:08 2020-01-01 00:10:47.000 2020-01-02 03:39:08.000 647 99548 50097.5 5009750 647 99548 50097.5 5009750 -32523 32615 4877.66 487766 -128 127 0.86 86 +648 2 10638 99549 1.94594 298.94594 150.44594 15044.59459 1.94594 298.94595 150.44595 15044.595 1.94594 298.94594 150.44593999999998 15044.594 2020-01-01 2020-01-02 2020-01-01 00:10:48 2020-01-02 03:39:09 2020-01-01 00:10:48.000 2020-01-02 03:39:09.000 648 99549 50098.5 5009850 648 99549 50098.5 5009850 -32522 32616 4878.66 487866 -128 123 -0.7 -70 +649 2 10639 99550 1.94894 298.94894 150.44894 15044.89489 1.94894 298.94894 150.44894 15044.89467 1.94894 298.94894 150.44894 15044.894 2020-01-01 2020-01-02 2020-01-01 00:10:49 2020-01-02 03:39:10 2020-01-01 00:10:49.000 2020-01-02 03:39:10.000 649 99550 50099.5 5009950 649 99550 50099.5 5009950 -32521 32617 4879.66 487966 -127 124 0.3 30 65 2 10055 99965 0.19519 300.19519 150.19519 15169.71471 0.19519 300.1952 150.19519 15169.71448 0.19519 300.19519 150.19519 15169.71419 2020-01-01 2020-01-02 2020-01-01 00:01:05 2020-01-02 03:46:05 2020-01-01 00:01:05.000 2020-01-02 03:46:05.000 65 99965 50015 5051515 65 99965 50015 5051515 -32504 32431 4594.009900990099 463995 -124 127 1.2178217821782178 123 -650 2 10640 99551 1.95195 298.95195 150.45195 15045.19519 1.95195 298.95197 150.45195 15045.19525 1.95195 298.95195 150.45195 15045.19500 2020-01-01 2020-01-02 2020-01-01 00:10:50 2020-01-02 03:39:11 2020-01-01 00:10:50.000 2020-01-02 03:39:11.000 650 99551 50100.5 5010050 650 99551 50100.5 5010050 -32520 32618 4880.66 488066 -126 125 1.3 130 -651 2 10641 99552 1.95495 298.95495 150.45495 15045.49549 1.95495 298.95496 150.45495 15045.49558 1.95495 298.95495 150.45495 15045.49500 2020-01-01 2020-01-02 2020-01-01 00:10:51 2020-01-02 03:39:12 2020-01-01 00:10:51.000 2020-01-02 03:39:12.000 651 99552 50101.5 5010150 651 99552 50101.5 5010150 -32519 32619 4881.66 488166 -125 126 2.3 230 -652 2 10642 99553 1.95795 298.95795 150.45795 15045.79579 1.95795 298.95795 150.45795 15045.79572 1.95795 298.95795 150.45795 15045.79500 2020-01-01 2020-01-02 2020-01-01 00:10:52 2020-01-02 03:39:13 2020-01-01 00:10:52.000 2020-01-02 03:39:13.000 652 99553 50102.5 5010250 652 99553 50102.5 5010250 -32518 32620 4882.66 488266 -124 127 3.3 330 -653 2 10643 99554 1.96096 298.96096 150.46096 15046.09609 1.96096 298.96097 150.46096 15046.09647 1.96096 298.96096 150.46096 15046.09600 2020-01-01 2020-01-02 2020-01-01 00:10:53 2020-01-02 03:39:14 2020-01-01 00:10:53.000 2020-01-02 03:39:14.000 653 99554 50103.5 5010350 653 99554 50103.5 5010350 -32517 32621 4883.66 488366 -128 127 1.74 174 -654 2 10644 99555 1.96396 298.96396 150.46396 15046.39639 1.96396 298.96396 150.46396 15046.39613 1.96396 298.96396 150.46396000000001 15046.39600 2020-01-01 2020-01-02 2020-01-01 00:10:54 2020-01-02 03:39:15 2020-01-01 00:10:54.000 2020-01-02 03:39:15.000 654 99555 50104.5 5010450 654 99555 50104.5 5010450 -32516 32622 4884.66 488466 -128 123 0.18 18 -655 2 10645 99556 1.96696 298.96696 150.46696 15046.69669 1.96696 298.96698 150.46696 15046.69676 1.96696 298.96696 150.46696 15046.69600 2020-01-01 2020-01-02 2020-01-01 00:10:55 2020-01-02 03:39:16 2020-01-01 00:10:55.000 2020-01-02 03:39:16.000 655 99556 50105.5 5010550 655 99556 50105.5 5010550 -32515 32623 4885.66 488566 -127 124 1.18 118 -656 2 10646 99557 1.96996 298.96996 150.46996 15046.99699 1.96997 298.96997 150.46997 15046.99706 1.96996 298.96996 150.46996 15046.99600 2020-01-01 2020-01-02 2020-01-01 00:10:56 2020-01-02 03:39:17 2020-01-01 00:10:56.000 2020-01-02 03:39:17.000 656 99557 50106.5 5010650 656 99557 50106.5 5010650 -32514 32624 4886.66 488666 -126 125 2.18 218 -657 2 10647 99558 1.97297 298.97297 150.47297 15047.29729 1.97297 298.97296 150.47297 15047.29735 1.97297 298.97297 150.47297 15047.29700 2020-01-01 2020-01-02 2020-01-01 00:10:57 2020-01-02 03:39:18 2020-01-01 00:10:57.000 2020-01-02 03:39:18.000 657 99558 50107.5 5010750 657 99558 50107.5 5010750 -32513 32625 4887.66 488766 -125 126 3.18 318 -658 2 10648 99559 1.97597 298.97597 150.47597 15047.59759 1.97597 298.97598 150.47597 15047.59794 1.97597 298.97597 150.47597 15047.59700 2020-01-01 2020-01-02 2020-01-01 00:10:58 2020-01-02 03:39:19 2020-01-01 00:10:58.000 2020-01-02 03:39:19.000 658 99559 50108.5 5010850 658 99559 50108.5 5010850 -32512 32626 4888.66 488866 -124 127 4.18 418 -659 2 10649 99560 1.97897 298.97897 150.47897 15047.89789 1.97897 298.97897 150.47897 15047.8976 1.97897 298.97897 150.47897 15047.89700 2020-01-01 2020-01-02 2020-01-01 00:10:59 2020-01-02 03:39:20 2020-01-01 00:10:59.000 2020-01-02 03:39:20.000 659 99560 50109.5 5010950 659 99560 50109.5 5010950 -32511 32627 4889.66 488966 -128 127 2.62 262 +650 2 10640 99551 1.95195 298.95195 150.45195 15045.19519 1.95195 298.95197 150.45195 15045.19525 1.95195 298.95195 150.45195 15045.195 2020-01-01 2020-01-02 2020-01-01 00:10:50 2020-01-02 03:39:11 2020-01-01 00:10:50.000 2020-01-02 03:39:11.000 650 99551 50100.5 5010050 650 99551 50100.5 5010050 -32520 32618 4880.66 488066 -126 125 1.3 130 +651 2 10641 99552 1.95495 298.95495 150.45495 15045.49549 1.95495 298.95496 150.45495 15045.49558 1.95495 298.95495 150.45495 15045.495 2020-01-01 2020-01-02 2020-01-01 00:10:51 2020-01-02 03:39:12 2020-01-01 00:10:51.000 2020-01-02 03:39:12.000 651 99552 50101.5 5010150 651 99552 50101.5 5010150 -32519 32619 4881.66 488166 -125 126 2.3 230 +652 2 10642 99553 1.95795 298.95795 150.45795 15045.79579 1.95795 298.95795 150.45795 15045.79572 1.95795 298.95795 150.45795 15045.795 2020-01-01 2020-01-02 2020-01-01 00:10:52 2020-01-02 03:39:13 2020-01-01 00:10:52.000 2020-01-02 03:39:13.000 652 99553 50102.5 5010250 652 99553 50102.5 5010250 -32518 32620 4882.66 488266 -124 127 3.3 330 +653 2 10643 99554 1.96096 298.96096 150.46096 15046.09609 1.96096 298.96097 150.46096 15046.09647 1.96096 298.96096 150.46096 15046.096 2020-01-01 2020-01-02 2020-01-01 00:10:53 2020-01-02 03:39:14 2020-01-01 00:10:53.000 2020-01-02 03:39:14.000 653 99554 50103.5 5010350 653 99554 50103.5 5010350 -32517 32621 4883.66 488366 -128 127 1.74 174 +654 2 10644 99555 1.96396 298.96396 150.46396 15046.39639 1.96396 298.96396 150.46396 15046.39613 1.96396 298.96396 150.46396000000001 15046.396 2020-01-01 2020-01-02 2020-01-01 00:10:54 2020-01-02 03:39:15 2020-01-01 00:10:54.000 2020-01-02 03:39:15.000 654 99555 50104.5 5010450 654 99555 50104.5 5010450 -32516 32622 4884.66 488466 -128 123 0.18 18 +655 2 10645 99556 1.96696 298.96696 150.46696 15046.69669 1.96696 298.96698 150.46696 15046.69676 1.96696 298.96696 150.46696 15046.696 2020-01-01 2020-01-02 2020-01-01 00:10:55 2020-01-02 03:39:16 2020-01-01 00:10:55.000 2020-01-02 03:39:16.000 655 99556 50105.5 5010550 655 99556 50105.5 5010550 -32515 32623 4885.66 488566 -127 124 1.18 118 +656 2 10646 99557 1.96996 298.96996 150.46996 15046.99699 1.96997 298.96997 150.46997 15046.99706 1.96996 298.96996 150.46996 15046.996 2020-01-01 2020-01-02 2020-01-01 00:10:56 2020-01-02 03:39:17 2020-01-01 00:10:56.000 2020-01-02 03:39:17.000 656 99557 50106.5 5010650 656 99557 50106.5 5010650 -32514 32624 4886.66 488666 -126 125 2.18 218 +657 2 10647 99558 1.97297 298.97297 150.47297 15047.29729 1.97297 298.97296 150.47297 15047.29735 1.97297 298.97297 150.47297 15047.297 2020-01-01 2020-01-02 2020-01-01 00:10:57 2020-01-02 03:39:18 2020-01-01 00:10:57.000 2020-01-02 03:39:18.000 657 99558 50107.5 5010750 657 99558 50107.5 5010750 -32513 32625 4887.66 488766 -125 126 3.18 318 +658 2 10648 99559 1.97597 298.97597 150.47597 15047.59759 1.97597 298.97598 150.47597 15047.59794 1.97597 298.97597 150.47597 15047.597 2020-01-01 2020-01-02 2020-01-01 00:10:58 2020-01-02 03:39:19 2020-01-01 00:10:58.000 2020-01-02 03:39:19.000 658 99559 50108.5 5010850 658 99559 50108.5 5010850 -32512 32626 4888.66 488866 -124 127 4.18 418 +659 2 10649 99560 1.97897 298.97897 150.47897 15047.89789 1.97897 298.97897 150.47897 15047.8976 1.97897 298.97897 150.47897 15047.897 2020-01-01 2020-01-02 2020-01-01 00:10:59 2020-01-02 03:39:20 2020-01-01 00:10:59.000 2020-01-02 03:39:20.000 659 99560 50109.5 5010950 659 99560 50109.5 5010950 -32511 32627 4889.66 488966 -128 127 2.62 262 66 2 10056 99966 0.19819 300.19819 150.19819 15170.01801 0.19819 300.1982 150.19819 15170.01808 0.19819 300.19819 150.19819 15170.01719 2020-01-01 2020-01-02 2020-01-01 00:01:06 2020-01-02 03:46:06 2020-01-01 00:01:06.000 2020-01-02 03:46:06.000 66 99966 50016 5051616 66 99966 50016 5051616 -32503 32432 4595.009900990099 464096 -128 127 -0.31683168316831684 -32 -660 2 10650 99561 1.98198 298.98198 150.48198 15048.19819 1.98198 298.982 150.48198 15048.19822 1.98198 298.98198 150.48198 15048.19800 2020-01-01 2020-01-02 2020-01-01 00:11:00 2020-01-02 03:39:21 2020-01-01 00:11:00.000 2020-01-02 03:39:21.000 660 99561 50110.5 5011050 660 99561 50110.5 5011050 -32510 32628 4890.66 489066 -128 127 1.06 106 -661 2 10651 99562 1.98498 298.98498 150.48498 15048.49849 1.98498 298.985 150.48498 15048.49853 1.98498 298.98498 150.48498 15048.49800 2020-01-01 2020-01-02 2020-01-01 00:11:01 2020-01-02 03:39:22 2020-01-01 00:11:01.000 2020-01-02 03:39:22.000 661 99562 50111.5 5011150 661 99562 50111.5 5011150 -32509 32629 4891.66 489166 -128 124 -0.5 -50 -662 2 10652 99563 1.98798 298.98798 150.48798 15048.79879 1.98798 298.98798 150.48798 15048.79882 1.98798 298.98798 150.48798 15048.79800 2020-01-01 2020-01-02 2020-01-01 00:11:02 2020-01-02 03:39:23 2020-01-01 00:11:02.000 2020-01-02 03:39:23.000 662 99563 50112.5 5011250 662 99563 50112.5 5011250 -32508 32630 4892.66 489266 -127 125 0.5 50 -663 2 10653 99564 1.99099 298.99099 150.49099 15049.09909 1.99099 298.991 150.49099 15049.09942 1.99099 298.99099 150.49099 15049.09900 2020-01-01 2020-01-02 2020-01-01 00:11:03 2020-01-02 03:39:24 2020-01-01 00:11:03.000 2020-01-02 03:39:24.000 663 99564 50113.5 5011350 663 99564 50113.5 5011350 -32507 32631 4893.66 489366 -126 126 1.5 150 -664 2 10654 99565 1.99399 298.99399 150.49399 15049.39939 1.99399 298.994 150.49399 15049.39911 1.99399 298.99399 150.49399 15049.39900 2020-01-01 2020-01-02 2020-01-01 00:11:04 2020-01-02 03:39:25 2020-01-01 00:11:04.000 2020-01-02 03:39:25.000 664 99565 50114.5 5011450 664 99565 50114.5 5011450 -32506 32632 4894.66 489466 -125 127 2.5 250 -665 2 10655 99566 1.99699 298.99699 150.49699 15049.69969 1.99699 298.997 150.49699 15049.6997 1.99699 298.99699 150.49699 15049.69900 2020-01-01 2020-01-02 2020-01-01 00:11:05 2020-01-02 03:39:26 2020-01-01 00:11:05.000 2020-01-02 03:39:26.000 665 99566 50115.5 5011550 665 99566 50115.5 5011550 -32505 32633 4895.66 489566 -128 127 0.94 94 -666 2 10656 99567 2 299 150.5 15050 2 299 150.5 15050 2.00000 299.00000 150.5 15050.00000 2020-01-01 2020-01-02 2020-01-01 00:11:06 2020-01-02 03:39:27 2020-01-01 00:11:06.000 2020-01-02 03:39:27.000 666 99567 50116.5 5011650 666 99567 50116.5 5011650 -32504 32634 4896.66 489666 -128 127 -0.62 -62 -667 2 10657 99568 2.003 299.003 150.503 15050.3003 2.003 299.003 150.503 15050.30029 2.00300 299.00300 150.503 15050.30000 2020-01-01 2020-01-02 2020-01-01 00:11:07 2020-01-02 03:39:28 2020-01-01 00:11:07.000 2020-01-02 03:39:28.000 667 99568 50117.5 5011750 667 99568 50117.5 5011750 -32503 32635 4897.66 489766 -128 123 -2.18 -218 -668 2 10658 99569 2.006 299.006 150.506 15050.6006 2.006 299.006 150.506 15050.60089 2.00600 299.00600 150.506 15050.60000 2020-01-01 2020-01-02 2020-01-01 00:11:08 2020-01-02 03:39:29 2020-01-01 00:11:08.000 2020-01-02 03:39:29.000 668 99569 50118.5 5011850 668 99569 50118.5 5011850 -32502 32636 4898.66 489866 -127 124 -1.18 -118 -669 2 10659 99570 2.009 299.009 150.509 15050.9009 2.009 299.009 150.509 15050.90057 2.00900 299.00900 150.509 15050.90000 2020-01-01 2020-01-02 2020-01-01 00:11:09 2020-01-02 03:39:30 2020-01-01 00:11:09.000 2020-01-02 03:39:30.000 669 99570 50119.5 5011950 669 99570 50119.5 5011950 -32501 32637 4899.66 489966 -126 125 -0.18 -18 -67 2 10057 99967 0.2012 300.2012 150.2012 15170.32132 0.2012 300.2012 150.2012 15170.32142 0.20120 300.20120 150.2012 15170.32120 2020-01-01 2020-01-02 2020-01-01 00:01:07 2020-01-02 03:46:07 2020-01-01 00:01:07.000 2020-01-02 03:46:07.000 67 99967 50017 5051717 67 99967 50017 5051717 -32502 32433 4596.009900990099 464197 -128 127 -1.8514851485148516 -187 -670 2 10660 99571 2.01201 299.01201 150.51201 15051.2012 2.01201 299.01202 150.51201 15051.20117 2.01201 299.01201 150.51201 15051.20100 2020-01-01 2020-01-02 2020-01-01 00:11:10 2020-01-02 03:39:31 2020-01-01 00:11:10.000 2020-01-02 03:39:31.000 670 99571 50120.5 5012050 670 99571 50120.5 5012050 -32500 32638 4900.66 490066 -125 126 0.82 82 -671 2 10661 99572 2.01501 299.01501 150.51501 15051.5015 2.01501 299.015 150.51501 15051.50146 2.01501 299.01501 150.51501 15051.50100 2020-01-01 2020-01-02 2020-01-01 00:11:11 2020-01-02 03:39:32 2020-01-01 00:11:11.000 2020-01-02 03:39:32.000 671 99572 50121.5 5012150 671 99572 50121.5 5012150 -32499 32639 4901.66 490166 -124 127 1.82 182 -672 2 10662 99573 2.01801 299.01801 150.51801 15051.8018 2.01801 299.018 150.51801 15051.80176 2.01801 299.01801 150.51801 15051.80100 2020-01-01 2020-01-02 2020-01-01 00:11:12 2020-01-02 03:39:33 2020-01-01 00:11:12.000 2020-01-02 03:39:33.000 672 99573 50122.5 5012250 672 99573 50122.5 5012250 -32498 32640 4902.66 490266 -128 127 0.26 26 -673 2 10663 99574 2.02102 299.02102 150.52102 15052.1021 2.02102 299.02103 150.52102 15052.1024 2.02102 299.02102 150.52102000000002 15052.10200 2020-01-01 2020-01-02 2020-01-01 00:11:13 2020-01-02 03:39:34 2020-01-01 00:11:13.000 2020-01-02 03:39:34.000 673 99574 50123.5 5012350 673 99574 50123.5 5012350 -32497 32641 4903.66 490366 -128 123 -1.3 -130 -674 2 10664 99575 2.02402 299.02402 150.52402 15052.4024 2.02402 299.02402 150.52402 15052.40204 2.02402 299.02402 150.52402 15052.40200 2020-01-01 2020-01-02 2020-01-01 00:11:14 2020-01-02 03:39:35 2020-01-01 00:11:14.000 2020-01-02 03:39:35.000 674 99575 50124.5 5012450 674 99575 50124.5 5012450 -32496 32642 4904.66 490466 -127 124 -0.3 -30 -675 2 10665 99576 2.02702 299.02702 150.52702 15052.7027 2.02702 299.02704 150.52702 15052.70264 2.02702 299.02702 150.52702 15052.70200 2020-01-01 2020-01-02 2020-01-01 00:11:15 2020-01-02 03:39:36 2020-01-01 00:11:15.000 2020-01-02 03:39:36.000 675 99576 50125.5 5012550 675 99576 50125.5 5012550 -32495 32643 4905.66 490566 -126 125 0.7 70 -676 2 10666 99577 2.03003 299.03003 150.53003 15053.003 2.03003 299.03003 150.53002 15053.00293 2.03003 299.03003 150.53003 15053.00300 2020-01-01 2020-01-02 2020-01-01 00:11:16 2020-01-02 03:39:37 2020-01-01 00:11:16.000 2020-01-02 03:39:37.000 676 99577 50126.5 5012650 676 99577 50126.5 5012650 -32494 32644 4906.66 490666 -125 126 1.7 170 -677 2 10667 99578 2.03303 299.03303 150.53303 15053.3033 2.03303 299.03302 150.53303 15053.30323 2.03303 299.03303 150.53303 15053.30300 2020-01-01 2020-01-02 2020-01-01 00:11:17 2020-01-02 03:39:38 2020-01-01 00:11:17.000 2020-01-02 03:39:38.000 677 99578 50127.5 5012750 677 99578 50127.5 5012750 -32493 32645 4907.66 490766 -124 127 2.7 270 -678 2 10668 99579 2.03603 299.03603 150.53603 15053.6036 2.03603 299.03604 150.53603 15053.60387 2.03603 299.03603 150.53602999999998 15053.60300 2020-01-01 2020-01-02 2020-01-01 00:11:18 2020-01-02 03:39:39 2020-01-01 00:11:18.000 2020-01-02 03:39:39.000 678 99579 50128.5 5012850 678 99579 50128.5 5012850 -32492 32646 4908.66 490866 -128 127 1.14 114 -679 2 10669 99580 2.03903 299.03903 150.53903 15053.9039 2.03903 299.03903 150.53903 15053.90351 2.03903 299.03903 150.53903 15053.90300 2020-01-01 2020-01-02 2020-01-01 00:11:19 2020-01-02 03:39:40 2020-01-01 00:11:19.000 2020-01-02 03:39:40.000 679 99580 50129.5 5012950 679 99580 50129.5 5012950 -32491 32647 4909.66 490966 -128 123 -0.42 -42 -68 2 10058 99968 0.2042 300.2042 150.2042 15170.62462 0.2042 300.2042 150.2042 15170.62457 0.20420 300.20420 150.20420000000001 15170.62420 2020-01-01 2020-01-02 2020-01-01 00:01:08 2020-01-02 03:46:08 2020-01-01 00:01:08.000 2020-01-02 03:46:08.000 68 99968 50018 5051818 68 99968 50018 5051818 -32501 32434 4597.009900990099 464298 -128 124 -3.386138613861386 -342 -680 2 10670 99581 2.04204 299.04204 150.54204 15054.2042 2.04204 299.04205 150.54204 15054.20426 2.04204 299.04204 150.54204 15054.20400 2020-01-01 2020-01-02 2020-01-01 00:11:20 2020-01-02 03:39:41 2020-01-01 00:11:20.000 2020-01-02 03:39:41.000 680 99581 50130.5 5013050 680 99581 50130.5 5013050 -32490 32648 4910.66 491066 -127 124 0.58 58 -681 2 10671 99582 2.04504 299.04504 150.54504 15054.5045 2.04504 299.04504 150.54504 15054.5044 2.04504 299.04504 150.54504 15054.50400 2020-01-01 2020-01-02 2020-01-01 00:11:21 2020-01-02 03:39:42 2020-01-01 00:11:21.000 2020-01-02 03:39:42.000 681 99582 50131.5 5013150 681 99582 50131.5 5013150 -32489 32649 4911.66 491166 -126 125 1.58 158 -682 2 10672 99583 2.04804 299.04804 150.54804 15054.8048 2.04804 299.04803 150.54804 15054.80474 2.04804 299.04804 150.54804000000001 15054.80400 2020-01-01 2020-01-02 2020-01-01 00:11:22 2020-01-02 03:39:43 2020-01-01 00:11:22.000 2020-01-02 03:39:43.000 682 99583 50132.5 5013250 682 99583 50132.5 5013250 -32488 32650 4912.66 491266 -125 126 2.58 258 -683 2 10673 99584 2.05105 299.05105 150.55105 15055.1051 2.05105 299.05106 150.55105 15055.10533 2.05105 299.05105 150.55105 15055.10500 2020-01-01 2020-01-02 2020-01-01 00:11:23 2020-01-02 03:39:44 2020-01-01 00:11:23.000 2020-01-02 03:39:44.000 683 99584 50133.5 5013350 683 99584 50133.5 5013350 -32487 32651 4913.66 491366 -124 127 3.58 358 -684 2 10674 99585 2.05405 299.05405 150.55405 15055.4054 2.05405 299.05405 150.55404 15055.40498 2.05405 299.05405 150.55405000000002 15055.40500 2020-01-01 2020-01-02 2020-01-01 00:11:24 2020-01-02 03:39:45 2020-01-01 00:11:24.000 2020-01-02 03:39:45.000 684 99585 50134.5 5013450 684 99585 50134.5 5013450 -32486 32652 4914.66 491466 -128 127 2.02 202 -685 2 10675 99586 2.05705 299.05705 150.55705 15055.7057 2.05705 299.05707 150.55705 15055.70573 2.05705 299.05705 150.55705 15055.70500 2020-01-01 2020-01-02 2020-01-01 00:11:25 2020-01-02 03:39:46 2020-01-01 00:11:25.000 2020-01-02 03:39:46.000 685 99586 50135.5 5013550 685 99586 50135.5 5013550 -32485 32653 4915.66 491566 -128 127 0.46 46 -686 2 10676 99587 2.06006 299.06006 150.56006 15056.006 2.06006 299.06006 150.56005 15056.00587 2.06006 299.06006 150.56006 15056.00600 2020-01-01 2020-01-02 2020-01-01 00:11:26 2020-01-02 03:39:47 2020-01-01 00:11:26.000 2020-01-02 03:39:47.000 686 99587 50136.5 5013650 686 99587 50136.5 5013650 -32484 32654 4916.66 491666 -128 124 -1.1 -110 -687 2 10677 99588 2.06306 299.06306 150.56306 15056.3063 2.06306 299.06305 150.56306 15056.30621 2.06306 299.06306 150.56306 15056.30600 2020-01-01 2020-01-02 2020-01-01 00:11:27 2020-01-02 03:39:48 2020-01-01 00:11:27.000 2020-01-02 03:39:48.000 687 99588 50137.5 5013750 687 99588 50137.5 5013750 -32483 32655 4917.66 491766 -127 125 -0.1 -10 -688 2 10678 99589 2.06606 299.06606 150.56606 15056.6066 2.06606 299.06607 150.56606 15056.60681 2.06606 299.06606 150.56606 15056.60600 2020-01-01 2020-01-02 2020-01-01 00:11:28 2020-01-02 03:39:49 2020-01-01 00:11:28.000 2020-01-02 03:39:49.000 688 99589 50138.5 5013850 688 99589 50138.5 5013850 -32482 32656 4918.66 491866 -126 126 0.9 90 -689 2 10679 99590 2.06906 299.06906 150.56906 15056.9069 2.06906 299.06906 150.56907 15056.9071 2.06906 299.06906 150.56906 15056.90600 2020-01-01 2020-01-02 2020-01-01 00:11:29 2020-01-02 03:39:50 2020-01-01 00:11:29.000 2020-01-02 03:39:50.000 689 99590 50139.5 5013950 689 99590 50139.5 5013950 -32481 32657 4919.66 491966 -125 127 1.9 190 -69 2 10059 99969 0.2072 300.2072 150.2072 15170.92792 0.2072 300.2072 150.20721 15170.92832 0.20720 300.20720 150.2072 15170.92720 2020-01-01 2020-01-02 2020-01-01 00:01:09 2020-01-02 03:46:09 2020-01-01 00:01:09.000 2020-01-02 03:46:09.000 69 99969 50019 5051919 69 99969 50019 5051919 -32500 32435 4598.009900990099 464399 -127 125 -2.386138613861386 -241 -690 2 10680 99591 2.07207 299.07207 150.57207 15057.2072 2.07207 299.07208 150.57207 15057.2072 2.07207 299.07207 150.57207 15057.20700 2020-01-01 2020-01-02 2020-01-01 00:11:30 2020-01-02 03:39:51 2020-01-01 00:11:30.000 2020-01-02 03:39:51.000 690 99591 50140.5 5014050 690 99591 50140.5 5014050 -32480 32658 4920.66 492066 -128 127 0.34 34 -691 2 10681 99592 2.07507 299.07507 150.57507 15057.5075 2.07507 299.07507 150.57507 15057.50734 2.07507 299.07507 150.57506999999998 15057.50700 2020-01-01 2020-01-02 2020-01-01 00:11:31 2020-01-02 03:39:52 2020-01-01 00:11:31.000 2020-01-02 03:39:52.000 691 99592 50141.5 5014150 691 99592 50141.5 5014150 -32479 32659 4921.66 492166 -128 127 -1.22 -122 -692 2 10682 99593 2.07807 299.07807 150.57807 15057.8078 2.07807 299.07806 150.57807 15057.80767 2.07807 299.07807 150.57807 15057.80700 2020-01-01 2020-01-02 2020-01-01 00:11:32 2020-01-02 03:39:53 2020-01-01 00:11:32.000 2020-01-02 03:39:53.000 692 99593 50142.5 5014250 692 99593 50142.5 5014250 -32478 32660 4922.66 492266 -128 123 -2.78 -278 -693 2 10683 99594 2.08108 299.08108 150.58108 15058.1081 2.08108 299.0811 150.58108 15058.10827 2.08108 299.08108 150.58108000000001 15058.10800 2020-01-01 2020-01-02 2020-01-01 00:11:33 2020-01-02 03:39:54 2020-01-01 00:11:33.000 2020-01-02 03:39:54.000 693 99594 50143.5 5014350 693 99594 50143.5 5014350 -32477 32661 4923.66 492366 -127 124 -1.78 -178 -694 2 10684 99595 2.08408 299.08408 150.58408 15058.4084 2.08408 299.08408 150.58408 15058.40857 2.08408 299.08408 150.58408 15058.40800 2020-01-01 2020-01-02 2020-01-01 00:11:34 2020-01-02 03:39:55 2020-01-01 00:11:34.000 2020-01-02 03:39:55.000 694 99595 50144.5 5014450 694 99595 50144.5 5014450 -32476 32662 4924.66 492466 -126 125 -0.78 -78 -695 2 10685 99596 2.08708 299.08708 150.58708 15058.7087 2.08708 299.0871 150.58708 15058.70867 2.08708 299.08708 150.58708000000001 15058.70800 2020-01-01 2020-01-02 2020-01-01 00:11:35 2020-01-02 03:39:56 2020-01-01 00:11:35.000 2020-01-02 03:39:56.000 695 99596 50145.5 5014550 695 99596 50145.5 5014550 -32475 32663 4925.66 492566 -125 126 0.22 22 -696 2 10686 99597 2.09009 299.09009 150.59009 15059.009 2.09009 299.0901 150.59008 15059.00885 2.09009 299.09009 150.59009 15059.00900 2020-01-01 2020-01-02 2020-01-01 00:11:36 2020-01-02 03:39:57 2020-01-01 00:11:36.000 2020-01-02 03:39:57.000 696 99597 50146.5 5014650 696 99597 50146.5 5014650 -32474 32664 4926.66 492666 -124 127 1.22 122 -697 2 10687 99598 2.09309 299.09309 150.59309 15059.3093 2.09309 299.09308 150.59309 15059.30915 2.09309 299.09309 150.59309 15059.30900 2020-01-01 2020-01-02 2020-01-01 00:11:37 2020-01-02 03:39:58 2020-01-01 00:11:37.000 2020-01-02 03:39:58.000 697 99598 50147.5 5014750 697 99598 50147.5 5014750 -32473 32665 4927.66 492766 -128 127 -0.34 -34 -698 2 10688 99599 2.09609 299.09609 150.59609 15059.6096 2.09609 299.0961 150.59609 15059.6099 2.09609 299.09609 150.59609 15059.60900 2020-01-01 2020-01-02 2020-01-01 00:11:38 2020-01-02 03:39:59 2020-01-01 00:11:38.000 2020-01-02 03:39:59.000 698 99599 50148.5 5014850 698 99599 50148.5 5014850 -32472 32666 4928.66 492866 -128 123 -1.9 -190 -699 2 10689 99600 2.09909 299.09909 150.59909 15059.9099 2.09909 299.0991 150.5991 15059.91003 2.09909 299.09909 150.59909 15059.90900 2020-01-01 2020-01-02 2020-01-01 00:11:39 2020-01-02 03:40:00 2020-01-01 00:11:39.000 2020-01-02 03:40:00.000 699 99600 50149.5 5014950 699 99600 50149.5 5014950 -32471 32667 4929.66 492966 -127 124 -0.9 -90 +660 2 10650 99561 1.98198 298.98198 150.48198 15048.19819 1.98198 298.982 150.48198 15048.19822 1.98198 298.98198 150.48198 15048.198 2020-01-01 2020-01-02 2020-01-01 00:11:00 2020-01-02 03:39:21 2020-01-01 00:11:00.000 2020-01-02 03:39:21.000 660 99561 50110.5 5011050 660 99561 50110.5 5011050 -32510 32628 4890.66 489066 -128 127 1.06 106 +661 2 10651 99562 1.98498 298.98498 150.48498 15048.49849 1.98498 298.985 150.48498 15048.49853 1.98498 298.98498 150.48498 15048.498 2020-01-01 2020-01-02 2020-01-01 00:11:01 2020-01-02 03:39:22 2020-01-01 00:11:01.000 2020-01-02 03:39:22.000 661 99562 50111.5 5011150 661 99562 50111.5 5011150 -32509 32629 4891.66 489166 -128 124 -0.5 -50 +662 2 10652 99563 1.98798 298.98798 150.48798 15048.79879 1.98798 298.98798 150.48798 15048.79882 1.98798 298.98798 150.48798 15048.798 2020-01-01 2020-01-02 2020-01-01 00:11:02 2020-01-02 03:39:23 2020-01-01 00:11:02.000 2020-01-02 03:39:23.000 662 99563 50112.5 5011250 662 99563 50112.5 5011250 -32508 32630 4892.66 489266 -127 125 0.5 50 +663 2 10653 99564 1.99099 298.99099 150.49099 15049.09909 1.99099 298.991 150.49099 15049.09942 1.99099 298.99099 150.49099 15049.099 2020-01-01 2020-01-02 2020-01-01 00:11:03 2020-01-02 03:39:24 2020-01-01 00:11:03.000 2020-01-02 03:39:24.000 663 99564 50113.5 5011350 663 99564 50113.5 5011350 -32507 32631 4893.66 489366 -126 126 1.5 150 +664 2 10654 99565 1.99399 298.99399 150.49399 15049.39939 1.99399 298.994 150.49399 15049.39911 1.99399 298.99399 150.49399 15049.399 2020-01-01 2020-01-02 2020-01-01 00:11:04 2020-01-02 03:39:25 2020-01-01 00:11:04.000 2020-01-02 03:39:25.000 664 99565 50114.5 5011450 664 99565 50114.5 5011450 -32506 32632 4894.66 489466 -125 127 2.5 250 +665 2 10655 99566 1.99699 298.99699 150.49699 15049.69969 1.99699 298.997 150.49699 15049.6997 1.99699 298.99699 150.49699 15049.699 2020-01-01 2020-01-02 2020-01-01 00:11:05 2020-01-02 03:39:26 2020-01-01 00:11:05.000 2020-01-02 03:39:26.000 665 99566 50115.5 5011550 665 99566 50115.5 5011550 -32505 32633 4895.66 489566 -128 127 0.94 94 +666 2 10656 99567 2 299 150.5 15050 2 299 150.5 15050 2 299 150.5 15050 2020-01-01 2020-01-02 2020-01-01 00:11:06 2020-01-02 03:39:27 2020-01-01 00:11:06.000 2020-01-02 03:39:27.000 666 99567 50116.5 5011650 666 99567 50116.5 5011650 -32504 32634 4896.66 489666 -128 127 -0.62 -62 +667 2 10657 99568 2.003 299.003 150.503 15050.3003 2.003 299.003 150.503 15050.30029 2.003 299.003 150.503 15050.3 2020-01-01 2020-01-02 2020-01-01 00:11:07 2020-01-02 03:39:28 2020-01-01 00:11:07.000 2020-01-02 03:39:28.000 667 99568 50117.5 5011750 667 99568 50117.5 5011750 -32503 32635 4897.66 489766 -128 123 -2.18 -218 +668 2 10658 99569 2.006 299.006 150.506 15050.6006 2.006 299.006 150.506 15050.60089 2.006 299.006 150.506 15050.6 2020-01-01 2020-01-02 2020-01-01 00:11:08 2020-01-02 03:39:29 2020-01-01 00:11:08.000 2020-01-02 03:39:29.000 668 99569 50118.5 5011850 668 99569 50118.5 5011850 -32502 32636 4898.66 489866 -127 124 -1.18 -118 +669 2 10659 99570 2.009 299.009 150.509 15050.9009 2.009 299.009 150.509 15050.90057 2.009 299.009 150.509 15050.9 2020-01-01 2020-01-02 2020-01-01 00:11:09 2020-01-02 03:39:30 2020-01-01 00:11:09.000 2020-01-02 03:39:30.000 669 99570 50119.5 5011950 669 99570 50119.5 5011950 -32501 32637 4899.66 489966 -126 125 -0.18 -18 +67 2 10057 99967 0.2012 300.2012 150.2012 15170.32132 0.2012 300.2012 150.2012 15170.32142 0.2012 300.2012 150.2012 15170.3212 2020-01-01 2020-01-02 2020-01-01 00:01:07 2020-01-02 03:46:07 2020-01-01 00:01:07.000 2020-01-02 03:46:07.000 67 99967 50017 5051717 67 99967 50017 5051717 -32502 32433 4596.009900990099 464197 -128 127 -1.8514851485148516 -187 +670 2 10660 99571 2.01201 299.01201 150.51201 15051.2012 2.01201 299.01202 150.51201 15051.20117 2.01201 299.01201 150.51201 15051.201 2020-01-01 2020-01-02 2020-01-01 00:11:10 2020-01-02 03:39:31 2020-01-01 00:11:10.000 2020-01-02 03:39:31.000 670 99571 50120.5 5012050 670 99571 50120.5 5012050 -32500 32638 4900.66 490066 -125 126 0.82 82 +671 2 10661 99572 2.01501 299.01501 150.51501 15051.5015 2.01501 299.015 150.51501 15051.50146 2.01501 299.01501 150.51501 15051.501 2020-01-01 2020-01-02 2020-01-01 00:11:11 2020-01-02 03:39:32 2020-01-01 00:11:11.000 2020-01-02 03:39:32.000 671 99572 50121.5 5012150 671 99572 50121.5 5012150 -32499 32639 4901.66 490166 -124 127 1.82 182 +672 2 10662 99573 2.01801 299.01801 150.51801 15051.8018 2.01801 299.018 150.51801 15051.80176 2.01801 299.01801 150.51801 15051.801 2020-01-01 2020-01-02 2020-01-01 00:11:12 2020-01-02 03:39:33 2020-01-01 00:11:12.000 2020-01-02 03:39:33.000 672 99573 50122.5 5012250 672 99573 50122.5 5012250 -32498 32640 4902.66 490266 -128 127 0.26 26 +673 2 10663 99574 2.02102 299.02102 150.52102 15052.1021 2.02102 299.02103 150.52102 15052.1024 2.02102 299.02102 150.52102000000002 15052.102 2020-01-01 2020-01-02 2020-01-01 00:11:13 2020-01-02 03:39:34 2020-01-01 00:11:13.000 2020-01-02 03:39:34.000 673 99574 50123.5 5012350 673 99574 50123.5 5012350 -32497 32641 4903.66 490366 -128 123 -1.3 -130 +674 2 10664 99575 2.02402 299.02402 150.52402 15052.4024 2.02402 299.02402 150.52402 15052.40204 2.02402 299.02402 150.52402 15052.402 2020-01-01 2020-01-02 2020-01-01 00:11:14 2020-01-02 03:39:35 2020-01-01 00:11:14.000 2020-01-02 03:39:35.000 674 99575 50124.5 5012450 674 99575 50124.5 5012450 -32496 32642 4904.66 490466 -127 124 -0.3 -30 +675 2 10665 99576 2.02702 299.02702 150.52702 15052.7027 2.02702 299.02704 150.52702 15052.70264 2.02702 299.02702 150.52702 15052.702 2020-01-01 2020-01-02 2020-01-01 00:11:15 2020-01-02 03:39:36 2020-01-01 00:11:15.000 2020-01-02 03:39:36.000 675 99576 50125.5 5012550 675 99576 50125.5 5012550 -32495 32643 4905.66 490566 -126 125 0.7 70 +676 2 10666 99577 2.03003 299.03003 150.53003 15053.003 2.03003 299.03003 150.53002 15053.00293 2.03003 299.03003 150.53003 15053.003 2020-01-01 2020-01-02 2020-01-01 00:11:16 2020-01-02 03:39:37 2020-01-01 00:11:16.000 2020-01-02 03:39:37.000 676 99577 50126.5 5012650 676 99577 50126.5 5012650 -32494 32644 4906.66 490666 -125 126 1.7 170 +677 2 10667 99578 2.03303 299.03303 150.53303 15053.3033 2.03303 299.03302 150.53303 15053.30323 2.03303 299.03303 150.53303 15053.303 2020-01-01 2020-01-02 2020-01-01 00:11:17 2020-01-02 03:39:38 2020-01-01 00:11:17.000 2020-01-02 03:39:38.000 677 99578 50127.5 5012750 677 99578 50127.5 5012750 -32493 32645 4907.66 490766 -124 127 2.7 270 +678 2 10668 99579 2.03603 299.03603 150.53603 15053.6036 2.03603 299.03604 150.53603 15053.60387 2.03603 299.03603 150.53602999999998 15053.603 2020-01-01 2020-01-02 2020-01-01 00:11:18 2020-01-02 03:39:39 2020-01-01 00:11:18.000 2020-01-02 03:39:39.000 678 99579 50128.5 5012850 678 99579 50128.5 5012850 -32492 32646 4908.66 490866 -128 127 1.14 114 +679 2 10669 99580 2.03903 299.03903 150.53903 15053.9039 2.03903 299.03903 150.53903 15053.90351 2.03903 299.03903 150.53903 15053.903 2020-01-01 2020-01-02 2020-01-01 00:11:19 2020-01-02 03:39:40 2020-01-01 00:11:19.000 2020-01-02 03:39:40.000 679 99580 50129.5 5012950 679 99580 50129.5 5012950 -32491 32647 4909.66 490966 -128 123 -0.42 -42 +68 2 10058 99968 0.2042 300.2042 150.2042 15170.62462 0.2042 300.2042 150.2042 15170.62457 0.2042 300.2042 150.20420000000001 15170.6242 2020-01-01 2020-01-02 2020-01-01 00:01:08 2020-01-02 03:46:08 2020-01-01 00:01:08.000 2020-01-02 03:46:08.000 68 99968 50018 5051818 68 99968 50018 5051818 -32501 32434 4597.009900990099 464298 -128 124 -3.386138613861386 -342 +680 2 10670 99581 2.04204 299.04204 150.54204 15054.2042 2.04204 299.04205 150.54204 15054.20426 2.04204 299.04204 150.54204 15054.204 2020-01-01 2020-01-02 2020-01-01 00:11:20 2020-01-02 03:39:41 2020-01-01 00:11:20.000 2020-01-02 03:39:41.000 680 99581 50130.5 5013050 680 99581 50130.5 5013050 -32490 32648 4910.66 491066 -127 124 0.58 58 +681 2 10671 99582 2.04504 299.04504 150.54504 15054.5045 2.04504 299.04504 150.54504 15054.5044 2.04504 299.04504 150.54504 15054.504 2020-01-01 2020-01-02 2020-01-01 00:11:21 2020-01-02 03:39:42 2020-01-01 00:11:21.000 2020-01-02 03:39:42.000 681 99582 50131.5 5013150 681 99582 50131.5 5013150 -32489 32649 4911.66 491166 -126 125 1.58 158 +682 2 10672 99583 2.04804 299.04804 150.54804 15054.8048 2.04804 299.04803 150.54804 15054.80474 2.04804 299.04804 150.54804000000001 15054.804 2020-01-01 2020-01-02 2020-01-01 00:11:22 2020-01-02 03:39:43 2020-01-01 00:11:22.000 2020-01-02 03:39:43.000 682 99583 50132.5 5013250 682 99583 50132.5 5013250 -32488 32650 4912.66 491266 -125 126 2.58 258 +683 2 10673 99584 2.05105 299.05105 150.55105 15055.1051 2.05105 299.05106 150.55105 15055.10533 2.05105 299.05105 150.55105 15055.105 2020-01-01 2020-01-02 2020-01-01 00:11:23 2020-01-02 03:39:44 2020-01-01 00:11:23.000 2020-01-02 03:39:44.000 683 99584 50133.5 5013350 683 99584 50133.5 5013350 -32487 32651 4913.66 491366 -124 127 3.58 358 +684 2 10674 99585 2.05405 299.05405 150.55405 15055.4054 2.05405 299.05405 150.55404 15055.40498 2.05405 299.05405 150.55405000000002 15055.405 2020-01-01 2020-01-02 2020-01-01 00:11:24 2020-01-02 03:39:45 2020-01-01 00:11:24.000 2020-01-02 03:39:45.000 684 99585 50134.5 5013450 684 99585 50134.5 5013450 -32486 32652 4914.66 491466 -128 127 2.02 202 +685 2 10675 99586 2.05705 299.05705 150.55705 15055.7057 2.05705 299.05707 150.55705 15055.70573 2.05705 299.05705 150.55705 15055.705 2020-01-01 2020-01-02 2020-01-01 00:11:25 2020-01-02 03:39:46 2020-01-01 00:11:25.000 2020-01-02 03:39:46.000 685 99586 50135.5 5013550 685 99586 50135.5 5013550 -32485 32653 4915.66 491566 -128 127 0.46 46 +686 2 10676 99587 2.06006 299.06006 150.56006 15056.006 2.06006 299.06006 150.56005 15056.00587 2.06006 299.06006 150.56006 15056.006 2020-01-01 2020-01-02 2020-01-01 00:11:26 2020-01-02 03:39:47 2020-01-01 00:11:26.000 2020-01-02 03:39:47.000 686 99587 50136.5 5013650 686 99587 50136.5 5013650 -32484 32654 4916.66 491666 -128 124 -1.1 -110 +687 2 10677 99588 2.06306 299.06306 150.56306 15056.3063 2.06306 299.06305 150.56306 15056.30621 2.06306 299.06306 150.56306 15056.306 2020-01-01 2020-01-02 2020-01-01 00:11:27 2020-01-02 03:39:48 2020-01-01 00:11:27.000 2020-01-02 03:39:48.000 687 99588 50137.5 5013750 687 99588 50137.5 5013750 -32483 32655 4917.66 491766 -127 125 -0.1 -10 +688 2 10678 99589 2.06606 299.06606 150.56606 15056.6066 2.06606 299.06607 150.56606 15056.60681 2.06606 299.06606 150.56606 15056.606 2020-01-01 2020-01-02 2020-01-01 00:11:28 2020-01-02 03:39:49 2020-01-01 00:11:28.000 2020-01-02 03:39:49.000 688 99589 50138.5 5013850 688 99589 50138.5 5013850 -32482 32656 4918.66 491866 -126 126 0.9 90 +689 2 10679 99590 2.06906 299.06906 150.56906 15056.9069 2.06906 299.06906 150.56907 15056.9071 2.06906 299.06906 150.56906 15056.906 2020-01-01 2020-01-02 2020-01-01 00:11:29 2020-01-02 03:39:50 2020-01-01 00:11:29.000 2020-01-02 03:39:50.000 689 99590 50139.5 5013950 689 99590 50139.5 5013950 -32481 32657 4919.66 491966 -125 127 1.9 190 +69 2 10059 99969 0.2072 300.2072 150.2072 15170.92792 0.2072 300.2072 150.20721 15170.92832 0.2072 300.2072 150.2072 15170.9272 2020-01-01 2020-01-02 2020-01-01 00:01:09 2020-01-02 03:46:09 2020-01-01 00:01:09.000 2020-01-02 03:46:09.000 69 99969 50019 5051919 69 99969 50019 5051919 -32500 32435 4598.009900990099 464399 -127 125 -2.386138613861386 -241 +690 2 10680 99591 2.07207 299.07207 150.57207 15057.2072 2.07207 299.07208 150.57207 15057.2072 2.07207 299.07207 150.57207 15057.207 2020-01-01 2020-01-02 2020-01-01 00:11:30 2020-01-02 03:39:51 2020-01-01 00:11:30.000 2020-01-02 03:39:51.000 690 99591 50140.5 5014050 690 99591 50140.5 5014050 -32480 32658 4920.66 492066 -128 127 0.34 34 +691 2 10681 99592 2.07507 299.07507 150.57507 15057.5075 2.07507 299.07507 150.57507 15057.50734 2.07507 299.07507 150.57506999999998 15057.507 2020-01-01 2020-01-02 2020-01-01 00:11:31 2020-01-02 03:39:52 2020-01-01 00:11:31.000 2020-01-02 03:39:52.000 691 99592 50141.5 5014150 691 99592 50141.5 5014150 -32479 32659 4921.66 492166 -128 127 -1.22 -122 +692 2 10682 99593 2.07807 299.07807 150.57807 15057.8078 2.07807 299.07806 150.57807 15057.80767 2.07807 299.07807 150.57807 15057.807 2020-01-01 2020-01-02 2020-01-01 00:11:32 2020-01-02 03:39:53 2020-01-01 00:11:32.000 2020-01-02 03:39:53.000 692 99593 50142.5 5014250 692 99593 50142.5 5014250 -32478 32660 4922.66 492266 -128 123 -2.78 -278 +693 2 10683 99594 2.08108 299.08108 150.58108 15058.1081 2.08108 299.0811 150.58108 15058.10827 2.08108 299.08108 150.58108000000001 15058.108 2020-01-01 2020-01-02 2020-01-01 00:11:33 2020-01-02 03:39:54 2020-01-01 00:11:33.000 2020-01-02 03:39:54.000 693 99594 50143.5 5014350 693 99594 50143.5 5014350 -32477 32661 4923.66 492366 -127 124 -1.78 -178 +694 2 10684 99595 2.08408 299.08408 150.58408 15058.4084 2.08408 299.08408 150.58408 15058.40857 2.08408 299.08408 150.58408 15058.408 2020-01-01 2020-01-02 2020-01-01 00:11:34 2020-01-02 03:39:55 2020-01-01 00:11:34.000 2020-01-02 03:39:55.000 694 99595 50144.5 5014450 694 99595 50144.5 5014450 -32476 32662 4924.66 492466 -126 125 -0.78 -78 +695 2 10685 99596 2.08708 299.08708 150.58708 15058.7087 2.08708 299.0871 150.58708 15058.70867 2.08708 299.08708 150.58708000000001 15058.708 2020-01-01 2020-01-02 2020-01-01 00:11:35 2020-01-02 03:39:56 2020-01-01 00:11:35.000 2020-01-02 03:39:56.000 695 99596 50145.5 5014550 695 99596 50145.5 5014550 -32475 32663 4925.66 492566 -125 126 0.22 22 +696 2 10686 99597 2.09009 299.09009 150.59009 15059.009 2.09009 299.0901 150.59008 15059.00885 2.09009 299.09009 150.59009 15059.009 2020-01-01 2020-01-02 2020-01-01 00:11:36 2020-01-02 03:39:57 2020-01-01 00:11:36.000 2020-01-02 03:39:57.000 696 99597 50146.5 5014650 696 99597 50146.5 5014650 -32474 32664 4926.66 492666 -124 127 1.22 122 +697 2 10687 99598 2.09309 299.09309 150.59309 15059.3093 2.09309 299.09308 150.59309 15059.30915 2.09309 299.09309 150.59309 15059.309 2020-01-01 2020-01-02 2020-01-01 00:11:37 2020-01-02 03:39:58 2020-01-01 00:11:37.000 2020-01-02 03:39:58.000 697 99598 50147.5 5014750 697 99598 50147.5 5014750 -32473 32665 4927.66 492766 -128 127 -0.34 -34 +698 2 10688 99599 2.09609 299.09609 150.59609 15059.6096 2.09609 299.0961 150.59609 15059.6099 2.09609 299.09609 150.59609 15059.609 2020-01-01 2020-01-02 2020-01-01 00:11:38 2020-01-02 03:39:59 2020-01-01 00:11:38.000 2020-01-02 03:39:59.000 698 99599 50148.5 5014850 698 99599 50148.5 5014850 -32472 32666 4928.66 492866 -128 123 -1.9 -190 +699 2 10689 99600 2.09909 299.09909 150.59909 15059.9099 2.09909 299.0991 150.5991 15059.91003 2.09909 299.09909 150.59909 15059.909 2020-01-01 2020-01-02 2020-01-01 00:11:39 2020-01-02 03:40:00 2020-01-01 00:11:39.000 2020-01-02 03:40:00.000 699 99600 50149.5 5014950 699 99600 50149.5 5014950 -32471 32667 4929.66 492966 -127 124 -0.9 -90 7 2 1006 9997 0.02102 300.02102 150.02102 15152.12312 0.02102 300.02103 150.02102 15152.12342 0.02102 300.02102 150.02102000000002 15152.12302 2020-01-01 2020-01-02 2020-01-01 00:00:07 2020-01-02 03:45:07 2020-01-01 00:00:07.000 2020-01-02 03:45:07.000 7 99907 49957 5045657 7 99907 49957 5045657 -32562 32373 4536.009900990099 458137 -126 125 -1.0198019801980198 -103 70 2 10060 99970 0.21021 300.21021 150.21021 15171.23123 0.21021 300.2102 150.2102 15171.23097 0.21021 300.21021 150.21021 15171.23121 2020-01-01 2020-01-02 2020-01-01 00:01:10 2020-01-02 03:46:10 2020-01-01 00:01:10.000 2020-01-02 03:46:10.000 70 99970 50020 5052020 70 99970 50020 5052020 -32499 32436 4599.009900990099 464500 -126 126 -1.386138613861386 -140 -700 2 10690 99601 2.1021 299.1021 150.6021 15060.21021 2.1021 299.1021 150.6021 15060.21014 2.10210 299.10210 150.60209999999998 15060.21000 2020-01-01 2020-01-02 2020-01-01 00:11:40 2020-01-02 03:40:01 2020-01-01 00:11:40.000 2020-01-02 03:40:01.000 700 99601 50150.5 5015050 700 99601 50150.5 5015050 -32470 32668 4930.66 493066 -126 125 0.1 10 -701 2 10691 99602 2.1051 299.1051 150.6051 15060.51051 2.1051 299.1051 150.6051 15060.51031 2.10510 299.10510 150.6051 15060.51000 2020-01-01 2020-01-02 2020-01-01 00:11:41 2020-01-02 03:40:02 2020-01-01 00:11:41.000 2020-01-02 03:40:02.000 701 99602 50151.5 5015150 701 99602 50151.5 5015150 -32469 32669 4931.66 493166 -125 126 1.1 110 -702 2 10692 99603 2.1081 299.1081 150.6081 15060.81081 2.1081 299.1081 150.6081 15060.81062 2.10810 299.10810 150.6081 15060.81000 2020-01-01 2020-01-02 2020-01-01 00:11:42 2020-01-02 03:40:03 2020-01-01 00:11:42.000 2020-01-02 03:40:03.000 702 99603 50152.5 5015250 702 99603 50152.5 5015250 -32468 32670 4932.66 493266 -124 127 2.1 210 -703 2 10693 99604 2.11111 299.11111 150.61111 15061.11111 2.11111 299.1111 150.61111 15061.11137 2.11111 299.11111 150.61111 15061.11100 2020-01-01 2020-01-02 2020-01-01 00:11:43 2020-01-02 03:40:04 2020-01-01 00:11:43.000 2020-01-02 03:40:04.000 703 99604 50153.5 5015350 703 99604 50153.5 5015350 -32467 32671 4933.66 493366 -128 127 0.54 54 -704 2 10694 99605 2.11411 299.11411 150.61411 15061.41141 2.11411 299.1141 150.61411 15061.41151 2.11411 299.11411 150.61411 15061.41100 2020-01-01 2020-01-02 2020-01-01 00:11:44 2020-01-02 03:40:05 2020-01-01 00:11:44.000 2020-01-02 03:40:05.000 704 99605 50154.5 5015450 704 99605 50154.5 5015450 -32466 32672 4934.66 493466 -128 123 -1.02 -102 -705 2 10695 99606 2.11711 299.11711 150.61711 15061.71171 2.11711 299.11713 150.61711 15061.71165 2.11711 299.11711 150.61711 15061.71100 2020-01-01 2020-01-02 2020-01-01 00:11:45 2020-01-02 03:40:06 2020-01-01 00:11:45.000 2020-01-02 03:40:06.000 705 99606 50155.5 5015550 705 99606 50155.5 5015550 -32465 32673 4935.66 493566 -127 124 -0.02 -2 -706 2 10696 99607 2.12012 299.12012 150.62012 15062.01201 2.12012 299.12012 150.62011 15062.01179 2.12012 299.12012 150.62012000000001 15062.01200 2020-01-01 2020-01-02 2020-01-01 00:11:46 2020-01-02 03:40:07 2020-01-01 00:11:46.000 2020-01-02 03:40:07.000 706 99607 50156.5 5015650 706 99607 50156.5 5015650 -32464 32674 4936.66 493666 -126 125 0.98 98 -707 2 10697 99608 2.12312 299.12312 150.62312 15062.31231 2.12312 299.1231 150.62312 15062.31208 2.12312 299.12312 150.62312 15062.31200 2020-01-01 2020-01-02 2020-01-01 00:11:47 2020-01-02 03:40:08 2020-01-01 00:11:47.000 2020-01-02 03:40:08.000 707 99608 50157.5 5015750 707 99608 50157.5 5015750 -32463 32675 4937.66 493766 -125 126 1.98 198 -708 2 10698 99609 2.12612 299.12612 150.62612 15062.61261 2.12612 299.12613 150.62612 15062.61283 2.12612 299.12612 150.62612 15062.61200 2020-01-01 2020-01-02 2020-01-01 00:11:48 2020-01-02 03:40:09 2020-01-01 00:11:48.000 2020-01-02 03:40:09.000 708 99609 50158.5 5015850 708 99609 50158.5 5015850 -32462 32676 4938.66 493866 -124 127 2.98 298 -709 2 10699 99610 2.12912 299.12912 150.62912 15062.91291 2.12912 299.12912 150.62912 15062.91298 2.12912 299.12912 150.62912 15062.91200 2020-01-01 2020-01-02 2020-01-01 00:11:49 2020-01-02 03:40:10 2020-01-01 00:11:49.000 2020-01-02 03:40:10.000 709 99610 50159.5 5015950 709 99610 50159.5 5015950 -32461 32677 4939.66 493966 -128 127 1.42 142 +700 2 10690 99601 2.1021 299.1021 150.6021 15060.21021 2.1021 299.1021 150.6021 15060.21014 2.1021 299.1021 150.60209999999998 15060.21 2020-01-01 2020-01-02 2020-01-01 00:11:40 2020-01-02 03:40:01 2020-01-01 00:11:40.000 2020-01-02 03:40:01.000 700 99601 50150.5 5015050 700 99601 50150.5 5015050 -32470 32668 4930.66 493066 -126 125 0.1 10 +701 2 10691 99602 2.1051 299.1051 150.6051 15060.51051 2.1051 299.1051 150.6051 15060.51031 2.1051 299.1051 150.6051 15060.51 2020-01-01 2020-01-02 2020-01-01 00:11:41 2020-01-02 03:40:02 2020-01-01 00:11:41.000 2020-01-02 03:40:02.000 701 99602 50151.5 5015150 701 99602 50151.5 5015150 -32469 32669 4931.66 493166 -125 126 1.1 110 +702 2 10692 99603 2.1081 299.1081 150.6081 15060.81081 2.1081 299.1081 150.6081 15060.81062 2.1081 299.1081 150.6081 15060.81 2020-01-01 2020-01-02 2020-01-01 00:11:42 2020-01-02 03:40:03 2020-01-01 00:11:42.000 2020-01-02 03:40:03.000 702 99603 50152.5 5015250 702 99603 50152.5 5015250 -32468 32670 4932.66 493266 -124 127 2.1 210 +703 2 10693 99604 2.11111 299.11111 150.61111 15061.11111 2.11111 299.1111 150.61111 15061.11137 2.11111 299.11111 150.61111 15061.111 2020-01-01 2020-01-02 2020-01-01 00:11:43 2020-01-02 03:40:04 2020-01-01 00:11:43.000 2020-01-02 03:40:04.000 703 99604 50153.5 5015350 703 99604 50153.5 5015350 -32467 32671 4933.66 493366 -128 127 0.54 54 +704 2 10694 99605 2.11411 299.11411 150.61411 15061.41141 2.11411 299.1141 150.61411 15061.41151 2.11411 299.11411 150.61411 15061.411 2020-01-01 2020-01-02 2020-01-01 00:11:44 2020-01-02 03:40:05 2020-01-01 00:11:44.000 2020-01-02 03:40:05.000 704 99605 50154.5 5015450 704 99605 50154.5 5015450 -32466 32672 4934.66 493466 -128 123 -1.02 -102 +705 2 10695 99606 2.11711 299.11711 150.61711 15061.71171 2.11711 299.11713 150.61711 15061.71165 2.11711 299.11711 150.61711 15061.711 2020-01-01 2020-01-02 2020-01-01 00:11:45 2020-01-02 03:40:06 2020-01-01 00:11:45.000 2020-01-02 03:40:06.000 705 99606 50155.5 5015550 705 99606 50155.5 5015550 -32465 32673 4935.66 493566 -127 124 -0.02 -2 +706 2 10696 99607 2.12012 299.12012 150.62012 15062.01201 2.12012 299.12012 150.62011 15062.01179 2.12012 299.12012 150.62012000000001 15062.012 2020-01-01 2020-01-02 2020-01-01 00:11:46 2020-01-02 03:40:07 2020-01-01 00:11:46.000 2020-01-02 03:40:07.000 706 99607 50156.5 5015650 706 99607 50156.5 5015650 -32464 32674 4936.66 493666 -126 125 0.98 98 +707 2 10697 99608 2.12312 299.12312 150.62312 15062.31231 2.12312 299.1231 150.62312 15062.31208 2.12312 299.12312 150.62312 15062.312 2020-01-01 2020-01-02 2020-01-01 00:11:47 2020-01-02 03:40:08 2020-01-01 00:11:47.000 2020-01-02 03:40:08.000 707 99608 50157.5 5015750 707 99608 50157.5 5015750 -32463 32675 4937.66 493766 -125 126 1.98 198 +708 2 10698 99609 2.12612 299.12612 150.62612 15062.61261 2.12612 299.12613 150.62612 15062.61283 2.12612 299.12612 150.62612 15062.612 2020-01-01 2020-01-02 2020-01-01 00:11:48 2020-01-02 03:40:09 2020-01-01 00:11:48.000 2020-01-02 03:40:09.000 708 99609 50158.5 5015850 708 99609 50158.5 5015850 -32462 32676 4938.66 493866 -124 127 2.98 298 +709 2 10699 99610 2.12912 299.12912 150.62912 15062.91291 2.12912 299.12912 150.62912 15062.91298 2.12912 299.12912 150.62912 15062.912 2020-01-01 2020-01-02 2020-01-01 00:11:49 2020-01-02 03:40:10 2020-01-01 00:11:49.000 2020-01-02 03:40:10.000 709 99610 50159.5 5015950 709 99610 50159.5 5015950 -32461 32677 4939.66 493966 -128 127 1.42 142 71 2 10061 99971 0.21321 300.21321 150.21321 15171.53453 0.21321 300.21323 150.21321 15171.5346 0.21321 300.21321 150.21321 15171.53421 2020-01-01 2020-01-02 2020-01-01 00:01:11 2020-01-02 03:46:11 2020-01-01 00:01:11.000 2020-01-02 03:46:11.000 71 99971 50021 5052121 71 99971 50021 5052121 -32498 32437 4600.009900990099 464601 -125 127 -0.38613861386138615 -39 -710 2 10700 99611 2.13213 299.13213 150.63213 15063.21321 2.13213 299.13214 150.63213 15063.21311 2.13213 299.13213 150.63213 15063.21300 2020-01-01 2020-01-02 2020-01-01 00:11:50 2020-01-02 03:40:11 2020-01-01 00:11:50.000 2020-01-02 03:40:11.000 710 99611 50160.5 5016050 710 99611 50160.5 5016050 -32460 32678 4940.66 494066 -128 127 -0.14 -14 -711 2 10701 99612 2.13513 299.13513 150.63513 15063.51351 2.13513 299.13513 150.63513 15063.51325 2.13513 299.13513 150.63513 15063.51300 2020-01-01 2020-01-02 2020-01-01 00:11:51 2020-01-02 03:40:12 2020-01-01 00:11:51.000 2020-01-02 03:40:12.000 711 99612 50161.5 5016150 711 99612 50161.5 5016150 -32459 32679 4941.66 494166 -128 124 -1.7 -170 -712 2 10702 99613 2.13813 299.13813 150.63813 15063.81381 2.13813 299.13815 150.63814 15063.81401 2.13813 299.13813 150.63813 15063.81300 2020-01-01 2020-01-02 2020-01-01 00:11:52 2020-01-02 03:40:13 2020-01-01 00:11:52.000 2020-01-02 03:40:13.000 712 99613 50162.5 5016250 712 99613 50162.5 5016250 -32458 32680 4942.66 494266 -127 125 -0.7 -70 -713 2 10703 99614 2.14114 299.14114 150.64114 15064.11411 2.14114 299.14114 150.64114 15064.11431 2.14114 299.14114 150.64114 15064.11400 2020-01-01 2020-01-02 2020-01-01 00:11:53 2020-01-02 03:40:14 2020-01-01 00:11:53.000 2020-01-02 03:40:14.000 713 99614 50163.5 5016350 713 99614 50163.5 5016350 -32457 32681 4943.66 494366 -126 126 0.3 30 -714 2 10704 99615 2.14414 299.14414 150.64414 15064.41441 2.14414 299.14413 150.64414 15064.41448 2.14414 299.14414 150.64414 15064.41400 2020-01-01 2020-01-02 2020-01-01 00:11:54 2020-01-02 03:40:15 2020-01-01 00:11:54.000 2020-01-02 03:40:15.000 714 99615 50164.5 5016450 714 99615 50164.5 5016450 -32456 32682 4944.66 494466 -125 127 1.3 130 -715 2 10705 99616 2.14714 299.14714 150.64714 15064.71471 2.14714 299.14716 150.64714 15064.71458 2.14714 299.14714 150.64714 15064.71400 2020-01-01 2020-01-02 2020-01-01 00:11:55 2020-01-02 03:40:16 2020-01-01 00:11:55.000 2020-01-02 03:40:16.000 715 99616 50165.5 5016550 715 99616 50165.5 5016550 -32455 32683 4945.66 494566 -128 127 -0.26 -26 -716 2 10706 99617 2.15015 299.15015 150.65015 15065.01501 2.15015 299.15015 150.65014 15065.01472 2.15015 299.15015 150.65015 15065.01500 2020-01-01 2020-01-02 2020-01-01 00:11:56 2020-01-02 03:40:17 2020-01-01 00:11:56.000 2020-01-02 03:40:17.000 716 99617 50166.5 5016650 716 99617 50166.5 5016650 -32454 32684 4946.66 494666 -128 127 -1.82 -182 -717 2 10707 99618 2.15315 299.15315 150.65315 15065.31531 2.15315 299.15317 150.65315 15065.31547 2.15315 299.15315 150.65315 15065.31500 2020-01-01 2020-01-02 2020-01-01 00:11:57 2020-01-02 03:40:18 2020-01-01 00:11:57.000 2020-01-02 03:40:18.000 717 99618 50167.5 5016750 717 99618 50167.5 5016750 -32453 32685 4947.66 494766 -128 123 -3.38 -338 -718 2 10708 99619 2.15615 299.15615 150.65615 15065.61561 2.15615 299.15616 150.65615 15065.61578 2.15615 299.15615 150.65615 15065.61500 2020-01-01 2020-01-02 2020-01-01 00:11:58 2020-01-02 03:40:19 2020-01-01 00:11:58.000 2020-01-02 03:40:19.000 718 99619 50168.5 5016850 718 99619 50168.5 5016850 -32452 32686 4948.66 494866 -127 124 -2.38 -238 -719 2 10709 99620 2.15915 299.15915 150.65915 15065.91591 2.15915 299.15915 150.65915 15065.91595 2.15915 299.15915 150.65915 15065.91500 2020-01-01 2020-01-02 2020-01-01 00:11:59 2020-01-02 03:40:20 2020-01-01 00:11:59.000 2020-01-02 03:40:20.000 719 99620 50169.5 5016950 719 99620 50169.5 5016950 -32451 32687 4949.66 494966 -126 125 -1.38 -138 +710 2 10700 99611 2.13213 299.13213 150.63213 15063.21321 2.13213 299.13214 150.63213 15063.21311 2.13213 299.13213 150.63213 15063.213 2020-01-01 2020-01-02 2020-01-01 00:11:50 2020-01-02 03:40:11 2020-01-01 00:11:50.000 2020-01-02 03:40:11.000 710 99611 50160.5 5016050 710 99611 50160.5 5016050 -32460 32678 4940.66 494066 -128 127 -0.14 -14 +711 2 10701 99612 2.13513 299.13513 150.63513 15063.51351 2.13513 299.13513 150.63513 15063.51325 2.13513 299.13513 150.63513 15063.513 2020-01-01 2020-01-02 2020-01-01 00:11:51 2020-01-02 03:40:12 2020-01-01 00:11:51.000 2020-01-02 03:40:12.000 711 99612 50161.5 5016150 711 99612 50161.5 5016150 -32459 32679 4941.66 494166 -128 124 -1.7 -170 +712 2 10702 99613 2.13813 299.13813 150.63813 15063.81381 2.13813 299.13815 150.63814 15063.81401 2.13813 299.13813 150.63813 15063.813 2020-01-01 2020-01-02 2020-01-01 00:11:52 2020-01-02 03:40:13 2020-01-01 00:11:52.000 2020-01-02 03:40:13.000 712 99613 50162.5 5016250 712 99613 50162.5 5016250 -32458 32680 4942.66 494266 -127 125 -0.7 -70 +713 2 10703 99614 2.14114 299.14114 150.64114 15064.11411 2.14114 299.14114 150.64114 15064.11431 2.14114 299.14114 150.64114 15064.114 2020-01-01 2020-01-02 2020-01-01 00:11:53 2020-01-02 03:40:14 2020-01-01 00:11:53.000 2020-01-02 03:40:14.000 713 99614 50163.5 5016350 713 99614 50163.5 5016350 -32457 32681 4943.66 494366 -126 126 0.3 30 +714 2 10704 99615 2.14414 299.14414 150.64414 15064.41441 2.14414 299.14413 150.64414 15064.41448 2.14414 299.14414 150.64414 15064.414 2020-01-01 2020-01-02 2020-01-01 00:11:54 2020-01-02 03:40:15 2020-01-01 00:11:54.000 2020-01-02 03:40:15.000 714 99615 50164.5 5016450 714 99615 50164.5 5016450 -32456 32682 4944.66 494466 -125 127 1.3 130 +715 2 10705 99616 2.14714 299.14714 150.64714 15064.71471 2.14714 299.14716 150.64714 15064.71458 2.14714 299.14714 150.64714 15064.714 2020-01-01 2020-01-02 2020-01-01 00:11:55 2020-01-02 03:40:16 2020-01-01 00:11:55.000 2020-01-02 03:40:16.000 715 99616 50165.5 5016550 715 99616 50165.5 5016550 -32455 32683 4945.66 494566 -128 127 -0.26 -26 +716 2 10706 99617 2.15015 299.15015 150.65015 15065.01501 2.15015 299.15015 150.65014 15065.01472 2.15015 299.15015 150.65015 15065.015 2020-01-01 2020-01-02 2020-01-01 00:11:56 2020-01-02 03:40:17 2020-01-01 00:11:56.000 2020-01-02 03:40:17.000 716 99617 50166.5 5016650 716 99617 50166.5 5016650 -32454 32684 4946.66 494666 -128 127 -1.82 -182 +717 2 10707 99618 2.15315 299.15315 150.65315 15065.31531 2.15315 299.15317 150.65315 15065.31547 2.15315 299.15315 150.65315 15065.315 2020-01-01 2020-01-02 2020-01-01 00:11:57 2020-01-02 03:40:18 2020-01-01 00:11:57.000 2020-01-02 03:40:18.000 717 99618 50167.5 5016750 717 99618 50167.5 5016750 -32453 32685 4947.66 494766 -128 123 -3.38 -338 +718 2 10708 99619 2.15615 299.15615 150.65615 15065.61561 2.15615 299.15616 150.65615 15065.61578 2.15615 299.15615 150.65615 15065.615 2020-01-01 2020-01-02 2020-01-01 00:11:58 2020-01-02 03:40:19 2020-01-01 00:11:58.000 2020-01-02 03:40:19.000 718 99619 50168.5 5016850 718 99619 50168.5 5016850 -32452 32686 4948.66 494866 -127 124 -2.38 -238 +719 2 10709 99620 2.15915 299.15915 150.65915 15065.91591 2.15915 299.15915 150.65915 15065.91595 2.15915 299.15915 150.65915 15065.915 2020-01-01 2020-01-02 2020-01-01 00:11:59 2020-01-02 03:40:20 2020-01-01 00:11:59.000 2020-01-02 03:40:20.000 719 99620 50169.5 5016950 719 99620 50169.5 5016950 -32451 32687 4949.66 494966 -126 125 -1.38 -138 72 2 10062 99972 0.21621 300.21621 150.21621 15171.83783 0.21621 300.21622 150.21621 15171.83791 0.21621 300.21621 150.21621 15171.83721 2020-01-01 2020-01-02 2020-01-01 00:01:12 2020-01-02 03:46:12 2020-01-01 00:01:12.000 2020-01-02 03:46:12.000 72 99972 50022 5052222 72 99972 50022 5052222 -32497 32438 4601.009900990099 464702 -128 127 -1.9207920792079207 -194 -720 2 10710 99621 2.16216 299.16216 150.66216 15066.21621 2.16216 299.16217 150.66216 15066.21606 2.16216 299.16216 150.66216 15066.21600 2020-01-01 2020-01-02 2020-01-01 00:12:00 2020-01-02 03:40:21 2020-01-01 00:12:00.000 2020-01-02 03:40:21.000 720 99621 50170.5 5017050 720 99621 50170.5 5017050 -32450 32688 4950.66 495066 -125 126 -0.38 -38 -721 2 10711 99622 2.16516 299.16516 150.66516 15066.51651 2.16516 299.16516 150.66516 15066.51635 2.16516 299.16516 150.66516 15066.51600 2020-01-01 2020-01-02 2020-01-01 00:12:01 2020-01-02 03:40:22 2020-01-01 00:12:01.000 2020-01-02 03:40:22.000 721 99622 50171.5 5017150 721 99622 50171.5 5017150 -32449 32689 4951.66 495166 -124 127 0.62 62 -722 2 10712 99623 2.16816 299.16816 150.66816 15066.81681 2.16816 299.16818 150.66816 15066.81695 2.16816 299.16816 150.66816 15066.81600 2020-01-01 2020-01-02 2020-01-01 00:12:02 2020-01-02 03:40:23 2020-01-01 00:12:02.000 2020-01-02 03:40:23.000 722 99623 50172.5 5017250 722 99623 50172.5 5017250 -32448 32690 4952.66 495266 -128 127 -0.94 -94 -723 2 10713 99624 2.17117 299.17117 150.67117 15067.11711 2.17117 299.17117 150.67117 15067.11724 2.17117 299.17117 150.67117 15067.11700 2020-01-01 2020-01-02 2020-01-01 00:12:03 2020-01-02 03:40:24 2020-01-01 00:12:03.000 2020-01-02 03:40:24.000 723 99624 50173.5 5017350 723 99624 50173.5 5017350 -32447 32691 4953.66 495366 -128 123 -2.5 -250 -724 2 10714 99625 2.17417 299.17417 150.67417 15067.41741 2.17417 299.17416 150.67417 15067.41742 2.17417 299.17417 150.67417 15067.41700 2020-01-01 2020-01-02 2020-01-01 00:12:04 2020-01-02 03:40:25 2020-01-01 00:12:04.000 2020-01-02 03:40:25.000 724 99625 50174.5 5017450 724 99625 50174.5 5017450 -32446 32692 4954.66 495466 -127 124 -1.5 -150 -725 2 10715 99626 2.17717 299.17717 150.67717 15067.71771 2.17717 299.1772 150.67717 15067.71752 2.17717 299.17717 150.67717000000002 15067.71700 2020-01-01 2020-01-02 2020-01-01 00:12:05 2020-01-02 03:40:26 2020-01-01 00:12:05.000 2020-01-02 03:40:26.000 725 99626 50175.5 5017550 725 99626 50175.5 5017550 -32445 32693 4955.66 495566 -126 125 -0.5 -50 -726 2 10716 99627 2.18018 299.18018 150.68018 15068.01801 2.18018 299.18018 150.68017 15068.01782 2.18018 299.18018 150.68018 15068.01800 2020-01-01 2020-01-02 2020-01-01 00:12:06 2020-01-02 03:40:27 2020-01-01 00:12:06.000 2020-01-02 03:40:27.000 726 99627 50176.5 5017650 726 99627 50176.5 5017650 -32444 32694 4956.66 495666 -125 126 0.5 50 -727 2 10717 99628 2.18318 299.18318 150.68318 15068.31831 2.18318 299.1832 150.68318 15068.31842 2.18318 299.18318 150.68318 15068.31800 2020-01-01 2020-01-02 2020-01-01 00:12:07 2020-01-02 03:40:28 2020-01-01 00:12:07.000 2020-01-02 03:40:28.000 727 99628 50177.5 5017750 727 99628 50177.5 5017750 -32443 32695 4957.66 495766 -124 127 1.5 150 -728 2 10718 99629 2.18618 299.18618 150.68618 15068.61861 2.18618 299.1862 150.68618 15068.61875 2.18618 299.18618 150.68618 15068.61800 2020-01-01 2020-01-02 2020-01-01 00:12:08 2020-01-02 03:40:29 2020-01-01 00:12:08.000 2020-01-02 03:40:29.000 728 99629 50178.5 5017850 728 99629 50178.5 5017850 -32442 32696 4958.66 495866 -128 127 -0.06 -6 -729 2 10719 99630 2.18918 299.18918 150.68918 15068.91891 2.18918 299.18918 150.68918 15068.91889 2.18918 299.18918 150.68918 15068.91800 2020-01-01 2020-01-02 2020-01-01 00:12:09 2020-01-02 03:40:30 2020-01-01 00:12:09.000 2020-01-02 03:40:30.000 729 99630 50179.5 5017950 729 99630 50179.5 5017950 -32441 32697 4959.66 495966 -128 123 -1.62 -162 +720 2 10710 99621 2.16216 299.16216 150.66216 15066.21621 2.16216 299.16217 150.66216 15066.21606 2.16216 299.16216 150.66216 15066.216 2020-01-01 2020-01-02 2020-01-01 00:12:00 2020-01-02 03:40:21 2020-01-01 00:12:00.000 2020-01-02 03:40:21.000 720 99621 50170.5 5017050 720 99621 50170.5 5017050 -32450 32688 4950.66 495066 -125 126 -0.38 -38 +721 2 10711 99622 2.16516 299.16516 150.66516 15066.51651 2.16516 299.16516 150.66516 15066.51635 2.16516 299.16516 150.66516 15066.516 2020-01-01 2020-01-02 2020-01-01 00:12:01 2020-01-02 03:40:22 2020-01-01 00:12:01.000 2020-01-02 03:40:22.000 721 99622 50171.5 5017150 721 99622 50171.5 5017150 -32449 32689 4951.66 495166 -124 127 0.62 62 +722 2 10712 99623 2.16816 299.16816 150.66816 15066.81681 2.16816 299.16818 150.66816 15066.81695 2.16816 299.16816 150.66816 15066.816 2020-01-01 2020-01-02 2020-01-01 00:12:02 2020-01-02 03:40:23 2020-01-01 00:12:02.000 2020-01-02 03:40:23.000 722 99623 50172.5 5017250 722 99623 50172.5 5017250 -32448 32690 4952.66 495266 -128 127 -0.94 -94 +723 2 10713 99624 2.17117 299.17117 150.67117 15067.11711 2.17117 299.17117 150.67117 15067.11724 2.17117 299.17117 150.67117 15067.117 2020-01-01 2020-01-02 2020-01-01 00:12:03 2020-01-02 03:40:24 2020-01-01 00:12:03.000 2020-01-02 03:40:24.000 723 99624 50173.5 5017350 723 99624 50173.5 5017350 -32447 32691 4953.66 495366 -128 123 -2.5 -250 +724 2 10714 99625 2.17417 299.17417 150.67417 15067.41741 2.17417 299.17416 150.67417 15067.41742 2.17417 299.17417 150.67417 15067.417 2020-01-01 2020-01-02 2020-01-01 00:12:04 2020-01-02 03:40:25 2020-01-01 00:12:04.000 2020-01-02 03:40:25.000 724 99625 50174.5 5017450 724 99625 50174.5 5017450 -32446 32692 4954.66 495466 -127 124 -1.5 -150 +725 2 10715 99626 2.17717 299.17717 150.67717 15067.71771 2.17717 299.1772 150.67717 15067.71752 2.17717 299.17717 150.67717000000002 15067.717 2020-01-01 2020-01-02 2020-01-01 00:12:05 2020-01-02 03:40:26 2020-01-01 00:12:05.000 2020-01-02 03:40:26.000 725 99626 50175.5 5017550 725 99626 50175.5 5017550 -32445 32693 4955.66 495566 -126 125 -0.5 -50 +726 2 10716 99627 2.18018 299.18018 150.68018 15068.01801 2.18018 299.18018 150.68017 15068.01782 2.18018 299.18018 150.68018 15068.018 2020-01-01 2020-01-02 2020-01-01 00:12:06 2020-01-02 03:40:27 2020-01-01 00:12:06.000 2020-01-02 03:40:27.000 726 99627 50176.5 5017650 726 99627 50176.5 5017650 -32444 32694 4956.66 495666 -125 126 0.5 50 +727 2 10717 99628 2.18318 299.18318 150.68318 15068.31831 2.18318 299.1832 150.68318 15068.31842 2.18318 299.18318 150.68318 15068.318 2020-01-01 2020-01-02 2020-01-01 00:12:07 2020-01-02 03:40:28 2020-01-01 00:12:07.000 2020-01-02 03:40:28.000 727 99628 50177.5 5017750 727 99628 50177.5 5017750 -32443 32695 4957.66 495766 -124 127 1.5 150 +728 2 10718 99629 2.18618 299.18618 150.68618 15068.61861 2.18618 299.1862 150.68618 15068.61875 2.18618 299.18618 150.68618 15068.618 2020-01-01 2020-01-02 2020-01-01 00:12:08 2020-01-02 03:40:29 2020-01-01 00:12:08.000 2020-01-02 03:40:29.000 728 99629 50178.5 5017850 728 99629 50178.5 5017850 -32442 32696 4958.66 495866 -128 127 -0.06 -6 +729 2 10719 99630 2.18918 299.18918 150.68918 15068.91891 2.18918 299.18918 150.68918 15068.91889 2.18918 299.18918 150.68918 15068.918 2020-01-01 2020-01-02 2020-01-01 00:12:09 2020-01-02 03:40:30 2020-01-01 00:12:09.000 2020-01-02 03:40:30.000 729 99630 50179.5 5017950 729 99630 50179.5 5017950 -32441 32697 4959.66 495966 -128 123 -1.62 -162 73 2 10063 99973 0.21921 300.21921 150.21921 15172.14114 0.21921 300.2192 150.21921 15172.14121 0.21921 300.21921 150.21921 15172.14021 2020-01-01 2020-01-02 2020-01-01 00:01:13 2020-01-02 03:46:13 2020-01-01 00:01:13.000 2020-01-02 03:46:13.000 73 99973 50023 5052323 73 99973 50023 5052323 -32496 32439 4602.009900990099 464803 -128 127 -3.4554455445544554 -349 -730 2 10720 99631 2.19219 299.19219 150.69219 15069.21921 2.19219 299.1922 150.69219 15069.21965 2.19219 299.19219 150.69218999999998 15069.21900 2020-01-01 2020-01-02 2020-01-01 00:12:10 2020-01-02 03:40:31 2020-01-01 00:12:10.000 2020-01-02 03:40:31.000 730 99631 50180.5 5018050 730 99631 50180.5 5018050 -32440 32698 4960.66 496066 -127 124 -0.62 -62 -731 2 10721 99632 2.19519 299.19519 150.69519 15069.51951 2.19519 299.1952 150.69519 15069.51928 2.19519 299.19519 150.69519 15069.51900 2020-01-01 2020-01-02 2020-01-01 00:12:11 2020-01-02 03:40:32 2020-01-01 00:12:11.000 2020-01-02 03:40:32.000 731 99632 50181.5 5018150 731 99632 50181.5 5018150 -32439 32699 4961.66 496166 -126 125 0.38 38 -732 2 10722 99633 2.19819 299.19819 150.69819 15069.81981 2.19819 299.1982 150.69819 15069.81988 2.19819 299.19819 150.69818999999998 15069.81900 2020-01-01 2020-01-02 2020-01-01 00:12:12 2020-01-02 03:40:33 2020-01-01 00:12:12.000 2020-01-02 03:40:33.000 732 99633 50182.5 5018250 732 99633 50182.5 5018250 -32438 32700 4962.66 496266 -125 126 1.38 138 -733 2 10723 99634 2.2012 299.2012 150.7012 15070.12012 2.2012 299.2012 150.7012 15070.12022 2.20120 299.20120 150.7012 15070.12000 2020-01-01 2020-01-02 2020-01-01 00:12:13 2020-01-02 03:40:34 2020-01-01 00:12:13.000 2020-01-02 03:40:34.000 733 99634 50183.5 5018350 733 99634 50183.5 5018350 -32437 32701 4963.66 496366 -124 127 2.38 238 -734 2 10724 99635 2.2042 299.2042 150.7042 15070.42042 2.2042 299.2042 150.7042 15070.42036 2.20420 299.20420 150.70420000000001 15070.42000 2020-01-01 2020-01-02 2020-01-01 00:12:14 2020-01-02 03:40:35 2020-01-01 00:12:14.000 2020-01-02 03:40:35.000 734 99635 50184.5 5018450 734 99635 50184.5 5018450 -32436 32702 4964.66 496466 -128 127 0.82 82 -735 2 10725 99636 2.2072 299.2072 150.7072 15070.72072 2.2072 299.2072 150.70721 15070.72111 2.20720 299.20720 150.7072 15070.72000 2020-01-01 2020-01-02 2020-01-01 00:12:15 2020-01-02 03:40:36 2020-01-01 00:12:15.000 2020-01-02 03:40:36.000 735 99636 50185.5 5018550 735 99636 50185.5 5018550 -32435 32703 4965.66 496566 -128 127 -0.74 -74 -736 2 10726 99637 2.21021 299.21021 150.71021 15071.02102 2.21021 299.2102 150.7102 15071.02076 2.21021 299.21021 150.71021000000002 15071.02100 2020-01-01 2020-01-02 2020-01-01 00:12:16 2020-01-02 03:40:37 2020-01-01 00:12:16.000 2020-01-02 03:40:37.000 736 99637 50186.5 5018650 736 99637 50186.5 5018650 -32434 32704 4966.66 496666 -128 124 -2.3 -230 -737 2 10727 99638 2.21321 299.21321 150.71321 15071.32132 2.21321 299.21323 150.71321 15071.32139 2.21321 299.21321 150.71321 15071.32100 2020-01-01 2020-01-02 2020-01-01 00:12:17 2020-01-02 03:40:38 2020-01-01 00:12:17.000 2020-01-02 03:40:38.000 737 99638 50187.5 5018750 737 99638 50187.5 5018750 -32433 32705 4967.66 496766 -127 125 -1.3 -130 -738 2 10728 99639 2.21621 299.21621 150.71621 15071.62162 2.21621 299.21622 150.71621 15071.62169 2.21621 299.21621 150.71621 15071.62100 2020-01-01 2020-01-02 2020-01-01 00:12:18 2020-01-02 03:40:39 2020-01-01 00:12:18.000 2020-01-02 03:40:39.000 738 99639 50188.5 5018850 738 99639 50188.5 5018850 -32432 32706 4968.66 496866 -126 126 -0.3 -30 -739 2 10729 99640 2.21921 299.21921 150.71921 15071.92192 2.21921 299.2192 150.71921 15071.92199 2.21921 299.21921 150.71921 15071.92100 2020-01-01 2020-01-02 2020-01-01 00:12:19 2020-01-02 03:40:40 2020-01-01 00:12:19.000 2020-01-02 03:40:40.000 739 99640 50189.5 5018950 739 99640 50189.5 5018950 -32431 32707 4969.66 496966 -125 127 0.7 70 +730 2 10720 99631 2.19219 299.19219 150.69219 15069.21921 2.19219 299.1922 150.69219 15069.21965 2.19219 299.19219 150.69218999999998 15069.219 2020-01-01 2020-01-02 2020-01-01 00:12:10 2020-01-02 03:40:31 2020-01-01 00:12:10.000 2020-01-02 03:40:31.000 730 99631 50180.5 5018050 730 99631 50180.5 5018050 -32440 32698 4960.66 496066 -127 124 -0.62 -62 +731 2 10721 99632 2.19519 299.19519 150.69519 15069.51951 2.19519 299.1952 150.69519 15069.51928 2.19519 299.19519 150.69519 15069.519 2020-01-01 2020-01-02 2020-01-01 00:12:11 2020-01-02 03:40:32 2020-01-01 00:12:11.000 2020-01-02 03:40:32.000 731 99632 50181.5 5018150 731 99632 50181.5 5018150 -32439 32699 4961.66 496166 -126 125 0.38 38 +732 2 10722 99633 2.19819 299.19819 150.69819 15069.81981 2.19819 299.1982 150.69819 15069.81988 2.19819 299.19819 150.69818999999998 15069.819 2020-01-01 2020-01-02 2020-01-01 00:12:12 2020-01-02 03:40:33 2020-01-01 00:12:12.000 2020-01-02 03:40:33.000 732 99633 50182.5 5018250 732 99633 50182.5 5018250 -32438 32700 4962.66 496266 -125 126 1.38 138 +733 2 10723 99634 2.2012 299.2012 150.7012 15070.12012 2.2012 299.2012 150.7012 15070.12022 2.2012 299.2012 150.7012 15070.12 2020-01-01 2020-01-02 2020-01-01 00:12:13 2020-01-02 03:40:34 2020-01-01 00:12:13.000 2020-01-02 03:40:34.000 733 99634 50183.5 5018350 733 99634 50183.5 5018350 -32437 32701 4963.66 496366 -124 127 2.38 238 +734 2 10724 99635 2.2042 299.2042 150.7042 15070.42042 2.2042 299.2042 150.7042 15070.42036 2.2042 299.2042 150.70420000000001 15070.42 2020-01-01 2020-01-02 2020-01-01 00:12:14 2020-01-02 03:40:35 2020-01-01 00:12:14.000 2020-01-02 03:40:35.000 734 99635 50184.5 5018450 734 99635 50184.5 5018450 -32436 32702 4964.66 496466 -128 127 0.82 82 +735 2 10725 99636 2.2072 299.2072 150.7072 15070.72072 2.2072 299.2072 150.70721 15070.72111 2.2072 299.2072 150.7072 15070.72 2020-01-01 2020-01-02 2020-01-01 00:12:15 2020-01-02 03:40:36 2020-01-01 00:12:15.000 2020-01-02 03:40:36.000 735 99636 50185.5 5018550 735 99636 50185.5 5018550 -32435 32703 4965.66 496566 -128 127 -0.74 -74 +736 2 10726 99637 2.21021 299.21021 150.71021 15071.02102 2.21021 299.2102 150.7102 15071.02076 2.21021 299.21021 150.71021000000002 15071.021 2020-01-01 2020-01-02 2020-01-01 00:12:16 2020-01-02 03:40:37 2020-01-01 00:12:16.000 2020-01-02 03:40:37.000 736 99637 50186.5 5018650 736 99637 50186.5 5018650 -32434 32704 4966.66 496666 -128 124 -2.3 -230 +737 2 10727 99638 2.21321 299.21321 150.71321 15071.32132 2.21321 299.21323 150.71321 15071.32139 2.21321 299.21321 150.71321 15071.321 2020-01-01 2020-01-02 2020-01-01 00:12:17 2020-01-02 03:40:38 2020-01-01 00:12:17.000 2020-01-02 03:40:38.000 737 99638 50187.5 5018750 737 99638 50187.5 5018750 -32433 32705 4967.66 496766 -127 125 -1.3 -130 +738 2 10728 99639 2.21621 299.21621 150.71621 15071.62162 2.21621 299.21622 150.71621 15071.62169 2.21621 299.21621 150.71621 15071.621 2020-01-01 2020-01-02 2020-01-01 00:12:18 2020-01-02 03:40:39 2020-01-01 00:12:18.000 2020-01-02 03:40:39.000 738 99639 50188.5 5018850 738 99639 50188.5 5018850 -32432 32706 4968.66 496866 -126 126 -0.3 -30 +739 2 10729 99640 2.21921 299.21921 150.71921 15071.92192 2.21921 299.2192 150.71921 15071.92199 2.21921 299.21921 150.71921 15071.921 2020-01-01 2020-01-02 2020-01-01 00:12:19 2020-01-02 03:40:40 2020-01-01 00:12:19.000 2020-01-02 03:40:40.000 739 99640 50189.5 5018950 739 99640 50189.5 5018950 -32431 32707 4969.66 496966 -125 127 0.7 70 74 2 10064 99974 0.22222 300.22222 150.22222 15172.44444 0.22222 300.22223 150.22222 15172.4448 0.22222 300.22222 150.22222 15172.44422 2020-01-01 2020-01-02 2020-01-01 00:01:14 2020-01-02 03:46:14 2020-01-01 00:01:14.000 2020-01-02 03:46:14.000 74 99974 50024 5052424 74 99974 50024 5052424 -32495 32440 4603.009900990099 464904 -128 123 -4.99009900990099 -504 -740 2 10730 99641 2.22222 299.22222 150.72222 15072.22222 2.22222 299.22223 150.72222 15072.22258 2.22222 299.22222 150.72222 15072.22200 2020-01-01 2020-01-02 2020-01-01 00:12:20 2020-01-02 03:40:41 2020-01-01 00:12:20.000 2020-01-02 03:40:41.000 740 99641 50190.5 5019050 740 99641 50190.5 5019050 -32430 32708 4970.66 497066 -128 127 -0.86 -86 -741 2 10731 99642 2.22522 299.22522 150.72522 15072.52252 2.22522 299.22522 150.72522 15072.52223 2.22522 299.22522 150.72522 15072.52200 2020-01-01 2020-01-02 2020-01-01 00:12:21 2020-01-02 03:40:42 2020-01-01 00:12:21.000 2020-01-02 03:40:42.000 741 99642 50191.5 5019150 741 99642 50191.5 5019150 -32429 32709 4971.66 497166 -128 127 -2.42 -242 -742 2 10732 99643 2.22822 299.22822 150.72822 15072.82282 2.22822 299.22824 150.72822 15072.82286 2.22822 299.22822 150.72822 15072.82200 2020-01-01 2020-01-02 2020-01-01 00:12:22 2020-01-02 03:40:43 2020-01-01 00:12:22.000 2020-01-02 03:40:43.000 742 99643 50192.5 5019250 742 99643 50192.5 5019250 -32428 32710 4972.66 497266 -128 123 -3.98 -398 -743 2 10733 99644 2.23123 299.23123 150.73123 15073.12312 2.23123 299.23123 150.73123 15073.12316 2.23123 299.23123 150.73122999999998 15073.12300 2020-01-01 2020-01-02 2020-01-01 00:12:23 2020-01-02 03:40:44 2020-01-01 00:12:23.000 2020-01-02 03:40:44.000 743 99644 50193.5 5019350 743 99644 50193.5 5019350 -32427 32711 4973.66 497366 -127 124 -2.98 -298 -744 2 10734 99645 2.23423 299.23423 150.73423 15073.42342 2.23423 299.23422 150.73423 15073.42345 2.23423 299.23423 150.73423 15073.42300 2020-01-01 2020-01-02 2020-01-01 00:12:24 2020-01-02 03:40:45 2020-01-01 00:12:24.000 2020-01-02 03:40:45.000 744 99645 50194.5 5019450 744 99645 50194.5 5019450 -32426 32712 4974.66 497466 -126 125 -1.98 -198 -745 2 10735 99646 2.23723 299.23723 150.73723 15073.72372 2.23723 299.23724 150.73724 15073.72405 2.23723 299.23723 150.73723 15073.72300 2020-01-01 2020-01-02 2020-01-01 00:12:25 2020-01-02 03:40:46 2020-01-01 00:12:25.000 2020-01-02 03:40:46.000 745 99646 50195.5 5019550 745 99646 50195.5 5019550 -32425 32713 4975.66 497566 -125 126 -0.98 -98 -746 2 10736 99647 2.24024 299.24024 150.74024 15074.02402 2.24024 299.24023 150.74023 15074.02373 2.24024 299.24024 150.74024 15074.02400 2020-01-01 2020-01-02 2020-01-01 00:12:26 2020-01-02 03:40:47 2020-01-01 00:12:26.000 2020-01-02 03:40:47.000 746 99647 50196.5 5019650 746 99647 50196.5 5019650 -32424 32714 4976.66 497666 -124 127 0.02 2 -747 2 10737 99648 2.24324 299.24324 150.74324 15074.32432 2.24324 299.24326 150.74324 15074.32433 2.24324 299.24324 150.74324000000001 15074.32400 2020-01-01 2020-01-02 2020-01-01 00:12:27 2020-01-02 03:40:48 2020-01-01 00:12:27.000 2020-01-02 03:40:48.000 747 99648 50197.5 5019750 747 99648 50197.5 5019750 -32423 32715 4977.66 497766 -128 127 -1.54 -154 -748 2 10738 99649 2.24624 299.24624 150.74624 15074.62462 2.24624 299.24625 150.74624 15074.62463 2.24624 299.24624 150.74624 15074.62400 2020-01-01 2020-01-02 2020-01-01 00:12:28 2020-01-02 03:40:49 2020-01-01 00:12:28.000 2020-01-02 03:40:49.000 748 99649 50198.5 5019850 748 99649 50198.5 5019850 -32422 32716 4978.66 497866 -128 123 -3.1 -310 -749 2 10739 99650 2.24924 299.24924 150.74924 15074.92492 2.24924 299.24924 150.74924 15074.92492 2.24924 299.24924 150.74924000000001 15074.92400 2020-01-01 2020-01-02 2020-01-01 00:12:29 2020-01-02 03:40:50 2020-01-01 00:12:29.000 2020-01-02 03:40:50.000 749 99650 50199.5 5019950 749 99650 50199.5 5019950 -32421 32717 4979.66 497966 -127 124 -2.1 -210 +740 2 10730 99641 2.22222 299.22222 150.72222 15072.22222 2.22222 299.22223 150.72222 15072.22258 2.22222 299.22222 150.72222 15072.222 2020-01-01 2020-01-02 2020-01-01 00:12:20 2020-01-02 03:40:41 2020-01-01 00:12:20.000 2020-01-02 03:40:41.000 740 99641 50190.5 5019050 740 99641 50190.5 5019050 -32430 32708 4970.66 497066 -128 127 -0.86 -86 +741 2 10731 99642 2.22522 299.22522 150.72522 15072.52252 2.22522 299.22522 150.72522 15072.52223 2.22522 299.22522 150.72522 15072.522 2020-01-01 2020-01-02 2020-01-01 00:12:21 2020-01-02 03:40:42 2020-01-01 00:12:21.000 2020-01-02 03:40:42.000 741 99642 50191.5 5019150 741 99642 50191.5 5019150 -32429 32709 4971.66 497166 -128 127 -2.42 -242 +742 2 10732 99643 2.22822 299.22822 150.72822 15072.82282 2.22822 299.22824 150.72822 15072.82286 2.22822 299.22822 150.72822 15072.822 2020-01-01 2020-01-02 2020-01-01 00:12:22 2020-01-02 03:40:43 2020-01-01 00:12:22.000 2020-01-02 03:40:43.000 742 99643 50192.5 5019250 742 99643 50192.5 5019250 -32428 32710 4972.66 497266 -128 123 -3.98 -398 +743 2 10733 99644 2.23123 299.23123 150.73123 15073.12312 2.23123 299.23123 150.73123 15073.12316 2.23123 299.23123 150.73122999999998 15073.123 2020-01-01 2020-01-02 2020-01-01 00:12:23 2020-01-02 03:40:44 2020-01-01 00:12:23.000 2020-01-02 03:40:44.000 743 99644 50193.5 5019350 743 99644 50193.5 5019350 -32427 32711 4973.66 497366 -127 124 -2.98 -298 +744 2 10734 99645 2.23423 299.23423 150.73423 15073.42342 2.23423 299.23422 150.73423 15073.42345 2.23423 299.23423 150.73423 15073.423 2020-01-01 2020-01-02 2020-01-01 00:12:24 2020-01-02 03:40:45 2020-01-01 00:12:24.000 2020-01-02 03:40:45.000 744 99645 50194.5 5019450 744 99645 50194.5 5019450 -32426 32712 4974.66 497466 -126 125 -1.98 -198 +745 2 10735 99646 2.23723 299.23723 150.73723 15073.72372 2.23723 299.23724 150.73724 15073.72405 2.23723 299.23723 150.73723 15073.723 2020-01-01 2020-01-02 2020-01-01 00:12:25 2020-01-02 03:40:46 2020-01-01 00:12:25.000 2020-01-02 03:40:46.000 745 99646 50195.5 5019550 745 99646 50195.5 5019550 -32425 32713 4975.66 497566 -125 126 -0.98 -98 +746 2 10736 99647 2.24024 299.24024 150.74024 15074.02402 2.24024 299.24023 150.74023 15074.02373 2.24024 299.24024 150.74024 15074.024 2020-01-01 2020-01-02 2020-01-01 00:12:26 2020-01-02 03:40:47 2020-01-01 00:12:26.000 2020-01-02 03:40:47.000 746 99647 50196.5 5019650 746 99647 50196.5 5019650 -32424 32714 4976.66 497666 -124 127 0.02 2 +747 2 10737 99648 2.24324 299.24324 150.74324 15074.32432 2.24324 299.24326 150.74324 15074.32433 2.24324 299.24324 150.74324000000001 15074.324 2020-01-01 2020-01-02 2020-01-01 00:12:27 2020-01-02 03:40:48 2020-01-01 00:12:27.000 2020-01-02 03:40:48.000 747 99648 50197.5 5019750 747 99648 50197.5 5019750 -32423 32715 4977.66 497766 -128 127 -1.54 -154 +748 2 10738 99649 2.24624 299.24624 150.74624 15074.62462 2.24624 299.24625 150.74624 15074.62463 2.24624 299.24624 150.74624 15074.624 2020-01-01 2020-01-02 2020-01-01 00:12:28 2020-01-02 03:40:49 2020-01-01 00:12:28.000 2020-01-02 03:40:49.000 748 99649 50198.5 5019850 748 99649 50198.5 5019850 -32422 32716 4978.66 497866 -128 123 -3.1 -310 +749 2 10739 99650 2.24924 299.24924 150.74924 15074.92492 2.24924 299.24924 150.74924 15074.92492 2.24924 299.24924 150.74924000000001 15074.924 2020-01-01 2020-01-02 2020-01-01 00:12:29 2020-01-02 03:40:50 2020-01-01 00:12:29.000 2020-01-02 03:40:50.000 749 99650 50199.5 5019950 749 99650 50199.5 5019950 -32421 32717 4979.66 497966 -127 124 -2.1 -210 75 2 10065 99975 0.22522 300.22522 150.22522 15172.74774 0.22522 300.22522 150.22522 15172.74745 0.22522 300.22522 150.22521999999998 15172.74722 2020-01-01 2020-01-02 2020-01-01 00:01:15 2020-01-02 03:46:15 2020-01-01 00:01:15.000 2020-01-02 03:46:15.000 75 99975 50025 5052525 75 99975 50025 5052525 -32494 32441 4604.009900990099 465005 -127 124 -3.99009900990099 -403 -750 2 10740 99651 2.25225 299.25225 150.75225 15075.22522 2.25225 299.25226 150.75225 15075.22552 2.25225 299.25225 150.75225 15075.22500 2020-01-01 2020-01-02 2020-01-01 00:12:30 2020-01-02 03:40:51 2020-01-01 00:12:30.000 2020-01-02 03:40:51.000 750 99651 50200.5 5020050 750 99651 50200.5 5020050 -32420 32718 4980.66 498066 -126 125 -1.1 -110 -751 2 10741 99652 2.25525 299.25525 150.75525 15075.52552 2.25525 299.25525 150.75525 15075.5252 2.25525 299.25525 150.75525 15075.52500 2020-01-01 2020-01-02 2020-01-01 00:12:31 2020-01-02 03:40:52 2020-01-01 00:12:31.000 2020-01-02 03:40:52.000 751 99652 50201.5 5020150 751 99652 50201.5 5020150 -32419 32719 4981.66 498166 -125 126 -0.1 -10 -752 2 10742 99653 2.25825 299.25825 150.75825 15075.82582 2.25825 299.25827 150.75825 15075.8258 2.25825 299.25825 150.75825 15075.82500 2020-01-01 2020-01-02 2020-01-01 00:12:32 2020-01-02 03:40:53 2020-01-01 00:12:32.000 2020-01-02 03:40:53.000 752 99653 50202.5 5020250 752 99653 50202.5 5020250 -32418 32720 4982.66 498266 -124 127 0.9 90 -753 2 10743 99654 2.26126 299.26126 150.76126 15076.12612 2.26126 299.26126 150.76126 15076.12609 2.26126 299.26126 150.76126 15076.12600 2020-01-01 2020-01-02 2020-01-01 00:12:33 2020-01-02 03:40:54 2020-01-01 00:12:33.000 2020-01-02 03:40:54.000 753 99654 50203.5 5020350 753 99654 50203.5 5020350 -32417 32721 4983.66 498366 -128 127 -0.66 -66 -754 2 10744 99655 2.26426 299.26426 150.76426 15076.42642 2.26426 299.26425 150.76426 15076.4264 2.26426 299.26426 150.76426 15076.42600 2020-01-01 2020-01-02 2020-01-01 00:12:34 2020-01-02 03:40:55 2020-01-01 00:12:34.000 2020-01-02 03:40:55.000 754 99655 50204.5 5020450 754 99655 50204.5 5020450 -32416 32722 4984.66 498466 -128 123 -2.22 -222 -755 2 10745 99656 2.26726 299.26726 150.76726 15076.72672 2.26726 299.26727 150.76727 15076.72703 2.26726 299.26726 150.76726 15076.72600 2020-01-01 2020-01-02 2020-01-01 00:12:35 2020-01-02 03:40:56 2020-01-01 00:12:35.000 2020-01-02 03:40:56.000 755 99656 50205.5 5020550 755 99656 50205.5 5020550 -32415 32723 4985.66 498566 -127 124 -1.22 -122 -756 2 10746 99657 2.27027 299.27027 150.77027 15077.02702 2.27027 299.27026 150.77026 15077.02667 2.27027 299.27027 150.77027 15077.02700 2020-01-01 2020-01-02 2020-01-01 00:12:36 2020-01-02 03:40:57 2020-01-01 00:12:36.000 2020-01-02 03:40:57.000 756 99657 50206.5 5020650 756 99657 50206.5 5020650 -32414 32724 4986.66 498666 -126 125 -0.22 -22 -757 2 10747 99658 2.27327 299.27327 150.77327 15077.32732 2.27327 299.2733 150.77327 15077.32727 2.27327 299.27327 150.77327 15077.32700 2020-01-01 2020-01-02 2020-01-01 00:12:37 2020-01-02 03:40:58 2020-01-01 00:12:37.000 2020-01-02 03:40:58.000 757 99658 50207.5 5020750 757 99658 50207.5 5020750 -32413 32725 4987.66 498766 -125 126 0.78 78 -758 2 10748 99659 2.27627 299.27627 150.77627 15077.62762 2.27627 299.27628 150.77627 15077.62756 2.27627 299.27627 150.77627 15077.62700 2020-01-01 2020-01-02 2020-01-01 00:12:38 2020-01-02 03:40:59 2020-01-01 00:12:38.000 2020-01-02 03:40:59.000 758 99659 50208.5 5020850 758 99659 50208.5 5020850 -32412 32726 4988.66 498866 -124 127 1.78 178 -759 2 10749 99660 2.27927 299.27927 150.77927 15077.92792 2.27927 299.27927 150.77927 15077.92787 2.27927 299.27927 150.77927 15077.92700 2020-01-01 2020-01-02 2020-01-01 00:12:39 2020-01-02 03:41:00 2020-01-01 00:12:39.000 2020-01-02 03:41:00.000 759 99660 50209.5 5020950 759 99660 50209.5 5020950 -32411 32727 4989.66 498966 -128 127 0.22 22 +750 2 10740 99651 2.25225 299.25225 150.75225 15075.22522 2.25225 299.25226 150.75225 15075.22552 2.25225 299.25225 150.75225 15075.225 2020-01-01 2020-01-02 2020-01-01 00:12:30 2020-01-02 03:40:51 2020-01-01 00:12:30.000 2020-01-02 03:40:51.000 750 99651 50200.5 5020050 750 99651 50200.5 5020050 -32420 32718 4980.66 498066 -126 125 -1.1 -110 +751 2 10741 99652 2.25525 299.25525 150.75525 15075.52552 2.25525 299.25525 150.75525 15075.5252 2.25525 299.25525 150.75525 15075.525 2020-01-01 2020-01-02 2020-01-01 00:12:31 2020-01-02 03:40:52 2020-01-01 00:12:31.000 2020-01-02 03:40:52.000 751 99652 50201.5 5020150 751 99652 50201.5 5020150 -32419 32719 4981.66 498166 -125 126 -0.1 -10 +752 2 10742 99653 2.25825 299.25825 150.75825 15075.82582 2.25825 299.25827 150.75825 15075.8258 2.25825 299.25825 150.75825 15075.825 2020-01-01 2020-01-02 2020-01-01 00:12:32 2020-01-02 03:40:53 2020-01-01 00:12:32.000 2020-01-02 03:40:53.000 752 99653 50202.5 5020250 752 99653 50202.5 5020250 -32418 32720 4982.66 498266 -124 127 0.9 90 +753 2 10743 99654 2.26126 299.26126 150.76126 15076.12612 2.26126 299.26126 150.76126 15076.12609 2.26126 299.26126 150.76126 15076.126 2020-01-01 2020-01-02 2020-01-01 00:12:33 2020-01-02 03:40:54 2020-01-01 00:12:33.000 2020-01-02 03:40:54.000 753 99654 50203.5 5020350 753 99654 50203.5 5020350 -32417 32721 4983.66 498366 -128 127 -0.66 -66 +754 2 10744 99655 2.26426 299.26426 150.76426 15076.42642 2.26426 299.26425 150.76426 15076.4264 2.26426 299.26426 150.76426 15076.426 2020-01-01 2020-01-02 2020-01-01 00:12:34 2020-01-02 03:40:55 2020-01-01 00:12:34.000 2020-01-02 03:40:55.000 754 99655 50204.5 5020450 754 99655 50204.5 5020450 -32416 32722 4984.66 498466 -128 123 -2.22 -222 +755 2 10745 99656 2.26726 299.26726 150.76726 15076.72672 2.26726 299.26727 150.76727 15076.72703 2.26726 299.26726 150.76726 15076.726 2020-01-01 2020-01-02 2020-01-01 00:12:35 2020-01-02 03:40:56 2020-01-01 00:12:35.000 2020-01-02 03:40:56.000 755 99656 50205.5 5020550 755 99656 50205.5 5020550 -32415 32723 4985.66 498566 -127 124 -1.22 -122 +756 2 10746 99657 2.27027 299.27027 150.77027 15077.02702 2.27027 299.27026 150.77026 15077.02667 2.27027 299.27027 150.77027 15077.027 2020-01-01 2020-01-02 2020-01-01 00:12:36 2020-01-02 03:40:57 2020-01-01 00:12:36.000 2020-01-02 03:40:57.000 756 99657 50206.5 5020650 756 99657 50206.5 5020650 -32414 32724 4986.66 498666 -126 125 -0.22 -22 +757 2 10747 99658 2.27327 299.27327 150.77327 15077.32732 2.27327 299.2733 150.77327 15077.32727 2.27327 299.27327 150.77327 15077.327 2020-01-01 2020-01-02 2020-01-01 00:12:37 2020-01-02 03:40:58 2020-01-01 00:12:37.000 2020-01-02 03:40:58.000 757 99658 50207.5 5020750 757 99658 50207.5 5020750 -32413 32725 4987.66 498766 -125 126 0.78 78 +758 2 10748 99659 2.27627 299.27627 150.77627 15077.62762 2.27627 299.27628 150.77627 15077.62756 2.27627 299.27627 150.77627 15077.627 2020-01-01 2020-01-02 2020-01-01 00:12:38 2020-01-02 03:40:59 2020-01-01 00:12:38.000 2020-01-02 03:40:59.000 758 99659 50208.5 5020850 758 99659 50208.5 5020850 -32412 32726 4988.66 498866 -124 127 1.78 178 +759 2 10749 99660 2.27927 299.27927 150.77927 15077.92792 2.27927 299.27927 150.77927 15077.92787 2.27927 299.27927 150.77927 15077.927 2020-01-01 2020-01-02 2020-01-01 00:12:39 2020-01-02 03:41:00 2020-01-01 00:12:39.000 2020-01-02 03:41:00.000 759 99660 50209.5 5020950 759 99660 50209.5 5020950 -32411 32727 4989.66 498966 -128 127 0.22 22 76 2 10066 99976 0.22822 300.22822 150.22822 15173.05105 0.22822 300.22824 150.22822 15173.05109 0.22822 300.22822 150.22822 15173.05022 2020-01-01 2020-01-02 2020-01-01 00:01:16 2020-01-02 03:46:16 2020-01-01 00:01:16.000 2020-01-02 03:46:16.000 76 99976 50026 5052626 76 99976 50026 5052626 -32493 32442 4605.009900990099 465106 -126 125 -2.99009900990099 -302 -760 2 10750 99661 2.28228 299.28228 150.78228 15078.22822 2.28228 299.2823 150.78228 15078.2285 2.28228 299.28228 150.78228 15078.22800 2020-01-01 2020-01-02 2020-01-01 00:12:40 2020-01-02 03:41:01 2020-01-01 00:12:40.000 2020-01-02 03:41:01.000 760 99661 50210.5 5021050 760 99661 50210.5 5021050 -32410 32728 4990.66 499066 -128 127 -1.34 -134 -761 2 10751 99662 2.28528 299.28528 150.78528 15078.52852 2.28528 299.28528 150.78528 15078.52814 2.28528 299.28528 150.78528 15078.52800 2020-01-01 2020-01-02 2020-01-01 00:12:41 2020-01-02 03:41:02 2020-01-01 00:12:41.000 2020-01-02 03:41:02.000 761 99662 50211.5 5021150 761 99662 50211.5 5021150 -32409 32729 4991.66 499166 -128 124 -2.9 -290 -762 2 10752 99663 2.28828 299.28828 150.78828 15078.82882 2.28828 299.2883 150.78828 15078.82889 2.28828 299.28828 150.78828 15078.82800 2020-01-01 2020-01-02 2020-01-01 00:12:42 2020-01-02 03:41:03 2020-01-01 00:12:42.000 2020-01-02 03:41:03.000 762 99663 50212.5 5021250 762 99663 50212.5 5021250 -32408 32730 4992.66 499266 -127 125 -1.9 -190 -763 2 10753 99664 2.29129 299.29129 150.79129 15079.12912 2.29129 299.2913 150.79129 15079.12904 2.29129 299.29129 150.79129 15079.12900 2020-01-01 2020-01-02 2020-01-01 00:12:43 2020-01-02 03:41:04 2020-01-01 00:12:43.000 2020-01-02 03:41:04.000 763 99664 50213.5 5021350 763 99664 50213.5 5021350 -32407 32731 4993.66 499366 -126 126 -0.9 -90 -764 2 10754 99665 2.29429 299.29429 150.79429 15079.42942 2.29429 299.29428 150.79429 15079.42933 2.29429 299.29429 150.79429 15079.42900 2020-01-01 2020-01-02 2020-01-01 00:12:44 2020-01-02 03:41:05 2020-01-01 00:12:44.000 2020-01-02 03:41:05.000 764 99665 50214.5 5021450 764 99665 50214.5 5021450 -32406 32732 4994.66 499466 -125 127 0.1 10 -765 2 10755 99666 2.29729 299.29729 150.79729 15079.72972 2.29729 299.2973 150.79729 15079.72996 2.29729 299.29729 150.79729 15079.72900 2020-01-01 2020-01-02 2020-01-01 00:12:45 2020-01-02 03:41:06 2020-01-01 00:12:45.000 2020-01-02 03:41:06.000 765 99666 50215.5 5021550 765 99666 50215.5 5021550 -32405 32733 4995.66 499566 -128 127 -1.46 -146 -766 2 10756 99667 2.3003 299.3003 150.8003 15080.03003 2.3003 299.3003 150.80029 15080.02961 2.30030 299.30030 150.8003 15080.03000 2020-01-01 2020-01-02 2020-01-01 00:12:46 2020-01-02 03:41:07 2020-01-01 00:12:46.000 2020-01-02 03:41:07.000 766 99667 50216.5 5021650 766 99667 50216.5 5021650 -32404 32734 4996.66 499666 -128 127 -3.02 -302 -767 2 10757 99668 2.3033 299.3033 150.8033 15080.33033 2.3033 299.3033 150.8033 15080.33036 2.30330 299.30330 150.8033 15080.33000 2020-01-01 2020-01-02 2020-01-01 00:12:47 2020-01-02 03:41:08 2020-01-01 00:12:47.000 2020-01-02 03:41:08.000 767 99668 50217.5 5021750 767 99668 50217.5 5021750 -32403 32735 4997.66 499766 -128 123 -4.58 -458 -768 2 10758 99669 2.3063 299.3063 150.8063 15080.63063 2.3063 299.3063 150.8063 15080.6305 2.30630 299.30630 150.8063 15080.63000 2020-01-01 2020-01-02 2020-01-01 00:12:48 2020-01-02 03:41:09 2020-01-01 00:12:48.000 2020-01-02 03:41:09.000 768 99669 50218.5 5021850 768 99669 50218.5 5021850 -32402 32736 4998.66 499866 -127 124 -3.58 -358 -769 2 10759 99670 2.3093 299.3093 150.8093 15080.93093 2.3093 299.3093 150.8093 15080.93084 2.30930 299.30930 150.8093 15080.93000 2020-01-01 2020-01-02 2020-01-01 00:12:49 2020-01-02 03:41:10 2020-01-01 00:12:49.000 2020-01-02 03:41:10.000 769 99670 50219.5 5021950 769 99670 50219.5 5021950 -32401 32737 4999.66 499966 -126 125 -2.58 -258 +760 2 10750 99661 2.28228 299.28228 150.78228 15078.22822 2.28228 299.2823 150.78228 15078.2285 2.28228 299.28228 150.78228 15078.228 2020-01-01 2020-01-02 2020-01-01 00:12:40 2020-01-02 03:41:01 2020-01-01 00:12:40.000 2020-01-02 03:41:01.000 760 99661 50210.5 5021050 760 99661 50210.5 5021050 -32410 32728 4990.66 499066 -128 127 -1.34 -134 +761 2 10751 99662 2.28528 299.28528 150.78528 15078.52852 2.28528 299.28528 150.78528 15078.52814 2.28528 299.28528 150.78528 15078.528 2020-01-01 2020-01-02 2020-01-01 00:12:41 2020-01-02 03:41:02 2020-01-01 00:12:41.000 2020-01-02 03:41:02.000 761 99662 50211.5 5021150 761 99662 50211.5 5021150 -32409 32729 4991.66 499166 -128 124 -2.9 -290 +762 2 10752 99663 2.28828 299.28828 150.78828 15078.82882 2.28828 299.2883 150.78828 15078.82889 2.28828 299.28828 150.78828 15078.828 2020-01-01 2020-01-02 2020-01-01 00:12:42 2020-01-02 03:41:03 2020-01-01 00:12:42.000 2020-01-02 03:41:03.000 762 99663 50212.5 5021250 762 99663 50212.5 5021250 -32408 32730 4992.66 499266 -127 125 -1.9 -190 +763 2 10753 99664 2.29129 299.29129 150.79129 15079.12912 2.29129 299.2913 150.79129 15079.12904 2.29129 299.29129 150.79129 15079.129 2020-01-01 2020-01-02 2020-01-01 00:12:43 2020-01-02 03:41:04 2020-01-01 00:12:43.000 2020-01-02 03:41:04.000 763 99664 50213.5 5021350 763 99664 50213.5 5021350 -32407 32731 4993.66 499366 -126 126 -0.9 -90 +764 2 10754 99665 2.29429 299.29429 150.79429 15079.42942 2.29429 299.29428 150.79429 15079.42933 2.29429 299.29429 150.79429 15079.429 2020-01-01 2020-01-02 2020-01-01 00:12:44 2020-01-02 03:41:05 2020-01-01 00:12:44.000 2020-01-02 03:41:05.000 764 99665 50214.5 5021450 764 99665 50214.5 5021450 -32406 32732 4994.66 499466 -125 127 0.1 10 +765 2 10755 99666 2.29729 299.29729 150.79729 15079.72972 2.29729 299.2973 150.79729 15079.72996 2.29729 299.29729 150.79729 15079.729 2020-01-01 2020-01-02 2020-01-01 00:12:45 2020-01-02 03:41:06 2020-01-01 00:12:45.000 2020-01-02 03:41:06.000 765 99666 50215.5 5021550 765 99666 50215.5 5021550 -32405 32733 4995.66 499566 -128 127 -1.46 -146 +766 2 10756 99667 2.3003 299.3003 150.8003 15080.03003 2.3003 299.3003 150.80029 15080.02961 2.3003 299.3003 150.8003 15080.03 2020-01-01 2020-01-02 2020-01-01 00:12:46 2020-01-02 03:41:07 2020-01-01 00:12:46.000 2020-01-02 03:41:07.000 766 99667 50216.5 5021650 766 99667 50216.5 5021650 -32404 32734 4996.66 499666 -128 127 -3.02 -302 +767 2 10757 99668 2.3033 299.3033 150.8033 15080.33033 2.3033 299.3033 150.8033 15080.33036 2.3033 299.3033 150.8033 15080.33 2020-01-01 2020-01-02 2020-01-01 00:12:47 2020-01-02 03:41:08 2020-01-01 00:12:47.000 2020-01-02 03:41:08.000 767 99668 50217.5 5021750 767 99668 50217.5 5021750 -32403 32735 4997.66 499766 -128 123 -4.58 -458 +768 2 10758 99669 2.3063 299.3063 150.8063 15080.63063 2.3063 299.3063 150.8063 15080.6305 2.3063 299.3063 150.8063 15080.63 2020-01-01 2020-01-02 2020-01-01 00:12:48 2020-01-02 03:41:09 2020-01-01 00:12:48.000 2020-01-02 03:41:09.000 768 99669 50218.5 5021850 768 99669 50218.5 5021850 -32402 32736 4998.66 499866 -127 124 -3.58 -358 +769 2 10759 99670 2.3093 299.3093 150.8093 15080.93093 2.3093 299.3093 150.8093 15080.93084 2.3093 299.3093 150.8093 15080.93 2020-01-01 2020-01-02 2020-01-01 00:12:49 2020-01-02 03:41:10 2020-01-01 00:12:49.000 2020-01-02 03:41:10.000 769 99670 50219.5 5021950 769 99670 50219.5 5021950 -32401 32737 4999.66 499966 -126 125 -2.58 -258 77 2 10067 99977 0.23123 300.23123 150.23123 15173.35435 0.23123 300.23123 150.23123 15173.35439 0.23123 300.23123 150.23123 15173.35423 2020-01-01 2020-01-02 2020-01-01 00:01:17 2020-01-02 03:46:17 2020-01-01 00:01:17.000 2020-01-02 03:46:17.000 77 99977 50027 5052727 77 99977 50027 5052727 -32492 32443 4606.009900990099 465207 -125 126 -1.99009900990099 -201 -770 2 10760 99671 2.31231 299.31231 150.81231 15081.23123 2.31231 299.31232 150.81231 15081.23144 2.31231 299.31231 150.81231 15081.23100 2020-01-01 2020-01-02 2020-01-01 00:12:50 2020-01-02 03:41:11 2020-01-01 00:12:50.000 2020-01-02 03:41:11.000 770 99671 50220.5 5022050 770 99671 50220.5 5022050 -32400 32738 5000.66 500066 -125 126 -1.58 -158 -771 2 10761 99672 2.31531 299.31531 150.81531 15081.53153 2.31531 299.3153 150.81531 15081.53173 2.31531 299.31531 150.81531 15081.53100 2020-01-01 2020-01-02 2020-01-01 00:12:51 2020-01-02 03:41:12 2020-01-01 00:12:51.000 2020-01-02 03:41:12.000 771 99672 50221.5 5022150 771 99672 50221.5 5022150 -32399 32739 5001.66 500166 -124 127 -0.58 -58 -772 2 10762 99673 2.31831 299.31831 150.81831 15081.83183 2.31831 299.31833 150.81831 15081.83183 2.31831 299.31831 150.81831 15081.83100 2020-01-01 2020-01-02 2020-01-01 00:12:52 2020-01-02 03:41:13 2020-01-01 00:12:52.000 2020-01-02 03:41:13.000 772 99673 50222.5 5022250 772 99673 50222.5 5022250 -32398 32740 5002.66 500266 -128 127 -2.14 -214 -773 2 10763 99674 2.32132 299.32132 150.82132 15082.13213 2.32132 299.32132 150.82131 15082.13197 2.32132 299.32132 150.82132 15082.13200 2020-01-01 2020-01-02 2020-01-01 00:12:53 2020-01-02 03:41:14 2020-01-01 00:12:53.000 2020-01-02 03:41:14.000 773 99674 50223.5 5022350 773 99674 50223.5 5022350 -32397 32741 5003.66 500366 -128 123 -3.7 -370 -774 2 10764 99675 2.32432 299.32432 150.82432 15082.43243 2.32432 299.3243 150.82432 15082.43231 2.32432 299.32432 150.82432 15082.43200 2020-01-01 2020-01-02 2020-01-01 00:12:54 2020-01-02 03:41:15 2020-01-01 00:12:54.000 2020-01-02 03:41:15.000 774 99675 50224.5 5022450 774 99675 50224.5 5022450 -32396 32742 5004.66 500466 -127 124 -2.7 -270 -775 2 10765 99676 2.32732 299.32732 150.82732 15082.73273 2.32732 299.32733 150.82732 15082.73291 2.32732 299.32732 150.82732 15082.73200 2020-01-01 2020-01-02 2020-01-01 00:12:55 2020-01-02 03:41:16 2020-01-01 00:12:55.000 2020-01-02 03:41:16.000 775 99676 50225.5 5022550 775 99676 50225.5 5022550 -32395 32743 5005.66 500566 -126 125 -1.7 -170 -776 2 10766 99677 2.33033 299.33033 150.83033 15083.03303 2.33033 299.33032 150.83033 15083.0332 2.33033 299.33033 150.83033 15083.03300 2020-01-01 2020-01-02 2020-01-01 00:12:56 2020-01-02 03:41:17 2020-01-01 00:12:56.000 2020-01-02 03:41:17.000 776 99677 50226.5 5022650 776 99677 50226.5 5022650 -32394 32744 5006.66 500666 -125 126 -0.7 -70 -777 2 10767 99678 2.33333 299.33333 150.83333 15083.33333 2.33333 299.33334 150.83333 15083.3333 2.33333 299.33333 150.83333000000002 15083.33300 2020-01-01 2020-01-02 2020-01-01 00:12:57 2020-01-02 03:41:18 2020-01-01 00:12:57.000 2020-01-02 03:41:18.000 777 99678 50227.5 5022750 777 99678 50227.5 5022750 -32393 32745 5007.66 500766 -124 127 0.3 30 -778 2 10768 99679 2.33633 299.33633 150.83633 15083.63363 2.33633 299.33633 150.83633 15083.63348 2.33633 299.33633 150.83633 15083.63300 2020-01-01 2020-01-02 2020-01-01 00:12:58 2020-01-02 03:41:19 2020-01-01 00:12:58.000 2020-01-02 03:41:19.000 778 99679 50228.5 5022850 778 99679 50228.5 5022850 -32392 32746 5008.66 500866 -128 127 -1.26 -126 -779 2 10769 99680 2.33933 299.33933 150.83933 15083.93393 2.33933 299.33932 150.83933 15083.93378 2.33933 299.33933 150.83933000000002 15083.93300 2020-01-01 2020-01-02 2020-01-01 00:12:59 2020-01-02 03:41:20 2020-01-01 00:12:59.000 2020-01-02 03:41:20.000 779 99680 50229.5 5022950 779 99680 50229.5 5022950 -32391 32747 5009.66 500966 -128 123 -2.82 -282 +770 2 10760 99671 2.31231 299.31231 150.81231 15081.23123 2.31231 299.31232 150.81231 15081.23144 2.31231 299.31231 150.81231 15081.231 2020-01-01 2020-01-02 2020-01-01 00:12:50 2020-01-02 03:41:11 2020-01-01 00:12:50.000 2020-01-02 03:41:11.000 770 99671 50220.5 5022050 770 99671 50220.5 5022050 -32400 32738 5000.66 500066 -125 126 -1.58 -158 +771 2 10761 99672 2.31531 299.31531 150.81531 15081.53153 2.31531 299.3153 150.81531 15081.53173 2.31531 299.31531 150.81531 15081.531 2020-01-01 2020-01-02 2020-01-01 00:12:51 2020-01-02 03:41:12 2020-01-01 00:12:51.000 2020-01-02 03:41:12.000 771 99672 50221.5 5022150 771 99672 50221.5 5022150 -32399 32739 5001.66 500166 -124 127 -0.58 -58 +772 2 10762 99673 2.31831 299.31831 150.81831 15081.83183 2.31831 299.31833 150.81831 15081.83183 2.31831 299.31831 150.81831 15081.831 2020-01-01 2020-01-02 2020-01-01 00:12:52 2020-01-02 03:41:13 2020-01-01 00:12:52.000 2020-01-02 03:41:13.000 772 99673 50222.5 5022250 772 99673 50222.5 5022250 -32398 32740 5002.66 500266 -128 127 -2.14 -214 +773 2 10763 99674 2.32132 299.32132 150.82132 15082.13213 2.32132 299.32132 150.82131 15082.13197 2.32132 299.32132 150.82132 15082.132 2020-01-01 2020-01-02 2020-01-01 00:12:53 2020-01-02 03:41:14 2020-01-01 00:12:53.000 2020-01-02 03:41:14.000 773 99674 50223.5 5022350 773 99674 50223.5 5022350 -32397 32741 5003.66 500366 -128 123 -3.7 -370 +774 2 10764 99675 2.32432 299.32432 150.82432 15082.43243 2.32432 299.3243 150.82432 15082.43231 2.32432 299.32432 150.82432 15082.432 2020-01-01 2020-01-02 2020-01-01 00:12:54 2020-01-02 03:41:15 2020-01-01 00:12:54.000 2020-01-02 03:41:15.000 774 99675 50224.5 5022450 774 99675 50224.5 5022450 -32396 32742 5004.66 500466 -127 124 -2.7 -270 +775 2 10765 99676 2.32732 299.32732 150.82732 15082.73273 2.32732 299.32733 150.82732 15082.73291 2.32732 299.32732 150.82732 15082.732 2020-01-01 2020-01-02 2020-01-01 00:12:55 2020-01-02 03:41:16 2020-01-01 00:12:55.000 2020-01-02 03:41:16.000 775 99676 50225.5 5022550 775 99676 50225.5 5022550 -32395 32743 5005.66 500566 -126 125 -1.7 -170 +776 2 10766 99677 2.33033 299.33033 150.83033 15083.03303 2.33033 299.33032 150.83033 15083.0332 2.33033 299.33033 150.83033 15083.033 2020-01-01 2020-01-02 2020-01-01 00:12:56 2020-01-02 03:41:17 2020-01-01 00:12:56.000 2020-01-02 03:41:17.000 776 99677 50226.5 5022650 776 99677 50226.5 5022650 -32394 32744 5006.66 500666 -125 126 -0.7 -70 +777 2 10767 99678 2.33333 299.33333 150.83333 15083.33333 2.33333 299.33334 150.83333 15083.3333 2.33333 299.33333 150.83333000000002 15083.333 2020-01-01 2020-01-02 2020-01-01 00:12:57 2020-01-02 03:41:18 2020-01-01 00:12:57.000 2020-01-02 03:41:18.000 777 99678 50227.5 5022750 777 99678 50227.5 5022750 -32393 32745 5007.66 500766 -124 127 0.3 30 +778 2 10768 99679 2.33633 299.33633 150.83633 15083.63363 2.33633 299.33633 150.83633 15083.63348 2.33633 299.33633 150.83633 15083.633 2020-01-01 2020-01-02 2020-01-01 00:12:58 2020-01-02 03:41:19 2020-01-01 00:12:58.000 2020-01-02 03:41:19.000 778 99679 50228.5 5022850 778 99679 50228.5 5022850 -32392 32746 5008.66 500866 -128 127 -1.26 -126 +779 2 10769 99680 2.33933 299.33933 150.83933 15083.93393 2.33933 299.33932 150.83933 15083.93378 2.33933 299.33933 150.83933000000002 15083.933 2020-01-01 2020-01-02 2020-01-01 00:12:59 2020-01-02 03:41:20 2020-01-01 00:12:59.000 2020-01-02 03:41:20.000 779 99680 50229.5 5022950 779 99680 50229.5 5022950 -32391 32747 5009.66 500966 -128 123 -2.82 -282 78 2 10068 99978 0.23423 300.23423 150.23423 15173.65765 0.23423 300.23422 150.23423 15173.65769 0.23423 300.23423 150.23423 15173.65723 2020-01-01 2020-01-02 2020-01-01 00:01:18 2020-01-02 03:46:18 2020-01-01 00:01:18.000 2020-01-02 03:46:18.000 78 99978 50028 5052828 78 99978 50028 5052828 -32491 32444 4607.009900990099 465308 -124 127 -0.9900990099009901 -100 -780 2 10770 99681 2.34234 299.34234 150.84234 15084.23423 2.34234 299.34235 150.84234 15084.23437 2.34234 299.34234 150.84234 15084.23400 2020-01-01 2020-01-02 2020-01-01 00:13:00 2020-01-02 03:41:21 2020-01-01 00:13:00.000 2020-01-02 03:41:21.000 780 99681 50230.5 5023050 780 99681 50230.5 5023050 -32390 32748 5010.66 501066 -127 124 -1.82 -182 -781 2 10771 99682 2.34534 299.34534 150.84534 15084.53453 2.34534 299.34534 150.84534 15084.53467 2.34534 299.34534 150.84534 15084.53400 2020-01-01 2020-01-02 2020-01-01 00:13:01 2020-01-02 03:41:22 2020-01-01 00:13:01.000 2020-01-02 03:41:22.000 781 99682 50231.5 5023150 781 99682 50231.5 5023150 -32389 32749 5011.66 501166 -126 125 -0.82 -82 -782 2 10772 99683 2.34834 299.34834 150.84834 15084.83483 2.34834 299.34836 150.84834 15084.83477 2.34834 299.34834 150.84834 15084.83400 2020-01-01 2020-01-02 2020-01-01 00:13:02 2020-01-02 03:41:23 2020-01-01 00:13:02.000 2020-01-02 03:41:23.000 782 99683 50232.5 5023250 782 99683 50232.5 5023250 -32388 32750 5012.66 501266 -125 126 0.18 18 -783 2 10773 99684 2.35135 299.35135 150.85135 15085.13513 2.35135 299.35135 150.85134 15085.13495 2.35135 299.35135 150.85135 15085.13500 2020-01-01 2020-01-02 2020-01-01 00:13:03 2020-01-02 03:41:24 2020-01-01 00:13:03.000 2020-01-02 03:41:24.000 783 99684 50233.5 5023350 783 99684 50233.5 5023350 -32387 32751 5013.66 501366 -124 127 1.18 118 -784 2 10774 99685 2.35435 299.35435 150.85435 15085.43543 2.35435 299.35434 150.85435 15085.43525 2.35435 299.35435 150.85434999999998 15085.43500 2020-01-01 2020-01-02 2020-01-01 00:13:04 2020-01-02 03:41:25 2020-01-01 00:13:04.000 2020-01-02 03:41:25.000 784 99685 50234.5 5023450 784 99685 50234.5 5023450 -32386 32752 5014.66 501466 -128 127 -0.38 -38 -785 2 10775 99686 2.35735 299.35735 150.85735 15085.73573 2.35735 299.35736 150.85736 15085.736 2.35735 299.35735 150.85735 15085.73500 2020-01-01 2020-01-02 2020-01-01 00:13:05 2020-01-02 03:41:26 2020-01-01 00:13:05.000 2020-01-02 03:41:26.000 785 99686 50235.5 5023550 785 99686 50235.5 5023550 -32385 32753 5015.66 501566 -128 127 -1.94 -194 -786 2 10776 99687 2.36036 299.36036 150.86036 15086.03603 2.36036 299.36035 150.86036 15086.03614 2.36036 299.36036 150.86036000000001 15086.03600 2020-01-01 2020-01-02 2020-01-01 00:13:06 2020-01-02 03:41:27 2020-01-01 00:13:06.000 2020-01-02 03:41:27.000 786 99687 50236.5 5023650 786 99687 50236.5 5023650 -32384 32754 5016.66 501666 -128 124 -3.5 -350 -787 2 10777 99688 2.36336 299.36336 150.86336 15086.33633 2.36336 299.36337 150.86336 15086.33628 2.36336 299.36336 150.86336 15086.33600 2020-01-01 2020-01-02 2020-01-01 00:13:07 2020-01-02 03:41:28 2020-01-01 00:13:07.000 2020-01-02 03:41:28.000 787 99688 50237.5 5023750 787 99688 50237.5 5023750 -32383 32755 5017.66 501766 -127 125 -2.5 -250 -788 2 10778 99689 2.36636 299.36636 150.86636 15086.63663 2.36636 299.36636 150.86636 15086.63641 2.36636 299.36636 150.86636000000001 15086.63600 2020-01-01 2020-01-02 2020-01-01 00:13:08 2020-01-02 03:41:29 2020-01-01 00:13:08.000 2020-01-02 03:41:29.000 788 99689 50238.5 5023850 788 99689 50238.5 5023850 -32382 32756 5018.66 501866 -126 126 -1.5 -150 -789 2 10779 99690 2.36936 299.36936 150.86936 15086.93693 2.36936 299.36935 150.86936 15086.93672 2.36936 299.36936 150.86936 15086.93600 2020-01-01 2020-01-02 2020-01-01 00:13:09 2020-01-02 03:41:30 2020-01-01 00:13:09.000 2020-01-02 03:41:30.000 789 99690 50239.5 5023950 789 99690 50239.5 5023950 -32381 32757 5019.66 501966 -125 127 -0.5 -50 +780 2 10770 99681 2.34234 299.34234 150.84234 15084.23423 2.34234 299.34235 150.84234 15084.23437 2.34234 299.34234 150.84234 15084.234 2020-01-01 2020-01-02 2020-01-01 00:13:00 2020-01-02 03:41:21 2020-01-01 00:13:00.000 2020-01-02 03:41:21.000 780 99681 50230.5 5023050 780 99681 50230.5 5023050 -32390 32748 5010.66 501066 -127 124 -1.82 -182 +781 2 10771 99682 2.34534 299.34534 150.84534 15084.53453 2.34534 299.34534 150.84534 15084.53467 2.34534 299.34534 150.84534 15084.534 2020-01-01 2020-01-02 2020-01-01 00:13:01 2020-01-02 03:41:22 2020-01-01 00:13:01.000 2020-01-02 03:41:22.000 781 99682 50231.5 5023150 781 99682 50231.5 5023150 -32389 32749 5011.66 501166 -126 125 -0.82 -82 +782 2 10772 99683 2.34834 299.34834 150.84834 15084.83483 2.34834 299.34836 150.84834 15084.83477 2.34834 299.34834 150.84834 15084.834 2020-01-01 2020-01-02 2020-01-01 00:13:02 2020-01-02 03:41:23 2020-01-01 00:13:02.000 2020-01-02 03:41:23.000 782 99683 50232.5 5023250 782 99683 50232.5 5023250 -32388 32750 5012.66 501266 -125 126 0.18 18 +783 2 10773 99684 2.35135 299.35135 150.85135 15085.13513 2.35135 299.35135 150.85134 15085.13495 2.35135 299.35135 150.85135 15085.135 2020-01-01 2020-01-02 2020-01-01 00:13:03 2020-01-02 03:41:24 2020-01-01 00:13:03.000 2020-01-02 03:41:24.000 783 99684 50233.5 5023350 783 99684 50233.5 5023350 -32387 32751 5013.66 501366 -124 127 1.18 118 +784 2 10774 99685 2.35435 299.35435 150.85435 15085.43543 2.35435 299.35434 150.85435 15085.43525 2.35435 299.35435 150.85434999999998 15085.435 2020-01-01 2020-01-02 2020-01-01 00:13:04 2020-01-02 03:41:25 2020-01-01 00:13:04.000 2020-01-02 03:41:25.000 784 99685 50234.5 5023450 784 99685 50234.5 5023450 -32386 32752 5014.66 501466 -128 127 -0.38 -38 +785 2 10775 99686 2.35735 299.35735 150.85735 15085.73573 2.35735 299.35736 150.85736 15085.736 2.35735 299.35735 150.85735 15085.735 2020-01-01 2020-01-02 2020-01-01 00:13:05 2020-01-02 03:41:26 2020-01-01 00:13:05.000 2020-01-02 03:41:26.000 785 99686 50235.5 5023550 785 99686 50235.5 5023550 -32385 32753 5015.66 501566 -128 127 -1.94 -194 +786 2 10776 99687 2.36036 299.36036 150.86036 15086.03603 2.36036 299.36035 150.86036 15086.03614 2.36036 299.36036 150.86036000000001 15086.036 2020-01-01 2020-01-02 2020-01-01 00:13:06 2020-01-02 03:41:27 2020-01-01 00:13:06.000 2020-01-02 03:41:27.000 786 99687 50236.5 5023650 786 99687 50236.5 5023650 -32384 32754 5016.66 501666 -128 124 -3.5 -350 +787 2 10777 99688 2.36336 299.36336 150.86336 15086.33633 2.36336 299.36337 150.86336 15086.33628 2.36336 299.36336 150.86336 15086.336 2020-01-01 2020-01-02 2020-01-01 00:13:07 2020-01-02 03:41:28 2020-01-01 00:13:07.000 2020-01-02 03:41:28.000 787 99688 50237.5 5023750 787 99688 50237.5 5023750 -32383 32755 5017.66 501766 -127 125 -2.5 -250 +788 2 10778 99689 2.36636 299.36636 150.86636 15086.63663 2.36636 299.36636 150.86636 15086.63641 2.36636 299.36636 150.86636000000001 15086.636 2020-01-01 2020-01-02 2020-01-01 00:13:08 2020-01-02 03:41:29 2020-01-01 00:13:08.000 2020-01-02 03:41:29.000 788 99689 50238.5 5023850 788 99689 50238.5 5023850 -32382 32756 5018.66 501866 -126 126 -1.5 -150 +789 2 10779 99690 2.36936 299.36936 150.86936 15086.93693 2.36936 299.36935 150.86936 15086.93672 2.36936 299.36936 150.86936 15086.936 2020-01-01 2020-01-02 2020-01-01 00:13:09 2020-01-02 03:41:30 2020-01-01 00:13:09.000 2020-01-02 03:41:30.000 789 99690 50239.5 5023950 789 99690 50239.5 5023950 -32381 32757 5019.66 501966 -125 127 -0.5 -50 79 2 10069 99979 0.23723 300.23723 150.23723 15173.96096 0.23723 300.23724 150.23724 15173.96129 0.23723 300.23723 150.23723 15173.96023 2020-01-01 2020-01-02 2020-01-01 00:01:19 2020-01-02 03:46:19 2020-01-01 00:01:19.000 2020-01-02 03:46:19.000 79 99979 50029 5052929 79 99979 50029 5052929 -32490 32445 4608.009900990099 465409 -128 127 -2.5247524752475248 -255 -790 2 10780 99691 2.37237 299.37237 150.87237 15087.23723 2.37237 299.37238 150.87237 15087.23747 2.37237 299.37237 150.87237 15087.23700 2020-01-01 2020-01-02 2020-01-01 00:13:10 2020-01-02 03:41:31 2020-01-01 00:13:10.000 2020-01-02 03:41:31.000 790 99691 50240.5 5024050 790 99691 50240.5 5024050 -32380 32758 5020.66 502066 -128 127 -2.06 -206 -791 2 10781 99692 2.37537 299.37537 150.87537 15087.53753 2.37537 299.37537 150.87537 15087.53761 2.37537 299.37537 150.87537 15087.53700 2020-01-01 2020-01-02 2020-01-01 00:13:11 2020-01-02 03:41:32 2020-01-01 00:13:11.000 2020-01-02 03:41:32.000 791 99692 50241.5 5024150 791 99692 50241.5 5024150 -32379 32759 5021.66 502166 -128 127 -3.62 -362 -792 2 10782 99693 2.37837 299.37837 150.87837 15087.83783 2.37837 299.3784 150.87837 15087.83775 2.37837 299.37837 150.87837 15087.83700 2020-01-01 2020-01-02 2020-01-01 00:13:12 2020-01-02 03:41:33 2020-01-01 00:13:12.000 2020-01-02 03:41:33.000 792 99693 50242.5 5024250 792 99693 50242.5 5024250 -32378 32760 5022.66 502266 -128 123 -5.18 -518 -793 2 10783 99694 2.38138 299.38138 150.88138 15088.13813 2.38138 299.38138 150.88137 15088.13789 2.38138 299.38138 150.88138 15088.13800 2020-01-01 2020-01-02 2020-01-01 00:13:13 2020-01-02 03:41:34 2020-01-01 00:13:13.000 2020-01-02 03:41:34.000 793 99694 50243.5 5024350 793 99694 50243.5 5024350 -32377 32761 5023.66 502366 -127 124 -4.18 -418 -794 2 10784 99695 2.38438 299.38438 150.88438 15088.43843 2.38438 299.3844 150.88438 15088.43864 2.38438 299.38438 150.88438 15088.43800 2020-01-01 2020-01-02 2020-01-01 00:13:14 2020-01-02 03:41:35 2020-01-01 00:13:14.000 2020-01-02 03:41:35.000 794 99695 50244.5 5024450 794 99695 50244.5 5024450 -32376 32762 5024.66 502466 -126 125 -3.18 -318 -795 2 10785 99696 2.38738 299.38738 150.88738 15088.73873 2.38738 299.3874 150.88738 15088.73894 2.38738 299.38738 150.88738 15088.73800 2020-01-01 2020-01-02 2020-01-01 00:13:15 2020-01-02 03:41:36 2020-01-01 00:13:15.000 2020-01-02 03:41:36.000 795 99696 50245.5 5024550 795 99696 50245.5 5024550 -32375 32763 5025.66 502566 -125 126 -2.18 -218 -796 2 10786 99697 2.39039 299.39039 150.89039 15089.03903 2.39039 299.39038 150.89039 15089.03908 2.39039 299.39039 150.89039 15089.03900 2020-01-01 2020-01-02 2020-01-01 00:13:16 2020-01-02 03:41:37 2020-01-01 00:13:16.000 2020-01-02 03:41:37.000 796 99697 50246.5 5024650 796 99697 50246.5 5024650 -32374 32764 5026.66 502666 -124 127 -1.18 -118 -797 2 10787 99698 2.39339 299.39339 150.89339 15089.33933 2.39339 299.3934 150.89339 15089.33921 2.39339 299.39339 150.89339 15089.33900 2020-01-01 2020-01-02 2020-01-01 00:13:17 2020-01-02 03:41:38 2020-01-01 00:13:17.000 2020-01-02 03:41:38.000 797 99698 50247.5 5024750 797 99698 50247.5 5024750 -32373 32765 5027.66 502766 -128 127 -2.74 -274 -798 2 10788 99699 2.39639 299.39639 150.89639 15089.63963 2.39639 299.3964 150.89639 15089.63936 2.39639 299.39639 150.89639 15089.63900 2020-01-01 2020-01-02 2020-01-01 00:13:18 2020-01-02 03:41:39 2020-01-01 00:13:18.000 2020-01-02 03:41:39.000 798 99699 50248.5 5024850 798 99699 50248.5 5024850 -32372 32766 5028.66 502866 -128 123 -4.3 -430 -799 2 10789 99700 2.39939 299.39939 150.89939 15089.93993 2.39939 299.3994 150.8994 15089.94011 2.39939 299.39939 150.89939 15089.93900 2020-01-01 2020-01-02 2020-01-01 00:13:19 2020-01-02 03:41:40 2020-01-01 00:13:19.000 2020-01-02 03:41:40.000 799 99700 50249.5 5024950 799 99700 50249.5 5024950 -32371 32767 5029.66 502966 -127 124 -3.3 -330 +790 2 10780 99691 2.37237 299.37237 150.87237 15087.23723 2.37237 299.37238 150.87237 15087.23747 2.37237 299.37237 150.87237 15087.237 2020-01-01 2020-01-02 2020-01-01 00:13:10 2020-01-02 03:41:31 2020-01-01 00:13:10.000 2020-01-02 03:41:31.000 790 99691 50240.5 5024050 790 99691 50240.5 5024050 -32380 32758 5020.66 502066 -128 127 -2.06 -206 +791 2 10781 99692 2.37537 299.37537 150.87537 15087.53753 2.37537 299.37537 150.87537 15087.53761 2.37537 299.37537 150.87537 15087.537 2020-01-01 2020-01-02 2020-01-01 00:13:11 2020-01-02 03:41:32 2020-01-01 00:13:11.000 2020-01-02 03:41:32.000 791 99692 50241.5 5024150 791 99692 50241.5 5024150 -32379 32759 5021.66 502166 -128 127 -3.62 -362 +792 2 10782 99693 2.37837 299.37837 150.87837 15087.83783 2.37837 299.3784 150.87837 15087.83775 2.37837 299.37837 150.87837 15087.837 2020-01-01 2020-01-02 2020-01-01 00:13:12 2020-01-02 03:41:33 2020-01-01 00:13:12.000 2020-01-02 03:41:33.000 792 99693 50242.5 5024250 792 99693 50242.5 5024250 -32378 32760 5022.66 502266 -128 123 -5.18 -518 +793 2 10783 99694 2.38138 299.38138 150.88138 15088.13813 2.38138 299.38138 150.88137 15088.13789 2.38138 299.38138 150.88138 15088.138 2020-01-01 2020-01-02 2020-01-01 00:13:13 2020-01-02 03:41:34 2020-01-01 00:13:13.000 2020-01-02 03:41:34.000 793 99694 50243.5 5024350 793 99694 50243.5 5024350 -32377 32761 5023.66 502366 -127 124 -4.18 -418 +794 2 10784 99695 2.38438 299.38438 150.88438 15088.43843 2.38438 299.3844 150.88438 15088.43864 2.38438 299.38438 150.88438 15088.438 2020-01-01 2020-01-02 2020-01-01 00:13:14 2020-01-02 03:41:35 2020-01-01 00:13:14.000 2020-01-02 03:41:35.000 794 99695 50244.5 5024450 794 99695 50244.5 5024450 -32376 32762 5024.66 502466 -126 125 -3.18 -318 +795 2 10785 99696 2.38738 299.38738 150.88738 15088.73873 2.38738 299.3874 150.88738 15088.73894 2.38738 299.38738 150.88738 15088.738 2020-01-01 2020-01-02 2020-01-01 00:13:15 2020-01-02 03:41:36 2020-01-01 00:13:15.000 2020-01-02 03:41:36.000 795 99696 50245.5 5024550 795 99696 50245.5 5024550 -32375 32763 5025.66 502566 -125 126 -2.18 -218 +796 2 10786 99697 2.39039 299.39039 150.89039 15089.03903 2.39039 299.39038 150.89039 15089.03908 2.39039 299.39039 150.89039 15089.039 2020-01-01 2020-01-02 2020-01-01 00:13:16 2020-01-02 03:41:37 2020-01-01 00:13:16.000 2020-01-02 03:41:37.000 796 99697 50246.5 5024650 796 99697 50246.5 5024650 -32374 32764 5026.66 502666 -124 127 -1.18 -118 +797 2 10787 99698 2.39339 299.39339 150.89339 15089.33933 2.39339 299.3934 150.89339 15089.33921 2.39339 299.39339 150.89339 15089.339 2020-01-01 2020-01-02 2020-01-01 00:13:17 2020-01-02 03:41:38 2020-01-01 00:13:17.000 2020-01-02 03:41:38.000 797 99698 50247.5 5024750 797 99698 50247.5 5024750 -32373 32765 5027.66 502766 -128 127 -2.74 -274 +798 2 10788 99699 2.39639 299.39639 150.89639 15089.63963 2.39639 299.3964 150.89639 15089.63936 2.39639 299.39639 150.89639 15089.639 2020-01-01 2020-01-02 2020-01-01 00:13:18 2020-01-02 03:41:39 2020-01-01 00:13:18.000 2020-01-02 03:41:39.000 798 99699 50248.5 5024850 798 99699 50248.5 5024850 -32372 32766 5028.66 502866 -128 123 -4.3 -430 +799 2 10789 99700 2.39939 299.39939 150.89939 15089.93993 2.39939 299.3994 150.8994 15089.94011 2.39939 299.39939 150.89939 15089.939 2020-01-01 2020-01-02 2020-01-01 00:13:19 2020-01-02 03:41:40 2020-01-01 00:13:19.000 2020-01-02 03:41:40.000 799 99700 50249.5 5024950 799 99700 50249.5 5024950 -32371 32767 5029.66 502966 -127 124 -3.3 -330 8 2 1007 9998 0.02402 300.02402 150.02402 15152.42642 0.02402 300.02402 150.02402 15152.42607 0.02402 300.02402 150.02402 15152.42602 2020-01-01 2020-01-02 2020-01-01 00:00:08 2020-01-02 03:45:08 2020-01-01 00:00:08.000 2020-01-02 03:45:08.000 8 99908 49958 5045758 8 99908 49958 5045758 -32561 32374 4537.009900990099 458238 -125 126 -0.019801980198019802 -2 80 2 10070 99980 0.24024 300.24024 150.24024 15174.26426 0.24024 300.24023 150.24023 15174.26397 0.24024 300.24024 150.24024 15174.26424 2020-01-01 2020-01-02 2020-01-01 00:01:20 2020-01-02 03:46:20 2020-01-01 00:01:20.000 2020-01-02 03:46:20.000 80 99980 50030 5053030 80 99980 50030 5053030 -32489 32446 4609.009900990099 465510 -128 123 -4.0594059405940595 -410 -800 2 10790 99701 2.4024 299.4024 150.9024 15090.24024 2.4024 299.4024 150.9024 15090.24041 2.40240 299.40240 150.9024 15090.24000 2020-01-01 2020-01-02 2020-01-01 00:13:20 2020-01-02 03:41:41 2020-01-01 00:13:20.000 2020-01-02 03:41:41.000 800 99701 50250.5 5025050 800 99701 50250.5 5025050 -32768 32167 4375.3 437530 -126 125 -2.3 -230 -801 2 10791 99702 2.4054 299.4054 150.9054 15090.54054 2.4054 299.4054 150.9054 15090.54058 2.40540 299.40540 150.90540000000001 15090.54000 2020-01-01 2020-01-02 2020-01-01 00:13:21 2020-01-02 03:41:42 2020-01-01 00:13:21.000 2020-01-02 03:41:42.000 801 99702 50251.5 5025150 801 99702 50251.5 5025150 -32767 32168 4376.3 437630 -125 126 -1.3 -130 -802 2 10792 99703 2.4084 299.4084 150.9084 15090.84084 2.4084 299.40842 150.9084 15090.84069 2.40840 299.40840 150.9084 15090.84000 2020-01-01 2020-01-02 2020-01-01 00:13:22 2020-01-02 03:41:43 2020-01-01 00:13:22.000 2020-01-02 03:41:43.000 802 99703 50252.5 5025250 802 99703 50252.5 5025250 -32766 32169 4377.3 437730 -124 127 -0.3 -30 -803 2 10793 99704 2.41141 299.41141 150.91141 15091.14114 2.41141 299.4114 150.9114 15091.14098 2.41141 299.41141 150.91141 15091.14100 2020-01-01 2020-01-02 2020-01-01 00:13:23 2020-01-02 03:41:44 2020-01-01 00:13:23.000 2020-01-02 03:41:44.000 803 99704 50253.5 5025350 803 99704 50253.5 5025350 -32765 32170 4378.3 437830 -128 127 -1.86 -186 -804 2 10794 99705 2.41441 299.41441 150.91441 15091.44144 2.41441 299.41443 150.91441 15091.44158 2.41441 299.41441 150.91441 15091.44100 2020-01-01 2020-01-02 2020-01-01 00:13:24 2020-01-02 03:41:45 2020-01-01 00:13:24.000 2020-01-02 03:41:45.000 804 99705 50254.5 5025450 804 99705 50254.5 5025450 -32764 32171 4379.3 437930 -128 123 -3.42 -342 -805 2 10795 99706 2.41741 299.41741 150.91741 15091.74174 2.41741 299.41742 150.91741 15091.74188 2.41741 299.41741 150.91741 15091.74100 2020-01-01 2020-01-02 2020-01-01 00:13:25 2020-01-02 03:41:46 2020-01-01 00:13:25.000 2020-01-02 03:41:46.000 805 99706 50255.5 5025550 805 99706 50255.5 5025550 -32763 32172 4380.3 438030 -127 124 -2.42 -242 -806 2 10796 99707 2.42042 299.42042 150.92042 15092.04204 2.42042 299.4204 150.92042 15092.04205 2.42042 299.42042 150.92042 15092.04200 2020-01-01 2020-01-02 2020-01-01 00:13:26 2020-01-02 03:41:47 2020-01-01 00:13:26.000 2020-01-02 03:41:47.000 806 99707 50256.5 5025650 806 99707 50256.5 5025650 -32762 32173 4381.3 438130 -126 125 -1.42 -142 -807 2 10797 99708 2.42342 299.42342 150.92342 15092.34234 2.42342 299.42343 150.92342 15092.34216 2.42342 299.42342 150.92342 15092.34200 2020-01-01 2020-01-02 2020-01-01 00:13:27 2020-01-02 03:41:48 2020-01-01 00:13:27.000 2020-01-02 03:41:48.000 807 99708 50257.5 5025750 807 99708 50257.5 5025750 -32761 32174 4382.3 438230 -125 126 -0.42 -42 -808 2 10798 99709 2.42642 299.42642 150.92642 15092.64264 2.42642 299.42642 150.92642 15092.64245 2.42642 299.42642 150.92642 15092.64200 2020-01-01 2020-01-02 2020-01-01 00:13:28 2020-01-02 03:41:49 2020-01-01 00:13:28.000 2020-01-02 03:41:49.000 808 99709 50258.5 5025850 808 99709 50258.5 5025850 -32760 32175 4383.3 438330 -124 127 0.58 58 -809 2 10799 99710 2.42942 299.42942 150.92942 15092.94294 2.42942 299.42944 150.92943 15092.94305 2.42942 299.42942 150.92942 15092.94200 2020-01-01 2020-01-02 2020-01-01 00:13:29 2020-01-02 03:41:50 2020-01-01 00:13:29.000 2020-01-02 03:41:50.000 809 99710 50259.5 5025950 809 99710 50259.5 5025950 -32759 32176 4384.3 438430 -128 127 -0.98 -98 +800 2 10790 99701 2.4024 299.4024 150.9024 15090.24024 2.4024 299.4024 150.9024 15090.24041 2.4024 299.4024 150.9024 15090.24 2020-01-01 2020-01-02 2020-01-01 00:13:20 2020-01-02 03:41:41 2020-01-01 00:13:20.000 2020-01-02 03:41:41.000 800 99701 50250.5 5025050 800 99701 50250.5 5025050 -32768 32167 4375.3 437530 -126 125 -2.3 -230 +801 2 10791 99702 2.4054 299.4054 150.9054 15090.54054 2.4054 299.4054 150.9054 15090.54058 2.4054 299.4054 150.90540000000001 15090.54 2020-01-01 2020-01-02 2020-01-01 00:13:21 2020-01-02 03:41:42 2020-01-01 00:13:21.000 2020-01-02 03:41:42.000 801 99702 50251.5 5025150 801 99702 50251.5 5025150 -32767 32168 4376.3 437630 -125 126 -1.3 -130 +802 2 10792 99703 2.4084 299.4084 150.9084 15090.84084 2.4084 299.40842 150.9084 15090.84069 2.4084 299.4084 150.9084 15090.84 2020-01-01 2020-01-02 2020-01-01 00:13:22 2020-01-02 03:41:43 2020-01-01 00:13:22.000 2020-01-02 03:41:43.000 802 99703 50252.5 5025250 802 99703 50252.5 5025250 -32766 32169 4377.3 437730 -124 127 -0.3 -30 +803 2 10793 99704 2.41141 299.41141 150.91141 15091.14114 2.41141 299.4114 150.9114 15091.14098 2.41141 299.41141 150.91141 15091.141 2020-01-01 2020-01-02 2020-01-01 00:13:23 2020-01-02 03:41:44 2020-01-01 00:13:23.000 2020-01-02 03:41:44.000 803 99704 50253.5 5025350 803 99704 50253.5 5025350 -32765 32170 4378.3 437830 -128 127 -1.86 -186 +804 2 10794 99705 2.41441 299.41441 150.91441 15091.44144 2.41441 299.41443 150.91441 15091.44158 2.41441 299.41441 150.91441 15091.441 2020-01-01 2020-01-02 2020-01-01 00:13:24 2020-01-02 03:41:45 2020-01-01 00:13:24.000 2020-01-02 03:41:45.000 804 99705 50254.5 5025450 804 99705 50254.5 5025450 -32764 32171 4379.3 437930 -128 123 -3.42 -342 +805 2 10795 99706 2.41741 299.41741 150.91741 15091.74174 2.41741 299.41742 150.91741 15091.74188 2.41741 299.41741 150.91741 15091.741 2020-01-01 2020-01-02 2020-01-01 00:13:25 2020-01-02 03:41:46 2020-01-01 00:13:25.000 2020-01-02 03:41:46.000 805 99706 50255.5 5025550 805 99706 50255.5 5025550 -32763 32172 4380.3 438030 -127 124 -2.42 -242 +806 2 10796 99707 2.42042 299.42042 150.92042 15092.04204 2.42042 299.4204 150.92042 15092.04205 2.42042 299.42042 150.92042 15092.042 2020-01-01 2020-01-02 2020-01-01 00:13:26 2020-01-02 03:41:47 2020-01-01 00:13:26.000 2020-01-02 03:41:47.000 806 99707 50256.5 5025650 806 99707 50256.5 5025650 -32762 32173 4381.3 438130 -126 125 -1.42 -142 +807 2 10797 99708 2.42342 299.42342 150.92342 15092.34234 2.42342 299.42343 150.92342 15092.34216 2.42342 299.42342 150.92342 15092.342 2020-01-01 2020-01-02 2020-01-01 00:13:27 2020-01-02 03:41:48 2020-01-01 00:13:27.000 2020-01-02 03:41:48.000 807 99708 50257.5 5025750 807 99708 50257.5 5025750 -32761 32174 4382.3 438230 -125 126 -0.42 -42 +808 2 10798 99709 2.42642 299.42642 150.92642 15092.64264 2.42642 299.42642 150.92642 15092.64245 2.42642 299.42642 150.92642 15092.642 2020-01-01 2020-01-02 2020-01-01 00:13:28 2020-01-02 03:41:49 2020-01-01 00:13:28.000 2020-01-02 03:41:49.000 808 99709 50258.5 5025850 808 99709 50258.5 5025850 -32760 32175 4383.3 438330 -124 127 0.58 58 +809 2 10799 99710 2.42942 299.42942 150.92942 15092.94294 2.42942 299.42944 150.92943 15092.94305 2.42942 299.42942 150.92942 15092.942 2020-01-01 2020-01-02 2020-01-01 00:13:29 2020-01-02 03:41:50 2020-01-01 00:13:29.000 2020-01-02 03:41:50.000 809 99710 50259.5 5025950 809 99710 50259.5 5025950 -32759 32176 4384.3 438430 -128 127 -0.98 -98 81 2 10071 99981 0.24324 300.24324 150.24324 15174.56756 0.24324 300.24326 150.24324 15174.56758 0.24324 300.24324 150.24324000000001 15174.56724 2020-01-01 2020-01-02 2020-01-01 00:01:21 2020-01-02 03:46:21 2020-01-01 00:01:21.000 2020-01-02 03:46:21.000 81 99981 50031 5053131 81 99981 50031 5053131 -32488 32447 4610.009900990099 465611 -127 124 -3.0594059405940595 -309 -810 2 10800 99711 2.43243 299.43243 150.93243 15093.24324 2.43243 299.43243 150.93243 15093.24338 2.43243 299.43243 150.93243 15093.24300 2020-01-01 2020-01-02 2020-01-01 00:13:30 2020-01-02 03:41:51 2020-01-01 00:13:30.000 2020-01-02 03:41:51.000 810 99711 50260.5 5026050 810 99711 50260.5 5026050 -32758 32177 4385.3 438530 -128 127 -2.54 -254 -811 2 10801 99712 2.43543 299.43543 150.93543 15093.54354 2.43543 299.43542 150.93543 15093.54353 2.43543 299.43543 150.93543 15093.54300 2020-01-01 2020-01-02 2020-01-01 00:13:31 2020-01-02 03:41:52 2020-01-01 00:13:31.000 2020-01-02 03:41:52.000 811 99712 50261.5 5026150 811 99712 50261.5 5026150 -32757 32178 4386.3 438630 -128 124 -4.1 -410 -812 2 10802 99713 2.43843 299.43843 150.93843 15093.84384 2.43843 299.43845 150.93844 15093.84428 2.43843 299.43843 150.93843 15093.84300 2020-01-01 2020-01-02 2020-01-01 00:13:32 2020-01-02 03:41:53 2020-01-01 00:13:32.000 2020-01-02 03:41:53.000 812 99713 50262.5 5026250 812 99713 50262.5 5026250 -32756 32179 4387.3 438730 -127 125 -3.1 -310 -813 2 10803 99714 2.44144 299.44144 150.94144 15094.14414 2.44144 299.44144 150.94143 15094.14392 2.44144 299.44144 150.94144 15094.14400 2020-01-01 2020-01-02 2020-01-01 00:13:33 2020-01-02 03:41:54 2020-01-01 00:13:33.000 2020-01-02 03:41:54.000 813 99714 50263.5 5026350 813 99714 50263.5 5026350 -32755 32180 4388.3 438830 -126 126 -2.1 -210 -814 2 10804 99715 2.44444 299.44444 150.94444 15094.44444 2.44444 299.44446 150.94444 15094.44452 2.44444 299.44444 150.94444 15094.44400 2020-01-01 2020-01-02 2020-01-01 00:13:34 2020-01-02 03:41:55 2020-01-01 00:13:34.000 2020-01-02 03:41:55.000 814 99715 50264.5 5026450 814 99715 50264.5 5026450 -32754 32181 4389.3 438930 -125 127 -1.1 -110 -815 2 10805 99716 2.44744 299.44744 150.94744 15094.74474 2.44744 299.44745 150.94744 15094.74485 2.44744 299.44744 150.94744 15094.74400 2020-01-01 2020-01-02 2020-01-01 00:13:35 2020-01-02 03:41:56 2020-01-01 00:13:35.000 2020-01-02 03:41:56.000 815 99716 50265.5 5026550 815 99716 50265.5 5026550 -32753 32182 4390.3 439030 -128 127 -2.66 -266 -816 2 10806 99717 2.45045 299.45045 150.95045 15095.04504 2.45045 299.45044 150.95045 15095.045 2.45045 299.45045 150.95045 15095.04500 2020-01-01 2020-01-02 2020-01-01 00:13:36 2020-01-02 03:41:57 2020-01-01 00:13:36.000 2020-01-02 03:41:57.000 816 99717 50266.5 5026650 816 99717 50266.5 5026650 -32752 32183 4391.3 439130 -128 127 -4.22 -422 -817 2 10807 99718 2.45345 299.45345 150.95345 15095.34534 2.45345 299.45346 150.95345 15095.34574 2.45345 299.45345 150.95345 15095.34500 2020-01-01 2020-01-02 2020-01-01 00:13:37 2020-01-02 03:41:58 2020-01-01 00:13:37.000 2020-01-02 03:41:58.000 817 99718 50267.5 5026750 817 99718 50267.5 5026750 -32751 32184 4392.3 439230 -128 123 -5.78 -578 -818 2 10808 99719 2.45645 299.45645 150.95645 15095.64564 2.45645 299.45645 150.95645 15095.64539 2.45645 299.45645 150.95645000000002 15095.64500 2020-01-01 2020-01-02 2020-01-01 00:13:38 2020-01-02 03:41:59 2020-01-01 00:13:38.000 2020-01-02 03:41:59.000 818 99719 50268.5 5026850 818 99719 50268.5 5026850 -32750 32185 4393.3 439330 -127 124 -4.78 -478 -819 2 10809 99720 2.45945 299.45945 150.95945 15095.94594 2.45945 299.45947 150.95946 15095.94602 2.45945 299.45945 150.95945 15095.94500 2020-01-01 2020-01-02 2020-01-01 00:13:39 2020-01-02 03:42:00 2020-01-01 00:13:39.000 2020-01-02 03:42:00.000 819 99720 50269.5 5026950 819 99720 50269.5 5026950 -32749 32186 4394.3 439430 -126 125 -3.78 -378 +810 2 10800 99711 2.43243 299.43243 150.93243 15093.24324 2.43243 299.43243 150.93243 15093.24338 2.43243 299.43243 150.93243 15093.243 2020-01-01 2020-01-02 2020-01-01 00:13:30 2020-01-02 03:41:51 2020-01-01 00:13:30.000 2020-01-02 03:41:51.000 810 99711 50260.5 5026050 810 99711 50260.5 5026050 -32758 32177 4385.3 438530 -128 127 -2.54 -254 +811 2 10801 99712 2.43543 299.43543 150.93543 15093.54354 2.43543 299.43542 150.93543 15093.54353 2.43543 299.43543 150.93543 15093.543 2020-01-01 2020-01-02 2020-01-01 00:13:31 2020-01-02 03:41:52 2020-01-01 00:13:31.000 2020-01-02 03:41:52.000 811 99712 50261.5 5026150 811 99712 50261.5 5026150 -32757 32178 4386.3 438630 -128 124 -4.1 -410 +812 2 10802 99713 2.43843 299.43843 150.93843 15093.84384 2.43843 299.43845 150.93844 15093.84428 2.43843 299.43843 150.93843 15093.843 2020-01-01 2020-01-02 2020-01-01 00:13:32 2020-01-02 03:41:53 2020-01-01 00:13:32.000 2020-01-02 03:41:53.000 812 99713 50262.5 5026250 812 99713 50262.5 5026250 -32756 32179 4387.3 438730 -127 125 -3.1 -310 +813 2 10803 99714 2.44144 299.44144 150.94144 15094.14414 2.44144 299.44144 150.94143 15094.14392 2.44144 299.44144 150.94144 15094.144 2020-01-01 2020-01-02 2020-01-01 00:13:33 2020-01-02 03:41:54 2020-01-01 00:13:33.000 2020-01-02 03:41:54.000 813 99714 50263.5 5026350 813 99714 50263.5 5026350 -32755 32180 4388.3 438830 -126 126 -2.1 -210 +814 2 10804 99715 2.44444 299.44444 150.94444 15094.44444 2.44444 299.44446 150.94444 15094.44452 2.44444 299.44444 150.94444 15094.444 2020-01-01 2020-01-02 2020-01-01 00:13:34 2020-01-02 03:41:55 2020-01-01 00:13:34.000 2020-01-02 03:41:55.000 814 99715 50264.5 5026450 814 99715 50264.5 5026450 -32754 32181 4389.3 438930 -125 127 -1.1 -110 +815 2 10805 99716 2.44744 299.44744 150.94744 15094.74474 2.44744 299.44745 150.94744 15094.74485 2.44744 299.44744 150.94744 15094.744 2020-01-01 2020-01-02 2020-01-01 00:13:35 2020-01-02 03:41:56 2020-01-01 00:13:35.000 2020-01-02 03:41:56.000 815 99716 50265.5 5026550 815 99716 50265.5 5026550 -32753 32182 4390.3 439030 -128 127 -2.66 -266 +816 2 10806 99717 2.45045 299.45045 150.95045 15095.04504 2.45045 299.45044 150.95045 15095.045 2.45045 299.45045 150.95045 15095.045 2020-01-01 2020-01-02 2020-01-01 00:13:36 2020-01-02 03:41:57 2020-01-01 00:13:36.000 2020-01-02 03:41:57.000 816 99717 50266.5 5026650 816 99717 50266.5 5026650 -32752 32183 4391.3 439130 -128 127 -4.22 -422 +817 2 10807 99718 2.45345 299.45345 150.95345 15095.34534 2.45345 299.45346 150.95345 15095.34574 2.45345 299.45345 150.95345 15095.345 2020-01-01 2020-01-02 2020-01-01 00:13:37 2020-01-02 03:41:58 2020-01-01 00:13:37.000 2020-01-02 03:41:58.000 817 99718 50267.5 5026750 817 99718 50267.5 5026750 -32751 32184 4392.3 439230 -128 123 -5.78 -578 +818 2 10808 99719 2.45645 299.45645 150.95645 15095.64564 2.45645 299.45645 150.95645 15095.64539 2.45645 299.45645 150.95645000000002 15095.645 2020-01-01 2020-01-02 2020-01-01 00:13:38 2020-01-02 03:41:59 2020-01-01 00:13:38.000 2020-01-02 03:41:59.000 818 99719 50268.5 5026850 818 99719 50268.5 5026850 -32750 32185 4393.3 439330 -127 124 -4.78 -478 +819 2 10809 99720 2.45945 299.45945 150.95945 15095.94594 2.45945 299.45947 150.95946 15095.94602 2.45945 299.45945 150.95945 15095.945 2020-01-01 2020-01-02 2020-01-01 00:13:39 2020-01-02 03:42:00 2020-01-01 00:13:39.000 2020-01-02 03:42:00.000 819 99720 50269.5 5026950 819 99720 50269.5 5026950 -32749 32186 4394.3 439430 -126 125 -3.78 -378 82 2 10072 99982 0.24624 300.24624 150.24624 15174.87087 0.24624 300.24625 150.24624 15174.87088 0.24624 300.24624 150.24624 15174.87024 2020-01-01 2020-01-02 2020-01-01 00:01:22 2020-01-02 03:46:22 2020-01-01 00:01:22.000 2020-01-02 03:46:22.000 82 99982 50032 5053232 82 99982 50032 5053232 -32487 32448 4611.009900990099 465712 -126 125 -2.0594059405940595 -208 -820 2 10810 99721 2.46246 299.46246 150.96246 15096.24624 2.46246 299.46246 150.96246 15096.24633 2.46246 299.46246 150.96246 15096.24600 2020-01-01 2020-01-02 2020-01-01 00:13:40 2020-01-02 03:42:01 2020-01-01 00:13:40.000 2020-01-02 03:42:01.000 820 99721 50270.5 5027050 820 99721 50270.5 5027050 -32748 32187 4395.3 439530 -125 126 -2.78 -278 -821 2 10811 99722 2.46546 299.46546 150.96546 15096.54654 2.46546 299.46545 150.96546 15096.54646 2.46546 299.46546 150.96546 15096.54600 2020-01-01 2020-01-02 2020-01-01 00:13:41 2020-01-02 03:42:02 2020-01-01 00:13:41.000 2020-01-02 03:42:02.000 821 99722 50271.5 5027150 821 99722 50271.5 5027150 -32747 32188 4396.3 439630 -124 127 -1.78 -178 -822 2 10812 99723 2.46846 299.46846 150.96846 15096.84684 2.46846 299.46848 150.96847 15096.84721 2.46846 299.46846 150.96846 15096.84600 2020-01-01 2020-01-02 2020-01-01 00:13:42 2020-01-02 03:42:03 2020-01-01 00:13:42.000 2020-01-02 03:42:03.000 822 99723 50272.5 5027250 822 99723 50272.5 5027250 -32746 32189 4397.3 439730 -128 127 -3.34 -334 -823 2 10813 99724 2.47147 299.47147 150.97147 15097.14714 2.47147 299.47147 150.97146 15097.14686 2.47147 299.47147 150.97147 15097.14700 2020-01-01 2020-01-02 2020-01-01 00:13:43 2020-01-02 03:42:04 2020-01-01 00:13:43.000 2020-01-02 03:42:04.000 823 99724 50273.5 5027350 823 99724 50273.5 5027350 -32745 32190 4398.3 439830 -128 123 -4.9 -490 -824 2 10814 99725 2.47447 299.47447 150.97447 15097.44744 2.47447 299.4745 150.97447 15097.44749 2.47447 299.47447 150.97447 15097.44700 2020-01-01 2020-01-02 2020-01-01 00:13:44 2020-01-02 03:42:05 2020-01-01 00:13:44.000 2020-01-02 03:42:05.000 824 99725 50274.5 5027450 824 99725 50274.5 5027450 -32744 32191 4399.3 439930 -127 124 -3.9 -390 -825 2 10815 99726 2.47747 299.47747 150.97747 15097.74774 2.47747 299.47748 150.97747 15097.74779 2.47747 299.47747 150.97746999999998 15097.74700 2020-01-01 2020-01-02 2020-01-01 00:13:45 2020-01-02 03:42:06 2020-01-01 00:13:45.000 2020-01-02 03:42:06.000 825 99726 50275.5 5027550 825 99726 50275.5 5027550 -32743 32192 4400.3 440030 -126 125 -2.9 -290 -826 2 10816 99727 2.48048 299.48048 150.98048 15098.04804 2.48048 299.48047 150.98048 15098.04809 2.48048 299.48048 150.98048 15098.04800 2020-01-01 2020-01-02 2020-01-01 00:13:46 2020-01-02 03:42:07 2020-01-01 00:13:46.000 2020-01-02 03:42:07.000 826 99727 50276.5 5027650 826 99727 50276.5 5027650 -32742 32193 4401.3 440130 -125 126 -1.9 -190 -827 2 10817 99728 2.48348 299.48348 150.98348 15098.34834 2.48348 299.4835 150.98348 15098.34869 2.48348 299.48348 150.98348 15098.34800 2020-01-01 2020-01-02 2020-01-01 00:13:47 2020-01-02 03:42:08 2020-01-01 00:13:47.000 2020-01-02 03:42:08.000 827 99728 50277.5 5027750 827 99728 50277.5 5027750 -32741 32194 4402.3 440230 -124 127 -0.9 -90 -828 2 10818 99729 2.48648 299.48648 150.98648 15098.64864 2.48648 299.48648 150.98648 15098.64837 2.48648 299.48648 150.98648 15098.64800 2020-01-01 2020-01-02 2020-01-01 00:13:48 2020-01-02 03:42:09 2020-01-01 00:13:48.000 2020-01-02 03:42:09.000 828 99729 50278.5 5027850 828 99729 50278.5 5027850 -32740 32195 4403.3 440330 -128 127 -2.46 -246 -829 2 10819 99730 2.48948 299.48948 150.98948 15098.94894 2.48948 299.4895 150.98948 15098.94896 2.48948 299.48948 150.98948000000001 15098.94800 2020-01-01 2020-01-02 2020-01-01 00:13:49 2020-01-02 03:42:10 2020-01-01 00:13:49.000 2020-01-02 03:42:10.000 829 99730 50279.5 5027950 829 99730 50279.5 5027950 -32739 32196 4404.3 440430 -128 123 -4.02 -402 +820 2 10810 99721 2.46246 299.46246 150.96246 15096.24624 2.46246 299.46246 150.96246 15096.24633 2.46246 299.46246 150.96246 15096.246 2020-01-01 2020-01-02 2020-01-01 00:13:40 2020-01-02 03:42:01 2020-01-01 00:13:40.000 2020-01-02 03:42:01.000 820 99721 50270.5 5027050 820 99721 50270.5 5027050 -32748 32187 4395.3 439530 -125 126 -2.78 -278 +821 2 10811 99722 2.46546 299.46546 150.96546 15096.54654 2.46546 299.46545 150.96546 15096.54646 2.46546 299.46546 150.96546 15096.546 2020-01-01 2020-01-02 2020-01-01 00:13:41 2020-01-02 03:42:02 2020-01-01 00:13:41.000 2020-01-02 03:42:02.000 821 99722 50271.5 5027150 821 99722 50271.5 5027150 -32747 32188 4396.3 439630 -124 127 -1.78 -178 +822 2 10812 99723 2.46846 299.46846 150.96846 15096.84684 2.46846 299.46848 150.96847 15096.84721 2.46846 299.46846 150.96846 15096.846 2020-01-01 2020-01-02 2020-01-01 00:13:42 2020-01-02 03:42:03 2020-01-01 00:13:42.000 2020-01-02 03:42:03.000 822 99723 50272.5 5027250 822 99723 50272.5 5027250 -32746 32189 4397.3 439730 -128 127 -3.34 -334 +823 2 10813 99724 2.47147 299.47147 150.97147 15097.14714 2.47147 299.47147 150.97146 15097.14686 2.47147 299.47147 150.97147 15097.147 2020-01-01 2020-01-02 2020-01-01 00:13:43 2020-01-02 03:42:04 2020-01-01 00:13:43.000 2020-01-02 03:42:04.000 823 99724 50273.5 5027350 823 99724 50273.5 5027350 -32745 32190 4398.3 439830 -128 123 -4.9 -490 +824 2 10814 99725 2.47447 299.47447 150.97447 15097.44744 2.47447 299.4745 150.97447 15097.44749 2.47447 299.47447 150.97447 15097.447 2020-01-01 2020-01-02 2020-01-01 00:13:44 2020-01-02 03:42:05 2020-01-01 00:13:44.000 2020-01-02 03:42:05.000 824 99725 50274.5 5027450 824 99725 50274.5 5027450 -32744 32191 4399.3 439930 -127 124 -3.9 -390 +825 2 10815 99726 2.47747 299.47747 150.97747 15097.74774 2.47747 299.47748 150.97747 15097.74779 2.47747 299.47747 150.97746999999998 15097.747 2020-01-01 2020-01-02 2020-01-01 00:13:45 2020-01-02 03:42:06 2020-01-01 00:13:45.000 2020-01-02 03:42:06.000 825 99726 50275.5 5027550 825 99726 50275.5 5027550 -32743 32192 4400.3 440030 -126 125 -2.9 -290 +826 2 10816 99727 2.48048 299.48048 150.98048 15098.04804 2.48048 299.48047 150.98048 15098.04809 2.48048 299.48048 150.98048 15098.048 2020-01-01 2020-01-02 2020-01-01 00:13:46 2020-01-02 03:42:07 2020-01-01 00:13:46.000 2020-01-02 03:42:07.000 826 99727 50276.5 5027650 826 99727 50276.5 5027650 -32742 32193 4401.3 440130 -125 126 -1.9 -190 +827 2 10817 99728 2.48348 299.48348 150.98348 15098.34834 2.48348 299.4835 150.98348 15098.34869 2.48348 299.48348 150.98348 15098.348 2020-01-01 2020-01-02 2020-01-01 00:13:47 2020-01-02 03:42:08 2020-01-01 00:13:47.000 2020-01-02 03:42:08.000 827 99728 50277.5 5027750 827 99728 50277.5 5027750 -32741 32194 4402.3 440230 -124 127 -0.9 -90 +828 2 10818 99729 2.48648 299.48648 150.98648 15098.64864 2.48648 299.48648 150.98648 15098.64837 2.48648 299.48648 150.98648 15098.648 2020-01-01 2020-01-02 2020-01-01 00:13:48 2020-01-02 03:42:09 2020-01-01 00:13:48.000 2020-01-02 03:42:09.000 828 99729 50278.5 5027850 828 99729 50278.5 5027850 -32740 32195 4403.3 440330 -128 127 -2.46 -246 +829 2 10819 99730 2.48948 299.48948 150.98948 15098.94894 2.48948 299.4895 150.98948 15098.94896 2.48948 299.48948 150.98948000000001 15098.948 2020-01-01 2020-01-02 2020-01-01 00:13:49 2020-01-02 03:42:10 2020-01-01 00:13:49.000 2020-01-02 03:42:10.000 829 99730 50279.5 5027950 829 99730 50279.5 5027950 -32739 32196 4404.3 440430 -128 123 -4.02 -402 83 2 10073 99983 0.24924 300.24924 150.24924 15175.17417 0.24924 300.24924 150.24924 15175.17417 0.24924 300.24924 150.24924000000001 15175.17324 2020-01-01 2020-01-02 2020-01-01 00:01:23 2020-01-02 03:46:23 2020-01-01 00:01:23.000 2020-01-02 03:46:23.000 83 99983 50033 5053333 83 99983 50033 5053333 -32486 32449 4612.009900990099 465813 -125 126 -1.0594059405940595 -107 -830 2 10820 99731 2.49249 299.49249 150.99249 15099.24924 2.49249 299.4925 150.99249 15099.24926 2.49249 299.49249 150.99249 15099.24900 2020-01-01 2020-01-02 2020-01-01 00:13:50 2020-01-02 03:42:11 2020-01-01 00:13:50.000 2020-01-02 03:42:11.000 830 99731 50280.5 5028050 830 99731 50280.5 5028050 -32738 32197 4405.3 440530 -127 124 -3.02 -302 -831 2 10821 99732 2.49549 299.49549 150.99549 15099.54954 2.49549 299.49548 150.99549 15099.54956 2.49549 299.49549 150.99549000000002 15099.54900 2020-01-01 2020-01-02 2020-01-01 00:13:51 2020-01-02 03:42:12 2020-01-01 00:13:51.000 2020-01-02 03:42:12.000 831 99732 50281.5 5028150 831 99732 50281.5 5028150 -32737 32198 4406.3 440630 -126 125 -2.02 -202 -832 2 10822 99733 2.49849 299.49849 150.99849 15099.84984 2.49849 299.4985 150.9985 15099.85016 2.49849 299.49849 150.99849 15099.84900 2020-01-01 2020-01-02 2020-01-01 00:13:52 2020-01-02 03:42:13 2020-01-01 00:13:52.000 2020-01-02 03:42:13.000 832 99733 50282.5 5028250 832 99733 50282.5 5028250 -32736 32199 4407.3 440730 -125 126 -1.02 -102 -833 2 10823 99734 2.5015 299.5015 151.0015 15100.15015 2.5015 299.5015 151.00149 15100.14983 2.50150 299.50150 151.0015 15100.15000 2020-01-01 2020-01-02 2020-01-01 00:13:53 2020-01-02 03:42:14 2020-01-01 00:13:53.000 2020-01-02 03:42:14.000 833 99734 50283.5 5028350 833 99734 50283.5 5028350 -32735 32200 4408.3 440830 -124 127 -0.02 -2 -834 2 10824 99735 2.5045 299.5045 151.0045 15100.45045 2.5045 299.50452 151.0045 15100.45043 2.50450 299.50450 151.0045 15100.45000 2020-01-01 2020-01-02 2020-01-01 00:13:54 2020-01-02 03:42:15 2020-01-01 00:13:54.000 2020-01-02 03:42:15.000 834 99735 50284.5 5028450 834 99735 50284.5 5028450 -32734 32201 4409.3 440930 -128 127 -1.58 -158 -835 2 10825 99736 2.5075 299.5075 151.0075 15100.75075 2.5075 299.5075 151.0075 15100.75073 2.50750 299.50750 151.0075 15100.75000 2020-01-01 2020-01-02 2020-01-01 00:13:55 2020-01-02 03:42:16 2020-01-01 00:13:55.000 2020-01-02 03:42:16.000 835 99736 50285.5 5028550 835 99736 50285.5 5028550 -32733 32202 4410.3 441030 -128 123 -3.14 -314 -836 2 10826 99737 2.51051 299.51051 151.01051 15101.05105 2.51051 299.5105 151.01051 15101.05103 2.51051 299.51051 151.01050999999998 15101.05100 2020-01-01 2020-01-02 2020-01-01 00:13:56 2020-01-02 03:42:17 2020-01-01 00:13:56.000 2020-01-02 03:42:17.000 836 99737 50286.5 5028650 836 99737 50286.5 5028650 -32732 32203 4411.3 441130 -127 124 -2.14 -214 -837 2 10827 99738 2.51351 299.51351 151.01351 15101.35135 2.51351 299.51352 151.01351 15101.35162 2.51351 299.51351 151.01351 15101.35100 2020-01-01 2020-01-02 2020-01-01 00:13:57 2020-01-02 03:42:18 2020-01-01 00:13:57.000 2020-01-02 03:42:18.000 837 99738 50287.5 5028750 837 99738 50287.5 5028750 -32731 32204 4412.3 441230 -126 125 -1.14 -114 -838 2 10828 99739 2.51651 299.51651 151.01651 15101.65165 2.51651 299.5165 151.01651 15101.6513 2.51651 299.51651 151.01651 15101.65100 2020-01-01 2020-01-02 2020-01-01 00:13:58 2020-01-02 03:42:19 2020-01-01 00:13:58.000 2020-01-02 03:42:19.000 838 99739 50288.5 5028850 838 99739 50288.5 5028850 -32730 32205 4413.3 441330 -125 126 -0.14 -14 -839 2 10829 99740 2.51951 299.51951 151.01951 15101.95195 2.51951 299.51953 151.01951 15101.9519 2.51951 299.51951 151.01951 15101.95100 2020-01-01 2020-01-02 2020-01-01 00:13:59 2020-01-02 03:42:20 2020-01-01 00:13:59.000 2020-01-02 03:42:20.000 839 99740 50289.5 5028950 839 99740 50289.5 5028950 -32729 32206 4414.3 441430 -124 127 0.86 86 +830 2 10820 99731 2.49249 299.49249 150.99249 15099.24924 2.49249 299.4925 150.99249 15099.24926 2.49249 299.49249 150.99249 15099.249 2020-01-01 2020-01-02 2020-01-01 00:13:50 2020-01-02 03:42:11 2020-01-01 00:13:50.000 2020-01-02 03:42:11.000 830 99731 50280.5 5028050 830 99731 50280.5 5028050 -32738 32197 4405.3 440530 -127 124 -3.02 -302 +831 2 10821 99732 2.49549 299.49549 150.99549 15099.54954 2.49549 299.49548 150.99549 15099.54956 2.49549 299.49549 150.99549000000002 15099.549 2020-01-01 2020-01-02 2020-01-01 00:13:51 2020-01-02 03:42:12 2020-01-01 00:13:51.000 2020-01-02 03:42:12.000 831 99732 50281.5 5028150 831 99732 50281.5 5028150 -32737 32198 4406.3 440630 -126 125 -2.02 -202 +832 2 10822 99733 2.49849 299.49849 150.99849 15099.84984 2.49849 299.4985 150.9985 15099.85016 2.49849 299.49849 150.99849 15099.849 2020-01-01 2020-01-02 2020-01-01 00:13:52 2020-01-02 03:42:13 2020-01-01 00:13:52.000 2020-01-02 03:42:13.000 832 99733 50282.5 5028250 832 99733 50282.5 5028250 -32736 32199 4407.3 440730 -125 126 -1.02 -102 +833 2 10823 99734 2.5015 299.5015 151.0015 15100.15015 2.5015 299.5015 151.00149 15100.14983 2.5015 299.5015 151.0015 15100.15 2020-01-01 2020-01-02 2020-01-01 00:13:53 2020-01-02 03:42:14 2020-01-01 00:13:53.000 2020-01-02 03:42:14.000 833 99734 50283.5 5028350 833 99734 50283.5 5028350 -32735 32200 4408.3 440830 -124 127 -0.02 -2 +834 2 10824 99735 2.5045 299.5045 151.0045 15100.45045 2.5045 299.50452 151.0045 15100.45043 2.5045 299.5045 151.0045 15100.45 2020-01-01 2020-01-02 2020-01-01 00:13:54 2020-01-02 03:42:15 2020-01-01 00:13:54.000 2020-01-02 03:42:15.000 834 99735 50284.5 5028450 834 99735 50284.5 5028450 -32734 32201 4409.3 440930 -128 127 -1.58 -158 +835 2 10825 99736 2.5075 299.5075 151.0075 15100.75075 2.5075 299.5075 151.0075 15100.75073 2.5075 299.5075 151.0075 15100.75 2020-01-01 2020-01-02 2020-01-01 00:13:55 2020-01-02 03:42:16 2020-01-01 00:13:55.000 2020-01-02 03:42:16.000 835 99736 50285.5 5028550 835 99736 50285.5 5028550 -32733 32202 4410.3 441030 -128 123 -3.14 -314 +836 2 10826 99737 2.51051 299.51051 151.01051 15101.05105 2.51051 299.5105 151.01051 15101.05103 2.51051 299.51051 151.01050999999998 15101.051 2020-01-01 2020-01-02 2020-01-01 00:13:56 2020-01-02 03:42:17 2020-01-01 00:13:56.000 2020-01-02 03:42:17.000 836 99737 50286.5 5028650 836 99737 50286.5 5028650 -32732 32203 4411.3 441130 -127 124 -2.14 -214 +837 2 10827 99738 2.51351 299.51351 151.01351 15101.35135 2.51351 299.51352 151.01351 15101.35162 2.51351 299.51351 151.01351 15101.351 2020-01-01 2020-01-02 2020-01-01 00:13:57 2020-01-02 03:42:18 2020-01-01 00:13:57.000 2020-01-02 03:42:18.000 837 99738 50287.5 5028750 837 99738 50287.5 5028750 -32731 32204 4412.3 441230 -126 125 -1.14 -114 +838 2 10828 99739 2.51651 299.51651 151.01651 15101.65165 2.51651 299.5165 151.01651 15101.6513 2.51651 299.51651 151.01651 15101.651 2020-01-01 2020-01-02 2020-01-01 00:13:58 2020-01-02 03:42:19 2020-01-01 00:13:58.000 2020-01-02 03:42:19.000 838 99739 50288.5 5028850 838 99739 50288.5 5028850 -32730 32205 4413.3 441330 -125 126 -0.14 -14 +839 2 10829 99740 2.51951 299.51951 151.01951 15101.95195 2.51951 299.51953 151.01951 15101.9519 2.51951 299.51951 151.01951 15101.951 2020-01-01 2020-01-02 2020-01-01 00:13:59 2020-01-02 03:42:20 2020-01-01 00:13:59.000 2020-01-02 03:42:20.000 839 99740 50289.5 5028950 839 99740 50289.5 5028950 -32729 32206 4414.3 441430 -124 127 0.86 86 84 2 10074 99984 0.25225 300.25225 150.25225 15175.47747 0.25225 300.25226 150.25225 15175.47778 0.25225 300.25225 150.25225 15175.47725 2020-01-01 2020-01-02 2020-01-01 00:01:24 2020-01-02 03:46:24 2020-01-01 00:01:24.000 2020-01-02 03:46:24.000 84 99984 50034 5053434 84 99984 50034 5053434 -32485 32450 4613.009900990099 465914 -124 127 -0.0594059405940594 -6 -840 2 10830 99741 2.52252 299.52252 151.02252 15102.25225 2.52252 299.52252 151.02252 15102.2522 2.52252 299.52252 151.02252000000001 15102.25200 2020-01-01 2020-01-02 2020-01-01 00:14:00 2020-01-02 03:42:21 2020-01-01 00:14:00.000 2020-01-02 03:42:21.000 840 99741 50290.5 5029050 840 99741 50290.5 5029050 -32728 32207 4415.3 441530 -128 127 -0.7 -70 -841 2 10831 99742 2.52552 299.52552 151.02552 15102.55255 2.52552 299.5255 151.02552 15102.5525 2.52552 299.52552 151.02552 15102.55200 2020-01-01 2020-01-02 2020-01-01 00:14:01 2020-01-02 03:42:22 2020-01-01 00:14:01.000 2020-01-02 03:42:22.000 841 99742 50291.5 5029150 841 99742 50291.5 5029150 -32727 32208 4416.3 441630 -128 127 -2.26 -226 -842 2 10832 99743 2.52852 299.52852 151.02852 15102.85285 2.52852 299.52853 151.02853 15102.85313 2.52852 299.52852 151.02852000000001 15102.85200 2020-01-01 2020-01-02 2020-01-01 00:14:02 2020-01-02 03:42:23 2020-01-01 00:14:02.000 2020-01-02 03:42:23.000 842 99743 50292.5 5029250 842 99743 50292.5 5029250 -32726 32209 4417.3 441730 -128 123 -3.82 -382 -843 2 10833 99744 2.53153 299.53153 151.03153 15103.15315 2.53153 299.53152 151.03152 15103.15278 2.53153 299.53153 151.03153 15103.15300 2020-01-01 2020-01-02 2020-01-01 00:14:03 2020-01-02 03:42:24 2020-01-01 00:14:03.000 2020-01-02 03:42:24.000 843 99744 50293.5 5029350 843 99744 50293.5 5029350 -32725 32210 4418.3 441830 -127 124 -2.82 -282 -844 2 10834 99745 2.53453 299.53453 151.03453 15103.45345 2.53453 299.53455 151.03453 15103.45353 2.53453 299.53453 151.03453 15103.45300 2020-01-01 2020-01-02 2020-01-01 00:14:04 2020-01-02 03:42:25 2020-01-01 00:14:04.000 2020-01-02 03:42:25.000 844 99745 50294.5 5029450 844 99745 50294.5 5029450 -32724 32211 4419.3 441930 -126 125 -1.82 -182 -845 2 10835 99746 2.53753 299.53753 151.03753 15103.75375 2.53753 299.53754 151.03753 15103.75366 2.53753 299.53753 151.03753 15103.75300 2020-01-01 2020-01-02 2020-01-01 00:14:05 2020-01-02 03:42:26 2020-01-01 00:14:05.000 2020-01-02 03:42:26.000 845 99746 50295.5 5029550 845 99746 50295.5 5029550 -32723 32212 4420.3 442030 -125 126 -0.82 -82 -846 2 10836 99747 2.54054 299.54054 151.04054 15104.05405 2.54054 299.54053 151.04053 15104.05397 2.54054 299.54054 151.04054 15104.05400 2020-01-01 2020-01-02 2020-01-01 00:14:06 2020-01-02 03:42:27 2020-01-01 00:14:06.000 2020-01-02 03:42:27.000 846 99747 50296.5 5029650 846 99747 50296.5 5029650 -32722 32213 4421.3 442130 -124 127 0.18 18 -847 2 10837 99748 2.54354 299.54354 151.04354 15104.35435 2.54354 299.54355 151.04354 15104.3546 2.54354 299.54354 151.04354 15104.35400 2020-01-01 2020-01-02 2020-01-01 00:14:07 2020-01-02 03:42:28 2020-01-01 00:14:07.000 2020-01-02 03:42:28.000 847 99748 50297.5 5029750 847 99748 50297.5 5029750 -32721 32214 4422.3 442230 -128 127 -1.38 -138 -848 2 10838 99749 2.54654 299.54654 151.04654 15104.65465 2.54654 299.54654 151.04654 15104.65425 2.54654 299.54654 151.04654 15104.65400 2020-01-01 2020-01-02 2020-01-01 00:14:08 2020-01-02 03:42:29 2020-01-01 00:14:08.000 2020-01-02 03:42:29.000 848 99749 50298.5 5029850 848 99749 50298.5 5029850 -32720 32215 4423.3 442330 -128 123 -2.94 -294 -849 2 10839 99750 2.54954 299.54954 151.04954 15104.95495 2.54954 299.54956 151.04954 15104.95499 2.54954 299.54954 151.04954 15104.95400 2020-01-01 2020-01-02 2020-01-01 00:14:09 2020-01-02 03:42:30 2020-01-01 00:14:09.000 2020-01-02 03:42:30.000 849 99750 50299.5 5029950 849 99750 50299.5 5029950 -32719 32216 4424.3 442430 -127 124 -1.94 -194 +840 2 10830 99741 2.52252 299.52252 151.02252 15102.25225 2.52252 299.52252 151.02252 15102.2522 2.52252 299.52252 151.02252000000001 15102.252 2020-01-01 2020-01-02 2020-01-01 00:14:00 2020-01-02 03:42:21 2020-01-01 00:14:00.000 2020-01-02 03:42:21.000 840 99741 50290.5 5029050 840 99741 50290.5 5029050 -32728 32207 4415.3 441530 -128 127 -0.7 -70 +841 2 10831 99742 2.52552 299.52552 151.02552 15102.55255 2.52552 299.5255 151.02552 15102.5525 2.52552 299.52552 151.02552 15102.552 2020-01-01 2020-01-02 2020-01-01 00:14:01 2020-01-02 03:42:22 2020-01-01 00:14:01.000 2020-01-02 03:42:22.000 841 99742 50291.5 5029150 841 99742 50291.5 5029150 -32727 32208 4416.3 441630 -128 127 -2.26 -226 +842 2 10832 99743 2.52852 299.52852 151.02852 15102.85285 2.52852 299.52853 151.02853 15102.85313 2.52852 299.52852 151.02852000000001 15102.852 2020-01-01 2020-01-02 2020-01-01 00:14:02 2020-01-02 03:42:23 2020-01-01 00:14:02.000 2020-01-02 03:42:23.000 842 99743 50292.5 5029250 842 99743 50292.5 5029250 -32726 32209 4417.3 441730 -128 123 -3.82 -382 +843 2 10833 99744 2.53153 299.53153 151.03153 15103.15315 2.53153 299.53152 151.03152 15103.15278 2.53153 299.53153 151.03153 15103.153 2020-01-01 2020-01-02 2020-01-01 00:14:03 2020-01-02 03:42:24 2020-01-01 00:14:03.000 2020-01-02 03:42:24.000 843 99744 50293.5 5029350 843 99744 50293.5 5029350 -32725 32210 4418.3 441830 -127 124 -2.82 -282 +844 2 10834 99745 2.53453 299.53453 151.03453 15103.45345 2.53453 299.53455 151.03453 15103.45353 2.53453 299.53453 151.03453 15103.453 2020-01-01 2020-01-02 2020-01-01 00:14:04 2020-01-02 03:42:25 2020-01-01 00:14:04.000 2020-01-02 03:42:25.000 844 99745 50294.5 5029450 844 99745 50294.5 5029450 -32724 32211 4419.3 441930 -126 125 -1.82 -182 +845 2 10835 99746 2.53753 299.53753 151.03753 15103.75375 2.53753 299.53754 151.03753 15103.75366 2.53753 299.53753 151.03753 15103.753 2020-01-01 2020-01-02 2020-01-01 00:14:05 2020-01-02 03:42:26 2020-01-01 00:14:05.000 2020-01-02 03:42:26.000 845 99746 50295.5 5029550 845 99746 50295.5 5029550 -32723 32212 4420.3 442030 -125 126 -0.82 -82 +846 2 10836 99747 2.54054 299.54054 151.04054 15104.05405 2.54054 299.54053 151.04053 15104.05397 2.54054 299.54054 151.04054 15104.054 2020-01-01 2020-01-02 2020-01-01 00:14:06 2020-01-02 03:42:27 2020-01-01 00:14:06.000 2020-01-02 03:42:27.000 846 99747 50296.5 5029650 846 99747 50296.5 5029650 -32722 32213 4421.3 442130 -124 127 0.18 18 +847 2 10837 99748 2.54354 299.54354 151.04354 15104.35435 2.54354 299.54355 151.04354 15104.3546 2.54354 299.54354 151.04354 15104.354 2020-01-01 2020-01-02 2020-01-01 00:14:07 2020-01-02 03:42:28 2020-01-01 00:14:07.000 2020-01-02 03:42:28.000 847 99748 50297.5 5029750 847 99748 50297.5 5029750 -32721 32214 4422.3 442230 -128 127 -1.38 -138 +848 2 10838 99749 2.54654 299.54654 151.04654 15104.65465 2.54654 299.54654 151.04654 15104.65425 2.54654 299.54654 151.04654 15104.654 2020-01-01 2020-01-02 2020-01-01 00:14:08 2020-01-02 03:42:29 2020-01-01 00:14:08.000 2020-01-02 03:42:29.000 848 99749 50298.5 5029850 848 99749 50298.5 5029850 -32720 32215 4423.3 442330 -128 123 -2.94 -294 +849 2 10839 99750 2.54954 299.54954 151.04954 15104.95495 2.54954 299.54956 151.04954 15104.95499 2.54954 299.54954 151.04954 15104.954 2020-01-01 2020-01-02 2020-01-01 00:14:09 2020-01-02 03:42:30 2020-01-01 00:14:09.000 2020-01-02 03:42:30.000 849 99750 50299.5 5029950 849 99750 50299.5 5029950 -32719 32216 4424.3 442430 -127 124 -1.94 -194 85 2 10075 99985 0.25525 300.25525 150.25525 15175.78078 0.25525 300.25525 150.25525 15175.78046 0.25525 300.25525 150.25525 15175.78025 2020-01-01 2020-01-02 2020-01-01 00:01:25 2020-01-02 03:46:25 2020-01-01 00:01:25.000 2020-01-02 03:46:25.000 85 99985 50035 5053535 85 99985 50035 5053535 -32484 32451 4614.009900990099 466015 -128 127 -1.5940594059405941 -161 -850 2 10840 99751 2.55255 299.55255 151.05255 15105.25525 2.55255 299.55255 151.05255 15105.25514 2.55255 299.55255 151.05255 15105.25500 2020-01-01 2020-01-02 2020-01-01 00:14:10 2020-01-02 03:42:31 2020-01-01 00:14:10.000 2020-01-02 03:42:31.000 850 99751 50300.5 5030050 850 99751 50300.5 5030050 -32718 32217 4425.3 442530 -126 125 -0.94 -94 -851 2 10841 99752 2.55555 299.55555 151.05555 15105.55555 2.55555 299.55554 151.05555 15105.55547 2.55555 299.55555 151.05555 15105.55500 2020-01-01 2020-01-02 2020-01-01 00:14:11 2020-01-02 03:42:32 2020-01-01 00:14:11.000 2020-01-02 03:42:32.000 851 99752 50301.5 5030150 851 99752 50301.5 5030150 -32717 32218 4426.3 442630 -125 126 0.06 6 -852 2 10842 99753 2.55855 299.55855 151.05855 15105.85585 2.55855 299.55856 151.05856 15105.85607 2.55855 299.55855 151.05855 15105.85500 2020-01-01 2020-01-02 2020-01-01 00:14:12 2020-01-02 03:42:33 2020-01-01 00:14:12.000 2020-01-02 03:42:33.000 852 99753 50302.5 5030250 852 99753 50302.5 5030250 -32716 32219 4427.3 442730 -124 127 1.06 106 -853 2 10843 99754 2.56156 299.56156 151.06156 15106.15615 2.56156 299.56155 151.06155 15106.15571 2.56156 299.56156 151.06156000000001 15106.15600 2020-01-01 2020-01-02 2020-01-01 00:14:13 2020-01-02 03:42:34 2020-01-01 00:14:13.000 2020-01-02 03:42:34.000 853 99754 50303.5 5030350 853 99754 50303.5 5030350 -32715 32220 4428.3 442830 -128 127 -0.5 -50 -854 2 10844 99755 2.56456 299.56456 151.06456 15106.45645 2.56456 299.56458 151.06456 15106.45646 2.56456 299.56456 151.06456 15106.45600 2020-01-01 2020-01-02 2020-01-01 00:14:14 2020-01-02 03:42:35 2020-01-01 00:14:14.000 2020-01-02 03:42:35.000 854 99755 50304.5 5030450 854 99755 50304.5 5030450 -32714 32221 4429.3 442930 -128 123 -2.06 -206 -855 2 10845 99756 2.56756 299.56756 151.06756 15106.75675 2.56756 299.56757 151.06756 15106.75661 2.56756 299.56756 151.06756 15106.75600 2020-01-01 2020-01-02 2020-01-01 00:14:15 2020-01-02 03:42:36 2020-01-01 00:14:15.000 2020-01-02 03:42:36.000 855 99756 50305.5 5030550 855 99756 50305.5 5030550 -32713 32222 4430.3 443030 -127 124 -1.06 -106 -856 2 10846 99757 2.57057 299.57057 151.07057 15107.05705 2.57057 299.57056 151.07056 15107.05694 2.57057 299.57057 151.07057 15107.05700 2020-01-01 2020-01-02 2020-01-01 00:14:16 2020-01-02 03:42:37 2020-01-01 00:14:16.000 2020-01-02 03:42:37.000 856 99757 50306.5 5030650 856 99757 50306.5 5030650 -32712 32223 4431.3 443130 -126 125 -0.06 -6 -857 2 10847 99758 2.57357 299.57357 151.07357 15107.35735 2.57357 299.57358 151.07357 15107.35754 2.57357 299.57357 151.07357 15107.35700 2020-01-01 2020-01-02 2020-01-01 00:14:17 2020-01-02 03:42:38 2020-01-01 00:14:17.000 2020-01-02 03:42:38.000 857 99758 50307.5 5030750 857 99758 50307.5 5030750 -32711 32224 4432.3 443230 -125 126 0.94 94 -858 2 10848 99759 2.57657 299.57657 151.07657 15107.65765 2.57657 299.57657 151.07657 15107.65783 2.57657 299.57657 151.07657 15107.65700 2020-01-01 2020-01-02 2020-01-01 00:14:18 2020-01-02 03:42:39 2020-01-01 00:14:18.000 2020-01-02 03:42:39.000 858 99759 50308.5 5030850 858 99759 50308.5 5030850 -32710 32225 4433.3 443330 -124 127 1.94 194 -859 2 10849 99760 2.57957 299.57957 151.07957 15107.95795 2.57957 299.5796 151.07957 15107.95794 2.57957 299.57957 151.07957 15107.95700 2020-01-01 2020-01-02 2020-01-01 00:14:19 2020-01-02 03:42:40 2020-01-01 00:14:19.000 2020-01-02 03:42:40.000 859 99760 50309.5 5030950 859 99760 50309.5 5030950 -32709 32226 4434.3 443430 -128 127 0.38 38 +850 2 10840 99751 2.55255 299.55255 151.05255 15105.25525 2.55255 299.55255 151.05255 15105.25514 2.55255 299.55255 151.05255 15105.255 2020-01-01 2020-01-02 2020-01-01 00:14:10 2020-01-02 03:42:31 2020-01-01 00:14:10.000 2020-01-02 03:42:31.000 850 99751 50300.5 5030050 850 99751 50300.5 5030050 -32718 32217 4425.3 442530 -126 125 -0.94 -94 +851 2 10841 99752 2.55555 299.55555 151.05555 15105.55555 2.55555 299.55554 151.05555 15105.55547 2.55555 299.55555 151.05555 15105.555 2020-01-01 2020-01-02 2020-01-01 00:14:11 2020-01-02 03:42:32 2020-01-01 00:14:11.000 2020-01-02 03:42:32.000 851 99752 50301.5 5030150 851 99752 50301.5 5030150 -32717 32218 4426.3 442630 -125 126 0.06 6 +852 2 10842 99753 2.55855 299.55855 151.05855 15105.85585 2.55855 299.55856 151.05856 15105.85607 2.55855 299.55855 151.05855 15105.855 2020-01-01 2020-01-02 2020-01-01 00:14:12 2020-01-02 03:42:33 2020-01-01 00:14:12.000 2020-01-02 03:42:33.000 852 99753 50302.5 5030250 852 99753 50302.5 5030250 -32716 32219 4427.3 442730 -124 127 1.06 106 +853 2 10843 99754 2.56156 299.56156 151.06156 15106.15615 2.56156 299.56155 151.06155 15106.15571 2.56156 299.56156 151.06156000000001 15106.156 2020-01-01 2020-01-02 2020-01-01 00:14:13 2020-01-02 03:42:34 2020-01-01 00:14:13.000 2020-01-02 03:42:34.000 853 99754 50303.5 5030350 853 99754 50303.5 5030350 -32715 32220 4428.3 442830 -128 127 -0.5 -50 +854 2 10844 99755 2.56456 299.56456 151.06456 15106.45645 2.56456 299.56458 151.06456 15106.45646 2.56456 299.56456 151.06456 15106.456 2020-01-01 2020-01-02 2020-01-01 00:14:14 2020-01-02 03:42:35 2020-01-01 00:14:14.000 2020-01-02 03:42:35.000 854 99755 50304.5 5030450 854 99755 50304.5 5030450 -32714 32221 4429.3 442930 -128 123 -2.06 -206 +855 2 10845 99756 2.56756 299.56756 151.06756 15106.75675 2.56756 299.56757 151.06756 15106.75661 2.56756 299.56756 151.06756 15106.756 2020-01-01 2020-01-02 2020-01-01 00:14:15 2020-01-02 03:42:36 2020-01-01 00:14:15.000 2020-01-02 03:42:36.000 855 99756 50305.5 5030550 855 99756 50305.5 5030550 -32713 32222 4430.3 443030 -127 124 -1.06 -106 +856 2 10846 99757 2.57057 299.57057 151.07057 15107.05705 2.57057 299.57056 151.07056 15107.05694 2.57057 299.57057 151.07057 15107.057 2020-01-01 2020-01-02 2020-01-01 00:14:16 2020-01-02 03:42:37 2020-01-01 00:14:16.000 2020-01-02 03:42:37.000 856 99757 50306.5 5030650 856 99757 50306.5 5030650 -32712 32223 4431.3 443130 -126 125 -0.06 -6 +857 2 10847 99758 2.57357 299.57357 151.07357 15107.35735 2.57357 299.57358 151.07357 15107.35754 2.57357 299.57357 151.07357 15107.357 2020-01-01 2020-01-02 2020-01-01 00:14:17 2020-01-02 03:42:38 2020-01-01 00:14:17.000 2020-01-02 03:42:38.000 857 99758 50307.5 5030750 857 99758 50307.5 5030750 -32711 32224 4432.3 443230 -125 126 0.94 94 +858 2 10848 99759 2.57657 299.57657 151.07657 15107.65765 2.57657 299.57657 151.07657 15107.65783 2.57657 299.57657 151.07657 15107.657 2020-01-01 2020-01-02 2020-01-01 00:14:18 2020-01-02 03:42:39 2020-01-01 00:14:18.000 2020-01-02 03:42:39.000 858 99759 50308.5 5030850 858 99759 50308.5 5030850 -32710 32225 4433.3 443330 -124 127 1.94 194 +859 2 10849 99760 2.57957 299.57957 151.07957 15107.95795 2.57957 299.5796 151.07957 15107.95794 2.57957 299.57957 151.07957 15107.957 2020-01-01 2020-01-02 2020-01-01 00:14:19 2020-01-02 03:42:40 2020-01-01 00:14:19.000 2020-01-02 03:42:40.000 859 99760 50309.5 5030950 859 99760 50309.5 5030950 -32709 32226 4434.3 443430 -128 127 0.38 38 86 2 10076 99986 0.25825 300.25825 150.25825 15176.08408 0.25825 300.25827 150.25825 15176.08406 0.25825 300.25825 150.25825 15176.08325 2020-01-01 2020-01-02 2020-01-01 00:01:26 2020-01-02 03:46:26 2020-01-01 00:01:26.000 2020-01-02 03:46:26.000 86 99986 50036 5053636 86 99986 50036 5053636 -32483 32452 4615.009900990099 466116 -128 123 -3.128712871287129 -316 -860 2 10850 99761 2.58258 299.58258 151.08258 15108.25825 2.58258 299.58258 151.08258 15108.25811 2.58258 299.58258 151.08258 15108.25800 2020-01-01 2020-01-02 2020-01-01 00:14:20 2020-01-02 03:42:41 2020-01-01 00:14:20.000 2020-01-02 03:42:41.000 860 99761 50310.5 5031050 860 99761 50310.5 5031050 -32708 32227 4435.3 443530 -128 123 -1.18 -118 -861 2 10851 99762 2.58558 299.58558 151.08558 15108.55855 2.58558 299.58557 151.08558 15108.55841 2.58558 299.58558 151.08558000000002 15108.55800 2020-01-01 2020-01-02 2020-01-01 00:14:21 2020-01-02 03:42:42 2020-01-01 00:14:21.000 2020-01-02 03:42:42.000 861 99762 50311.5 5031150 861 99762 50311.5 5031150 -32707 32228 4436.3 443630 -127 124 -0.18 -18 -862 2 10852 99763 2.58858 299.58858 151.08858 15108.85885 2.58858 299.5886 151.08859 15108.85901 2.58858 299.58858 151.08858 15108.85800 2020-01-01 2020-01-02 2020-01-01 00:14:22 2020-01-02 03:42:43 2020-01-01 00:14:22.000 2020-01-02 03:42:43.000 862 99763 50312.5 5031250 862 99763 50312.5 5031250 -32706 32229 4437.3 443730 -126 125 0.82 82 -863 2 10853 99764 2.59159 299.59159 151.09159 15109.15915 2.59159 299.59158 151.09159 15109.1593 2.59159 299.59159 151.09159 15109.15900 2020-01-01 2020-01-02 2020-01-01 00:14:23 2020-01-02 03:42:44 2020-01-01 00:14:23.000 2020-01-02 03:42:44.000 863 99764 50313.5 5031350 863 99764 50313.5 5031350 -32705 32230 4438.3 443830 -125 126 1.82 182 -864 2 10854 99765 2.59459 299.59459 151.09459 15109.45945 2.59459 299.5946 151.09459 15109.45941 2.59459 299.59459 151.09459 15109.45900 2020-01-01 2020-01-02 2020-01-01 00:14:24 2020-01-02 03:42:45 2020-01-01 00:14:24.000 2020-01-02 03:42:45.000 864 99765 50314.5 5031450 864 99765 50314.5 5031450 -32704 32231 4439.3 443930 -124 127 2.82 282 -865 2 10855 99766 2.59759 299.59759 151.09759 15109.75975 2.59759 299.5976 151.09759 15109.75958 2.59759 299.59759 151.09759 15109.75900 2020-01-01 2020-01-02 2020-01-01 00:14:25 2020-01-02 03:42:46 2020-01-01 00:14:25.000 2020-01-02 03:42:46.000 865 99766 50315.5 5031550 865 99766 50315.5 5031550 -32703 32232 4440.3 444030 -128 127 1.26 126 -866 2 10856 99767 2.6006 299.6006 151.1006 15110.06006 2.6006 299.6006 151.10059 15110.05988 2.60060 299.60060 151.1006 15110.06000 2020-01-01 2020-01-02 2020-01-01 00:14:26 2020-01-02 03:42:47 2020-01-01 00:14:26.000 2020-01-02 03:42:47.000 866 99767 50316.5 5031650 866 99767 50316.5 5031650 -32702 32233 4441.3 444130 -128 127 -0.3 -30 -867 2 10857 99768 2.6036 299.6036 151.1036 15110.36036 2.6036 299.6036 151.1036 15110.36063 2.60360 299.60360 151.1036 15110.36000 2020-01-01 2020-01-02 2020-01-01 00:14:27 2020-01-02 03:42:48 2020-01-01 00:14:27.000 2020-01-02 03:42:48.000 867 99768 50317.5 5031750 867 99768 50317.5 5031750 -32701 32234 4442.3 444230 -128 123 -1.86 -186 -868 2 10858 99769 2.6066 299.6066 151.1066 15110.66066 2.6066 299.6066 151.1066 15110.66078 2.60660 299.60660 151.1066 15110.66000 2020-01-01 2020-01-02 2020-01-01 00:14:28 2020-01-02 03:42:49 2020-01-01 00:14:28.000 2020-01-02 03:42:49.000 868 99769 50318.5 5031850 868 99769 50318.5 5031850 -32700 32235 4443.3 444330 -127 124 -0.86 -86 -869 2 10859 99770 2.6096 299.6096 151.1096 15110.96096 2.6096 299.60962 151.1096 15110.96091 2.60960 299.60960 151.1096 15110.96000 2020-01-01 2020-01-02 2020-01-01 00:14:29 2020-01-02 03:42:50 2020-01-01 00:14:29.000 2020-01-02 03:42:50.000 869 99770 50319.5 5031950 869 99770 50319.5 5031950 -32699 32236 4444.3 444430 -126 125 0.14 14 +860 2 10850 99761 2.58258 299.58258 151.08258 15108.25825 2.58258 299.58258 151.08258 15108.25811 2.58258 299.58258 151.08258 15108.258 2020-01-01 2020-01-02 2020-01-01 00:14:20 2020-01-02 03:42:41 2020-01-01 00:14:20.000 2020-01-02 03:42:41.000 860 99761 50310.5 5031050 860 99761 50310.5 5031050 -32708 32227 4435.3 443530 -128 123 -1.18 -118 +861 2 10851 99762 2.58558 299.58558 151.08558 15108.55855 2.58558 299.58557 151.08558 15108.55841 2.58558 299.58558 151.08558000000002 15108.558 2020-01-01 2020-01-02 2020-01-01 00:14:21 2020-01-02 03:42:42 2020-01-01 00:14:21.000 2020-01-02 03:42:42.000 861 99762 50311.5 5031150 861 99762 50311.5 5031150 -32707 32228 4436.3 443630 -127 124 -0.18 -18 +862 2 10852 99763 2.58858 299.58858 151.08858 15108.85885 2.58858 299.5886 151.08859 15108.85901 2.58858 299.58858 151.08858 15108.858 2020-01-01 2020-01-02 2020-01-01 00:14:22 2020-01-02 03:42:43 2020-01-01 00:14:22.000 2020-01-02 03:42:43.000 862 99763 50312.5 5031250 862 99763 50312.5 5031250 -32706 32229 4437.3 443730 -126 125 0.82 82 +863 2 10853 99764 2.59159 299.59159 151.09159 15109.15915 2.59159 299.59158 151.09159 15109.1593 2.59159 299.59159 151.09159 15109.159 2020-01-01 2020-01-02 2020-01-01 00:14:23 2020-01-02 03:42:44 2020-01-01 00:14:23.000 2020-01-02 03:42:44.000 863 99764 50313.5 5031350 863 99764 50313.5 5031350 -32705 32230 4438.3 443830 -125 126 1.82 182 +864 2 10854 99765 2.59459 299.59459 151.09459 15109.45945 2.59459 299.5946 151.09459 15109.45941 2.59459 299.59459 151.09459 15109.459 2020-01-01 2020-01-02 2020-01-01 00:14:24 2020-01-02 03:42:45 2020-01-01 00:14:24.000 2020-01-02 03:42:45.000 864 99765 50314.5 5031450 864 99765 50314.5 5031450 -32704 32231 4439.3 443930 -124 127 2.82 282 +865 2 10855 99766 2.59759 299.59759 151.09759 15109.75975 2.59759 299.5976 151.09759 15109.75958 2.59759 299.59759 151.09759 15109.759 2020-01-01 2020-01-02 2020-01-01 00:14:25 2020-01-02 03:42:46 2020-01-01 00:14:25.000 2020-01-02 03:42:46.000 865 99766 50315.5 5031550 865 99766 50315.5 5031550 -32703 32232 4440.3 444030 -128 127 1.26 126 +866 2 10856 99767 2.6006 299.6006 151.1006 15110.06006 2.6006 299.6006 151.10059 15110.05988 2.6006 299.6006 151.1006 15110.06 2020-01-01 2020-01-02 2020-01-01 00:14:26 2020-01-02 03:42:47 2020-01-01 00:14:26.000 2020-01-02 03:42:47.000 866 99767 50316.5 5031650 866 99767 50316.5 5031650 -32702 32233 4441.3 444130 -128 127 -0.3 -30 +867 2 10857 99768 2.6036 299.6036 151.1036 15110.36036 2.6036 299.6036 151.1036 15110.36063 2.6036 299.6036 151.1036 15110.36 2020-01-01 2020-01-02 2020-01-01 00:14:27 2020-01-02 03:42:48 2020-01-01 00:14:27.000 2020-01-02 03:42:48.000 867 99768 50317.5 5031750 867 99768 50317.5 5031750 -32701 32234 4442.3 444230 -128 123 -1.86 -186 +868 2 10858 99769 2.6066 299.6066 151.1066 15110.66066 2.6066 299.6066 151.1066 15110.66078 2.6066 299.6066 151.1066 15110.66 2020-01-01 2020-01-02 2020-01-01 00:14:28 2020-01-02 03:42:49 2020-01-01 00:14:28.000 2020-01-02 03:42:49.000 868 99769 50318.5 5031850 868 99769 50318.5 5031850 -32700 32235 4443.3 444330 -127 124 -0.86 -86 +869 2 10859 99770 2.6096 299.6096 151.1096 15110.96096 2.6096 299.60962 151.1096 15110.96091 2.6096 299.6096 151.1096 15110.96 2020-01-01 2020-01-02 2020-01-01 00:14:29 2020-01-02 03:42:50 2020-01-01 00:14:29.000 2020-01-02 03:42:50.000 869 99770 50319.5 5031950 869 99770 50319.5 5031950 -32699 32236 4444.3 444430 -126 125 0.14 14 87 2 10077 99987 0.26126 300.26126 150.26126 15176.38738 0.26126 300.26126 150.26126 15176.38736 0.26126 300.26126 150.26126 15176.38726 2020-01-01 2020-01-02 2020-01-01 00:01:27 2020-01-02 03:46:27 2020-01-01 00:01:27.000 2020-01-02 03:46:27.000 87 99987 50037 5053737 87 99987 50037 5053737 -32482 32453 4616.009900990099 466217 -127 124 -2.128712871287129 -215 -870 2 10860 99771 2.61261 299.61261 151.11261 15111.26126 2.61261 299.6126 151.11261 15111.26105 2.61261 299.61261 151.11261000000002 15111.26100 2020-01-01 2020-01-02 2020-01-01 00:14:30 2020-01-02 03:42:51 2020-01-01 00:14:30.000 2020-01-02 03:42:51.000 870 99771 50320.5 5032050 870 99771 50320.5 5032050 -32698 32237 4445.3 444530 -125 126 1.14 114 -871 2 10861 99772 2.61561 299.61561 151.11561 15111.56156 2.61561 299.6156 151.11561 15111.56135 2.61561 299.61561 151.11561 15111.56100 2020-01-01 2020-01-02 2020-01-01 00:14:31 2020-01-02 03:42:52 2020-01-01 00:14:31.000 2020-01-02 03:42:52.000 871 99772 50321.5 5032150 871 99772 50321.5 5032150 -32697 32238 4446.3 444630 -124 127 2.14 214 -872 2 10862 99773 2.61861 299.61861 151.11861 15111.86186 2.61861 299.61862 151.11862 15111.8621 2.61861 299.61861 151.11861000000002 15111.86100 2020-01-01 2020-01-02 2020-01-01 00:14:32 2020-01-02 03:42:53 2020-01-01 00:14:32.000 2020-01-02 03:42:53.000 872 99773 50322.5 5032250 872 99773 50322.5 5032250 -32696 32239 4447.3 444730 -128 127 0.58 58 -873 2 10863 99774 2.62162 299.62162 151.12162 15112.16216 2.62162 299.6216 151.12162 15112.16224 2.62162 299.62162 151.12162 15112.16200 2020-01-01 2020-01-02 2020-01-01 00:14:33 2020-01-02 03:42:54 2020-01-01 00:14:33.000 2020-01-02 03:42:54.000 873 99774 50323.5 5032350 873 99774 50323.5 5032350 -32695 32240 4448.3 444830 -128 123 -0.98 -98 -874 2 10864 99775 2.62462 299.62462 151.12462 15112.46246 2.62462 299.62463 151.12462 15112.46238 2.62462 299.62462 151.12462 15112.46200 2020-01-01 2020-01-02 2020-01-01 00:14:34 2020-01-02 03:42:55 2020-01-01 00:14:34.000 2020-01-02 03:42:55.000 874 99775 50324.5 5032450 874 99775 50324.5 5032450 -32694 32241 4449.3 444930 -127 124 0.02 2 -875 2 10865 99776 2.62762 299.62762 151.12762 15112.76276 2.62762 299.62762 151.12762 15112.76252 2.62762 299.62762 151.12762 15112.76200 2020-01-01 2020-01-02 2020-01-01 00:14:35 2020-01-02 03:42:56 2020-01-01 00:14:35.000 2020-01-02 03:42:56.000 875 99776 50325.5 5032550 875 99776 50325.5 5032550 -32693 32242 4450.3 445030 -126 125 1.02 102 -876 2 10866 99777 2.63063 299.63063 151.13063 15113.06306 2.63063 299.63065 151.13063 15113.06327 2.63063 299.63063 151.13063 15113.06300 2020-01-01 2020-01-02 2020-01-01 00:14:36 2020-01-02 03:42:57 2020-01-01 00:14:36.000 2020-01-02 03:42:57.000 876 99777 50326.5 5032650 876 99777 50326.5 5032650 -32692 32243 4451.3 445130 -125 126 2.02 202 -877 2 10867 99778 2.63363 299.63363 151.13363 15113.36336 2.63363 299.63364 151.13363 15113.36358 2.63363 299.63363 151.13362999999998 15113.36300 2020-01-01 2020-01-02 2020-01-01 00:14:37 2020-01-02 03:42:58 2020-01-01 00:14:37.000 2020-01-02 03:42:58.000 877 99778 50327.5 5032750 877 99778 50327.5 5032750 -32691 32244 4452.3 445230 -124 127 3.02 302 -878 2 10868 99779 2.63663 299.63663 151.13663 15113.66366 2.63663 299.63663 151.13663 15113.66371 2.63663 299.63663 151.13663 15113.66300 2020-01-01 2020-01-02 2020-01-01 00:14:38 2020-01-02 03:42:59 2020-01-01 00:14:38.000 2020-01-02 03:42:59.000 878 99779 50328.5 5032850 878 99779 50328.5 5032850 -32690 32245 4453.3 445330 -128 127 1.46 146 -879 2 10869 99780 2.63963 299.63963 151.13963 15113.96396 2.63963 299.63965 151.13963 15113.96385 2.63963 299.63963 151.13963 15113.96300 2020-01-01 2020-01-02 2020-01-01 00:14:39 2020-01-02 03:43:00 2020-01-01 00:14:39.000 2020-01-02 03:43:00.000 879 99780 50329.5 5032950 879 99780 50329.5 5032950 -32689 32246 4454.3 445430 -128 123 -0.1 -10 +870 2 10860 99771 2.61261 299.61261 151.11261 15111.26126 2.61261 299.6126 151.11261 15111.26105 2.61261 299.61261 151.11261000000002 15111.261 2020-01-01 2020-01-02 2020-01-01 00:14:30 2020-01-02 03:42:51 2020-01-01 00:14:30.000 2020-01-02 03:42:51.000 870 99771 50320.5 5032050 870 99771 50320.5 5032050 -32698 32237 4445.3 444530 -125 126 1.14 114 +871 2 10861 99772 2.61561 299.61561 151.11561 15111.56156 2.61561 299.6156 151.11561 15111.56135 2.61561 299.61561 151.11561 15111.561 2020-01-01 2020-01-02 2020-01-01 00:14:31 2020-01-02 03:42:52 2020-01-01 00:14:31.000 2020-01-02 03:42:52.000 871 99772 50321.5 5032150 871 99772 50321.5 5032150 -32697 32238 4446.3 444630 -124 127 2.14 214 +872 2 10862 99773 2.61861 299.61861 151.11861 15111.86186 2.61861 299.61862 151.11862 15111.8621 2.61861 299.61861 151.11861000000002 15111.861 2020-01-01 2020-01-02 2020-01-01 00:14:32 2020-01-02 03:42:53 2020-01-01 00:14:32.000 2020-01-02 03:42:53.000 872 99773 50322.5 5032250 872 99773 50322.5 5032250 -32696 32239 4447.3 444730 -128 127 0.58 58 +873 2 10863 99774 2.62162 299.62162 151.12162 15112.16216 2.62162 299.6216 151.12162 15112.16224 2.62162 299.62162 151.12162 15112.162 2020-01-01 2020-01-02 2020-01-01 00:14:33 2020-01-02 03:42:54 2020-01-01 00:14:33.000 2020-01-02 03:42:54.000 873 99774 50323.5 5032350 873 99774 50323.5 5032350 -32695 32240 4448.3 444830 -128 123 -0.98 -98 +874 2 10864 99775 2.62462 299.62462 151.12462 15112.46246 2.62462 299.62463 151.12462 15112.46238 2.62462 299.62462 151.12462 15112.462 2020-01-01 2020-01-02 2020-01-01 00:14:34 2020-01-02 03:42:55 2020-01-01 00:14:34.000 2020-01-02 03:42:55.000 874 99775 50324.5 5032450 874 99775 50324.5 5032450 -32694 32241 4449.3 444930 -127 124 0.02 2 +875 2 10865 99776 2.62762 299.62762 151.12762 15112.76276 2.62762 299.62762 151.12762 15112.76252 2.62762 299.62762 151.12762 15112.762 2020-01-01 2020-01-02 2020-01-01 00:14:35 2020-01-02 03:42:56 2020-01-01 00:14:35.000 2020-01-02 03:42:56.000 875 99776 50325.5 5032550 875 99776 50325.5 5032550 -32693 32242 4450.3 445030 -126 125 1.02 102 +876 2 10866 99777 2.63063 299.63063 151.13063 15113.06306 2.63063 299.63065 151.13063 15113.06327 2.63063 299.63063 151.13063 15113.063 2020-01-01 2020-01-02 2020-01-01 00:14:36 2020-01-02 03:42:57 2020-01-01 00:14:36.000 2020-01-02 03:42:57.000 876 99777 50326.5 5032650 876 99777 50326.5 5032650 -32692 32243 4451.3 445130 -125 126 2.02 202 +877 2 10867 99778 2.63363 299.63363 151.13363 15113.36336 2.63363 299.63364 151.13363 15113.36358 2.63363 299.63363 151.13362999999998 15113.363 2020-01-01 2020-01-02 2020-01-01 00:14:37 2020-01-02 03:42:58 2020-01-01 00:14:37.000 2020-01-02 03:42:58.000 877 99778 50327.5 5032750 877 99778 50327.5 5032750 -32691 32244 4452.3 445230 -124 127 3.02 302 +878 2 10868 99779 2.63663 299.63663 151.13663 15113.66366 2.63663 299.63663 151.13663 15113.66371 2.63663 299.63663 151.13663 15113.663 2020-01-01 2020-01-02 2020-01-01 00:14:38 2020-01-02 03:42:59 2020-01-01 00:14:38.000 2020-01-02 03:42:59.000 878 99779 50328.5 5032850 878 99779 50328.5 5032850 -32690 32245 4453.3 445330 -128 127 1.46 146 +879 2 10869 99780 2.63963 299.63963 151.13963 15113.96396 2.63963 299.63965 151.13963 15113.96385 2.63963 299.63963 151.13963 15113.963 2020-01-01 2020-01-02 2020-01-01 00:14:39 2020-01-02 03:43:00 2020-01-01 00:14:39.000 2020-01-02 03:43:00.000 879 99780 50329.5 5032950 879 99780 50329.5 5032950 -32689 32246 4454.3 445430 -128 123 -0.1 -10 88 2 10078 99988 0.26426 300.26426 150.26426 15176.69069 0.26426 300.26425 150.26426 15176.69066 0.26426 300.26426 150.26426 15176.69026 2020-01-01 2020-01-02 2020-01-01 00:01:28 2020-01-02 03:46:28 2020-01-01 00:01:28.000 2020-01-02 03:46:28.000 88 99988 50038 5053838 88 99988 50038 5053838 -32481 32454 4617.009900990099 466318 -126 125 -1.1287128712871286 -114 -880 2 10870 99781 2.64264 299.64264 151.14264 15114.26426 2.64264 299.64264 151.14263 15114.26399 2.64264 299.64264 151.14264 15114.26400 2020-01-01 2020-01-02 2020-01-01 00:14:40 2020-01-02 03:43:01 2020-01-01 00:14:40.000 2020-01-02 03:43:01.000 880 99781 50330.5 5033050 880 99781 50330.5 5033050 -32688 32247 4455.3 445530 -127 124 0.9 90 -881 2 10871 99782 2.64564 299.64564 151.14564 15114.56456 2.64564 299.64566 151.14564 15114.56474 2.64564 299.64564 151.14564000000001 15114.56400 2020-01-01 2020-01-02 2020-01-01 00:14:41 2020-01-02 03:43:02 2020-01-01 00:14:41.000 2020-01-02 03:43:02.000 881 99782 50331.5 5033150 881 99782 50331.5 5033150 -32687 32248 4456.3 445630 -126 125 1.9 190 -882 2 10872 99783 2.64864 299.64864 151.14864 15114.86486 2.64864 299.64865 151.14865 15114.86504 2.64864 299.64864 151.14864 15114.86400 2020-01-01 2020-01-02 2020-01-01 00:14:42 2020-01-02 03:43:03 2020-01-01 00:14:42.000 2020-01-02 03:43:03.000 882 99783 50332.5 5033250 882 99783 50332.5 5033250 -32686 32249 4457.3 445730 -125 126 2.9 290 -883 2 10873 99784 2.65165 299.65165 151.15165 15115.16516 2.65165 299.65164 151.15165 15115.16522 2.65165 299.65165 151.15165000000002 15115.16500 2020-01-01 2020-01-02 2020-01-01 00:14:43 2020-01-02 03:43:04 2020-01-01 00:14:43.000 2020-01-02 03:43:04.000 883 99784 50333.5 5033350 883 99784 50333.5 5033350 -32685 32250 4458.3 445830 -124 127 3.9 390 -884 2 10874 99785 2.65465 299.65465 151.15465 15115.46546 2.65465 299.65466 151.15465 15115.46532 2.65465 299.65465 151.15465 15115.46500 2020-01-01 2020-01-02 2020-01-01 00:14:44 2020-01-02 03:43:05 2020-01-01 00:14:44.000 2020-01-02 03:43:05.000 884 99785 50334.5 5033450 884 99785 50334.5 5033450 -32684 32251 4459.3 445930 -128 127 2.34 234 -885 2 10875 99786 2.65765 299.65765 151.15765 15115.76576 2.65765 299.65765 151.15765 15115.76562 2.65765 299.65765 151.15765 15115.76500 2020-01-01 2020-01-02 2020-01-01 00:14:45 2020-01-02 03:43:06 2020-01-01 00:14:45.000 2020-01-02 03:43:06.000 885 99786 50335.5 5033550 885 99786 50335.5 5033550 -32683 32252 4460.3 446030 -128 123 0.78 78 -886 2 10876 99787 2.66066 299.66066 151.16066 15116.06606 2.66066 299.66068 151.16066 15116.06621 2.66066 299.66066 151.16066 15116.06600 2020-01-01 2020-01-02 2020-01-01 00:14:46 2020-01-02 03:43:07 2020-01-01 00:14:46.000 2020-01-02 03:43:07.000 886 99787 50336.5 5033650 886 99787 50336.5 5033650 -32682 32253 4461.3 446130 -127 124 1.78 178 -887 2 10877 99788 2.66366 299.66366 151.16366 15116.36636 2.66366 299.66367 151.16366 15116.36651 2.66366 299.66366 151.16366 15116.36600 2020-01-01 2020-01-02 2020-01-01 00:14:47 2020-01-02 03:43:08 2020-01-01 00:14:47.000 2020-01-02 03:43:08.000 887 99788 50337.5 5033750 887 99788 50337.5 5033750 -32681 32254 4462.3 446230 -126 125 2.78 278 -888 2 10878 99789 2.66666 299.66666 151.16666 15116.66666 2.66666 299.66666 151.16666 15116.66669 2.66666 299.66666 151.16665999999998 15116.66600 2020-01-01 2020-01-02 2020-01-01 00:14:48 2020-01-02 03:43:09 2020-01-01 00:14:48.000 2020-01-02 03:43:09.000 888 99789 50338.5 5033850 888 99789 50338.5 5033850 -32680 32255 4463.3 446330 -125 126 3.78 378 -889 2 10879 99790 2.66966 299.66966 151.16966 15116.96696 2.66966 299.66968 151.16966 15116.96679 2.66966 299.66966 151.16966 15116.96600 2020-01-01 2020-01-02 2020-01-01 00:14:49 2020-01-02 03:43:10 2020-01-01 00:14:49.000 2020-01-02 03:43:10.000 889 99790 50339.5 5033950 889 99790 50339.5 5033950 -32679 32256 4464.3 446430 -124 127 4.78 478 +880 2 10870 99781 2.64264 299.64264 151.14264 15114.26426 2.64264 299.64264 151.14263 15114.26399 2.64264 299.64264 151.14264 15114.264 2020-01-01 2020-01-02 2020-01-01 00:14:40 2020-01-02 03:43:01 2020-01-01 00:14:40.000 2020-01-02 03:43:01.000 880 99781 50330.5 5033050 880 99781 50330.5 5033050 -32688 32247 4455.3 445530 -127 124 0.9 90 +881 2 10871 99782 2.64564 299.64564 151.14564 15114.56456 2.64564 299.64566 151.14564 15114.56474 2.64564 299.64564 151.14564000000001 15114.564 2020-01-01 2020-01-02 2020-01-01 00:14:41 2020-01-02 03:43:02 2020-01-01 00:14:41.000 2020-01-02 03:43:02.000 881 99782 50331.5 5033150 881 99782 50331.5 5033150 -32687 32248 4456.3 445630 -126 125 1.9 190 +882 2 10872 99783 2.64864 299.64864 151.14864 15114.86486 2.64864 299.64865 151.14865 15114.86504 2.64864 299.64864 151.14864 15114.864 2020-01-01 2020-01-02 2020-01-01 00:14:42 2020-01-02 03:43:03 2020-01-01 00:14:42.000 2020-01-02 03:43:03.000 882 99783 50332.5 5033250 882 99783 50332.5 5033250 -32686 32249 4457.3 445730 -125 126 2.9 290 +883 2 10873 99784 2.65165 299.65165 151.15165 15115.16516 2.65165 299.65164 151.15165 15115.16522 2.65165 299.65165 151.15165000000002 15115.165 2020-01-01 2020-01-02 2020-01-01 00:14:43 2020-01-02 03:43:04 2020-01-01 00:14:43.000 2020-01-02 03:43:04.000 883 99784 50333.5 5033350 883 99784 50333.5 5033350 -32685 32250 4458.3 445830 -124 127 3.9 390 +884 2 10874 99785 2.65465 299.65465 151.15465 15115.46546 2.65465 299.65466 151.15465 15115.46532 2.65465 299.65465 151.15465 15115.465 2020-01-01 2020-01-02 2020-01-01 00:14:44 2020-01-02 03:43:05 2020-01-01 00:14:44.000 2020-01-02 03:43:05.000 884 99785 50334.5 5033450 884 99785 50334.5 5033450 -32684 32251 4459.3 445930 -128 127 2.34 234 +885 2 10875 99786 2.65765 299.65765 151.15765 15115.76576 2.65765 299.65765 151.15765 15115.76562 2.65765 299.65765 151.15765 15115.765 2020-01-01 2020-01-02 2020-01-01 00:14:45 2020-01-02 03:43:06 2020-01-01 00:14:45.000 2020-01-02 03:43:06.000 885 99786 50335.5 5033550 885 99786 50335.5 5033550 -32683 32252 4460.3 446030 -128 123 0.78 78 +886 2 10876 99787 2.66066 299.66066 151.16066 15116.06606 2.66066 299.66068 151.16066 15116.06621 2.66066 299.66066 151.16066 15116.066 2020-01-01 2020-01-02 2020-01-01 00:14:46 2020-01-02 03:43:07 2020-01-01 00:14:46.000 2020-01-02 03:43:07.000 886 99787 50336.5 5033650 886 99787 50336.5 5033650 -32682 32253 4461.3 446130 -127 124 1.78 178 +887 2 10877 99788 2.66366 299.66366 151.16366 15116.36636 2.66366 299.66367 151.16366 15116.36651 2.66366 299.66366 151.16366 15116.366 2020-01-01 2020-01-02 2020-01-01 00:14:47 2020-01-02 03:43:08 2020-01-01 00:14:47.000 2020-01-02 03:43:08.000 887 99788 50337.5 5033750 887 99788 50337.5 5033750 -32681 32254 4462.3 446230 -126 125 2.78 278 +888 2 10878 99789 2.66666 299.66666 151.16666 15116.66666 2.66666 299.66666 151.16666 15116.66669 2.66666 299.66666 151.16665999999998 15116.666 2020-01-01 2020-01-02 2020-01-01 00:14:48 2020-01-02 03:43:09 2020-01-01 00:14:48.000 2020-01-02 03:43:09.000 888 99789 50338.5 5033850 888 99789 50338.5 5033850 -32680 32255 4463.3 446330 -125 126 3.78 378 +889 2 10879 99790 2.66966 299.66966 151.16966 15116.96696 2.66966 299.66968 151.16966 15116.96679 2.66966 299.66966 151.16966 15116.966 2020-01-01 2020-01-02 2020-01-01 00:14:49 2020-01-02 03:43:10 2020-01-01 00:14:49.000 2020-01-02 03:43:10.000 889 99790 50339.5 5033950 889 99790 50339.5 5033950 -32679 32256 4464.3 446430 -124 127 4.78 478 89 2 10079 99989 0.26726 300.26726 150.26726 15176.99399 0.26726 300.26727 150.26727 15176.9943 0.26726 300.26726 150.26726 15176.99326 2020-01-01 2020-01-02 2020-01-01 00:01:29 2020-01-02 03:46:29 2020-01-01 00:01:29.000 2020-01-02 03:46:29.000 89 99989 50039 5053939 89 99989 50039 5053939 -32480 32455 4618.009900990099 466419 -125 126 -0.12871287128712872 -13 -890 2 10880 99791 2.67267 299.67267 151.17267 15117.26726 2.67267 299.67267 151.17267 15117.26708 2.67267 299.67267 151.17267 15117.26700 2020-01-01 2020-01-02 2020-01-01 00:14:50 2020-01-02 03:43:11 2020-01-01 00:14:50.000 2020-01-02 03:43:11.000 890 99791 50340.5 5034050 890 99791 50340.5 5034050 -32678 32257 4465.3 446530 -128 127 3.22 322 -891 2 10881 99792 2.67567 299.67567 151.17567 15117.56756 2.67567 299.6757 151.17567 15117.56768 2.67567 299.67567 151.17567 15117.56700 2020-01-01 2020-01-02 2020-01-01 00:14:51 2020-01-02 03:43:12 2020-01-01 00:14:51.000 2020-01-02 03:43:12.000 891 99792 50341.5 5034150 891 99792 50341.5 5034150 -32677 32258 4466.3 446630 -128 127 1.66 166 -892 2 10882 99793 2.67867 299.67867 151.17867 15117.86786 2.67867 299.67868 151.17868 15117.86802 2.67867 299.67867 151.17867 15117.86700 2020-01-01 2020-01-02 2020-01-01 00:14:52 2020-01-02 03:43:13 2020-01-01 00:14:52.000 2020-01-02 03:43:13.000 892 99793 50342.5 5034250 892 99793 50342.5 5034250 -32676 32259 4467.3 446730 -128 124 0.1 10 -893 2 10883 99794 2.68168 299.68168 151.18168 15118.16816 2.68168 299.68167 151.18168 15118.16816 2.68168 299.68168 151.18168 15118.16800 2020-01-01 2020-01-02 2020-01-01 00:14:53 2020-01-02 03:43:14 2020-01-01 00:14:53.000 2020-01-02 03:43:14.000 893 99794 50343.5 5034350 893 99794 50343.5 5034350 -32675 32260 4468.3 446830 -127 125 1.1 110 -894 2 10884 99795 2.68468 299.68468 151.18468 15118.46846 2.68468 299.6847 151.18468 15118.46826 2.68468 299.68468 151.18468000000001 15118.46800 2020-01-01 2020-01-02 2020-01-01 00:14:54 2020-01-02 03:43:15 2020-01-01 00:14:54.000 2020-01-02 03:43:15.000 894 99795 50344.5 5034450 894 99795 50344.5 5034450 -32674 32261 4469.3 446930 -126 126 2.1 210 -895 2 10885 99796 2.68768 299.68768 151.18768 15118.76876 2.68768 299.68768 151.18768 15118.76855 2.68768 299.68768 151.18768 15118.76800 2020-01-01 2020-01-02 2020-01-01 00:14:55 2020-01-02 03:43:16 2020-01-01 00:14:55.000 2020-01-02 03:43:16.000 895 99796 50345.5 5034550 895 99796 50345.5 5034550 -32673 32262 4470.3 447030 -125 127 3.1 310 -896 2 10886 99797 2.69069 299.69069 151.19069 15119.06906 2.69069 299.6907 151.19069 15119.06915 2.69069 299.69069 151.19069 15119.06900 2020-01-01 2020-01-02 2020-01-01 00:14:56 2020-01-02 03:43:17 2020-01-01 00:14:56.000 2020-01-02 03:43:17.000 896 99797 50346.5 5034650 896 99797 50346.5 5034650 -32672 32263 4471.3 447130 -128 127 1.54 154 -897 2 10887 99798 2.69369 299.69369 151.19369 15119.36936 2.69369 299.6937 151.19369 15119.36949 2.69369 299.69369 151.19369 15119.36900 2020-01-01 2020-01-02 2020-01-01 00:14:57 2020-01-02 03:43:18 2020-01-01 00:14:57.000 2020-01-02 03:43:18.000 897 99798 50347.5 5034750 897 99798 50347.5 5034750 -32671 32264 4472.3 447230 -128 127 -0.02 -2 -898 2 10888 99799 2.69669 299.69669 151.19669 15119.66966 2.69669 299.6967 151.19669 15119.66963 2.69669 299.69669 151.19669 15119.66900 2020-01-01 2020-01-02 2020-01-01 00:14:58 2020-01-02 03:43:19 2020-01-01 00:14:58.000 2020-01-02 03:43:19.000 898 99799 50348.5 5034850 898 99799 50348.5 5034850 -32670 32265 4473.3 447330 -128 123 -1.58 -158 -899 2 10889 99800 2.69969 299.69969 151.19969 15119.96996 2.69969 299.6997 151.1997 15119.97038 2.69969 299.69969 151.19969 15119.96900 2020-01-01 2020-01-02 2020-01-01 00:14:59 2020-01-02 03:43:20 2020-01-01 00:14:59.000 2020-01-02 03:43:20.000 899 99800 50349.5 5034950 899 99800 50349.5 5034950 -32669 32266 4474.3 447430 -127 124 -0.58 -58 +890 2 10880 99791 2.67267 299.67267 151.17267 15117.26726 2.67267 299.67267 151.17267 15117.26708 2.67267 299.67267 151.17267 15117.267 2020-01-01 2020-01-02 2020-01-01 00:14:50 2020-01-02 03:43:11 2020-01-01 00:14:50.000 2020-01-02 03:43:11.000 890 99791 50340.5 5034050 890 99791 50340.5 5034050 -32678 32257 4465.3 446530 -128 127 3.22 322 +891 2 10881 99792 2.67567 299.67567 151.17567 15117.56756 2.67567 299.6757 151.17567 15117.56768 2.67567 299.67567 151.17567 15117.567 2020-01-01 2020-01-02 2020-01-01 00:14:51 2020-01-02 03:43:12 2020-01-01 00:14:51.000 2020-01-02 03:43:12.000 891 99792 50341.5 5034150 891 99792 50341.5 5034150 -32677 32258 4466.3 446630 -128 127 1.66 166 +892 2 10882 99793 2.67867 299.67867 151.17867 15117.86786 2.67867 299.67868 151.17868 15117.86802 2.67867 299.67867 151.17867 15117.867 2020-01-01 2020-01-02 2020-01-01 00:14:52 2020-01-02 03:43:13 2020-01-01 00:14:52.000 2020-01-02 03:43:13.000 892 99793 50342.5 5034250 892 99793 50342.5 5034250 -32676 32259 4467.3 446730 -128 124 0.1 10 +893 2 10883 99794 2.68168 299.68168 151.18168 15118.16816 2.68168 299.68167 151.18168 15118.16816 2.68168 299.68168 151.18168 15118.168 2020-01-01 2020-01-02 2020-01-01 00:14:53 2020-01-02 03:43:14 2020-01-01 00:14:53.000 2020-01-02 03:43:14.000 893 99794 50343.5 5034350 893 99794 50343.5 5034350 -32675 32260 4468.3 446830 -127 125 1.1 110 +894 2 10884 99795 2.68468 299.68468 151.18468 15118.46846 2.68468 299.6847 151.18468 15118.46826 2.68468 299.68468 151.18468000000001 15118.468 2020-01-01 2020-01-02 2020-01-01 00:14:54 2020-01-02 03:43:15 2020-01-01 00:14:54.000 2020-01-02 03:43:15.000 894 99795 50344.5 5034450 894 99795 50344.5 5034450 -32674 32261 4469.3 446930 -126 126 2.1 210 +895 2 10885 99796 2.68768 299.68768 151.18768 15118.76876 2.68768 299.68768 151.18768 15118.76855 2.68768 299.68768 151.18768 15118.768 2020-01-01 2020-01-02 2020-01-01 00:14:55 2020-01-02 03:43:16 2020-01-01 00:14:55.000 2020-01-02 03:43:16.000 895 99796 50345.5 5034550 895 99796 50345.5 5034550 -32673 32262 4470.3 447030 -125 127 3.1 310 +896 2 10886 99797 2.69069 299.69069 151.19069 15119.06906 2.69069 299.6907 151.19069 15119.06915 2.69069 299.69069 151.19069 15119.069 2020-01-01 2020-01-02 2020-01-01 00:14:56 2020-01-02 03:43:17 2020-01-01 00:14:56.000 2020-01-02 03:43:17.000 896 99797 50346.5 5034650 896 99797 50346.5 5034650 -32672 32263 4471.3 447130 -128 127 1.54 154 +897 2 10887 99798 2.69369 299.69369 151.19369 15119.36936 2.69369 299.6937 151.19369 15119.36949 2.69369 299.69369 151.19369 15119.369 2020-01-01 2020-01-02 2020-01-01 00:14:57 2020-01-02 03:43:18 2020-01-01 00:14:57.000 2020-01-02 03:43:18.000 897 99798 50347.5 5034750 897 99798 50347.5 5034750 -32671 32264 4472.3 447230 -128 127 -0.02 -2 +898 2 10888 99799 2.69669 299.69669 151.19669 15119.66966 2.69669 299.6967 151.19669 15119.66963 2.69669 299.69669 151.19669 15119.669 2020-01-01 2020-01-02 2020-01-01 00:14:58 2020-01-02 03:43:19 2020-01-01 00:14:58.000 2020-01-02 03:43:19.000 898 99799 50348.5 5034850 898 99799 50348.5 5034850 -32670 32265 4473.3 447330 -128 123 -1.58 -158 +899 2 10889 99800 2.69969 299.69969 151.19969 15119.96996 2.69969 299.6997 151.1997 15119.97038 2.69969 299.69969 151.19969 15119.969 2020-01-01 2020-01-02 2020-01-01 00:14:59 2020-01-02 03:43:20 2020-01-01 00:14:59.000 2020-01-02 03:43:20.000 899 99800 50349.5 5034950 899 99800 50349.5 5034950 -32669 32266 4474.3 447430 -127 124 -0.58 -58 9 2 1008 9999 0.02702 300.02702 150.02702 15152.72972 0.02702 300.02704 150.02702 15152.72966 0.02702 300.02702 150.02702 15152.72902 2020-01-01 2020-01-02 2020-01-01 00:00:09 2020-01-02 03:45:09 2020-01-01 00:00:09.000 2020-01-02 03:45:09.000 9 99909 49959 5045859 9 99909 49959 5045859 -32560 32375 4538.009900990099 458339 -124 127 0.9801980198019802 99 90 2 10080 99990 0.27027 300.27027 150.27027 15177.29729 0.27027 300.27026 150.27026 15177.29694 0.27027 300.27027 150.27026999999998 15177.29727 2020-01-01 2020-01-02 2020-01-01 00:01:30 2020-01-02 03:46:30 2020-01-01 00:01:30.000 2020-01-02 03:46:30.000 90 99990 50040 5054040 90 99990 50040 5054040 -32479 32456 4619.009900990099 466520 -124 127 0.8712871287128713 88 -900 2 10890 99801 2.7027 299.7027 151.2027 15120.27027 2.7027 299.7027 151.2027 15120.27003 2.70270 299.70270 151.2027 15120.27000 2020-01-01 2020-01-02 2020-01-01 00:15:00 2020-01-02 03:43:21 2020-01-01 00:15:00.000 2020-01-02 03:43:21.000 900 99801 50350.5 5035050 900 99801 50350.5 5035050 -32668 32267 4475.3 447530 -126 125 0.42 42 -901 2 10891 99802 2.7057 299.7057 151.2057 15120.57057 2.7057 299.70572 151.2057 15120.57066 2.70570 299.70570 151.2057 15120.57000 2020-01-01 2020-01-02 2020-01-01 00:15:01 2020-01-02 03:43:22 2020-01-01 00:15:01.000 2020-01-02 03:43:22.000 901 99802 50351.5 5035150 901 99802 50351.5 5035150 -32667 32268 4476.3 447630 -125 126 1.42 142 -902 2 10892 99803 2.7087 299.7087 151.2087 15120.87087 2.7087 299.7087 151.2087 15120.87095 2.70870 299.70870 151.20870000000002 15120.87000 2020-01-01 2020-01-02 2020-01-01 00:15:02 2020-01-02 03:43:23 2020-01-01 00:15:02.000 2020-01-02 03:43:23.000 902 99803 50352.5 5035250 902 99803 50352.5 5035250 -32666 32269 4477.3 447730 -124 127 2.42 242 -903 2 10893 99804 2.71171 299.71171 151.21171 15121.17117 2.71171 299.7117 151.21171 15121.1711 2.71171 299.71171 151.21171 15121.17100 2020-01-01 2020-01-02 2020-01-01 00:15:03 2020-01-02 03:43:24 2020-01-01 00:15:03.000 2020-01-02 03:43:24.000 903 99804 50353.5 5035350 903 99804 50353.5 5035350 -32665 32270 4478.3 447830 -128 127 0.86 86 -904 2 10894 99805 2.71471 299.71471 151.21471 15121.47147 2.71471 299.71472 151.21471 15121.47185 2.71471 299.71471 151.21471 15121.47100 2020-01-01 2020-01-02 2020-01-01 00:15:04 2020-01-02 03:43:25 2020-01-01 00:15:04.000 2020-01-02 03:43:25.000 904 99805 50354.5 5035450 904 99805 50354.5 5035450 -32664 32271 4479.3 447930 -128 123 -0.7 -70 -905 2 10895 99806 2.71771 299.71771 151.21771 15121.77177 2.71771 299.7177 151.21771 15121.77149 2.71771 299.71771 151.21771 15121.77100 2020-01-01 2020-01-02 2020-01-01 00:15:05 2020-01-02 03:43:26 2020-01-01 00:15:05.000 2020-01-02 03:43:26.000 905 99806 50355.5 5035550 905 99806 50355.5 5035550 -32663 32272 4480.3 448030 -127 124 0.3 30 -906 2 10896 99807 2.72072 299.72072 151.22072 15122.07207 2.72072 299.72073 151.22072 15122.07212 2.72072 299.72072 151.22072 15122.07200 2020-01-01 2020-01-02 2020-01-01 00:15:06 2020-01-02 03:43:27 2020-01-01 00:15:06.000 2020-01-02 03:43:27.000 906 99807 50356.5 5035650 906 99807 50356.5 5035650 -32662 32273 4481.3 448130 -126 125 1.3 130 -907 2 10897 99808 2.72372 299.72372 151.22372 15122.37237 2.72372 299.72372 151.22372 15122.37243 2.72372 299.72372 151.22372 15122.37200 2020-01-01 2020-01-02 2020-01-01 00:15:07 2020-01-02 03:43:28 2020-01-01 00:15:07.000 2020-01-02 03:43:28.000 907 99808 50357.5 5035750 907 99808 50357.5 5035750 -32661 32274 4482.3 448230 -125 126 2.3 230 -908 2 10898 99809 2.72672 299.72672 151.22672 15122.67267 2.72672 299.7267 151.22672 15122.67272 2.72672 299.72672 151.22672 15122.67200 2020-01-01 2020-01-02 2020-01-01 00:15:08 2020-01-02 03:43:29 2020-01-01 00:15:08.000 2020-01-02 03:43:29.000 908 99809 50358.5 5035850 908 99809 50358.5 5035850 -32660 32275 4483.3 448330 -124 127 3.3 330 -909 2 10899 99810 2.72972 299.72972 151.22972 15122.97297 2.72972 299.72974 151.22973 15122.97332 2.72972 299.72972 151.22972 15122.97200 2020-01-01 2020-01-02 2020-01-01 00:15:09 2020-01-02 03:43:30 2020-01-01 00:15:09.000 2020-01-02 03:43:30.000 909 99810 50359.5 5035950 909 99810 50359.5 5035950 -32659 32276 4484.3 448430 -128 127 1.74 174 +900 2 10890 99801 2.7027 299.7027 151.2027 15120.27027 2.7027 299.7027 151.2027 15120.27003 2.7027 299.7027 151.2027 15120.27 2020-01-01 2020-01-02 2020-01-01 00:15:00 2020-01-02 03:43:21 2020-01-01 00:15:00.000 2020-01-02 03:43:21.000 900 99801 50350.5 5035050 900 99801 50350.5 5035050 -32668 32267 4475.3 447530 -126 125 0.42 42 +901 2 10891 99802 2.7057 299.7057 151.2057 15120.57057 2.7057 299.70572 151.2057 15120.57066 2.7057 299.7057 151.2057 15120.57 2020-01-01 2020-01-02 2020-01-01 00:15:01 2020-01-02 03:43:22 2020-01-01 00:15:01.000 2020-01-02 03:43:22.000 901 99802 50351.5 5035150 901 99802 50351.5 5035150 -32667 32268 4476.3 447630 -125 126 1.42 142 +902 2 10892 99803 2.7087 299.7087 151.2087 15120.87087 2.7087 299.7087 151.2087 15120.87095 2.7087 299.7087 151.20870000000002 15120.87 2020-01-01 2020-01-02 2020-01-01 00:15:02 2020-01-02 03:43:23 2020-01-01 00:15:02.000 2020-01-02 03:43:23.000 902 99803 50352.5 5035250 902 99803 50352.5 5035250 -32666 32269 4477.3 447730 -124 127 2.42 242 +903 2 10893 99804 2.71171 299.71171 151.21171 15121.17117 2.71171 299.7117 151.21171 15121.1711 2.71171 299.71171 151.21171 15121.171 2020-01-01 2020-01-02 2020-01-01 00:15:03 2020-01-02 03:43:24 2020-01-01 00:15:03.000 2020-01-02 03:43:24.000 903 99804 50353.5 5035350 903 99804 50353.5 5035350 -32665 32270 4478.3 447830 -128 127 0.86 86 +904 2 10894 99805 2.71471 299.71471 151.21471 15121.47147 2.71471 299.71472 151.21471 15121.47185 2.71471 299.71471 151.21471 15121.471 2020-01-01 2020-01-02 2020-01-01 00:15:04 2020-01-02 03:43:25 2020-01-01 00:15:04.000 2020-01-02 03:43:25.000 904 99805 50354.5 5035450 904 99805 50354.5 5035450 -32664 32271 4479.3 447930 -128 123 -0.7 -70 +905 2 10895 99806 2.71771 299.71771 151.21771 15121.77177 2.71771 299.7177 151.21771 15121.77149 2.71771 299.71771 151.21771 15121.771 2020-01-01 2020-01-02 2020-01-01 00:15:05 2020-01-02 03:43:26 2020-01-01 00:15:05.000 2020-01-02 03:43:26.000 905 99806 50355.5 5035550 905 99806 50355.5 5035550 -32663 32272 4480.3 448030 -127 124 0.3 30 +906 2 10896 99807 2.72072 299.72072 151.22072 15122.07207 2.72072 299.72073 151.22072 15122.07212 2.72072 299.72072 151.22072 15122.072 2020-01-01 2020-01-02 2020-01-01 00:15:06 2020-01-02 03:43:27 2020-01-01 00:15:06.000 2020-01-02 03:43:27.000 906 99807 50356.5 5035650 906 99807 50356.5 5035650 -32662 32273 4481.3 448130 -126 125 1.3 130 +907 2 10897 99808 2.72372 299.72372 151.22372 15122.37237 2.72372 299.72372 151.22372 15122.37243 2.72372 299.72372 151.22372 15122.372 2020-01-01 2020-01-02 2020-01-01 00:15:07 2020-01-02 03:43:28 2020-01-01 00:15:07.000 2020-01-02 03:43:28.000 907 99808 50357.5 5035750 907 99808 50357.5 5035750 -32661 32274 4482.3 448230 -125 126 2.3 230 +908 2 10898 99809 2.72672 299.72672 151.22672 15122.67267 2.72672 299.7267 151.22672 15122.67272 2.72672 299.72672 151.22672 15122.672 2020-01-01 2020-01-02 2020-01-01 00:15:08 2020-01-02 03:43:29 2020-01-01 00:15:08.000 2020-01-02 03:43:29.000 908 99809 50358.5 5035850 908 99809 50358.5 5035850 -32660 32275 4483.3 448330 -124 127 3.3 330 +909 2 10899 99810 2.72972 299.72972 151.22972 15122.97297 2.72972 299.72974 151.22973 15122.97332 2.72972 299.72972 151.22972 15122.972 2020-01-01 2020-01-02 2020-01-01 00:15:09 2020-01-02 03:43:30 2020-01-01 00:15:09.000 2020-01-02 03:43:30.000 909 99810 50359.5 5035950 909 99810 50359.5 5035950 -32659 32276 4484.3 448430 -128 127 1.74 174 91 2 10081 99991 0.27327 300.27327 150.27327 15177.6006 0.27327 300.2733 150.27327 15177.60054 0.27327 300.27327 150.27327 15177.60027 2020-01-01 2020-01-02 2020-01-01 00:01:31 2020-01-02 03:46:31 2020-01-01 00:01:31.000 2020-01-02 03:46:31.000 91 99991 50041 5054141 91 99991 50041 5054141 -32478 32457 4620.009900990099 466621 -128 127 -0.6633663366336634 -67 -910 2 10900 99811 2.73273 299.73273 151.23273 15123.27327 2.73273 299.73273 151.23272 15123.27296 2.73273 299.73273 151.23273 15123.27300 2020-01-01 2020-01-02 2020-01-01 00:15:10 2020-01-02 03:43:31 2020-01-01 00:15:10.000 2020-01-02 03:43:31.000 910 99811 50360.5 5036050 910 99811 50360.5 5036050 -32658 32277 4485.3 448530 -128 123 0.18 18 -911 2 10901 99812 2.73573 299.73573 151.23573 15123.57357 2.73573 299.73575 151.23573 15123.57359 2.73573 299.73573 151.23573 15123.57300 2020-01-01 2020-01-02 2020-01-01 00:15:11 2020-01-02 03:43:32 2020-01-01 00:15:11.000 2020-01-02 03:43:32.000 911 99812 50361.5 5036150 911 99812 50361.5 5036150 -32657 32278 4486.3 448630 -127 124 1.18 118 -912 2 10902 99813 2.73873 299.73873 151.23873 15123.87387 2.73873 299.73874 151.23873 15123.8739 2.73873 299.73873 151.23873 15123.87300 2020-01-01 2020-01-02 2020-01-01 00:15:12 2020-01-02 03:43:33 2020-01-01 00:15:12.000 2020-01-02 03:43:33.000 912 99813 50362.5 5036250 912 99813 50362.5 5036250 -32656 32279 4487.3 448730 -126 125 2.18 218 -913 2 10903 99814 2.74174 299.74174 151.24174 15124.17417 2.74174 299.74173 151.24174 15124.17419 2.74174 299.74174 151.24174000000002 15124.17400 2020-01-01 2020-01-02 2020-01-01 00:15:13 2020-01-02 03:43:34 2020-01-01 00:15:13.000 2020-01-02 03:43:34.000 913 99814 50363.5 5036350 913 99814 50363.5 5036350 -32655 32280 4488.3 448830 -125 126 3.18 318 -914 2 10904 99815 2.74474 299.74474 151.24474 15124.47447 2.74474 299.74475 151.24474 15124.47479 2.74474 299.74474 151.24474 15124.47400 2020-01-01 2020-01-02 2020-01-01 00:15:14 2020-01-02 03:43:35 2020-01-01 00:15:14.000 2020-01-02 03:43:35.000 914 99815 50364.5 5036450 914 99815 50364.5 5036450 -32654 32281 4489.3 448930 -124 127 4.18 418 -915 2 10905 99816 2.74774 299.74774 151.24774 15124.77477 2.74774 299.74774 151.24774 15124.77447 2.74774 299.74774 151.24774 15124.77400 2020-01-01 2020-01-02 2020-01-01 00:15:15 2020-01-02 03:43:36 2020-01-01 00:15:15.000 2020-01-02 03:43:36.000 915 99816 50365.5 5036550 915 99816 50365.5 5036550 -32653 32282 4490.3 449030 -128 127 2.62 262 -916 2 10906 99817 2.75075 299.75075 151.25075 15125.07507 2.75075 299.75076 151.25075 15125.07507 2.75075 299.75075 151.25075 15125.07500 2020-01-01 2020-01-02 2020-01-01 00:15:16 2020-01-02 03:43:37 2020-01-01 00:15:16.000 2020-01-02 03:43:37.000 916 99817 50366.5 5036650 916 99817 50366.5 5036650 -32652 32283 4491.3 449130 -128 127 1.06 106 -917 2 10907 99818 2.75375 299.75375 151.25375 15125.37537 2.75375 299.75375 151.25375 15125.37536 2.75375 299.75375 151.25375 15125.37500 2020-01-01 2020-01-02 2020-01-01 00:15:17 2020-01-02 03:43:38 2020-01-01 00:15:17.000 2020-01-02 03:43:38.000 917 99818 50367.5 5036750 917 99818 50367.5 5036750 -32651 32284 4492.3 449230 -128 124 -0.5 -50 -918 2 10908 99819 2.75675 299.75675 151.25675 15125.67567 2.75675 299.75674 151.25675 15125.67566 2.75675 299.75675 151.25674999999998 15125.67500 2020-01-01 2020-01-02 2020-01-01 00:15:18 2020-01-02 03:43:39 2020-01-01 00:15:18.000 2020-01-02 03:43:39.000 918 99819 50368.5 5036850 918 99819 50368.5 5036850 -32650 32285 4493.3 449330 -127 125 0.5 50 -919 2 10909 99820 2.75975 299.75975 151.25975 15125.97597 2.75975 299.75977 151.25976 15125.97626 2.75975 299.75975 151.25975 15125.97500 2020-01-01 2020-01-02 2020-01-01 00:15:19 2020-01-02 03:43:40 2020-01-01 00:15:19.000 2020-01-02 03:43:40.000 919 99820 50369.5 5036950 919 99820 50369.5 5036950 -32649 32286 4494.3 449430 -126 126 1.5 150 +910 2 10900 99811 2.73273 299.73273 151.23273 15123.27327 2.73273 299.73273 151.23272 15123.27296 2.73273 299.73273 151.23273 15123.273 2020-01-01 2020-01-02 2020-01-01 00:15:10 2020-01-02 03:43:31 2020-01-01 00:15:10.000 2020-01-02 03:43:31.000 910 99811 50360.5 5036050 910 99811 50360.5 5036050 -32658 32277 4485.3 448530 -128 123 0.18 18 +911 2 10901 99812 2.73573 299.73573 151.23573 15123.57357 2.73573 299.73575 151.23573 15123.57359 2.73573 299.73573 151.23573 15123.573 2020-01-01 2020-01-02 2020-01-01 00:15:11 2020-01-02 03:43:32 2020-01-01 00:15:11.000 2020-01-02 03:43:32.000 911 99812 50361.5 5036150 911 99812 50361.5 5036150 -32657 32278 4486.3 448630 -127 124 1.18 118 +912 2 10902 99813 2.73873 299.73873 151.23873 15123.87387 2.73873 299.73874 151.23873 15123.8739 2.73873 299.73873 151.23873 15123.873 2020-01-01 2020-01-02 2020-01-01 00:15:12 2020-01-02 03:43:33 2020-01-01 00:15:12.000 2020-01-02 03:43:33.000 912 99813 50362.5 5036250 912 99813 50362.5 5036250 -32656 32279 4487.3 448730 -126 125 2.18 218 +913 2 10903 99814 2.74174 299.74174 151.24174 15124.17417 2.74174 299.74173 151.24174 15124.17419 2.74174 299.74174 151.24174000000002 15124.174 2020-01-01 2020-01-02 2020-01-01 00:15:13 2020-01-02 03:43:34 2020-01-01 00:15:13.000 2020-01-02 03:43:34.000 913 99814 50363.5 5036350 913 99814 50363.5 5036350 -32655 32280 4488.3 448830 -125 126 3.18 318 +914 2 10904 99815 2.74474 299.74474 151.24474 15124.47447 2.74474 299.74475 151.24474 15124.47479 2.74474 299.74474 151.24474 15124.474 2020-01-01 2020-01-02 2020-01-01 00:15:14 2020-01-02 03:43:35 2020-01-01 00:15:14.000 2020-01-02 03:43:35.000 914 99815 50364.5 5036450 914 99815 50364.5 5036450 -32654 32281 4489.3 448930 -124 127 4.18 418 +915 2 10905 99816 2.74774 299.74774 151.24774 15124.77477 2.74774 299.74774 151.24774 15124.77447 2.74774 299.74774 151.24774 15124.774 2020-01-01 2020-01-02 2020-01-01 00:15:15 2020-01-02 03:43:36 2020-01-01 00:15:15.000 2020-01-02 03:43:36.000 915 99816 50365.5 5036550 915 99816 50365.5 5036550 -32653 32282 4490.3 449030 -128 127 2.62 262 +916 2 10906 99817 2.75075 299.75075 151.25075 15125.07507 2.75075 299.75076 151.25075 15125.07507 2.75075 299.75075 151.25075 15125.075 2020-01-01 2020-01-02 2020-01-01 00:15:16 2020-01-02 03:43:37 2020-01-01 00:15:16.000 2020-01-02 03:43:37.000 916 99817 50366.5 5036650 916 99817 50366.5 5036650 -32652 32283 4491.3 449130 -128 127 1.06 106 +917 2 10907 99818 2.75375 299.75375 151.25375 15125.37537 2.75375 299.75375 151.25375 15125.37536 2.75375 299.75375 151.25375 15125.375 2020-01-01 2020-01-02 2020-01-01 00:15:17 2020-01-02 03:43:38 2020-01-01 00:15:17.000 2020-01-02 03:43:38.000 917 99818 50367.5 5036750 917 99818 50367.5 5036750 -32651 32284 4492.3 449230 -128 124 -0.5 -50 +918 2 10908 99819 2.75675 299.75675 151.25675 15125.67567 2.75675 299.75674 151.25675 15125.67566 2.75675 299.75675 151.25674999999998 15125.675 2020-01-01 2020-01-02 2020-01-01 00:15:18 2020-01-02 03:43:39 2020-01-01 00:15:18.000 2020-01-02 03:43:39.000 918 99819 50368.5 5036850 918 99819 50368.5 5036850 -32650 32285 4493.3 449330 -127 125 0.5 50 +919 2 10909 99820 2.75975 299.75975 151.25975 15125.97597 2.75975 299.75977 151.25976 15125.97626 2.75975 299.75975 151.25975 15125.975 2020-01-01 2020-01-02 2020-01-01 00:15:19 2020-01-02 03:43:40 2020-01-01 00:15:19.000 2020-01-02 03:43:40.000 919 99820 50369.5 5036950 919 99820 50369.5 5036950 -32649 32286 4494.3 449430 -126 126 1.5 150 92 2 10082 99992 0.27627 300.27627 150.27627 15177.9039 0.27627 300.27628 150.27627 15177.90384 0.27627 300.27627 150.27627 15177.90327 2020-01-01 2020-01-02 2020-01-01 00:01:32 2020-01-02 03:46:32 2020-01-01 00:01:32.000 2020-01-02 03:46:32.000 92 99992 50042 5054242 92 99992 50042 5054242 -32477 32458 4621.009900990099 466722 -128 123 -2.198019801980198 -222 -920 2 10910 99821 2.76276 299.76276 151.26276 15126.27627 2.76276 299.76276 151.26275 15126.27594 2.76276 299.76276 151.26276 15126.27600 2020-01-01 2020-01-02 2020-01-01 00:15:20 2020-01-02 03:43:41 2020-01-01 00:15:20.000 2020-01-02 03:43:41.000 920 99821 50370.5 5037050 920 99821 50370.5 5037050 -32648 32287 4495.3 449530 -125 127 2.5 250 -921 2 10911 99822 2.76576 299.76576 151.26576 15126.57657 2.76576 299.76578 151.26576 15126.57654 2.76576 299.76576 151.26576 15126.57600 2020-01-01 2020-01-02 2020-01-01 00:15:21 2020-01-02 03:43:42 2020-01-01 00:15:21.000 2020-01-02 03:43:42.000 921 99822 50371.5 5037150 921 99822 50371.5 5037150 -32647 32288 4496.3 449630 -128 127 0.94 94 -922 2 10912 99823 2.76876 299.76876 151.26876 15126.87687 2.76876 299.76877 151.26876 15126.87683 2.76876 299.76876 151.26876000000001 15126.87600 2020-01-01 2020-01-02 2020-01-01 00:15:22 2020-01-02 03:43:43 2020-01-01 00:15:22.000 2020-01-02 03:43:43.000 922 99823 50372.5 5037250 922 99823 50372.5 5037250 -32646 32289 4497.3 449730 -128 127 -0.62 -62 -923 2 10913 99824 2.77177 299.77177 151.27177 15127.17717 2.77177 299.77176 151.27177 15127.17713 2.77177 299.77177 151.27177 15127.17700 2020-01-01 2020-01-02 2020-01-01 00:15:23 2020-01-02 03:43:44 2020-01-01 00:15:23.000 2020-01-02 03:43:44.000 923 99824 50373.5 5037350 923 99824 50373.5 5037350 -32645 32290 4498.3 449830 -128 123 -2.18 -218 -924 2 10914 99825 2.77477 299.77477 151.27477 15127.47747 2.77477 299.77478 151.27477 15127.47776 2.77477 299.77477 151.27477000000002 15127.47700 2020-01-01 2020-01-02 2020-01-01 00:15:24 2020-01-02 03:43:45 2020-01-01 00:15:24.000 2020-01-02 03:43:45.000 924 99825 50374.5 5037450 924 99825 50374.5 5037450 -32644 32291 4499.3 449930 -127 124 -1.18 -118 -925 2 10915 99826 2.77777 299.77777 151.27777 15127.77777 2.77777 299.77777 151.27777 15127.77741 2.77777 299.77777 151.27777 15127.77700 2020-01-01 2020-01-02 2020-01-01 00:15:25 2020-01-02 03:43:46 2020-01-01 00:15:25.000 2020-01-02 03:43:46.000 925 99826 50375.5 5037550 925 99826 50375.5 5037550 -32643 32292 4500.3 450030 -126 125 -0.18 -18 -926 2 10916 99827 2.78078 299.78078 151.28078 15128.07807 2.78078 299.7808 151.28078 15128.078 2.78078 299.78078 151.28078 15128.07800 2020-01-01 2020-01-02 2020-01-01 00:15:26 2020-01-02 03:43:47 2020-01-01 00:15:26.000 2020-01-02 03:43:47.000 926 99827 50376.5 5037650 926 99827 50376.5 5037650 -32642 32293 4501.3 450130 -125 126 0.82 82 -927 2 10917 99828 2.78378 299.78378 151.28378 15128.37837 2.78378 299.78378 151.28378 15128.3783 2.78378 299.78378 151.28378 15128.37800 2020-01-01 2020-01-02 2020-01-01 00:15:27 2020-01-02 03:43:48 2020-01-01 00:15:27.000 2020-01-02 03:43:48.000 927 99828 50377.5 5037750 927 99828 50377.5 5037750 -32641 32294 4502.3 450230 -124 127 1.82 182 -928 2 10918 99829 2.78678 299.78678 151.28678 15128.67867 2.78678 299.78677 151.28678 15128.6786 2.78678 299.78678 151.28678 15128.67800 2020-01-01 2020-01-02 2020-01-01 00:15:28 2020-01-02 03:43:49 2020-01-01 00:15:28.000 2020-01-02 03:43:49.000 928 99829 50378.5 5037850 928 99829 50378.5 5037850 -32640 32295 4503.3 450330 -128 127 0.26 26 -929 2 10919 99830 2.78978 299.78978 151.28978 15128.97897 2.78978 299.7898 151.28979 15128.97923 2.78978 299.78978 151.28977999999998 15128.97800 2020-01-01 2020-01-02 2020-01-01 00:15:29 2020-01-02 03:43:50 2020-01-01 00:15:29.000 2020-01-02 03:43:50.000 929 99830 50379.5 5037950 929 99830 50379.5 5037950 -32639 32296 4504.3 450430 -128 123 -1.3 -130 +920 2 10910 99821 2.76276 299.76276 151.26276 15126.27627 2.76276 299.76276 151.26275 15126.27594 2.76276 299.76276 151.26276 15126.276 2020-01-01 2020-01-02 2020-01-01 00:15:20 2020-01-02 03:43:41 2020-01-01 00:15:20.000 2020-01-02 03:43:41.000 920 99821 50370.5 5037050 920 99821 50370.5 5037050 -32648 32287 4495.3 449530 -125 127 2.5 250 +921 2 10911 99822 2.76576 299.76576 151.26576 15126.57657 2.76576 299.76578 151.26576 15126.57654 2.76576 299.76576 151.26576 15126.576 2020-01-01 2020-01-02 2020-01-01 00:15:21 2020-01-02 03:43:42 2020-01-01 00:15:21.000 2020-01-02 03:43:42.000 921 99822 50371.5 5037150 921 99822 50371.5 5037150 -32647 32288 4496.3 449630 -128 127 0.94 94 +922 2 10912 99823 2.76876 299.76876 151.26876 15126.87687 2.76876 299.76877 151.26876 15126.87683 2.76876 299.76876 151.26876000000001 15126.876 2020-01-01 2020-01-02 2020-01-01 00:15:22 2020-01-02 03:43:43 2020-01-01 00:15:22.000 2020-01-02 03:43:43.000 922 99823 50372.5 5037250 922 99823 50372.5 5037250 -32646 32289 4497.3 449730 -128 127 -0.62 -62 +923 2 10913 99824 2.77177 299.77177 151.27177 15127.17717 2.77177 299.77176 151.27177 15127.17713 2.77177 299.77177 151.27177 15127.177 2020-01-01 2020-01-02 2020-01-01 00:15:23 2020-01-02 03:43:44 2020-01-01 00:15:23.000 2020-01-02 03:43:44.000 923 99824 50373.5 5037350 923 99824 50373.5 5037350 -32645 32290 4498.3 449830 -128 123 -2.18 -218 +924 2 10914 99825 2.77477 299.77477 151.27477 15127.47747 2.77477 299.77478 151.27477 15127.47776 2.77477 299.77477 151.27477000000002 15127.477 2020-01-01 2020-01-02 2020-01-01 00:15:24 2020-01-02 03:43:45 2020-01-01 00:15:24.000 2020-01-02 03:43:45.000 924 99825 50374.5 5037450 924 99825 50374.5 5037450 -32644 32291 4499.3 449930 -127 124 -1.18 -118 +925 2 10915 99826 2.77777 299.77777 151.27777 15127.77777 2.77777 299.77777 151.27777 15127.77741 2.77777 299.77777 151.27777 15127.777 2020-01-01 2020-01-02 2020-01-01 00:15:25 2020-01-02 03:43:46 2020-01-01 00:15:25.000 2020-01-02 03:43:46.000 925 99826 50375.5 5037550 925 99826 50375.5 5037550 -32643 32292 4500.3 450030 -126 125 -0.18 -18 +926 2 10916 99827 2.78078 299.78078 151.28078 15128.07807 2.78078 299.7808 151.28078 15128.078 2.78078 299.78078 151.28078 15128.078 2020-01-01 2020-01-02 2020-01-01 00:15:26 2020-01-02 03:43:47 2020-01-01 00:15:26.000 2020-01-02 03:43:47.000 926 99827 50376.5 5037650 926 99827 50376.5 5037650 -32642 32293 4501.3 450130 -125 126 0.82 82 +927 2 10917 99828 2.78378 299.78378 151.28378 15128.37837 2.78378 299.78378 151.28378 15128.3783 2.78378 299.78378 151.28378 15128.378 2020-01-01 2020-01-02 2020-01-01 00:15:27 2020-01-02 03:43:48 2020-01-01 00:15:27.000 2020-01-02 03:43:48.000 927 99828 50377.5 5037750 927 99828 50377.5 5037750 -32641 32294 4502.3 450230 -124 127 1.82 182 +928 2 10918 99829 2.78678 299.78678 151.28678 15128.67867 2.78678 299.78677 151.28678 15128.6786 2.78678 299.78678 151.28678 15128.678 2020-01-01 2020-01-02 2020-01-01 00:15:28 2020-01-02 03:43:49 2020-01-01 00:15:28.000 2020-01-02 03:43:49.000 928 99829 50378.5 5037850 928 99829 50378.5 5037850 -32640 32295 4503.3 450330 -128 127 0.26 26 +929 2 10919 99830 2.78978 299.78978 151.28978 15128.97897 2.78978 299.7898 151.28979 15128.97923 2.78978 299.78978 151.28977999999998 15128.978 2020-01-01 2020-01-02 2020-01-01 00:15:29 2020-01-02 03:43:50 2020-01-01 00:15:29.000 2020-01-02 03:43:50.000 929 99830 50379.5 5037950 929 99830 50379.5 5037950 -32639 32296 4504.3 450430 -128 123 -1.3 -130 93 2 10083 99993 0.27927 300.27927 150.27927 15178.2072 0.27927 300.27927 150.27927 15178.20715 0.27927 300.27927 150.27927 15178.20627 2020-01-01 2020-01-02 2020-01-01 00:01:33 2020-01-02 03:46:33 2020-01-01 00:01:33.000 2020-01-02 03:46:33.000 93 99993 50043 5054343 93 99993 50043 5054343 -32476 32459 4622.009900990099 466823 -127 124 -1.198019801980198 -121 -930 2 10920 99831 2.79279 299.79279 151.29279 15129.27927 2.79279 299.7928 151.29278 15129.27888 2.79279 299.79279 151.29279 15129.27900 2020-01-01 2020-01-02 2020-01-01 00:15:30 2020-01-02 03:43:51 2020-01-01 00:15:30.000 2020-01-02 03:43:51.000 930 99831 50380.5 5038050 930 99831 50380.5 5038050 -32638 32297 4505.3 450530 -127 124 -0.3 -30 -931 2 10921 99832 2.79579 299.79579 151.29579 15129.57957 2.79579 299.7958 151.29579 15129.57963 2.79579 299.79579 151.29579 15129.57900 2020-01-01 2020-01-02 2020-01-01 00:15:31 2020-01-02 03:43:52 2020-01-01 00:15:31.000 2020-01-02 03:43:52.000 931 99832 50381.5 5038150 931 99832 50381.5 5038150 -32637 32298 4506.3 450630 -126 125 0.7 70 -932 2 10922 99833 2.79879 299.79879 151.29879 15129.87987 2.79879 299.7988 151.29879 15129.87977 2.79879 299.79879 151.29879 15129.87900 2020-01-01 2020-01-02 2020-01-01 00:15:32 2020-01-02 03:43:53 2020-01-01 00:15:32.000 2020-01-02 03:43:53.000 932 99833 50382.5 5038250 932 99833 50382.5 5038250 -32636 32299 4507.3 450730 -125 126 1.7 170 -933 2 10923 99834 2.8018 299.8018 151.3018 15130.18018 2.8018 299.8018 151.3018 15130.18011 2.80180 299.80180 151.30180000000001 15130.18000 2020-01-01 2020-01-02 2020-01-01 00:15:33 2020-01-02 03:43:54 2020-01-01 00:15:33.000 2020-01-02 03:43:54.000 933 99834 50383.5 5038350 933 99834 50383.5 5038350 -32635 32300 4508.3 450830 -124 127 2.7 270 -934 2 10924 99835 2.8048 299.8048 151.3048 15130.48048 2.8048 299.8048 151.3048 15130.48071 2.80480 299.80480 151.3048 15130.48000 2020-01-01 2020-01-02 2020-01-01 00:15:34 2020-01-02 03:43:55 2020-01-01 00:15:34.000 2020-01-02 03:43:55.000 934 99835 50384.5 5038450 934 99835 50384.5 5038450 -32634 32301 4509.3 450930 -128 127 1.14 114 -935 2 10925 99836 2.8078 299.8078 151.3078 15130.78078 2.8078 299.8078 151.3078 15130.78034 2.80780 299.80780 151.30780000000001 15130.78000 2020-01-01 2020-01-02 2020-01-01 00:15:35 2020-01-02 03:43:56 2020-01-01 00:15:35.000 2020-01-02 03:43:56.000 935 99836 50385.5 5038550 935 99836 50385.5 5038550 -32633 32302 4510.3 451030 -128 123 -0.42 -42 -936 2 10926 99837 2.81081 299.81081 151.31081 15131.08108 2.81081 299.81082 151.31081 15131.0811 2.81081 299.81081 151.31081 15131.08100 2020-01-01 2020-01-02 2020-01-01 00:15:36 2020-01-02 03:43:57 2020-01-01 00:15:36.000 2020-01-02 03:43:57.000 936 99837 50386.5 5038650 936 99837 50386.5 5038650 -32632 32303 4511.3 451130 -127 124 0.58 58 -937 2 10927 99838 2.81381 299.81381 151.31381 15131.38138 2.81381 299.8138 151.31381 15131.38124 2.81381 299.81381 151.31381 15131.38100 2020-01-01 2020-01-02 2020-01-01 00:15:37 2020-01-02 03:43:58 2020-01-01 00:15:37.000 2020-01-02 03:43:58.000 937 99838 50387.5 5038750 937 99838 50387.5 5038750 -32631 32304 4512.3 451230 -126 125 1.58 158 -938 2 10928 99839 2.81681 299.81681 151.31681 15131.68168 2.81681 299.8168 151.31681 15131.68157 2.81681 299.81681 151.31681 15131.68100 2020-01-01 2020-01-02 2020-01-01 00:15:38 2020-01-02 03:43:59 2020-01-01 00:15:38.000 2020-01-02 03:43:59.000 938 99839 50388.5 5038850 938 99839 50388.5 5038850 -32630 32305 4513.3 451330 -125 126 2.58 258 -939 2 10929 99840 2.81981 299.81981 151.31981 15131.98198 2.81982 299.81982 151.31982 15131.98217 2.81981 299.81981 151.31981 15131.98100 2020-01-01 2020-01-02 2020-01-01 00:15:39 2020-01-02 03:44:00 2020-01-01 00:15:39.000 2020-01-02 03:44:00.000 939 99840 50389.5 5038950 939 99840 50389.5 5038950 -32629 32306 4514.3 451430 -124 127 3.58 358 +930 2 10920 99831 2.79279 299.79279 151.29279 15129.27927 2.79279 299.7928 151.29278 15129.27888 2.79279 299.79279 151.29279 15129.279 2020-01-01 2020-01-02 2020-01-01 00:15:30 2020-01-02 03:43:51 2020-01-01 00:15:30.000 2020-01-02 03:43:51.000 930 99831 50380.5 5038050 930 99831 50380.5 5038050 -32638 32297 4505.3 450530 -127 124 -0.3 -30 +931 2 10921 99832 2.79579 299.79579 151.29579 15129.57957 2.79579 299.7958 151.29579 15129.57963 2.79579 299.79579 151.29579 15129.579 2020-01-01 2020-01-02 2020-01-01 00:15:31 2020-01-02 03:43:52 2020-01-01 00:15:31.000 2020-01-02 03:43:52.000 931 99832 50381.5 5038150 931 99832 50381.5 5038150 -32637 32298 4506.3 450630 -126 125 0.7 70 +932 2 10922 99833 2.79879 299.79879 151.29879 15129.87987 2.79879 299.7988 151.29879 15129.87977 2.79879 299.79879 151.29879 15129.879 2020-01-01 2020-01-02 2020-01-01 00:15:32 2020-01-02 03:43:53 2020-01-01 00:15:32.000 2020-01-02 03:43:53.000 932 99833 50382.5 5038250 932 99833 50382.5 5038250 -32636 32299 4507.3 450730 -125 126 1.7 170 +933 2 10923 99834 2.8018 299.8018 151.3018 15130.18018 2.8018 299.8018 151.3018 15130.18011 2.8018 299.8018 151.30180000000001 15130.18 2020-01-01 2020-01-02 2020-01-01 00:15:33 2020-01-02 03:43:54 2020-01-01 00:15:33.000 2020-01-02 03:43:54.000 933 99834 50383.5 5038350 933 99834 50383.5 5038350 -32635 32300 4508.3 450830 -124 127 2.7 270 +934 2 10924 99835 2.8048 299.8048 151.3048 15130.48048 2.8048 299.8048 151.3048 15130.48071 2.8048 299.8048 151.3048 15130.48 2020-01-01 2020-01-02 2020-01-01 00:15:34 2020-01-02 03:43:55 2020-01-01 00:15:34.000 2020-01-02 03:43:55.000 934 99835 50384.5 5038450 934 99835 50384.5 5038450 -32634 32301 4509.3 450930 -128 127 1.14 114 +935 2 10925 99836 2.8078 299.8078 151.3078 15130.78078 2.8078 299.8078 151.3078 15130.78034 2.8078 299.8078 151.30780000000001 15130.78 2020-01-01 2020-01-02 2020-01-01 00:15:35 2020-01-02 03:43:56 2020-01-01 00:15:35.000 2020-01-02 03:43:56.000 935 99836 50385.5 5038550 935 99836 50385.5 5038550 -32633 32302 4510.3 451030 -128 123 -0.42 -42 +936 2 10926 99837 2.81081 299.81081 151.31081 15131.08108 2.81081 299.81082 151.31081 15131.0811 2.81081 299.81081 151.31081 15131.081 2020-01-01 2020-01-02 2020-01-01 00:15:36 2020-01-02 03:43:57 2020-01-01 00:15:36.000 2020-01-02 03:43:57.000 936 99837 50386.5 5038650 936 99837 50386.5 5038650 -32632 32303 4511.3 451130 -127 124 0.58 58 +937 2 10927 99838 2.81381 299.81381 151.31381 15131.38138 2.81381 299.8138 151.31381 15131.38124 2.81381 299.81381 151.31381 15131.381 2020-01-01 2020-01-02 2020-01-01 00:15:37 2020-01-02 03:43:58 2020-01-01 00:15:37.000 2020-01-02 03:43:58.000 937 99838 50387.5 5038750 937 99838 50387.5 5038750 -32631 32304 4512.3 451230 -126 125 1.58 158 +938 2 10928 99839 2.81681 299.81681 151.31681 15131.68168 2.81681 299.8168 151.31681 15131.68157 2.81681 299.81681 151.31681 15131.681 2020-01-01 2020-01-02 2020-01-01 00:15:38 2020-01-02 03:43:59 2020-01-01 00:15:38.000 2020-01-02 03:43:59.000 938 99839 50388.5 5038850 938 99839 50388.5 5038850 -32630 32305 4513.3 451330 -125 126 2.58 258 +939 2 10929 99840 2.81981 299.81981 151.31981 15131.98198 2.81982 299.81982 151.31982 15131.98217 2.81981 299.81981 151.31981 15131.981 2020-01-01 2020-01-02 2020-01-01 00:15:39 2020-01-02 03:44:00 2020-01-01 00:15:39.000 2020-01-02 03:44:00.000 939 99840 50389.5 5038950 939 99840 50389.5 5038950 -32629 32306 4514.3 451430 -124 127 3.58 358 94 2 10084 99994 0.28228 300.28228 150.28228 15178.51051 0.28228 300.2823 150.28228 15178.51078 0.28228 300.28228 150.28228000000001 15178.51028 2020-01-01 2020-01-02 2020-01-01 00:01:34 2020-01-02 03:46:34 2020-01-01 00:01:34.000 2020-01-02 03:46:34.000 94 99994 50044 5054444 94 99994 50044 5054444 -32475 32460 4623.009900990099 466924 -126 125 -0.19801980198019803 -20 -940 2 10930 99841 2.82282 299.82282 151.32282 15132.28228 2.82282 299.8228 151.32282 15132.28247 2.82282 299.82282 151.32281999999998 15132.28200 2020-01-01 2020-01-02 2020-01-01 00:15:40 2020-01-02 03:44:01 2020-01-01 00:15:40.000 2020-01-02 03:44:01.000 940 99841 50390.5 5039050 940 99841 50390.5 5039050 -32628 32307 4515.3 451530 -128 127 2.02 202 -941 2 10931 99842 2.82582 299.82582 151.32582 15132.58258 2.82582 299.82584 151.32582 15132.58257 2.82582 299.82582 151.32582 15132.58200 2020-01-01 2020-01-02 2020-01-01 00:15:41 2020-01-02 03:44:02 2020-01-01 00:15:41.000 2020-01-02 03:44:02.000 941 99842 50391.5 5039150 941 99842 50391.5 5039150 -32627 32308 4516.3 451630 -128 127 0.46 46 -942 2 10932 99843 2.82882 299.82882 151.32882 15132.88288 2.82882 299.82883 151.32882 15132.88275 2.82882 299.82882 151.32882 15132.88200 2020-01-01 2020-01-02 2020-01-01 00:15:42 2020-01-02 03:44:03 2020-01-01 00:15:42.000 2020-01-02 03:44:03.000 942 99843 50392.5 5039250 942 99843 50392.5 5039250 -32626 32309 4517.3 451730 -128 124 -1.1 -110 -943 2 10933 99844 2.83183 299.83183 151.33183 15133.18318 2.83183 299.83182 151.33183 15133.18304 2.83183 299.83183 151.33183 15133.18300 2020-01-01 2020-01-02 2020-01-01 00:15:43 2020-01-02 03:44:04 2020-01-01 00:15:43.000 2020-01-02 03:44:04.000 943 99844 50393.5 5039350 943 99844 50393.5 5039350 -32625 32310 4518.3 451830 -127 125 -0.1 -10 -944 2 10934 99845 2.83483 299.83483 151.33483 15133.48348 2.83483 299.83484 151.33483 15133.48364 2.83483 299.83483 151.33483 15133.48300 2020-01-01 2020-01-02 2020-01-01 00:15:44 2020-01-02 03:44:05 2020-01-01 00:15:44.000 2020-01-02 03:44:05.000 944 99845 50394.5 5039450 944 99845 50394.5 5039450 -32624 32311 4519.3 451930 -126 126 0.9 90 -945 2 10935 99846 2.83783 299.83783 151.33783 15133.78378 2.83783 299.83783 151.33783 15133.78393 2.83783 299.83783 151.33783 15133.78300 2020-01-01 2020-01-02 2020-01-01 00:15:45 2020-01-02 03:44:06 2020-01-01 00:15:45.000 2020-01-02 03:44:06.000 945 99846 50395.5 5039550 945 99846 50395.5 5039550 -32623 32312 4520.3 452030 -125 127 1.9 190 -946 2 10936 99847 2.84084 299.84084 151.34084 15134.08408 2.84084 299.84085 151.34084 15134.08404 2.84084 299.84084 151.34084000000001 15134.08400 2020-01-01 2020-01-02 2020-01-01 00:15:46 2020-01-02 03:44:07 2020-01-01 00:15:46.000 2020-01-02 03:44:07.000 946 99847 50396.5 5039650 946 99847 50396.5 5039650 -32622 32313 4521.3 452130 -128 127 0.34 34 -947 2 10937 99848 2.84384 299.84384 151.34384 15134.38438 2.84384 299.84384 151.34384 15134.38421 2.84384 299.84384 151.34384 15134.38400 2020-01-01 2020-01-02 2020-01-01 00:15:47 2020-01-02 03:44:08 2020-01-01 00:15:47.000 2020-01-02 03:44:08.000 947 99848 50397.5 5039750 947 99848 50397.5 5039750 -32621 32314 4522.3 452230 -128 127 -1.22 -122 -948 2 10938 99849 2.84684 299.84684 151.34684 15134.68468 2.84684 299.84683 151.34684 15134.68452 2.84684 299.84684 151.34684 15134.68400 2020-01-01 2020-01-02 2020-01-01 00:15:48 2020-01-02 03:44:09 2020-01-01 00:15:48.000 2020-01-02 03:44:09.000 948 99849 50398.5 5039850 948 99849 50398.5 5039850 -32620 32315 4523.3 452330 -128 123 -2.78 -278 -949 2 10939 99850 2.84984 299.84984 151.34984 15134.98498 2.84985 299.84985 151.34985 15134.98527 2.84984 299.84984 151.34984 15134.98400 2020-01-01 2020-01-02 2020-01-01 00:15:49 2020-01-02 03:44:10 2020-01-01 00:15:49.000 2020-01-02 03:44:10.000 949 99850 50399.5 5039950 949 99850 50399.5 5039950 -32619 32316 4524.3 452430 -127 124 -1.78 -178 +940 2 10930 99841 2.82282 299.82282 151.32282 15132.28228 2.82282 299.8228 151.32282 15132.28247 2.82282 299.82282 151.32281999999998 15132.282 2020-01-01 2020-01-02 2020-01-01 00:15:40 2020-01-02 03:44:01 2020-01-01 00:15:40.000 2020-01-02 03:44:01.000 940 99841 50390.5 5039050 940 99841 50390.5 5039050 -32628 32307 4515.3 451530 -128 127 2.02 202 +941 2 10931 99842 2.82582 299.82582 151.32582 15132.58258 2.82582 299.82584 151.32582 15132.58257 2.82582 299.82582 151.32582 15132.582 2020-01-01 2020-01-02 2020-01-01 00:15:41 2020-01-02 03:44:02 2020-01-01 00:15:41.000 2020-01-02 03:44:02.000 941 99842 50391.5 5039150 941 99842 50391.5 5039150 -32627 32308 4516.3 451630 -128 127 0.46 46 +942 2 10932 99843 2.82882 299.82882 151.32882 15132.88288 2.82882 299.82883 151.32882 15132.88275 2.82882 299.82882 151.32882 15132.882 2020-01-01 2020-01-02 2020-01-01 00:15:42 2020-01-02 03:44:03 2020-01-01 00:15:42.000 2020-01-02 03:44:03.000 942 99843 50392.5 5039250 942 99843 50392.5 5039250 -32626 32309 4517.3 451730 -128 124 -1.1 -110 +943 2 10933 99844 2.83183 299.83183 151.33183 15133.18318 2.83183 299.83182 151.33183 15133.18304 2.83183 299.83183 151.33183 15133.183 2020-01-01 2020-01-02 2020-01-01 00:15:43 2020-01-02 03:44:04 2020-01-01 00:15:43.000 2020-01-02 03:44:04.000 943 99844 50393.5 5039350 943 99844 50393.5 5039350 -32625 32310 4518.3 451830 -127 125 -0.1 -10 +944 2 10934 99845 2.83483 299.83483 151.33483 15133.48348 2.83483 299.83484 151.33483 15133.48364 2.83483 299.83483 151.33483 15133.483 2020-01-01 2020-01-02 2020-01-01 00:15:44 2020-01-02 03:44:05 2020-01-01 00:15:44.000 2020-01-02 03:44:05.000 944 99845 50394.5 5039450 944 99845 50394.5 5039450 -32624 32311 4519.3 451930 -126 126 0.9 90 +945 2 10935 99846 2.83783 299.83783 151.33783 15133.78378 2.83783 299.83783 151.33783 15133.78393 2.83783 299.83783 151.33783 15133.783 2020-01-01 2020-01-02 2020-01-01 00:15:45 2020-01-02 03:44:06 2020-01-01 00:15:45.000 2020-01-02 03:44:06.000 945 99846 50395.5 5039550 945 99846 50395.5 5039550 -32623 32312 4520.3 452030 -125 127 1.9 190 +946 2 10936 99847 2.84084 299.84084 151.34084 15134.08408 2.84084 299.84085 151.34084 15134.08404 2.84084 299.84084 151.34084000000001 15134.084 2020-01-01 2020-01-02 2020-01-01 00:15:46 2020-01-02 03:44:07 2020-01-01 00:15:46.000 2020-01-02 03:44:07.000 946 99847 50396.5 5039650 946 99847 50396.5 5039650 -32622 32313 4521.3 452130 -128 127 0.34 34 +947 2 10937 99848 2.84384 299.84384 151.34384 15134.38438 2.84384 299.84384 151.34384 15134.38421 2.84384 299.84384 151.34384 15134.384 2020-01-01 2020-01-02 2020-01-01 00:15:47 2020-01-02 03:44:08 2020-01-01 00:15:47.000 2020-01-02 03:44:08.000 947 99848 50397.5 5039750 947 99848 50397.5 5039750 -32621 32314 4522.3 452230 -128 127 -1.22 -122 +948 2 10938 99849 2.84684 299.84684 151.34684 15134.68468 2.84684 299.84683 151.34684 15134.68452 2.84684 299.84684 151.34684 15134.684 2020-01-01 2020-01-02 2020-01-01 00:15:48 2020-01-02 03:44:09 2020-01-01 00:15:48.000 2020-01-02 03:44:09.000 948 99849 50398.5 5039850 948 99849 50398.5 5039850 -32620 32315 4523.3 452330 -128 123 -2.78 -278 +949 2 10939 99850 2.84984 299.84984 151.34984 15134.98498 2.84985 299.84985 151.34985 15134.98527 2.84984 299.84984 151.34984 15134.984 2020-01-01 2020-01-02 2020-01-01 00:15:49 2020-01-02 03:44:10 2020-01-01 00:15:49.000 2020-01-02 03:44:10.000 949 99850 50399.5 5039950 949 99850 50399.5 5039950 -32619 32316 4524.3 452430 -127 124 -1.78 -178 95 2 10085 99995 0.28528 300.28528 150.28528 15178.81381 0.28528 300.28528 150.28528 15178.81343 0.28528 300.28528 150.28528 15178.81328 2020-01-01 2020-01-02 2020-01-01 00:01:35 2020-01-02 03:46:35 2020-01-01 00:01:35.000 2020-01-02 03:46:35.000 95 99995 50045 5054545 95 99995 50045 5054545 -32474 32461 4624.009900990099 467025 -125 126 0.801980198019802 81 -950 2 10940 99851 2.85285 299.85285 151.35285 15135.28528 2.85285 299.85284 151.35285 15135.28541 2.85285 299.85285 151.35285 15135.28500 2020-01-01 2020-01-02 2020-01-01 00:15:50 2020-01-02 03:44:11 2020-01-01 00:15:50.000 2020-01-02 03:44:11.000 950 99851 50400.5 5040050 950 99851 50400.5 5040050 -32618 32317 4525.3 452530 -126 125 -0.78 -78 -951 2 10941 99852 2.85585 299.85585 151.35585 15135.58558 2.85585 299.85587 151.35585 15135.58551 2.85585 299.85585 151.35585 15135.58500 2020-01-01 2020-01-02 2020-01-01 00:15:51 2020-01-02 03:44:12 2020-01-01 00:15:51.000 2020-01-02 03:44:12.000 951 99852 50401.5 5040150 951 99852 50401.5 5040150 -32617 32318 4526.3 452630 -125 126 0.22 22 -952 2 10942 99853 2.85885 299.85885 151.35885 15135.88588 2.85885 299.85886 151.35885 15135.88568 2.85885 299.85885 151.35885 15135.88500 2020-01-01 2020-01-02 2020-01-01 00:15:52 2020-01-02 03:44:13 2020-01-01 00:15:52.000 2020-01-02 03:44:13.000 952 99853 50402.5 5040250 952 99853 50402.5 5040250 -32616 32319 4527.3 452730 -124 127 1.22 122 -953 2 10943 99854 2.86186 299.86186 151.36186 15136.18618 2.86186 299.86185 151.36185 15136.18598 2.86186 299.86186 151.36186 15136.18600 2020-01-01 2020-01-02 2020-01-01 00:15:53 2020-01-02 03:44:14 2020-01-01 00:15:53.000 2020-01-02 03:44:14.000 953 99854 50403.5 5040350 953 99854 50403.5 5040350 -32615 32320 4528.3 452830 -128 127 -0.34 -34 -954 2 10944 99855 2.86486 299.86486 151.36486 15136.48648 2.86486 299.86487 151.36486 15136.48674 2.86486 299.86486 151.36486000000002 15136.48600 2020-01-01 2020-01-02 2020-01-01 00:15:54 2020-01-02 03:44:15 2020-01-01 00:15:54.000 2020-01-02 03:44:15.000 954 99855 50404.5 5040450 954 99855 50404.5 5040450 -32614 32321 4529.3 452930 -128 123 -1.9 -190 -955 2 10945 99856 2.86786 299.86786 151.36786 15136.78678 2.86786 299.86786 151.36786 15136.78688 2.86786 299.86786 151.36786 15136.78600 2020-01-01 2020-01-02 2020-01-01 00:15:55 2020-01-02 03:44:16 2020-01-01 00:15:55.000 2020-01-02 03:44:16.000 955 99856 50405.5 5040550 955 99856 50405.5 5040550 -32613 32322 4530.3 453030 -127 124 -0.9 -90 -956 2 10946 99857 2.87087 299.87087 151.37087 15137.08708 2.87087 299.87088 151.37087 15137.08701 2.87087 299.87087 151.37087 15137.08700 2020-01-01 2020-01-02 2020-01-01 00:15:56 2020-01-02 03:44:17 2020-01-01 00:15:56.000 2020-01-02 03:44:17.000 956 99857 50406.5 5040650 956 99857 50406.5 5040650 -32612 32323 4531.3 453130 -126 125 0.1 10 -957 2 10947 99858 2.87387 299.87387 151.37387 15137.38738 2.87387 299.87387 151.37387 15137.38716 2.87387 299.87387 151.37387 15137.38700 2020-01-01 2020-01-02 2020-01-01 00:15:57 2020-01-02 03:44:18 2020-01-01 00:15:57.000 2020-01-02 03:44:18.000 957 99858 50407.5 5040750 957 99858 50407.5 5040750 -32611 32324 4532.3 453230 -125 126 1.1 110 -958 2 10948 99859 2.87687 299.87687 151.37687 15137.68768 2.87687 299.8769 151.37687 15137.68791 2.87687 299.87687 151.37687 15137.68700 2020-01-01 2020-01-02 2020-01-01 00:15:58 2020-01-02 03:44:19 2020-01-01 00:15:58.000 2020-01-02 03:44:19.000 958 99859 50408.5 5040850 958 99859 50408.5 5040850 -32610 32325 4533.3 453330 -124 127 2.1 210 -959 2 10949 99860 2.87987 299.87987 151.37987 15137.98798 2.87988 299.87988 151.37988 15137.9882 2.87987 299.87987 151.37986999999998 15137.98700 2020-01-01 2020-01-02 2020-01-01 00:15:59 2020-01-02 03:44:20 2020-01-01 00:15:59.000 2020-01-02 03:44:20.000 959 99860 50409.5 5040950 959 99860 50409.5 5040950 -32609 32326 4534.3 453430 -128 127 0.54 54 +950 2 10940 99851 2.85285 299.85285 151.35285 15135.28528 2.85285 299.85284 151.35285 15135.28541 2.85285 299.85285 151.35285 15135.285 2020-01-01 2020-01-02 2020-01-01 00:15:50 2020-01-02 03:44:11 2020-01-01 00:15:50.000 2020-01-02 03:44:11.000 950 99851 50400.5 5040050 950 99851 50400.5 5040050 -32618 32317 4525.3 452530 -126 125 -0.78 -78 +951 2 10941 99852 2.85585 299.85585 151.35585 15135.58558 2.85585 299.85587 151.35585 15135.58551 2.85585 299.85585 151.35585 15135.585 2020-01-01 2020-01-02 2020-01-01 00:15:51 2020-01-02 03:44:12 2020-01-01 00:15:51.000 2020-01-02 03:44:12.000 951 99852 50401.5 5040150 951 99852 50401.5 5040150 -32617 32318 4526.3 452630 -125 126 0.22 22 +952 2 10942 99853 2.85885 299.85885 151.35885 15135.88588 2.85885 299.85886 151.35885 15135.88568 2.85885 299.85885 151.35885 15135.885 2020-01-01 2020-01-02 2020-01-01 00:15:52 2020-01-02 03:44:13 2020-01-01 00:15:52.000 2020-01-02 03:44:13.000 952 99853 50402.5 5040250 952 99853 50402.5 5040250 -32616 32319 4527.3 452730 -124 127 1.22 122 +953 2 10943 99854 2.86186 299.86186 151.36186 15136.18618 2.86186 299.86185 151.36185 15136.18598 2.86186 299.86186 151.36186 15136.186 2020-01-01 2020-01-02 2020-01-01 00:15:53 2020-01-02 03:44:14 2020-01-01 00:15:53.000 2020-01-02 03:44:14.000 953 99854 50403.5 5040350 953 99854 50403.5 5040350 -32615 32320 4528.3 452830 -128 127 -0.34 -34 +954 2 10944 99855 2.86486 299.86486 151.36486 15136.48648 2.86486 299.86487 151.36486 15136.48674 2.86486 299.86486 151.36486000000002 15136.486 2020-01-01 2020-01-02 2020-01-01 00:15:54 2020-01-02 03:44:15 2020-01-01 00:15:54.000 2020-01-02 03:44:15.000 954 99855 50404.5 5040450 954 99855 50404.5 5040450 -32614 32321 4529.3 452930 -128 123 -1.9 -190 +955 2 10945 99856 2.86786 299.86786 151.36786 15136.78678 2.86786 299.86786 151.36786 15136.78688 2.86786 299.86786 151.36786 15136.786 2020-01-01 2020-01-02 2020-01-01 00:15:55 2020-01-02 03:44:16 2020-01-01 00:15:55.000 2020-01-02 03:44:16.000 955 99856 50405.5 5040550 955 99856 50405.5 5040550 -32613 32322 4530.3 453030 -127 124 -0.9 -90 +956 2 10946 99857 2.87087 299.87087 151.37087 15137.08708 2.87087 299.87088 151.37087 15137.08701 2.87087 299.87087 151.37087 15137.087 2020-01-01 2020-01-02 2020-01-01 00:15:56 2020-01-02 03:44:17 2020-01-01 00:15:56.000 2020-01-02 03:44:17.000 956 99857 50406.5 5040650 956 99857 50406.5 5040650 -32612 32323 4531.3 453130 -126 125 0.1 10 +957 2 10947 99858 2.87387 299.87387 151.37387 15137.38738 2.87387 299.87387 151.37387 15137.38716 2.87387 299.87387 151.37387 15137.387 2020-01-01 2020-01-02 2020-01-01 00:15:57 2020-01-02 03:44:18 2020-01-01 00:15:57.000 2020-01-02 03:44:18.000 957 99858 50407.5 5040750 957 99858 50407.5 5040750 -32611 32324 4532.3 453230 -125 126 1.1 110 +958 2 10948 99859 2.87687 299.87687 151.37687 15137.68768 2.87687 299.8769 151.37687 15137.68791 2.87687 299.87687 151.37687 15137.687 2020-01-01 2020-01-02 2020-01-01 00:15:58 2020-01-02 03:44:19 2020-01-01 00:15:58.000 2020-01-02 03:44:19.000 958 99859 50408.5 5040850 958 99859 50408.5 5040850 -32610 32325 4533.3 453330 -124 127 2.1 210 +959 2 10949 99860 2.87987 299.87987 151.37987 15137.98798 2.87988 299.87988 151.37988 15137.9882 2.87987 299.87987 151.37986999999998 15137.987 2020-01-01 2020-01-02 2020-01-01 00:15:59 2020-01-02 03:44:20 2020-01-01 00:15:59.000 2020-01-02 03:44:20.000 959 99860 50409.5 5040950 959 99860 50409.5 5040950 -32609 32326 4534.3 453430 -128 127 0.54 54 96 2 10086 99996 0.28828 300.28828 150.28828 15179.11711 0.28828 300.2883 150.28828 15179.11718 0.28828 300.28828 150.28828000000001 15179.11628 2020-01-01 2020-01-02 2020-01-01 00:01:36 2020-01-02 03:46:36 2020-01-01 00:01:36.000 2020-01-02 03:46:36.000 96 99996 50046 5054646 96 99996 50046 5054646 -32473 32462 4625.009900990099 467126 -124 127 1.801980198019802 182 -960 2 10950 99861 2.88288 299.88288 151.38288 15138.28828 2.88288 299.88287 151.38288 15138.28834 2.88288 299.88288 151.38288 15138.28800 2020-01-01 2020-01-02 2020-01-01 00:16:00 2020-01-02 03:44:21 2020-01-01 00:16:00.000 2020-01-02 03:44:21.000 960 99861 50410.5 5041050 960 99861 50410.5 5041050 -32608 32327 4535.3 453530 -128 123 -1.02 -102 -961 2 10951 99862 2.88588 299.88588 151.38588 15138.58858 2.88588 299.8859 151.38588 15138.58848 2.88588 299.88588 151.38588 15138.58800 2020-01-01 2020-01-02 2020-01-01 00:16:01 2020-01-02 03:44:22 2020-01-01 00:16:01.000 2020-01-02 03:44:22.000 961 99862 50411.5 5041150 961 99862 50411.5 5041150 -32607 32328 4536.3 453630 -127 124 -0.02 -2 -962 2 10952 99863 2.88888 299.88888 151.38888 15138.88888 2.88888 299.8889 151.38888 15138.88862 2.88888 299.88888 151.38888 15138.88800 2020-01-01 2020-01-02 2020-01-01 00:16:02 2020-01-02 03:44:23 2020-01-01 00:16:02.000 2020-01-02 03:44:23.000 962 99863 50412.5 5041250 962 99863 50412.5 5041250 -32606 32329 4537.3 453730 -126 125 0.98 98 -963 2 10953 99864 2.89189 299.89189 151.39189 15139.18918 2.89189 299.8919 151.39189 15139.18937 2.89189 299.89189 151.39189 15139.18900 2020-01-01 2020-01-02 2020-01-01 00:16:03 2020-01-02 03:44:24 2020-01-01 00:16:03.000 2020-01-02 03:44:24.000 963 99864 50413.5 5041350 963 99864 50413.5 5041350 -32605 32330 4538.3 453830 -125 126 1.98 198 -964 2 10954 99865 2.89489 299.89489 151.39489 15139.48948 2.89489 299.8949 151.39489 15139.48968 2.89489 299.89489 151.39489 15139.48900 2020-01-01 2020-01-02 2020-01-01 00:16:04 2020-01-02 03:44:25 2020-01-01 00:16:04.000 2020-01-02 03:44:25.000 964 99865 50414.5 5041450 964 99865 50414.5 5041450 -32604 32331 4539.3 453930 -124 127 2.98 298 -965 2 10955 99866 2.89789 299.89789 151.39789 15139.78978 2.89789 299.8979 151.39789 15139.78985 2.89789 299.89789 151.39789000000002 15139.78900 2020-01-01 2020-01-02 2020-01-01 00:16:05 2020-01-02 03:44:26 2020-01-01 00:16:05.000 2020-01-02 03:44:26.000 965 99866 50415.5 5041550 965 99866 50415.5 5041550 -32603 32332 4540.3 454030 -128 127 1.42 142 -966 2 10956 99867 2.9009 299.9009 151.4009 15140.09009 2.9009 299.9009 151.40089 15140.08996 2.90090 299.90090 151.4009 15140.09000 2020-01-01 2020-01-02 2020-01-01 00:16:06 2020-01-02 03:44:27 2020-01-01 00:16:06.000 2020-01-02 03:44:27.000 966 99867 50416.5 5041650 966 99867 50416.5 5041650 -32602 32333 4541.3 454130 -128 127 -0.14 -14 -967 2 10957 99868 2.9039 299.9039 151.4039 15140.39039 2.9039 299.9039 151.4039 15140.39009 2.90390 299.90390 151.4039 15140.39000 2020-01-01 2020-01-02 2020-01-01 00:16:07 2020-01-02 03:44:28 2020-01-01 00:16:07.000 2020-01-02 03:44:28.000 967 99868 50417.5 5041750 967 99868 50417.5 5041750 -32601 32334 4542.3 454230 -128 124 -1.7 -170 -968 2 10958 99869 2.9069 299.9069 151.4069 15140.69069 2.9069 299.90692 151.4069 15140.69084 2.90690 299.90690 151.4069 15140.69000 2020-01-01 2020-01-02 2020-01-01 00:16:08 2020-01-02 03:44:29 2020-01-01 00:16:08.000 2020-01-02 03:44:29.000 968 99869 50418.5 5041850 968 99869 50418.5 5041850 -32600 32335 4543.3 454330 -127 125 -0.7 -70 -969 2 10959 99870 2.9099 299.9099 151.4099 15140.99099 2.90991 299.9099 151.40991 15140.99114 2.90990 299.90990 151.4099 15140.99000 2020-01-01 2020-01-02 2020-01-01 00:16:09 2020-01-02 03:44:30 2020-01-01 00:16:09.000 2020-01-02 03:44:30.000 969 99870 50419.5 5041950 969 99870 50419.5 5041950 -32599 32336 4544.3 454430 -126 126 0.3 30 +960 2 10950 99861 2.88288 299.88288 151.38288 15138.28828 2.88288 299.88287 151.38288 15138.28834 2.88288 299.88288 151.38288 15138.288 2020-01-01 2020-01-02 2020-01-01 00:16:00 2020-01-02 03:44:21 2020-01-01 00:16:00.000 2020-01-02 03:44:21.000 960 99861 50410.5 5041050 960 99861 50410.5 5041050 -32608 32327 4535.3 453530 -128 123 -1.02 -102 +961 2 10951 99862 2.88588 299.88588 151.38588 15138.58858 2.88588 299.8859 151.38588 15138.58848 2.88588 299.88588 151.38588 15138.588 2020-01-01 2020-01-02 2020-01-01 00:16:01 2020-01-02 03:44:22 2020-01-01 00:16:01.000 2020-01-02 03:44:22.000 961 99862 50411.5 5041150 961 99862 50411.5 5041150 -32607 32328 4536.3 453630 -127 124 -0.02 -2 +962 2 10952 99863 2.88888 299.88888 151.38888 15138.88888 2.88888 299.8889 151.38888 15138.88862 2.88888 299.88888 151.38888 15138.888 2020-01-01 2020-01-02 2020-01-01 00:16:02 2020-01-02 03:44:23 2020-01-01 00:16:02.000 2020-01-02 03:44:23.000 962 99863 50412.5 5041250 962 99863 50412.5 5041250 -32606 32329 4537.3 453730 -126 125 0.98 98 +963 2 10953 99864 2.89189 299.89189 151.39189 15139.18918 2.89189 299.8919 151.39189 15139.18937 2.89189 299.89189 151.39189 15139.189 2020-01-01 2020-01-02 2020-01-01 00:16:03 2020-01-02 03:44:24 2020-01-01 00:16:03.000 2020-01-02 03:44:24.000 963 99864 50413.5 5041350 963 99864 50413.5 5041350 -32605 32330 4538.3 453830 -125 126 1.98 198 +964 2 10954 99865 2.89489 299.89489 151.39489 15139.48948 2.89489 299.8949 151.39489 15139.48968 2.89489 299.89489 151.39489 15139.489 2020-01-01 2020-01-02 2020-01-01 00:16:04 2020-01-02 03:44:25 2020-01-01 00:16:04.000 2020-01-02 03:44:25.000 964 99865 50414.5 5041450 964 99865 50414.5 5041450 -32604 32331 4539.3 453930 -124 127 2.98 298 +965 2 10955 99866 2.89789 299.89789 151.39789 15139.78978 2.89789 299.8979 151.39789 15139.78985 2.89789 299.89789 151.39789000000002 15139.789 2020-01-01 2020-01-02 2020-01-01 00:16:05 2020-01-02 03:44:26 2020-01-01 00:16:05.000 2020-01-02 03:44:26.000 965 99866 50415.5 5041550 965 99866 50415.5 5041550 -32603 32332 4540.3 454030 -128 127 1.42 142 +966 2 10956 99867 2.9009 299.9009 151.4009 15140.09009 2.9009 299.9009 151.40089 15140.08996 2.9009 299.9009 151.4009 15140.09 2020-01-01 2020-01-02 2020-01-01 00:16:06 2020-01-02 03:44:27 2020-01-01 00:16:06.000 2020-01-02 03:44:27.000 966 99867 50416.5 5041650 966 99867 50416.5 5041650 -32602 32333 4541.3 454130 -128 127 -0.14 -14 +967 2 10957 99868 2.9039 299.9039 151.4039 15140.39039 2.9039 299.9039 151.4039 15140.39009 2.9039 299.9039 151.4039 15140.39 2020-01-01 2020-01-02 2020-01-01 00:16:07 2020-01-02 03:44:28 2020-01-01 00:16:07.000 2020-01-02 03:44:28.000 967 99868 50417.5 5041750 967 99868 50417.5 5041750 -32601 32334 4542.3 454230 -128 124 -1.7 -170 +968 2 10958 99869 2.9069 299.9069 151.4069 15140.69069 2.9069 299.90692 151.4069 15140.69084 2.9069 299.9069 151.4069 15140.69 2020-01-01 2020-01-02 2020-01-01 00:16:08 2020-01-02 03:44:29 2020-01-01 00:16:08.000 2020-01-02 03:44:29.000 968 99869 50418.5 5041850 968 99869 50418.5 5041850 -32600 32335 4543.3 454330 -127 125 -0.7 -70 +969 2 10959 99870 2.9099 299.9099 151.4099 15140.99099 2.90991 299.9099 151.40991 15140.99114 2.9099 299.9099 151.4099 15140.99 2020-01-01 2020-01-02 2020-01-01 00:16:09 2020-01-02 03:44:30 2020-01-01 00:16:09.000 2020-01-02 03:44:30.000 969 99870 50419.5 5041950 969 99870 50419.5 5041950 -32599 32336 4544.3 454430 -126 126 0.3 30 97 2 10087 99997 0.29129 300.29129 150.29129 15179.42042 0.29129 300.2913 150.29129 15179.42033 0.29129 300.29129 150.29129 15179.42029 2020-01-01 2020-01-02 2020-01-01 00:01:37 2020-01-02 03:46:37 2020-01-01 00:01:37.000 2020-01-02 03:46:37.000 97 99997 50047 5054747 97 99997 50047 5054747 -32472 32463 4626.009900990099 467227 -128 127 0.26732673267326734 27 -970 2 10960 99871 2.91291 299.91291 151.41291 15141.29129 2.91291 299.9129 151.41291 15141.29132 2.91291 299.91291 151.41290999999998 15141.29100 2020-01-01 2020-01-02 2020-01-01 00:16:10 2020-01-02 03:44:31 2020-01-01 00:16:10.000 2020-01-02 03:44:31.000 970 99871 50420.5 5042050 970 99871 50420.5 5042050 -32598 32337 4545.3 454530 -125 127 1.3 130 -971 2 10961 99872 2.91591 299.91591 151.41591 15141.59159 2.91591 299.91592 151.41591 15141.59142 2.91591 299.91591 151.41591 15141.59100 2020-01-01 2020-01-02 2020-01-01 00:16:11 2020-01-02 03:44:32 2020-01-01 00:16:11.000 2020-01-02 03:44:32.000 971 99872 50421.5 5042150 971 99872 50421.5 5042150 -32597 32338 4546.3 454630 -128 127 -0.26 -26 -972 2 10962 99873 2.91891 299.91891 151.41891 15141.89189 2.91891 299.9189 151.41891 15141.89172 2.91891 299.91891 151.41890999999998 15141.89100 2020-01-01 2020-01-02 2020-01-01 00:16:12 2020-01-02 03:44:33 2020-01-01 00:16:12.000 2020-01-02 03:44:33.000 972 99873 50422.5 5042250 972 99873 50422.5 5042250 -32596 32339 4547.3 454730 -128 127 -1.82 -182 -973 2 10963 99874 2.92192 299.92192 151.42192 15142.19219 2.92192 299.92194 151.42192 15142.19232 2.92192 299.92192 151.42192 15142.19200 2020-01-01 2020-01-02 2020-01-01 00:16:13 2020-01-02 03:44:34 2020-01-01 00:16:13.000 2020-01-02 03:44:34.000 973 99874 50423.5 5042350 973 99874 50423.5 5042350 -32595 32340 4548.3 454830 -128 123 -3.38 -338 -974 2 10964 99875 2.92492 299.92492 151.42492 15142.49249 2.92492 299.92493 151.42492 15142.49265 2.92492 299.92492 151.42492000000001 15142.49200 2020-01-01 2020-01-02 2020-01-01 00:16:14 2020-01-02 03:44:35 2020-01-01 00:16:14.000 2020-01-02 03:44:35.000 974 99875 50424.5 5042450 974 99875 50424.5 5042450 -32594 32341 4549.3 454930 -127 124 -2.38 -238 -975 2 10965 99876 2.92792 299.92792 151.42792 15142.79279 2.92792 299.92792 151.42792 15142.79279 2.92792 299.92792 151.42792 15142.79200 2020-01-01 2020-01-02 2020-01-01 00:16:15 2020-01-02 03:44:36 2020-01-01 00:16:15.000 2020-01-02 03:44:36.000 975 99876 50425.5 5042550 975 99876 50425.5 5042550 -32593 32342 4550.3 455030 -126 125 -1.38 -138 -976 2 10966 99877 2.93093 299.93093 151.43093 15143.09309 2.93093 299.93094 151.43092 15143.09289 2.93093 299.93093 151.43093000000002 15143.09300 2020-01-01 2020-01-02 2020-01-01 00:16:16 2020-01-02 03:44:37 2020-01-01 00:16:16.000 2020-01-02 03:44:37.000 976 99877 50426.5 5042650 976 99877 50426.5 5042650 -32592 32343 4551.3 455130 -125 126 -0.38 -38 -977 2 10967 99878 2.93393 299.93393 151.43393 15143.39339 2.93393 299.93393 151.43393 15143.39318 2.93393 299.93393 151.43393 15143.39300 2020-01-01 2020-01-02 2020-01-01 00:16:17 2020-01-02 03:44:38 2020-01-01 00:16:17.000 2020-01-02 03:44:38.000 977 99878 50427.5 5042750 977 99878 50427.5 5042750 -32591 32344 4552.3 455230 -124 127 0.62 62 -978 2 10968 99879 2.93693 299.93693 151.43693 15143.69369 2.93693 299.93695 151.43693 15143.69378 2.93693 299.93693 151.43693 15143.69300 2020-01-01 2020-01-02 2020-01-01 00:16:18 2020-01-02 03:44:39 2020-01-01 00:16:18.000 2020-01-02 03:44:39.000 978 99879 50428.5 5042850 978 99879 50428.5 5042850 -32590 32345 4553.3 455330 -128 127 -0.94 -94 -979 2 10969 99880 2.93993 299.93993 151.43993 15143.99399 2.93994 299.93994 151.43994 15143.99412 2.93993 299.93993 151.43993 15143.99300 2020-01-01 2020-01-02 2020-01-01 00:16:19 2020-01-02 03:44:40 2020-01-01 00:16:19.000 2020-01-02 03:44:40.000 979 99880 50429.5 5042950 979 99880 50429.5 5042950 -32589 32346 4554.3 455430 -128 123 -2.5 -250 +970 2 10960 99871 2.91291 299.91291 151.41291 15141.29129 2.91291 299.9129 151.41291 15141.29132 2.91291 299.91291 151.41290999999998 15141.291 2020-01-01 2020-01-02 2020-01-01 00:16:10 2020-01-02 03:44:31 2020-01-01 00:16:10.000 2020-01-02 03:44:31.000 970 99871 50420.5 5042050 970 99871 50420.5 5042050 -32598 32337 4545.3 454530 -125 127 1.3 130 +971 2 10961 99872 2.91591 299.91591 151.41591 15141.59159 2.91591 299.91592 151.41591 15141.59142 2.91591 299.91591 151.41591 15141.591 2020-01-01 2020-01-02 2020-01-01 00:16:11 2020-01-02 03:44:32 2020-01-01 00:16:11.000 2020-01-02 03:44:32.000 971 99872 50421.5 5042150 971 99872 50421.5 5042150 -32597 32338 4546.3 454630 -128 127 -0.26 -26 +972 2 10962 99873 2.91891 299.91891 151.41891 15141.89189 2.91891 299.9189 151.41891 15141.89172 2.91891 299.91891 151.41890999999998 15141.891 2020-01-01 2020-01-02 2020-01-01 00:16:12 2020-01-02 03:44:33 2020-01-01 00:16:12.000 2020-01-02 03:44:33.000 972 99873 50422.5 5042250 972 99873 50422.5 5042250 -32596 32339 4547.3 454730 -128 127 -1.82 -182 +973 2 10963 99874 2.92192 299.92192 151.42192 15142.19219 2.92192 299.92194 151.42192 15142.19232 2.92192 299.92192 151.42192 15142.192 2020-01-01 2020-01-02 2020-01-01 00:16:13 2020-01-02 03:44:34 2020-01-01 00:16:13.000 2020-01-02 03:44:34.000 973 99874 50423.5 5042350 973 99874 50423.5 5042350 -32595 32340 4548.3 454830 -128 123 -3.38 -338 +974 2 10964 99875 2.92492 299.92492 151.42492 15142.49249 2.92492 299.92493 151.42492 15142.49265 2.92492 299.92492 151.42492000000001 15142.492 2020-01-01 2020-01-02 2020-01-01 00:16:14 2020-01-02 03:44:35 2020-01-01 00:16:14.000 2020-01-02 03:44:35.000 974 99875 50424.5 5042450 974 99875 50424.5 5042450 -32594 32341 4549.3 454930 -127 124 -2.38 -238 +975 2 10965 99876 2.92792 299.92792 151.42792 15142.79279 2.92792 299.92792 151.42792 15142.79279 2.92792 299.92792 151.42792 15142.792 2020-01-01 2020-01-02 2020-01-01 00:16:15 2020-01-02 03:44:36 2020-01-01 00:16:15.000 2020-01-02 03:44:36.000 975 99876 50425.5 5042550 975 99876 50425.5 5042550 -32593 32342 4550.3 455030 -126 125 -1.38 -138 +976 2 10966 99877 2.93093 299.93093 151.43093 15143.09309 2.93093 299.93094 151.43092 15143.09289 2.93093 299.93093 151.43093000000002 15143.093 2020-01-01 2020-01-02 2020-01-01 00:16:16 2020-01-02 03:44:37 2020-01-01 00:16:16.000 2020-01-02 03:44:37.000 976 99877 50426.5 5042650 976 99877 50426.5 5042650 -32592 32343 4551.3 455130 -125 126 -0.38 -38 +977 2 10967 99878 2.93393 299.93393 151.43393 15143.39339 2.93393 299.93393 151.43393 15143.39318 2.93393 299.93393 151.43393 15143.393 2020-01-01 2020-01-02 2020-01-01 00:16:17 2020-01-02 03:44:38 2020-01-01 00:16:17.000 2020-01-02 03:44:38.000 977 99878 50427.5 5042750 977 99878 50427.5 5042750 -32591 32344 4552.3 455230 -124 127 0.62 62 +978 2 10968 99879 2.93693 299.93693 151.43693 15143.69369 2.93693 299.93695 151.43693 15143.69378 2.93693 299.93693 151.43693 15143.693 2020-01-01 2020-01-02 2020-01-01 00:16:18 2020-01-02 03:44:39 2020-01-01 00:16:18.000 2020-01-02 03:44:39.000 978 99879 50428.5 5042850 978 99879 50428.5 5042850 -32590 32345 4553.3 455330 -128 127 -0.94 -94 +979 2 10969 99880 2.93993 299.93993 151.43993 15143.99399 2.93994 299.93994 151.43994 15143.99412 2.93993 299.93993 151.43993 15143.993 2020-01-01 2020-01-02 2020-01-01 00:16:19 2020-01-02 03:44:40 2020-01-01 00:16:19.000 2020-01-02 03:44:40.000 979 99880 50429.5 5042950 979 99880 50429.5 5042950 -32589 32346 4554.3 455430 -128 123 -2.5 -250 98 2 10088 99998 0.29429 300.29429 150.29429 15179.72372 0.29429 300.29428 150.29429 15179.72363 0.29429 300.29429 150.29429 15179.72329 2020-01-01 2020-01-02 2020-01-01 00:01:38 2020-01-02 03:46:38 2020-01-01 00:01:38.000 2020-01-02 03:46:38.000 98 99998 50048 5054848 98 99998 50048 5054848 -32471 32464 4627.009900990099 467328 -128 127 -1.2673267326732673 -128 -980 2 10970 99881 2.94294 299.94294 151.44294 15144.29429 2.94294 299.94293 151.44294 15144.29426 2.94294 299.94294 151.44294 15144.29400 2020-01-01 2020-01-02 2020-01-01 00:16:20 2020-01-02 03:44:41 2020-01-01 00:16:20.000 2020-01-02 03:44:41.000 980 99881 50430.5 5043050 980 99881 50430.5 5043050 -32588 32347 4555.3 455530 -127 124 -1.5 -150 -981 2 10971 99882 2.94594 299.94594 151.44594 15144.59459 2.94594 299.94595 151.44595 15144.59501 2.94594 299.94594 151.44593999999998 15144.59400 2020-01-01 2020-01-02 2020-01-01 00:16:21 2020-01-02 03:44:42 2020-01-01 00:16:21.000 2020-01-02 03:44:42.000 981 99882 50431.5 5043150 981 99882 50431.5 5043150 -32587 32348 4556.3 455630 -126 125 -0.5 -50 -982 2 10972 99883 2.94894 299.94894 151.44894 15144.89489 2.94894 299.94894 151.44894 15144.89466 2.94894 299.94894 151.44894 15144.89400 2020-01-01 2020-01-02 2020-01-01 00:16:22 2020-01-02 03:44:43 2020-01-01 00:16:22.000 2020-01-02 03:44:43.000 982 99883 50432.5 5043250 982 99883 50432.5 5043250 -32586 32349 4557.3 455730 -125 126 0.5 50 -983 2 10973 99884 2.95195 299.95195 151.45195 15145.19519 2.95195 299.95197 151.45195 15145.19525 2.95195 299.95195 151.45195 15145.19500 2020-01-01 2020-01-02 2020-01-01 00:16:23 2020-01-02 03:44:44 2020-01-01 00:16:23.000 2020-01-02 03:44:44.000 983 99884 50433.5 5043350 983 99884 50433.5 5043350 -32585 32350 4558.3 455830 -124 127 1.5 150 -984 2 10974 99885 2.95495 299.95495 151.45495 15145.49549 2.95495 299.95496 151.45495 15145.49559 2.95495 299.95495 151.45495 15145.49500 2020-01-01 2020-01-02 2020-01-01 00:16:24 2020-01-02 03:44:45 2020-01-01 00:16:24.000 2020-01-02 03:44:45.000 984 99885 50434.5 5043450 984 99885 50434.5 5043450 -32584 32351 4559.3 455930 -128 127 -0.06 -6 -985 2 10975 99886 2.95795 299.95795 151.45795 15145.79579 2.95795 299.95795 151.45795 15145.79573 2.95795 299.95795 151.45795 15145.79500 2020-01-01 2020-01-02 2020-01-01 00:16:25 2020-01-02 03:44:46 2020-01-01 00:16:25.000 2020-01-02 03:44:46.000 985 99886 50435.5 5043550 985 99886 50435.5 5043550 -32583 32352 4560.3 456030 -128 123 -1.62 -162 -986 2 10976 99887 2.96096 299.96096 151.46096 15146.09609 2.96096 299.96097 151.46096 15146.09648 2.96096 299.96096 151.46096 15146.09600 2020-01-01 2020-01-02 2020-01-01 00:16:26 2020-01-02 03:44:47 2020-01-01 00:16:26.000 2020-01-02 03:44:47.000 986 99887 50436.5 5043650 986 99887 50436.5 5043650 -32582 32353 4561.3 456130 -127 124 -0.62 -62 -987 2 10977 99888 2.96396 299.96396 151.46396 15146.39639 2.96396 299.96396 151.46396 15146.39612 2.96396 299.96396 151.46396000000001 15146.39600 2020-01-01 2020-01-02 2020-01-01 00:16:27 2020-01-02 03:44:48 2020-01-01 00:16:27.000 2020-01-02 03:44:48.000 987 99888 50437.5 5043750 987 99888 50437.5 5043750 -32581 32354 4562.3 456230 -126 125 0.38 38 -988 2 10978 99889 2.96696 299.96696 151.46696 15146.69669 2.96696 299.96698 151.46696 15146.69676 2.96696 299.96696 151.46696 15146.69600 2020-01-01 2020-01-02 2020-01-01 00:16:28 2020-01-02 03:44:49 2020-01-01 00:16:28.000 2020-01-02 03:44:49.000 988 99889 50438.5 5043850 988 99889 50438.5 5043850 -32580 32355 4563.3 456330 -125 126 1.38 138 -989 2 10979 99890 2.96996 299.96996 151.46996 15146.99699 2.96997 299.96997 151.46997 15146.99706 2.96996 299.96996 151.46996 15146.99600 2020-01-01 2020-01-02 2020-01-01 00:16:29 2020-01-02 03:44:50 2020-01-01 00:16:29.000 2020-01-02 03:44:50.000 989 99890 50439.5 5043950 989 99890 50439.5 5043950 -32579 32356 4564.3 456430 -124 127 2.38 238 +980 2 10970 99881 2.94294 299.94294 151.44294 15144.29429 2.94294 299.94293 151.44294 15144.29426 2.94294 299.94294 151.44294 15144.294 2020-01-01 2020-01-02 2020-01-01 00:16:20 2020-01-02 03:44:41 2020-01-01 00:16:20.000 2020-01-02 03:44:41.000 980 99881 50430.5 5043050 980 99881 50430.5 5043050 -32588 32347 4555.3 455530 -127 124 -1.5 -150 +981 2 10971 99882 2.94594 299.94594 151.44594 15144.59459 2.94594 299.94595 151.44595 15144.59501 2.94594 299.94594 151.44593999999998 15144.594 2020-01-01 2020-01-02 2020-01-01 00:16:21 2020-01-02 03:44:42 2020-01-01 00:16:21.000 2020-01-02 03:44:42.000 981 99882 50431.5 5043150 981 99882 50431.5 5043150 -32587 32348 4556.3 455630 -126 125 -0.5 -50 +982 2 10972 99883 2.94894 299.94894 151.44894 15144.89489 2.94894 299.94894 151.44894 15144.89466 2.94894 299.94894 151.44894 15144.894 2020-01-01 2020-01-02 2020-01-01 00:16:22 2020-01-02 03:44:43 2020-01-01 00:16:22.000 2020-01-02 03:44:43.000 982 99883 50432.5 5043250 982 99883 50432.5 5043250 -32586 32349 4557.3 455730 -125 126 0.5 50 +983 2 10973 99884 2.95195 299.95195 151.45195 15145.19519 2.95195 299.95197 151.45195 15145.19525 2.95195 299.95195 151.45195 15145.195 2020-01-01 2020-01-02 2020-01-01 00:16:23 2020-01-02 03:44:44 2020-01-01 00:16:23.000 2020-01-02 03:44:44.000 983 99884 50433.5 5043350 983 99884 50433.5 5043350 -32585 32350 4558.3 455830 -124 127 1.5 150 +984 2 10974 99885 2.95495 299.95495 151.45495 15145.49549 2.95495 299.95496 151.45495 15145.49559 2.95495 299.95495 151.45495 15145.495 2020-01-01 2020-01-02 2020-01-01 00:16:24 2020-01-02 03:44:45 2020-01-01 00:16:24.000 2020-01-02 03:44:45.000 984 99885 50434.5 5043450 984 99885 50434.5 5043450 -32584 32351 4559.3 455930 -128 127 -0.06 -6 +985 2 10975 99886 2.95795 299.95795 151.45795 15145.79579 2.95795 299.95795 151.45795 15145.79573 2.95795 299.95795 151.45795 15145.795 2020-01-01 2020-01-02 2020-01-01 00:16:25 2020-01-02 03:44:46 2020-01-01 00:16:25.000 2020-01-02 03:44:46.000 985 99886 50435.5 5043550 985 99886 50435.5 5043550 -32583 32352 4560.3 456030 -128 123 -1.62 -162 +986 2 10976 99887 2.96096 299.96096 151.46096 15146.09609 2.96096 299.96097 151.46096 15146.09648 2.96096 299.96096 151.46096 15146.096 2020-01-01 2020-01-02 2020-01-01 00:16:26 2020-01-02 03:44:47 2020-01-01 00:16:26.000 2020-01-02 03:44:47.000 986 99887 50436.5 5043650 986 99887 50436.5 5043650 -32582 32353 4561.3 456130 -127 124 -0.62 -62 +987 2 10977 99888 2.96396 299.96396 151.46396 15146.39639 2.96396 299.96396 151.46396 15146.39612 2.96396 299.96396 151.46396000000001 15146.396 2020-01-01 2020-01-02 2020-01-01 00:16:27 2020-01-02 03:44:48 2020-01-01 00:16:27.000 2020-01-02 03:44:48.000 987 99888 50437.5 5043750 987 99888 50437.5 5043750 -32581 32354 4562.3 456230 -126 125 0.38 38 +988 2 10978 99889 2.96696 299.96696 151.46696 15146.69669 2.96696 299.96698 151.46696 15146.69676 2.96696 299.96696 151.46696 15146.696 2020-01-01 2020-01-02 2020-01-01 00:16:28 2020-01-02 03:44:49 2020-01-01 00:16:28.000 2020-01-02 03:44:49.000 988 99889 50438.5 5043850 988 99889 50438.5 5043850 -32580 32355 4563.3 456330 -125 126 1.38 138 +989 2 10979 99890 2.96996 299.96996 151.46996 15146.99699 2.96997 299.96997 151.46997 15146.99706 2.96996 299.96996 151.46996 15146.996 2020-01-01 2020-01-02 2020-01-01 00:16:29 2020-01-02 03:44:50 2020-01-01 00:16:29.000 2020-01-02 03:44:50.000 989 99890 50439.5 5043950 989 99890 50439.5 5043950 -32579 32356 4564.3 456430 -124 127 2.38 238 99 2 10089 99999 0.29729 300.29729 150.29729 15180.02702 0.29729 300.2973 150.29729 15180.02726 0.29729 300.29729 150.29729 15180.02629 2020-01-01 2020-01-02 2020-01-01 00:01:39 2020-01-02 03:46:39 2020-01-01 00:01:39.000 2020-01-02 03:46:39.000 99 99999 50049 5054949 99 99999 50049 5054949 -32470 32465 4628.009900990099 467429 -128 123 -2.801980198019802 -283 -990 2 10980 99891 2.97297 299.97297 151.47297 15147.29729 2.97297 299.97296 151.47297 15147.29735 2.97297 299.97297 151.47297 15147.29700 2020-01-01 2020-01-02 2020-01-01 00:16:30 2020-01-02 03:44:51 2020-01-01 00:16:30.000 2020-01-02 03:44:51.000 990 99891 50440.5 5044050 990 99891 50440.5 5044050 -32578 32357 4565.3 456530 -128 127 0.82 82 -991 2 10981 99892 2.97597 299.97597 151.47597 15147.59759 2.97597 299.97598 151.47597 15147.59795 2.97597 299.97597 151.47597 15147.59700 2020-01-01 2020-01-02 2020-01-01 00:16:31 2020-01-02 03:44:52 2020-01-01 00:16:31.000 2020-01-02 03:44:52.000 991 99892 50441.5 5044150 991 99892 50441.5 5044150 -32577 32358 4566.3 456630 -128 127 -0.74 -74 -992 2 10982 99893 2.97897 299.97897 151.47897 15147.89789 2.97897 299.97897 151.47897 15147.89759 2.97897 299.97897 151.47897 15147.89700 2020-01-01 2020-01-02 2020-01-01 00:16:32 2020-01-02 03:44:53 2020-01-01 00:16:32.000 2020-01-02 03:44:53.000 992 99893 50442.5 5044250 992 99893 50442.5 5044250 -32576 32359 4567.3 456730 -128 124 -2.3 -230 -993 2 10983 99894 2.98198 299.98198 151.48198 15148.19819 2.98198 299.982 151.48198 15148.19823 2.98198 299.98198 151.48198 15148.19800 2020-01-01 2020-01-02 2020-01-01 00:16:33 2020-01-02 03:44:54 2020-01-01 00:16:33.000 2020-01-02 03:44:54.000 993 99894 50443.5 5044350 993 99894 50443.5 5044350 -32575 32360 4568.3 456830 -127 125 -1.3 -130 -994 2 10984 99895 2.98498 299.98498 151.48498 15148.49849 2.98498 299.985 151.48498 15148.49853 2.98498 299.98498 151.48498 15148.49800 2020-01-01 2020-01-02 2020-01-01 00:16:34 2020-01-02 03:44:55 2020-01-01 00:16:34.000 2020-01-02 03:44:55.000 994 99895 50444.5 5044450 994 99895 50444.5 5044450 -32574 32361 4569.3 456930 -126 126 -0.3 -30 -995 2 10985 99896 2.98798 299.98798 151.48798 15148.79879 2.98798 299.98798 151.48798 15148.79882 2.98798 299.98798 151.48798 15148.79800 2020-01-01 2020-01-02 2020-01-01 00:16:35 2020-01-02 03:44:56 2020-01-01 00:16:35.000 2020-01-02 03:44:56.000 995 99896 50445.5 5044550 995 99896 50445.5 5044550 -32573 32362 4570.3 457030 -125 127 0.7 70 -996 2 10986 99897 2.99099 299.99099 151.49099 15149.09909 2.99099 299.991 151.49099 15149.09942 2.99099 299.99099 151.49099 15149.09900 2020-01-01 2020-01-02 2020-01-01 00:16:36 2020-01-02 03:44:57 2020-01-01 00:16:36.000 2020-01-02 03:44:57.000 996 99897 50446.5 5044650 996 99897 50446.5 5044650 -32572 32363 4571.3 457130 -128 127 -0.86 -86 -997 2 10987 99898 2.99399 299.99399 151.49399 15149.39939 2.99399 299.994 151.49399 15149.3991 2.99399 299.99399 151.49399 15149.39900 2020-01-01 2020-01-02 2020-01-01 00:16:37 2020-01-02 03:44:58 2020-01-01 00:16:37.000 2020-01-02 03:44:58.000 997 99898 50447.5 5044750 997 99898 50447.5 5044750 -32571 32364 4572.3 457230 -128 127 -2.42 -242 -998 2 10988 99899 2.99699 299.99699 151.49699 15149.69969 2.99699 299.997 151.49699 15149.6997 2.99699 299.99699 151.49699 15149.69900 2020-01-01 2020-01-02 2020-01-01 00:16:38 2020-01-02 03:44:59 2020-01-01 00:16:38.000 2020-01-02 03:44:59.000 998 99899 50448.5 5044850 998 99899 50448.5 5044850 -32570 32365 4573.3 457330 -128 123 -3.98 -398 +990 2 10980 99891 2.97297 299.97297 151.47297 15147.29729 2.97297 299.97296 151.47297 15147.29735 2.97297 299.97297 151.47297 15147.297 2020-01-01 2020-01-02 2020-01-01 00:16:30 2020-01-02 03:44:51 2020-01-01 00:16:30.000 2020-01-02 03:44:51.000 990 99891 50440.5 5044050 990 99891 50440.5 5044050 -32578 32357 4565.3 456530 -128 127 0.82 82 +991 2 10981 99892 2.97597 299.97597 151.47597 15147.59759 2.97597 299.97598 151.47597 15147.59795 2.97597 299.97597 151.47597 15147.597 2020-01-01 2020-01-02 2020-01-01 00:16:31 2020-01-02 03:44:52 2020-01-01 00:16:31.000 2020-01-02 03:44:52.000 991 99892 50441.5 5044150 991 99892 50441.5 5044150 -32577 32358 4566.3 456630 -128 127 -0.74 -74 +992 2 10982 99893 2.97897 299.97897 151.47897 15147.89789 2.97897 299.97897 151.47897 15147.89759 2.97897 299.97897 151.47897 15147.897 2020-01-01 2020-01-02 2020-01-01 00:16:32 2020-01-02 03:44:53 2020-01-01 00:16:32.000 2020-01-02 03:44:53.000 992 99893 50442.5 5044250 992 99893 50442.5 5044250 -32576 32359 4567.3 456730 -128 124 -2.3 -230 +993 2 10983 99894 2.98198 299.98198 151.48198 15148.19819 2.98198 299.982 151.48198 15148.19823 2.98198 299.98198 151.48198 15148.198 2020-01-01 2020-01-02 2020-01-01 00:16:33 2020-01-02 03:44:54 2020-01-01 00:16:33.000 2020-01-02 03:44:54.000 993 99894 50443.5 5044350 993 99894 50443.5 5044350 -32575 32360 4568.3 456830 -127 125 -1.3 -130 +994 2 10984 99895 2.98498 299.98498 151.48498 15148.49849 2.98498 299.985 151.48498 15148.49853 2.98498 299.98498 151.48498 15148.498 2020-01-01 2020-01-02 2020-01-01 00:16:34 2020-01-02 03:44:55 2020-01-01 00:16:34.000 2020-01-02 03:44:55.000 994 99895 50444.5 5044450 994 99895 50444.5 5044450 -32574 32361 4569.3 456930 -126 126 -0.3 -30 +995 2 10985 99896 2.98798 299.98798 151.48798 15148.79879 2.98798 299.98798 151.48798 15148.79882 2.98798 299.98798 151.48798 15148.798 2020-01-01 2020-01-02 2020-01-01 00:16:35 2020-01-02 03:44:56 2020-01-01 00:16:35.000 2020-01-02 03:44:56.000 995 99896 50445.5 5044550 995 99896 50445.5 5044550 -32573 32362 4570.3 457030 -125 127 0.7 70 +996 2 10986 99897 2.99099 299.99099 151.49099 15149.09909 2.99099 299.991 151.49099 15149.09942 2.99099 299.99099 151.49099 15149.099 2020-01-01 2020-01-02 2020-01-01 00:16:36 2020-01-02 03:44:57 2020-01-01 00:16:36.000 2020-01-02 03:44:57.000 996 99897 50446.5 5044650 996 99897 50446.5 5044650 -32572 32363 4571.3 457130 -128 127 -0.86 -86 +997 2 10987 99898 2.99399 299.99399 151.49399 15149.39939 2.99399 299.994 151.49399 15149.3991 2.99399 299.99399 151.49399 15149.399 2020-01-01 2020-01-02 2020-01-01 00:16:37 2020-01-02 03:44:58 2020-01-01 00:16:37.000 2020-01-02 03:44:58.000 997 99898 50447.5 5044750 997 99898 50447.5 5044750 -32571 32364 4572.3 457230 -128 127 -2.42 -242 +998 2 10988 99899 2.99699 299.99699 151.49699 15149.69969 2.99699 299.997 151.49699 15149.6997 2.99699 299.99699 151.49699 15149.699 2020-01-01 2020-01-02 2020-01-01 00:16:38 2020-01-02 03:44:59 2020-01-01 00:16:38.000 2020-01-02 03:44:59.000 998 99899 50448.5 5044850 998 99899 50448.5 5044850 -32570 32365 4573.3 457330 -128 123 -3.98 -398 ---- select row with nulls without states ---- -2 1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N ---- select row with nulls with states ---- diff --git a/tests/queries/0_stateless/01526_client_start_and_exit.expect-not-a-test-case b/tests/queries/0_stateless/01526_client_start_and_exit.expect-not-a-test-case index 585c8c369dd..00fb5c4e85b 100755 --- a/tests/queries/0_stateless/01526_client_start_and_exit.expect-not-a-test-case +++ b/tests/queries/0_stateless/01526_client_start_and_exit.expect-not-a-test-case @@ -4,7 +4,7 @@ log_user 1 set timeout 5 match_max 100000 -spawn bash -c "$env(CLICKHOUSE_CLIENT_BINARY) $env(CLICKHOUSE_CLIENT_OPT)" +spawn bash -c "$env(CLICKHOUSE_CLIENT_BINARY) --no-warnings $env(CLICKHOUSE_CLIENT_OPT)" expect ":) " send -- "\4" expect eof diff --git a/tests/queries/0_stateless/01530_drop_database_atomic_sync.sql b/tests/queries/0_stateless/01530_drop_database_atomic_sync.sql index d5fb25a9241..07fe00693d1 100644 --- a/tests/queries/0_stateless/01530_drop_database_atomic_sync.sql +++ b/tests/queries/0_stateless/01530_drop_database_atomic_sync.sql @@ -1,33 +1,33 @@ drop database if exists db_01530_atomic sync; create database db_01530_atomic Engine=Atomic; -create table db_01530_atomic.data (key Int) Engine=ReplicatedMergeTree('/clickhouse/tables/db_01530_atomic/data', 'test') order by key; +create table db_01530_atomic.data (key Int) Engine=ReplicatedMergeTree('/clickhouse/tables/{database}/db_01530_atomic/data', 'test') order by key; drop database db_01530_atomic sync; create database db_01530_atomic Engine=Atomic; -create table db_01530_atomic.data (key Int) Engine=ReplicatedMergeTree('/clickhouse/tables/db_01530_atomic/data', 'test') order by key; +create table db_01530_atomic.data (key Int) Engine=ReplicatedMergeTree('/clickhouse/tables/{database}/db_01530_atomic/data', 'test') order by key; drop database db_01530_atomic sync; set database_atomic_wait_for_drop_and_detach_synchronously=1; create database db_01530_atomic Engine=Atomic; -create table db_01530_atomic.data (key Int) Engine=ReplicatedMergeTree('/clickhouse/tables/db_01530_atomic/data', 'test') order by key; +create table db_01530_atomic.data (key Int) Engine=ReplicatedMergeTree('/clickhouse/tables/{database}/db_01530_atomic/data', 'test') order by key; drop database db_01530_atomic; create database db_01530_atomic Engine=Atomic; -create table db_01530_atomic.data (key Int) Engine=ReplicatedMergeTree('/clickhouse/tables/db_01530_atomic/data', 'test') order by key; +create table db_01530_atomic.data (key Int) Engine=ReplicatedMergeTree('/clickhouse/tables/{database}/db_01530_atomic/data', 'test') order by key; drop database db_01530_atomic; set database_atomic_wait_for_drop_and_detach_synchronously=0; create database db_01530_atomic Engine=Atomic; -create table db_01530_atomic.data (key Int) Engine=ReplicatedMergeTree('/clickhouse/tables/db_01530_atomic/data', 'test') order by key; +create table db_01530_atomic.data (key Int) Engine=ReplicatedMergeTree('/clickhouse/tables/{database}/db_01530_atomic/data', 'test') order by key; drop database db_01530_atomic; create database db_01530_atomic Engine=Atomic; -create table db_01530_atomic.data (key Int) Engine=ReplicatedMergeTree('/clickhouse/tables/db_01530_atomic/data', 'test') order by key; -- { serverError 253; } +create table db_01530_atomic.data (key Int) Engine=ReplicatedMergeTree('/clickhouse/tables/{database}/db_01530_atomic/data', 'test') order by key; -- { serverError 253; } set database_atomic_wait_for_drop_and_detach_synchronously=1; diff --git a/tests/queries/0_stateless/01532_execute_merges_on_single_replica.reference b/tests/queries/0_stateless/01532_execute_merges_on_single_replica_long.reference similarity index 100% rename from tests/queries/0_stateless/01532_execute_merges_on_single_replica.reference rename to tests/queries/0_stateless/01532_execute_merges_on_single_replica_long.reference diff --git a/tests/queries/0_stateless/01532_execute_merges_on_single_replica.sql b/tests/queries/0_stateless/01532_execute_merges_on_single_replica_long.sql similarity index 96% rename from tests/queries/0_stateless/01532_execute_merges_on_single_replica.sql rename to tests/queries/0_stateless/01532_execute_merges_on_single_replica_long.sql index 69369321d26..1acae560c93 100644 --- a/tests/queries/0_stateless/01532_execute_merges_on_single_replica.sql +++ b/tests/queries/0_stateless/01532_execute_merges_on_single_replica_long.sql @@ -1,7 +1,7 @@ DROP TABLE IF EXISTS execute_on_single_replica_r1 NO DELAY; DROP TABLE IF EXISTS execute_on_single_replica_r2 NO DELAY; -/* that test requires fixed zookeeper path */ +/* that test requires fixed zookeeper path, so we cannot use ReplicatedMergeTree({database}) */ CREATE TABLE execute_on_single_replica_r1 (x UInt64) ENGINE=ReplicatedMergeTree('/clickhouse/tables/test_01532/execute_on_single_replica', 'r1') ORDER BY tuple() SETTINGS execute_merges_on_single_replica_time_threshold=10; CREATE TABLE execute_on_single_replica_r2 (x UInt64) ENGINE=ReplicatedMergeTree('/clickhouse/tables/test_01532/execute_on_single_replica', 'r2') ORDER BY tuple() SETTINGS execute_merges_on_single_replica_time_threshold=10; @@ -124,4 +124,4 @@ ORDER BY part_name FORMAT Vertical; DROP TABLE execute_on_single_replica_r1 NO DELAY; -DROP TABLE execute_on_single_replica_r2 NO DELAY; \ No newline at end of file +DROP TABLE execute_on_single_replica_r2 NO DELAY; diff --git a/tests/queries/0_stateless/01536_fuzz_cast.sql b/tests/queries/0_stateless/01536_fuzz_cast.sql index 436d76b5c4c..fb1303549b6 100644 --- a/tests/queries/0_stateless/01536_fuzz_cast.sql +++ b/tests/queries/0_stateless/01536_fuzz_cast.sql @@ -1 +1,2 @@ +SET cast_keep_nullable = 0; SELECT CAST(arrayJoin([NULL, '', '', NULL, '', NULL, '01.02.2017 03:04\005GMT', '', NULL, '01/02/2017 03:04:05 MSK01/02/\0017 03:04:05 MSK', '', NULL, '03/04/201903/04/201903/04/\001903/04/2019']), 'Enum8(\'a\' = 1, \'b\' = 2)') AS x; -- { serverError 349 } diff --git a/tests/queries/0_stateless/01550_type_map_formats.reference b/tests/queries/0_stateless/01550_type_map_formats.reference index ca081db75a2..998473ef63a 100644 --- a/tests/queries/0_stateless/01550_type_map_formats.reference +++ b/tests/queries/0_stateless/01550_type_map_formats.reference @@ -4,15 +4,15 @@ JSON [ { "name": "m", - "type": "Map(String,UInt32)" + "type": "Map(String, UInt32)" }, { "name": "m1", - "type": "Map(String,Date)" + "type": "Map(String, Date)" }, { "name": "m2", - "type": "Map(String,Array(UInt32))" + "type": "Map(String, Array(UInt32))" } ], diff --git a/tests/queries/0_stateless/01551_mergetree_read_in_order_spread.reference b/tests/queries/0_stateless/01551_mergetree_read_in_order_spread.reference index 2843b305f0a..cdc595a3c57 100644 --- a/tests/queries/0_stateless/01551_mergetree_read_in_order_spread.reference +++ b/tests/queries/0_stateless/01551_mergetree_read_in_order_spread.reference @@ -9,9 +9,9 @@ ExpressionTransform (SettingQuotaAndLimits) (ReadFromMergeTree) ExpressionTransform × 4 - MergeTree 0 → 1 + MergeTreeInOrder 0 → 1 MergingSortedTransform 2 → 1 ExpressionTransform × 2 - MergeTree × 2 0 → 1 + MergeTreeInOrder × 2 0 → 1 ExpressionTransform - MergeTree 0 → 1 + MergeTreeInOrder 0 → 1 diff --git a/tests/queries/0_stateless/01556_accurate_cast_or_null.reference b/tests/queries/0_stateless/01556_accurate_cast_or_null.reference index 3b27dd2e2e1..b329aede01a 100644 --- a/tests/queries/0_stateless/01556_accurate_cast_or_null.reference +++ b/tests/queries/0_stateless/01556_accurate_cast_or_null.reference @@ -15,7 +15,7 @@ 5 \N \N -1.000000000 +1 \N \N \N diff --git a/tests/queries/0_stateless/01562_optimize_monotonous_functions_in_order_by.reference b/tests/queries/0_stateless/01562_optimize_monotonous_functions_in_order_by.reference index 0eb7e06f724..bf9bff06959 100644 --- a/tests/queries/0_stateless/01562_optimize_monotonous_functions_in_order_by.reference +++ b/tests/queries/0_stateless/01562_optimize_monotonous_functions_in_order_by.reference @@ -5,7 +5,7 @@ FROM test_order_by ORDER BY timestamp ASC LIMIT 10 Expression (Projection) - Limit (preliminary LIMIT) + Limit (preliminary LIMIT (without OFFSET)) MergingSorted (Merge sorted streams for ORDER BY) MergeSorting (Merge sorted blocks for ORDER BY) PartialSorting (Sort each block for ORDER BY) @@ -19,7 +19,7 @@ FROM test_order_by ORDER BY toDate(timestamp) ASC LIMIT 10 Expression (Projection) - Limit (preliminary LIMIT) + Limit (preliminary LIMIT (without OFFSET)) FinishSorting Expression (Before ORDER BY) SettingQuotaAndLimits (Set limits and quota after reading from storage) @@ -33,7 +33,7 @@ ORDER BY timestamp ASC LIMIT 10 Expression (Projection) - Limit (preliminary LIMIT) + Limit (preliminary LIMIT (without OFFSET)) FinishSorting Expression (Before ORDER BY) SettingQuotaAndLimits (Set limits and quota after reading from storage) diff --git a/tests/queries/0_stateless/01568_window_functions_distributed.reference b/tests/queries/0_stateless/01568_window_functions_distributed.reference index 483e84a2bee..0b439ef759a 100644 --- a/tests/queries/0_stateless/01568_window_functions_distributed.reference +++ b/tests/queries/0_stateless/01568_window_functions_distributed.reference @@ -1,5 +1,4 @@ -- { echo } -set allow_experimental_window_functions = 1; select row_number() over (order by dummy) from (select * from remote('127.0.0.{1,2}', system, one)); 1 2 diff --git a/tests/queries/0_stateless/01568_window_functions_distributed.sql b/tests/queries/0_stateless/01568_window_functions_distributed.sql index 6f38597a7a3..5e20c57d23d 100644 --- a/tests/queries/0_stateless/01568_window_functions_distributed.sql +++ b/tests/queries/0_stateless/01568_window_functions_distributed.sql @@ -1,6 +1,4 @@ -- { echo } -set allow_experimental_window_functions = 1; - select row_number() over (order by dummy) from (select * from remote('127.0.0.{1,2}', system, one)); select row_number() over (order by dummy) from remote('127.0.0.{1,2}', system, one); diff --git a/tests/queries/0_stateless/01571_window_functions.reference b/tests/queries/0_stateless/01571_window_functions.reference index 47a7c062b0b..420f7575a52 100644 --- a/tests/queries/0_stateless/01571_window_functions.reference +++ b/tests/queries/0_stateless/01571_window_functions.reference @@ -1,6 +1,37 @@ -- { echo } -- Another test for window functions because the other one is too long. -set allow_experimental_window_functions = 1; + +-- some craziness with a mix of materialized and unmaterialized const columns +-- after merging sorted transform, that used to break the peer group detection in +-- the window transform. +CREATE TABLE order_by_const +( + `a` UInt64, + `b` UInt64, + `c` UInt64, + `d` UInt64 +) +ENGINE = MergeTree +ORDER BY (a, b) +SETTINGS index_granularity = 8192; +truncate table order_by_const; +system stop merges order_by_const; +INSERT INTO order_by_const(a, b, c, d) VALUES (1, 1, 101, 1), (1, 2, 102, 1), (1, 3, 103, 1), (1, 4, 104, 1); +INSERT INTO order_by_const(a, b, c, d) VALUES (1, 5, 104, 1), (1, 6, 105, 1), (2, 1, 106, 2), (2, 1, 107, 2); +INSERT INTO order_by_const(a, b, c, d) VALUES (2, 2, 107, 2), (2, 3, 108, 2), (2, 4, 109, 2); +SELECT row_number() OVER (order by 1, a) FROM order_by_const; +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +drop table order_by_const; -- expressions in window frame select count() over (rows between 1 + 1 preceding and 1 + 1 following) from numbers(10); 3 @@ -13,3 +44,28 @@ select count() over (rows between 1 + 1 preceding and 1 + 1 following) from numb 5 4 3 +-- signed and unsigned in offset do not cause logical error +select count() over (rows between 2 following and 1 + -1 following) FROM numbers(10); -- { serverError 36 } +-- default arguments of lagInFrame can be a subtype of the argument +select number, + lagInFrame(toNullable(number), 2, null) over w, + lagInFrame(number, 2, 1) over w +from numbers(10) +window w as (order by number) +; +0 \N 1 +1 \N 1 +2 0 0 +3 1 1 +4 2 2 +5 3 3 +6 4 4 +7 5 5 +8 6 6 +9 7 7 +-- the case when current_row goes past the partition end at the block end +select number, row_number() over (partition by number rows between unbounded preceding and 1 preceding) from numbers(4) settings max_block_size = 2; +0 1 +1 1 +2 1 +3 1 diff --git a/tests/queries/0_stateless/01571_window_functions.sql b/tests/queries/0_stateless/01571_window_functions.sql index 614b98670b2..4aaba19100a 100644 --- a/tests/queries/0_stateless/01571_window_functions.sql +++ b/tests/queries/0_stateless/01571_window_functions.sql @@ -1,6 +1,42 @@ -- { echo } -- Another test for window functions because the other one is too long. -set allow_experimental_window_functions = 1; + +-- some craziness with a mix of materialized and unmaterialized const columns +-- after merging sorted transform, that used to break the peer group detection in +-- the window transform. +CREATE TABLE order_by_const +( + `a` UInt64, + `b` UInt64, + `c` UInt64, + `d` UInt64 +) +ENGINE = MergeTree +ORDER BY (a, b) +SETTINGS index_granularity = 8192; + +truncate table order_by_const; +system stop merges order_by_const; +INSERT INTO order_by_const(a, b, c, d) VALUES (1, 1, 101, 1), (1, 2, 102, 1), (1, 3, 103, 1), (1, 4, 104, 1); +INSERT INTO order_by_const(a, b, c, d) VALUES (1, 5, 104, 1), (1, 6, 105, 1), (2, 1, 106, 2), (2, 1, 107, 2); +INSERT INTO order_by_const(a, b, c, d) VALUES (2, 2, 107, 2), (2, 3, 108, 2), (2, 4, 109, 2); +SELECT row_number() OVER (order by 1, a) FROM order_by_const; + +drop table order_by_const; -- expressions in window frame select count() over (rows between 1 + 1 preceding and 1 + 1 following) from numbers(10); + +-- signed and unsigned in offset do not cause logical error +select count() over (rows between 2 following and 1 + -1 following) FROM numbers(10); -- { serverError 36 } + +-- default arguments of lagInFrame can be a subtype of the argument +select number, + lagInFrame(toNullable(number), 2, null) over w, + lagInFrame(number, 2, 1) over w +from numbers(10) +window w as (order by number) +; + +-- the case when current_row goes past the partition end at the block end +select number, row_number() over (partition by number rows between unbounded preceding and 1 preceding) from numbers(4) settings max_block_size = 2; diff --git a/tests/queries/0_stateless/01572_kill_window_function.reference b/tests/queries/0_stateless/01572_kill_window_function.reference new file mode 100644 index 00000000000..f1218bf5bdf --- /dev/null +++ b/tests/queries/0_stateless/01572_kill_window_function.reference @@ -0,0 +1,3 @@ +Started +Sent kill request +Exit 138 diff --git a/tests/queries/0_stateless/01572_kill_window_function.sh b/tests/queries/0_stateless/01572_kill_window_function.sh new file mode 100755 index 00000000000..7103b7f7210 --- /dev/null +++ b/tests/queries/0_stateless/01572_kill_window_function.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +set -e -o pipefail + +# Run a test query that takes very long to run. +query_id="01572_kill_window_function-$CLICKHOUSE_DATABASE" +$CLICKHOUSE_CLIENT --query_id="$query_id" --query "SELECT count(1048575) OVER (PARTITION BY intDiv(NULL, number) ORDER BY number DESC NULLS FIRST ROWS BETWEEN CURRENT ROW AND 1048575 FOLLOWING) FROM numbers(255, 1048575)" >/dev/null 2>&1 & +client_pid=$! +echo Started + +# Use one query to both kill the test query and verify that it has started, +# because if we try to kill it before it starts, the test will fail. +while [ -z "$($CLICKHOUSE_CLIENT --query "kill query where query_id = '$query_id' and current_database = currentDatabase()")" ] +do + # If we don't yet see the query in the process list, the client should still + # be running. The query is very long. + kill -0 -- $client_pid + sleep 1 +done +echo Sent kill request + +# Wait for the client to terminate. +client_exit_code=0 +wait $client_pid || client_exit_code=$? + +echo "Exit $client_exit_code" + +# We have tested for Ctrl+C. +# The following client flags don't cancel, but should: --max_execution_time, +# --receive_timeout. Probably needs asynchonous calculation of query limits, as +# discussed with Nikolay on TG: https://t.me/c/1214350934/21492 + diff --git a/tests/queries/0_stateless/01576_alias_column_rewrite.reference b/tests/queries/0_stateless/01576_alias_column_rewrite.reference index ef598570b10..2a824e62158 100644 --- a/tests/queries/0_stateless/01576_alias_column_rewrite.reference +++ b/tests/queries/0_stateless/01576_alias_column_rewrite.reference @@ -22,7 +22,7 @@ lambda 1 optimize_read_in_order Expression (Projection) - Limit (preliminary LIMIT) + Limit (preliminary LIMIT (without OFFSET)) MergingSorted (Merge sorted streams for ORDER BY) MergeSorting (Merge sorted blocks for ORDER BY) PartialSorting (Sort each block for ORDER BY) @@ -30,13 +30,13 @@ Expression (Projection) SettingQuotaAndLimits (Set limits and quota after reading from storage) ReadFromMergeTree Expression (Projection) - Limit (preliminary LIMIT) + Limit (preliminary LIMIT (without OFFSET)) FinishSorting Expression (Before ORDER BY) SettingQuotaAndLimits (Set limits and quota after reading from storage) ReadFromMergeTree Expression (Projection) - Limit (preliminary LIMIT) + Limit (preliminary LIMIT (without OFFSET)) FinishSorting Expression (Before ORDER BY) SettingQuotaAndLimits (Set limits and quota after reading from storage) @@ -61,3 +61,4 @@ second-index 1 1 1 +1 1 diff --git a/tests/queries/0_stateless/01576_alias_column_rewrite.sql b/tests/queries/0_stateless/01576_alias_column_rewrite.sql index cab32db0192..910c95afd64 100644 --- a/tests/queries/0_stateless/01576_alias_column_rewrite.sql +++ b/tests/queries/0_stateless/01576_alias_column_rewrite.sql @@ -127,3 +127,11 @@ select sum(i) from pd group by dt_m settings allow_experimental_projection_optim drop table pd; drop table pl; + +drop table if exists t; + +create temporary table t (x UInt64, y alias x); +insert into t values (1); +select sum(x), sum(y) from t; + +drop table t; diff --git a/tests/queries/0_stateless/01581_deduplicate_by_columns_replicated.reference b/tests/queries/0_stateless/01581_deduplicate_by_columns_replicated_long.reference similarity index 100% rename from tests/queries/0_stateless/01581_deduplicate_by_columns_replicated.reference rename to tests/queries/0_stateless/01581_deduplicate_by_columns_replicated_long.reference diff --git a/tests/queries/0_stateless/01581_deduplicate_by_columns_replicated.sql b/tests/queries/0_stateless/01581_deduplicate_by_columns_replicated_long.sql similarity index 92% rename from tests/queries/0_stateless/01581_deduplicate_by_columns_replicated.sql rename to tests/queries/0_stateless/01581_deduplicate_by_columns_replicated_long.sql index 9779dca90a2..cc8c721b6a8 100644 --- a/tests/queries/0_stateless/01581_deduplicate_by_columns_replicated.sql +++ b/tests/queries/0_stateless/01581_deduplicate_by_columns_replicated_long.sql @@ -11,11 +11,11 @@ SET replication_alter_partitions_sync = 2; -- IRL insert_replica_id were filled from hostname CREATE TABLE IF NOT EXISTS replicated_deduplicate_by_columns_r1 ( id Int32, val UInt32, unique_value UInt64 MATERIALIZED rowNumberInBlock() -) ENGINE=ReplicatedMergeTree('/clickhouse/tables/test_01581/replicated_deduplicate', 'r1') ORDER BY id; +) ENGINE=ReplicatedMergeTree('/clickhouse/tables/{database}/test_01581/replicated_deduplicate', 'r1') ORDER BY id; CREATE TABLE IF NOT EXISTS replicated_deduplicate_by_columns_r2 ( id Int32, val UInt32, unique_value UInt64 MATERIALIZED rowNumberInBlock() -) ENGINE=ReplicatedMergeTree('/clickhouse/tables/test_01581/replicated_deduplicate', 'r2') ORDER BY id; +) ENGINE=ReplicatedMergeTree('/clickhouse/tables/{database}/test_01581/replicated_deduplicate', 'r2') ORDER BY id; -- insert some data, 2 records: (3, 1003), (4, 1004) are duplicated and have difference in unique_value / insert_replica_id diff --git a/tests/queries/0_stateless/01585_use_index_for_global_in_with_null.reference b/tests/queries/0_stateless/01585_use_index_for_global_in_with_null.reference new file mode 100644 index 00000000000..de0116f9eaa --- /dev/null +++ b/tests/queries/0_stateless/01585_use_index_for_global_in_with_null.reference @@ -0,0 +1,20 @@ +0 2 +1 3 +0 2 +1 3 +0 2 +1 3 +0 2 +1 3 +0 2 +1 3 +0 2 +1 3 +0 2 +1 3 +0 2 +1 3 +\N 100 +\N 100 +\N 100 +\N 100 diff --git a/tests/queries/0_stateless/01585_use_index_for_global_in_with_null.sql b/tests/queries/0_stateless/01585_use_index_for_global_in_with_null.sql new file mode 100644 index 00000000000..72f12ce435a --- /dev/null +++ b/tests/queries/0_stateless/01585_use_index_for_global_in_with_null.sql @@ -0,0 +1,30 @@ +drop table if exists xp; +drop table if exists xp_d; + +create table xp(i Nullable(UInt64), j UInt64) engine MergeTree order by i settings index_granularity = 1, allow_nullable_key = 1; +create table xp_d as xp engine Distributed(test_shard_localhost, currentDatabase(), xp); + +insert into xp select number, number + 2 from numbers(10); +insert into xp select null, 100; + +optimize table xp final; + +set max_rows_to_read = 2; +select * from xp where i in (select * from numbers(2)); +select * from xp where i global in (select * from numbers(2)); +select * from xp_d where i in (select * from numbers(2)); +select * from xp_d where i global in (select * from numbers(2)); + +set transform_null_in = 1; +select * from xp where i in (select * from numbers(2)); +select * from xp where i global in (select * from numbers(2)); +select * from xp_d where i in (select * from numbers(2)); +select * from xp_d where i global in (select * from numbers(2)); + +select * from xp where i in (null); +select * from xp where i global in (null); +select * from xp_d where i in (null); +select * from xp_d where i global in (null); + +drop table if exists xp; +drop table if exists xp_d; diff --git a/tests/queries/0_stateless/01591_window_functions.reference b/tests/queries/0_stateless/01591_window_functions.reference index fa909972678..26e9e500c3c 100644 --- a/tests/queries/0_stateless/01591_window_functions.reference +++ b/tests/queries/0_stateless/01591_window_functions.reference @@ -1,6 +1,5 @@ -- { echo } -set allow_experimental_window_functions = 1; -- just something basic select number, count() over (partition by intDiv(number, 3) order by number rows unbounded preceding) from numbers(10); 0 1 @@ -1056,10 +1055,26 @@ settings max_block_size = 3; 15 3 15 0 15 15 15 -- careful with auto-application of Null combinator select lagInFrame(toNullable(1)) over (); -0 +\N select lagInFrameOrNull(1) over (); -- { serverError 36 } +-- this is the same as `select max(Null::Nullable(Nothing))` select intDiv(1, NULL) x, toTypeName(x), max(x) over (); \N Nullable(Nothing) \N +-- to make lagInFrame return null for out-of-frame rows, cast the argument to +-- Nullable; otherwise, it returns default values. +SELECT + number, + lagInFrame(toNullable(number), 1) OVER w, + lagInFrame(toNullable(number), 2) OVER w, + lagInFrame(number, 1) OVER w, + lagInFrame(number, 2) OVER w +FROM numbers(4) +WINDOW w AS (ORDER BY number ASC) +; +0 \N \N 0 0 +1 0 \N 0 0 +2 1 0 1 0 +3 2 1 2 1 -- case-insensitive SQL-standard synonyms for any and anyLast select number, @@ -1079,6 +1094,62 @@ order by number 7 6 8 8 7 9 9 8 9 +-- nth_value without specific frame range given +select + number, + nth_value(number, 1) over w as firstValue, + nth_value(number, 2) over w as secondValue, + nth_value(number, 3) over w as thirdValue, + nth_value(number, 4) over w as fourthValue +from numbers(10) +window w as (order by number) +order by number +; +0 0 0 0 0 +1 0 1 0 0 +2 0 1 2 0 +3 0 1 2 3 +4 0 1 2 3 +5 0 1 2 3 +6 0 1 2 3 +7 0 1 2 3 +8 0 1 2 3 +9 0 1 2 3 +-- nth_value with frame range specified +select + number, + nth_value(number, 1) over w as firstValue, + nth_value(number, 2) over w as secondValue, + nth_value(number, 3) over w as thirdValue, + nth_value(number, 4) over w as fourthValue +from numbers(10) +window w as (order by number range between 1 preceding and 1 following) +order by number +; +0 0 1 0 0 +1 0 1 2 0 +2 1 2 3 0 +3 2 3 4 0 +4 3 4 5 0 +5 4 5 6 0 +6 5 6 7 0 +7 6 7 8 0 +8 7 8 9 0 +9 8 9 0 0 +-- to make nth_value return null for out-of-frame rows, cast the argument to +-- Nullable; otherwise, it returns default values. +SELECT + number, + nth_value(toNullable(number), 1) OVER w as firstValue, + nth_value(toNullable(number), 3) OVER w as thridValue +FROM numbers(5) +WINDOW w AS (ORDER BY number ASC) +; +0 0 \N +1 0 \N +2 0 2 +3 0 2 +4 0 2 -- In this case, we had a problem with PartialSortingTransform returning zero-row -- chunks for input chunks w/o columns. select count() over () from numbers(4) where number < 2; diff --git a/tests/queries/0_stateless/01591_window_functions.sql b/tests/queries/0_stateless/01591_window_functions.sql index 05f4cb49252..3075c1ddb46 100644 --- a/tests/queries/0_stateless/01591_window_functions.sql +++ b/tests/queries/0_stateless/01591_window_functions.sql @@ -1,7 +1,5 @@ -- { echo } -set allow_experimental_window_functions = 1; - -- just something basic select number, count() over (partition by intDiv(number, 3) order by number rows unbounded preceding) from numbers(10); @@ -379,7 +377,19 @@ settings max_block_size = 3; -- careful with auto-application of Null combinator select lagInFrame(toNullable(1)) over (); select lagInFrameOrNull(1) over (); -- { serverError 36 } +-- this is the same as `select max(Null::Nullable(Nothing))` select intDiv(1, NULL) x, toTypeName(x), max(x) over (); +-- to make lagInFrame return null for out-of-frame rows, cast the argument to +-- Nullable; otherwise, it returns default values. +SELECT + number, + lagInFrame(toNullable(number), 1) OVER w, + lagInFrame(toNullable(number), 2) OVER w, + lagInFrame(number, 1) OVER w, + lagInFrame(number, 2) OVER w +FROM numbers(4) +WINDOW w AS (ORDER BY number ASC) +; -- case-insensitive SQL-standard synonyms for any and anyLast select @@ -391,6 +401,40 @@ window w as (order by number range between 1 preceding and 1 following) order by number ; +-- nth_value without specific frame range given +select + number, + nth_value(number, 1) over w as firstValue, + nth_value(number, 2) over w as secondValue, + nth_value(number, 3) over w as thirdValue, + nth_value(number, 4) over w as fourthValue +from numbers(10) +window w as (order by number) +order by number +; + +-- nth_value with frame range specified +select + number, + nth_value(number, 1) over w as firstValue, + nth_value(number, 2) over w as secondValue, + nth_value(number, 3) over w as thirdValue, + nth_value(number, 4) over w as fourthValue +from numbers(10) +window w as (order by number range between 1 preceding and 1 following) +order by number +; + +-- to make nth_value return null for out-of-frame rows, cast the argument to +-- Nullable; otherwise, it returns default values. +SELECT + number, + nth_value(toNullable(number), 1) OVER w as firstValue, + nth_value(toNullable(number), 3) OVER w as thridValue +FROM numbers(5) +WINDOW w AS (ORDER BY number ASC) +; + -- In this case, we had a problem with PartialSortingTransform returning zero-row -- chunks for input chunks w/o columns. select count() over () from numbers(4) where number < 2; diff --git a/tests/queries/0_stateless/01592_long_window_functions1.sql b/tests/queries/0_stateless/01592_long_window_functions1.sql index bb0f77ff60a..14fe3affed3 100644 --- a/tests/queries/0_stateless/01592_long_window_functions1.sql +++ b/tests/queries/0_stateless/01592_long_window_functions1.sql @@ -1,6 +1,5 @@ drop table if exists stack; -set allow_experimental_window_functions = 1; set max_insert_threads = 4; create table stack(item_id Int64, brand_id Int64, rack_id Int64, dt DateTime, expiration_dt DateTime, quantity UInt64) diff --git a/tests/queries/0_stateless/01592_window_functions.reference b/tests/queries/0_stateless/01592_window_functions.reference index 8ca5086821b..ec957dd7a02 100644 --- a/tests/queries/0_stateless/01592_window_functions.reference +++ b/tests/queries/0_stateless/01592_window_functions.reference @@ -1,81 +1,81 @@ ---- Q1 ---- -Dell Vostro 800.00 Laptop 850 -HP Elite 1200.00 Laptop 850 -Lenovo Thinkpad 700.00 Laptop 850 -Sony VAIO 700.00 Laptop 850 -HTC One 400.00 Smartphone 500 -Microsoft Lumia 200.00 Smartphone 500 -Nexus 500.00 Smartphone 500 -iPhone 900.00 Smartphone 500 -Kindle Fire 150.00 Tablet 350 -Samsung Galaxy Tab 200.00 Tablet 350 -iPad 700.00 Tablet 350 +Dell Vostro 800 Laptop 850 +HP Elite 1200 Laptop 850 +Lenovo Thinkpad 700 Laptop 850 +Sony VAIO 700 Laptop 850 +HTC One 400 Smartphone 500 +Microsoft Lumia 200 Smartphone 500 +Nexus 500 Smartphone 500 +iPhone 900 Smartphone 500 +Kindle Fire 150 Tablet 350 +Samsung Galaxy Tab 200 Tablet 350 +iPad 700 Tablet 350 ---- Q2 ---- -Lenovo Thinkpad Laptop 700.00 1 -Sony VAIO Laptop 700.00 1 -Dell Vostro Laptop 800.00 3 -HP Elite Laptop 1200.00 4 -Microsoft Lumia Smartphone 200.00 1 -HTC One Smartphone 400.00 2 -Nexus Smartphone 500.00 3 -iPhone Smartphone 900.00 4 -Kindle Fire Tablet 150.00 1 -Samsung Galaxy Tab Tablet 200.00 2 -iPad Tablet 700.00 3 +Lenovo Thinkpad Laptop 700 1 +Sony VAIO Laptop 700 1 +Dell Vostro Laptop 800 3 +HP Elite Laptop 1200 4 +Microsoft Lumia Smartphone 200 1 +HTC One Smartphone 400 2 +Nexus Smartphone 500 3 +iPhone Smartphone 900 4 +Kindle Fire Tablet 150 1 +Samsung Galaxy Tab Tablet 200 2 +iPad Tablet 700 3 ---- Q3 ---- -HP Elite Laptop 1200.00 1 -Dell Vostro Laptop 800.00 2 -Lenovo Thinkpad Laptop 700.00 3 -Sony VAIO Laptop 700.00 4 -iPhone Smartphone 900.00 1 -Nexus Smartphone 500.00 2 -HTC One Smartphone 400.00 3 -Microsoft Lumia Smartphone 200.00 4 -iPad Tablet 700.00 1 -Samsung Galaxy Tab Tablet 200.00 2 -Kindle Fire Tablet 150.00 3 +HP Elite Laptop 1200 1 +Dell Vostro Laptop 800 2 +Lenovo Thinkpad Laptop 700 3 +Sony VAIO Laptop 700 4 +iPhone Smartphone 900 1 +Nexus Smartphone 500 2 +HTC One Smartphone 400 3 +Microsoft Lumia Smartphone 200 4 +iPad Tablet 700 1 +Samsung Galaxy Tab Tablet 200 2 +Kindle Fire Tablet 150 3 ---- Q4 ---- -Lenovo Thinkpad Laptop 700.00 700.00 1 -Sony VAIO Laptop 700.00 700.00 1 -Dell Vostro Laptop 800.00 700.00 2 -HP Elite Laptop 1200.00 700.00 3 -Microsoft Lumia Smartphone 200.00 200.00 1 -HTC One Smartphone 400.00 200.00 2 -Nexus Smartphone 500.00 200.00 3 -iPhone Smartphone 900.00 200.00 4 +Lenovo Thinkpad Laptop 700 700 1 +Sony VAIO Laptop 700 700 1 +Dell Vostro Laptop 800 700 2 +HP Elite Laptop 1200 700 3 +Microsoft Lumia Smartphone 200 200 1 +HTC One Smartphone 400 200 2 +Nexus Smartphone 500 200 3 +iPhone Smartphone 900 200 4 ---- Q5 ---- -Sony VAIO Laptop 700.00 700.00 -Lenovo Thinkpad Laptop 700.00 700.00 -HP Elite Laptop 1200.00 700.00 -Dell Vostro Laptop 800.00 700.00 -iPhone Smartphone 900.00 900.00 -Nexus Smartphone 500.00 900.00 -Microsoft Lumia Smartphone 200.00 900.00 -HTC One Smartphone 400.00 900.00 -iPad Tablet 700.00 700.00 -Samsung Galaxy Tab Tablet 200.00 700.00 -Kindle Fire Tablet 150.00 700.00 +Sony VAIO Laptop 700 700 +Lenovo Thinkpad Laptop 700 700 +HP Elite Laptop 1200 700 +Dell Vostro Laptop 800 700 +iPhone Smartphone 900 900 +Nexus Smartphone 500 900 +Microsoft Lumia Smartphone 200 900 +HTC One Smartphone 400 900 +iPad Tablet 700 700 +Samsung Galaxy Tab Tablet 200 700 +Kindle Fire Tablet 150 700 ---- Q6 ---- -Dell Vostro Laptop 800.00 1200.00 -HP Elite Laptop 1200.00 1200.00 -Lenovo Thinkpad Laptop 700.00 1200.00 -Sony VAIO Laptop 700.00 1200.00 -HTC One Smartphone 400.00 900.00 -Microsoft Lumia Smartphone 200.00 900.00 -Nexus Smartphone 500.00 900.00 -iPhone Smartphone 900.00 900.00 -Kindle Fire Tablet 150.00 700.00 -Samsung Galaxy Tab Tablet 200.00 700.00 -iPad Tablet 700.00 700.00 +Dell Vostro Laptop 800 1200 +HP Elite Laptop 1200 1200 +Lenovo Thinkpad Laptop 700 1200 +Sony VAIO Laptop 700 1200 +HTC One Smartphone 400 900 +Microsoft Lumia Smartphone 200 900 +Nexus Smartphone 500 900 +iPhone Smartphone 900 900 +Kindle Fire Tablet 150 700 +Samsung Galaxy Tab Tablet 200 700 +iPad Tablet 700 700 ---- Q7 ---- -Dell Vostro 800.00 Laptop 733 850 -HP Elite 1200.00 Laptop 850 850 -Lenovo Thinkpad 700.00 Laptop 700 850 -Sony VAIO 700.00 Laptop 700 850 -HTC One 400.00 Smartphone 300 500 -Microsoft Lumia 200.00 Smartphone 200 500 -Nexus 500.00 Smartphone 367 500 -iPhone 900.00 Smartphone 500 500 -Kindle Fire 150.00 Tablet 150 350 -Samsung Galaxy Tab 200.00 Tablet 175 350 -iPad 700.00 Tablet 350 350 +Dell Vostro 800 Laptop 733 850 +HP Elite 1200 Laptop 850 850 +Lenovo Thinkpad 700 Laptop 700 850 +Sony VAIO 700 Laptop 700 850 +HTC One 400 Smartphone 300 500 +Microsoft Lumia 200 Smartphone 200 500 +Nexus 500 Smartphone 367 500 +iPhone 900 Smartphone 500 500 +Kindle Fire 150 Tablet 150 350 +Samsung Galaxy Tab 200 Tablet 175 350 +iPad 700 Tablet 350 350 diff --git a/tests/queries/0_stateless/01592_window_functions.sql b/tests/queries/0_stateless/01592_window_functions.sql index 8d5033fc821..b05b04628d2 100644 --- a/tests/queries/0_stateless/01592_window_functions.sql +++ b/tests/queries/0_stateless/01592_window_functions.sql @@ -1,5 +1,3 @@ -set allow_experimental_window_functions = 1; - drop table if exists product_groups; drop table if exists products; diff --git a/tests/queries/0_stateless/01600_log_queries_with_extensive_info.reference b/tests/queries/0_stateless/01600_log_queries_with_extensive_info.reference index 453827808f4..701e72b3b8e 100644 --- a/tests/queries/0_stateless/01600_log_queries_with_extensive_info.reference +++ b/tests/queries/0_stateless/01600_log_queries_with_extensive_info.reference @@ -6,6 +6,7 @@ create database test_log_queries 18329631544365042880 Create ['test_log_queries' create table test_log_queries.logtable(i int, j int, k int) engine MergeTree order by i 14473140110122260412 Create ['test_log_queries'] ['test_log_queries.logtable'] [] insert into test_log_queries.logtable values 10533878590475998223 Insert ['test_log_queries'] ['test_log_queries.logtable'] [] select k from test_log_queries.logtable where i = 4 10551554599491277990 Select ['test_log_queries'] ['test_log_queries.logtable'] ['test_log_queries.logtable.i','test_log_queries.logtable.k'] +select k from test_log_queries.logtable where i > \'\' 10861140285495151963 Select [] [] [] select k from test_log_queries.logtable where i = 1 10551554599491277990 Select ['test_log_queries'] ['test_log_queries.logtable'] ['test_log_queries.logtable.i','test_log_queries.logtable.k'] select * from test_log_queries.logtable where i = 1 2790142879136771124 Select ['test_log_queries'] ['test_log_queries.logtable'] ['test_log_queries.logtable.i','test_log_queries.logtable.j','test_log_queries.logtable.k'] create table test_log_queries.logtable2 as test_log_queries.logtable 16326833375045356331 Create ['test_log_queries'] ['test_log_queries.logtable','test_log_queries.logtable2'] [] diff --git a/tests/queries/0_stateless/01600_log_queries_with_extensive_info.sh b/tests/queries/0_stateless/01600_log_queries_with_extensive_info.sh index a6a8f221084..6f0f1c29208 100755 --- a/tests/queries/0_stateless/01600_log_queries_with_extensive_info.sh +++ b/tests/queries/0_stateless/01600_log_queries_with_extensive_info.sh @@ -10,6 +10,10 @@ ${CLICKHOUSE_CLIENT} -q "create database test_log_queries" "--query_id=01600_log ${CLICKHOUSE_CLIENT} -q "create table test_log_queries.logtable(i int, j int, k int) engine MergeTree order by i" "--query_id=01600_log_queries_with_extensive_info_002" ${CLICKHOUSE_CLIENT} -q "insert into test_log_queries.logtable values (1,2,3), (4,5,6)" "--query_id=01600_log_queries_with_extensive_info_003" ${CLICKHOUSE_CLIENT} -q "select k from test_log_queries.logtable where i = 4" "--query_id=01600_log_queries_with_extensive_info_004" + +# exception query should also contain query_kind +${CLICKHOUSE_CLIENT} -q "select k from test_log_queries.logtable where i > ''" "--query_id=01600_log_queries_with_extensive_info_004_err" 2> /dev/null || true + ${CLICKHOUSE_CLIENT} -q "select k from test_log_queries.logtable where i = 1" "--query_id=01600_log_queries_with_extensive_info_005" ${CLICKHOUSE_CLIENT} -q "select * from test_log_queries.logtable where i = 1" "--query_id=01600_log_queries_with_extensive_info_006" ${CLICKHOUSE_CLIENT} -q "create table test_log_queries.logtable2 as test_log_queries.logtable" "--query_id=01600_log_queries_with_extensive_info_007" @@ -26,4 +30,4 @@ ${CLICKHOUSE_CLIENT} -q "drop table if exists test_log_queries.logtable3" "--que ${CLICKHOUSE_CLIENT} -q "drop database if exists test_log_queries" "--query_id=01600_log_queries_with_extensive_info_018" ${CLICKHOUSE_CLIENT} -q "system flush logs" -${CLICKHOUSE_CLIENT} -q "select columns(query, normalized_query_hash, query_kind, databases, tables, columns) apply (any) from system.query_log where current_database = currentDatabase() AND type = 'QueryFinish' and query_id like '01600_log_queries_with_extensive_info%' group by query_id order by query_id" +${CLICKHOUSE_CLIENT} -q "select columns(query, normalized_query_hash, query_kind, databases, tables, columns) apply (any) from system.query_log where current_database = currentDatabase() AND type != 'QueryStart' and query_id like '01600_log_queries_with_extensive_info%' group by query_id order by query_id" diff --git a/tests/queries/0_stateless/01600_quota_by_forwarded_ip.sh b/tests/queries/0_stateless/01600_quota_by_forwarded_ip.sh index 323dd88efab..97e4da5f9e3 100755 --- a/tests/queries/0_stateless/01600_quota_by_forwarded_ip.sh +++ b/tests/queries/0_stateless/01600_quota_by_forwarded_ip.sh @@ -6,20 +6,14 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) $CLICKHOUSE_CLIENT -n --query " -DROP USER IF EXISTS quoted_by_ip; -DROP USER IF EXISTS quoted_by_forwarded_ip; +CREATE USER quoted_by_ip_${CLICKHOUSE_DATABASE}; +CREATE USER quoted_by_forwarded_ip_${CLICKHOUSE_DATABASE}; -DROP QUOTA IF EXISTS quota_by_ip; -DROP QUOTA IF EXISTS quota_by_forwarded_ip; +GRANT SELECT, CREATE ON *.* TO quoted_by_ip_${CLICKHOUSE_DATABASE}; +GRANT SELECT, CREATE ON *.* TO quoted_by_forwarded_ip_${CLICKHOUSE_DATABASE}; -CREATE USER quoted_by_ip; -CREATE USER quoted_by_forwarded_ip; - -GRANT SELECT, CREATE ON *.* TO quoted_by_ip; -GRANT SELECT, CREATE ON *.* TO quoted_by_forwarded_ip; - -CREATE QUOTA quota_by_ip KEYED BY ip_address FOR RANDOMIZED INTERVAL 1 YEAR MAX QUERIES = 1 TO quoted_by_ip; -CREATE QUOTA quota_by_forwarded_ip KEYED BY forwarded_ip_address FOR RANDOMIZED INTERVAL 1 YEAR MAX QUERIES = 1 TO quoted_by_forwarded_ip; +CREATE QUOTA quota_by_ip_${CLICKHOUSE_DATABASE} KEYED BY ip_address FOR RANDOMIZED INTERVAL 1 YEAR MAX QUERIES = 1 TO quoted_by_ip_${CLICKHOUSE_DATABASE}; +CREATE QUOTA quota_by_forwarded_ip_${CLICKHOUSE_DATABASE} KEYED BY forwarded_ip_address FOR RANDOMIZED INTERVAL 1 YEAR MAX QUERIES = 1 TO quoted_by_forwarded_ip_${CLICKHOUSE_DATABASE}; " # Note: the test can be flaky if the randomized interval will end while the loop is run. But with year long interval it's unlikely. @@ -28,39 +22,39 @@ CREATE QUOTA quota_by_forwarded_ip KEYED BY forwarded_ip_address FOR RANDOMIZED echo '--- Test with quota by immediate IP ---' while true; do - $CLICKHOUSE_CLIENT --user quoted_by_ip --query "SELECT count() FROM numbers(10)" 2>/dev/null || break + ${CLICKHOUSE_CURL} --fail -sS "${CLICKHOUSE_URL}&user=quoted_by_ip_${CLICKHOUSE_DATABASE}" -d "SELECT count() FROM numbers(10)" 2>/dev/null || break done | uniq -${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&user=quoted_by_ip" -d "SELECT count() FROM numbers(10)" | grep -oF 'exceeded' +${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&user=quoted_by_ip_${CLICKHOUSE_DATABASE}" -d "SELECT count() FROM numbers(10)" | grep -oF 'exceeded' # X-Forwarded-For is ignored for quota by immediate IP address -${CLICKHOUSE_CURL} -H 'X-Forwarded-For: 1.2.3.4' -sS "${CLICKHOUSE_URL}&user=quoted_by_ip" -d "SELECT count() FROM numbers(10)" | grep -oF 'exceeded' +${CLICKHOUSE_CURL} -H 'X-Forwarded-For: 1.2.3.4' -sS "${CLICKHOUSE_URL}&user=quoted_by_ip_${CLICKHOUSE_DATABASE}" -d "SELECT count() FROM numbers(10)" | grep -oF 'exceeded' echo '--- Test with quota by forwarded IP ---' while true; do - $CLICKHOUSE_CLIENT --user quoted_by_forwarded_ip --query "SELECT count() FROM numbers(10)" 2>/dev/null || break + ${CLICKHOUSE_CURL} --fail -sS "${CLICKHOUSE_URL}&user=quoted_by_forwarded_ip_${CLICKHOUSE_DATABASE}" -d "SELECT count() FROM numbers(10)" 2>/dev/null || break done | uniq -${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&user=quoted_by_forwarded_ip" -d "SELECT count() FROM numbers(10)" | grep -oF 'exceeded' +${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&user=quoted_by_forwarded_ip_${CLICKHOUSE_DATABASE}" -d "SELECT count() FROM numbers(10)" | grep -oF 'exceeded' # X-Forwarded-For is respected for quota by forwarded IP address while true; do - ${CLICKHOUSE_CURL} -H 'X-Forwarded-For: 1.2.3.4' -sS "${CLICKHOUSE_URL}&user=quoted_by_forwarded_ip" -d "SELECT count() FROM numbers(10)" | grep -oP '^10$' || break + ${CLICKHOUSE_CURL} -H 'X-Forwarded-For: 1.2.3.4' -sS "${CLICKHOUSE_URL}&user=quoted_by_forwarded_ip_${CLICKHOUSE_DATABASE}" -d "SELECT count() FROM numbers(10)" | grep -oP '^10$' || break done | uniq -${CLICKHOUSE_CURL} -H 'X-Forwarded-For: 1.2.3.4' -sS "${CLICKHOUSE_URL}&user=quoted_by_forwarded_ip" -d "SELECT count() FROM numbers(10)" | grep -oF 'exceeded' +${CLICKHOUSE_CURL} -H 'X-Forwarded-For: 1.2.3.4' -sS "${CLICKHOUSE_URL}&user=quoted_by_forwarded_ip_${CLICKHOUSE_DATABASE}" -d "SELECT count() FROM numbers(10)" | grep -oF 'exceeded' # Only the last IP address is trusted -${CLICKHOUSE_CURL} -H 'X-Forwarded-For: 5.6.7.8, 1.2.3.4' -sS "${CLICKHOUSE_URL}&user=quoted_by_forwarded_ip" -d "SELECT count() FROM numbers(10)" | grep -oF 'exceeded' +${CLICKHOUSE_CURL} -H 'X-Forwarded-For: 5.6.7.8, 1.2.3.4' -sS "${CLICKHOUSE_URL}&user=quoted_by_forwarded_ip_${CLICKHOUSE_DATABASE}" -d "SELECT count() FROM numbers(10)" | grep -oF 'exceeded' -${CLICKHOUSE_CURL} -H 'X-Forwarded-For: 1.2.3.4, 5.6.7.8' -sS "${CLICKHOUSE_URL}&user=quoted_by_forwarded_ip" -d "SELECT count() FROM numbers(10)" +${CLICKHOUSE_CURL} -H 'X-Forwarded-For: 1.2.3.4, 5.6.7.8' -sS "${CLICKHOUSE_URL}&user=quoted_by_forwarded_ip_${CLICKHOUSE_DATABASE}" -d "SELECT count() FROM numbers(10)" $CLICKHOUSE_CLIENT -n --query " -DROP QUOTA IF EXISTS quota_by_ip; +DROP QUOTA IF EXISTS quota_by_ip_${CLICKHOUSE_DATABASE}; DROP QUOTA IF EXISTS quota_by_forwarded_ip; -DROP USER IF EXISTS quoted_by_ip; -DROP USER IF EXISTS quoted_by_forwarded_ip; +DROP USER IF EXISTS quoted_by_ip_${CLICKHOUSE_DATABASE}; +DROP USER IF EXISTS quoted_by_forwarded_ip_${CLICKHOUSE_DATABASE}; " diff --git a/tests/queries/0_stateless/01601_accurate_cast.reference b/tests/queries/0_stateless/01601_accurate_cast.reference index 6ccedbdcfea..c1e7feffbe6 100644 --- a/tests/queries/0_stateless/01601_accurate_cast.reference +++ b/tests/queries/0_stateless/01601_accurate_cast.reference @@ -4,5 +4,5 @@ 5 5 5 -1.000000000 +1 12 diff --git a/tests/queries/0_stateless/01601_custom_tld.reference b/tests/queries/0_stateless/01601_custom_tld.reference index e056505f273..04204ebf02a 100644 --- a/tests/queries/0_stateless/01601_custom_tld.reference +++ b/tests/queries/0_stateless/01601_custom_tld.reference @@ -22,3 +22,9 @@ foobar.com foobar.com foobar.com xx.blogspot.co.at +-- www +www.foo +foo +-- vector +xx.blogspot.co.at + diff --git a/tests/queries/0_stateless/01601_custom_tld.sql b/tests/queries/0_stateless/01601_custom_tld.sql index 688dd419858..ceb00d5ff19 100644 --- a/tests/queries/0_stateless/01601_custom_tld.sql +++ b/tests/queries/0_stateless/01601_custom_tld.sql @@ -29,3 +29,11 @@ select cutToFirstSignificantSubdomainCustom('http://foobar.com', 'public_suffix_ select cutToFirstSignificantSubdomainCustom('http://foobar.com/foo', 'public_suffix_list'); select cutToFirstSignificantSubdomainCustom('http://bar.foobar.com/foo', 'public_suffix_list'); select cutToFirstSignificantSubdomainCustom('http://xx.blogspot.co.at', 'public_suffix_list'); + +select '-- www'; +select cutToFirstSignificantSubdomainCustomWithWWW('http://www.foo', 'public_suffix_list'); +select cutToFirstSignificantSubdomainCustom('http://www.foo', 'public_suffix_list'); + +select '-- vector'; +select cutToFirstSignificantSubdomainCustom('http://xx.blogspot.co.at/' || toString(number), 'public_suffix_list') from numbers(1); +select cutToFirstSignificantSubdomainCustom('there-is-no-such-domain' || toString(number), 'public_suffix_list') from numbers(1); diff --git a/tests/queries/0_stateless/01602_array_aggregation.reference b/tests/queries/0_stateless/01602_array_aggregation.reference index 4baef982f29..bc21fae692e 100644 --- a/tests/queries/0_stateless/01602_array_aggregation.reference +++ b/tests/queries/0_stateless/01602_array_aggregation.reference @@ -19,17 +19,17 @@ Table array int avg 0 2 Table array decimal min -1.00000000 -0.00000000 -1.00000000 +1 +0 +1 Table array decimal max -6.00000000 -0.00000000 -3.00000000 +6 +0 +3 Table array decimal sum -21.00000000 -0.00000000 -6.00000000 +21 +0 +6 Table array decimal avg 3.5 0 diff --git a/tests/queries/0_stateless/01611_constant_folding_subqueries.reference b/tests/queries/0_stateless/01611_constant_folding_subqueries.reference index e46fd479413..c3df2314112 100644 --- a/tests/queries/0_stateless/01611_constant_folding_subqueries.reference +++ b/tests/queries/0_stateless/01611_constant_folding_subqueries.reference @@ -5,7 +5,7 @@ SELECT (SELECT * FROM system.numbers LIMIT 1 OFFSET 1) AS n, toUInt64(10 / n) FO 1,10 EXPLAIN SYNTAX SELECT (SELECT * FROM system.numbers LIMIT 1 OFFSET 1) AS n, toUInt64(10 / n); SELECT - identity(CAST(0, \'UInt64\')) AS n, + identity(_CAST(0, \'Nullable(UInt64)\')) AS n, toUInt64(10 / n) SELECT * FROM (WITH (SELECT * FROM system.numbers LIMIT 1 OFFSET 1) AS n, toUInt64(10 / n) as q SELECT * FROM system.one WHERE q > 0); 0 diff --git a/tests/queries/0_stateless/01615_random_one_shard_insertion.reference b/tests/queries/0_stateless/01615_random_one_shard_insertion.reference index 448a73c4789..20ed3c2d518 100644 --- a/tests/queries/0_stateless/01615_random_one_shard_insertion.reference +++ b/tests/queries/0_stateless/01615_random_one_shard_insertion.reference @@ -1,8 +1,22 @@ -0 -0 1 1 -2 +0 +1 2 3 -3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 diff --git a/tests/queries/0_stateless/01615_random_one_shard_insertion.sql b/tests/queries/0_stateless/01615_random_one_shard_insertion.sql index 7d07629feda..59412adbdbf 100644 --- a/tests/queries/0_stateless/01615_random_one_shard_insertion.sql +++ b/tests/queries/0_stateless/01615_random_one_shard_insertion.sql @@ -1,22 +1,26 @@ -drop table if exists shard; +create database if not exists shard_0; +create database if not exists shard_1; +drop table if exists shard_0.tbl; +drop table if exists shard_1.tbl; drop table if exists distr; -create table shard (id Int32) engine = MergeTree order by cityHash64(id); -create table distr as shard engine Distributed (test_cluster_two_shards_localhost, currentDatabase(), shard); - -insert into distr (id) values (0), (1); -- { serverError 55; } +create table shard_0.tbl (number UInt64) engine = MergeTree order by number; +create table shard_1.tbl (number UInt64) engine = MergeTree order by number; +create table distr (number UInt64) engine = Distributed(test_cluster_two_shards_different_databases, '', tbl); set insert_distributed_sync = 1; - -insert into distr (id) values (0), (1); -- { serverError 55; } - -set insert_distributed_sync = 0; set insert_distributed_one_random_shard = 1; +set max_block_size = 1; +set max_insert_block_size = 1; +set min_insert_block_size_rows = 1; +insert into distr select number from numbers(20); -insert into distr (id) values (0), (1); -insert into distr (id) values (2), (3); +select count() != 0 from shard_0.tbl; +select count() != 0 from shard_1.tbl; +select * from distr order by number; -select * from distr order by id; - -drop table if exists shard; -drop table if exists distr; +drop table if exists shard_0.tbl; +drop table if exists shard_1.tbl; +drop database shard_0; +drop database shard_1; +drop table distr; diff --git a/tests/queries/0_stateless/01616_untuple_access_field.reference b/tests/queries/0_stateless/01616_untuple_access_field.reference index d00491fd7e5..9874d6464ab 100644 --- a/tests/queries/0_stateless/01616_untuple_access_field.reference +++ b/tests/queries/0_stateless/01616_untuple_access_field.reference @@ -1 +1 @@ -1 +1 2 diff --git a/tests/queries/0_stateless/01616_untuple_access_field.sql b/tests/queries/0_stateless/01616_untuple_access_field.sql index 569efca5349..82cdf80c8bc 100644 --- a/tests/queries/0_stateless/01616_untuple_access_field.sql +++ b/tests/queries/0_stateless/01616_untuple_access_field.sql @@ -1 +1 @@ -select _ut_1 from (select untuple((1,2))); +select * from (select untuple((1,2))); diff --git a/tests/queries/0_stateless/01622_byte_size.reference b/tests/queries/0_stateless/01622_byte_size.reference index cae5bc94f9e..580a36a5c68 100644 --- a/tests/queries/0_stateless/01622_byte_size.reference +++ b/tests/queries/0_stateless/01622_byte_size.reference @@ -25,11 +25,11 @@ constants: 9 a 10 abcde 14 byteSize for simple array 1 60 [] 8 [] 8 [] 8 [] 8 [] 8 [] 8 [] 8 -2 92 [1] 9 [-1] 9 [256] 12 [1.1] 12 [1.1000] 12 ['2020-01-01'] 10 ['61f0c404-5cb3-11e7-907b-a6006ad3dba0'] 24 -3 124 [1,1] 10 [-1,-1] 10 [256,256] 16 [1.1,1.1] 16 [1.1000,1.1000] 16 ['2020-01-01','2020-01-01'] 12 ['61f0c404-5cb3-11e7-907b-a6006ad3dba0','61f0c404-5cb3-11e7-907b-a6006ad3dba0'] 40 -4 156 [1,1,1] 11 [-1,-1,-1] 11 [256,256,256] 20 [1.1,1.1,1.1] 20 [1.1000,1.1000,1.1000] 20 ['2020-01-01','2020-01-01','2020-01-01'] 14 ['61f0c404-5cb3-11e7-907b-a6006ad3dba0','61f0c404-5cb3-11e7-907b-a6006ad3dba0','61f0c404-5cb3-11e7-907b-a6006ad3dba0'] 56 +2 92 [1] 9 [-1] 9 [256] 12 [1.1] 12 [1.1] 12 ['2020-01-01'] 10 ['61f0c404-5cb3-11e7-907b-a6006ad3dba0'] 24 +3 124 [1,1] 10 [-1,-1] 10 [256,256] 16 [1.1,1.1] 16 [1.1,1.1] 16 ['2020-01-01','2020-01-01'] 12 ['61f0c404-5cb3-11e7-907b-a6006ad3dba0','61f0c404-5cb3-11e7-907b-a6006ad3dba0'] 40 +4 156 [1,1,1] 11 [-1,-1,-1] 11 [256,256,256] 20 [1.1,1.1,1.1] 20 [1.1,1.1,1.1] 20 ['2020-01-01','2020-01-01','2020-01-01'] 14 ['61f0c404-5cb3-11e7-907b-a6006ad3dba0','61f0c404-5cb3-11e7-907b-a6006ad3dba0','61f0c404-5cb3-11e7-907b-a6006ad3dba0'] 56 constants: [] 8 [1,1] 10 [-1,-1] 10 Array(UInt16) 12 Array(Float64) 24 -constants: [1.1000,1.1000] 16 ['2020-01-01','2020-01-01'] 12 +constants: [1.1,1.1] 16 ['2020-01-01','2020-01-01'] 12 constants: ['61f0c404-5cb3-11e7-907b-a6006ad3dba0','61f0c404-5cb3-11e7-907b-a6006ad3dba0'] 40 byteSize for int array of arrays diff --git a/tests/queries/0_stateless/01622_defaults_for_url_engine.sh b/tests/queries/0_stateless/01622_defaults_for_url_engine.sh index 7afdbbc6b66..491a1bd8988 100755 --- a/tests/queries/0_stateless/01622_defaults_for_url_engine.sh +++ b/tests/queries/0_stateless/01622_defaults_for_url_engine.sh @@ -7,8 +7,6 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) PORT="$(($RANDOM%63000+2001))" -TEMP_FILE="${CLICKHOUSE_TMP}/01622_defaults_for_url_engine.tmp" - function thread1 { while true; do @@ -19,7 +17,7 @@ function thread1 function thread2 { while true; do - $CLICKHOUSE_CLIENT --input_format_defaults_for_omitted_fields=1 -q "SELECT * FROM url('http://127.0.0.1:$1/', JSONEachRow, 'a int, b int default 7, c default a + b') format Values" + $CLICKHOUSE_CLIENT --input_format_defaults_for_omitted_fields=1 -q "SELECT * FROM url('http://127.0.0.1:$1/', JSONEachRow, 'a int, b int default 7, c default a + b') format Values" | grep -F '(1,7,8)' && break done } @@ -27,11 +25,11 @@ function thread2 export -f thread1; export -f thread2; -TIMEOUT=5 +TIMEOUT=60 timeout $TIMEOUT bash -c "thread1 $PORT" > /dev/null 2>&1 & -timeout $TIMEOUT bash -c "thread2 $PORT" 2> /dev/null > $TEMP_FILE & +PID=$! -wait +bash -c "thread2 $PORT" 2> /dev/null | grep -q -F '(1,7,8)' && echo "Ok" && kill -9 $PID -grep -q '(1,7,8)' $TEMP_FILE && echo "Ok" +wait >/dev/null 2>&1 diff --git a/tests/queries/0_stateless/01632_group_array_msan.sql b/tests/queries/0_stateless/01632_group_array_msan.sql index 0000f158d4e..f67ff896c3f 100644 --- a/tests/queries/0_stateless/01632_group_array_msan.sql +++ b/tests/queries/0_stateless/01632_group_array_msan.sql @@ -1 +1,4 @@ -SELECT groupArrayMerge(1048577)(y * 1048576) FROM (SELECT groupArrayState(9223372036854775807)(x) AS y FROM (SELECT 1048576 AS x)) FORMAT Null; +SELECT groupArrayMerge(1048577)(y * 1048576) FROM (SELECT groupArrayState(9223372036854775807)(x) AS y FROM (SELECT 1048576 AS x)) FORMAT Null; -- { serverError 43 } +SELECT groupArrayMerge(1048577)(y * 1048576) FROM (SELECT groupArrayState(1048577)(x) AS y FROM (SELECT 1048576 AS x)) FORMAT Null; +SELECT groupArrayMerge(9223372036854775807)(y * 1048576) FROM (SELECT groupArrayState(9223372036854775807)(x) AS y FROM (SELECT 1048576 AS x)) FORMAT Null; +SELECT quantileResampleMerge(0.5, 257, 65536, 1)(tuple(*).1) FROM (SELECT quantileResampleState(0.10, 1, 2, 42)(number, number) FROM numbers(100)); -- { serverError 43 } diff --git a/tests/queries/0_stateless/01632_nullable_string_type_convert_to_decimal_type.reference b/tests/queries/0_stateless/01632_nullable_string_type_convert_to_decimal_type.reference index b8cf9277350..3045308f844 100644 --- a/tests/queries/0_stateless/01632_nullable_string_type_convert_to_decimal_type.reference +++ b/tests/queries/0_stateless/01632_nullable_string_type_convert_to_decimal_type.reference @@ -1,2 +1,2 @@ -42.10 +42.1 \N diff --git a/tests/queries/0_stateless/01646_system_restart_replicas_smoke.sql b/tests/queries/0_stateless/01646_system_restart_replicas_smoke.sql index cfd70df8dd4..0b7fba5b02e 100644 --- a/tests/queries/0_stateless/01646_system_restart_replicas_smoke.sql +++ b/tests/queries/0_stateless/01646_system_restart_replicas_smoke.sql @@ -1,5 +1,5 @@ DROP TABLE IF EXISTS data_01646; -CREATE TABLE data_01646 (x Date, s String) ENGINE = ReplicatedMergeTree('/clickhouse/tables/test_01646/data_01646', 'r') ORDER BY s PARTITION BY x; +CREATE TABLE data_01646 (x Date, s String) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/test_01646/data_01646', 'r') ORDER BY s PARTITION BY x; SYSTEM RESTART REPLICAS; DESCRIBE TABLE data_01646; DROP TABLE data_01646; diff --git a/tests/queries/0_stateless/01650_drop_part_and_deduplication_zookeeper.reference b/tests/queries/0_stateless/01650_drop_part_and_deduplication_zookeeper_long.reference similarity index 100% rename from tests/queries/0_stateless/01650_drop_part_and_deduplication_zookeeper.reference rename to tests/queries/0_stateless/01650_drop_part_and_deduplication_zookeeper_long.reference diff --git a/tests/queries/0_stateless/01650_drop_part_and_deduplication_zookeeper.sql b/tests/queries/0_stateless/01650_drop_part_and_deduplication_zookeeper_long.sql similarity index 69% rename from tests/queries/0_stateless/01650_drop_part_and_deduplication_zookeeper.sql rename to tests/queries/0_stateless/01650_drop_part_and_deduplication_zookeeper_long.sql index c3e459dfc49..a839883e683 100644 --- a/tests/queries/0_stateless/01650_drop_part_and_deduplication_zookeeper.sql +++ b/tests/queries/0_stateless/01650_drop_part_and_deduplication_zookeeper_long.sql @@ -5,7 +5,7 @@ CREATE TABLE partitioned_table ( partitioner UInt8, value String ) -ENGINE ReplicatedMergeTree('/clickhouse/01650_drop_part_and_deduplication_partitioned_table', '1') +ENGINE ReplicatedMergeTree('/clickhouse/{database}/01650_drop_part_and_deduplication_partitioned_table', '1') ORDER BY key PARTITION BY partitioner; @@ -16,24 +16,24 @@ INSERT INTO partitioned_table VALUES (11, 1, 'AA'), (22, 2, 'BB'), (33, 3, 'CC') SELECT partition_id, name FROM system.parts WHERE table = 'partitioned_table' AND database = currentDatabase() ORDER BY name; -SELECT substring(name, 1, 2), value FROM system.zookeeper WHERE path='/clickhouse/01650_drop_part_and_deduplication_partitioned_table/blocks/' ORDER BY value; +SELECT substring(name, 1, 2), value FROM system.zookeeper WHERE path='/clickhouse/' || currentDatabase() || '/01650_drop_part_and_deduplication_partitioned_table/blocks/' ORDER BY value; INSERT INTO partitioned_table VALUES (33, 3, 'CC'); -- must be deduplicated SELECT partition_id, name FROM system.parts WHERE table = 'partitioned_table' AND database = currentDatabase() ORDER BY name; -SELECT substring(name, 1, 2), value FROM system.zookeeper WHERE path='/clickhouse/01650_drop_part_and_deduplication_partitioned_table/blocks/' ORDER BY value; +SELECT substring(name, 1, 2), value FROM system.zookeeper WHERE path='/clickhouse/' || currentDatabase() || '/01650_drop_part_and_deduplication_partitioned_table/blocks/' ORDER BY value; ALTER TABLE partitioned_table DROP PART '3_1_1_0'; SELECT partition_id, name FROM system.parts WHERE table = 'partitioned_table' AND database = currentDatabase() ORDER BY name; -SELECT substring(name, 1, 2), value FROM system.zookeeper WHERE path='/clickhouse/01650_drop_part_and_deduplication_partitioned_table/blocks/' ORDER BY value; +SELECT substring(name, 1, 2), value FROM system.zookeeper WHERE path='/clickhouse/' || currentDatabase() || '/01650_drop_part_and_deduplication_partitioned_table/blocks/' ORDER BY value; INSERT INTO partitioned_table VALUES (33, 3, 'CC'); -- mustn't be deduplicated SELECT partition_id, name FROM system.parts WHERE table = 'partitioned_table' AND database = currentDatabase() ORDER BY name; -SELECT substring(name, 1, 2), value FROM system.zookeeper WHERE path='/clickhouse/01650_drop_part_and_deduplication_partitioned_table/blocks/' ORDER BY value; +SELECT substring(name, 1, 2), value FROM system.zookeeper WHERE path='/clickhouse/' || currentDatabase() || '/01650_drop_part_and_deduplication_partitioned_table/blocks/' ORDER BY value; DROP TABLE IF EXISTS partitioned_table; diff --git a/tests/queries/0_stateless/01650_fetch_patition_with_macro_in_zk_path.reference b/tests/queries/0_stateless/01650_fetch_patition_with_macro_in_zk_path_long.reference similarity index 100% rename from tests/queries/0_stateless/01650_fetch_patition_with_macro_in_zk_path.reference rename to tests/queries/0_stateless/01650_fetch_patition_with_macro_in_zk_path_long.reference diff --git a/tests/queries/0_stateless/01650_fetch_patition_with_macro_in_zk_path.sql b/tests/queries/0_stateless/01650_fetch_patition_with_macro_in_zk_path_long.sql similarity index 74% rename from tests/queries/0_stateless/01650_fetch_patition_with_macro_in_zk_path.sql rename to tests/queries/0_stateless/01650_fetch_patition_with_macro_in_zk_path_long.sql index 2c50a7a8516..85b37cee15a 100644 --- a/tests/queries/0_stateless/01650_fetch_patition_with_macro_in_zk_path.sql +++ b/tests/queries/0_stateless/01650_fetch_patition_with_macro_in_zk_path_long.sql @@ -2,17 +2,17 @@ DROP TABLE IF EXISTS test_01640; DROP TABLE IF EXISTS restore_01640; CREATE TABLE test_01640(i Int64, d Date, s String) -ENGINE = ReplicatedMergeTree('/clickhouse/{shard}/tables/test_01640','{replica}') +ENGINE = ReplicatedMergeTree('/clickhouse/{database}/{shard}/tables/test_01640','{replica}') PARTITION BY toYYYYMM(d) ORDER BY i; insert into test_01640 values (1, '2021-01-01','some'); CREATE TABLE restore_01640(i Int64, d Date, s String) -ENGINE = ReplicatedMergeTree('/clickhouse/{shard}/tables/restore_01640','{replica}') +ENGINE = ReplicatedMergeTree('/clickhouse/{database}/{shard}/tables/restore_01640','{replica}') PARTITION BY toYYYYMM(d) ORDER BY i; -ALTER TABLE restore_01640 FETCH PARTITION tuple(toYYYYMM(toDate('2021-01-01'))) - FROM '/clickhouse/{shard}/tables/test_01640'; +ALTER TABLE restore_01640 FETCH PARTITION tuple(toYYYYMM(toDate('2021-01-01'))) + FROM '/clickhouse/{database}/{shard}/tables/test_01640'; SELECT partition_id FROM system.detached_parts diff --git a/tests/queries/0_stateless/01651_bugs_from_15889.reference b/tests/queries/0_stateless/01651_bugs_from_15889.reference index 77ac542d4fb..8b137891791 100644 --- a/tests/queries/0_stateless/01651_bugs_from_15889.reference +++ b/tests/queries/0_stateless/01651_bugs_from_15889.reference @@ -1,2 +1 @@ -0 diff --git a/tests/queries/0_stateless/01651_bugs_from_15889.sql b/tests/queries/0_stateless/01651_bugs_from_15889.sql index d0f1006da95..4717a8dcc0d 100644 --- a/tests/queries/0_stateless/01651_bugs_from_15889.sql +++ b/tests/queries/0_stateless/01651_bugs_from_15889.sql @@ -55,7 +55,7 @@ WHERE (query_id = WHERE current_database = currentDatabase() AND (query LIKE '%test cpu time query profiler%') AND (query NOT LIKE '%system%') ORDER BY event_time DESC LIMIT 1 -)) AND (symbol LIKE '%Source%'); +)) AND (symbol LIKE '%Source%'); -- { serverError 125 } WITH addressToSymbol(arrayJoin(trace)) AS symbol @@ -70,7 +70,7 @@ WHERE greaterOrEquals(event_date, ignore(ignore(ignore(NULL, '')), 256), yesterd WHERE current_database = currentDatabase() AND (event_date >= yesterday()) AND (query LIKE '%test memory profiler%') ORDER BY event_time DESC LIMIT 1 -)); -- { serverError 42 } +)); -- { serverError 125 } DROP TABLE IF EXISTS trace_log; diff --git a/tests/queries/0_stateless/01655_plan_optimizations.reference b/tests/queries/0_stateless/01655_plan_optimizations.reference index 22f5a2e73e3..22876207862 100644 --- a/tests/queries/0_stateless/01655_plan_optimizations.reference +++ b/tests/queries/0_stateless/01655_plan_optimizations.reference @@ -56,7 +56,7 @@ Filter column: notEquals(y, 0) 9 10 > one condition of filter should be pushed down after aggregating, other condition is casted Filter column -FUNCTION CAST(minus(s, 4) :: 1, UInt8 :: 3) -> and(notEquals(y, 0), minus(s, 4)) +FUNCTION _CAST(minus(s, 4) :: 1, UInt8 :: 3) -> and(notEquals(y, 0), minus(s, 4)) Aggregating Filter column: notEquals(y, 0) 0 1 diff --git a/tests/queries/0_stateless/01655_plan_optimizations.sh b/tests/queries/0_stateless/01655_plan_optimizations.sh index 148e6157773..b835bae0e27 100755 --- a/tests/queries/0_stateless/01655_plan_optimizations.sh +++ b/tests/queries/0_stateless/01655_plan_optimizations.sh @@ -56,7 +56,7 @@ $CLICKHOUSE_CLIENT -q " select sum(x) as s, y from (select number as x, number + 1 as y from numbers(10)) group by y ) where y != 0 and s - 4 settings enable_optimize_predicate_expression=0" | - grep -o "Aggregating\|Filter column\|Filter column: notEquals(y, 0)\|FUNCTION CAST(minus(s, 4) :: 1, UInt8 :: 3) -> and(notEquals(y, 0), minus(s, 4))" + grep -o "Aggregating\|Filter column\|Filter column: notEquals(y, 0)\|FUNCTION _CAST(minus(s, 4) :: 1, UInt8 :: 3) -> and(notEquals(y, 0), minus(s, 4))" $CLICKHOUSE_CLIENT -q " select s, y from ( select sum(x) as s, y from (select number as x, number + 1 as y from numbers(10)) group by y diff --git a/tests/queries/0_stateless/01656_sequence_next_node_long.sql b/tests/queries/0_stateless/01656_sequence_next_node_long.sql index d0d01e989b8..9c181f5e491 100644 --- a/tests/queries/0_stateless/01656_sequence_next_node_long.sql +++ b/tests/queries/0_stateless/01656_sequence_next_node_long.sql @@ -4,30 +4,30 @@ DROP TABLE IF EXISTS test_sequenceNextNode_Nullable; CREATE TABLE IF NOT EXISTS test_sequenceNextNode_Nullable (dt DateTime, id int, action Nullable(String)) ENGINE = MergeTree() PARTITION BY dt ORDER BY id; -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:01',1,'A'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:02',1,'B'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:03',1,'C'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:04',1,'D'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:01',2,'B'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:02',2,'B'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:03',2,'D'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:04',2,'C'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:01',3,'A'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:02',3,'B'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:01',4,'A'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:02',4,'A'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:03',4,'A'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:04',4,'B'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:05',4,'C'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:01',5,'A'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:02',5,'B'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:03',5,'A'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:04',5,'C'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:01',6,'A'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:02',6,'B'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:03',6,'A'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:04',6,'B'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:05',6,'C'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:01',1,'A'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:02',1,'B'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:03',1,'C'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:04',1,'D'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:01',2,'B'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:02',2,'B'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:03',2,'D'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:04',2,'C'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:01',3,'A'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:02',3,'B'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:01',4,'A'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:02',4,'A'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:03',4,'A'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:04',4,'B'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:05',4,'C'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:01',5,'A'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:02',5,'B'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:03',5,'A'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:04',5,'C'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:01',6,'A'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:02',6,'B'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:03',6,'A'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:04',6,'B'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:05',6,'C'); SELECT '(forward, head, A)', id, sequenceNextNode('forward', 'head')(dt, action, 1, action = 'A') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; SELECT '(forward, head, B)', id, sequenceNextNode('forward', 'head')(dt, action, 1, action = 'B') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; @@ -50,11 +50,11 @@ SELECT '(forward, head, B->A->A)', id, sequenceNextNode('forward', 'head')(dt, a SELECT '(backward, tail, A->A->B)', id, sequenceNextNode('backward', 'tail')(dt, action, 1, action = 'A', action = 'A', action = 'B') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; SELECT '(backward, tail, B->A->A)', id, sequenceNextNode('backward', 'tail')(dt, action, 1, action = 'B', action = 'A', action = 'A') AS next_node FROM test_sequenceNextNode_Nullable GROUP BY id ORDER BY id; -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:01',10,'A'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:02',10,'B'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:02',10,NULL); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:03',10,'C'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:04',10,'D'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:01',10,'A'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:02',10,'B'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:02',10,NULL); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:03',10,'C'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:04',10,'D'); SELECT '(forward, head, A) id >= 10', id, sequenceNextNode('forward', 'head')(dt, action, 1, action = 'A') AS next_node FROM test_sequenceNextNode_Nullable WHERE id >= 10 GROUP BY id ORDER BY id; SELECT '(forward, head, A) id >= 10', id, sequenceNextNode('forward', 'head')(dt, action, 1, action = 'A', action = 'B') AS next_node FROM test_sequenceNextNode_Nullable WHERE id >= 10 GROUP BY id ORDER BY id; @@ -63,10 +63,10 @@ SELECT '(forward, head, A) id >= 10', id, sequenceNextNode('backward', 'tail')(d SELECT '(backward, tail, A) id >= 10', id, sequenceNextNode('backward', 'tail')(dt, action, 1, action = 'D', action = 'C') AS next_node FROM test_sequenceNextNode_Nullable WHERE id >= 10 GROUP BY id ORDER BY id; SELECT '(backward, tail, A) id >= 10', id, sequenceNextNode('backward', 'tail')(dt, action, 1, action = 'D', action = 'C', action = 'B') AS next_node FROM test_sequenceNextNode_Nullable WHERE id >= 10 GROUP BY id ORDER BY id; -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:01',11,'A'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:01',11,'B'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:01',11,'C'); -INSERT INTO test_sequenceNextNode_Nullable values ('1970-01-01 09:00:01',11,'D'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:01',11,'A'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:01',11,'B'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:01',11,'C'); +INSERT INTO test_sequenceNextNode_Nullable values ('2000-01-02 09:00:01',11,'D'); SELECT '(0, A) id = 11', count() FROM (SELECT id, sequenceNextNode('forward', 'head')(dt, action, 1, action = 'A') AS next_node FROM test_sequenceNextNode_Nullable WHERE id = 11 GROUP BY id HAVING next_node = 'B'); SELECT '(0, C) id = 11', count() FROM (SELECT id, sequenceNextNode('forward', 'head')(dt, action, 1, action = 'C') AS next_node FROM test_sequenceNextNode_Nullable WHERE id = 11 GROUP BY id HAVING next_node = 'D'); @@ -100,30 +100,30 @@ DROP TABLE IF EXISTS test_sequenceNextNode; CREATE TABLE IF NOT EXISTS test_sequenceNextNode (dt DateTime, id int, action String) ENGINE = MergeTree() PARTITION BY dt ORDER BY id; -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:01',1,'A'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:02',1,'B'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:03',1,'C'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:04',1,'D'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:01',2,'B'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:02',2,'B'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:03',2,'D'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:04',2,'C'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:01',3,'A'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:02',3,'B'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:01',4,'A'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:02',4,'A'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:03',4,'A'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:04',4,'B'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:05',4,'C'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:01',5,'A'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:02',5,'B'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:03',5,'A'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:04',5,'C'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:01',6,'A'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:02',6,'B'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:03',6,'A'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:04',6,'B'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:05',6,'C'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:01',1,'A'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:02',1,'B'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:03',1,'C'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:04',1,'D'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:01',2,'B'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:02',2,'B'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:03',2,'D'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:04',2,'C'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:01',3,'A'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:02',3,'B'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:01',4,'A'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:02',4,'A'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:03',4,'A'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:04',4,'B'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:05',4,'C'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:01',5,'A'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:02',5,'B'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:03',5,'A'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:04',5,'C'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:01',6,'A'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:02',6,'B'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:03',6,'A'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:04',6,'B'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:05',6,'C'); SELECT '(forward, head, A)', id, sequenceNextNode('forward', 'head')(dt, action, 1, action = 'A') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; SELECT '(forward, head, B)', id, sequenceNextNode('forward', 'head')(dt, action, 1, action = 'B') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; @@ -146,10 +146,10 @@ SELECT '(forward, head, B->A->A)', id, sequenceNextNode('forward', 'head')(dt, a SELECT '(backward, tail, A->A->B)', id, sequenceNextNode('backward', 'tail')(dt, action, 1, action = 'A', action = 'A', action = 'B') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; SELECT '(backward, tail, B->A->A)', id, sequenceNextNode('backward', 'tail')(dt, action, 1, action = 'B', action = 'A', action = 'A') AS next_node FROM test_sequenceNextNode GROUP BY id ORDER BY id; -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:01',10,'A'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:02',10,'B'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:03',10,'C'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:04',10,'D'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:01',10,'A'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:02',10,'B'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:03',10,'C'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:04',10,'D'); SELECT '(forward, head, A) id >= 10', id, sequenceNextNode('forward', 'head')(dt, action, 1, action = 'A') AS next_node FROM test_sequenceNextNode WHERE id >= 10 GROUP BY id ORDER BY id; SELECT '(forward, head, A) id >= 10', id, sequenceNextNode('forward', 'head')(dt, action, 1, action = 'A', action = 'B') AS next_node FROM test_sequenceNextNode WHERE id >= 10 GROUP BY id ORDER BY id; @@ -158,10 +158,10 @@ SELECT '(forward, head, A) id >= 10', id, sequenceNextNode('backward', 'tail')(d SELECT '(backward, tail, A) id >= 10', id, sequenceNextNode('backward', 'tail')(dt, action, 1, action = 'D', action = 'C') AS next_node FROM test_sequenceNextNode WHERE id >= 10 GROUP BY id ORDER BY id; SELECT '(backward, tail, A) id >= 10', id, sequenceNextNode('backward', 'tail')(dt, action, 1, action = 'D', action = 'C', action = 'B') AS next_node FROM test_sequenceNextNode WHERE id >= 10 GROUP BY id ORDER BY id; -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:01',11,'A'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:01',11,'B'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:01',11,'C'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:01',11,'D'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:01',11,'A'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:01',11,'B'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:01',11,'C'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:01',11,'D'); SELECT '(0, A) id = 11', count() FROM (SELECT id, sequenceNextNode('forward', 'head')(dt, action, 1, action = 'A') AS next_node FROM test_sequenceNextNode WHERE id = 11 GROUP BY id HAVING next_node = 'B'); SELECT '(0, C) id = 11', count() FROM (SELECT id, sequenceNextNode('forward', 'head')(dt, action, 1, action = 'C') AS next_node FROM test_sequenceNextNode WHERE id = 11 GROUP BY id HAVING next_node = 'D'); @@ -189,8 +189,8 @@ SELECT '(backward, first_match, B->B)', id, sequenceNextNode('backward', 'first_ SELECT '(max_args)', id, sequenceNextNode('forward', 'head')(dt, action, 1, action = '0', action = '1', action = '2', action = '3', action = '4', action = '5', action = '6', action = '7', action = '8', action = '9', action = '10', action = '11', action = '12', action = '13', action = '14', action = '15', action = '16', action = '17', action = '18', action = '19', action = '20', action = '21', action = '22', action = '23', action = '24', action = '25', action = '26', action = '27', action = '28', action = '29', action = '30', action = '31', action = '32', action = '33', action = '34', action = '35', action = '36', action = '37', action = '38', action = '39', action = '40', action = '41', action = '42', action = '43', action = '44', action = '45', action = '46', action = '47', action = '48', action = '49', action = '50', action = '51', action = '52', action = '53', action = '54', action = '55', action = '56', action = '57', action = '58', action = '59', action = '60', action = '61', action = '62', action = '63') from test_sequenceNextNode GROUP BY id ORDER BY id; -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:01',12,'A'); -INSERT INTO test_sequenceNextNode values ('1970-01-01 09:00:01',12,'A'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:01',12,'A'); +INSERT INTO test_sequenceNextNode values ('2000-01-02 09:00:01',12,'A'); SELECT '(forward, head, A) id = 12', sequenceNextNode('forward', 'head')(dt, action, 1, action = 'A') AS next_node FROM test_sequenceNextNode WHERE id = 12; @@ -200,18 +200,18 @@ DROP TABLE IF EXISTS test_base_condition; CREATE TABLE IF NOT EXISTS test_base_condition (dt DateTime, id int, action String, referrer String) ENGINE = MergeTree() PARTITION BY dt ORDER BY id; -INSERT INTO test_base_condition values ('1970-01-01 09:00:01',1,'A','1'); -INSERT INTO test_base_condition values ('1970-01-01 09:00:02',1,'B','2'); -INSERT INTO test_base_condition values ('1970-01-01 09:00:03',1,'C','3'); -INSERT INTO test_base_condition values ('1970-01-01 09:00:04',1,'D','4'); -INSERT INTO test_base_condition values ('1970-01-01 09:00:01',2,'D','4'); -INSERT INTO test_base_condition values ('1970-01-01 09:00:02',2,'C','3'); -INSERT INTO test_base_condition values ('1970-01-01 09:00:03',2,'B','2'); -INSERT INTO test_base_condition values ('1970-01-01 09:00:04',2,'A','1'); -INSERT INTO test_base_condition values ('1970-01-01 09:00:01',3,'B','10'); -INSERT INTO test_base_condition values ('1970-01-01 09:00:02',3,'B','2'); -INSERT INTO test_base_condition values ('1970-01-01 09:00:03',3,'D','3'); -INSERT INTO test_base_condition values ('1970-01-01 09:00:04',3,'C','4'); +INSERT INTO test_base_condition values ('2000-01-02 09:00:01',1,'A','1'); +INSERT INTO test_base_condition values ('2000-01-02 09:00:02',1,'B','2'); +INSERT INTO test_base_condition values ('2000-01-02 09:00:03',1,'C','3'); +INSERT INTO test_base_condition values ('2000-01-02 09:00:04',1,'D','4'); +INSERT INTO test_base_condition values ('2000-01-02 09:00:01',2,'D','4'); +INSERT INTO test_base_condition values ('2000-01-02 09:00:02',2,'C','3'); +INSERT INTO test_base_condition values ('2000-01-02 09:00:03',2,'B','2'); +INSERT INTO test_base_condition values ('2000-01-02 09:00:04',2,'A','1'); +INSERT INTO test_base_condition values ('2000-01-02 09:00:01',3,'B','10'); +INSERT INTO test_base_condition values ('2000-01-02 09:00:02',3,'B','2'); +INSERT INTO test_base_condition values ('2000-01-02 09:00:03',3,'D','3'); +INSERT INTO test_base_condition values ('2000-01-02 09:00:04',3,'C','4'); SELECT '(forward, head, 1)', id, sequenceNextNode('forward', 'head')(dt, action, referrer = '1') AS next_node FROM test_base_condition GROUP BY id ORDER BY id; SELECT '(forward, head, 1, A)', id, sequenceNextNode('forward', 'head')(dt, action, referrer = '1', action = 'A') AS next_node FROM test_base_condition GROUP BY id ORDER BY id; diff --git a/tests/queries/0_stateless/01656_test_query_log_factories_info.reference b/tests/queries/0_stateless/01656_test_query_log_factories_info.reference index af7feae5a38..47b3133ceca 100644 --- a/tests/queries/0_stateless/01656_test_query_log_factories_info.reference +++ b/tests/queries/0_stateless/01656_test_query_log_factories_info.reference @@ -13,6 +13,9 @@ arraySort(used_table_functions) arraySort(used_functions) ['CAST','CRC32','addDays','array','arrayFlatten','modulo','plus','pow','round','substring','tanh','toDate','toDayOfYear','toTypeName','toWeek'] +used_functions +['repeat'] + arraySort(used_data_type_families) ['Array','Int32','Nullable','String'] diff --git a/tests/queries/0_stateless/01656_test_query_log_factories_info.sql b/tests/queries/0_stateless/01656_test_query_log_factories_info.sql index 3a890ce16f9..50d50155480 100644 --- a/tests/queries/0_stateless/01656_test_query_log_factories_info.sql +++ b/tests/queries/0_stateless/01656_test_query_log_factories_info.sql @@ -1,4 +1,5 @@ SET database_atomic_wait_for_drop_and_detach_synchronously=1; +SET log_queries=1; SELECT uniqArray([1, 1, 2]), SUBSTRING('Hello, world', 7, 5), @@ -13,9 +14,16 @@ SELECT uniqArray([1, 1, 2]), countIf(toDate('2000-12-05') + number as d, toDayOfYear(d) % 2) FROM numbers(100); + +SELECT repeat('a', number) +FROM numbers(10e3) +SETTINGS max_memory_usage=4e6, max_block_size=100 +FORMAT Null; -- { serverError 241 } + SELECT ''; SYSTEM FLUSH LOGS; + SELECT arraySort(used_aggregate_functions) FROM system.query_log WHERE current_database = currentDatabase() AND type = 'QueryFinish' AND (query LIKE '%toDate(\'2000-12-05\')%') ORDER BY query_start_time DESC LIMIT 1 FORMAT TabSeparatedWithNames; @@ -36,6 +44,11 @@ FROM system.query_log WHERE current_database = currentDatabase() AND type = 'Que ORDER BY query_start_time DESC LIMIT 1 FORMAT TabSeparatedWithNames; SELECT ''; +SELECT used_functions +FROM system.query_log WHERE current_database = currentDatabase() AND type != 'QueryStart' AND (query LIKE '%repeat%') +ORDER BY query_start_time DESC LIMIT 1 FORMAT TabSeparatedWithNames; +SELECT ''; + SELECT arraySort(used_data_type_families) FROM system.query_log WHERE current_database = currentDatabase() AND type = 'QueryFinish' AND (query LIKE '%toDate(\'2000-12-05\')%') ORDER BY query_start_time DESC LIMIT 1 FORMAT TabSeparatedWithNames; diff --git a/tests/queries/0_stateless/01658_read_file_to_stringcolumn.reference b/tests/queries/0_stateless/01658_read_file_to_stringcolumn.reference index 1d0901cf9f6..579c0dcb270 100644 --- a/tests/queries/0_stateless/01658_read_file_to_stringcolumn.reference +++ b/tests/queries/0_stateless/01658_read_file_to_stringcolumn.reference @@ -13,13 +13,13 @@ ccccccccc :35 :35 :233 -699415 +695071 aaaaaaaaa bbbbbbbbb ccccccccc aaaaaaaaa bbbbbbbbb ccccccccc aaaaaaaaa bbbbbbbbb ccccccccc aaaaaaaaa bbbbbbbbb ccccccccc aaaaaaaaa bbbbbbbbb -699415 0 +695071 0 :0 :70 :79 diff --git a/tests/queries/0_stateless/01658_read_file_to_stringcolumn.sh b/tests/queries/0_stateless/01658_read_file_to_stringcolumn.sh index 072e8d75f52..1bfcf863184 100755 --- a/tests/queries/0_stateless/01658_read_file_to_stringcolumn.sh +++ b/tests/queries/0_stateless/01658_read_file_to_stringcolumn.sh @@ -44,7 +44,7 @@ echo "clickhouse-client --query "'"select file('"'${user_files_path}/dir'), file echo "clickhouse-client --query "'"select file('"'/tmp/c.txt'), file('${user_files_path}/b.txt')"'";echo :$?' | bash 2>/dev/null # Test relative path consists of ".." whose absolute path is out of the user_files directory. -echo "clickhouse-client --query "'"select file('"'${user_files_path}/../../../../tmp/c.txt'), file('b.txt')"'";echo :$?' | bash 2>/dev/null +echo "clickhouse-client --query "'"select file('"'${user_files_path}/../../../../../../../../../../../../../../../../../../../tmp/c.txt'), file('b.txt')"'";echo :$?' | bash 2>/dev/null echo "clickhouse-client --query "'"select file('"'../../../../a.txt'), file('${user_files_path}/b.txt')"'";echo :$?' | bash 2>/dev/null diff --git a/tests/queries/0_stateless/01659_h3_buffer_overflow.sql b/tests/queries/0_stateless/01659_h3_buffer_overflow.sql index b752059da48..f2d77641ec9 100644 --- a/tests/queries/0_stateless/01659_h3_buffer_overflow.sql +++ b/tests/queries/0_stateless/01659_h3_buffer_overflow.sql @@ -7,3 +7,4 @@ SELECT h3kRing(0xFFFFFFFFFFFFFF, 1000) FORMAT Null; SELECT h3GetBaseCell(0xFFFFFFFFFFFFFF) FORMAT Null; SELECT h3GetResolution(0xFFFFFFFFFFFFFF) FORMAT Null; SELECT h3kRing(0xFFFFFFFFFFFFFF, 10) FORMAT Null; +SELECT h3ToGeo(0xFFFFFFFFFFFFFF) FORMAT Null; diff --git a/tests/queries/0_stateless/01664_ntoa_aton_mysql_compatibility.reference b/tests/queries/0_stateless/01664_ntoa_aton_mysql_compatibility.reference new file mode 100644 index 00000000000..b8c6661bca7 --- /dev/null +++ b/tests/queries/0_stateless/01664_ntoa_aton_mysql_compatibility.reference @@ -0,0 +1,4 @@ +2a02:6b8::11 +2A0206B8000000000000000000000011 +0.0.5.57 +3232235521 diff --git a/tests/queries/0_stateless/01664_ntoa_aton_mysql_compatibility.sql b/tests/queries/0_stateless/01664_ntoa_aton_mysql_compatibility.sql new file mode 100644 index 00000000000..4f4aef09259 --- /dev/null +++ b/tests/queries/0_stateless/01664_ntoa_aton_mysql_compatibility.sql @@ -0,0 +1,4 @@ +SELECT INET6_NTOA(toFixedString(unhex('2A0206B8000000000000000000000011'), 16)); +SELECT hex(INET6_ATON('2a02:6b8::11')); +SELECT INET_NTOA(toUInt32(1337)); +SELECT INET_ATON('192.168.0.1'); diff --git a/tests/queries/0_stateless/01664_test_FunctionIPv6NumToString_mysql_compatibility.reference b/tests/queries/0_stateless/01664_test_FunctionIPv6NumToString_mysql_compatibility.reference deleted file mode 100644 index 18a9c3436e5..00000000000 --- a/tests/queries/0_stateless/01664_test_FunctionIPv6NumToString_mysql_compatibility.reference +++ /dev/null @@ -1 +0,0 @@ -2a02:6b8::11 diff --git a/tests/queries/0_stateless/01664_test_FunctionIPv6NumToString_mysql_compatibility.sql b/tests/queries/0_stateless/01664_test_FunctionIPv6NumToString_mysql_compatibility.sql deleted file mode 100644 index 85bf1f8c7f9..00000000000 --- a/tests/queries/0_stateless/01664_test_FunctionIPv6NumToString_mysql_compatibility.sql +++ /dev/null @@ -1 +0,0 @@ -SELECT INET6_NTOA(toFixedString(unhex('2A0206B8000000000000000000000011'), 16)); diff --git a/tests/queries/0_stateless/01665_test_FunctionIPv6StringToNum_mysql_compatibility.reference b/tests/queries/0_stateless/01665_test_FunctionIPv6StringToNum_mysql_compatibility.reference deleted file mode 100644 index 0b3192fc44c..00000000000 --- a/tests/queries/0_stateless/01665_test_FunctionIPv6StringToNum_mysql_compatibility.reference +++ /dev/null @@ -1 +0,0 @@ -*\0\0\0\0\0\0\0\0\0\0\0 diff --git a/tests/queries/0_stateless/01665_test_FunctionIPv6StringToNum_mysql_compatibility.sql b/tests/queries/0_stateless/01665_test_FunctionIPv6StringToNum_mysql_compatibility.sql deleted file mode 100644 index 2eff6cca793..00000000000 --- a/tests/queries/0_stateless/01665_test_FunctionIPv6StringToNum_mysql_compatibility.sql +++ /dev/null @@ -1 +0,0 @@ -SELECT INET6_ATON('2a02:6b8::11'); diff --git a/tests/queries/0_stateless/01666_blns.reference b/tests/queries/0_stateless/01666_blns_long.reference similarity index 100% rename from tests/queries/0_stateless/01666_blns.reference rename to tests/queries/0_stateless/01666_blns_long.reference diff --git a/tests/queries/0_stateless/01666_blns.sql b/tests/queries/0_stateless/01666_blns_long.sql similarity index 99% rename from tests/queries/0_stateless/01666_blns.sql rename to tests/queries/0_stateless/01666_blns_long.sql index be9632092bc..19caf45832f 100644 --- a/tests/queries/0_stateless/01666_blns.sql +++ b/tests/queries/0_stateless/01666_blns_long.sql @@ -554,9 +554,9 @@ SELECT count() FROM test; DROP TABLE IF EXISTS test_r1; DROP TABLE IF EXISTS test_r2; -CREATE TABLE test_r1 AS test ENGINE = ReplicatedMergeTree('/clickhouse/test_01666', 'r1') ORDER BY "\\" SETTINGS min_bytes_for_wide_part = '100G'; +CREATE TABLE test_r1 AS test ENGINE = ReplicatedMergeTree('/clickhouse/{database}/test_01666', 'r1') ORDER BY "\\" SETTINGS min_bytes_for_wide_part = '100G'; INSERT INTO test_r1 SELECT * FROM test; -CREATE TABLE test_r2 AS test ENGINE = ReplicatedMergeTree('/clickhouse/test_01666', 'r2') ORDER BY "\\" SETTINGS min_bytes_for_wide_part = '100G'; +CREATE TABLE test_r2 AS test ENGINE = ReplicatedMergeTree('/clickhouse/{database}/test_01666', 'r2') ORDER BY "\\" SETTINGS min_bytes_for_wide_part = '100G'; SYSTEM SYNC REPLICA test_r2; diff --git a/tests/queries/0_stateless/01666_test_FunctionIPv4NumToString_mysql_compatibility.reference b/tests/queries/0_stateless/01666_test_FunctionIPv4NumToString_mysql_compatibility.reference deleted file mode 100644 index 08674e64f67..00000000000 --- a/tests/queries/0_stateless/01666_test_FunctionIPv4NumToString_mysql_compatibility.reference +++ /dev/null @@ -1 +0,0 @@ -0.0.5.57 diff --git a/tests/queries/0_stateless/01666_test_FunctionIPv4NumToString_mysql_compatibility.sql b/tests/queries/0_stateless/01666_test_FunctionIPv4NumToString_mysql_compatibility.sql deleted file mode 100644 index 0c6608c6e74..00000000000 --- a/tests/queries/0_stateless/01666_test_FunctionIPv4NumToString_mysql_compatibility.sql +++ /dev/null @@ -1 +0,0 @@ -SELECT INET_NTOA(toUInt32(1337)); diff --git a/tests/queries/0_stateless/01667_test_FunctionIPv4StringToNum_mysql_compatibility.reference b/tests/queries/0_stateless/01667_test_FunctionIPv4StringToNum_mysql_compatibility.reference deleted file mode 100644 index c15798a747d..00000000000 --- a/tests/queries/0_stateless/01667_test_FunctionIPv4StringToNum_mysql_compatibility.reference +++ /dev/null @@ -1 +0,0 @@ -3232235521 diff --git a/tests/queries/0_stateless/01667_test_FunctionIPv4StringToNum_mysql_compatibility.sql b/tests/queries/0_stateless/01667_test_FunctionIPv4StringToNum_mysql_compatibility.sql deleted file mode 100644 index 6a91900370c..00000000000 --- a/tests/queries/0_stateless/01667_test_FunctionIPv4StringToNum_mysql_compatibility.sql +++ /dev/null @@ -1 +0,0 @@ -SELECT INET_ATON('192.168.0.1'); diff --git a/tests/queries/0_stateless/01668_test_toMonth_mysql_dialect.sql b/tests/queries/0_stateless/01668_test_toMonth_mysql_dialect.sql index fa2e1e41555..bdde3e7b825 100644 --- a/tests/queries/0_stateless/01668_test_toMonth_mysql_dialect.sql +++ b/tests/queries/0_stateless/01668_test_toMonth_mysql_dialect.sql @@ -1 +1 @@ -SELECT MONTH(toDateTime('2016-06-15 23:00:00')); \ No newline at end of file +SELECT MONTH(toDateTime('2016-06-15 23:00:00')); diff --git a/tests/queries/0_stateless/01669_columns_declaration_serde.reference b/tests/queries/0_stateless/01669_columns_declaration_serde_long.reference similarity index 100% rename from tests/queries/0_stateless/01669_columns_declaration_serde.reference rename to tests/queries/0_stateless/01669_columns_declaration_serde_long.reference diff --git a/tests/queries/0_stateless/01669_columns_declaration_serde.sql b/tests/queries/0_stateless/01669_columns_declaration_serde_long.sql similarity index 81% rename from tests/queries/0_stateless/01669_columns_declaration_serde.sql rename to tests/queries/0_stateless/01669_columns_declaration_serde_long.sql index a6bf1184e9f..b1a85754fce 100644 --- a/tests/queries/0_stateless/01669_columns_declaration_serde.sql +++ b/tests/queries/0_stateless/01669_columns_declaration_serde_long.sql @@ -22,12 +22,12 @@ DROP TABLE IF EXISTS test_r1; DROP TABLE IF EXISTS test_r2; CREATE TABLE test_r1 (x UInt64, "\\" String DEFAULT '\r\n\t\\' || ' -') ENGINE = ReplicatedMergeTree('/clickhouse/test_01669', 'r1') ORDER BY "\\"; +') ENGINE = ReplicatedMergeTree('/clickhouse/{database}/test_01669', 'r1') ORDER BY "\\"; INSERT INTO test_r1 ("\\") VALUES ('\\'); CREATE TABLE test_r2 (x UInt64, "\\" String DEFAULT '\r\n\t\\' || ' -') ENGINE = ReplicatedMergeTree('/clickhouse/test_01669', 'r2') ORDER BY "\\"; +') ENGINE = ReplicatedMergeTree('/clickhouse/{database}/test_01669', 'r2') ORDER BY "\\"; SYSTEM SYNC REPLICA test_r2; diff --git a/tests/queries/0_stateless/01669_test_toYear_mysql_dialect.sql b/tests/queries/0_stateless/01669_test_toYear_mysql_dialect.sql index f7cd84314e2..afd79e2c1ba 100644 --- a/tests/queries/0_stateless/01669_test_toYear_mysql_dialect.sql +++ b/tests/queries/0_stateless/01669_test_toYear_mysql_dialect.sql @@ -1 +1 @@ -SELECT YEAR(toDateTime('2016-06-15 23:00:00')); \ No newline at end of file +SELECT YEAR(toDateTime('2016-06-15 23:00:00')); diff --git a/tests/queries/0_stateless/01670_test_repeat_mysql_dialect.sql b/tests/queries/0_stateless/01670_test_repeat_mysql_dialect.sql index 29fe81012ec..ae2bdb46412 100644 --- a/tests/queries/0_stateless/01670_test_repeat_mysql_dialect.sql +++ b/tests/queries/0_stateless/01670_test_repeat_mysql_dialect.sql @@ -1 +1 @@ -SELECT REPEAT('Test', 3); \ No newline at end of file +SELECT REPEAT('Test', 3); diff --git a/tests/queries/0_stateless/01671_test_toQuarter_mysql_dialect.sql b/tests/queries/0_stateless/01671_test_toQuarter_mysql_dialect.sql index b6fa41f8b49..369f2b47723 100644 --- a/tests/queries/0_stateless/01671_test_toQuarter_mysql_dialect.sql +++ b/tests/queries/0_stateless/01671_test_toQuarter_mysql_dialect.sql @@ -1 +1 @@ -SELECT QUARTER(toDateTime('2016-06-15 23:00:00')); \ No newline at end of file +SELECT QUARTER(toDateTime('2016-06-15 23:00:00')); diff --git a/tests/queries/0_stateless/01672_test_toSecond_mysql_dialect.sql b/tests/queries/0_stateless/01672_test_toSecond_mysql_dialect.sql index adb72b9843c..0306fde14cd 100644 --- a/tests/queries/0_stateless/01672_test_toSecond_mysql_dialect.sql +++ b/tests/queries/0_stateless/01672_test_toSecond_mysql_dialect.sql @@ -1 +1 @@ -SELECT SECOND(toDateTime('2016-06-15 23:00:00')); \ No newline at end of file +SELECT SECOND(toDateTime('2016-06-15 23:00:00')); diff --git a/tests/queries/0_stateless/01673_test_toMinute_mysql_dialect.sql b/tests/queries/0_stateless/01673_test_toMinute_mysql_dialect.sql index 4ac7106158a..5d188b5b95b 100644 --- a/tests/queries/0_stateless/01673_test_toMinute_mysql_dialect.sql +++ b/tests/queries/0_stateless/01673_test_toMinute_mysql_dialect.sql @@ -1 +1 @@ -SELECT MINUTE(toDateTime('2016-06-15 23:00:00')); \ No newline at end of file +SELECT MINUTE(toDateTime('2016-06-15 23:00:00')); diff --git a/tests/queries/0_stateless/01676_reinterpret_as.reference b/tests/queries/0_stateless/01676_reinterpret_as.reference index 459ca166dc1..b800016375a 100644 --- a/tests/queries/0_stateless/01676_reinterpret_as.reference +++ b/tests/queries/0_stateless/01676_reinterpret_as.reference @@ -33,9 +33,9 @@ Dates 1970-01-01 03:00:00 1970-01-01 03:00:00 1970-01-01 03:00:00.000 1970-01-01 03:00:00.000 Decimals -5.00 0.49 -5.00 0.49 -5.00 0.49 -5.00 0.49 -0.00 +5 0.49 +5 0.49 +5 0.49 +5 0.49 +0 ReinterpretErrors diff --git a/tests/queries/0_stateless/01676_reinterpret_as.sql b/tests/queries/0_stateless/01676_reinterpret_as.sql index 5eb94ed0a13..e8c2a0b1373 100644 --- a/tests/queries/0_stateless/01676_reinterpret_as.sql +++ b/tests/queries/0_stateless/01676_reinterpret_as.sql @@ -30,8 +30,8 @@ SELECT reinterpret(a, 'String'), reinterpretAsString(a), reinterpretAsUInt8('11' SELECT reinterpret(a, 'String'), reinterpretAsString(a), reinterpretAsUInt16('11') as a; SELECT 'Dates'; SELECT reinterpret(0, 'Date'), reinterpret('', 'Date'); -SELECT reinterpret(0, 'DateTime'), reinterpret('', 'DateTime'); -SELECT reinterpret(0, 'DateTime64'), reinterpret('', 'DateTime64'); +SELECT reinterpret(0, 'DateTime(''Europe/Moscow'')'), reinterpret('', 'DateTime(''Europe/Moscow'')'); +SELECT reinterpret(0, 'DateTime64(3, ''Europe/Moscow'')'), reinterpret('', 'DateTime64(3, ''Europe/Moscow'')'); SELECT 'Decimals'; SELECT reinterpret(toDecimal32(5, 2), 'Decimal32(2)'), reinterpret('1', 'Decimal32(2)'); SELECT reinterpret(toDecimal64(5, 2), 'Decimal64(2)'), reinterpret('1', 'Decimal64(2)');; diff --git a/tests/queries/0_stateless/01683_codec_encrypted.reference b/tests/queries/0_stateless/01683_codec_encrypted.reference new file mode 100644 index 00000000000..0d30be781e5 --- /dev/null +++ b/tests/queries/0_stateless/01683_codec_encrypted.reference @@ -0,0 +1 @@ +1 Some plaintext diff --git a/tests/queries/0_stateless/01683_codec_encrypted.sql b/tests/queries/0_stateless/01683_codec_encrypted.sql new file mode 100644 index 00000000000..ec90e6c3129 --- /dev/null +++ b/tests/queries/0_stateless/01683_codec_encrypted.sql @@ -0,0 +1,7 @@ +DROP TABLE IF EXISTS encryption_test; +CREATE TABLE encryption_test (i Int, s String Codec(Encrypted('AES-128-GCM-SIV'))) ENGINE = MergeTree ORDER BY i; + +INSERT INTO encryption_test VALUES (1, 'Some plaintext'); +SELECT * FROM encryption_test; + +DROP TABLE encryption_test; diff --git a/tests/queries/0_stateless/01686_event_time_microseconds_part_log.reference b/tests/queries/0_stateless/01686_event_time_microseconds_part_log.reference index 9766475a418..79ebd0860f4 100644 --- a/tests/queries/0_stateless/01686_event_time_microseconds_part_log.reference +++ b/tests/queries/0_stateless/01686_event_time_microseconds_part_log.reference @@ -1 +1,2 @@ ok +ok diff --git a/tests/queries/0_stateless/01686_event_time_microseconds_part_log.sql b/tests/queries/0_stateless/01686_event_time_microseconds_part_log.sql index 4a653379ef1..6063be4d1da 100644 --- a/tests/queries/0_stateless/01686_event_time_microseconds_part_log.sql +++ b/tests/queries/0_stateless/01686_event_time_microseconds_part_log.sql @@ -10,16 +10,27 @@ ORDER BY key; INSERT INTO table_with_single_pk SELECT number, toString(number % 10) FROM numbers(1000000); +-- Check NewPart SYSTEM FLUSH LOGS; - WITH ( SELECT (event_time, event_time_microseconds) FROM system.part_log - WHERE "table" = 'table_with_single_pk' - AND "database" = currentDatabase() + WHERE table = 'table_with_single_pk' AND database = currentDatabase() AND event_type = 'NewPart' ORDER BY event_time DESC LIMIT 1 ) AS time SELECT if(dateDiff('second', toDateTime(time.2), toDateTime(time.1)) = 0, 'ok', 'fail'); -DROP TABLE IF EXISTS table_with_single_pk; +-- Now let's check RemovePart +TRUNCATE TABLE table_with_single_pk; +SYSTEM FLUSH LOGS; +WITH ( + SELECT (event_time, event_time_microseconds) + FROM system.part_log + WHERE table = 'table_with_single_pk' AND database = currentDatabase() AND event_type = 'RemovePart' + ORDER BY event_time DESC + LIMIT 1 + ) AS time +SELECT if(dateDiff('second', toDateTime(time.2), toDateTime(time.1)) = 0, 'ok', 'fail'); + +DROP TABLE table_with_single_pk; diff --git a/tests/queries/0_stateless/01686_rocksdb.reference b/tests/queries/0_stateless/01686_rocksdb.reference index fa4e12d51ff..198771df112 100644 --- a/tests/queries/0_stateless/01686_rocksdb.reference +++ b/tests/queries/0_stateless/01686_rocksdb.reference @@ -1,3 +1,4 @@ +10000 123 Hello, world (123) -- -- diff --git a/tests/queries/0_stateless/01686_rocksdb.sql b/tests/queries/0_stateless/01686_rocksdb.sql index 9a8662453c1..23baf249d1f 100644 --- a/tests/queries/0_stateless/01686_rocksdb.sql +++ b/tests/queries/0_stateless/01686_rocksdb.sql @@ -2,7 +2,9 @@ DROP TABLE IF EXISTS 01686_test; CREATE TABLE 01686_test (key UInt64, value String) Engine=EmbeddedRocksDB PRIMARY KEY(key); +SELECT value FROM system.rocksdb WHERE database = currentDatabase() and table = '01686_test' and name = 'number.keys.written'; INSERT INTO 01686_test SELECT number, format('Hello, world ({})', toString(number)) FROM numbers(10000); +SELECT value FROM system.rocksdb WHERE database = currentDatabase() and table = '01686_test' and name = 'number.keys.written'; SELECT * FROM 01686_test WHERE key = 123; SELECT '--'; diff --git a/tests/queries/0_stateless/01691_DateTime64_clamp.reference b/tests/queries/0_stateless/01691_DateTime64_clamp.reference index 881ab4feff8..41a8d653a3f 100644 --- a/tests/queries/0_stateless/01691_DateTime64_clamp.reference +++ b/tests/queries/0_stateless/01691_DateTime64_clamp.reference @@ -17,11 +17,11 @@ SELECT toDateTime64(toFloat32(bitShiftLeft(toUInt64(1),33)), 2, 'Europe/Moscow') 2106-02-07 09:28:16.00 SELECT toDateTime64(toFloat64(bitShiftLeft(toUInt64(1),33)), 2, 'Europe/Moscow') FORMAT Null; -- These are outsize of extended range and hence clamped -SELECT toDateTime64(-1 * bitShiftLeft(toUInt64(1), 35), 2); +SELECT toDateTime64(-1 * bitShiftLeft(toUInt64(1), 35), 2, 'Europe/Moscow'); 1925-01-01 02:00:00.00 -SELECT CAST(-1 * bitShiftLeft(toUInt64(1), 35) AS DateTime64); +SELECT CAST(-1 * bitShiftLeft(toUInt64(1), 35) AS DateTime64(3, 'Europe/Moscow')); 1925-01-01 02:00:00.000 -SELECT CAST(bitShiftLeft(toUInt64(1), 35) AS DateTime64); +SELECT CAST(bitShiftLeft(toUInt64(1), 35) AS DateTime64(3, 'Europe/Moscow')); 2282-12-31 03:00:00.000 -SELECT toDateTime64(bitShiftLeft(toUInt64(1), 35), 2); +SELECT toDateTime64(bitShiftLeft(toUInt64(1), 35), 2, 'Europe/Moscow'); 2282-12-31 03:00:00.00 diff --git a/tests/queries/0_stateless/01691_DateTime64_clamp.sql b/tests/queries/0_stateless/01691_DateTime64_clamp.sql index c77a66febb3..2786d9c1c09 100644 --- a/tests/queries/0_stateless/01691_DateTime64_clamp.sql +++ b/tests/queries/0_stateless/01691_DateTime64_clamp.sql @@ -11,7 +11,7 @@ SELECT toDateTime64(toFloat32(bitShiftLeft(toUInt64(1),33)), 2, 'Europe/Moscow') SELECT toDateTime64(toFloat64(bitShiftLeft(toUInt64(1),33)), 2, 'Europe/Moscow') FORMAT Null; -- These are outsize of extended range and hence clamped -SELECT toDateTime64(-1 * bitShiftLeft(toUInt64(1), 35), 2); -SELECT CAST(-1 * bitShiftLeft(toUInt64(1), 35) AS DateTime64); -SELECT CAST(bitShiftLeft(toUInt64(1), 35) AS DateTime64); -SELECT toDateTime64(bitShiftLeft(toUInt64(1), 35), 2); +SELECT toDateTime64(-1 * bitShiftLeft(toUInt64(1), 35), 2, 'Europe/Moscow'); +SELECT CAST(-1 * bitShiftLeft(toUInt64(1), 35) AS DateTime64(3, 'Europe/Moscow')); +SELECT CAST(bitShiftLeft(toUInt64(1), 35) AS DateTime64(3, 'Europe/Moscow')); +SELECT toDateTime64(bitShiftLeft(toUInt64(1), 35), 2, 'Europe/Moscow'); diff --git a/tests/queries/0_stateless/01692_DateTime64_from_DateTime.reference b/tests/queries/0_stateless/01692_DateTime64_from_DateTime.reference index a0562e40027..3473b027c22 100644 --- a/tests/queries/0_stateless/01692_DateTime64_from_DateTime.reference +++ b/tests/queries/0_stateless/01692_DateTime64_from_DateTime.reference @@ -1,9 +1,5 @@ --- { echo } -select toDateTime64(toDateTime(1), 2); 1970-01-01 03:00:01.00 -select toDateTime64(toDate(1), 2); +1970-01-01 03:00:01.00 1970-01-02 00:00:00.00 -select toDateTime64(toDateTime(1), 2, 'GMT'); 1970-01-01 00:00:01.00 -select toDateTime64(toDate(1), 2, 'GMT'); 1970-01-02 00:00:00.00 diff --git a/tests/queries/0_stateless/01692_DateTime64_from_DateTime.sql b/tests/queries/0_stateless/01692_DateTime64_from_DateTime.sql index 60f76e9192c..fac0c341007 100644 --- a/tests/queries/0_stateless/01692_DateTime64_from_DateTime.sql +++ b/tests/queries/0_stateless/01692_DateTime64_from_DateTime.sql @@ -1,5 +1,7 @@ --- { echo } -select toDateTime64(toDateTime(1), 2); -select toDateTime64(toDate(1), 2); +select toDateTime64(toDateTime(1, 'Europe/Moscow'), 2); +select toDateTime64(toDate(1), 2) FORMAT Null; -- Unknown timezone +select toDateTime64(toDateTime(1), 2) FORMAT Null; -- Unknown timezone +select toDateTime64(toDateTime(1), 2, 'Europe/Moscow'); +select toDateTime64(toDate(1), 2, 'Europe/Moscow'); select toDateTime64(toDateTime(1), 2, 'GMT'); select toDateTime64(toDate(1), 2, 'GMT'); diff --git a/tests/queries/0_stateless/01700_system_zookeeper_path_in.reference b/tests/queries/0_stateless/01700_system_zookeeper_path_in.reference index e491dd9e091..dcee18b33e0 100644 --- a/tests/queries/0_stateless/01700_system_zookeeper_path_in.reference +++ b/tests/queries/0_stateless/01700_system_zookeeper_path_in.reference @@ -12,3 +12,5 @@ blocks failed_parts last_part parallel +shared +shared diff --git a/tests/queries/0_stateless/01700_system_zookeeper_path_in.sql b/tests/queries/0_stateless/01700_system_zookeeper_path_in.sql index 02457a956a1..a147952dfe1 100644 --- a/tests/queries/0_stateless/01700_system_zookeeper_path_in.sql +++ b/tests/queries/0_stateless/01700_system_zookeeper_path_in.sql @@ -3,20 +3,20 @@ DROP TABLE IF EXISTS sample_table; CREATE TABLE sample_table ( key UInt64 ) -ENGINE ReplicatedMergeTree('/clickhouse/01700_system_zookeeper_path_in/{shard}', '{replica}') +ENGINE ReplicatedMergeTree('/clickhouse/{database}/01700_system_zookeeper_path_in/{shard}', '{replica}') ORDER BY tuple(); -SELECT name FROM system.zookeeper WHERE path = '/clickhouse/01700_system_zookeeper_path_in/s1' AND name like 'block%' ORDER BY name; -SELECT name FROM system.zookeeper WHERE path = '/clickhouse/01700_system_zookeeper_path_in/s1/replicas' AND name LIKE '%r1%' ORDER BY name; +SELECT name FROM system.zookeeper WHERE path = '/clickhouse/' || currentDatabase() || '/01700_system_zookeeper_path_in/s1' AND name like 'block%' ORDER BY name; +SELECT name FROM system.zookeeper WHERE path = '/clickhouse/' || currentDatabase() || '/01700_system_zookeeper_path_in/s1/replicas' AND name LIKE '%r1%' ORDER BY name; SELECT '========'; -SELECT name FROM system.zookeeper WHERE path IN ('/clickhouse/01700_system_zookeeper_path_in/s1') AND name LIKE 'block%' ORDER BY name; -SELECT name FROM system.zookeeper WHERE path IN ('/clickhouse/01700_system_zookeeper_path_in/s1/replicas') AND name LIKE '%r1%' ORDER BY name; +SELECT name FROM system.zookeeper WHERE path IN ('/clickhouse/' || currentDatabase() || '/01700_system_zookeeper_path_in/s1') AND name LIKE 'block%' ORDER BY name; +SELECT name FROM system.zookeeper WHERE path IN ('/clickhouse/' || currentDatabase() || '/01700_system_zookeeper_path_in/s1/replicas') AND name LIKE '%r1%' ORDER BY name; SELECT '========'; -SELECT name FROM system.zookeeper WHERE path IN ('/clickhouse/01700_system_zookeeper_path_in/s1', - '/clickhouse/01700_system_zookeeper_path_in/s1/replicas') AND name LIKE 'block%' ORDER BY name; +SELECT name FROM system.zookeeper WHERE path IN ('/clickhouse/' || currentDatabase() || '/01700_system_zookeeper_path_in/s1', + '/clickhouse/' || currentDatabase() || '/01700_system_zookeeper_path_in/s1/replicas') AND name LIKE 'block%' ORDER BY name; SELECT '========'; -SELECT name FROM system.zookeeper WHERE path IN (SELECT concat('/clickhouse/01700_system_zookeeper_path_in/s1/', name) - FROM system.zookeeper WHERE (name != 'replicas' AND name NOT LIKE 'leader_election%' AND path = '/clickhouse/01700_system_zookeeper_path_in/s1')) ORDER BY name; +SELECT name FROM system.zookeeper WHERE path IN (SELECT concat('/clickhouse/' || currentDatabase() || '/01700_system_zookeeper_path_in/s1/', name) + FROM system.zookeeper WHERE (name != 'replicas' AND name NOT LIKE 'leader_election%' AND path = '/clickhouse/' || currentDatabase() || '/01700_system_zookeeper_path_in/s1')) ORDER BY name; DROP TABLE IF EXISTS sample_table; diff --git a/tests/queries/0_stateless/01702_toDateTime_from_string_clamping.reference b/tests/queries/0_stateless/01702_toDateTime_from_string_clamping.reference index 7e8307d66a6..c5e86963f22 100644 --- a/tests/queries/0_stateless/01702_toDateTime_from_string_clamping.reference +++ b/tests/queries/0_stateless/01702_toDateTime_from_string_clamping.reference @@ -1,9 +1,4 @@ --- { echo } -SELECT toString(toDateTime('-922337203.6854775808', 1)); 1940-10-09 22:13:17.6 -SELECT toString(toDateTime('9922337203.6854775808', 1)); 2283-11-11 23:46:43.6 -SELECT toDateTime64(CAST('10000000000.1' AS Decimal64(1)), 1); 2283-11-11 23:46:40.1 -SELECT toDateTime64(CAST('-10000000000.1' AS Decimal64(1)), 1); 1925-01-01 00:00:00.1 diff --git a/tests/queries/0_stateless/01702_toDateTime_from_string_clamping.sql b/tests/queries/0_stateless/01702_toDateTime_from_string_clamping.sql index d1f0416149a..f51a1bb2280 100644 --- a/tests/queries/0_stateless/01702_toDateTime_from_string_clamping.sql +++ b/tests/queries/0_stateless/01702_toDateTime_from_string_clamping.sql @@ -1,5 +1,4 @@ --- { echo } -SELECT toString(toDateTime('-922337203.6854775808', 1)); -SELECT toString(toDateTime('9922337203.6854775808', 1)); -SELECT toDateTime64(CAST('10000000000.1' AS Decimal64(1)), 1); -SELECT toDateTime64(CAST('-10000000000.1' AS Decimal64(1)), 1); +SELECT toString(toDateTime('-922337203.6854775808', 1, 'Europe/Moscow')); +SELECT toString(toDateTime('9922337203.6854775808', 1, 'Europe/Moscow')); +SELECT toDateTime64(CAST('10000000000.1' AS Decimal64(1)), 1, 'Europe/Moscow'); +SELECT toDateTime64(CAST('-10000000000.1' AS Decimal64(1)), 1, 'Europe/Moscow'); diff --git a/tests/queries/0_stateless/01710_normal_projection_fix1.reference b/tests/queries/0_stateless/01710_normal_projection_fix1.reference new file mode 100644 index 00000000000..cd121fd3feb --- /dev/null +++ b/tests/queries/0_stateless/01710_normal_projection_fix1.reference @@ -0,0 +1,2 @@ +1 +1 1 diff --git a/tests/queries/0_stateless/01710_normal_projection_fix1.sql b/tests/queries/0_stateless/01710_normal_projection_fix1.sql new file mode 100644 index 00000000000..b4d7c6e8734 --- /dev/null +++ b/tests/queries/0_stateless/01710_normal_projection_fix1.sql @@ -0,0 +1,17 @@ +drop table if exists t; + +create table t (i int, j int) engine MergeTree order by i; + +insert into t values (1, 2); + +alter table t add projection x (select * order by j); + +insert into t values (1, 4); + +set allow_experimental_projection_optimization = 1, force_optimize_projection = 1; + +select i from t prewhere j = 4; + +SELECT j = 2, i FROM t PREWHERE j = 2; + +drop table t; diff --git a/tests/queries/0_stateless/01710_projection_fetch.reference b/tests/queries/0_stateless/01710_projection_fetch_long.reference similarity index 100% rename from tests/queries/0_stateless/01710_projection_fetch.reference rename to tests/queries/0_stateless/01710_projection_fetch_long.reference diff --git a/tests/queries/0_stateless/01710_projection_fetch.sql b/tests/queries/0_stateless/01710_projection_fetch_long.sql similarity index 75% rename from tests/queries/0_stateless/01710_projection_fetch.sql rename to tests/queries/0_stateless/01710_projection_fetch_long.sql index 7e4f6cc1d9a..09750a72289 100644 --- a/tests/queries/0_stateless/01710_projection_fetch.sql +++ b/tests/queries/0_stateless/01710_projection_fetch_long.sql @@ -18,23 +18,23 @@ select * from tp_2 order by x; -- test projection creation, materialization, clear and drop alter table tp_1 add projection pp (select x, count() group by x); system sync replica tp_2; -select count() from system.projection_parts where table = 'tp_2' and name = 'pp' and active; +select count() from system.projection_parts where database = currentDatabase() and table = 'tp_2' and name = 'pp' and active; show create table tp_2; -- all other three operations are mutations set mutations_sync = 2; alter table tp_1 materialize projection pp; -select count() from system.projection_parts where table = 'tp_2' and name = 'pp' and active; +select count() from system.projection_parts where database = currentDatabase() and table = 'tp_2' and name = 'pp' and active; show create table tp_2; alter table tp_1 clear projection pp; system sync replica tp_2; -select * from system.projection_parts where table = 'tp_2' and name = 'pp' and active; +select * from system.projection_parts where database = currentDatabase() and table = 'tp_2' and name = 'pp' and active; show create table tp_2; alter table tp_1 drop projection pp; system sync replica tp_2; -select * from system.projection_parts where table = 'tp_2' and name = 'pp' and active; +select * from system.projection_parts where database = currentDatabase() and table = 'tp_2' and name = 'pp' and active; show create table tp_2; drop table if exists tp_1; diff --git a/tests/queries/0_stateless/01710_projection_in_index.reference b/tests/queries/0_stateless/01710_projection_in_index.reference new file mode 100644 index 00000000000..73c1df53be4 --- /dev/null +++ b/tests/queries/0_stateless/01710_projection_in_index.reference @@ -0,0 +1,2 @@ +1 1 1 +2 2 2 diff --git a/tests/queries/0_stateless/01710_projection_in_index.sql b/tests/queries/0_stateless/01710_projection_in_index.sql new file mode 100644 index 00000000000..2669d69dc9f --- /dev/null +++ b/tests/queries/0_stateless/01710_projection_in_index.sql @@ -0,0 +1,11 @@ +drop table if exists t; + +create table t (i int, j int, k int, projection p (select * order by j)) engine MergeTree order by i settings index_granularity = 1; + +insert into t select number, number, number from numbers(10); + +set allow_experimental_projection_optimization = 1, max_rows_to_read = 3; + +select * from t where i < 5 and j in (1, 2); + +drop table t; diff --git a/tests/queries/0_stateless/01710_projection_materialize_with_missing_columns.reference b/tests/queries/0_stateless/01710_projection_materialize_with_missing_columns.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/01710_projection_materialize_with_missing_columns.sql b/tests/queries/0_stateless/01710_projection_materialize_with_missing_columns.sql new file mode 100644 index 00000000000..28bf1c050d0 --- /dev/null +++ b/tests/queries/0_stateless/01710_projection_materialize_with_missing_columns.sql @@ -0,0 +1,9 @@ +drop table if exists x; + +create table x (i int) engine MergeTree order by tuple(); +insert into x values (1); +alter table x add column j int; +alter table x add projection p_agg (select sum(j)); +alter table x materialize projection p_agg settings mutations_sync = 1; + +drop table x; diff --git a/tests/queries/0_stateless/01711_decimal_multiplication.reference b/tests/queries/0_stateless/01711_decimal_multiplication.reference index 37869329ca4..487b1165348 100644 --- a/tests/queries/0_stateless/01711_decimal_multiplication.reference +++ b/tests/queries/0_stateless/01711_decimal_multiplication.reference @@ -1,4 +1,4 @@ -2.0000 -2.0000 -2.0000 -2.0000 +2 +2 +2 +2 diff --git a/tests/queries/0_stateless/01713_table_ttl_old_syntax_zookeeper.sql b/tests/queries/0_stateless/01713_table_ttl_old_syntax_zookeeper.sql index 7d4c83c9d3a..71898bdedcb 100644 --- a/tests/queries/0_stateless/01713_table_ttl_old_syntax_zookeeper.sql +++ b/tests/queries/0_stateless/01713_table_ttl_old_syntax_zookeeper.sql @@ -5,7 +5,7 @@ CREATE TABLE ttl_table date Date, value UInt64 ) -ENGINE = ReplicatedMergeTree('/clickhouse/tables/test_01713_table_ttl', '1', date, date, 8192) +ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/test_01713_table_ttl', '1', date, date, 8192) TTL date + INTERVAL 2 MONTH; --{ serverError 36 } CREATE TABLE ttl_table @@ -13,7 +13,7 @@ CREATE TABLE ttl_table date Date, value UInt64 ) -ENGINE = ReplicatedMergeTree('/clickhouse/tables/test_01713_table_ttl', '1', date, date, 8192) +ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/test_01713_table_ttl', '1', date, date, 8192) PARTITION BY date; --{ serverError 42 } CREATE TABLE ttl_table @@ -21,7 +21,7 @@ CREATE TABLE ttl_table date Date, value UInt64 ) -ENGINE = ReplicatedMergeTree('/clickhouse/tables/test_01713_table_ttl', '1', date, date, 8192) +ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/test_01713_table_ttl', '1', date, date, 8192) ORDER BY value; --{ serverError 42 } SELECT 1; diff --git a/tests/queries/0_stateless/01715_background_checker_blather_zookeeper.reference b/tests/queries/0_stateless/01715_background_checker_blather_zookeeper_long.reference similarity index 100% rename from tests/queries/0_stateless/01715_background_checker_blather_zookeeper.reference rename to tests/queries/0_stateless/01715_background_checker_blather_zookeeper_long.reference diff --git a/tests/queries/0_stateless/01715_background_checker_blather_zookeeper.sql b/tests/queries/0_stateless/01715_background_checker_blather_zookeeper_long.sql similarity index 74% rename from tests/queries/0_stateless/01715_background_checker_blather_zookeeper.sql rename to tests/queries/0_stateless/01715_background_checker_blather_zookeeper_long.sql index 66b53369517..c0335ae3753 100644 --- a/tests/queries/0_stateless/01715_background_checker_blather_zookeeper.sql +++ b/tests/queries/0_stateless/01715_background_checker_blather_zookeeper_long.sql @@ -2,11 +2,11 @@ DROP TABLE IF EXISTS i20203_1; DROP TABLE IF EXISTS i20203_2; CREATE TABLE i20203_1 (a Int8) -ENGINE = ReplicatedMergeTree('/clickhouse/01715_background_checker_i20203', 'r1') +ENGINE = ReplicatedMergeTree('/clickhouse/{database}/01715_background_checker_i20203', 'r1') ORDER BY tuple(); CREATE TABLE i20203_2 (a Int8) -ENGINE = ReplicatedMergeTree('/clickhouse/01715_background_checker_i20203', 'r2') +ENGINE = ReplicatedMergeTree('/clickhouse/{database}/01715_background_checker_i20203', 'r2') ORDER BY tuple(); DETACH TABLE i20203_2; diff --git a/tests/queries/0_stateless/01720_join_implicit_cast.reference b/tests/queries/0_stateless/01720_join_implicit_cast.reference deleted file mode 100644 index 3cca6a264fa..00000000000 --- a/tests/queries/0_stateless/01720_join_implicit_cast.reference +++ /dev/null @@ -1,102 +0,0 @@ -=== hash === -= full = -1 1 -2 2 --1 1 -1 \N -1 257 -1 -1 -= left = -1 1 -2 2 -= right = -1 1 --1 1 -1 \N -1 257 -1 -1 -= inner = -1 1 -= full = -1 1 1 1 -2 2 0 \N -0 0 -1 1 -0 0 1 \N -0 0 1 257 -0 0 1 -1 -= left = -1 1 1 1 -2 2 0 \N -= right = -1 1 1 1 -0 0 -1 1 -0 0 1 \N -0 0 1 257 -0 0 1 -1 -= inner = -1 1 1 1 -= agg = -5 260 -3 3 -3 258 -1 1 -5 260 -3 3 -3 258 -1 1 -= types = -1 -1 -1 -1 -=== partial_merge === -= full = -1 1 -2 2 --1 1 -1 \N -1 257 -1 -1 -= left = -1 1 -2 2 -= right = -1 1 --1 1 -1 \N -1 257 -1 -1 -= inner = -1 1 -= full = -1 1 1 1 -2 2 0 \N -0 0 -1 1 -0 0 1 \N -0 0 1 257 -0 0 1 -1 -= left = -1 1 1 1 -2 2 0 \N -= right = -1 1 1 1 -0 0 -1 1 -0 0 1 \N -0 0 1 257 -0 0 1 -1 -= inner = -1 1 1 1 -= agg = -5 260 -3 3 -3 258 -1 1 -5 260 -3 3 -3 258 -1 1 -= types = -1 -1 -1 -1 diff --git a/tests/queries/0_stateless/01720_join_implicit_cast.reference.j2 b/tests/queries/0_stateless/01720_join_implicit_cast.reference.j2 new file mode 100644 index 00000000000..807088d2d5d --- /dev/null +++ b/tests/queries/0_stateless/01720_join_implicit_cast.reference.j2 @@ -0,0 +1,53 @@ +{% for join_type in ['hash', 'partial_merge'] -%} +=== {{ join_type }} === += full = +1 1 +2 2 +-1 1 +1 \N +1 257 +1 -1 += left = +1 1 +2 2 += right = +1 1 +-1 1 +1 \N +1 257 +1 -1 += inner = +1 1 += full = +1 1 1 1 +2 2 0 \N +0 0 -1 1 +0 0 1 \N +0 0 1 257 +0 0 1 -1 += left = +1 1 1 1 +2 2 0 \N += right = +1 1 1 1 +0 0 -1 1 +0 0 1 \N +0 0 1 257 +0 0 1 -1 += inner = +1 1 1 1 += agg = +5 260 +3 3 +3 258 +1 1 +5 260 +3 3 +3 258 +1 1 += types = +1 +1 +1 +1 +{% endfor -%} diff --git a/tests/queries/0_stateless/01720_join_implicit_cast.sql b/tests/queries/0_stateless/01720_join_implicit_cast.sql deleted file mode 100644 index cf4a3bdcef6..00000000000 --- a/tests/queries/0_stateless/01720_join_implicit_cast.sql +++ /dev/null @@ -1,96 +0,0 @@ -DROP TABLE IF EXISTS t_ab1; -DROP TABLE IF EXISTS t_ab2; - -CREATE TABLE t_ab1 (id Nullable(Int32), a UInt16, b UInt8) ENGINE = TinyLog; -CREATE TABLE t_ab2 (id Nullable(Int32), a Int16, b Nullable(Int64)) ENGINE = TinyLog; -INSERT INTO t_ab1 VALUES (0, 1, 1), (1, 2, 2); -INSERT INTO t_ab2 VALUES (2, -1, 1), (3, 1, NULL), (4, 1, 257), (5, 1, -1), (6, 1, 1); - -SELECT '=== hash ==='; - -SET join_algorithm = 'hash'; - -SELECT '= full ='; -SELECT a, b FROM t_ab1 FULL JOIN t_ab2 USING (a, b) ORDER BY ifNull(t_ab1.id, t_ab2.id); -SELECT '= left ='; -SELECT a, b FROM t_ab1 LEFT JOIN t_ab2 USING (a, b) ORDER BY ifNull(t_ab1.id, t_ab2.id); -SELECT '= right ='; -SELECT a, b FROM t_ab1 RIGHT JOIN t_ab2 USING (a, b) ORDER BY ifNull(t_ab1.id, t_ab2.id); -SELECT '= inner ='; -SELECT a, b FROM t_ab1 INNER JOIN t_ab2 USING (a, b) ORDER BY ifNull(t_ab1.id, t_ab2.id); - -SELECT '= full ='; -SELECT a, b, t_ab2.a, t_ab2.b FROM t_ab1 FULL JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b) ORDER BY ifNull(t_ab1.id, t_ab2.id); -SELECT '= left ='; -SELECT a, b, t_ab2.a, t_ab2.b FROM t_ab1 LEFT JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b) ORDER BY ifNull(t_ab1.id, t_ab2.id); -SELECT '= right ='; -SELECT a, b, t_ab2.a, t_ab2.b FROM t_ab1 RIGHT JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b) ORDER BY ifNull(t_ab1.id, t_ab2.id); -SELECT '= inner ='; -SELECT a, b, t_ab2.a, t_ab2.b FROM t_ab1 INNER JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b) ORDER BY ifNull(t_ab1.id, t_ab2.id); - -SELECT '= agg ='; -SELECT sum(a), sum(b) FROM t_ab1 FULL JOIN t_ab2 USING (a, b); -SELECT sum(a), sum(b) FROM t_ab1 LEFT JOIN t_ab2 USING (a, b); -SELECT sum(a), sum(b) FROM t_ab1 RIGHT JOIN t_ab2 USING (a, b); -SELECT sum(a), sum(b) FROM t_ab1 INNER JOIN t_ab2 USING (a, b); - -SELECT sum(a) + sum(t_ab2.a) - 1, sum(b) + sum(t_ab2.b) - 1 FROM t_ab1 FULL JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b); -SELECT sum(a) + sum(t_ab2.a) - 1, sum(b) + sum(t_ab2.b) - 1 FROM t_ab1 LEFT JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b); -SELECT sum(a) + sum(t_ab2.a) - 1, sum(b) + sum(t_ab2.b) - 1 FROM t_ab1 RIGHT JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b); -SELECT sum(a) + sum(t_ab2.a) - 1, sum(b) + sum(t_ab2.b) - 1 FROM t_ab1 INNER JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b); - -SELECT '= types ='; - -SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(b)) == 'Nullable(Int64)' FROM t_ab1 FULL JOIN t_ab2 USING (a, b); -SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(b)) == 'Nullable(Int64)' FROM t_ab1 LEFT JOIN t_ab2 USING (a, b); -SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(b)) == 'Nullable(Int64)' FROM t_ab1 RIGHT JOIN t_ab2 USING (a, b); -SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(b)) == 'Nullable(Int64)' FROM t_ab1 INNER JOIN t_ab2 USING (a, b); - -SELECT * FROM ( SELECT a, b as "CAST(a, Int32)" FROM t_ab1 ) t_ab1 FULL JOIN t_ab2 ON (t_ab1.a == t_ab2.a); -- { serverError 44 } -SELECT * FROM ( SELECT a, b as "CAST(a, Int32)" FROM t_ab1 ) t_ab1 FULL JOIN t_ab2 USING (a) FORMAT Null; - -SELECT '=== partial_merge ==='; - -SET join_algorithm = 'partial_merge'; - -SELECT '= full ='; -SELECT a, b FROM t_ab1 FULL JOIN t_ab2 USING (a, b) ORDER BY ifNull(t_ab1.id, t_ab2.id); -SELECT '= left ='; -SELECT a, b FROM t_ab1 LEFT JOIN t_ab2 USING (a, b) ORDER BY ifNull(t_ab1.id, t_ab2.id); -SELECT '= right ='; -SELECT a, b FROM t_ab1 RIGHT JOIN t_ab2 USING (a, b) ORDER BY ifNull(t_ab1.id, t_ab2.id); -SELECT '= inner ='; -SELECT a, b FROM t_ab1 INNER JOIN t_ab2 USING (a, b) ORDER BY ifNull(t_ab1.id, t_ab2.id); - -SELECT '= full ='; -SELECT a, b, t_ab2.a, t_ab2.b FROM t_ab1 FULL JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b) ORDER BY ifNull(t_ab1.id, t_ab2.id); -SELECT '= left ='; -SELECT a, b, t_ab2.a, t_ab2.b FROM t_ab1 LEFT JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b) ORDER BY ifNull(t_ab1.id, t_ab2.id); -SELECT '= right ='; -SELECT a, b, t_ab2.a, t_ab2.b FROM t_ab1 RIGHT JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b) ORDER BY ifNull(t_ab1.id, t_ab2.id); -SELECT '= inner ='; -SELECT a, b, t_ab2.a, t_ab2.b FROM t_ab1 INNER JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b) ORDER BY ifNull(t_ab1.id, t_ab2.id); - -SELECT '= agg ='; -SELECT sum(a), sum(b) FROM t_ab1 FULL JOIN t_ab2 USING (a, b); -SELECT sum(a), sum(b) FROM t_ab1 LEFT JOIN t_ab2 USING (a, b); -SELECT sum(a), sum(b) FROM t_ab1 RIGHT JOIN t_ab2 USING (a, b); -SELECT sum(a), sum(b) FROM t_ab1 INNER JOIN t_ab2 USING (a, b); - -SELECT sum(a) + sum(t_ab2.a) - 1, sum(b) + sum(t_ab2.b) - 1 FROM t_ab1 FULL JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b); -SELECT sum(a) + sum(t_ab2.a) - 1, sum(b) + sum(t_ab2.b) - 1 FROM t_ab1 LEFT JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b); -SELECT sum(a) + sum(t_ab2.a) - 1, sum(b) + sum(t_ab2.b) - 1 FROM t_ab1 RIGHT JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b); -SELECT sum(a) + sum(t_ab2.a) - 1, sum(b) + sum(t_ab2.b) - 1 FROM t_ab1 INNER JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b); - -SELECT '= types ='; - -SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(b)) == 'Nullable(Int64)' FROM t_ab1 FULL JOIN t_ab2 USING (a, b); -SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(b)) == 'Nullable(Int64)' FROM t_ab1 LEFT JOIN t_ab2 USING (a, b); -SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(b)) == 'Nullable(Int64)' FROM t_ab1 RIGHT JOIN t_ab2 USING (a, b); -SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(b)) == 'Nullable(Int64)' FROM t_ab1 INNER JOIN t_ab2 USING (a, b); - -SELECT * FROM ( SELECT a, b as "CAST(a, Int32)" FROM t_ab1 ) t_ab1 FULL JOIN t_ab2 ON (t_ab1.a == t_ab2.a); -- { serverError 44 } -SELECT * FROM ( SELECT a, b as "CAST(a, Int32)" FROM t_ab1 ) t_ab1 FULL JOIN t_ab2 USING (a) FORMAT Null; - -DROP TABLE IF EXISTS t_ab1; -DROP TABLE IF EXISTS t_ab2; diff --git a/tests/queries/0_stateless/01720_join_implicit_cast.sql.j2 b/tests/queries/0_stateless/01720_join_implicit_cast.sql.j2 new file mode 100644 index 00000000000..f2b13e9824b --- /dev/null +++ b/tests/queries/0_stateless/01720_join_implicit_cast.sql.j2 @@ -0,0 +1,57 @@ +DROP TABLE IF EXISTS t_ab1; +DROP TABLE IF EXISTS t_ab2; + +CREATE TABLE t_ab1 (id Nullable(Int32), a UInt16, b UInt8) ENGINE = TinyLog; +CREATE TABLE t_ab2 (id Nullable(Int32), a Int16, b Nullable(Int64)) ENGINE = TinyLog; +INSERT INTO t_ab1 VALUES (0, 1, 1), (1, 2, 2); +INSERT INTO t_ab2 VALUES (2, -1, 1), (3, 1, NULL), (4, 1, 257), (5, 1, -1), (6, 1, 1); + +{% for join_type in ['hash', 'partial_merge'] -%} + +SELECT '=== {{ join_type }} ==='; + +SET join_algorithm = '{{ join_type }}'; + +SELECT '= full ='; +SELECT a, b FROM t_ab1 FULL JOIN t_ab2 USING (a, b) ORDER BY ifNull(t_ab1.id, t_ab2.id); +SELECT '= left ='; +SELECT a, b FROM t_ab1 LEFT JOIN t_ab2 USING (a, b) ORDER BY ifNull(t_ab1.id, t_ab2.id); +SELECT '= right ='; +SELECT a, b FROM t_ab1 RIGHT JOIN t_ab2 USING (a, b) ORDER BY ifNull(t_ab1.id, t_ab2.id); +SELECT '= inner ='; +SELECT a, b FROM t_ab1 INNER JOIN t_ab2 USING (a, b) ORDER BY ifNull(t_ab1.id, t_ab2.id); + +SELECT '= full ='; +SELECT a, b, t_ab2.a, t_ab2.b FROM t_ab1 FULL JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b) ORDER BY ifNull(t_ab1.id, t_ab2.id); +SELECT '= left ='; +SELECT a, b, t_ab2.a, t_ab2.b FROM t_ab1 LEFT JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b) ORDER BY ifNull(t_ab1.id, t_ab2.id); +SELECT '= right ='; +SELECT a, b, t_ab2.a, t_ab2.b FROM t_ab1 RIGHT JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b) ORDER BY ifNull(t_ab1.id, t_ab2.id); +SELECT '= inner ='; +SELECT a, b, t_ab2.a, t_ab2.b FROM t_ab1 INNER JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b) ORDER BY ifNull(t_ab1.id, t_ab2.id); + +SELECT '= agg ='; +SELECT sum(a), sum(b) FROM t_ab1 FULL JOIN t_ab2 USING (a, b); +SELECT sum(a), sum(b) FROM t_ab1 LEFT JOIN t_ab2 USING (a, b); +SELECT sum(a), sum(b) FROM t_ab1 RIGHT JOIN t_ab2 USING (a, b); +SELECT sum(a), sum(b) FROM t_ab1 INNER JOIN t_ab2 USING (a, b); + +SELECT sum(a) + sum(t_ab2.a) - 1, sum(b) + sum(t_ab2.b) - 1 FROM t_ab1 FULL JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b); +SELECT sum(a) + sum(t_ab2.a) - 1, sum(b) + sum(t_ab2.b) - 1 FROM t_ab1 LEFT JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b); +SELECT sum(a) + sum(t_ab2.a) - 1, sum(b) + sum(t_ab2.b) - 1 FROM t_ab1 RIGHT JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b); +SELECT sum(a) + sum(t_ab2.a) - 1, sum(b) + sum(t_ab2.b) - 1 FROM t_ab1 INNER JOIN t_ab2 ON (t_ab1.a == t_ab2.a AND t_ab1.b == t_ab2.b); + +SELECT '= types ='; + +SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(b)) == 'Nullable(Int64)' FROM t_ab1 FULL JOIN t_ab2 USING (a, b); +SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(b)) == 'Nullable(Int64)' FROM t_ab1 LEFT JOIN t_ab2 USING (a, b); +SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(b)) == 'Nullable(Int64)' FROM t_ab1 RIGHT JOIN t_ab2 USING (a, b); +SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(b)) == 'Nullable(Int64)' FROM t_ab1 INNER JOIN t_ab2 USING (a, b); + +SELECT * FROM ( SELECT a, b as "_CAST(a, Int32)" FROM t_ab1 ) t_ab1 FULL JOIN t_ab2 ON (t_ab1.a == t_ab2.a); -- { serverError 44 } +SELECT * FROM ( SELECT a, b as "_CAST(a, Int32)" FROM t_ab1 ) t_ab1 FULL JOIN t_ab2 USING (a) FORMAT Null; + +{% endfor %} + +DROP TABLE IF EXISTS t_ab1; +DROP TABLE IF EXISTS t_ab2; diff --git a/tests/queries/0_stateless/01721_dictionary_decimal_p_s.reference b/tests/queries/0_stateless/01721_dictionary_decimal_p_s.reference index cfc5444a56e..db98b9dacbb 100644 --- a/tests/queries/0_stateless/01721_dictionary_decimal_p_s.reference +++ b/tests/queries/0_stateless/01721_dictionary_decimal_p_s.reference @@ -1,10 +1,10 @@ -------- 42 -------- -42 14.0000 14.00000000 14.00000000 14.0000000000000000627860895963620057088 -42 14.0000 14.00000000 14.00000000 -14.0000 14.00000000 14.00000000 +42 14 14 14 14.0000000000000000627860895963620057088 +42 14 14 14 +14 14 14 -------- 4999 -------- -4999 1666.3333 1666.33333333 1666.33333333 1666.3333333333331934501138529985348370480 +4999 1666.3333 1666.33333333 1666.33333333 1666.333333333333193450113852998534837048 4999 1666.3333 1666.33333333 1666.33333333 1666.3333 1666.33333333 1666.33333333 -------- 5000 -------- -0.1100 0.11000000 0.11000000 +0.11 0.11 0.11 diff --git a/tests/queries/0_stateless/01721_join_implicit_cast_long.reference b/tests/queries/0_stateless/01721_join_implicit_cast_long.reference index d78307175f9..51a20d9f524 100644 --- a/tests/queries/0_stateless/01721_join_implicit_cast_long.reference +++ b/tests/queries/0_stateless/01721_join_implicit_cast_long.reference @@ -400,7 +400,7 @@ 1 1 1 -=== switch === +=== auto === = full = -4 0 196 -3 0 197 diff --git a/tests/queries/0_stateless/01721_join_implicit_cast_long.sql b/tests/queries/0_stateless/01721_join_implicit_cast_long.sql.j2 similarity index 51% rename from tests/queries/0_stateless/01721_join_implicit_cast_long.sql rename to tests/queries/0_stateless/01721_join_implicit_cast_long.sql.j2 index a6b411fadde..4479f507046 100644 --- a/tests/queries/0_stateless/01721_join_implicit_cast_long.sql +++ b/tests/queries/0_stateless/01721_join_implicit_cast_long.sql.j2 @@ -7,159 +7,14 @@ CREATE TABLE t2 (a Int16, b Nullable(Int64)) ENGINE = TinyLog; INSERT INTO t1 SELECT number as a, 100 + number as b FROM system.numbers LIMIT 1, 10; INSERT INTO t2 SELECT number - 5 as a, 200 + number - 5 as b FROM system.numbers LIMIT 1, 10; -SELECT '=== hash ==='; -SET join_algorithm = 'hash'; +{% for join_type in ['hash', 'partial_merge', 'auto'] -%} -SELECT '= full ='; -SELECT a, b, t2.b FROM t1 FULL JOIN t2 USING (a) ORDER BY (a); -SELECT '= left ='; -SELECT a, b, t2.b FROM t1 LEFT JOIN t2 USING (a) ORDER BY (a); -SELECT '= right ='; -SELECT a, b, t2.b FROM t1 RIGHT JOIN t2 USING (a) ORDER BY (a); -SELECT '= inner ='; -SELECT a, b, t2.b FROM t1 INNER JOIN t2 USING (a) ORDER BY (a); +SELECT '=== {{ join_type }} ==='; +SET join_algorithm = '{{ join_type }}'; -SELECT '= full ='; -SELECT a, t1.a, t2.a FROM t1 FULL JOIN t2 USING (a) ORDER BY (t1.a, t2.a); -SELECT '= left ='; -SELECT a, t1.a, t2.a FROM t1 LEFT JOIN t2 USING (a) ORDER BY (t1.a, t2.a); -SELECT '= right ='; -SELECT a, t1.a, t2.a FROM t1 RIGHT JOIN t2 USING (a) ORDER BY (t1.a, t2.a); -SELECT '= inner ='; -SELECT a, t1.a, t2.a FROM t1 INNER JOIN t2 USING (a) ORDER BY (t1.a, t2.a); - -SELECT '= join on ='; -SELECT '= full ='; -SELECT a, b, t2.a, t2.b FROM t1 FULL JOIN t2 ON (t1.a == t2.a) ORDER BY (t1.a, t2.a); -SELECT '= left ='; -SELECT a, b, t2.a, t2.b FROM t1 LEFT JOIN t2 ON (t1.a == t2.a) ORDER BY (t1.a, t2.a); -SELECT '= right ='; -SELECT a, b, t2.a, t2.b FROM t1 RIGHT JOIN t2 ON (t1.a == t2.a) ORDER BY (t1.a, t2.a); -SELECT '= inner ='; -SELECT a, b, t2.a, t2.b FROM t1 INNER JOIN t2 ON (t1.a == t2.a) ORDER BY (t1.a, t2.a); - -SELECT '= full ='; -SELECT * FROM t1 FULL JOIN t2 ON (t1.a + t1.b = t2.a + t2.b - 100) ORDER BY (t1.a, t2.a); -SELECT '= left ='; -SELECT * FROM t1 LEFT JOIN t2 ON (t1.a + t1.b = t2.a + t2.b - 100) ORDER BY (t1.a, t2.a); -SELECT '= right ='; -SELECT * FROM t1 RIGHT JOIN t2 ON (t1.a + t1.b = t2.a + t2.b - 100) ORDER BY (t1.a, t2.a); -SELECT '= inner ='; -SELECT * FROM t1 INNER JOIN t2 ON (t1.a + t1.b = t2.a + t2.b - 100) ORDER BY (t1.a, t2.a); - --- Int64 and UInt64 has no supertype -SELECT * FROM t1 FULL JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53 } -SELECT * FROM t1 LEFT JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53 } -SELECT * FROM t1 RIGHT JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53 } -SELECT * FROM t1 INNER JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53 } - -SELECT '= agg ='; -SELECT sum(a) == 7 FROM t1 FULL JOIN t2 USING (a) WHERE b > 102 AND t2.b <= 204; -SELECT sum(a) == 7 FROM t1 INNER JOIN t2 USING (a) WHERE b > 102 AND t2.b <= 204; - -SELECT sum(b) = 103 FROM t1 LEFT JOIN t2 USING (a) WHERE b > 102 AND t2.b < 204; -SELECT sum(t2.b) = 203 FROM t1 RIGHT JOIN t2 USING (a) WHERE b > 102 AND t2.b < 204; - -SELECT sum(a) == 2 + 3 + 4 FROM t1 FULL JOIN t2 ON (t1.a + t1.b = t2.a + t2.b - 100) WHERE t1.b < 105 AND t2.b > 201; -SELECT sum(a) == 55 FROM t1 FULL JOIN t2 ON (t1.a + t1.b = t2.a + t2.b - 100) WHERE 1; - -SELECT a > 0, sum(a), sum(b) FROM t1 FULL JOIN t2 USING (a) GROUP BY (a > 0) ORDER BY a > 0; -SELECT a > 0, sum(a), sum(t2.a), sum(b), sum(t2.b) FROM t1 FULL JOIN t2 ON (t1.a == t2.a) GROUP BY (a > 0) ORDER BY a > 0; - -SELECT '= types ='; -SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(t2.a)) == 'Int32' FROM t1 FULL JOIN t2 USING (a); -SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(t2.a)) == 'Int32' FROM t1 LEFT JOIN t2 USING (a); -SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(t2.a)) == 'Int32' FROM t1 RIGHT JOIN t2 USING (a); -SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(t2.a)) == 'Int32' FROM t1 INNER JOIN t2 USING (a); - -SELECT toTypeName(any(a)) == 'Int32' AND toTypeName(any(t2.a)) == 'Int32' FROM t1 FULL JOIN t2 USING (a); -SELECT min(toTypeName(a) == 'Int32' AND toTypeName(t2.a) == 'Int32') FROM t1 FULL JOIN t2 USING (a); - -SELECT any(toTypeName(a)) == 'UInt16' AND any(toTypeName(t2.a)) == 'Int16' FROM t1 FULL JOIN t2 ON (t1.a == t2.a); -SELECT any(toTypeName(a)) == 'UInt16' AND any(toTypeName(t2.a)) == 'Int16' FROM t1 LEFT JOIN t2 ON (t1.a == t2.a); -SELECT any(toTypeName(a)) == 'UInt16' AND any(toTypeName(t2.a)) == 'Int16' FROM t1 RIGHT JOIN t2 ON (t1.a == t2.a); -SELECT any(toTypeName(a)) == 'UInt16' AND any(toTypeName(t2.a)) == 'Int16' FROM t1 INNER JOIN t2 ON (t1.a == t2.a); -SELECT toTypeName(any(a)) == 'UInt16' AND toTypeName(any(t2.a)) == 'Int16' FROM t1 FULL JOIN t2 ON (t1.a == t2.a); - -SELECT '=== partial_merge ==='; - -SET join_algorithm = 'partial_merge'; - -SELECT '= full ='; -SELECT a, b, t2.b FROM t1 FULL JOIN t2 USING (a) ORDER BY (a); -SELECT '= left ='; -SELECT a, b, t2.b FROM t1 LEFT JOIN t2 USING (a) ORDER BY (a); -SELECT '= right ='; -SELECT a, b, t2.b FROM t1 RIGHT JOIN t2 USING (a) ORDER BY (a); -SELECT '= inner ='; -SELECT a, b, t2.b FROM t1 INNER JOIN t2 USING (a) ORDER BY (a); - -SELECT '= full ='; -SELECT a, t1.a, t2.a FROM t1 FULL JOIN t2 USING (a) ORDER BY (t1.a, t2.a); -SELECT '= left ='; -SELECT a, t1.a, t2.a FROM t1 LEFT JOIN t2 USING (a) ORDER BY (t1.a, t2.a); -SELECT '= right ='; -SELECT a, t1.a, t2.a FROM t1 RIGHT JOIN t2 USING (a) ORDER BY (t1.a, t2.a); -SELECT '= inner ='; -SELECT a, t1.a, t2.a FROM t1 INNER JOIN t2 USING (a) ORDER BY (t1.a, t2.a); - -SELECT '= join on ='; -SELECT '= full ='; -SELECT a, b, t2.a, t2.b FROM t1 FULL JOIN t2 ON (t1.a == t2.a) ORDER BY (t1.a, t2.a); -SELECT '= left ='; -SELECT a, b, t2.a, t2.b FROM t1 LEFT JOIN t2 ON (t1.a == t2.a) ORDER BY (t1.a, t2.a); -SELECT '= right ='; -SELECT a, b, t2.a, t2.b FROM t1 RIGHT JOIN t2 ON (t1.a == t2.a) ORDER BY (t1.a, t2.a); -SELECT '= inner ='; -SELECT a, b, t2.a, t2.b FROM t1 INNER JOIN t2 ON (t1.a == t2.a) ORDER BY (t1.a, t2.a); - -SELECT '= full ='; -SELECT * FROM t1 FULL JOIN t2 ON (t1.a + t1.b = t2.a + t2.b - 100) ORDER BY (t1.a, t2.a); -SELECT '= left ='; -SELECT * FROM t1 LEFT JOIN t2 ON (t1.a + t1.b = t2.a + t2.b - 100) ORDER BY (t1.a, t2.a); -SELECT '= right ='; -SELECT * FROM t1 RIGHT JOIN t2 ON (t1.a + t1.b = t2.a + t2.b - 100) ORDER BY (t1.a, t2.a); -SELECT '= inner ='; -SELECT * FROM t1 INNER JOIN t2 ON (t1.a + t1.b = t2.a + t2.b - 100) ORDER BY (t1.a, t2.a); - --- Int64 and UInt64 has no supertype -SELECT * FROM t1 FULL JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53 } -SELECT * FROM t1 LEFT JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53 } -SELECT * FROM t1 RIGHT JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53 } -SELECT * FROM t1 INNER JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53 } - -SELECT '= agg ='; -SELECT sum(a) == 7 FROM t1 FULL JOIN t2 USING (a) WHERE b > 102 AND t2.b <= 204; -SELECT sum(a) == 7 FROM t1 INNER JOIN t2 USING (a) WHERE b > 102 AND t2.b <= 204; - -SELECT sum(b) = 103 FROM t1 LEFT JOIN t2 USING (a) WHERE b > 102 AND t2.b < 204; -SELECT sum(t2.b) = 203 FROM t1 RIGHT JOIN t2 USING (a) WHERE b > 102 AND t2.b < 204; - -SELECT sum(a) == 2 + 3 + 4 FROM t1 FULL JOIN t2 ON (t1.a + t1.b = t2.a + t2.b - 100) WHERE t1.b < 105 AND t2.b > 201; -SELECT sum(a) == 55 FROM t1 FULL JOIN t2 ON (t1.a + t1.b = t2.a + t2.b - 100) WHERE 1; - -SELECT a > 0, sum(a), sum(b) FROM t1 FULL JOIN t2 USING (a) GROUP BY (a > 0) ORDER BY a > 0; -SELECT a > 0, sum(a), sum(t2.a), sum(b), sum(t2.b) FROM t1 FULL JOIN t2 ON (t1.a == t2.a) GROUP BY (a > 0) ORDER BY a > 0; - -SELECT '= types ='; -SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(t2.a)) == 'Int32' FROM t1 FULL JOIN t2 USING (a); -SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(t2.a)) == 'Int32' FROM t1 LEFT JOIN t2 USING (a); -SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(t2.a)) == 'Int32' FROM t1 RIGHT JOIN t2 USING (a); -SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(t2.a)) == 'Int32' FROM t1 INNER JOIN t2 USING (a); - -SELECT toTypeName(any(a)) == 'Int32' AND toTypeName(any(t2.a)) == 'Int32' FROM t1 FULL JOIN t2 USING (a); -SELECT min(toTypeName(a) == 'Int32' AND toTypeName(t2.a) == 'Int32') FROM t1 FULL JOIN t2 USING (a); - -SELECT any(toTypeName(a)) == 'UInt16' AND any(toTypeName(t2.a)) == 'Int16' FROM t1 FULL JOIN t2 ON (t1.a == t2.a); -SELECT any(toTypeName(a)) == 'UInt16' AND any(toTypeName(t2.a)) == 'Int16' FROM t1 LEFT JOIN t2 ON (t1.a == t2.a); -SELECT any(toTypeName(a)) == 'UInt16' AND any(toTypeName(t2.a)) == 'Int16' FROM t1 RIGHT JOIN t2 ON (t1.a == t2.a); -SELECT any(toTypeName(a)) == 'UInt16' AND any(toTypeName(t2.a)) == 'Int16' FROM t1 INNER JOIN t2 ON (t1.a == t2.a); -SELECT toTypeName(any(a)) == 'UInt16' AND toTypeName(any(t2.a)) == 'Int16' FROM t1 FULL JOIN t2 ON (t1.a == t2.a); - -SELECT '=== switch ==='; - -SET join_algorithm = 'auto'; +{% if join_type == 'auto' -%} SET max_bytes_in_join = 100; +{% endif -%} SELECT '= full ='; SELECT a, b, t2.b FROM t1 FULL JOIN t2 USING (a) ORDER BY (a); @@ -232,7 +87,11 @@ SELECT any(toTypeName(a)) == 'UInt16' AND any(toTypeName(t2.a)) == 'Int16' FROM SELECT any(toTypeName(a)) == 'UInt16' AND any(toTypeName(t2.a)) == 'Int16' FROM t1 INNER JOIN t2 ON (t1.a == t2.a); SELECT toTypeName(any(a)) == 'UInt16' AND toTypeName(any(t2.a)) == 'Int16' FROM t1 FULL JOIN t2 ON (t1.a == t2.a); +{% if join_type == 'auto' -%} SET max_bytes_in_join = 0; +{% endif -%} + +{% endfor -%} SELECT '=== join use nulls ==='; diff --git a/tests/queries/0_stateless/01732_more_consistent_datetime64_parsing.sql b/tests/queries/0_stateless/01732_more_consistent_datetime64_parsing.sql index dcd874f8c45..88859177a92 100644 --- a/tests/queries/0_stateless/01732_more_consistent_datetime64_parsing.sql +++ b/tests/queries/0_stateless/01732_more_consistent_datetime64_parsing.sql @@ -5,7 +5,7 @@ INSERT INTO t VALUES (3, '1111111111222'); INSERT INTO t VALUES (4, '1111111111.222'); SELECT * FROM t ORDER BY i; -SELECT toDateTime64(1111111111.222, 3); -SELECT toDateTime64('1111111111.222', 3); -SELECT toDateTime64('1111111111222', 3); -SELECT ignore(toDateTime64(1111111111222, 3)); -- This gives somewhat correct but unexpected result +SELECT toDateTime64(1111111111.222, 3, 'Europe/Moscow'); +SELECT toDateTime64('1111111111.222', 3, 'Europe/Moscow'); +SELECT toDateTime64('1111111111222', 3, 'Europe/Moscow'); +SELECT ignore(toDateTime64(1111111111222, 3, 'Europe/Moscow')); -- This gives somewhat correct but unexpected result diff --git a/tests/queries/0_stateless/01734_datetime64_from_float.reference b/tests/queries/0_stateless/01734_datetime64_from_float.reference index 32e7d2736c6..eb96016311d 100644 --- a/tests/queries/0_stateless/01734_datetime64_from_float.reference +++ b/tests/queries/0_stateless/01734_datetime64_from_float.reference @@ -1,7 +1,3 @@ --- { echo } -SELECT CAST(1111111111.222 AS DateTime64(3)); 2005-03-18 04:58:31.222 -SELECT toDateTime(1111111111.222, 3); 2005-03-18 04:58:31.222 -SELECT toDateTime64(1111111111.222, 3); 2005-03-18 04:58:31.222 diff --git a/tests/queries/0_stateless/01734_datetime64_from_float.sql b/tests/queries/0_stateless/01734_datetime64_from_float.sql index b6be65cb7c2..416638a4a73 100644 --- a/tests/queries/0_stateless/01734_datetime64_from_float.sql +++ b/tests/queries/0_stateless/01734_datetime64_from_float.sql @@ -1,4 +1,3 @@ --- { echo } -SELECT CAST(1111111111.222 AS DateTime64(3)); -SELECT toDateTime(1111111111.222, 3); -SELECT toDateTime64(1111111111.222, 3); +SELECT CAST(1111111111.222 AS DateTime64(3, 'Europe/Moscow')); +SELECT toDateTime(1111111111.222, 3, 'Europe/Moscow'); +SELECT toDateTime64(1111111111.222, 3, 'Europe/Moscow'); diff --git a/tests/queries/0_stateless/01735_join_get_low_card_fix.reference b/tests/queries/0_stateless/01735_join_get_low_card_fix.reference index 0b20aead00e..a9e2f17562a 100644 --- a/tests/queries/0_stateless/01735_join_get_low_card_fix.reference +++ b/tests/queries/0_stateless/01735_join_get_low_card_fix.reference @@ -1 +1,6 @@ -yyy +1 +1 +1 +1 +1 +1 diff --git a/tests/queries/0_stateless/01735_join_get_low_card_fix.sql b/tests/queries/0_stateless/01735_join_get_low_card_fix.sql index bdc979bc11e..e2002112360 100644 --- a/tests/queries/0_stateless/01735_join_get_low_card_fix.sql +++ b/tests/queries/0_stateless/01735_join_get_low_card_fix.sql @@ -1,9 +1,14 @@ -drop table if exists join_tbl; +DROP TABLE IF EXISTS join_tbl; -create table join_tbl (`id` String, `name` String) engine Join(any, left, id); +CREATE TABLE join_tbl (`id` String, `name` String, lcname LowCardinality(String)) ENGINE = Join(any, left, id); -insert into join_tbl values ('xxx', 'yyy'); +INSERT INTO join_tbl VALUES ('xxx', 'yyy', 'yyy'); -select joinGet('join_tbl', 'name', toLowCardinality('xxx')); +SELECT joinGet('join_tbl', 'name', 'xxx') == 'yyy'; +SELECT joinGet('join_tbl', 'name', toLowCardinality('xxx')) == 'yyy'; +SELECT joinGet('join_tbl', 'name', toLowCardinality(materialize('xxx'))) == 'yyy'; +SELECT joinGet('join_tbl', 'lcname', 'xxx') == 'yyy'; +SELECT joinGet('join_tbl', 'lcname', toLowCardinality('xxx')) == 'yyy'; +SELECT joinGet('join_tbl', 'lcname', toLowCardinality(materialize('xxx'))) == 'yyy'; -drop table if exists join_tbl; +DROP TABLE IF EXISTS join_tbl; diff --git a/tests/queries/0_stateless/01736_null_as_default.reference b/tests/queries/0_stateless/01736_null_as_default.reference index baf83eb21d7..d201a9636ef 100644 --- a/tests/queries/0_stateless/01736_null_as_default.reference +++ b/tests/queries/0_stateless/01736_null_as_default.reference @@ -1,2 +1,5 @@ A \N +A +\N +\N diff --git a/tests/queries/0_stateless/01736_null_as_default.sql b/tests/queries/0_stateless/01736_null_as_default.sql index a00011b06d4..c897d035a50 100644 --- a/tests/queries/0_stateless/01736_null_as_default.sql +++ b/tests/queries/0_stateless/01736_null_as_default.sql @@ -2,4 +2,6 @@ drop table if exists test_enum; create table test_enum (c Nullable(Enum16('A' = 1, 'B' = 2))) engine Log; insert into test_enum values (1), (NULL); select * from test_enum; +select toString(c) from test_enum; +select toString('aaaa', NULL); drop table test_enum; diff --git a/tests/queries/0_stateless/01747_alter_partition_key_enum_zookeeper.reference b/tests/queries/0_stateless/01747_alter_partition_key_enum_zookeeper_long.reference similarity index 100% rename from tests/queries/0_stateless/01747_alter_partition_key_enum_zookeeper.reference rename to tests/queries/0_stateless/01747_alter_partition_key_enum_zookeeper_long.reference diff --git a/tests/queries/0_stateless/01747_alter_partition_key_enum_zookeeper.sql b/tests/queries/0_stateless/01747_alter_partition_key_enum_zookeeper_long.sql similarity index 95% rename from tests/queries/0_stateless/01747_alter_partition_key_enum_zookeeper.sql rename to tests/queries/0_stateless/01747_alter_partition_key_enum_zookeeper_long.sql index 759c8ba3a0b..033a66a477f 100644 --- a/tests/queries/0_stateless/01747_alter_partition_key_enum_zookeeper.sql +++ b/tests/queries/0_stateless/01747_alter_partition_key_enum_zookeeper_long.sql @@ -39,7 +39,7 @@ CREATE TABLE replicated_report `branch` String, `generated_time` DateTime ) -ENGINE = ReplicatedMergeTree('/clickhouse/01747_alter_partition_key/t', '1') +ENGINE = ReplicatedMergeTree('/clickhouse/{database}/01747_alter_partition_key/t', '1') PARTITION BY (product, toYYYYMM(generated_time)) ORDER BY (product, machine, branch, generated_time); diff --git a/tests/queries/0_stateless/01756_optimize_skip_unused_shards_rewrite_in.reference b/tests/queries/0_stateless/01756_optimize_skip_unused_shards_rewrite_in.reference index 3bc986f4d2b..66fbe8a5d1c 100644 --- a/tests/queries/0_stateless/01756_optimize_skip_unused_shards_rewrite_in.reference +++ b/tests/queries/0_stateless/01756_optimize_skip_unused_shards_rewrite_in.reference @@ -1,17 +1,17 @@ (0, 2) 0 0 0 0 -WITH CAST(\'default\', \'String\') AS id_no SELECT one.dummy, ignore(id_no) FROM system.one WHERE dummy IN (0, 2) -WITH CAST(\'default\', \'String\') AS id_no SELECT one.dummy, ignore(id_no) FROM system.one WHERE dummy IN (0, 2) +WITH _CAST(\'default\', \'Nullable(String)\') AS id_no SELECT one.dummy, ignore(id_no) FROM system.one WHERE dummy IN (0, 2) +WITH _CAST(\'default\', \'Nullable(String)\') AS id_no SELECT one.dummy, ignore(id_no) FROM system.one WHERE dummy IN (0, 2) optimize_skip_unused_shards_rewrite_in(0, 2) 0 0 -WITH CAST(\'default\', \'String\') AS id_02 SELECT one.dummy, ignore(id_02) FROM system.one WHERE dummy IN tuple(0) -WITH CAST(\'default\', \'String\') AS id_02 SELECT one.dummy, ignore(id_02) FROM system.one WHERE dummy IN tuple(2) +WITH _CAST(\'default\', \'Nullable(String)\') AS id_02 SELECT one.dummy, ignore(id_02) FROM system.one WHERE dummy IN tuple(0) +WITH _CAST(\'default\', \'Nullable(String)\') AS id_02 SELECT one.dummy, ignore(id_02) FROM system.one WHERE dummy IN tuple(2) optimize_skip_unused_shards_rewrite_in(2,) -WITH CAST(\'default\', \'String\') AS id_2 SELECT one.dummy, ignore(id_2) FROM system.one WHERE dummy IN tuple(2) +WITH _CAST(\'default\', \'Nullable(String)\') AS id_2 SELECT one.dummy, ignore(id_2) FROM system.one WHERE dummy IN tuple(2) optimize_skip_unused_shards_rewrite_in(0,) 0 0 -WITH CAST(\'default\', \'String\') AS id_0 SELECT one.dummy, ignore(id_0) FROM system.one WHERE dummy IN tuple(0) +WITH _CAST(\'default\', \'Nullable(String)\') AS id_0 SELECT one.dummy, ignore(id_0) FROM system.one WHERE dummy IN tuple(0) 0 0 errors @@ -22,6 +22,7 @@ others different types -- prohibited different types -- conversion 0 +0 optimize_skip_unused_shards_limit 0 0 diff --git a/tests/queries/0_stateless/01756_optimize_skip_unused_shards_rewrite_in.sql b/tests/queries/0_stateless/01756_optimize_skip_unused_shards_rewrite_in.sql index dbe76f146b0..ea7d526c039 100644 --- a/tests/queries/0_stateless/01756_optimize_skip_unused_shards_rewrite_in.sql +++ b/tests/queries/0_stateless/01756_optimize_skip_unused_shards_rewrite_in.sql @@ -93,8 +93,6 @@ select 'errors'; -- optimize_skip_unused_shards does not support non-constants select * from dist_01756 where dummy in (select * from system.one); -- { serverError 507 } select * from dist_01756 where dummy in (toUInt8(0)); -- { serverError 507 } --- intHash64 does not accept string -select * from dist_01756 where dummy in ('0', '2'); -- { serverError 43 } -- NOT IN does not supported select * from dist_01756 where dummy not in (0, 2); -- { serverError 507 } @@ -126,6 +124,8 @@ select 'different types -- conversion'; create table dist_01756_column as system.one engine=Distributed(test_cluster_two_shards, system, one, dummy); select * from dist_01756_column where dummy in (0, '255'); select * from dist_01756_column where dummy in (0, '255foo'); -- { serverError 53 } +-- intHash64 does not accept string, but implicit conversion should be done +select * from dist_01756 where dummy in ('0', '2'); -- optimize_skip_unused_shards_limit select 'optimize_skip_unused_shards_limit'; diff --git a/tests/queries/0_stateless/01759_optimize_skip_unused_shards_zero_shards.reference b/tests/queries/0_stateless/01759_optimize_skip_unused_shards_zero_shards.reference index e69de29bb2d..109c1835a6e 100644 --- a/tests/queries/0_stateless/01759_optimize_skip_unused_shards_zero_shards.reference +++ b/tests/queries/0_stateless/01759_optimize_skip_unused_shards_zero_shards.reference @@ -0,0 +1,4 @@ +-- { echo } +select * from remote('127.{1,2}', system, one, dummy) where 0 settings optimize_skip_unused_shards=1, force_optimize_skip_unused_shards=1; +select count() from remote('127.{1,2}', system, one, dummy) where 0 settings optimize_skip_unused_shards=1, force_optimize_skip_unused_shards=1; +0 diff --git a/tests/queries/0_stateless/01759_optimize_skip_unused_shards_zero_shards.sql b/tests/queries/0_stateless/01759_optimize_skip_unused_shards_zero_shards.sql index 2ddf318313f..08b9581ace2 100644 --- a/tests/queries/0_stateless/01759_optimize_skip_unused_shards_zero_shards.sql +++ b/tests/queries/0_stateless/01759_optimize_skip_unused_shards_zero_shards.sql @@ -1,3 +1,3 @@ -create table dist_01756 (dummy UInt8) ENGINE = Distributed('test_cluster_two_shards', 'system', 'one', dummy); -select ignore(1), * from dist_01756 where 0 settings optimize_skip_unused_shards=1, force_optimize_skip_unused_shards=1; -drop table dist_01756; +-- { echo } +select * from remote('127.{1,2}', system, one, dummy) where 0 settings optimize_skip_unused_shards=1, force_optimize_skip_unused_shards=1; +select count() from remote('127.{1,2}', system, one, dummy) where 0 settings optimize_skip_unused_shards=1, force_optimize_skip_unused_shards=1; diff --git a/tests/queries/0_stateless/01761_alter_decimal_zookeeper.reference b/tests/queries/0_stateless/01761_alter_decimal_zookeeper.reference deleted file mode 100644 index 5dcc95fd7b7..00000000000 --- a/tests/queries/0_stateless/01761_alter_decimal_zookeeper.reference +++ /dev/null @@ -1,9 +0,0 @@ -1 5.00000000 -2 6.00000000 -CREATE TABLE default.test_alter_decimal\n(\n `n` UInt64,\n `d` Decimal(18, 8)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/01761_alter_decimal_zookeeper\', \'r1\')\nORDER BY tuple()\nSETTINGS index_granularity = 8192 -1 5.00000000 -2 6.00000000 -CREATE TABLE default.test_alter_decimal\n(\n `n` UInt64,\n `d` Decimal(18, 8)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/01761_alter_decimal_zookeeper\', \'r1\')\nORDER BY tuple()\nSETTINGS index_granularity = 8192 -1 5.00000000 -2 6.00000000 -3 7.00000000 diff --git a/tests/queries/0_stateless/01761_alter_decimal_zookeeper_long.reference b/tests/queries/0_stateless/01761_alter_decimal_zookeeper_long.reference new file mode 100644 index 00000000000..ad5f224bc73 --- /dev/null +++ b/tests/queries/0_stateless/01761_alter_decimal_zookeeper_long.reference @@ -0,0 +1,9 @@ +1 5 +2 6 +CREATE TABLE default.test_alter_decimal\n(\n `n` UInt64,\n `d` Decimal(18, 8)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/default/01761_alter_decimal_zookeeper\', \'r1\')\nORDER BY tuple()\nSETTINGS index_granularity = 8192 +1 5 +2 6 +CREATE TABLE default.test_alter_decimal\n(\n `n` UInt64,\n `d` Decimal(18, 8)\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/default/01761_alter_decimal_zookeeper\', \'r1\')\nORDER BY tuple()\nSETTINGS index_granularity = 8192 +1 5 +2 6 +3 7 diff --git a/tests/queries/0_stateless/01761_alter_decimal_zookeeper.sql b/tests/queries/0_stateless/01761_alter_decimal_zookeeper_long.sql similarity index 89% rename from tests/queries/0_stateless/01761_alter_decimal_zookeeper.sql rename to tests/queries/0_stateless/01761_alter_decimal_zookeeper_long.sql index 01766f0d6c2..d1bd3b65182 100644 --- a/tests/queries/0_stateless/01761_alter_decimal_zookeeper.sql +++ b/tests/queries/0_stateless/01761_alter_decimal_zookeeper_long.sql @@ -2,7 +2,7 @@ DROP TABLE IF EXISTS test_alter_decimal; CREATE TABLE test_alter_decimal (n UInt64, d Decimal(15, 8)) -ENGINE = ReplicatedMergeTree('/clickhouse/01761_alter_decimal_zookeeper', 'r1') +ENGINE = ReplicatedMergeTree('/clickhouse/{database}/01761_alter_decimal_zookeeper', 'r1') ORDER BY tuple(); INSERT INTO test_alter_decimal VALUES (1, toDecimal32(5, 5)); diff --git a/tests/queries/0_stateless/01763_support_map_lowcardinality_type.reference b/tests/queries/0_stateless/01763_support_map_lowcardinality_type.reference new file mode 100644 index 00000000000..8fdcdf3d8d5 --- /dev/null +++ b/tests/queries/0_stateless/01763_support_map_lowcardinality_type.reference @@ -0,0 +1,2 @@ +b +{'1':1} 1 0 diff --git a/tests/queries/0_stateless/01763_support_map_lowcardinality_type.sql b/tests/queries/0_stateless/01763_support_map_lowcardinality_type.sql new file mode 100644 index 00000000000..ccade153ca1 --- /dev/null +++ b/tests/queries/0_stateless/01763_support_map_lowcardinality_type.sql @@ -0,0 +1,12 @@ +DROP TABLE IF EXISTS map_lc; +SET allow_experimental_map_type = 1; +CREATE TABLE map_lc +( + `kv` Map(LowCardinality(String), LowCardinality(String)) +) +ENGINE = Memory; + +INSERT INTO map_lc select map('a', 'b'); +SELECT kv['a'] FROM map_lc; +DROP TABLE map_lc; +SELECT map(toFixedString('1',1),1) AS m, m[toFixedString('1',1)],m[toFixedString('1',2)]; diff --git a/tests/queries/0_stateless/01786_explain_merge_tree.reference b/tests/queries/0_stateless/01786_explain_merge_tree.reference index 7a0a0af3e05..9b2df9773ea 100644 --- a/tests/queries/0_stateless/01786_explain_merge_tree.reference +++ b/tests/queries/0_stateless/01786_explain_merge_tree.reference @@ -3,21 +3,21 @@ MinMax Keys: y - Condition: (y in [1, +inf)) + Condition: (y in [1, +Inf)) Parts: 4/5 Granules: 11/12 Partition Keys: y bitAnd(z, 3) - Condition: and((bitAnd(z, 3) not in [1, 1]), and((y in [1, +inf)), (bitAnd(z, 3) not in [1, 1]))) + Condition: and((bitAnd(z, 3) not in [1, 1]), and((y in [1, +Inf)), (bitAnd(z, 3) not in [1, 1]))) Parts: 3/4 Granules: 10/11 PrimaryKey Keys: x y - Condition: and((x in [11, +inf)), (y in [1, +inf))) + Condition: and((x in [11, +Inf)), (y in [1, +Inf))) Parts: 2/3 Granules: 6/10 Skip @@ -36,7 +36,7 @@ { "Type": "MinMax", "Keys": ["y"], - "Condition": "(y in [1, +inf))", + "Condition": "(y in [1, +Inf))", "Initial Parts": 5, "Selected Parts": 4, "Initial Granules": 12, @@ -45,7 +45,7 @@ { "Type": "Partition", "Keys": ["y", "bitAnd(z, 3)"], - "Condition": "and((bitAnd(z, 3) not in [1, 1]), and((y in [1, +inf)), (bitAnd(z, 3) not in [1, 1])))", + "Condition": "and((bitAnd(z, 3) not in [1, 1]), and((y in [1, +Inf)), (bitAnd(z, 3) not in [1, 1])))", "Initial Parts": 4, "Selected Parts": 3, "Initial Granules": 11, @@ -54,7 +54,7 @@ { "Type": "PrimaryKey", "Keys": ["x", "y"], - "Condition": "and((x in [11, +inf)), (y in [1, +inf)))", + "Condition": "and((x in [11, +Inf)), (y in [1, +Inf)))", "Initial Parts": 3, "Selected Parts": 2, "Initial Granules": 10, @@ -104,6 +104,6 @@ Keys: x plus(x, y) - Condition: or((x in 2-element set), (plus(plus(x, y), 1) in (-inf, 2])) + Condition: or((x in 2-element set), (plus(plus(x, y), 1) in (-Inf, 2])) Parts: 1/1 Granules: 1/1 diff --git a/tests/queries/0_stateless/01787_map_remote.sql b/tests/queries/0_stateless/01787_map_remote.sql index 854eafa0a50..748316c8044 100644 --- a/tests/queries/0_stateless/01787_map_remote.sql +++ b/tests/queries/0_stateless/01787_map_remote.sql @@ -1 +1 @@ -SELECT map('a', 1, 'b', 2) FROM remote('127.0.0.{1,2}', system, one); \ No newline at end of file +SELECT map('a', 1, 'b', 2) FROM remote('127.0.0.{1,2}', system, one); diff --git a/tests/queries/0_stateless/01791_dist_INSERT_block_structure_mismatch.reference b/tests/queries/0_stateless/01791_dist_INSERT_block_structure_mismatch.reference index 3bba1ac23c0..9f376fb3e4f 100644 --- a/tests/queries/0_stateless/01791_dist_INSERT_block_structure_mismatch.reference +++ b/tests/queries/0_stateless/01791_dist_INSERT_block_structure_mismatch.reference @@ -1,5 +1,7 @@ DistributedBlockOutputStream: Structure does not match (remote: n Int8 Int8(size = 0), local: n UInt64 UInt64(size = 1)), implicit conversion will be done. DistributedBlockOutputStream: Structure does not match (remote: n Int8 Int8(size = 0), local: n UInt64 UInt64(size = 1)), implicit conversion will be done. + default.dist_01683.DirectoryMonitor: Structure does not match (remote: n Int8 Int8(size = 0), local: n UInt64 UInt64(size = 0)), implicit conversion will be done + default.dist_01683.DirectoryMonitor: Structure does not match (remote: n Int8 Int8(size = 0), local: n UInt64 UInt64(size = 0)), implicit conversion will be done 1 1 2 diff --git a/tests/queries/0_stateless/01791_dist_INSERT_block_structure_mismatch.sh b/tests/queries/0_stateless/01791_dist_INSERT_block_structure_mismatch.sh index e989696da03..1a96aad3f13 100755 --- a/tests/queries/0_stateless/01791_dist_INSERT_block_structure_mismatch.sh +++ b/tests/queries/0_stateless/01791_dist_INSERT_block_structure_mismatch.sh @@ -18,6 +18,8 @@ $CLICKHOUSE_CLIENT --prefer_localhost_replica=0 -nm -q " INSERT INTO dist_01683 VALUES (1),(2); SET insert_distributed_sync=0; + -- force log messages from the 'SYSTEM FLUSH DISTRIBUTED' context + SYSTEM STOP DISTRIBUTED SENDS dist_01683; INSERT INTO dist_01683 VALUES (1),(2); SYSTEM FLUSH DISTRIBUTED dist_01683; diff --git a/tests/queries/0_stateless/01801_s3_cluster.sh b/tests/queries/0_stateless/01801_s3_cluster.sh index 215d5500be5..460f3856a2f 100755 --- a/tests/queries/0_stateless/01801_s3_cluster.sh +++ b/tests/queries/0_stateless/01801_s3_cluster.sh @@ -7,6 +7,15 @@ CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # shellcheck source=../shell_config.sh . "$CUR_DIR"/../shell_config.sh +if [[ -z $S3_ACCESS_KEY_ID ]]; then + echo "@@SKIP@@: Missing \$S3_ACCESS_KEY_ID" + exit 0 +fi + +if [[ -z $S3_SECRET_ACCESS ]]; then + echo "@@SKIP@@: Missing \$S3_SECRET_ACCESS" + exit 0 +fi ${CLICKHOUSE_CLIENT_BINARY} --send_logs_level="none" -q "SELECT * FROM s3('https://s3.mds.yandex.net/clickhouse-test-reports/*/*/functional_stateless_tests_(ubsan)/test_results.tsv', '$S3_ACCESS_KEY_ID', '$S3_SECRET_ACCESS', 'LineAsString', 'line String') limit 100 FORMAT Null;" ${CLICKHOUSE_CLIENT_BINARY} --send_logs_level="none" -q "SELECT * FROM s3Cluster('test_cluster_two_shards', 'https://s3.mds.yandex.net/clickhouse-test-reports/*/*/functional_stateless_tests_(ubsan)/test_results.tsv', '$S3_ACCESS_KEY_ID', '$S3_SECRET_ACCESS', 'LineAsString', 'line String') limit 100 FORMAT Null;" diff --git a/tests/queries/0_stateless/01802_rank_corr_mann_whitney_over_window.sql b/tests/queries/0_stateless/01802_rank_corr_mann_whitney_over_window.sql index 24ee9282ac0..4b8bf0844a3 100644 --- a/tests/queries/0_stateless/01802_rank_corr_mann_whitney_over_window.sql +++ b/tests/queries/0_stateless/01802_rank_corr_mann_whitney_over_window.sql @@ -1,7 +1,5 @@ DROP TABLE IF EXISTS 01802_empsalary; -SET allow_experimental_window_functions=1; - CREATE TABLE 01802_empsalary ( `depname` LowCardinality(String), diff --git a/tests/queries/0_stateless/01804_dictionary_decimal256_type.reference b/tests/queries/0_stateless/01804_dictionary_decimal256_type.reference index e9803f2f9f2..9e5abf6c5cc 100644 --- a/tests/queries/0_stateless/01804_dictionary_decimal256_type.reference +++ b/tests/queries/0_stateless/01804_dictionary_decimal256_type.reference @@ -1,12 +1,12 @@ Flat dictionary -5.00000 +5 Hashed dictionary -5.00000 +5 Cache dictionary -5.00000 +5 Direct dictionary -5.00000 +5 IPTrie dictionary -5.00000 +5 Polygon dictionary -5.00000 +5 diff --git a/tests/queries/0_stateless/01814_distributed_push_down_limit.reference b/tests/queries/0_stateless/01814_distributed_push_down_limit.reference index f879f2cbd21..c542b5b7325 100644 --- a/tests/queries/0_stateless/01814_distributed_push_down_limit.reference +++ b/tests/queries/0_stateless/01814_distributed_push_down_limit.reference @@ -12,18 +12,6 @@ distributed_push_down_limit=1 8 9 40 40 -auto-distributed_push_down_limit -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -40 40 distributed_push_down_limit=1 with OFFSET 97 96 diff --git a/tests/queries/0_stateless/01814_distributed_push_down_limit.sh b/tests/queries/0_stateless/01814_distributed_push_down_limit.sh index 93321646037..24b27e74ba5 100755 --- a/tests/queries/0_stateless/01814_distributed_push_down_limit.sh +++ b/tests/queries/0_stateless/01814_distributed_push_down_limit.sh @@ -86,9 +86,11 @@ function test_distributed_push_down_limit_0() function test_distributed_push_down_limit_1() { local args=( - "remote('127.{2,3}', $CLICKHOUSE_DATABASE, data_01814)" + "remote('127.{2,3}', $CLICKHOUSE_DATABASE, data_01814, key)" 0 # offset --distributed_push_down_limit 1 + --optimize_skip_unused_shards 1 + --optimize_distributed_group_by_sharding_key 1 ) test_distributed_push_down_limit_with_query_log "${args[@]}" } @@ -97,22 +99,11 @@ function test_distributed_push_down_limit_1_offset() { local settings_and_opts=( --distributed_push_down_limit 1 - ) - - $CLICKHOUSE_CLIENT "${settings_and_opts[@]}" -q "select * from remote('127.{2,3}', $CLICKHOUSE_DATABASE, data_01814) group by key order by key desc limit 5, 10" -} - -function test_auto_distributed_push_down_limit() -{ - local args=( - dist_01814 - 0 # offset --optimize_skip_unused_shards 1 --optimize_distributed_group_by_sharding_key 1 - --prefer_localhost_replica 0 - --distributed_push_down_limit 0 ) - test_distributed_push_down_limit_with_query_log "${args[@]}" + + $CLICKHOUSE_CLIENT "${settings_and_opts[@]}" -q "select * from remote('127.{2,3}', $CLICKHOUSE_DATABASE, data_01814, key) group by key order by key desc limit 5, 10" } function main() @@ -151,16 +142,6 @@ function main() done echo "$out" - echo 'auto-distributed_push_down_limit' - for ((i = 0; i < max_tries; ++i)); do - out=$(test_auto_distributed_push_down_limit) - out_lines=( $out ) - if [[ ${#out_lines[@]} -gt 2 ]] && [[ ${out_lines[-1]} = 40 ]] && [[ ${out_lines[-2]} = 40 ]]; then - break - fi - done - echo "$out" - echo 'distributed_push_down_limit=1 with OFFSET' test_distributed_push_down_limit_1_offset } diff --git a/tests/queries/0_stateless/01822_short_circuit.reference b/tests/queries/0_stateless/01822_short_circuit.reference new file mode 100644 index 00000000000..204bcd0538e --- /dev/null +++ b/tests/queries/0_stateless/01822_short_circuit.reference @@ -0,0 +1,1397 @@ +0 +101 +51 +34 +26 +21 +17 +15 +13 +12 +0 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +10000000 +0 +2 +3 +4 +5 +5 +7 +8 +9 +10 +10 +12 +13 +14 +15 +15 +17 +18 +19 +20 +0 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +\N +1 +2 +3 +4 +\N +6 +7 +8 +9 +\N +11 +12 +13 +14 +\N +16 +17 +18 +19 +0 +2 +3 +4 +5 +5 +7 +8 +9 +10 +10 +12 +13 +14 +15 +15 +17 +18 +19 +20 +0 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +\N +1 +2 +3 +4 +\N +6 +7 +8 +9 +\N +11 +12 +13 +14 +\N +16 +17 +18 +19 +0 +2 +3 +4 +5 +5 +7 +8 +9 +10 +10 +12 +13 +14 +15 +15 +17 +18 +19 +20 +0 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +\N +1 +2 +3 +4 +\N +6 +7 +8 +9 +\N +11 +12 +13 +14 +\N +16 +17 +18 +19 +0 +2 +3 +4 +5 +5 +7 +8 +9 +10 +10 +12 +13 +14 +15 +15 +17 +18 +19 +20 +0 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +\N +1 +2 +3 +4 +\N +6 +7 +8 +9 +\N +11 +12 +13 +14 +\N +16 +17 +18 +19 +0 +2 +3 +4 +5 +5 +7 +8 +9 +10 +10 +12 +13 +14 +15 +15 +17 +18 +19 +20 +0 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +\N +1 +2 +3 +4 +\N +6 +7 +8 +9 +\N +11 +12 +13 +14 +\N +16 +17 +18 +19 +0 +2 +3 +4 +5 +5 +7 +8 +9 +10 +10 +12 +13 +14 +15 +15 +17 +18 +19 +20 +0 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +\N +1 +2 +3 +4 +\N +6 +7 +8 +9 +\N +11 +12 +13 +14 +\N +16 +17 +18 +19 +0 +2 +3 +4 +5 +5 +7 +8 +9 +10 +10 +12 +13 +14 +15 +15 +17 +18 +19 +20 +0 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +\N +1 +2 +3 +4 +\N +6 +7 +8 +9 +\N +11 +12 +13 +14 +\N +16 +17 +18 +19 +0 +2 +3 +4 +5 +5 +7 +8 +9 +10 +10 +12 +13 +14 +15 +15 +17 +18 +19 +20 +0 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +\N +1 +2 +3 +4 +\N +6 +7 +8 +9 +\N +11 +12 +13 +14 +\N +16 +17 +18 +19 +0 +2 +3 +4 +5 +5 +7 +8 +9 +10 +10 +12 +13 +14 +15 +15 +17 +18 +19 +20 +0 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +\N +1 +2 +3 +4 +\N +6 +7 +8 +9 +\N +11 +12 +13 +14 +\N +16 +17 +18 +19 +0 +2 +3 +4 +5 +5 +7 +8 +9 +10 +10 +12 +13 +14 +15 +15 +17 +18 +19 +20 +0 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +\N +1 +2 +3 +4 +\N +6 +7 +8 +9 +\N +11 +12 +13 +14 +\N +16 +17 +18 +19 +0 +2 +3 +4 +5 +5 +7 +8 +9 +10 +10 +12 +13 +14 +15 +15 +17 +18 +19 +20 +0 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +\N +1 +2 +3 +4 +\N +6 +7 +8 +9 +\N +11 +12 +13 +14 +\N +16 +17 +18 +19 +0 +2 +3 +4 +5 +5 +7 +8 +9 +10 +10 +12 +13 +14 +15 +15 +17 +18 +19 +20 +0 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +\N +1 +2 +3 +4 +\N +6 +7 +8 +9 +\N +11 +12 +13 +14 +\N +16 +17 +18 +19 +00 +22 +33 +44 +55 +55 +77 +88 +99 +1010 +1010 +1212 +1313 +1414 +1515 +1515 +1717 +1818 +1919 +2020 +00 +\N +\N +\N +\N +55 +\N +\N +\N +\N +1010 +\N +\N +\N +\N +1515 +\N +\N +\N +\N +\N +11 +22 +33 +44 +\N +66 +77 +88 +99 +\N +1111 +1212 +1313 +1414 +\N +1616 +1717 +1818 +1919 +10 +12 +13 +14 +15 +15 +17 +18 +19 +20 +20 +22 +23 +24 +25 +25 +27 +28 +29 +30 +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +20 +\N +\N +\N +\N +25 +\N +\N +\N +\N +\N +11 +12 +13 +14 +\N +16 +17 +18 +19 +\N +21 +22 +23 +24 +\N +26 +27 +28 +29 +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 +\N +\N +\N +\N +1970-01-01 +\N +\N +\N +\N +1970-01-01 +\N +\N +\N +\N +1970-01-01 +\N +\N +\N +\N +\N +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 +\N +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 +\N +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 +\N +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 +1970-01-01 00:00:00 +1970-01-01 05:33:20 +1970-01-01 08:20:00 +1970-01-01 11:06:40 +1970-01-01 13:53:20 +1970-01-01 13:53:20 +1970-01-01 19:26:40 +1970-01-01 22:13:20 +1970-01-02 01:00:00 +1970-01-02 03:46:40 +1970-01-02 03:46:40 +1970-01-02 09:20:00 +1970-01-02 12:06:40 +1970-01-02 14:53:20 +1970-01-02 17:40:00 +1970-01-02 17:40:00 +1970-01-02 23:13:20 +1970-01-03 02:00:00 +1970-01-03 04:46:40 +1970-01-03 07:33:20 +1970-01-01 00:00:00 +\N +\N +\N +\N +1970-01-01 13:53:20 +\N +\N +\N +\N +1970-01-02 03:46:40 +\N +\N +\N +\N +1970-01-02 17:40:00 +\N +\N +\N +\N +\N +1970-01-01 02:46:40 +1970-01-01 05:33:20 +1970-01-01 08:20:00 +1970-01-01 11:06:40 +\N +1970-01-01 16:40:00 +1970-01-01 19:26:40 +1970-01-01 22:13:20 +1970-01-02 01:00:00 +\N +1970-01-02 06:33:20 +1970-01-02 09:20:00 +1970-01-02 12:06:40 +1970-01-02 14:53:20 +\N +1970-01-02 20:26:40 +1970-01-02 23:13:20 +1970-01-03 02:00:00 +1970-01-03 04:46:40 +0.00000 +2.00000 +3.00000 +4.00000 +5.00000 +5.00000 +7.00000 +8.00000 +9.00000 +10.00000 +10.00000 +12.00000 +13.00000 +14.00000 +15.00000 +15.00000 +17.00000 +18.00000 +19.00000 +20.00000 +0.00000 +\N +\N +\N +\N +5.00000 +\N +\N +\N +\N +10.00000 +\N +\N +\N +\N +15.00000 +\N +\N +\N +\N +\N +1.00000 +2.00000 +3.00000 +4.00000 +\N +6.00000 +7.00000 +8.00000 +9.00000 +\N +11.00000 +12.00000 +13.00000 +14.00000 +\N +16.00000 +17.00000 +18.00000 +19.00000 +0.00000 +2.00000 +3.00000 +4.00000 +5.00000 +5.00000 +7.00000 +8.00000 +9.00000 +10.00000 +10.00000 +12.00000 +13.00000 +14.00000 +15.00000 +15.00000 +17.00000 +18.00000 +19.00000 +20.00000 +0.00000 +\N +\N +\N +\N +5.00000 +\N +\N +\N +\N +10.00000 +\N +\N +\N +\N +15.00000 +\N +\N +\N +\N +\N +1.00000 +2.00000 +3.00000 +4.00000 +\N +6.00000 +7.00000 +8.00000 +9.00000 +\N +11.00000 +12.00000 +13.00000 +14.00000 +\N +16.00000 +17.00000 +18.00000 +19.00000 +0.00000 +2.00000 +3.00000 +4.00000 +5.00000 +5.00000 +7.00000 +8.00000 +9.00000 +10.00000 +10.00000 +12.00000 +13.00000 +14.00000 +15.00000 +15.00000 +17.00000 +18.00000 +19.00000 +20.00000 +0.00000 +\N +\N +\N +\N +5.00000 +\N +\N +\N +\N +10.00000 +\N +\N +\N +\N +15.00000 +\N +\N +\N +\N +\N +1.00000 +2.00000 +3.00000 +4.00000 +\N +6.00000 +7.00000 +8.00000 +9.00000 +\N +11.00000 +12.00000 +13.00000 +14.00000 +\N +16.00000 +17.00000 +18.00000 +19.00000 +0.00000 +2.00000 +3.00000 +4.00000 +5.00000 +5.00000 +7.00000 +8.00000 +9.00000 +10.00000 +10.00000 +12.00000 +13.00000 +14.00000 +15.00000 +15.00000 +17.00000 +18.00000 +19.00000 +20.00000 +0.00000 +\N +\N +\N +\N +5.00000 +\N +\N +\N +\N +10.00000 +\N +\N +\N +\N +15.00000 +\N +\N +\N +\N +\N +1.00000 +2.00000 +3.00000 +4.00000 +\N +6.00000 +7.00000 +8.00000 +9.00000 +\N +11.00000 +12.00000 +13.00000 +14.00000 +\N +16.00000 +17.00000 +18.00000 +19.00000 +[] +[0,1] +[0,1,2] +[0,1,2,3] +[0,1,2,3,4] +[0,1,2,3,4] +[0,1,2,3,4,5,6] +[0,1,2,3,4,5,6,7] +[0,1,2,3,4,5,6,7,8] +[0,1,2,3,4,5,6,7,8,9] +[0,1,2,3,4,5,6,7,8,9] +[0,1,2,3,4,5,6,7,8,9,10,11] +[0,1,2,3,4,5,6,7,8,9,10,11,12] +[0,1,2,3,4,5,6,7,8,9,10,11,12,13] +[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14] +[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14] +[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] +[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17] +[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18] +[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19] +[] +['1','1'] +['2','2','2'] +['3','3','3','3'] +['4','4','4','4','4'] +['5','5','5','5','5'] +['6','6','6','6','6','6','6'] +['7','7','7','7','7','7','7','7'] +['8','8','8','8','8','8','8','8','8'] +['9','9','9','9','9','9','9','9','9','9'] +['10','10','10','10','10','10','10','10','10','10'] +['11','11','11','11','11','11','11','11','11','11','11','11'] +['12','12','12','12','12','12','12','12','12','12','12','12','12'] +['13','13','13','13','13','13','13','13','13','13','13','13','13','13'] +['14','14','14','14','14','14','14','14','14','14','14','14','14','14','14'] +['15','15','15','15','15','15','15','15','15','15','15','15','15','15','15'] +['16','16','16','16','16','16','16','16','16','16','16','16','16','16','16','16','16'] +['17','17','17','17','17','17','17','17','17','17','17','17','17','17','17','17','17','17'] +['18','18','18','18','18','18','18','18','18','18','18','18','18','18','18','18','18','18','18'] +['19','19','19','19','19','19','19','19','19','19','19','19','19','19','19','19','19','19','19','19'] +0 +1 +1 +1 +1 +0 +\N +\N +\N +\N +1 +1 +1 +1 +1 +10 +10 +10 +10 +10 +10 +505 +255 +170 +130 +13 +255 +33 +130 +53 +85 +73 +65 +93 +55 +2 +10 +2 +12 +2 +14 +2 +16 +2 +18 +2 +String +String +String +String +String +String +String +String +String +String +Int64 +Int64 +Int64 +Int64 +Int64 +Int64 +Int64 +Int64 +Int64 +Int64 +Decimal(9, 5) +Decimal(9, 5) +Decimal(9, 5) +Decimal(9, 5) +Decimal(9, 5) +Decimal32 +Decimal32 +Decimal32 +Decimal32 +Decimal32 +8 +42 +21 +14 +10 +0 0 +42 42 +21 21 +14 14 +10 10 +\N +\N +\N +\N +\N +1 +42 +21 +14 +10 +1 +42 +21 +14 +10 +1 +42 +21 +14 +10 +1 +42 +21 +14 +10 +0.00 +42.00 +21.00 +14.00 +10.50 diff --git a/tests/queries/0_stateless/01822_short_circuit.sql b/tests/queries/0_stateless/01822_short_circuit.sql new file mode 100644 index 00000000000..16908642c52 --- /dev/null +++ b/tests/queries/0_stateless/01822_short_circuit.sql @@ -0,0 +1,125 @@ +set short_circuit_function_evaluation = 'enable'; + +select if(number > 0, intDiv(number + 100, number), throwIf(number)) from numbers(10); +select multiIf(number == 0, 0, number == 1, intDiv(1, number), number == 2, intDiv(1, number - 1), number == 3, intDiv(1, number - 2), intDiv(1, number - 3)) from numbers(10); +select number != 0 and intDiv(1, number) == 0 and number != 2 and intDiv(1, number - 2) == 0 from numbers(10); +select number == 0 or intDiv(1, number) != 0 or number == 2 or intDiv(1, number - 2) != 0 from numbers(10); + +select count() from (select if(number >= 0, number, sleep(1)) from numbers(10000000)); + + +select if(number % 5 == 0, toInt8OrZero(toString(number)), toInt8OrZero(toString(number + 1))) from numbers(20); +select if(number % 5 == 0, toInt8OrZero(toString(number)), Null) from numbers(20); +select if(number % 5 == 0, Null, toInt8OrZero(toString(number))) from numbers(20); + +select if(number % 5 == 0, toUInt8OrZero(toString(number)), toUInt8OrZero(toString(number + 1))) from numbers(20); +select if(number % 5 == 0, toUInt8OrZero(toString(number)), Null) from numbers(20); +select if(number % 5 == 0, Null, toUInt8OrZero(toString(number))) from numbers(20); + +select if(number % 5 == 0, toInt32OrZero(toString(number)), toInt32OrZero(toString(number + 1))) from numbers(20); +select if(number % 5 == 0, toInt32OrZero(toString(number)), Null) from numbers(20); +select if(number % 5 == 0, Null, toInt32OrZero(toString(number))) from numbers(20); + +select if(number % 5 == 0, toUInt32OrZero(toString(number)), toUInt32OrZero(toString(number + 1))) from numbers(20); +select if(number % 5 == 0, toUInt32OrZero(toString(number)), Null) from numbers(20); +select if(number % 5 == 0, Null, toUInt32OrZero(toString(number))) from numbers(20); + +select if(number % 5 == 0, toInt64OrZero(toString(number)), toInt64OrZero(toString(number + 1))) from numbers(20); +select if(number % 5 == 0, toInt64OrZero(toString(number)), Null) from numbers(20); +select if(number % 5 == 0, Null, toInt64OrZero(toString(number))) from numbers(20); + +select if(number % 5 == 0, toUInt64OrZero(toString(number)), toUInt64OrZero(toString(number + 1))) from numbers(20); +select if(number % 5 == 0, toUInt64OrZero(toString(number)), Null) from numbers(20); +select if(number % 5 == 0, Null, toUInt64OrZero(toString(number))) from numbers(20); + +select if(number % 5 == 0, toInt128OrZero(toString(number)), toInt128OrZero(toString(number + 1))) from numbers(20); +select if(number % 5 == 0, toInt128OrZero(toString(number)), Null) from numbers(20); +select if(number % 5 == 0, Null, toInt128OrZero(toString(number))) from numbers(20); + +select if(number % 5 == 0, toUInt128OrZero(toString(number)), toUInt128OrZero(toString(number + 1))) from numbers(20); +select if(number % 5 == 0, toUInt128OrZero(toString(number)), Null) from numbers(20); +select if(number % 5 == 0, Null, toUInt128OrZero(toString(number))) from numbers(20); + +select if(number % 5 == 0, toInt256OrZero(toString(number)), toInt256OrZero(toString(number + 1))) from numbers(20); +select if(number % 5 == 0, toInt256OrZero(toString(number)), Null) from numbers(20); +select if(number % 5 == 0, Null, toInt256OrZero(toString(number))) from numbers(20); + +select if(number % 5 == 0, toUInt256OrZero(toString(number)), toUInt256OrZero(toString(number + 1))) from numbers(20); +select if(number % 5 == 0, toUInt256OrZero(toString(number)), Null) from numbers(20); +select if(number % 5 == 0, Null, toUInt256OrZero(toString(number))) from numbers(20); + +select if(number % 5 == 0, toFloat32OrZero(toString(number)), toFloat32OrZero(toString(number + 1))) from numbers(20); +select if(number % 5 == 0, toFloat32OrZero(toString(number)), Null) from numbers(20); +select if(number % 5 == 0, Null, toFloat32OrZero(toString(number))) from numbers(20); + +select if(number % 5 == 0, toFloat64OrZero(toString(number)), toFloat64OrZero(toString(number + 1))) from numbers(20); +select if(number % 5 == 0, toFloat64OrZero(toString(number)), Null) from numbers(20); +select if(number % 5 == 0, Null, toFloat64OrZero(toString(number))) from numbers(20); + +select if(number % 5 == 0, repeat(toString(number), 2), repeat(toString(number + 1), 2)) from numbers(20); +select if(number % 5 == 0, repeat(toString(number), 2), Null) from numbers(20); +select if(number % 5 == 0, Null, repeat(toString(number), 2)) from numbers(20); + +select if(number % 5 == 0, toFixedString(toString(number + 10), 2), toFixedString(toString(number + 11), 2)) from numbers(20); +select if(number % 5 == 0, toFixedString(toString(number + 10), 2), Null) from numbers(20); +select if(number % 5 == 0, Null, toFixedString(toString(number + 10), 2)) from numbers(20); + +select if(number % 5 == 0, toDateOrZero(toString(number)), toDateOrZero(toString(number + 1))) from numbers(20); +select if(number % 5 == 0, toDateOrZero(toString(number)), Null) from numbers(20); +select if(number % 5 == 0, Null, toDateOrZero(toString(number))) from numbers(20); + +select if(number % 5 == 0, toDateTimeOrZero(toString(number * 10000), 'UTC'), toDateTimeOrZero(toString((number + 1) * 10000), 'UTC')) from numbers(20); +select if(number % 5 == 0, toDateTimeOrZero(toString(number * 10000), 'UTC'), Null) from numbers(20); +select if(number % 5 == 0, Null, toDateTimeOrZero(toString(number * 10000), 'UTC')) from numbers(20); + +select if(number % 5 == 0, toDecimal32OrZero(toString(number), 5), toDecimal32OrZero(toString(number + 1), 5)) from numbers(20); +select if(number % 5 == 0, toDecimal32OrZero(toString(number), 5), Null) from numbers(20); +select if(number % 5 == 0, Null, toDecimal32OrZero(toString(number), 5)) from numbers(20); + +select if(number % 5 == 0, toDecimal64OrZero(toString(number), 5), toDecimal64OrZero(toString(number + 1), 5)) from numbers(20); +select if(number % 5 == 0, toDecimal64OrZero(toString(number), 5), Null) from numbers(20); +select if(number % 5 == 0, Null, toDecimal64OrZero(toString(number), 5)) from numbers(20); + +select if(number % 5 == 0, toDecimal128OrZero(toString(number), 5), toDecimal128OrZero(toString(number + 1), 5)) from numbers(20); +select if(number % 5 == 0, toDecimal128OrZero(toString(number), 5), Null) from numbers(20); +select if(number % 5 == 0, Null, toDecimal128OrZero(toString(number), 5)) from numbers(20); + +select if(number % 5 == 0, toDecimal256OrZero(toString(number), 5), toDecimal256OrZero(toString(number + 1), 5)) from numbers(20); +select if(number % 5 == 0, toDecimal256OrZero(toString(number), 5), Null) from numbers(20); +select if(number % 5 == 0, Null, toDecimal256OrZero(toString(number), 5)) from numbers(20); + +select if(number % 5 == 0, range(number), range(number + 1)) from numbers(20); +select if(number % 5 == 0, replicate(toString(number), range(number)), replicate(toString(number), range(number + 1))) from numbers(20); + +select number > 0 and 5 and intDiv(100, number) from numbers(5); +select number > 0 and Null and intDiv(100, number) from numbers(5); +select number == 0 or 5 or intDiv(100, number) from numbers(5); +select multiIf(number % 2 != 0, intDiv(10, number % 2), 5, intDiv(10, 1 - number % 2), intDiv(10, number)) from numbers(5); + +select if(number != 0, 5 * (1 + intDiv(100, number)), toInt32(exp(log(throwIf(number) + 10)))) from numbers(5); +select if(number % 2, 5 * (1 + intDiv(100, number + 1)), 3 + 10 * intDiv(100, intDiv(100, number + 1))) from numbers(10); + +select sum(number) FROM numbers(10) WHERE number != 0 and 3 % number and number != 1 and intDiv(1, number - 1) > 0; +select multiIf(0, 1, intDiv(number % 2, 1), 2, 0, 3, 1, number + 10, 2) from numbers(10); + +select toTypeName(toString(number)) from numbers(5); +select toColumnTypeName(toString(number)) from numbers(5); + +select toTypeName(toInt64OrZero(toString(number))) from numbers(5); +select toColumnTypeName(toInt64OrZero(toString(number))) from numbers(5); + +select toTypeName(toDecimal32OrZero(toString(number), 5)) from numbers(5); +select toColumnTypeName(toDecimal32OrZero(toString(number), 5)) from numbers(5); + +select if(if(number > 0, intDiv(42, number), 0), intDiv(42, number), 8) from numbers(5); +select if(number > 0, intDiv(42, number), 0), if(number = 0, 0, intDiv(42, number)) from numbers(5); + +select Null or isNull(intDiv(number, 1)) from numbers(5); + +set compile_expressions = 1; +select if(number > 0, intDiv(42, number), 1) from numbers(5); +select if(number > 0, intDiv(42, number), 1) from numbers(5); +select if(number > 0, intDiv(42, number), 1) from numbers(5); +select if(number > 0, intDiv(42, number), 1) from numbers(5); + +select if(number > 0, 42 / toDecimal32(number, 2), 0) from numbers(5); diff --git a/tests/queries/0_stateless/01849_geoToS2.reference b/tests/queries/0_stateless/01849_geoToS2.reference new file mode 100644 index 00000000000..08d76978791 --- /dev/null +++ b/tests/queries/0_stateless/01849_geoToS2.reference @@ -0,0 +1,42 @@ +Checking s2 index generation. +(-19.82614013111778,-41.19291183249827) 145638248314527735 +(-41.56412828256075,-16.777072680829264) 525948609053544771 +(40.76827373895363,2.853562616147134) 1723620528513494869 +(8.774109215249668,-3.271373776817451) 1913723177026859677 +(54.7243525263686,-19.21060843697615) 2414200527355011557 +(49.942295220850404,-18.63385558246411) 2446780491370050277 +(125.93850250627281,25.519361668875952) 3814912406305146887 +(51.39037388040172,29.368252361755857) 4590287096029015617 +(-165.90797307310456,54.20517787077579) 6317132534461540395 +(140.4288338857567,28.399754752831992) 6944470717484584123 +(170.14574840189854,7.606448822713084) 7280210779810726069 +(-170.42364912433663,-10.102188288980733) 8094352344009072653 +(-168.25897915006252,-38.27117023780382) 8295275405228382549 +(-46.71824230901231,5.161978621886426) 13251733624047612511 +(-64.36499761086276,-13.206225582160274) 10654167528317614093 +(-61.76193800786795,-24.969589107565216) 10670400906708524493 +(-79.24545956192031,-22.940848730236024) 10868726821406045765 +(74.00610377406458,-68.32123992734591) 12793606480989360605 +(10.610774069458158,-64.18410328814072) 13202270384266773975 +(-89.81096210929424,-57.01398354986957) 13606307743304496003 +(-19.82614,-41.19291) (-19.82614,-41.19291) ok +(-41.56413,-16.77707) (-41.56413,-16.77707) ok +(40.76827,2.85356) (40.76827,2.85356) ok +(8.77411,-3.27137) (8.77411,-3.27137) ok +(54.72435,-19.21061) (54.72435,-19.21061) ok +(49.94229,-18.63386) (49.94229,-18.63386) ok +(125.9385,25.51936) (125.9385,25.51936) ok +(51.39037,29.36825) (51.39037,29.36825) ok +(-165.90797,54.20518) (-165.90797,54.20518) ok +(140.42883,28.39976) (140.42883,28.39976) ok +(170.14575,7.60645) (170.14575,7.60645) ok +(-170.42365,-10.10219) (-170.42365,-10.10219) ok +(-168.25898,-38.27117) (-168.25898,-38.27117) ok +(5.16198,-46.71824) (5.16198,-46.71824) ok +(-64.365,-13.20623) (-64.365,-13.20623) ok +(-61.76194,-24.96959) (-61.76194,-24.96959) ok +(-79.24546,-22.94085) (-79.24546,-22.94085) ok +(74.0061,-68.32124) (74.0061,-68.32124) ok +(10.61077,-64.1841) (10.61077,-64.1841) ok +(-89.81096,-57.01398) (-89.81096,-57.01398) ok +4864204703484167331 diff --git a/tests/queries/0_stateless/01849_geoToS2.sql b/tests/queries/0_stateless/01849_geoToS2.sql new file mode 100644 index 00000000000..eb50fa81b8a --- /dev/null +++ b/tests/queries/0_stateless/01849_geoToS2.sql @@ -0,0 +1,50 @@ +DROP TABLE IF EXISTS s2_indexes; + +CREATE TABLE s2_indexes (s2_index UInt64, longitude Float64, latitude Float64) ENGINE = Memory; + +-- Random geo coordinates were generated using S2Testing::RandomPoint() method from s2 API. + +INSERT INTO s2_indexes VALUES (3814912406305146967, 125.938503, 25.519362); +INSERT INTO s2_indexes VALUES (10654167528317613967, -64.364998, -13.206226); +INSERT INTO s2_indexes VALUES (1913723177026859705, 8.774109, -3.271374); +INSERT INTO s2_indexes VALUES (13606307743304496111, -89.810962, -57.013984); +INSERT INTO s2_indexes VALUES (8094352344009072761,-170.423649, -10.102188); +INSERT INTO s2_indexes VALUES (2414200527355011659, 54.724353, -19.210608); +INSERT INTO s2_indexes VALUES (4590287096029015693, 51.390374, 29.368252); +INSERT INTO s2_indexes VALUES (10173921221664598133, 5.161979, -46.718242); +INSERT INTO s2_indexes VALUES (525948609053546189, -41.564128, -16.777073); +INSERT INTO s2_indexes VALUES (2446780491369950853, 49.94229, -18.633856); +INSERT INTO s2_indexes VALUES (1723620528513492581, 40.768274, 2.853563); +INSERT INTO s2_indexes VALUES (8295275405228383207, -168.258979, -38.271170); +INSERT INTO s2_indexes VALUES (7280210779810727639, 170.145748, 7.606449); +INSERT INTO s2_indexes VALUES (10670400906708524495, -61.761938, -24.969589); +INSERT INTO s2_indexes VALUES (10868726821406046149, -79.245460, -22.940849); +INSERT INTO s2_indexes VALUES (13202270384266773545, 10.610774, -64.184103); +INSERT INTO s2_indexes VALUES (145638248314527629, -19.826140, -41.192912); +INSERT INTO s2_indexes VALUES (12793606480989360601, 74.006104, -68.321240); +INSERT INTO s2_indexes VALUES (6317132534461540391, -165.907973, 54.205178); +INSERT INTO s2_indexes VALUES (6944470717485986643, 140.428834, 28.399755); + +SELECT 'Checking s2 index generation.'; + +SELECT s2ToGeo(s2_index), geoToS2(longitude, latitude) FROM s2_indexes ORDER BY s2_index; + +SELECT first, second, result FROM ( + SELECT + s2ToGeo(geoToS2(longitude, latitude)) AS output_geo, + tuple(roundBankers(longitude, 5), roundBankers(latitude, 5)) AS first, + tuple(roundBankers(output_geo.1, 5), roundBankers(output_geo.2, 5)) AS second, + if(first = second, 'ok', 'fail') AS result + FROM s2_indexes + ORDER BY s2_index + ); + +SELECT s2ToGeo(toUInt64(-1)); -- { serverError 36 } +SELECT s2ToGeo(nan); -- { serverError 43 } +SELECT geoToS2(toFloat64(toUInt64(-1)), toFloat64(toUInt64(-1))); +SELECT geoToS2(nan, nan); -- { serverError 43 } +SELECT geoToS2(-inf, 1.1754943508222875e-38); -- { serverError 43 } + + + +DROP TABLE IF EXISTS s2_indexes; diff --git a/tests/queries/0_stateless/01851_s2_to_geo.reference b/tests/queries/0_stateless/01851_s2_to_geo.reference new file mode 100644 index 00000000000..75b182ebd1f --- /dev/null +++ b/tests/queries/0_stateless/01851_s2_to_geo.reference @@ -0,0 +1,2 @@ +(55.779227241803866,37.63098046233757) +(55.76324102676383,37.660183005258276) diff --git a/tests/queries/0_stateless/01851_s2_to_geo.sql b/tests/queries/0_stateless/01851_s2_to_geo.sql new file mode 100644 index 00000000000..76e4b2a5346 --- /dev/null +++ b/tests/queries/0_stateless/01851_s2_to_geo.sql @@ -0,0 +1,2 @@ +select s2ToGeo(4573520603753570041); +select s2ToGeo(4573517609713934091); diff --git a/tests/queries/0_stateless/01852_cast_operator.reference b/tests/queries/0_stateless/01852_cast_operator.reference index 8b4069ab2b8..198a122d86e 100644 --- a/tests/queries/0_stateless/01852_cast_operator.reference +++ b/tests/queries/0_stateless/01852_cast_operator.reference @@ -1,4 +1,4 @@ -0.10000000000000000000000000000000000000 +0.1 SELECT CAST(\'0.1\', \'Decimal(38, 38)\') AS c [1,2,3] SELECT CAST(\'[1, 2, 3]\', \'Array(UInt32)\') AS c @@ -13,7 +13,7 @@ SELECT CAST([1, 1 + 1, 1 + 2], \'Array(UInt32)\') AS c 2010-10-10 SELECT CAST(\'2010-10-10\', \'Date\') AS c 2010-10-10 00:00:00 -SELECT CAST(\'2010-10-10\', \'DateTime\') AS c +SELECT CAST(\'2010-10-10\', \'DateTime(\\\'UTC\\\')\') AS c ['2010-10-10','2010-10-10'] SELECT CAST(\'[\\\'2010-10-10\\\', \\\'2010-10-10\\\']\', \'Array(Date)\') 3 @@ -27,7 +27,7 @@ SELECT FROM numbers(1) 1970-01-11 SELECT CAST((((0 + 1) + 2) + 3) + 4, \'Date\') AS c -0.6000 +0.6 SELECT CAST((CAST(\'0.1\', \'Decimal(4, 4)\') + CAST(\'0.2\', \'Decimal(4, 4)\')) + CAST(\'0.3\', \'Decimal(4, 4)\'), \'Decimal(4, 4)\') AS c [1] [[1,2,3],[],[1]] diff --git a/tests/queries/0_stateless/01852_cast_operator.sql b/tests/queries/0_stateless/01852_cast_operator.sql index 98ac7ee73e7..adb9f86539d 100644 --- a/tests/queries/0_stateless/01852_cast_operator.sql +++ b/tests/queries/0_stateless/01852_cast_operator.sql @@ -19,8 +19,8 @@ EXPLAIN SYNTAX SELECT [1, 1 + 1, 1 + 2]::Array(UInt32) AS c; SELECT '2010-10-10'::Date AS c; EXPLAIN SYNTAX SELECT '2010-10-10'::Date AS c; -SELECT '2010-10-10'::DateTime AS c; -EXPLAIN SYNTAX SELECT '2010-10-10'::DateTime AS c; +SELECT '2010-10-10'::DateTime('UTC') AS c; +EXPLAIN SYNTAX SELECT '2010-10-10'::DateTime('UTC') AS c; SELECT ['2010-10-10', '2010-10-10']::Array(Date) AS c; EXPLAIN SYNTAX SELECT ['2010-10-10', '2010-10-10']::Array(Date); diff --git a/tests/queries/0_stateless/01852_cast_operator_2.reference b/tests/queries/0_stateless/01852_cast_operator_2.reference index 438eabda142..a734dc75559 100644 --- a/tests/queries/0_stateless/01852_cast_operator_2.reference +++ b/tests/queries/0_stateless/01852_cast_operator_2.reference @@ -1,6 +1,6 @@ -(0.1000000000000000000000000000000000000000000000000000000000000000000000,0.2000000000000000000000000000000000000000000000000000000000000000000000) +(0.1,0.2) SELECT CAST(\'(0.1, 0.2)\', \'Tuple(Decimal(75, 70), Decimal(75, 70))\') -0.1000 +0.1 SELECT CAST(\'0.1\', \'Decimal(4, 4)\') [1,2,3] SELECT CAST(\'[1, 2, 3]\', \'Array(Int32)\') diff --git a/tests/queries/0_stateless/01852_s2_get_neighbors.reference b/tests/queries/0_stateless/01852_s2_get_neighbors.reference new file mode 100644 index 00000000000..3182a1c5e00 --- /dev/null +++ b/tests/queries/0_stateless/01852_s2_get_neighbors.reference @@ -0,0 +1 @@ +[5074766987100422144,5074766712222515200,5074767536856236032,5074767261978329088] diff --git a/tests/queries/0_stateless/01852_s2_get_neighbours.reference b/tests/queries/0_stateless/01852_s2_get_neighbours.reference new file mode 100644 index 00000000000..3182a1c5e00 --- /dev/null +++ b/tests/queries/0_stateless/01852_s2_get_neighbours.reference @@ -0,0 +1 @@ +[5074766987100422144,5074766712222515200,5074767536856236032,5074767261978329088] diff --git a/tests/queries/0_stateless/01852_s2_get_neighbours.sql b/tests/queries/0_stateless/01852_s2_get_neighbours.sql new file mode 100644 index 00000000000..8163f827697 --- /dev/null +++ b/tests/queries/0_stateless/01852_s2_get_neighbours.sql @@ -0,0 +1 @@ +select s2GetNeighbors(5074766849661468672); diff --git a/tests/queries/0_stateless/01853_s2_cells_intersect.reference b/tests/queries/0_stateless/01853_s2_cells_intersect.reference new file mode 100644 index 00000000000..b261da18d51 --- /dev/null +++ b/tests/queries/0_stateless/01853_s2_cells_intersect.reference @@ -0,0 +1,2 @@ +1 +0 diff --git a/tests/queries/0_stateless/01853_s2_cells_intersect.sql b/tests/queries/0_stateless/01853_s2_cells_intersect.sql new file mode 100644 index 00000000000..2a033a67d58 --- /dev/null +++ b/tests/queries/0_stateless/01853_s2_cells_intersect.sql @@ -0,0 +1,5 @@ +select s2CellsIntersect(9926595209846587392, 9926594385212866560); +select s2CellsIntersect(9926595209846587392, 9937259648002293760); + + +SELECT s2CellsIntersect(9926595209846587392, 9223372036854775806); -- { serverError 36 } diff --git a/tests/queries/0_stateless/01854_HTTP_dict_decompression.python b/tests/queries/0_stateless/01854_HTTP_dict_decompression.python index 98581a1e47c..216e1afa71d 100644 --- a/tests/queries/0_stateless/01854_HTTP_dict_decompression.python +++ b/tests/queries/0_stateless/01854_HTTP_dict_decompression.python @@ -28,20 +28,20 @@ CLICKHOUSE_PORT_HTTP = os.environ.get('CLICKHOUSE_PORT_HTTP', '8123') # accessible from clickhouse server. ##################################################################################### -# IP-address of this host accessible from outside world. -HTTP_SERVER_HOST = subprocess.check_output(['hostname', '-i']).decode('utf-8').strip() +# IP-address of this host accessible from the outside world. Get the first one +HTTP_SERVER_HOST = subprocess.check_output(['hostname', '-i']).decode('utf-8').strip().split()[0] HTTP_SERVER_PORT = get_local_port(HTTP_SERVER_HOST) # IP address and port of the HTTP server started from this script. HTTP_SERVER_ADDRESS = (HTTP_SERVER_HOST, HTTP_SERVER_PORT) HTTP_SERVER_URL_STR = 'http://' + ':'.join(str(s) for s in HTTP_SERVER_ADDRESS) + "/" -# Because we need to check content of file.csv we can create this content and avoid reading csv +# Because we need to check the content of file.csv we can create this content and avoid reading csv CSV_DATA = "Hello, 1\nWorld, 2\nThis, 152\nis, 9283\ntesting, 2313213\ndata, 555\n" -# Choose compression method -# (Will change during test, need to check standart data sending, to make sure that nothing broke) +# Choose compression method +# (Will change during test, need to check standard data sending, to make sure that nothing broke) COMPRESS_METHOD = 'none' ADDING_ENDING = '' ENDINGS = ['.gz', '.xz'] @@ -88,7 +88,7 @@ class HttpProcessor(SimpleHTTPRequestHandler): def do_GET(self): self._set_headers() - + if COMPRESS_METHOD == 'none': self.wfile.write(CSV_DATA.encode()) else: @@ -120,7 +120,7 @@ def test_select(dict_name="", schema="word String, counter UInt32", requests=[], if i > 2: ADDING_ENDING = ENDINGS[i-3] SEND_ENCODING = False - + if dict_name: get_ch_answer("drop dictionary if exists {}".format(dict_name)) get_ch_answer('''CREATE DICTIONARY {} ({}) diff --git a/tests/queries/0_stateless/01854_s2_cap_contains.reference b/tests/queries/0_stateless/01854_s2_cap_contains.reference new file mode 100644 index 00000000000..16db301bb51 --- /dev/null +++ b/tests/queries/0_stateless/01854_s2_cap_contains.reference @@ -0,0 +1,3 @@ +1 +0 +1 diff --git a/tests/queries/0_stateless/01854_s2_cap_contains.sql b/tests/queries/0_stateless/01854_s2_cap_contains.sql new file mode 100644 index 00000000000..1a8d2548352 --- /dev/null +++ b/tests/queries/0_stateless/01854_s2_cap_contains.sql @@ -0,0 +1,11 @@ +select s2CapContains(1157339245694594829, 1.0, 1157347770437378819); +select s2CapContains(1157339245694594829, 1.0, 1152921504606846977); +select s2CapContains(1157339245694594829, 3.14, 1157339245694594829); + +select s2CapContains(nan, 3.14, 1157339245694594829); -- { serverError 43 } +select s2CapContains(1157339245694594829, nan, 1157339245694594829); -- { serverError 43 } +select s2CapContains(1157339245694594829, 3.14, nan); -- { serverError 43 } + + +select s2CapContains(toUInt64(-1), -1.0, toUInt64(-1)); -- { serverError 36 } +select s2CapContains(toUInt64(-1), 9999.9999, toUInt64(-1)); -- { serverError 36 } diff --git a/tests/queries/0_stateless/01854_s2_cap_union.reference b/tests/queries/0_stateless/01854_s2_cap_union.reference new file mode 100644 index 00000000000..8be71d7ba28 --- /dev/null +++ b/tests/queries/0_stateless/01854_s2_cap_union.reference @@ -0,0 +1,3 @@ +(4534655147792050737,60.2088283994957) +(1157339245694594829,-57.29577951308232) +(1157339245694594829,180) diff --git a/tests/queries/0_stateless/01854_s2_cap_union.sql b/tests/queries/0_stateless/01854_s2_cap_union.sql new file mode 100644 index 00000000000..921a00ac663 --- /dev/null +++ b/tests/queries/0_stateless/01854_s2_cap_union.sql @@ -0,0 +1,9 @@ +select s2CapUnion(3814912406305146967, 1.0, 1157347770437378819, 1.0); +select s2CapUnion(1157339245694594829, -1.0, 1152921504606846977, -1.0); +select s2CapUnion(1157339245694594829, toFloat64(toUInt64(-1)), 1157339245694594829, toFloat64(toUInt64(-1))); + + +select s2CapUnion(nan, 3.14, 1157339245694594829, 3.14); -- { serverError 43 } +select s2CapUnion(1157339245694594829, nan, 1157339245694594829, 3.14); -- { serverError 43 } +select s2CapUnion(1157339245694594829, 3.14, nan, 3.14); -- { serverError 43 } +select s2CapUnion(1157339245694594829, 3.14, 1157339245694594829, nan); -- { serverError 43 } diff --git a/tests/queries/0_stateless/01860_Distributed__shard_num_GROUP_BY.sql b/tests/queries/0_stateless/01860_Distributed__shard_num_GROUP_BY.sql index 91215fd8ee6..d8a86b7799e 100644 --- a/tests/queries/0_stateless/01860_Distributed__shard_num_GROUP_BY.sql +++ b/tests/queries/0_stateless/01860_Distributed__shard_num_GROUP_BY.sql @@ -11,6 +11,4 @@ SELECT _shard_num + dummy s, count() FROM remote('127.0.0.{1,2}', system.one) GR SELECT _shard_num FROM remote('127.0.0.{1,2}', system.one) ORDER BY _shard_num; SELECT _shard_num s FROM remote('127.0.0.{1,2}', system.one) ORDER BY _shard_num; -SELECT _shard_num s, count() FROM remote('127.0.0.{1,2}', system.one) GROUP BY s order by s; - -select materialize(_shard_num), * from remote('127.{1,2}', system.one) limit 1 by dummy format Null; +SELECT _shard_num, count() FROM remote('127.0.0.{1,2}', system.one) GROUP BY _shard_num order by _shard_num; diff --git a/tests/queries/0_stateless/01861_explain_pipeline.reference b/tests/queries/0_stateless/01861_explain_pipeline.reference index 9d62fb9f6b8..63ba55f5a04 100644 --- a/tests/queries/0_stateless/01861_explain_pipeline.reference +++ b/tests/queries/0_stateless/01861_explain_pipeline.reference @@ -5,7 +5,7 @@ ExpressionTransform ExpressionTransform ReplacingSorted 2 → 1 ExpressionTransform × 2 - MergeTree × 2 0 → 1 + MergeTreeInOrder × 2 0 → 1 0 0 1 1 2 2 @@ -22,4 +22,4 @@ ExpressionTransform × 2 Copy × 2 1 → 2 AddingSelector × 2 ExpressionTransform × 2 - MergeTree × 2 0 → 1 + MergeTreeInOrder × 2 0 → 1 diff --git a/tests/queries/0_stateless/01866_view_persist_settings.reference b/tests/queries/0_stateless/01866_view_persist_settings.reference index 07c96e76875..4d7e1356807 100644 --- a/tests/queries/0_stateless/01866_view_persist_settings.reference +++ b/tests/queries/0_stateless/01866_view_persist_settings.reference @@ -1,8 +1,5 @@ join_use_nulls = 1 - -1 11 0 -2 12 22 -3 0 23 - 1 11 0 2 12 22 @@ -12,9 +9,40 @@ join_use_nulls = 1 2 12 22 3 \N 23 - -1 11 0 +1 11 \N 2 12 22 -3 0 23 +3 \N 23 +join_use_nulls = 0 +- +1 11 0 +2 12 22 +3 0 23 +- +1 11 0 +2 12 22 +3 0 23 +- +1 11 \N +2 12 22 +3 \N 23 +- +1 11 0 +2 12 22 +3 0 23 +join_use_nulls = 1 +- +- +1 11 0 +2 12 22 +3 0 23 +- +1 11 \N +2 12 22 +3 \N 23 +- +1 11 \N +2 12 22 +3 \N 23 join_use_nulls = 0 - 1 11 0 diff --git a/tests/queries/0_stateless/01866_view_persist_settings.sql b/tests/queries/0_stateless/01866_view_persist_settings.sql index 71d6c856b9b..c58b802494d 100644 --- a/tests/queries/0_stateless/01866_view_persist_settings.sql +++ b/tests/queries/0_stateless/01866_view_persist_settings.sql @@ -33,6 +33,19 @@ SET join_use_nulls = 1; SELECT 'join_use_nulls = 1'; +SELECT '-'; +SELECT * FROM view_no_nulls; -- { serverError 80 } +SELECT '-'; +SELECT * FROM view_no_nulls_set; +SELECT '-'; +SELECT * FROM view_nulls_set; +SELECT '-'; +SELECT * FROM view_nulls; + +SET join_use_nulls = 0; + +SELECT 'join_use_nulls = 0'; + SELECT '-'; SELECT * FROM view_no_nulls; SELECT '-'; @@ -42,6 +55,29 @@ SELECT * FROM view_nulls_set; SELECT '-'; SELECT * FROM view_nulls; +DETACH TABLE view_no_nulls; +DETACH TABLE view_no_nulls_set; +DETACH TABLE view_nulls_set; +DETACH TABLE view_nulls; + +ATTACH TABLE view_no_nulls; +ATTACH TABLE view_no_nulls_set; +ATTACH TABLE view_nulls_set; +ATTACH TABLE view_nulls; + +SET join_use_nulls = 1; + +SELECT 'join_use_nulls = 1'; + +SELECT '-'; +SELECT * FROM view_no_nulls; -- { serverError 80 } +SELECT '-'; +SELECT * FROM view_no_nulls_set; +SELECT '-'; +SELECT * FROM view_nulls_set; +SELECT '-'; +SELECT * FROM view_nulls; + SET join_use_nulls = 0; SELECT 'join_use_nulls = 0'; diff --git a/tests/queries/0_stateless/01867_support_datetime64_version_column.sql b/tests/queries/0_stateless/01867_support_datetime64_version_column.sql index f4427be635a..1aea0fb91f2 100644 --- a/tests/queries/0_stateless/01867_support_datetime64_version_column.sql +++ b/tests/queries/0_stateless/01867_support_datetime64_version_column.sql @@ -1,5 +1,5 @@ drop table if exists replacing; -create table replacing( `A` Int64, `D` DateTime64(9), `S` String) ENGINE = ReplacingMergeTree(D) ORDER BY A; +create table replacing( `A` Int64, `D` DateTime64(9, 'Europe/Moscow'), `S` String) ENGINE = ReplacingMergeTree(D) ORDER BY A; insert into replacing values (1,'1970-01-01 08:25:46.300800000','a'); insert into replacing values (2,'1970-01-01 08:25:46.300800002','b'); diff --git a/tests/queries/0_stateless/01875_ssd_cache_dictionary_decimal256_type.reference b/tests/queries/0_stateless/01875_ssd_cache_dictionary_decimal256_type.reference index 9b3c41ac646..64d34583100 100644 --- a/tests/queries/0_stateless/01875_ssd_cache_dictionary_decimal256_type.reference +++ b/tests/queries/0_stateless/01875_ssd_cache_dictionary_decimal256_type.reference @@ -1,2 +1,2 @@ SSDCache dictionary -5.00000 +5 diff --git a/tests/queries/0_stateless/01881_join_on_conditions.reference b/tests/queries/0_stateless/01881_join_on_conditions.reference new file mode 100644 index 00000000000..e1fac0e7dc3 --- /dev/null +++ b/tests/queries/0_stateless/01881_join_on_conditions.reference @@ -0,0 +1,108 @@ +-- hash_join -- +-- +222 2 +222 222 +333 333 +-- +222 222 +333 333 +-- +222 +333 +-- +1 +1 +1 +1 +1 +1 +1 +1 +1 +-- +2 +2 +3 +2 +3 +2 +3 +2 +3 +2 +3 +2 +3 +2 +3 +2 +3 +-- +222 2 +333 3 +222 2 +333 3 +-- +0 2 AAA a +0 4 CCC CCC +1 111 111 0 +2 222 2 0 +2 222 222 2 AAA AAA +3 333 333 3 BBB BBB +-- +2 222 2 2 AAA a +2 222 222 2 AAA AAA +-- partial_merge -- +-- +222 2 +222 222 +333 333 +-- +222 222 +333 333 +-- +222 +333 +-- +1 +1 +1 +1 +1 +1 +1 +1 +1 +-- +2 +2 +3 +2 +3 +2 +3 +2 +3 +2 +3 +2 +3 +2 +3 +2 +3 +-- +222 2 +333 3 +222 2 +333 3 +-- +0 2 AAA a +0 4 CCC CCC +1 111 111 0 +2 222 2 0 +2 222 222 2 AAA AAA +3 333 333 3 BBB BBB +-- +2 222 2 2 AAA a +2 222 222 2 AAA AAA diff --git a/tests/queries/0_stateless/01881_join_on_conditions.sql b/tests/queries/0_stateless/01881_join_on_conditions.sql new file mode 100644 index 00000000000..a34c413845b --- /dev/null +++ b/tests/queries/0_stateless/01881_join_on_conditions.sql @@ -0,0 +1,141 @@ +DROP TABLE IF EXISTS t1; +DROP TABLE IF EXISTS t2; +DROP TABLE IF EXISTS t2_nullable; +DROP TABLE IF EXISTS t2_lc; + +CREATE TABLE t1 (`id` Int32, key String, key2 String) ENGINE = TinyLog; +CREATE TABLE t2 (`id` Int32, key String, key2 String) ENGINE = TinyLog; +CREATE TABLE t2_nullable (`id` Int32, key String, key2 Nullable(String)) ENGINE = TinyLog; +CREATE TABLE t2_lc (`id` Int32, key String, key2 LowCardinality(String)) ENGINE = TinyLog; + +INSERT INTO t1 VALUES (1, '111', '111'),(2, '222', '2'),(2, '222', '222'),(3, '333', '333'); +INSERT INTO t2 VALUES (2, 'AAA', 'AAA'),(2, 'AAA', 'a'),(3, 'BBB', 'BBB'),(4, 'CCC', 'CCC'); +INSERT INTO t2_nullable VALUES (2, 'AAA', 'AAA'),(2, 'AAA', 'a'),(3, 'BBB', NULL),(4, 'CCC', 'CCC'); +INSERT INTO t2_lc VALUES (2, 'AAA', 'AAA'),(2, 'AAA', 'a'),(3, 'BBB', 'BBB'),(4, 'CCC', 'CCC'); + +SELECT '-- hash_join --'; + +SELECT '--'; +SELECT t1.key, t1.key2 FROM t1 INNER ALL JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2; +SELECT '--'; +SELECT t1.key, t1.key2 FROM t1 INNER ALL JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2; + +SELECT '--'; +SELECT t1.key FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2; + +SELECT '--'; +SELECT '333' = t1.key FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2 AND t2.id > 2; +SELECT '333' = t1.key FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2 AND t2.id == 3; +SELECT '333' = t1.key FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2 AND t2.key2 == 'BBB'; +SELECT '333' = t1.key FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2 AND t1.key2 == '333'; +SELECT '333' = t1.key FROM t1 INNER ANY JOIN t2_nullable as t2 ON t1.id == t2.id AND (t2.key == t2.key2 OR isNull(t2.key2)) AND t1.key == t1.key2 AND t1.key2 == '333'; +SELECT '333' = t1.key FROM t1 INNER ANY JOIN t2_lc as t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2 AND t1.key2 == '333'; +SELECT '333' = t1.key FROM t1 INNER ANY JOIN t2_nullable as t2 ON t1.id == t2.id AND isNull(t2.key2); +SELECT '333' = t1.key FROM t1 INNER ANY JOIN t2_nullable as t2 ON t1.id == t2.id AND t1.key2 like '33%'; +SELECT '333' = t1.key FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2 AND t1.id >= length(t1.key); + +-- DISTINCT is used to remove the difference between 'hash' and 'merge' join: 'merge' doesn't support `any_join_distinct_right_table_keys` + +SELECT '--'; +SELECT DISTINCT t1.id FROM t1 INNER ANY JOIN t2_nullable as t2 ON t1.id == t2.id AND t2.key2 != ''; +SELECT DISTINCT t1.id FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND toNullable(t2.key2 != ''); +SELECT DISTINCT t1.id FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND toLowCardinality(t2.key2 != ''); +SELECT DISTINCT t1.id FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND toLowCardinality(toNullable(t2.key2 != '')); +SELECT DISTINCT t1.id FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND toNullable(toLowCardinality(t2.key2 != '')); +SELECT DISTINCT t1.id FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND toNullable(t1.key2 != ''); +SELECT DISTINCT t1.id FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND toLowCardinality(t1.key2 != ''); +SELECT DISTINCT t1.id FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND toLowCardinality(toNullable(t1.key2 != '')); +SELECT DISTINCT t1.id FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND toNullable(toLowCardinality(t1.key2 != '')); + +SELECT '--'; +SELECT DISTINCT t1.key, toUInt8(t1.id) as e FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND e; +-- `e + 1` is UInt16 +SELECT DISTINCT t1.key, toUInt8(t1.id) as e FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND e + 1; -- { serverError 403 } +SELECT DISTINCT t1.key, toUInt8(t1.id) as e FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND toUInt8(e + 1); + +SELECT '--'; +SELECT t1.id, t1.key, t1.key2, t2.id, t2.key, t2.key2 FROM t1 FULL JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2 ORDER BY t1.id, t2.id; + +SELECT * FROM t1 INNER ALL JOIN t2 ON t1.id == t2.id AND t1.id; -- { serverError 403 } +SELECT * FROM t1 INNER ALL JOIN t2 ON t1.id == t2.id AND t2.id; -- { serverError 403 } +SELECT * FROM t1 INNER ALL JOIN t2 ON t1.id == t2.id AND t1.id + 2; -- { serverError 403 } +SELECT * FROM t1 INNER ALL JOIN t2 ON t1.id == t2.id AND t2.id + 2; -- { serverError 403 } +SELECT * FROM t1 INNER ALL JOIN t2 ON t1.id == t2.id AND t1.key; -- { serverError 403 } +SELECT * FROM t1 INNER ALL JOIN t2 ON t1.id == t2.id AND t2.key; -- { serverError 403 } +SELECT * FROM t1 JOIN t2 ON t2.key == t2.key2 AND (t1.id == t2.id OR isNull(t2.key2)); -- { serverError 403 } +SELECT * FROM t1 JOIN t2 ON t2.key == t2.key2 OR t1.id == t2.id; -- { serverError 403 } +SELECT * FROM t1 JOIN t2 ON (t2.key == t2.key2 AND (t1.key == t1.key2 AND t1.key != 'XXX' OR t1.id == t2.id)) AND t1.id == t2.id; -- { serverError 403 } +-- non-equi condition containing columns from different tables doesn't supported yet +SELECT * FROM t1 INNER ALL JOIN t2 ON t1.id == t2.id AND t1.id >= t2.id; -- { serverError 403 } +SELECT * FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2 AND t1.id >= length(t2.key); -- { serverError 403 } + +SELECT '--'; +-- length(t1.key2) == length(t2.key2) is expression for columns from both tables, it works because it part of joining key +SELECT t1.*, t2.* FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND length(t1.key2) == length(t2.key2) AND t1.key != '333'; + +SET join_algorithm = 'partial_merge'; + +SELECT '-- partial_merge --'; + +SELECT '--'; +SELECT t1.key, t1.key2 FROM t1 INNER ALL JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2; +SELECT '--'; +SELECT t1.key, t1.key2 FROM t1 INNER ALL JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2; + +SELECT '--'; +SELECT t1.key FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2; + +SELECT '--'; +SELECT '333' = t1.key FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2 AND t2.id > 2; +SELECT '333' = t1.key FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2 AND t2.id == 3; +SELECT '333' = t1.key FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2 AND t2.key2 == 'BBB'; +SELECT '333' = t1.key FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2 AND t1.key2 == '333'; +SELECT '333' = t1.key FROM t1 INNER ANY JOIN t2_nullable as t2 ON t1.id == t2.id AND (t2.key == t2.key2 OR isNull(t2.key2)) AND t1.key == t1.key2 AND t1.key2 == '333'; +SELECT '333' = t1.key FROM t1 INNER ANY JOIN t2_lc as t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2 AND t1.key2 == '333'; +SELECT '333' = t1.key FROM t1 INNER ANY JOIN t2_nullable as t2 ON t1.id == t2.id AND isNull(t2.key2); +SELECT '333' = t1.key FROM t1 INNER ANY JOIN t2_nullable as t2 ON t1.id == t2.id AND t1.key2 like '33%'; +SELECT '333' = t1.key FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2 AND t1.id >= length(t1.key); + +-- DISTINCT is used to remove the difference between 'hash' and 'merge' join: 'merge' doesn't support `any_join_distinct_right_table_keys` + +SELECT '--'; +SELECT DISTINCT t1.id FROM t1 INNER ANY JOIN t2_nullable as t2 ON t1.id == t2.id AND t2.key2 != ''; +SELECT DISTINCT t1.id FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND toNullable(t2.key2 != ''); +SELECT DISTINCT t1.id FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND toLowCardinality(t2.key2 != ''); +SELECT DISTINCT t1.id FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND toLowCardinality(toNullable(t2.key2 != '')); +SELECT DISTINCT t1.id FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND toNullable(toLowCardinality(t2.key2 != '')); +SELECT DISTINCT t1.id FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND toNullable(t1.key2 != ''); +SELECT DISTINCT t1.id FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND toLowCardinality(t1.key2 != ''); +SELECT DISTINCT t1.id FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND toLowCardinality(toNullable(t1.key2 != '')); +SELECT DISTINCT t1.id FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND toNullable(toLowCardinality(t1.key2 != '')); + +SELECT '--'; +SELECT DISTINCT t1.key, toUInt8(t1.id) as e FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND e; +-- `e + 1` is UInt16 +SELECT DISTINCT t1.key, toUInt8(t1.id) as e FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND e + 1; -- { serverError 403 } +SELECT DISTINCT t1.key, toUInt8(t1.id) as e FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND toUInt8(e + 1); + +SELECT '--'; +SELECT t1.id, t1.key, t1.key2, t2.id, t2.key, t2.key2 FROM t1 FULL JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2 ORDER BY t1.id, t2.id; + +SELECT * FROM t1 INNER ALL JOIN t2 ON t1.id == t2.id AND t1.id; -- { serverError 403 } +SELECT * FROM t1 INNER ALL JOIN t2 ON t1.id == t2.id AND t2.id; -- { serverError 403 } +SELECT * FROM t1 INNER ALL JOIN t2 ON t1.id == t2.id AND t1.id + 2; -- { serverError 403 } +SELECT * FROM t1 INNER ALL JOIN t2 ON t1.id == t2.id AND t2.id + 2; -- { serverError 403 } +SELECT * FROM t1 INNER ALL JOIN t2 ON t1.id == t2.id AND t1.key; -- { serverError 403 } +SELECT * FROM t1 INNER ALL JOIN t2 ON t1.id == t2.id AND t2.key; -- { serverError 403 } +SELECT * FROM t1 JOIN t2 ON t2.key == t2.key2 AND (t1.id == t2.id OR isNull(t2.key2)); -- { serverError 403 } +SELECT * FROM t1 JOIN t2 ON t2.key == t2.key2 OR t1.id == t2.id; -- { serverError 403 } +SELECT * FROM t1 JOIN t2 ON (t2.key == t2.key2 AND (t1.key == t1.key2 AND t1.key != 'XXX' OR t1.id == t2.id)) AND t1.id == t2.id; -- { serverError 403 } +-- non-equi condition containing columns from different tables doesn't supported yet +SELECT * FROM t1 INNER ALL JOIN t2 ON t1.id == t2.id AND t1.id >= t2.id; -- { serverError 403 } +SELECT * FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND t2.key == t2.key2 AND t1.key == t1.key2 AND t1.id >= length(t2.key); -- { serverError 403 } + +SELECT '--'; +-- length(t1.key2) == length(t2.key2) is expression for columns from both tables, it works because it part of joining key +SELECT t1.*, t2.* FROM t1 INNER ANY JOIN t2 ON t1.id == t2.id AND length(t1.key2) == length(t2.key2) AND t1.key != '333'; + +DROP TABLE IF EXISTS t1; +DROP TABLE IF EXISTS t2; +DROP TABLE IF EXISTS t2_nullable; +DROP TABLE IF EXISTS t2_lc; diff --git a/tests/queries/0_stateless/01882_total_rows_approx.reference b/tests/queries/0_stateless/01882_total_rows_approx.reference index 7f2070fc9cb..fd1fb9b7231 100644 --- a/tests/queries/0_stateless/01882_total_rows_approx.reference +++ b/tests/queries/0_stateless/01882_total_rows_approx.reference @@ -1,8 +1 @@ -Waiting for query to be started... -Query started. -Checking total_rows_approx. -10 -10 -10 -10 -10 +"total_rows_to_read":"10" diff --git a/tests/queries/0_stateless/01882_total_rows_approx.sh b/tests/queries/0_stateless/01882_total_rows_approx.sh index f51e95b15c0..26333f61692 100755 --- a/tests/queries/0_stateless/01882_total_rows_approx.sh +++ b/tests/queries/0_stateless/01882_total_rows_approx.sh @@ -1,23 +1,12 @@ #!/usr/bin/env bash -# Check that total_rows_approx (via system.processes) includes all rows from +# Check that total_rows_approx (via http headers) includes all rows from # all parts at the query start. # # At some point total_rows_approx was accounted only when the query starts # reading the part, and so total_rows_approx wasn't reliable, even for simple # SELECT FROM MergeTree() # It was fixed by take total_rows_approx into account as soon as possible. -# -# To check total_rows_approx this query starts the query in background, -# that sleep's 1 second for each part, and by using max_threads=1 the query -# reads parts sequentially and sleeps 1 second between parts. -# Also the test spawns background process to check total_rows_approx for this -# query. -# It checks multiple times since at first few iterations the query may not -# start yet (since there are 3 excessive sleep calls - 1 for primary key -# analysis and 2 for partition pruning), and get only last 5 total_rows_approx -# rows (one row is not enough since when the query finishes total_rows_approx -# will be set to 10 anyway, regardless proper accounting). CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # shellcheck source=../shell_config.sh @@ -25,31 +14,14 @@ CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) $CLICKHOUSE_CLIENT -q "drop table if exists data_01882" $CLICKHOUSE_CLIENT -q "create table data_01882 (key Int) Engine=MergeTree() partition by key order by key as select * from numbers(10)" -QUERY_ID="$CLICKHOUSE_TEST_NAME-$(tr -cd '[:lower:]' < /dev/urandom | head -c10)" - -function check_background_query() -{ - echo "Waiting for query to be started..." - while [[ $($CLICKHOUSE_CLIENT --param_query_id="$QUERY_ID" -q 'select count() from system.processes where query_id = {query_id:String}') != 1 ]]; do - sleep 0.01 - done - echo "Query started." - - echo "Checking total_rows_approx." - # check total_rows_approx multiple times - # (to make test more reliable to what it covers) - local i=0 - for ((i = 0; i < 20; ++i)); do - $CLICKHOUSE_CLIENT --param_query_id="$QUERY_ID" -q 'select total_rows_approx from system.processes where query_id = {query_id:String}' - (( ++i )) - sleep 1 - done | tail -n5 -} -check_background_query & - -# this query will sleep 10 seconds in total, 1 seconds for each part (10 parts). -$CLICKHOUSE_CLIENT -q "select *, sleepEachRow(1) from data_01882" --max_threads=1 --format Null --query_id="$QUERY_ID" --max_block_size=1 - -wait - -$CLICKHOUSE_CLIENT -q "drop table data_01882" +# send_progress_in_http_headers will periodically send the progress +# but this is not stable, i.e. it can be dumped on query end, +# thus check few times to be sure that this is not coincidence. +for _ in {1..30}; do + $CLICKHOUSE_CURL -vsS "${CLICKHOUSE_URL}&max_threads=1&default_format=Null&send_progress_in_http_headers=1&http_headers_progress_interval_ms=1" --data-binary @- <<< "select * from data_01882" |& { + grep -o -F '"total_rows_to_read":"10"' + } | { + # grep out final result + grep -v -F '"read_rows":"10"' + } +done | uniq diff --git a/tests/queries/0_stateless/01889_clickhouse_client_config_format.reference b/tests/queries/0_stateless/01889_clickhouse_client_config_format.reference index aa7748928f1..202e32a583e 100644 --- a/tests/queries/0_stateless/01889_clickhouse_client_config_format.reference +++ b/tests/queries/0_stateless/01889_clickhouse_client_config_format.reference @@ -13,4 +13,4 @@ yml yaml 2 ini -Code: 347. Unknown format of '/config_default.ini' config +Code: 347. Unknown format of '/config_default.ini' config. (CANNOT_LOAD_CONFIG) diff --git a/tests/queries/0_stateless/01889_sql_json_functions.reference b/tests/queries/0_stateless/01889_sql_json_functions.reference new file mode 100644 index 00000000000..593f2fb2d20 --- /dev/null +++ b/tests/queries/0_stateless/01889_sql_json_functions.reference @@ -0,0 +1,43 @@ +--JSON_VALUE-- + +1 +1.2 +true +"world" +null + + + + +--JSON_QUERY-- +[{"hello":1}] +[1] +[1.2] +[true] +["world"] +[null] +[["world","world2"]] +[{"world":"!"}] + + +[0, 1, 4, 0, -1, -4] +--JSON_EXISTS-- +1 +0 +1 +1 +1 +0 +1 +0 +0 +1 +1 +0 +1 +0 +1 +--MANY ROWS-- +0 ["Vasily", "Kostya"] +1 ["Tihon", "Ernest"] +2 ["Katya", "Anatoliy"] diff --git a/tests/queries/0_stateless/01889_sql_json_functions.sql b/tests/queries/0_stateless/01889_sql_json_functions.sql new file mode 100644 index 00000000000..1c5069ccfde --- /dev/null +++ b/tests/queries/0_stateless/01889_sql_json_functions.sql @@ -0,0 +1,50 @@ +SELECT '--JSON_VALUE--'; +SELECT JSON_VALUE('$', '{"hello":1}'); -- root is a complex object => default value (empty string) +SELECT JSON_VALUE('$.hello', '{"hello":1}'); +SELECT JSON_VALUE('$.hello', '{"hello":1.2}'); +SELECT JSON_VALUE('$.hello', '{"hello":true}'); +SELECT JSON_VALUE('$.hello', '{"hello":"world"}'); +SELECT JSON_VALUE('$.hello', '{"hello":null}'); +SELECT JSON_VALUE('$.hello', '{"hello":["world","world2"]}'); +SELECT JSON_VALUE('$.hello', '{"hello":{"world":"!"}}'); +SELECT JSON_VALUE('$.hello', '{hello:world}'); -- invalid json => default value (empty string) +SELECT JSON_VALUE('$.hello', ''); + +SELECT '--JSON_QUERY--'; +SELECT JSON_QUERY('$', '{"hello":1}'); +SELECT JSON_QUERY('$.hello', '{"hello":1}'); +SELECT JSON_QUERY('$.hello', '{"hello":1.2}'); +SELECT JSON_QUERY('$.hello', '{"hello":true}'); +SELECT JSON_QUERY('$.hello', '{"hello":"world"}'); +SELECT JSON_QUERY('$.hello', '{"hello":null}'); +SELECT JSON_QUERY('$.hello', '{"hello":["world","world2"]}'); +SELECT JSON_QUERY('$.hello', '{"hello":{"world":"!"}}'); +SELECT JSON_QUERY('$.hello', '{hello:{"world":"!"}}}'); -- invalid json => default value (empty string) +SELECT JSON_QUERY('$.hello', ''); +SELECT JSON_QUERY('$.array[*][0 to 2, 4]', '{"array":[[0, 1, 2, 3, 4, 5], [0, -1, -2, -3, -4, -5]]}'); + +SELECT '--JSON_EXISTS--'; +SELECT JSON_EXISTS('$', '{"hello":1}'); +SELECT JSON_EXISTS('$', ''); +SELECT JSON_EXISTS('$', '{}'); +SELECT JSON_EXISTS('$.hello', '{"hello":1}'); +SELECT JSON_EXISTS('$.world', '{"hello":1,"world":2}'); +SELECT JSON_EXISTS('$.world', '{"hello":{"world":1}}'); +SELECT JSON_EXISTS('$.hello.world', '{"hello":{"world":1}}'); +SELECT JSON_EXISTS('$.hello', '{hello:world}'); -- invalid json => default value (zero integer) +SELECT JSON_EXISTS('$.hello', ''); +SELECT JSON_EXISTS('$.hello[*]', '{"hello":["world"]}'); +SELECT JSON_EXISTS('$.hello[0]', '{"hello":["world"]}'); +SELECT JSON_EXISTS('$.hello[1]', '{"hello":["world"]}'); +SELECT JSON_EXISTS('$.a[*].b', '{"a":[{"b":1},{"c":2}]}'); +SELECT JSON_EXISTS('$.a[*].f', '{"a":[{"b":1},{"c":2}]}'); +SELECT JSON_EXISTS('$.a[*][0].h', '{"a":[[{"b":1}, {"g":1}],[{"h":1},{"y":1}]]}'); + +SELECT '--MANY ROWS--'; +DROP TABLE IF EXISTS 01889_sql_json; +CREATE TABLE 01889_sql_json (id UInt8, json String) ENGINE = MergeTree ORDER BY id; +INSERT INTO 01889_sql_json(id, json) VALUES(0, '{"name":"Ivan","surname":"Ivanov","friends":["Vasily","Kostya","Artyom"]}'); +INSERT INTO 01889_sql_json(id, json) VALUES(1, '{"name":"Katya","surname":"Baltica","friends":["Tihon","Ernest","Innokentiy"]}'); +INSERT INTO 01889_sql_json(id, json) VALUES(2, '{"name":"Vitali","surname":"Brown","friends":["Katya","Anatoliy","Ivan","Oleg"]}'); +SELECT id, JSON_QUERY('$.friends[0 to 2]', json) FROM 01889_sql_json ORDER BY id; +DROP TABLE 01889_sql_json; diff --git a/tests/queries/0_stateless/01889_sqlite_read_write.reference b/tests/queries/0_stateless/01889_sqlite_read_write.reference new file mode 100644 index 00000000000..e979b5816c5 --- /dev/null +++ b/tests/queries/0_stateless/01889_sqlite_read_write.reference @@ -0,0 +1,42 @@ +create database engine +show database tables: +table1 +table2 +table3 +table4 +table5 +show creare table: +CREATE TABLE SQLite.table1\n(\n `col1` Nullable(String),\n `col2` Nullable(Int16)\n)\nENGINE = SQLite +CREATE TABLE SQLite.table2\n(\n `col1` Nullable(Int32),\n `col2` Nullable(String)\n)\nENGINE = SQLite +describe table: +col1 Nullable(String) +col2 Nullable(Int16) +col1 Nullable(Int32) +col2 Nullable(String) +select *: +line1 1 +line2 2 +line3 3 +1 text1 +2 text2 +3 text3 +test types +CREATE TABLE SQLite.table4\n(\n `a` Nullable(Int32),\n `b` Nullable(Int32),\n `c` Nullable(Int8),\n `d` Nullable(Int16),\n `e` Nullable(Int32),\n `bigint` Nullable(String),\n `int2` Nullable(String),\n `int8` Nullable(String)\n)\nENGINE = SQLite +CREATE TABLE SQLite.table5\n(\n `a` Nullable(String),\n `b` Nullable(String),\n `c` Nullable(Float64),\n `d` Nullable(Float64),\n `e` Nullable(Float64),\n `f` Nullable(Float32)\n)\nENGINE = SQLite +create table engine with table3 +CREATE TABLE default.sqlite_table3\n(\n `col1` String,\n `col2` Int32\n)\nENGINE = SQLite + 1 +not a null 2 + 3 + 4 +line6 6 + 7 +test table function +line1 1 +line2 2 +line3 3 +line4 4 +test path in clickhouse-local +line1 1 +line2 2 +line3 3 diff --git a/tests/queries/0_stateless/01889_sqlite_read_write.sh b/tests/queries/0_stateless/01889_sqlite_read_write.sh new file mode 100755 index 00000000000..73b106e9eb4 --- /dev/null +++ b/tests/queries/0_stateless/01889_sqlite_read_write.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +# See 01658_read_file_to_string_column.sh +user_files_path=$(clickhouse-client --query "select _path,_file from file('nonexist.txt', 'CSV', 'val1 char')" 2>&1 | grep Exception | awk '{gsub("/nonexist.txt","",$9); print $9}') + +mkdir -p ${user_files_path}/ +chmod 777 ${user_files_path} +DB_PATH=${user_files_path}/db1 + + +sqlite3 ${DB_PATH} 'DROP TABLE IF EXISTS table1' +sqlite3 ${DB_PATH} 'DROP TABLE IF EXISTS table2' +sqlite3 ${DB_PATH} 'DROP TABLE IF EXISTS table3' +sqlite3 ${DB_PATH} 'DROP TABLE IF EXISTS table4' +sqlite3 ${DB_PATH} 'DROP TABLE IF EXISTS table5' + +sqlite3 ${DB_PATH} 'CREATE TABLE table1 (col1 text, col2 smallint);' +sqlite3 ${DB_PATH} 'CREATE TABLE table2 (col1 int, col2 text);' + +chmod ugo+w ${DB_PATH} + +sqlite3 ${DB_PATH} "INSERT INTO table1 VALUES ('line1', 1), ('line2', 2), ('line3', 3)" +sqlite3 ${DB_PATH} "INSERT INTO table2 VALUES (1, 'text1'), (2, 'text2'), (3, 'text3')" + +sqlite3 ${DB_PATH} 'CREATE TABLE table3 (col1 text, col2 int);' +sqlite3 ${DB_PATH} 'INSERT INTO table3 VALUES (NULL, 1)' +sqlite3 ${DB_PATH} "INSERT INTO table3 VALUES ('not a null', 2)" +sqlite3 ${DB_PATH} 'INSERT INTO table3 VALUES (NULL, 3)' +sqlite3 ${DB_PATH} "INSERT INTO table3 VALUES ('', 4)" + +sqlite3 ${DB_PATH} 'CREATE TABLE table4 (a int, b integer, c tinyint, d smallint, e mediumint, bigint, int2, int8)' +sqlite3 ${DB_PATH} 'CREATE TABLE table5 (a character(20), b varchar(10), c real, d double, e double precision, f float)' + + +${CLICKHOUSE_CLIENT} --query='DROP DATABASE IF EXISTS sqlite_database' + +${CLICKHOUSE_CLIENT} --query="select 'create database engine'"; +${CLICKHOUSE_CLIENT} --query="CREATE DATABASE sqlite_database ENGINE = SQLite('${DB_PATH}')" + +${CLICKHOUSE_CLIENT} --query="select 'show database tables:'"; +${CLICKHOUSE_CLIENT} --query='SHOW TABLES FROM sqlite_database;' + +${CLICKHOUSE_CLIENT} --query="select 'show creare table:'"; +${CLICKHOUSE_CLIENT} --query='SHOW CREATE TABLE sqlite_database.table1;' | sed -r 's/(.*SQLite)(.*)/\1/' +${CLICKHOUSE_CLIENT} --query='SHOW CREATE TABLE sqlite_database.table2;' | sed -r 's/(.*SQLite)(.*)/\1/' + +${CLICKHOUSE_CLIENT} --query="select 'describe table:'"; +${CLICKHOUSE_CLIENT} --query='DESCRIBE TABLE sqlite_database.table1;' +${CLICKHOUSE_CLIENT} --query='DESCRIBE TABLE sqlite_database.table2;' + +${CLICKHOUSE_CLIENT} --query="select 'select *:'"; +${CLICKHOUSE_CLIENT} --query='SELECT * FROM sqlite_database.table1 ORDER BY col2' +${CLICKHOUSE_CLIENT} --query='SELECT * FROM sqlite_database.table2 ORDER BY col1;' + +${CLICKHOUSE_CLIENT} --query="select 'test types'"; +${CLICKHOUSE_CLIENT} --query='SHOW CREATE TABLE sqlite_database.table4;' | sed -r 's/(.*SQLite)(.*)/\1/' +${CLICKHOUSE_CLIENT} --query='SHOW CREATE TABLE sqlite_database.table5;' | sed -r 's/(.*SQLite)(.*)/\1/' + +${CLICKHOUSE_CLIENT} --query='DROP DATABASE IF EXISTS sqlite_database' + + +${CLICKHOUSE_CLIENT} --query="select 'create table engine with table3'"; +${CLICKHOUSE_CLIENT} --query='DROP TABLE IF EXISTS sqlite_table3' +${CLICKHOUSE_CLIENT} --query="CREATE TABLE sqlite_table3 (col1 String, col2 Int32) ENGINE = SQLite('${DB_PATH}', 'table3')" + +${CLICKHOUSE_CLIENT} --query='SHOW CREATE TABLE sqlite_table3;' | sed -r 's/(.*SQLite)(.*)/\1/' +${CLICKHOUSE_CLIENT} --query="INSERT INTO sqlite_table3 VALUES ('line6', 6);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO sqlite_table3 VALUES (NULL, 7);" + +${CLICKHOUSE_CLIENT} --query='SELECT * FROM sqlite_table3 ORDER BY col2' + + +${CLICKHOUSE_CLIENT} --query="select 'test table function'"; +${CLICKHOUSE_CLIENT} --query="INSERT INTO TABLE FUNCTION sqlite('${DB_PATH}', 'table1') SELECT 'line4', 4" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM sqlite('${DB_PATH}', 'table1') ORDER BY col2" + + +sqlite3 $CUR_DIR/db2 'DROP TABLE IF EXISTS table1' +sqlite3 $CUR_DIR/db2 'CREATE TABLE table1 (col1 text, col2 smallint);' +sqlite3 $CUR_DIR/db2 "INSERT INTO table1 VALUES ('line1', 1), ('line2', 2), ('line3', 3)" + +${CLICKHOUSE_CLIENT} --query="select 'test path in clickhouse-local'"; +${CLICKHOUSE_LOCAL} --query="SELECT * FROM sqlite('$CUR_DIR/db2', 'table1') ORDER BY col2" + +rm -r ${DB_PATH} diff --git a/tests/queries/0_stateless/01889_tokenize.reference b/tests/queries/0_stateless/01889_tokenize.reference new file mode 100644 index 00000000000..4dd6f323929 --- /dev/null +++ b/tests/queries/0_stateless/01889_tokenize.reference @@ -0,0 +1,8 @@ +['It','is','quite','a','wonderful','day','isn','t','it'] +['There','is','so','much','to','learn'] +['22','00','email','yandex','ru'] +['Токенизация','каких','либо','других','языков'] +['It','is','quite','a','wonderful','day,','isn\'t','it?'] +['There','is....','so','much','to','learn!'] +['22:00','email@yandex.ru'] +['Токенизация','каких-либо','других','языков?'] diff --git a/tests/queries/0_stateless/01889_tokenize.sql b/tests/queries/0_stateless/01889_tokenize.sql new file mode 100644 index 00000000000..c9d29a8632b --- /dev/null +++ b/tests/queries/0_stateless/01889_tokenize.sql @@ -0,0 +1,11 @@ +SET allow_experimental_nlp_functions = 1; + +SELECT splitByNonAlpha('It is quite a wonderful day, isn\'t it?'); +SELECT splitByNonAlpha('There is.... so much to learn!'); +SELECT splitByNonAlpha('22:00 email@yandex.ru'); +SELECT splitByNonAlpha('Токенизация каких-либо других языков?'); + +SELECT splitByWhitespace('It is quite a wonderful day, isn\'t it?'); +SELECT splitByWhitespace('There is.... so much to learn!'); +SELECT splitByWhitespace('22:00 email@yandex.ru'); +SELECT splitByWhitespace('Токенизация каких-либо других языков?'); diff --git a/tests/queries/0_stateless/01890_stem.reference b/tests/queries/0_stateless/01890_stem.reference new file mode 100644 index 00000000000..33e18cd6775 --- /dev/null +++ b/tests/queries/0_stateless/01890_stem.reference @@ -0,0 +1,21 @@ +given +combinatori +collect +possibl +studi +commonplac +pack +комбинаторн +получ +огранич +конечн +максимальн +суммарн +стоимост +remplissag +valeur +maximis +dépass +intens +étudi +peuvent diff --git a/tests/queries/0_stateless/01890_stem.sql b/tests/queries/0_stateless/01890_stem.sql new file mode 100644 index 00000000000..472cfb54251 --- /dev/null +++ b/tests/queries/0_stateless/01890_stem.sql @@ -0,0 +1,25 @@ +SET allow_experimental_nlp_functions = 1; + +SELECT stem('en', 'given'); +SELECT stem('en', 'combinatorial'); +SELECT stem('en', 'collection'); +SELECT stem('en', 'possibility'); +SELECT stem('en', 'studied'); +SELECT stem('en', 'commonplace'); +SELECT stem('en', 'packing'); + +SELECT stem('ru', 'комбинаторной'); +SELECT stem('ru', 'получила'); +SELECT stem('ru', 'ограничена'); +SELECT stem('ru', 'конечной'); +SELECT stem('ru', 'максимальной'); +SELECT stem('ru', 'суммарный'); +SELECT stem('ru', 'стоимостью'); + +SELECT stem('fr', 'remplissage'); +SELECT stem('fr', 'valeur'); +SELECT stem('fr', 'maximiser'); +SELECT stem('fr', 'dépasser'); +SELECT stem('fr', 'intensivement'); +SELECT stem('fr', 'étudié'); +SELECT stem('fr', 'peuvent'); diff --git a/tests/queries/0_stateless/01891_partition_hash.sql b/tests/queries/0_stateless/01891_partition_hash.sql index 6e356e799ab..f401c7c2d07 100644 --- a/tests/queries/0_stateless/01891_partition_hash.sql +++ b/tests/queries/0_stateless/01891_partition_hash.sql @@ -1,5 +1,5 @@ drop table if exists tab; -create table tab (i8 Int8, i16 Int16, i32 Int32, i64 Int64, i128 Int128, i256 Int256, u8 UInt8, u16 UInt16, u32 UInt32, u64 UInt64, u128 UInt128, u256 UInt256, id UUID, s String, fs FixedString(33), a Array(UInt8), t Tuple(UInt16, UInt32), d Date, dt DateTime, dt64 DateTime64, dec128 Decimal128(3), dec256 Decimal256(4), lc LowCardinality(String)) engine = MergeTree PARTITION BY (i8, i16, i32, i64, i128, i256, u8, u16, u32, u64, u128, u256, id, s, fs, a, t, d, dt, dt64, dec128, dec256, lc) order by tuple(); +create table tab (i8 Int8, i16 Int16, i32 Int32, i64 Int64, i128 Int128, i256 Int256, u8 UInt8, u16 UInt16, u32 UInt32, u64 UInt64, u128 UInt128, u256 UInt256, id UUID, s String, fs FixedString(33), a Array(UInt8), t Tuple(UInt16, UInt32), d Date, dt DateTime('Europe/Moscow'), dt64 DateTime64(3, 'Europe/Moscow'), dec128 Decimal128(3), dec256 Decimal256(4), lc LowCardinality(String)) engine = MergeTree PARTITION BY (i8, i16, i32, i64, i128, i256, u8, u16, u32, u64, u128, u256, id, s, fs, a, t, d, dt, dt64, dec128, dec256, lc) order by tuple(); insert into tab values (-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, '61f0c404-5cb3-11e7-907b-a6006ad3dba0', 'a', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', [1, 2, 3], (-1, -2), '2020-01-01', '2020-01-01 01:01:01', '2020-01-01 01:01:01', '123.456', '78.9101', 'a'); -- Here we check that partition id did not change. -- Different result means Backward Incompatible Change. Old partitions will not be accepted by new server. diff --git a/tests/queries/0_stateless/01891_partition_hash_no_long_int.sql b/tests/queries/0_stateless/01891_partition_hash_no_long_int.sql index bf5c2457923..0751ff2729f 100644 --- a/tests/queries/0_stateless/01891_partition_hash_no_long_int.sql +++ b/tests/queries/0_stateless/01891_partition_hash_no_long_int.sql @@ -1,5 +1,5 @@ drop table if exists tab; -create table tab (i8 Int8, i16 Int16, i32 Int32, i64 Int64, u8 UInt8, u16 UInt16, u32 UInt32, u64 UInt64, id UUID, s String, fs FixedString(33), a Array(UInt8), t Tuple(UInt16, UInt32), d Date, dt DateTime, dt64 DateTime64, dec128 Decimal128(3), lc LowCardinality(String)) engine = MergeTree PARTITION BY (i8, i16, i32, i64, u8, u16, u32, u64, id, s, fs, a, t, d, dt, dt64, dec128, lc) order by tuple(); +create table tab (i8 Int8, i16 Int16, i32 Int32, i64 Int64, u8 UInt8, u16 UInt16, u32 UInt32, u64 UInt64, id UUID, s String, fs FixedString(33), a Array(UInt8), t Tuple(UInt16, UInt32), d Date, dt DateTime('Europe/Moscow'), dt64 DateTime64(3, 'Europe/Moscow'), dec128 Decimal128(3), lc LowCardinality(String)) engine = MergeTree PARTITION BY (i8, i16, i32, i64, u8, u16, u32, u64, id, s, fs, a, t, d, dt, dt64, dec128, lc) order by tuple(); insert into tab values (-1, -1, -1, -1, -1, -1, -1, -1, '61f0c404-5cb3-11e7-907b-a6006ad3dba0', 'a', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', [1, 2, 3], (-1, -2), '2020-01-01', '2020-01-01 01:01:01', '2020-01-01 01:01:01', '123.456', 'a'); -- Here we check that partition id did not change. -- Different result means Backward Incompatible Change. Old partitions will not be accepted by new server. diff --git a/tests/queries/0_stateless/01901_test_attach_partition_from.sql b/tests/queries/0_stateless/01901_test_attach_partition_from.sql index 0ffa4cdecf2..c15edacc6c8 100644 --- a/tests/queries/0_stateless/01901_test_attach_partition_from.sql +++ b/tests/queries/0_stateless/01901_test_attach_partition_from.sql @@ -5,7 +5,7 @@ CREATE TABLE test_alter_attach_01901S (A Int64, D date) ENGINE = MergeTree PARTI INSERT INTO test_alter_attach_01901S VALUES (1, '2020-01-01'); CREATE TABLE test_alter_attach_01901D (A Int64, D date) -Engine=ReplicatedMergeTree('/clickhouse/tables/test_alter_attach_01901D', 'r1') +Engine=ReplicatedMergeTree('/clickhouse/tables/{database}/test_alter_attach_01901D', 'r1') PARTITION BY D ORDER BY A; ALTER TABLE test_alter_attach_01901D ATTACH PARTITION '2020-01-01' FROM test_alter_attach_01901S; diff --git a/tests/queries/0_stateless/01902_table_function_merge_db_repr.reference b/tests/queries/0_stateless/01902_table_function_merge_db_repr.reference new file mode 100644 index 00000000000..4fd27ceec77 --- /dev/null +++ b/tests/queries/0_stateless/01902_table_function_merge_db_repr.reference @@ -0,0 +1,195 @@ +CREATE TABLE t_merge as 01902_db.t ENGINE=Merge(REGEXP(^01902_db), ^t) +SELECT _database, _table, n FROM 01902_db.t_merge ORDER BY _database, _table, n +01902_db t 0 +01902_db t 1 +01902_db t 2 +01902_db t 3 +01902_db t 4 +01902_db t 5 +01902_db t 6 +01902_db t 7 +01902_db t 8 +01902_db t 9 +01902_db1 t1 0 +01902_db1 t1 1 +01902_db1 t1 2 +01902_db1 t1 3 +01902_db1 t1 4 +01902_db1 t1 5 +01902_db1 t1 6 +01902_db1 t1 7 +01902_db1 t1 8 +01902_db1 t1 9 +01902_db2 t2 0 +01902_db2 t2 1 +01902_db2 t2 2 +01902_db2 t2 3 +01902_db2 t2 4 +01902_db2 t2 5 +01902_db2 t2 6 +01902_db2 t2 7 +01902_db2 t2 8 +01902_db2 t2 9 +01902_db3 t3 0 +01902_db3 t3 1 +01902_db3 t3 2 +01902_db3 t3 3 +01902_db3 t3 4 +01902_db3 t3 5 +01902_db3 t3 6 +01902_db3 t3 7 +01902_db3 t3 8 +01902_db3 t3 9 +SHOW CREATE TABLE 01902_db.t_merge +CREATE TABLE `01902_db`.t_merge\n(\n `n` Int8\n)\nENGINE = Merge(REGEXP(\'^01902_db\'), \'^t\') +SELECT _database, _table, n FROM merge(REGEXP(^01902_db), ^t) ORDER BY _database, _table, n +01902_db t 0 +01902_db t 1 +01902_db t 2 +01902_db t 3 +01902_db t 4 +01902_db t 5 +01902_db t 6 +01902_db t 7 +01902_db t 8 +01902_db t 9 +01902_db t_merge 0 +01902_db t_merge 0 +01902_db t_merge 0 +01902_db t_merge 0 +01902_db t_merge 1 +01902_db t_merge 1 +01902_db t_merge 1 +01902_db t_merge 1 +01902_db t_merge 2 +01902_db t_merge 2 +01902_db t_merge 2 +01902_db t_merge 2 +01902_db t_merge 3 +01902_db t_merge 3 +01902_db t_merge 3 +01902_db t_merge 3 +01902_db t_merge 4 +01902_db t_merge 4 +01902_db t_merge 4 +01902_db t_merge 4 +01902_db t_merge 5 +01902_db t_merge 5 +01902_db t_merge 5 +01902_db t_merge 5 +01902_db t_merge 6 +01902_db t_merge 6 +01902_db t_merge 6 +01902_db t_merge 6 +01902_db t_merge 7 +01902_db t_merge 7 +01902_db t_merge 7 +01902_db t_merge 7 +01902_db t_merge 8 +01902_db t_merge 8 +01902_db t_merge 8 +01902_db t_merge 8 +01902_db t_merge 9 +01902_db t_merge 9 +01902_db t_merge 9 +01902_db t_merge 9 +01902_db1 t1 0 +01902_db1 t1 1 +01902_db1 t1 2 +01902_db1 t1 3 +01902_db1 t1 4 +01902_db1 t1 5 +01902_db1 t1 6 +01902_db1 t1 7 +01902_db1 t1 8 +01902_db1 t1 9 +01902_db2 t2 0 +01902_db2 t2 1 +01902_db2 t2 2 +01902_db2 t2 3 +01902_db2 t2 4 +01902_db2 t2 5 +01902_db2 t2 6 +01902_db2 t2 7 +01902_db2 t2 8 +01902_db2 t2 9 +01902_db3 t3 0 +01902_db3 t3 1 +01902_db3 t3 2 +01902_db3 t3 3 +01902_db3 t3 4 +01902_db3 t3 5 +01902_db3 t3 6 +01902_db3 t3 7 +01902_db3 t3 8 +01902_db3 t3 9 +SELECT _database, _table, n FROM 01902_db.t_merge WHERE _database = 01902_db1 ORDER BY _database, _table, n +01902_db1 t1 0 +01902_db1 t1 1 +01902_db1 t1 2 +01902_db1 t1 3 +01902_db1 t1 4 +01902_db1 t1 5 +01902_db1 t1 6 +01902_db1 t1 7 +01902_db1 t1 8 +01902_db1 t1 9 +SELECT _database, _table, n FROM 01902_db.t_merge WHERE _table = t1 ORDER BY _database, _table, n +01902_db1 t1 0 +01902_db1 t1 1 +01902_db1 t1 2 +01902_db1 t1 3 +01902_db1 t1 4 +01902_db1 t1 5 +01902_db1 t1 6 +01902_db1 t1 7 +01902_db1 t1 8 +01902_db1 t1 9 +CREATE TABLE t_merge1 as 01902_db.t ENGINE=Merge(01902_db, ^t$) +SELECT _database, _table, n FROM 01902_db.t_merge1 ORDER BY _database, _table, n +01902_db t 0 +01902_db t 1 +01902_db t 2 +01902_db t 3 +01902_db t 4 +01902_db t 5 +01902_db t 6 +01902_db t 7 +01902_db t 8 +01902_db t 9 +SELECT _database, _table, n FROM merge(01902_db, ^t$) ORDER BY _database, _table, n +01902_db t 0 +01902_db t 1 +01902_db t 2 +01902_db t 3 +01902_db t 4 +01902_db t 5 +01902_db t 6 +01902_db t 7 +01902_db t 8 +01902_db t 9 +CREATE TABLE t_merge_1 as 01902_db.t ENGINE=Merge(currentDatabase(), ^t) +SELECT _database, _table, n FROM 01902_db.t_merge_1 ORDER BY _database, _table, n +01902_db1 t1 0 +01902_db1 t1 1 +01902_db1 t1 2 +01902_db1 t1 3 +01902_db1 t1 4 +01902_db1 t1 5 +01902_db1 t1 6 +01902_db1 t1 7 +01902_db1 t1 8 +01902_db1 t1 9 +SHOW CREATE TABLE 01902_db.t_merge_1 +CREATE TABLE `01902_db`.t_merge_1\n(\n `n` Int8\n)\nENGINE = Merge(\'01902_db1\', \'^t\') +SELECT _database, _table, n FROM merge(currentDatabase(), ^t) ORDER BY _database, _table, n +01902_db1 t1 0 +01902_db1 t1 1 +01902_db1 t1 2 +01902_db1 t1 3 +01902_db1 t1 4 +01902_db1 t1 5 +01902_db1 t1 6 +01902_db1 t1 7 +01902_db1 t1 8 +01902_db1 t1 9 diff --git a/tests/queries/0_stateless/01902_table_function_merge_db_repr.sql b/tests/queries/0_stateless/01902_table_function_merge_db_repr.sql new file mode 100644 index 00000000000..3aabf1a1f36 --- /dev/null +++ b/tests/queries/0_stateless/01902_table_function_merge_db_repr.sql @@ -0,0 +1,66 @@ +DROP DATABASE IF EXISTS 01902_db; +DROP DATABASE IF EXISTS 01902_db1; +DROP DATABASE IF EXISTS 01902_db2; +DROP DATABASE IF EXISTS 01902_db3; + +CREATE DATABASE 01902_db; +CREATE DATABASE 01902_db1; +CREATE DATABASE 01902_db2; +CREATE DATABASE 01902_db3; + +CREATE TABLE 01902_db.t (n Int8) ENGINE=MergeTree ORDER BY n; +CREATE TABLE 01902_db1.t1 (n Int8) ENGINE=MergeTree ORDER BY n; +CREATE TABLE 01902_db2.t2 (n Int8) ENGINE=MergeTree ORDER BY n; +CREATE TABLE 01902_db3.t3 (n Int8) ENGINE=MergeTree ORDER BY n; + +INSERT INTO 01902_db.t SELECT * FROM numbers(10); +INSERT INTO 01902_db1.t1 SELECT * FROM numbers(10); +INSERT INTO 01902_db2.t2 SELECT * FROM numbers(10); +INSERT INTO 01902_db3.t3 SELECT * FROM numbers(10); + +SELECT 'CREATE TABLE t_merge as 01902_db.t ENGINE=Merge(REGEXP(^01902_db), ^t)'; +CREATE TABLE 01902_db.t_merge as 01902_db.t ENGINE=Merge(REGEXP('^01902_db'), '^t'); + +SELECT 'SELECT _database, _table, n FROM 01902_db.t_merge ORDER BY _database, _table, n'; +SELECT _database, _table, n FROM 01902_db.t_merge ORDER BY _database, _table, n; + +SELECT 'SHOW CREATE TABLE 01902_db.t_merge'; +SHOW CREATE TABLE 01902_db.t_merge; + +SELECT 'SELECT _database, _table, n FROM merge(REGEXP(^01902_db), ^t) ORDER BY _database, _table, n'; +SELECT _database, _table, n FROM merge(REGEXP('^01902_db'), '^t') ORDER BY _database, _table, n; + +SELECT 'SELECT _database, _table, n FROM 01902_db.t_merge WHERE _database = 01902_db1 ORDER BY _database, _table, n'; +SELECT _database, _table, n FROM 01902_db.t_merge WHERE _database = '01902_db1' ORDER BY _database, _table, n; + +SELECT 'SELECT _database, _table, n FROM 01902_db.t_merge WHERE _table = t1 ORDER BY _database, _table, n'; +SELECT _database, _table, n FROM 01902_db.t_merge WHERE _table = 't1' ORDER BY _database, _table, n; + +-- not regexp +SELECT 'CREATE TABLE t_merge1 as 01902_db.t ENGINE=Merge(01902_db, ^t$)'; +CREATE TABLE 01902_db.t_merge1 as 01902_db.t ENGINE=Merge('01902_db', '^t$'); + +SELECT 'SELECT _database, _table, n FROM 01902_db.t_merge1 ORDER BY _database, _table, n'; +SELECT _database, _table, n FROM 01902_db.t_merge1 ORDER BY _database, _table, n; + +SELECT 'SELECT _database, _table, n FROM merge(01902_db, ^t$) ORDER BY _database, _table, n'; +SELECT _database, _table, n FROM merge('01902_db', '^t$') ORDER BY _database, _table, n; + +USE 01902_db1; + +SELECT 'CREATE TABLE t_merge_1 as 01902_db.t ENGINE=Merge(currentDatabase(), ^t)'; +CREATE TABLE 01902_db.t_merge_1 as 01902_db.t ENGINE=Merge(currentDatabase(), '^t'); + +SELECT 'SELECT _database, _table, n FROM 01902_db.t_merge_1 ORDER BY _database, _table, n'; +SELECT _database, _table, n FROM 01902_db.t_merge_1 ORDER BY _database, _table, n; + +SELECT 'SHOW CREATE TABLE 01902_db.t_merge_1'; +SHOW CREATE TABLE 01902_db.t_merge_1; + +SELECT 'SELECT _database, _table, n FROM merge(currentDatabase(), ^t) ORDER BY _database, _table, n'; +SELECT _database, _table, n FROM merge(currentDatabase(), '^t') ORDER BY _database, _table, n; + +DROP DATABASE 01902_db; +DROP DATABASE 01902_db1; +DROP DATABASE 01902_db2; +DROP DATABASE 01902_db3; diff --git a/tests/queries/0_stateless/01903_correct_block_size_prediction_with_default.reference b/tests/queries/0_stateless/01903_correct_block_size_prediction_with_default.reference new file mode 100644 index 00000000000..b70a1cb7c75 --- /dev/null +++ b/tests/queries/0_stateless/01903_correct_block_size_prediction_with_default.reference @@ -0,0 +1,3 @@ +8 +4 +4 diff --git a/tests/queries/0_stateless/01903_correct_block_size_prediction_with_default.sql b/tests/queries/0_stateless/01903_correct_block_size_prediction_with_default.sql new file mode 100644 index 00000000000..7aa1b0112a6 --- /dev/null +++ b/tests/queries/0_stateless/01903_correct_block_size_prediction_with_default.sql @@ -0,0 +1,11 @@ +CREATE TABLE test_extract(str String, arr Array(Array(String)) ALIAS extractAllGroupsHorizontal(str, '\\W(\\w+)=("[^"]*?"|[^",}]*)')) ENGINE=MergeTree() PARTITION BY tuple() ORDER BY tuple(); + +INSERT INTO test_extract (str) WITH range(8) as range_arr, arrayMap(x-> concat(toString(x),'Id'), range_arr) as key, arrayMap(x -> rand() % 8, range_arr) as val, arrayStringConcat(arrayMap((x,y) -> concat(x,'=',toString(y)), key, val),',') as str SELECT str FROM numbers(500000); + +ALTER TABLE test_extract ADD COLUMN `15Id` Nullable(UInt16) DEFAULT toUInt16OrNull(arrayFirst((v, k) -> (k = '4Id'), arr[2], arr[1])); + +SELECT uniq(15Id) FROM test_extract SETTINGS max_threads=1, max_memory_usage=100000000; + +SELECT uniq(15Id) FROM test_extract PREWHERE 15Id < 4 SETTINGS max_threads=1, max_memory_usage=100000000; + +SELECT uniq(15Id) FROM test_extract WHERE 15Id < 4 SETTINGS max_threads=1, max_memory_usage=100000000; diff --git a/tests/queries/0_stateless/01905_to_json_string.sql b/tests/queries/0_stateless/01905_to_json_string.sql index fe8a2407f3d..80d9c2e2625 100644 --- a/tests/queries/0_stateless/01905_to_json_string.sql +++ b/tests/queries/0_stateless/01905_to_json_string.sql @@ -1,10 +1,17 @@ -drop table if exists t; - -create table t engine Memory as select * from generateRandom('a Array(Int8), b UInt32, c Nullable(String), d Decimal32(4), e Nullable(Enum16(\'h\' = 1, \'w\' = 5 , \'o\' = -200)), f Float64, g Tuple(Date, DateTime, DateTime64, UUID), h FixedString(2), i Array(Nullable(UUID))', 10, 5, 3) limit 2; +create temporary table t engine Memory as select * from generateRandom( +$$ + a Array(Int8), + b UInt32, + c Nullable(String), + d Decimal32(4), + e Nullable(Enum16('h' = 1, 'w' = 5 , 'o' = -200)), + f Float64, + g Tuple(Date, DateTime('Europe/Moscow'), DateTime64(3, 'Europe/Moscow'), UUID), + h FixedString(2), + i Array(Nullable(UUID)) +$$, 10, 5, 3) limit 2; select * apply toJSONString from t; -drop table t; - set allow_experimental_map_type = 1; select toJSONString(map('1234', '5678')); diff --git a/tests/queries/0_stateless/01906_h3_to_geo.reference b/tests/queries/0_stateless/01906_h3_to_geo.reference new file mode 100644 index 00000000000..93e8600576c --- /dev/null +++ b/tests/queries/0_stateless/01906_h3_to_geo.reference @@ -0,0 +1,32 @@ +(-173.6412167681162,-14.130272474941535) +(59.48137613600854,58.020407687755686) +(172.68095885060296,-83.6576608516349) +(-94.46556851304558,-69.1999982492279) +(-8.188263637093279,-55.856179102736284) +(77.25594891852249,47.39278564360122) +(135.11348004704536,36.60778126579667) +(39.28534828967223,49.07710003066973) +(124.71163478198051,-27.481172161567258) +(-147.4887686066785,76.73237945824442) +(86.63291906118863,-25.52526285188784) +(23.27751790712118,13.126101362212724) +(-70.40163237204142,-63.12562536833242) +(15.642428355535966,40.285813505163574) +(-76.53411447979884,54.5560449693637) +(8.19906334981474,67.69370966550179) +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok diff --git a/tests/queries/0_stateless/01906_h3_to_geo.sql b/tests/queries/0_stateless/01906_h3_to_geo.sql new file mode 100644 index 00000000000..aa6ecca1754 --- /dev/null +++ b/tests/queries/0_stateless/01906_h3_to_geo.sql @@ -0,0 +1,61 @@ +DROP TABLE IF EXISTS h3_indexes; + +CREATE TABLE h3_indexes (h3_index UInt64) ENGINE = Memory; + +-- Random geo coordinates were generated using the H3 tool: https://github.com/ClickHouse-Extras/h3/blob/master/src/apps/testapps/mkRandGeo.c at various resolutions from 0 to 15. +-- Corresponding H3 index values were in turn generated with those geo coordinates using `geoToH3(lon, lat, res)` ClickHouse function for the following test. + +INSERT INTO h3_indexes VALUES (579205133326352383); +INSERT INTO h3_indexes VALUES (581263419093549055); +INSERT INTO h3_indexes VALUES (589753847883235327); +INSERT INTO h3_indexes VALUES (594082350283882495); +INSERT INTO h3_indexes VALUES (598372386957426687); +INSERT INTO h3_indexes VALUES (599542359671177215); +INSERT INTO h3_indexes VALUES (604296355086598143); +INSERT INTO h3_indexes VALUES (608785214872748031); +INSERT INTO h3_indexes VALUES (615732192485572607); +INSERT INTO h3_indexes VALUES (617056794467368959); +INSERT INTO h3_indexes VALUES (624586477873168383); +INSERT INTO h3_indexes VALUES (627882919484481535); +INSERT INTO h3_indexes VALUES (634600058503392255); +INSERT INTO h3_indexes VALUES (635544851677385791); +INSERT INTO h3_indexes VALUES (639763125756281263); +INSERT INTO h3_indexes VALUES (644178757620501158); + + +SELECT h3ToGeo(h3_index) FROM h3_indexes ORDER BY h3_index; + +DROP TABLE h3_indexes; + +DROP TABLE IF EXISTS h3_geo; + +-- compare if the results of h3ToGeo and geoToH3 are the same + +CREATE TABLE h3_geo(lat Float64, lon Float64, res UInt8) ENGINE = Memory; + +INSERT INTO h3_geo VALUES (-173.6412167681162, -14.130272474941535, 0); +INSERT INTO h3_geo VALUES (59.48137613600854, 58.020407687755686, 1); +INSERT INTO h3_geo VALUES (172.68095885060296, -83.6576608516349, 2); +INSERT INTO h3_geo VALUES (-94.46556851304558, -69.1999982492279, 3); +INSERT INTO h3_geo VALUES (-8.188263637093279, -55.856179102736284, 4); +INSERT INTO h3_geo VALUES (77.25594891852249, 47.39278564360122, 5); +INSERT INTO h3_geo VALUES (135.11348004704536, 36.60778126579667, 6); +INSERT INTO h3_geo VALUES (39.28534828967223, 49.07710003066973, 7); +INSERT INTO h3_geo VALUES (124.71163478198051, -27.481172161567258, 8); +INSERT INTO h3_geo VALUES (-147.4887686066785, 76.73237945824442, 9); +INSERT INTO h3_geo VALUES (86.63291906118863, -25.52526285188784, 10); +INSERT INTO h3_geo VALUES (23.27751790712118, 13.126101362212724, 11); +INSERT INTO h3_geo VALUES (-70.40163237204142, -63.12562536833242, 12); +INSERT INTO h3_geo VALUES (15.642428355535966, 40.285813505163574, 13); +INSERT INTO h3_geo VALUES (-76.53411447979884, 54.5560449693637, 14); +INSERT INTO h3_geo VALUES (8.19906334981474, 67.69370966550179, 15); + +SELECT result FROM ( + SELECT + (lat, lon) AS input_geo, + h3ToGeo(geoToH3(lat, lon, res)) AS output_geo, + if(input_geo = output_geo, 'ok', 'fail') AS result + FROM h3_geo +); + +DROP TABLE h3_geo; diff --git a/tests/queries/0_stateless/01913_if_int_decimal.reference b/tests/queries/0_stateless/01913_if_int_decimal.reference index c54e91df3e4..5357a4ab725 100644 --- a/tests/queries/0_stateless/01913_if_int_decimal.reference +++ b/tests/queries/0_stateless/01913_if_int_decimal.reference @@ -1,3 +1,3 @@ -2.0000000000 -1.0000000000 -2.0000000000 +2 +1 +2 diff --git a/tests/queries/0_stateless/01915_create_or_replace_dictionary.sql b/tests/queries/0_stateless/01915_create_or_replace_dictionary.sql index c9df6114ec9..1520dd41973 100644 --- a/tests/queries/0_stateless/01915_create_or_replace_dictionary.sql +++ b/tests/queries/0_stateless/01915_create_or_replace_dictionary.sql @@ -1,51 +1,51 @@ -DROP DATABASE IF EXISTS 01915_db; -CREATE DATABASE 01915_db ENGINE=Atomic; +DROP DATABASE IF EXISTS test_01915_db; +CREATE DATABASE test_01915_db ENGINE=Atomic; -DROP TABLE IF EXISTS 01915_db.test_source_table_1; -CREATE TABLE 01915_db.test_source_table_1 +DROP TABLE IF EXISTS test_01915_db.test_source_table_1; +CREATE TABLE test_01915_db.test_source_table_1 ( id UInt64, value String ) ENGINE=TinyLog; -INSERT INTO 01915_db.test_source_table_1 VALUES (0, 'Value0'); +INSERT INTO test_01915_db.test_source_table_1 VALUES (0, 'Value0'); -DROP DICTIONARY IF EXISTS 01915_db.test_dictionary; -CREATE OR REPLACE DICTIONARY 01915_db.test_dictionary +DROP DICTIONARY IF EXISTS test_01915_db.test_dictionary; +CREATE OR REPLACE DICTIONARY test_01915_db.test_dictionary ( id UInt64, value String ) PRIMARY KEY id LAYOUT(DIRECT()) -SOURCE(CLICKHOUSE(DB '01915_db' TABLE 'test_source_table_1')); +SOURCE(CLICKHOUSE(DB 'test_01915_db' TABLE 'test_source_table_1')); -SELECT * FROM 01915_db.test_dictionary; +SELECT * FROM test_01915_db.test_dictionary; -DROP TABLE IF EXISTS 01915_db.test_source_table_2; -CREATE TABLE 01915_db.test_source_table_2 +DROP TABLE IF EXISTS test_01915_db.test_source_table_2; +CREATE TABLE test_01915_db.test_source_table_2 ( id UInt64, value_1 String ) ENGINE=TinyLog; -INSERT INTO 01915_db.test_source_table_2 VALUES (0, 'Value1'); +INSERT INTO test_01915_db.test_source_table_2 VALUES (0, 'Value1'); -CREATE OR REPLACE DICTIONARY 01915_db.test_dictionary +CREATE OR REPLACE DICTIONARY test_01915_db.test_dictionary ( id UInt64, value_1 String ) PRIMARY KEY id LAYOUT(HASHED()) -SOURCE(CLICKHOUSE(DB '01915_db' TABLE 'test_source_table_2')) +SOURCE(CLICKHOUSE(DB 'test_01915_db' TABLE 'test_source_table_2')) LIFETIME(0); -SELECT * FROM 01915_db.test_dictionary; +SELECT * FROM test_01915_db.test_dictionary; -DROP DICTIONARY 01915_db.test_dictionary; +DROP DICTIONARY test_01915_db.test_dictionary; -DROP TABLE 01915_db.test_source_table_1; -DROP TABLE 01915_db.test_source_table_2; +DROP TABLE test_01915_db.test_source_table_1; +DROP TABLE test_01915_db.test_source_table_2; -DROP DATABASE 01915_db; +DROP DATABASE test_01915_db; diff --git a/tests/queries/0_stateless/01915_json_extract_raw_string.reference b/tests/queries/0_stateless/01915_json_extract_raw_string.reference new file mode 100644 index 00000000000..839cb33f5f2 --- /dev/null +++ b/tests/queries/0_stateless/01915_json_extract_raw_string.reference @@ -0,0 +1 @@ +('123','456','[7,8,9]') diff --git a/tests/queries/0_stateless/01915_json_extract_raw_string.sql b/tests/queries/0_stateless/01915_json_extract_raw_string.sql new file mode 100644 index 00000000000..6ba94ac6dfd --- /dev/null +++ b/tests/queries/0_stateless/01915_json_extract_raw_string.sql @@ -0,0 +1 @@ +select JSONExtract('{"a": "123", "b": 456, "c": [7, 8, 9]}', 'Tuple(a String, b String, c String)'); diff --git a/tests/queries/0_stateless/01917_distinct_on.reference b/tests/queries/0_stateless/01917_distinct_on.reference new file mode 100644 index 00000000000..b5b231e5786 --- /dev/null +++ b/tests/queries/0_stateless/01917_distinct_on.reference @@ -0,0 +1,8 @@ +1 1 1 +2 2 2 +1 2 2 +1 1 1 +2 2 2 +1 2 2 +1 1 1 +2 2 2 diff --git a/tests/queries/0_stateless/01917_distinct_on.sql b/tests/queries/0_stateless/01917_distinct_on.sql new file mode 100644 index 00000000000..ae528b6e838 --- /dev/null +++ b/tests/queries/0_stateless/01917_distinct_on.sql @@ -0,0 +1,23 @@ +DROP TABLE IF EXISTS t1; + +CREATE TABLE t1 (`a` UInt32, `b` UInt32, `c` UInt32 ) ENGINE = Memory; +INSERT INTO t1 VALUES (1, 1, 1), (1, 1, 2), (2, 2, 2), (1, 2, 2); + +SELECT DISTINCT ON (a, b) a, b, c FROM t1; +SELECT DISTINCT ON (a, b) * FROM t1; +SELECT DISTINCT ON (a) * FROM t1; + +-- fuzzer will fail, enable when fixed +-- SELECT DISTINCT ON (a, b) a, b, c FROM t1 LIMIT 1 BY a, b; -- { clientError 62 } + +-- SELECT DISTINCT ON a, b a, b FROM t1; -- { clientError 62 } +-- SELECT DISTINCT ON a a, b FROM t1; -- { clientError 62 } + +-- "Code: 47. DB::Exception: Missing columns: 'DISTINCT'" - error can be better +-- SELECT DISTINCT ON (a, b) DISTINCT a, b FROM t1; -- { serverError 47 } +-- SELECT DISTINCT DISTINCT ON (a, b) a, b FROM t1; -- { clientError 62 } + +-- SELECT ALL DISTINCT ON (a, b) a, b FROM t1; -- { clientError 62 } +-- SELECT DISTINCT ON (a, b) ALL a, b FROM t1; -- { clientError 62 } + +DROP TABLE IF EXISTS t1; diff --git a/tests/queries/0_stateless/01920_async_drain_connections.reference b/tests/queries/0_stateless/01920_async_drain_connections.reference new file mode 100644 index 00000000000..aa47d0d46d4 --- /dev/null +++ b/tests/queries/0_stateless/01920_async_drain_connections.reference @@ -0,0 +1,2 @@ +0 +0 diff --git a/tests/queries/0_stateless/01920_async_drain_connections.sql b/tests/queries/0_stateless/01920_async_drain_connections.sql new file mode 100644 index 00000000000..827ca13fc1a --- /dev/null +++ b/tests/queries/0_stateless/01920_async_drain_connections.sql @@ -0,0 +1,6 @@ +drop table if exists t; + +create table t (number UInt64) engine = Distributed(test_cluster_two_shards, system, numbers); +select * from t where number = 0 limit 2 settings sleep_in_receive_cancel_ms = 10000, max_execution_time = 5; + +drop table t; diff --git a/tests/queries/0_stateless/01921_datatype_date32.reference b/tests/queries/0_stateless/01921_datatype_date32.reference new file mode 100644 index 00000000000..2114f6f6b1e --- /dev/null +++ b/tests/queries/0_stateless/01921_datatype_date32.reference @@ -0,0 +1,285 @@ +1925-01-01 +1925-01-01 +2282-12-31 +2283-11-11 +2021-06-22 +-------toYear--------- +1925 +1925 +2282 +2283 +2021 +-------toMonth--------- +1 +1 +12 +11 +6 +-------toQuarter--------- +1 +1 +4 +4 +2 +-------toDayOfMonth--------- +1 +1 +31 +11 +22 +-------toDayOfWeek--------- +4 +4 +7 +7 +2 +-------toDayOfYear--------- +1 +1 +365 +315 +173 +-------toHour--------- +-------toMinute--------- +-------toSecond--------- +-------toStartOfDay--------- +2061-02-06 07:28:16 +2061-02-06 07:28:16 +2010-10-17 12:03:28 +2011-08-28 12:03:28 +2021-06-22 00:00:00 +-------toMonday--------- +2104-06-04 +2104-06-04 +2103-07-21 +2104-05-31 +2021-06-21 +-------toISOWeek--------- +1 +1 +52 +45 +25 +-------toISOYear--------- +1925 +1925 +2282 +2283 +2021 +-------toWeek--------- +0 +0 +53 +45 +25 +-------toYearWeek--------- +192452 +192452 +228253 +228345 +202125 +-------toStartOfWeek--------- +2104-06-03 +2104-06-03 +2103-07-27 +2104-06-06 +2021-06-20 +-------toStartOfMonth--------- +2104-06-07 +2104-06-07 +2103-06-27 +2104-05-27 +2021-06-01 +-------toStartOfQuarter--------- +2104-06-07 +2104-06-07 +2103-04-27 +2104-04-26 +2021-04-01 +-------toStartOfYear--------- +2104-06-07 +2104-06-07 +2102-07-28 +2103-07-28 +2021-01-01 +-------toStartOfSecond--------- +-------toStartOfMinute--------- +-------toStartOfFiveMinute--------- +-------toStartOfTenMinutes--------- +-------toStartOfFifteenMinutes--------- +-------toStartOfHour--------- +-------toStartOfISOYear--------- +2104-06-04 +2104-06-04 +2102-07-29 +2103-07-28 +2021-01-04 +-------toRelativeYearNum--------- +1925 +1925 +2282 +2283 +2021 +-------toRelativeQuarterNum--------- +7700 +7700 +9131 +9135 +8085 +-------toRelativeMonthNum--------- +23101 +23101 +27396 +27407 +24258 +-------toRelativeWeekNum--------- +63189 +63189 +16331 +63188 +2686 +-------toRelativeDayNum--------- +49100 +49100 +48784 +49099 +18800 +-------toRelativeHourNum--------- +4294572851 +4294572851 +2743677 +2751237 +451197 +-------toRelativeMinuteNum--------- +4271299336 +4271299336 +164620620 +165074220 +27071820 +-------toRelativeSecondNum--------- +2874889696 +2874889696 +1287302608 +1314518608 +1624309200 +-------toTime--------- +-------toYYYYMM--------- +192501 +192501 +228212 +228311 +202106 +-------toYYYYMMDD--------- +19250101 +19250101 +22821231 +22831111 +20210622 +-------toYYYYMMDDhhmmss--------- +19250101000000 +19250101000000 +22821231000000 +22831111000000 +20210622000000 +-------addSeconds--------- +1925-01-01 01:00:00.000 +1925-01-01 01:00:00.000 +2282-12-31 01:00:00.000 +2283-11-11 01:00:00.000 +2021-06-22 01:00:00.000 +-------addMinutes--------- +1925-01-01 01:00:00.000 +1925-01-01 01:00:00.000 +2282-12-31 01:00:00.000 +2283-11-11 01:00:00.000 +2021-06-22 01:00:00.000 +-------addHours--------- +1925-01-01 01:00:00.000 +1925-01-01 01:00:00.000 +2282-12-31 01:00:00.000 +2283-11-11 01:00:00.000 +2021-06-22 01:00:00.000 +-------addDays--------- +1925-01-08 +1925-01-08 +2283-01-07 +1925-01-07 +2021-06-29 +-------addWeeks--------- +1925-01-08 +1925-01-08 +2283-01-07 +1925-01-07 +2021-06-29 +-------addMonths--------- +1925-02-01 +1925-02-01 +2283-01-31 +2283-11-11 +2021-07-22 +-------addQuarters--------- +1925-04-01 +1925-04-01 +2283-03-31 +1925-01-01 +2021-09-22 +-------addYears--------- +1926-01-01 +1926-01-01 +2283-11-11 +1925-01-01 +2022-06-22 +-------subtractSeconds--------- +1925-01-01 00:00:00.000 +1925-01-01 00:00:00.000 +2282-12-30 23:00:00.000 +2283-11-10 23:00:00.000 +2021-06-21 23:00:00.000 +-------subtractMinutes--------- +1925-01-01 00:00:00.000 +1925-01-01 00:00:00.000 +2282-12-30 23:00:00.000 +2283-11-10 23:00:00.000 +2021-06-21 23:00:00.000 +-------subtractHours--------- +1925-01-01 00:00:00.000 +1925-01-01 00:00:00.000 +2282-12-30 23:00:00.000 +2283-11-10 23:00:00.000 +2021-06-21 23:00:00.000 +-------subtractDays--------- +2283-11-05 +2283-11-05 +2282-12-24 +2283-11-04 +2021-06-15 +-------subtractWeeks--------- +2283-11-05 +2283-11-05 +2282-12-24 +2283-11-04 +2021-06-15 +-------subtractMonths--------- +1925-01-01 +1925-01-01 +2282-11-30 +2283-10-11 +2021-05-22 +-------subtractQuarters--------- +1925-01-01 +1925-01-01 +2282-09-30 +2283-08-11 +2021-03-22 +-------subtractYears--------- +1925-01-01 +1925-01-01 +2281-12-31 +2282-11-11 +2020-06-22 +-------toDate32--------- +1925-01-01 2000-01-01 +1925-01-01 1925-01-01 +1925-01-01 \N +1925-01-01 +\N diff --git a/tests/queries/0_stateless/01921_datatype_date32.sql b/tests/queries/0_stateless/01921_datatype_date32.sql new file mode 100644 index 00000000000..e01bdfeee8d --- /dev/null +++ b/tests/queries/0_stateless/01921_datatype_date32.sql @@ -0,0 +1,121 @@ +drop table if exists t1; +create table t1(x1 Date32) engine Memory; + +insert into t1 values ('1925-01-01'),('1924-01-01'),('2282-12-31'),('2283-12-31'),('2021-06-22'); + +select x1 from t1; +select '-------toYear---------'; +select toYear(x1) from t1; +select '-------toMonth---------'; +select toMonth(x1) from t1; +select '-------toQuarter---------'; +select toQuarter(x1) from t1; +select '-------toDayOfMonth---------'; +select toDayOfMonth(x1) from t1; +select '-------toDayOfWeek---------'; +select toDayOfWeek(x1) from t1; +select '-------toDayOfYear---------'; +select toDayOfYear(x1) from t1; +select '-------toHour---------'; +select toHour(x1) from t1; -- { serverError 43 } +select '-------toMinute---------'; +select toMinute(x1) from t1; -- { serverError 43 } +select '-------toSecond---------'; +select toSecond(x1) from t1; -- { serverError 43 } +select '-------toStartOfDay---------'; +select toStartOfDay(x1, 'Europe/Moscow') from t1; +select '-------toMonday---------'; +select toMonday(x1) from t1; +select '-------toISOWeek---------'; +select toISOWeek(x1) from t1; +select '-------toISOYear---------'; +select toISOYear(x1) from t1; +select '-------toWeek---------'; +select toWeek(x1) from t1; +select '-------toYearWeek---------'; +select toYearWeek(x1) from t1; +select '-------toStartOfWeek---------'; +select toStartOfWeek(x1) from t1; +select '-------toStartOfMonth---------'; +select toStartOfMonth(x1) from t1; +select '-------toStartOfQuarter---------'; +select toStartOfQuarter(x1) from t1; +select '-------toStartOfYear---------'; +select toStartOfYear(x1) from t1; +select '-------toStartOfSecond---------'; +select toStartOfSecond(x1) from t1; -- { serverError 43 } +select '-------toStartOfMinute---------'; +select toStartOfMinute(x1) from t1; -- { serverError 43 } +select '-------toStartOfFiveMinute---------'; +select toStartOfFiveMinute(x1) from t1; -- { serverError 43 } +select '-------toStartOfTenMinutes---------'; +select toStartOfTenMinutes(x1) from t1; -- { serverError 43 } +select '-------toStartOfFifteenMinutes---------'; +select toStartOfFifteenMinutes(x1) from t1; -- { serverError 43 } +select '-------toStartOfHour---------'; +select toStartOfHour(x1) from t1; -- { serverError 43 } +select '-------toStartOfISOYear---------'; +select toStartOfISOYear(x1) from t1; +select '-------toRelativeYearNum---------'; +select toRelativeYearNum(x1, 'Europe/Moscow') from t1; +select '-------toRelativeQuarterNum---------'; +select toRelativeQuarterNum(x1, 'Europe/Moscow') from t1; +select '-------toRelativeMonthNum---------'; +select toRelativeMonthNum(x1, 'Europe/Moscow') from t1; +select '-------toRelativeWeekNum---------'; +select toRelativeWeekNum(x1, 'Europe/Moscow') from t1; +select '-------toRelativeDayNum---------'; +select toRelativeDayNum(x1, 'Europe/Moscow') from t1; +select '-------toRelativeHourNum---------'; +select toRelativeHourNum(x1, 'Europe/Moscow') from t1; +select '-------toRelativeMinuteNum---------'; +select toRelativeMinuteNum(x1, 'Europe/Moscow') from t1; +select '-------toRelativeSecondNum---------'; +select toRelativeSecondNum(x1, 'Europe/Moscow') from t1; +select '-------toTime---------'; +select toTime(x1) from t1; -- { serverError 43 } +select '-------toYYYYMM---------'; +select toYYYYMM(x1) from t1; +select '-------toYYYYMMDD---------'; +select toYYYYMMDD(x1) from t1; +select '-------toYYYYMMDDhhmmss---------'; +select toYYYYMMDDhhmmss(x1) from t1; +select '-------addSeconds---------'; +select addSeconds(x1, 3600) from t1; +select '-------addMinutes---------'; +select addMinutes(x1, 60) from t1; +select '-------addHours---------'; +select addHours(x1, 1) from t1; +select '-------addDays---------'; +select addDays(x1, 7) from t1; +select '-------addWeeks---------'; +select addWeeks(x1, 1) from t1; +select '-------addMonths---------'; +select addMonths(x1, 1) from t1; +select '-------addQuarters---------'; +select addQuarters(x1, 1) from t1; +select '-------addYears---------'; +select addYears(x1, 1) from t1; +select '-------subtractSeconds---------'; +select subtractSeconds(x1, 3600) from t1; +select '-------subtractMinutes---------'; +select subtractMinutes(x1, 60) from t1; +select '-------subtractHours---------'; +select subtractHours(x1, 1) from t1; +select '-------subtractDays---------'; +select subtractDays(x1, 7) from t1; +select '-------subtractWeeks---------'; +select subtractWeeks(x1, 1) from t1; +select '-------subtractMonths---------'; +select subtractMonths(x1, 1) from t1; +select '-------subtractQuarters---------'; +select subtractQuarters(x1, 1) from t1; +select '-------subtractYears---------'; +select subtractYears(x1, 1) from t1; +select '-------toDate32---------'; +select toDate32('1925-01-01'), toDate32(toDate('2000-01-01')); +select toDate32OrZero('1924-01-01'), toDate32OrNull('1924-01-01'); +select toDate32OrZero(''), toDate32OrNull(''); +select (select toDate32OrZero('')); +select (select toDate32OrNull('')); + diff --git a/tests/queries/0_stateless/01925_broken_partition_id_zookeeper.reference b/tests/queries/0_stateless/01925_broken_partition_id_zookeeper.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/01925_broken_partition_id_zookeeper.sql b/tests/queries/0_stateless/01925_broken_partition_id_zookeeper.sql new file mode 100644 index 00000000000..07e490d0ce0 --- /dev/null +++ b/tests/queries/0_stateless/01925_broken_partition_id_zookeeper.sql @@ -0,0 +1,26 @@ +DROP TABLE IF EXISTS broken_partition; + +CREATE TABLE broken_partition +( + date Date, + key UInt64 +) +ENGINE = ReplicatedMergeTree('/clickhouse/test_01925_{database}/rmt', 'r1') +ORDER BY tuple() +PARTITION BY date; + +ALTER TABLE broken_partition DROP PARTITION ID '20210325_0_13241_6_12747'; --{serverError 248} + +ALTER TABLE broken_partition DROP PARTITION ID '20210325_0_13241_6_12747'; --{serverError 248} + +DROP TABLE IF EXISTS broken_partition; + +DROP TABLE IF EXISTS old_partition_key; + +CREATE TABLE old_partition_key (sd Date, dh UInt64, ak UInt32, ed Date) ENGINE=MergeTree(sd, dh, (ak, ed, dh), 8192); + +ALTER TABLE old_partition_key DROP PARTITION ID '20210325_0_13241_6_12747'; --{serverError 248} + +ALTER TABLE old_partition_key DROP PARTITION ID '202103'; + +DROP TABLE old_partition_key; diff --git a/tests/queries/0_stateless/01925_join_materialized_columns.reference b/tests/queries/0_stateless/01925_join_materialized_columns.reference new file mode 100644 index 00000000000..1dfda3c769b --- /dev/null +++ b/tests/queries/0_stateless/01925_join_materialized_columns.reference @@ -0,0 +1,24 @@ +2020-02-02 13:00:00 fact2 t1_val2 2020-02-05 13:00:00 fact2 t1_val2 +- +2020-02-02 13:00:00 fact2 t1_val2 2020-02-02 2020-02-05 13:00:00 fact2 t1_val2 2020-02-05 +- +2020-01-01 2020-01-01 +2020-02-02 2020-02-05 +- +2020-01-01 12:00:00 fact1 t1_val1 2020-01-01 12:00:00 fact1 t2_val2 +2020-01-01 13:00:00 fact3 t1_val3 2020-01-01 12:00:00 fact1 t2_val2 +- +2020-01-01 12:00:00 fact1 t1_val1 2020-01-01 12:00:00 fact1 t2_val2 +2020-01-01 13:00:00 fact3 t1_val3 2020-01-01 12:00:00 fact1 t2_val2 +- +2020-01-01 12:00:00 fact1 t1_val1 2019-01-01 12:00:00 fact4 t2_val2 +2020-01-01 12:00:00 fact1 t1_val1 2020-01-01 12:00:00 fact1 t2_val2 +2020-01-01 13:00:00 fact3 t1_val3 2019-01-01 12:00:00 fact4 t2_val2 +2020-01-01 13:00:00 fact3 t1_val3 2020-01-01 12:00:00 fact1 t2_val2 +- +2020-02-02 13:00:00 fact2 t1_val2 2020-02-05 13:00:00 fact2 t1_val2 +- +fact1t1_val1 fact1t2_val2 +fact2t1_val2 fact2t1_val2 +- +2020-02-02 13:00:00 2020-02-05 13:00:00 diff --git a/tests/queries/0_stateless/01925_join_materialized_columns.sql b/tests/queries/0_stateless/01925_join_materialized_columns.sql new file mode 100644 index 00000000000..6a34fef96ab --- /dev/null +++ b/tests/queries/0_stateless/01925_join_materialized_columns.sql @@ -0,0 +1,37 @@ +DROP TABLE IF EXISTS t1; +DROP TABLE IF EXISTS t2; + +CREATE TABLE t1 ( + time DateTime, foo String, dimension_1 String, + dt Date MATERIALIZED toDate(time), + dt1 Date MATERIALIZED toDayOfYear(time), + aliascol1 ALIAS foo || dimension_1 +) ENGINE = MergeTree() PARTITION BY toYYYYMM(dt) ORDER BY (dt, foo); + +CREATE TABLE t2 ( + time DateTime, bar String, dimension_2 String, + dt Date MATERIALIZED toDate(time), + dt2 Date MATERIALIZED toDayOfYear(time), + aliascol2 ALIAS bar || dimension_2 +) ENGINE = MergeTree() PARTITION BY toYYYYMM(dt) ORDER BY (dt, bar); + +INSERT INTO t1 VALUES ('2020-01-01 12:00:00', 'fact1', 't1_val1'), ('2020-02-02 13:00:00', 'fact2', 't1_val2'), ('2020-01-01 13:00:00', 'fact3', 't1_val3'); +INSERT INTO t2 VALUES ('2020-01-01 12:00:00', 'fact1', 't2_val2'), ('2020-02-05 13:00:00', 'fact2', 't1_val2'), ('2019-01-01 12:00:00', 'fact4', 't2_val2'); + +SELECT * FROM t1 JOIN t2 ON t1.foo = t2.bar WHERE t2.dt >= '2020-02-01'; +SELECT '-'; +SELECT t1.*, t1.dt, t2.*, t2.dt FROM t1 JOIN t2 ON t1.foo = t2.bar WHERE t2.dt >= '2020-02-01'; +SELECT '-'; +SELECT t1.dt, t2.dt FROM t1 JOIN t2 ON t1.foo = t2.bar ORDER BY t1.dt; +SELECT '-'; +SELECT * FROM t1 ALL JOIN t2 ON t1.dt = t2.dt ORDER BY t1.time, t2.time; +SELECT '-'; +SELECT * FROM t1 ALL JOIN t2 USING (dt) ORDER BY t1.time, t2.time; +SELECT '-'; +SELECT * FROM t1 JOIN t2 ON t1.dt1 = t2.dt2 ORDER BY t1.time, t2.time; +SELECT '-'; +SELECT * FROM t1 JOIN t2 ON t1.foo = t2.bar WHERE t2.aliascol2 == 'fact2t1_val2'; +SELECT '-'; +SELECT t1.aliascol1, t2.aliascol2 FROM t1 JOIN t2 ON t1.foo = t2.bar ORDER BY t1.time, t2.time; +SELECT '-'; +SELECT t1.time, t2.time FROM t1 JOIN t2 ON t1.aliascol1 = t2.aliascol2 ORDER BY t1.time, t2.time; diff --git a/tests/queries/0_stateless/01925_map_populate_series_on_map.reference b/tests/queries/0_stateless/01925_map_populate_series_on_map.reference new file mode 100644 index 00000000000..fd3d3b2450d --- /dev/null +++ b/tests/queries/0_stateless/01925_map_populate_series_on_map.reference @@ -0,0 +1,67 @@ +-- { echo } +drop table if exists map_test; +set allow_experimental_map_type = 1; +create table map_test engine=TinyLog() as (select (number + 1) as n, map(1, 1, number,2) as m from numbers(1, 5)); +select mapPopulateSeries(m) from map_test; +{1:1} +{1:1,2:2} +{1:1,2:0,3:2} +{1:1,2:0,3:0,4:2} +{1:1,2:0,3:0,4:0,5:2} +select mapPopulateSeries(m, toUInt64(3)) from map_test; +{1:1,2:0,3:0} +{1:1,2:2,3:0} +{1:1,2:0,3:2} +{1:1,2:0,3:0} +{1:1,2:0,3:0} +select mapPopulateSeries(m, toUInt64(10)) from map_test; +{1:1,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0,10:0} +{1:1,2:2,3:0,4:0,5:0,6:0,7:0,8:0,9:0,10:0} +{1:1,2:0,3:2,4:0,5:0,6:0,7:0,8:0,9:0,10:0} +{1:1,2:0,3:0,4:2,5:0,6:0,7:0,8:0,9:0,10:0} +{1:1,2:0,3:0,4:0,5:2,6:0,7:0,8:0,9:0,10:0} +select mapPopulateSeries(m, 1000) from map_test; -- { serverError 43 } +select mapPopulateSeries(m, n) from map_test; +{1:1,2:0} +{1:1,2:2,3:0} +{1:1,2:0,3:2,4:0} +{1:1,2:0,3:0,4:2,5:0} +{1:1,2:0,3:0,4:0,5:2,6:0} +drop table map_test; +select mapPopulateSeries(map(toUInt8(1), toUInt8(1), 2, 1)) as res, toTypeName(res); +{1:1,2:1} Map(UInt8, UInt8) +select mapPopulateSeries(map(toUInt16(1), toUInt16(1), 2, 1)) as res, toTypeName(res); +{1:1,2:1} Map(UInt16, UInt16) +select mapPopulateSeries(map(toUInt32(1), toUInt32(1), 2, 1)) as res, toTypeName(res); +{1:1,2:1} Map(UInt32, UInt32) +select mapPopulateSeries(map(toUInt64(1), toUInt64(1), 2, 1)) as res, toTypeName(res); +{1:1,2:1} Map(UInt64, UInt64) +select mapPopulateSeries(map(toUInt128(1), toUInt128(1), 2, 1)) as res, toTypeName(res); +{1:1,2:1} Map(UInt128, UInt128) +select mapPopulateSeries(map(toUInt256(1), toUInt256(1), 2, 1)) as res, toTypeName(res); +{1:1,2:1} Map(UInt256, UInt256) +select mapPopulateSeries(map(toInt8(1), toInt8(1), 2, 1)) as res, toTypeName(res); +{1:1,2:1} Map(Int16, Int16) +select mapPopulateSeries(map(toInt16(1), toInt16(1), 2, 1)) as res, toTypeName(res); +{1:1,2:1} Map(Int16, Int16) +select mapPopulateSeries(map(toInt32(1), toInt32(1), 2, 1)) as res, toTypeName(res); +{1:1,2:1} Map(Int32, Int32) +select mapPopulateSeries(map(toInt64(1), toInt64(1), 2, 1)) as res, toTypeName(res); +{1:1,2:1} Map(Int64, Int64) +select mapPopulateSeries(map(toInt128(1), toInt128(1), 2, 1)) as res, toTypeName(res); +{1:1,2:1} Map(Int128, Int128) +select mapPopulateSeries(map(toInt256(1), toInt256(1), 2, 1)) as res, toTypeName(res); +{1:1,2:1} Map(Int256, Int256) +select mapPopulateSeries(map(toInt8(-10), toInt8(1), 2, 1)) as res, toTypeName(res); +{-10:1,-9:0,-8:0,-7:0,-6:0,-5:0,-4:0,-3:0,-2:0,-1:0,0:0,1:0,2:1} Map(Int16, Int16) +select mapPopulateSeries(map(toInt16(-10), toInt16(1), 2, 1)) as res, toTypeName(res); +{-10:1,-9:0,-8:0,-7:0,-6:0,-5:0,-4:0,-3:0,-2:0,-1:0,0:0,1:0,2:1} Map(Int16, Int16) +select mapPopulateSeries(map(toInt32(-10), toInt32(1), 2, 1)) as res, toTypeName(res); +{-10:1,-9:0,-8:0,-7:0,-6:0,-5:0,-4:0,-3:0,-2:0,-1:0,0:0,1:0,2:1} Map(Int32, Int32) +select mapPopulateSeries(map(toInt64(-10), toInt64(1), 2, 1)) as res, toTypeName(res); +{-10:1,-9:0,-8:0,-7:0,-6:0,-5:0,-4:0,-3:0,-2:0,-1:0,0:0,1:0,2:1} Map(Int64, Int64) +select mapPopulateSeries(map(toInt64(-10), toInt64(1), 2, 1), toInt64(-5)) as res, toTypeName(res); +{-10:1,-9:0,-8:0,-7:0,-6:0,-5:0} Map(Int64, Int64) +select mapPopulateSeries(); -- { serverError 42 } +select mapPopulateSeries('asdf'); -- { serverError 43 } +select mapPopulateSeries(map('1', 1, '2', 1)) as res, toTypeName(res); -- { serverError 43 } diff --git a/tests/queries/0_stateless/01925_map_populate_series_on_map.sql b/tests/queries/0_stateless/01925_map_populate_series_on_map.sql new file mode 100644 index 00000000000..ac78280ec1d --- /dev/null +++ b/tests/queries/0_stateless/01925_map_populate_series_on_map.sql @@ -0,0 +1,36 @@ +-- { echo } +drop table if exists map_test; +set allow_experimental_map_type = 1; +create table map_test engine=TinyLog() as (select (number + 1) as n, map(1, 1, number,2) as m from numbers(1, 5)); + +select mapPopulateSeries(m) from map_test; +select mapPopulateSeries(m, toUInt64(3)) from map_test; +select mapPopulateSeries(m, toUInt64(10)) from map_test; +select mapPopulateSeries(m, 1000) from map_test; -- { serverError 43 } +select mapPopulateSeries(m, n) from map_test; + +drop table map_test; + +select mapPopulateSeries(map(toUInt8(1), toUInt8(1), 2, 1)) as res, toTypeName(res); +select mapPopulateSeries(map(toUInt16(1), toUInt16(1), 2, 1)) as res, toTypeName(res); +select mapPopulateSeries(map(toUInt32(1), toUInt32(1), 2, 1)) as res, toTypeName(res); +select mapPopulateSeries(map(toUInt64(1), toUInt64(1), 2, 1)) as res, toTypeName(res); +select mapPopulateSeries(map(toUInt128(1), toUInt128(1), 2, 1)) as res, toTypeName(res); +select mapPopulateSeries(map(toUInt256(1), toUInt256(1), 2, 1)) as res, toTypeName(res); + +select mapPopulateSeries(map(toInt8(1), toInt8(1), 2, 1)) as res, toTypeName(res); +select mapPopulateSeries(map(toInt16(1), toInt16(1), 2, 1)) as res, toTypeName(res); +select mapPopulateSeries(map(toInt32(1), toInt32(1), 2, 1)) as res, toTypeName(res); +select mapPopulateSeries(map(toInt64(1), toInt64(1), 2, 1)) as res, toTypeName(res); +select mapPopulateSeries(map(toInt128(1), toInt128(1), 2, 1)) as res, toTypeName(res); +select mapPopulateSeries(map(toInt256(1), toInt256(1), 2, 1)) as res, toTypeName(res); + +select mapPopulateSeries(map(toInt8(-10), toInt8(1), 2, 1)) as res, toTypeName(res); +select mapPopulateSeries(map(toInt16(-10), toInt16(1), 2, 1)) as res, toTypeName(res); +select mapPopulateSeries(map(toInt32(-10), toInt32(1), 2, 1)) as res, toTypeName(res); +select mapPopulateSeries(map(toInt64(-10), toInt64(1), 2, 1)) as res, toTypeName(res); +select mapPopulateSeries(map(toInt64(-10), toInt64(1), 2, 1), toInt64(-5)) as res, toTypeName(res); + +select mapPopulateSeries(); -- { serverError 42 } +select mapPopulateSeries('asdf'); -- { serverError 43 } +select mapPopulateSeries(map('1', 1, '2', 1)) as res, toTypeName(res); -- { serverError 43 } diff --git a/tests/queries/0_stateless/01925_test_group_by_const_consistency.reference b/tests/queries/0_stateless/01925_test_group_by_const_consistency.reference new file mode 100644 index 00000000000..573541ac970 --- /dev/null +++ b/tests/queries/0_stateless/01925_test_group_by_const_consistency.reference @@ -0,0 +1 @@ +0 diff --git a/tests/queries/0_stateless/01925_test_group_by_const_consistency.sql b/tests/queries/0_stateless/01925_test_group_by_const_consistency.sql new file mode 100644 index 00000000000..8a5de0e7c4f --- /dev/null +++ b/tests/queries/0_stateless/01925_test_group_by_const_consistency.sql @@ -0,0 +1,2 @@ +SELECT 1 as a, count() FROM numbers(10) WHERE 0 GROUP BY a; +SELECT count() FROM numbers(10) WHERE 0 diff --git a/tests/queries/0_stateless/01926_bin_unbin.reference b/tests/queries/0_stateless/01926_bin_unbin.reference new file mode 100644 index 00000000000..731d0223bb9 --- /dev/null +++ b/tests/queries/0_stateless/01926_bin_unbin.reference @@ -0,0 +1,39 @@ + +00000000 +00000001 +00001010 +01111111 +11111111 +0000000100000000 +0000000111111111 +0000001000000000 +00110000 +0011000100110000 +111001101011010110001011111010001010111110010101 +11100110101101011000101111101000101011111001010100000000000000000000000000000000 +10011010100110011001100100111111 +0011001100110011001100110011001100110011001100111111001100111111 +00000000000011100010011100000111 +0000000000000000000011000011110101011101010100111010101000000001 +0011000100110010001100110011001100110010001101000011001000110100 +0011000100110010001100110011001100110010001101000011001000110100 +0011000100110010001100110011001100110010001101000011001000110100 +0011000100110010001100110011001100110010001101000011001000110100 + +1 +0 +10 +测试 +0 +0 +0 +1 +1 +1 +1 +1 +1 +1 +1 +2D000000000000000A +001011010000000000000000000000000000000000000000000000000000000000001010 diff --git a/tests/queries/0_stateless/01926_bin_unbin.sql b/tests/queries/0_stateless/01926_bin_unbin.sql new file mode 100644 index 00000000000..e112f8bd8a4 --- /dev/null +++ b/tests/queries/0_stateless/01926_bin_unbin.sql @@ -0,0 +1,45 @@ +select bin(''); +select bin(0); +select bin(1); +select bin(10); +select bin(127); +select bin(255); +select bin(256); +select bin(511); +select bin(512); +select bin('0'); +select bin('10'); +select bin('测试'); +select bin(toFixedString('测试', 10)); +select bin(toFloat32(1.2)); +select bin(toFloat64(1.2)); +select bin(toDecimal32(1.2, 8)); +select bin(toDecimal64(1.2, 17)); +select bin('12332424'); +select bin(materialize('12332424')); +select bin(toNullable(materialize('12332424'))); +select bin(toLowCardinality(materialize('12332424'))); + +select unbin(''); +select unbin('0') == '\0'; +select unbin('00110000'); -- 0 +select unbin('0011000100110000'); -- 10 +select unbin('111001101011010110001011111010001010111110010101'); -- 测试 +select unbin(materialize('00110000')); +select unbin(toNullable(materialize('00110000'))); +select unbin(toLowCardinality(materialize('00110000'))); + +select unbin(bin('')) == ''; +select bin(unbin('')) == ''; +select bin(unbin('0')) == '00000000'; + +-- hex and bin consistent for corner cases +select hex('') == bin(''); +select unhex('') == unbin(''); +select unhex('0') == unbin('0'); + +-- hex and bin support AggregateFunction +select hex(sumState(number)) == hex(toString(sumState(number))) from numbers(10); +select hex(avgState(number)) == hex(toString(avgState(number))) from numbers(99); +select hex(avgState(number)) from numbers(10); +select bin(avgState(number)) from numbers(10); diff --git a/tests/queries/0_stateless/01926_date_date_time_supertype.sql b/tests/queries/0_stateless/01926_date_date_time_supertype.sql index 559cd465ebb..cce488a5cff 100644 --- a/tests/queries/0_stateless/01926_date_date_time_supertype.sql +++ b/tests/queries/0_stateless/01926_date_date_time_supertype.sql @@ -15,7 +15,7 @@ WITH toDate('2000-01-01') as a, toDateTime('2000-01-01', 'Europe/Moscow') as b SELECT if(value, b, a) as result, toTypeName(result) FROM predicate_table; -WITH toDateTime('2000-01-01') as a, toDateTime64('2000-01-01', 5, 'Europe/Moscow') as b +WITH toDateTime('2000-01-01', 'Europe/Moscow') as a, toDateTime64('2000-01-01', 5, 'Europe/Moscow') as b SELECT if(value, b, a) as result, toTypeName(result) FROM predicate_table; diff --git a/tests/queries/0_stateless/01926_order_by_desc_limit.reference b/tests/queries/0_stateless/01926_order_by_desc_limit.reference new file mode 100644 index 00000000000..6ed281c757a --- /dev/null +++ b/tests/queries/0_stateless/01926_order_by_desc_limit.reference @@ -0,0 +1,2 @@ +1 +1 diff --git a/tests/queries/0_stateless/01926_order_by_desc_limit.sql b/tests/queries/0_stateless/01926_order_by_desc_limit.sql new file mode 100644 index 00000000000..7ea102e11e9 --- /dev/null +++ b/tests/queries/0_stateless/01926_order_by_desc_limit.sql @@ -0,0 +1,21 @@ +DROP TABLE IF EXISTS order_by_desc; + +CREATE TABLE order_by_desc (u UInt32, s String) +ENGINE MergeTree ORDER BY u PARTITION BY u % 100 +SETTINGS index_granularity = 1024; + +INSERT INTO order_by_desc SELECT number, repeat('a', 1024) FROM numbers(1024 * 300); +OPTIMIZE TABLE order_by_desc FINAL; + +SELECT s FROM order_by_desc ORDER BY u DESC LIMIT 10 FORMAT Null +SETTINGS max_memory_usage = '400M'; + +SELECT s FROM order_by_desc ORDER BY u LIMIT 10 FORMAT Null +SETTINGS max_memory_usage = '400M'; + +SYSTEM FLUSH LOGS; + +SELECT read_rows < 110000 FROM system.query_log +WHERE type = 'QueryFinish' AND current_database = currentDatabase() +AND event_time > now() - INTERVAL 10 SECOND +AND lower(query) LIKE lower('SELECT s FROM order_by_desc ORDER BY u%'); diff --git a/tests/queries/0_stateless/01927_query_views_log_current_database.reference b/tests/queries/0_stateless/01927_query_views_log_current_database.reference new file mode 100644 index 00000000000..ff9eca2d97f --- /dev/null +++ b/tests/queries/0_stateless/01927_query_views_log_current_database.reference @@ -0,0 +1,70 @@ +Row 1: +────── +stage: Query log rows +read_rows: 100 +written_rows: 201 +databases: ['_table_function','default'] +tables: ['_table_function.numbers','default.table_a','default.table_b','default.table_b_live_view','default.table_c'] +views: ['default.matview_a_to_b','default.matview_b_to_c','default.table_b_live_view'] +sleep_calls: 200 +sleep_us: 298 +Row 1: +────── +stage: Depending views +view_name: default.matview_a_to_b +view_type: Materialized +status: QueryFinish +view_target: default.table_b +view_query: SELECT toFloat64(a) AS a, b + sleepEachRow(0.000001) AS count FROM default.table_a +read_rows: 100 +written_rows: 100 +sleep_calls: 100 +sleep_us: 99 + +Row 2: +────── +stage: Depending views +view_name: default.matview_b_to_c +view_type: Materialized +status: QueryFinish +view_target: default.table_c +view_query: SELECT sum(a + sleepEachRow(0.000002)) AS a FROM default.table_b +read_rows: 100 +written_rows: 1 +sleep_calls: 100 +sleep_us: 199 + +Row 3: +────── +stage: Depending views +view_name: default.table_b_live_view +view_type: Live +status: QueryFinish +view_target: default.table_b_live_view +view_query: SELECT sum(a + b) FROM default.table_b +read_rows: 100 +written_rows: 0 +sleep_calls: 0 +sleep_us: 0 +Row 1: +────── +stage: Query log rows 2 +read_rows: 50 +written_rows: 100 +databases: ['_table_function','default'] +tables: ['_table_function.numbers','default.table_d','default.table_e','default.table_f'] +views: ['default.matview_join_d_e'] +sleep_calls: 50 +sleep_us: 150 +Row 1: +────── +stage: Depending views 2 +view_name: default.matview_join_d_e +view_type: Materialized +status: QueryFinish +view_target: default.table_f +view_query: SELECT table_d.a AS a, table_e.count + sleepEachRow(0.000003) AS count FROM default.table_d LEFT JOIN default.table_e ON table_d.a = table_e.a +read_rows: 50 +written_rows: 50 +sleep_calls: 50 +sleep_us: 150 diff --git a/tests/queries/0_stateless/01927_query_views_log_current_database.sql b/tests/queries/0_stateless/01927_query_views_log_current_database.sql new file mode 100644 index 00000000000..40ab8c8e16a --- /dev/null +++ b/tests/queries/0_stateless/01927_query_views_log_current_database.sql @@ -0,0 +1,129 @@ +SET allow_experimental_live_view = 1; +SET log_queries=0; +SET log_query_threads=0; + +-- SETUP TABLES +CREATE TABLE table_a (a String, b Int64) ENGINE = MergeTree ORDER BY b; +CREATE TABLE table_b (a Float64, b Int64) ENGINE = MergeTree ORDER BY tuple(); +CREATE TABLE table_c (a Float64) ENGINE = MergeTree ORDER BY a; + +CREATE TABLE table_d (a Float64, count Int64) ENGINE MergeTree ORDER BY a; +CREATE TABLE table_e (a Float64, count Int64) ENGINE MergeTree ORDER BY a; +CREATE TABLE table_f (a Float64, count Int64) ENGINE MergeTree ORDER BY a; + +-- SETUP MATERIALIZED VIEWS +CREATE MATERIALIZED VIEW matview_a_to_b TO table_b AS SELECT toFloat64(a) AS a, b + sleepEachRow(0.000001) AS count FROM table_a; +CREATE MATERIALIZED VIEW matview_b_to_c TO table_c AS SELECT SUM(a + sleepEachRow(0.000002)) as a FROM table_b; +CREATE MATERIALIZED VIEW matview_join_d_e TO table_f AS SELECT table_d.a as a, table_e.count + sleepEachRow(0.000003) as count FROM table_d LEFT JOIN table_e ON table_d.a = table_e.a; + +-- SETUP LIVE VIEW +---- table_b_live_view (Int64) +DROP TABLE IF EXISTS table_b_live_view; +CREATE LIVE VIEW table_b_live_view AS SELECT sum(a + b) FROM table_b; + +-- ENABLE LOGS +SET log_query_views=1; +SET log_queries_min_type='QUERY_FINISH'; +SET log_queries=1; + +-- INSERT 1 +INSERT INTO table_a SELECT '111', * FROM numbers(100); + +-- INSERT 2 +INSERT INTO table_d SELECT 0.5, * FROM numbers(50); + +SYSTEM FLUSH LOGS; + + +-- CHECK LOGS OF INSERT 1 +-- Note that live views currently don't report written rows +SELECT + 'Query log rows' as stage, + read_rows, + written_rows, + arraySort(databases) as databases, + arraySort(tables) as tables, + arraySort(views) as views, + ProfileEvents['SleepFunctionCalls'] as sleep_calls, + ProfileEvents['SleepFunctionMicroseconds'] as sleep_us +FROM system.query_log +WHERE query like '-- INSERT 1%INSERT INTO table_a%' + AND current_database = currentDatabase() + AND event_date >= yesterday() +FORMAT Vertical; + +SELECT + 'Depending views' as stage, + view_name, + view_type, + status, + view_target, + view_query, + read_rows, + written_rows, + ProfileEvents['SleepFunctionCalls'] as sleep_calls, + ProfileEvents['SleepFunctionMicroseconds'] as sleep_us +FROM system.query_views_log +WHERE initial_query_id = + ( + SELECT initial_query_id + FROM system.query_log + WHERE query like '-- INSERT 1%INSERT INTO table_a%' + AND current_database = currentDatabase() + AND event_date >= yesterday() + LIMIT 1 + ) +ORDER BY view_name +FORMAT Vertical; + +-- CHECK LOGS OF INSERT 2 +SELECT + 'Query log rows 2' as stage, + read_rows, + written_rows, + arraySort(databases) as databases, + arraySort(tables) as tables, + arraySort(views) as views, + ProfileEvents['SleepFunctionCalls'] as sleep_calls, + ProfileEvents['SleepFunctionMicroseconds'] as sleep_us +FROM system.query_log +WHERE query like '-- INSERT 2%INSERT INTO table_d%' + AND current_database = currentDatabase() + AND event_date >= yesterday() +FORMAT Vertical; + +SELECT + 'Depending views 2' as stage, + view_name, + view_type, + status, + view_target, + view_query, + read_rows, + written_rows, + ProfileEvents['SleepFunctionCalls'] as sleep_calls, + ProfileEvents['SleepFunctionMicroseconds'] as sleep_us +FROM system.query_views_log +WHERE initial_query_id = + ( + SELECT initial_query_id + FROM system.query_log + WHERE query like '-- INSERT 2%INSERT INTO table_d%' + AND current_database = currentDatabase() + AND event_date >= yesterday() + LIMIT 1 + ) +ORDER BY view_name +FORMAT Vertical; + +-- TEARDOWN +DROP TABLE table_b_live_view; +DROP TABLE matview_a_to_b; +DROP TABLE matview_b_to_c; +DROP TABLE matview_join_d_e; +DROP TABLE table_f; +DROP TABLE table_e; +DROP TABLE table_d; +DROP TABLE table_c; +DROP TABLE table_b; +DROP TABLE table_a; diff --git a/tests/queries/0_stateless/01927_query_views_log_matview_exceptions.reference b/tests/queries/0_stateless/01927_query_views_log_matview_exceptions.reference new file mode 100644 index 00000000000..b02dfc5c3d4 --- /dev/null +++ b/tests/queries/0_stateless/01927_query_views_log_matview_exceptions.reference @@ -0,0 +1,14 @@ +--parallel_view_processing 0 +table_exception_a 1 +table_exception_b 0 +table_exception_c 1 +Excep****WhileProcessing +default.matview_exception_a_to_b Excep****WhileProcessing 6 default.table_exception_b SELECT toFloat64(a) AS a, b FROM default.table_exception_a +default.matview_exception_a_to_c QueryFinish 0 default.table_exception_c SELECT b AS a FROM default.table_exception_a +--parallel_view_processing 1 +table_exception_a 2 +table_exception_b 0 +table_exception_c 2 +Excep****WhileProcessing +default.matview_exception_a_to_b Excep****WhileProcessing 6 default.table_exception_b SELECT toFloat64(a) AS a, b FROM default.table_exception_a +default.matview_exception_a_to_c QueryFinish 0 default.table_exception_c SELECT b AS a FROM default.table_exception_a diff --git a/tests/queries/0_stateless/01927_query_views_log_matview_exceptions.sh b/tests/queries/0_stateless/01927_query_views_log_matview_exceptions.sh new file mode 100755 index 00000000000..47d5e733480 --- /dev/null +++ b/tests/queries/0_stateless/01927_query_views_log_matview_exceptions.sh @@ -0,0 +1,94 @@ +#!/usr/bin/env bash + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +function cleanup() +{ + ${CLICKHOUSE_CLIENT} -n -q " + DROP TABLE IF EXISTS matview_exception_a_to_c; + DROP TABLE IF EXISTS matview_exception_a_to_b; + DROP TABLE IF EXISTS table_exception_c; + DROP TABLE IF EXISTS table_exception_b; + DROP TABLE IF EXISTS table_exception_a; + "; +} + +function setup() +{ + ${CLICKHOUSE_CLIENT} -n -q " + CREATE TABLE table_exception_a (a String, b Int64) ENGINE = MergeTree ORDER BY b; + CREATE TABLE table_exception_b (a Float64, b Int64) ENGINE = MergeTree ORDER BY tuple(); + CREATE TABLE table_exception_c (a Float64) ENGINE = MergeTree ORDER BY a; + + CREATE MATERIALIZED VIEW matview_exception_a_to_b TO table_exception_b AS SELECT toFloat64(a) AS a, b FROM table_exception_a; + CREATE MATERIALIZED VIEW matview_exception_a_to_c TO table_exception_c AS SELECT b AS a FROM table_exception_a; + "; +} + +function test() +{ + echo "$@"; + # We are going to insert an invalid number into table_exception_a. This will fail when inserting into + # table_exception_b via matview_exception_a_to_b, and will work ok when inserting into table_exception_c + ${CLICKHOUSE_CLIENT} "$@" --log_queries=1 --log_query_views=1 -q "INSERT INTO table_exception_a VALUES ('0.Aa234', 22)" > /dev/null 2>&1 || true; + ${CLICKHOUSE_CLIENT} -q " + SELECT * FROM + ( + SELECT 'table_exception_a' as name, count() AS c FROM table_exception_a UNION ALL + SELECT 'table_exception_b' as name, count() AS c FROM table_exception_b UNION ALL + SELECT 'table_exception_c' as name, count() AS c FROM table_exception_c + ) + ORDER BY name ASC + FORMAT TSV"; + + ${CLICKHOUSE_CLIENT} -q 'SYSTEM FLUSH LOGS'; + + ${CLICKHOUSE_CLIENT} -q " + SELECT + replaceOne(CAST(type AS String), 'ExceptionWhileProcessing', 'Excep****WhileProcessing') + exception_code + FROM system.query_log + WHERE + query LIKE 'INSERT INTO table_exception_a%' AND + type > 0 AND + event_date >= yesterday() AND + current_database = currentDatabase() + ORDER BY event_time_microseconds DESC + LIMIT 1 + FORMAT TSV"; + + ${CLICKHOUSE_CLIENT} -q " + SELECT + view_name, + replaceOne(CAST(status AS String), 'ExceptionWhileProcessing', 'Excep****WhileProcessing'), + exception_code, + view_target, + view_query + FROM system.query_views_log + WHERE initial_query_id = + ( + SELECT query_id + FROM system.query_log + WHERE + current_database = '${CLICKHOUSE_DATABASE}' AND + query LIKE 'INSERT INTO table_exception_a%' AND + type > 0 AND + event_date >= yesterday() AND + current_database = currentDatabase() + ORDER BY event_time_microseconds DESC + LIMIT 1 + ) + ORDER BY view_name ASC + "; +} + +trap cleanup EXIT; +cleanup; +setup; + +test --parallel_view_processing 0; +test --parallel_view_processing 1; + +exit 0 diff --git a/tests/queries/0_stateless/01930_optimize_skip_unused_shards_rewrite_in.reference b/tests/queries/0_stateless/01930_optimize_skip_unused_shards_rewrite_in.reference new file mode 100644 index 00000000000..b856b079327 --- /dev/null +++ b/tests/queries/0_stateless/01930_optimize_skip_unused_shards_rewrite_in.reference @@ -0,0 +1,132 @@ +-- { echoOn } + +-- Int8, Int8 +select _shard_num, * from remote('127.{1..4}', view(select toInt8(id) id from data), toInt8(id)) where id in (0, 1, 0x7f) order by _shard_num, id; +1 0 +1 0 +1 0 +1 0 +2 1 +4 127 +-- Int8, UInt8 +select _shard_num, * from remote('127.{1..4}', view(select toInt8(id) id from data), toUInt8(id)) where id in (0, 1, 0x7f) order by _shard_num, id; +1 0 +1 0 +1 0 +1 0 +2 1 +4 127 +-- UInt8, UInt8 +select _shard_num, * from remote('127.{1..4}', view(select toUInt8(id) id from data), toUInt8(id)) where id in (0, 1, 0x7f, 0x80, 0xff) order by _shard_num, id; +1 0 +1 0 +1 0 +1 0 +1 128 +2 1 +4 127 +4 255 +4 255 +4 255 +4 255 +4 255 +4 255 +4 255 +-- UInt8, Int8 +select _shard_num, * from remote('127.{1..4}', view(select toUInt8(id) id from data), toInt8(id)) where id in (0, 1, 0x7f, 0x80, 0xff) order by _shard_num, id; +1 0 +1 0 +1 0 +1 0 +2 1 +4 127 +-- Int16, Int16 +select _shard_num, * from remote('127.{1..4}', view(select toInt16(id) id from data), toInt16(id)) where id in (0, 1, 0x7fff) order by _shard_num, id; +1 0 +1 0 +1 0 +2 1 +4 32767 +-- Int16, UInt16 +select _shard_num, * from remote('127.{1..4}', view(select toInt16(id) id from data), toUInt16(id)) where id in (0, 1, 0x7fff) order by _shard_num, id; +1 0 +1 0 +1 0 +2 1 +4 32767 +-- UInt16, UInt16 +select _shard_num, * from remote('127.{1..4}', view(select toUInt16(id) id from data), toUInt16(id)) where id in (0, 1, 0x7fff, 0x8000, 0xffff) order by _shard_num, id; +1 0 +1 0 +1 0 +1 32768 +2 1 +4 32767 +4 65535 +4 65535 +4 65535 +4 65535 +4 65535 +-- UInt16, Int16 +select _shard_num, * from remote('127.{1..4}', view(select toUInt16(id) id from data), toInt16(id)) where id in (0, 1, 0x7fff, 0x8000, 0xffff) order by _shard_num, id; +1 0 +1 0 +1 0 +2 1 +4 32767 +-- Int32, Int32 +select _shard_num, * from remote('127.{1..4}', view(select toInt32(id) id from data), toInt32(id)) where id in (0, 1, 0x7fffffff) order by _shard_num, id; +1 0 +1 0 +2 1 +4 2147483647 +-- Int32, UInt32 +select _shard_num, * from remote('127.{1..4}', view(select toInt32(id) id from data), toUInt32(id)) where id in (0, 1, 0x7fffffff) order by _shard_num, id; +1 0 +1 0 +2 1 +4 2147483647 +-- UInt32, UInt32 +select _shard_num, * from remote('127.{1..4}', view(select toUInt32(id) id from data), toUInt32(id)) where id in (0, 1, 0x7fffffff, 0x80000000, 0xffffffff) order by _shard_num, id; +1 0 +1 0 +1 2147483648 +2 1 +4 2147483647 +4 4294967295 +4 4294967295 +4 4294967295 +-- UInt32, Int32 +select _shard_num, * from remote('127.{1..4}', view(select toUInt32(id) id from data), toInt32(id)) where id in (0, 1, 0x7fffffff, 0x80000000, 0xffffffff) order by _shard_num, id; +1 0 +1 0 +2 1 +4 2147483647 +-- Int64, Int64 +select _shard_num, * from remote('127.{1..4}', view(select toInt64(id) id from data), toInt64(id)) where id in (0, 1, 0x7fffffffffffffff) order by _shard_num, id; +1 0 +2 1 +4 9223372036854775807 +-- Int64, UInt64 +select _shard_num, * from remote('127.{1..4}', view(select toInt64(id) id from data), toUInt64(id)) where id in (0, 1, 0x7fffffffffffffff) order by _shard_num, id; +1 0 +2 1 +4 9223372036854775807 +-- UInt64, UInt64 +select _shard_num, * from remote('127.{1..4}', view(select toUInt64(id) id from data), toUInt64(id)) where id in (0, 1, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff) order by _shard_num, id; +1 0 +1 9223372036854775808 +2 1 +4 9223372036854775807 +4 18446744073709551615 +-- UInt64, Int64 +select _shard_num, * from remote('127.{1..4}', view(select toUInt64(id) id from data), toInt64(id)) where id in (0, 1, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff) order by _shard_num, id; +1 0 +2 1 +4 9223372036854775807 +-- modulo(Int8) +select distinct _shard_num, * from remote('127.{1..4}', view(select toInt16(id) id from data), toInt8(id)%255) where id in (-1) order by _shard_num, id; +4 -1 +-- modulo(UInt8) +select distinct _shard_num, * from remote('127.{1..4}', view(select toInt16(id) id from data), toUInt8(id)%255) where id in (-1) order by _shard_num, id; +1 -1 diff --git a/tests/queries/0_stateless/01930_optimize_skip_unused_shards_rewrite_in.sql b/tests/queries/0_stateless/01930_optimize_skip_unused_shards_rewrite_in.sql new file mode 100644 index 00000000000..7e53c0c2db7 --- /dev/null +++ b/tests/queries/0_stateless/01930_optimize_skip_unused_shards_rewrite_in.sql @@ -0,0 +1,63 @@ +set optimize_skip_unused_shards=1; +set force_optimize_skip_unused_shards=2; + +create temporary table data (id UInt64) engine=Memory() as with [ + 0, + 1, + 0x7f, 0x80, 0xff, + 0x7fff, 0x8000, 0xffff, + 0x7fffffff, 0x80000000, 0xffffffff, + 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff +] as values select arrayJoin(values) id; + +-- { echoOn } + +-- Int8, Int8 +select _shard_num, * from remote('127.{1..4}', view(select toInt8(id) id from data), toInt8(id)) where id in (0, 1, 0x7f) order by _shard_num, id; +-- Int8, UInt8 +select _shard_num, * from remote('127.{1..4}', view(select toInt8(id) id from data), toUInt8(id)) where id in (0, 1, 0x7f) order by _shard_num, id; +-- UInt8, UInt8 +select _shard_num, * from remote('127.{1..4}', view(select toUInt8(id) id from data), toUInt8(id)) where id in (0, 1, 0x7f, 0x80, 0xff) order by _shard_num, id; +-- UInt8, Int8 +select _shard_num, * from remote('127.{1..4}', view(select toUInt8(id) id from data), toInt8(id)) where id in (0, 1, 0x7f, 0x80, 0xff) order by _shard_num, id; + +-- Int16, Int16 +select _shard_num, * from remote('127.{1..4}', view(select toInt16(id) id from data), toInt16(id)) where id in (0, 1, 0x7fff) order by _shard_num, id; +-- Int16, UInt16 +select _shard_num, * from remote('127.{1..4}', view(select toInt16(id) id from data), toUInt16(id)) where id in (0, 1, 0x7fff) order by _shard_num, id; +-- UInt16, UInt16 +select _shard_num, * from remote('127.{1..4}', view(select toUInt16(id) id from data), toUInt16(id)) where id in (0, 1, 0x7fff, 0x8000, 0xffff) order by _shard_num, id; +-- UInt16, Int16 +select _shard_num, * from remote('127.{1..4}', view(select toUInt16(id) id from data), toInt16(id)) where id in (0, 1, 0x7fff, 0x8000, 0xffff) order by _shard_num, id; + +-- Int32, Int32 +select _shard_num, * from remote('127.{1..4}', view(select toInt32(id) id from data), toInt32(id)) where id in (0, 1, 0x7fffffff) order by _shard_num, id; +-- Int32, UInt32 +select _shard_num, * from remote('127.{1..4}', view(select toInt32(id) id from data), toUInt32(id)) where id in (0, 1, 0x7fffffff) order by _shard_num, id; +-- UInt32, UInt32 +select _shard_num, * from remote('127.{1..4}', view(select toUInt32(id) id from data), toUInt32(id)) where id in (0, 1, 0x7fffffff, 0x80000000, 0xffffffff) order by _shard_num, id; +-- UInt32, Int32 +select _shard_num, * from remote('127.{1..4}', view(select toUInt32(id) id from data), toInt32(id)) where id in (0, 1, 0x7fffffff, 0x80000000, 0xffffffff) order by _shard_num, id; + +-- Int64, Int64 +select _shard_num, * from remote('127.{1..4}', view(select toInt64(id) id from data), toInt64(id)) where id in (0, 1, 0x7fffffffffffffff) order by _shard_num, id; +-- Int64, UInt64 +select _shard_num, * from remote('127.{1..4}', view(select toInt64(id) id from data), toUInt64(id)) where id in (0, 1, 0x7fffffffffffffff) order by _shard_num, id; +-- UInt64, UInt64 +select _shard_num, * from remote('127.{1..4}', view(select toUInt64(id) id from data), toUInt64(id)) where id in (0, 1, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff) order by _shard_num, id; +-- UInt64, Int64 +select _shard_num, * from remote('127.{1..4}', view(select toUInt64(id) id from data), toInt64(id)) where id in (0, 1, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff) order by _shard_num, id; + +-- modulo(Int8) +select distinct _shard_num, * from remote('127.{1..4}', view(select toInt16(id) id from data), toInt8(id)%255) where id in (-1) order by _shard_num, id; +-- modulo(UInt8) +select distinct _shard_num, * from remote('127.{1..4}', view(select toInt16(id) id from data), toUInt8(id)%255) where id in (-1) order by _shard_num, id; + +-- { echoOff } + +-- those two had been reported initially by amosbird: +-- (the problem is that murmurHash3_32() returns different value to toInt64(1) and toUInt64(1)) +---- error for local node +select * from remote('127.{1..4}', view(select number id from numbers(0)), bitAnd(murmurHash3_32(id), 2147483647)) where id in (2, 3); +---- error for remote node +select * from remote('127.{1..8}', view(select number id from numbers(0)), bitAnd(murmurHash3_32(id), 2147483647)) where id in (2, 3); diff --git a/tests/queries/0_stateless/01932_global_in_function.reference b/tests/queries/0_stateless/01932_global_in_function.reference new file mode 100644 index 00000000000..44e0be8e356 --- /dev/null +++ b/tests/queries/0_stateless/01932_global_in_function.reference @@ -0,0 +1,4 @@ +0 +0 +0 +0 diff --git a/tests/queries/0_stateless/01932_global_in_function.sql b/tests/queries/0_stateless/01932_global_in_function.sql new file mode 100644 index 00000000000..467bf6c3495 --- /dev/null +++ b/tests/queries/0_stateless/01932_global_in_function.sql @@ -0,0 +1,2 @@ +select number from cluster(test_cluster_two_shards_localhost, numbers(1)) where number global in tuple(0, 1, 2, 3); +select number from cluster(test_cluster_two_shards_localhost, numbers(1)) where number global in array(0, 1, 2, 3); diff --git a/tests/queries/0_stateless/01932_remote_sharding_key_column.reference b/tests/queries/0_stateless/01932_remote_sharding_key_column.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/01932_remote_sharding_key_column.sql b/tests/queries/0_stateless/01932_remote_sharding_key_column.sql new file mode 100644 index 00000000000..ded2f187821 --- /dev/null +++ b/tests/queries/0_stateless/01932_remote_sharding_key_column.sql @@ -0,0 +1,15 @@ +-- regression test for the following query: +-- +-- select * from remote('127.1', system.one, dummy) +-- +-- that produce the following error before: +-- +-- Unknown column: dummy, there are only columns . +-- +-- NOTE: that wrapping column into any function works before. +select * from remote('127.1', system.one, dummy) format Null; +select * from remote('127.1', system.one, identity(dummy)) format Null; +select * from remote('127.1', view(select * from system.one), identity(dummy)) format Null; +select * from remote('127.{1,2}', view(select * from system.one), identity(dummy)) format Null; +select * from remote('127.1', view(select * from system.one), dummy) format Null; +select * from remote('127.{1,2}', view(select * from system.one), dummy) format Null; diff --git a/tests/queries/0_stateless/01936_empty_function_support_uuid.reference b/tests/queries/0_stateless/01936_empty_function_support_uuid.reference new file mode 100644 index 00000000000..30373074c1f --- /dev/null +++ b/tests/queries/0_stateless/01936_empty_function_support_uuid.reference @@ -0,0 +1,4 @@ +1 +0 +1 2 +2 1 diff --git a/tests/queries/0_stateless/01936_empty_function_support_uuid.sql b/tests/queries/0_stateless/01936_empty_function_support_uuid.sql new file mode 100644 index 00000000000..c67f38b776a --- /dev/null +++ b/tests/queries/0_stateless/01936_empty_function_support_uuid.sql @@ -0,0 +1,35 @@ +SELECT empty(toUUID('00000000-0000-0000-0000-000000000000')); +SELECT notEmpty(toUUID('00000000-0000-0000-0000-000000000000')); +SELECT uniqIf(uuid, empty(uuid)), uniqIf(uuid, notEmpty(uuid)) +FROM +( + SELECT toUUID('00000000-0000-0000-0000-000000000002') AS uuid + UNION ALL + SELECT toUUID('00000000-0000-0000-0000-000000000000') AS uuid + UNION ALL + SELECT toUUID('00000000-0000-0000-0000-000000000001') AS uuid +); + +DROP TABLE IF EXISTS users; +DROP TABLE IF EXISTS orders; + +CREATE TABLE users (user_id UUID) ENGINE = Memory; +CREATE TABLE orders (order_id UUID, user_id UUID) ENGINE = Memory; + +INSERT INTO users VALUES ('00000000-0000-0000-0000-000000000001'); +INSERT INTO users VALUES ('00000000-0000-0000-0000-000000000002'); +INSERT INTO orders VALUES ('00000000-0000-0000-0000-000000000003', '00000000-0000-0000-0000-000000000001'); + +SELECT + uniq(user_id) AS users, + uniqIf(order_id, notEmpty(order_id)) AS orders +FROM +( + SELECT * FROM users +) t1 ALL LEFT JOIN ( + SELECT * FROM orders +) t2 USING (user_id); + +DROP TABLE users; +DROP TABLE orders; + diff --git a/tests/queries/0_stateless/01939_network_receive_bytes_metrics.reference b/tests/queries/0_stateless/01939_network_receive_bytes_metrics.reference new file mode 100644 index 00000000000..d00491fd7e5 --- /dev/null +++ b/tests/queries/0_stateless/01939_network_receive_bytes_metrics.reference @@ -0,0 +1 @@ +1 diff --git a/tests/queries/0_stateless/01939_network_receive_bytes_metrics.sh b/tests/queries/0_stateless/01939_network_receive_bytes_metrics.sh new file mode 100755 index 00000000000..03babad40f3 --- /dev/null +++ b/tests/queries/0_stateless/01939_network_receive_bytes_metrics.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +${CLICKHOUSE_CLIENT} --multiquery --query "DROP TABLE IF EXISTS t; CREATE TABLE t (x UInt64) ENGINE = Memory;" + +seq 1 1000 | ${CLICKHOUSE_CLIENT} --query "INSERT INTO t FORMAT TSV" + +${CLICKHOUSE_CLIENT} --multiquery --query "SYSTEM FLUSH LOGS; + WITH ProfileEvents['NetworkReceiveBytes'] AS bytes + SELECT bytes >= 8000 AND bytes < 9000 ? 1 : bytes FROM system.query_log + WHERE current_database = currentDatabase() AND query_kind = 'Insert' AND event_date >= yesterday() AND type = 2 ORDER BY event_time DESC LIMIT 1;" + +${CLICKHOUSE_CLIENT} --query "DROP TABLE t" diff --git a/tests/queries/0_stateless/01939_network_send_bytes_metrics.reference b/tests/queries/0_stateless/01939_network_send_bytes_metrics.reference new file mode 100644 index 00000000000..d00491fd7e5 --- /dev/null +++ b/tests/queries/0_stateless/01939_network_send_bytes_metrics.reference @@ -0,0 +1 @@ +1 diff --git a/tests/queries/0_stateless/01939_network_send_bytes_metrics.sh b/tests/queries/0_stateless/01939_network_send_bytes_metrics.sh new file mode 100755 index 00000000000..e862a273de4 --- /dev/null +++ b/tests/queries/0_stateless/01939_network_send_bytes_metrics.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +${CLICKHOUSE_CLIENT} --multiquery --query "DROP TABLE IF EXISTS t; CREATE TABLE t (x UInt64) ENGINE = Memory;" + +${CLICKHOUSE_CLIENT} --query "SELECT number FROM numbers(1000)" > /dev/null + +${CLICKHOUSE_CLIENT} --multiquery --query "SYSTEM FLUSH LOGS; + WITH ProfileEvents['NetworkSendBytes'] AS bytes + SELECT bytes >= 8000 AND bytes < 9000 ? 1 : bytes FROM system.query_log + WHERE current_database = currentDatabase() AND query_kind = 'Select' AND event_date >= yesterday() AND type = 2 ORDER BY event_time DESC LIMIT 1;" + +${CLICKHOUSE_CLIENT} --query "DROP TABLE t" diff --git a/tests/queries/0_stateless/01939_type_map_json.reference b/tests/queries/0_stateless/01939_type_map_json.reference new file mode 100644 index 00000000000..4c19bc3c0dc --- /dev/null +++ b/tests/queries/0_stateless/01939_type_map_json.reference @@ -0,0 +1,14 @@ +{"m":{"1":2,"3":4}} +{1:2,3:4} {"1":2,"3":4} 1 +{"m":{"key1":"1","key2":"2"}} +{'key1':1,'key2':2} {"key1":"1","key2":"2"} 1 +{"m":{"key1":1,"key2":2}} +{'key1':1,'key2':2} {"key1":1,"key2":2} 1 +{"m":{"2020-10-10":"v1","2020-10-11":"v2"}} +{'2020-10-10':'v1','2020-10-11':'v2'} {"2020-10-10":"v1","2020-10-11":"v2"} 1 +{"m":{"11":"v1","22":"v2"}} +{11:'v1',22:'v2'} {"11":"v1","22":"v2"} 1 +{"m":{"11":"v1","22":"v2"}} +{11:'v1',22:'v2'} {"11":"v1","22":"v2"} 1 +{"m1":{"k1":"1","k2":"2"},"m2":{"1":2,"2":3},"m3":{"2020-10-10":"foo"}} +{"m1":{"k1":1,"k2":2},"m2":{"1":2,"2":3},"m3":{"2020-10-10":"foo"}} diff --git a/tests/queries/0_stateless/01939_type_map_json.sql b/tests/queries/0_stateless/01939_type_map_json.sql new file mode 100644 index 00000000000..df782334c90 --- /dev/null +++ b/tests/queries/0_stateless/01939_type_map_json.sql @@ -0,0 +1,28 @@ +SELECT map(1, 2, 3, 4) AS m FORMAT JSONEachRow; +SELECT map(1, 2, 3, 4) AS m, toJSONString(m) AS s, isValidJSON(s); + +SELECT map('key1', number, 'key2', number * 2) AS m FROM numbers(1, 1) FORMAT JSONEachRow; +SELECT map('key1', number, 'key2', number * 2) AS m, toJSONString(m) AS s, isValidJSON(s) FROM numbers(1, 1); + +SELECT map('key1', number, 'key2', number * 2) AS m FROM numbers(1, 1) + FORMAT JSONEachRow + SETTINGS output_format_json_quote_64bit_integers = 0; + +SELECT map('key1', number, 'key2', number * 2) AS m, toJSONString(m) AS s, isValidJSON(s) FROM numbers(1, 1) + SETTINGS output_format_json_quote_64bit_integers = 0; + +SELECT map('2020-10-10'::Date, 'v1', '2020-10-11'::Date, 'v2') AS m FORMAT JSONEachRow; +SELECT map('2020-10-10'::Date, 'v1', '2020-10-11'::Date, 'v2') AS m, toJSONString(m) AS s, isValidJSON(s); + +SELECT map(11::UInt64, 'v1', 22::UInt64, 'v2') AS m FORMAT JSONEachRow; +SELECT map(11::UInt64, 'v1', 22::UInt64, 'v2') AS m, toJSONString(m) AS s, isValidJSON(s); + +SELECT map(11::Int128, 'v1', 22::Int128, 'v2') AS m FORMAT JSONEachRow; +SELECT map(11::Int128, 'v1', 22::Int128, 'v2') AS m, toJSONString(m) AS s, isValidJSON(s); + +CREATE TEMPORARY TABLE map_json (m1 Map(String, UInt64), m2 Map(UInt32, UInt32), m3 Map(Date, String)); + +INSERT INTO map_json FORMAT JSONEachRow {"m1" : {"k1" : 1, "k2" : 2}, "m2" : {"1" : 2, "2" : 3}, "m3" : {"2020-10-10" : "foo"}}; + +SELECT m1, m2, m3 FROM map_json FORMAT JSONEachRow; +SELECT m1, m2, m3 FROM map_json FORMAT JSONEachRow SETTINGS output_format_json_quote_64bit_integers = 0; diff --git a/tests/queries/0_stateless/01939_user_with_default_database.reference b/tests/queries/0_stateless/01939_user_with_default_database.reference new file mode 100644 index 00000000000..8c8ff7e3007 --- /dev/null +++ b/tests/queries/0_stateless/01939_user_with_default_database.reference @@ -0,0 +1,4 @@ +default +db_01939 +CREATE USER u_01939 +CREATE USER u_01939 DEFAULT DATABASE NONE diff --git a/tests/queries/0_stateless/01939_user_with_default_database.sh b/tests/queries/0_stateless/01939_user_with_default_database.sh new file mode 100755 index 00000000000..6dcd288797b --- /dev/null +++ b/tests/queries/0_stateless/01939_user_with_default_database.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +${CLICKHOUSE_CLIENT_BINARY} --query "create database if not exists db_01939" +${CLICKHOUSE_CLIENT_BINARY} --query "create database if not exists NONE" + +#create user by sql +${CLICKHOUSE_CLIENT_BINARY} --query "drop user if exists u_01939" +${CLICKHOUSE_CLIENT_BINARY} --query "create user u_01939 default database db_01939" + +${CLICKHOUSE_CLIENT_BINARY} --query "SELECT currentDatabase();" +${CLICKHOUSE_CLIENT_BINARY} --user=u_01939 --query "SELECT currentDatabase();" + +${CLICKHOUSE_CLIENT_BINARY} --query "alter user u_01939 default database NONE" +${CLICKHOUSE_CLIENT_BINARY} --query "show create user u_01939" +${CLICKHOUSE_CLIENT_BINARY} --query "alter user u_01939 default database \`NONE\`" +${CLICKHOUSE_CLIENT_BINARY} --query "show create user u_01939" + +${CLICKHOUSE_CLIENT_BINARY} --query "drop user u_01939 " +${CLICKHOUSE_CLIENT_BINARY} --query "drop database db_01939" +${CLICKHOUSE_CLIENT_BINARY} --query "drop database NONE" diff --git a/tests/queries/0_stateless/01940_custom_tld_sharding_key.reference b/tests/queries/0_stateless/01940_custom_tld_sharding_key.reference new file mode 100644 index 00000000000..0989a305613 --- /dev/null +++ b/tests/queries/0_stateless/01940_custom_tld_sharding_key.reference @@ -0,0 +1 @@ +foo.com diff --git a/tests/queries/0_stateless/01940_custom_tld_sharding_key.sql b/tests/queries/0_stateless/01940_custom_tld_sharding_key.sql new file mode 100644 index 00000000000..5d38cfb18dc --- /dev/null +++ b/tests/queries/0_stateless/01940_custom_tld_sharding_key.sql @@ -0,0 +1,2 @@ +select * from remote('127.{1,2}', view(select 'foo.com' key), cityHash64(key)) where key = cutToFirstSignificantSubdomainCustom('foo.com', 'public_suffix_list') settings optimize_skip_unused_shards=1, force_optimize_skip_unused_shards=1; +select * from remote('127.{1,2}', view(select 'foo.com' key), cityHash64(key)) where key = cutToFirstSignificantSubdomainCustom('bar.com', 'public_suffix_list') settings optimize_skip_unused_shards=1, force_optimize_skip_unused_shards=1; diff --git a/tests/queries/0_stateless/01940_pad_string.reference b/tests/queries/0_stateless/01940_pad_string.reference new file mode 100644 index 00000000000..22cd3f9be07 --- /dev/null +++ b/tests/queries/0_stateless/01940_pad_string.reference @@ -0,0 +1,54 @@ +leftPad + +a +ab +abc + abc + abc + abc +ab +*abc +**abc +*******abc +ab +*abc +*.abc +*.*.*.*abc +leftPadUTF8 +а +аб +аб +абвг +ЧАабвг +ЧАСЧАСЧАабвг +rightPad + +a +ab +abc +abc +abc +abc +ab +abc* +abc** +abc******* +ab +abc* +abc*. +abc*.*.*.* +rightPadUTF8 +а +аб +аб +абвг +абвгЧА +абвгЧАСЧАСЧА +numbers + +1^ +_2^^ +__3^^^ +___4^^^^ +____5^^^^^ +_____6^^^^^^ diff --git a/tests/queries/0_stateless/01940_pad_string.sql b/tests/queries/0_stateless/01940_pad_string.sql new file mode 100644 index 00000000000..e4ba0aec6d2 --- /dev/null +++ b/tests/queries/0_stateless/01940_pad_string.sql @@ -0,0 +1,54 @@ +SELECT 'leftPad'; +SELECT leftPad('abc', 0); +SELECT leftPad('abc', 1); +SELECT leftPad('abc', 2); +SELECT leftPad('abc', 3); +SELECT leftPad('abc', 4); +SELECT leftPad('abc', 5); +SELECT leftPad('abc', 10); + +SELECT leftPad('abc', 2, '*'); +SELECT leftPad('abc', 4, '*'); +SELECT leftPad('abc', 5, '*'); +SELECT leftPad('abc', 10, '*'); +SELECT leftPad('abc', 2, '*.'); +SELECT leftPad('abc', 4, '*.'); +SELECT leftPad('abc', 5, '*.'); +SELECT leftPad('abc', 10, '*.'); + +SELECT 'leftPadUTF8'; +SELECT leftPad('абвг', 2); +SELECT leftPadUTF8('абвг', 2); +SELECT leftPad('абвг', 4); +SELECT leftPadUTF8('абвг', 4); +SELECT leftPad('абвг', 12, 'ЧАС'); +SELECT leftPadUTF8('абвг', 12, 'ЧАС'); + +SELECT 'rightPad'; +SELECT rightPad('abc', 0); +SELECT rightPad('abc', 1); +SELECT rightPad('abc', 2); +SELECT rightPad('abc', 3); +SELECT rightPad('abc', 4); +SELECT rightPad('abc', 5); +SELECT rightPad('abc', 10); + +SELECT rightPad('abc', 2, '*'); +SELECT rightPad('abc', 4, '*'); +SELECT rightPad('abc', 5, '*'); +SELECT rightPad('abc', 10, '*'); +SELECT rightPad('abc', 2, '*.'); +SELECT rightPad('abc', 4, '*.'); +SELECT rightPad('abc', 5, '*.'); +SELECT rightPad('abc', 10, '*.'); + +SELECT 'rightPadUTF8'; +SELECT rightPad('абвг', 2); +SELECT rightPadUTF8('абвг', 2); +SELECT rightPad('абвг', 4); +SELECT rightPadUTF8('абвг', 4); +SELECT rightPad('абвг', 12, 'ЧАС'); +SELECT rightPadUTF8('абвг', 12, 'ЧАС'); + +SELECT 'numbers'; +SELECT rightPad(leftPad(toString(number), number, '_'), number*2, '^') FROM numbers(7); diff --git a/tests/queries/0_stateless/01940_point_in_polygon_ubsan.reference b/tests/queries/0_stateless/01940_point_in_polygon_ubsan.reference new file mode 100644 index 00000000000..573541ac970 --- /dev/null +++ b/tests/queries/0_stateless/01940_point_in_polygon_ubsan.reference @@ -0,0 +1 @@ +0 diff --git a/tests/queries/0_stateless/01940_point_in_polygon_ubsan.sql b/tests/queries/0_stateless/01940_point_in_polygon_ubsan.sql new file mode 100644 index 00000000000..d011725691f --- /dev/null +++ b/tests/queries/0_stateless/01940_point_in_polygon_ubsan.sql @@ -0,0 +1,2 @@ +SET validate_polygons = 0; +SELECT pointInPolygon((-inf, 1023), [(10.000100135803223, 10000000000.), (inf, 0.9998999834060669), (1.1920928955078125e-7, 100.0000991821289), (1.000100016593933, 100.0000991821289)]); diff --git a/tests/queries/0_stateless/01940_totimezone_operator_monotonicity.reference b/tests/queries/0_stateless/01940_totimezone_operator_monotonicity.reference new file mode 100644 index 00000000000..d00491fd7e5 --- /dev/null +++ b/tests/queries/0_stateless/01940_totimezone_operator_monotonicity.reference @@ -0,0 +1 @@ +1 diff --git a/tests/queries/0_stateless/01940_totimezone_operator_monotonicity.sql b/tests/queries/0_stateless/01940_totimezone_operator_monotonicity.sql new file mode 100644 index 00000000000..b8065947ead --- /dev/null +++ b/tests/queries/0_stateless/01940_totimezone_operator_monotonicity.sql @@ -0,0 +1,6 @@ +DROP TABLE IF EXISTS totimezone_op_mono; +CREATE TABLE totimezone_op_mono(i int, tz String, create_time DateTime) ENGINE MergeTree PARTITION BY toDate(create_time) ORDER BY i; +INSERT INTO totimezone_op_mono VALUES (1, 'UTC', toDateTime('2020-09-01 00:00:00', 'UTC')), (2, 'UTC', toDateTime('2020-09-02 00:00:00', 'UTC')); +SET max_rows_to_read = 1; +SELECT count() FROM totimezone_op_mono WHERE toTimeZone(create_time, 'UTC') = '2020-09-01 00:00:00'; +DROP TABLE IF EXISTS totimezone_op_mono; diff --git a/tests/queries/0_stateless/01941_dict_get_has_complex_single_key.reference b/tests/queries/0_stateless/01941_dict_get_has_complex_single_key.reference new file mode 100644 index 00000000000..c7e9cb788cb --- /dev/null +++ b/tests/queries/0_stateless/01941_dict_get_has_complex_single_key.reference @@ -0,0 +1,10 @@ +dictGet +Value +Value +Value +Value +dictHas +1 +1 +1 +1 diff --git a/tests/queries/0_stateless/01941_dict_get_has_complex_single_key.sql b/tests/queries/0_stateless/01941_dict_get_has_complex_single_key.sql new file mode 100644 index 00000000000..a44107d6882 --- /dev/null +++ b/tests/queries/0_stateless/01941_dict_get_has_complex_single_key.sql @@ -0,0 +1,26 @@ +DROP TABLE IF EXISTS test_dictionary_source; +CREATE TABLE test_dictionary_source (key String, value String) ENGINE=TinyLog; + +INSERT INTO test_dictionary_source VALUES ('Key', 'Value'); + +DROP DICTIONARY IF EXISTS test_dictionary; +CREATE DICTIONARY test_dictionary(key String, value String) +PRIMARY KEY key +LAYOUT(COMPLEX_KEY_HASHED()) +SOURCE(CLICKHOUSE(TABLE 'test_dictionary_source')) +LIFETIME(0); + +SELECT 'dictGet'; +SELECT dictGet('test_dictionary', 'value', tuple('Key')); +SELECT dictGet('test_dictionary', 'value', tuple(materialize('Key'))); +SELECT dictGet('test_dictionary', 'value', 'Key'); +SELECT dictGet('test_dictionary', 'value', materialize('Key')); + +SELECT 'dictHas'; +SELECT dictHas('test_dictionary', tuple('Key')); +SELECT dictHas('test_dictionary', tuple(materialize('Key'))); +SELECT dictHas('test_dictionary', 'Key'); +SELECT dictHas('test_dictionary', materialize('Key')); + +DROP DICTIONARY test_dictionary; +DROP TABLE test_dictionary_source; diff --git a/tests/queries/0_stateless/01942_create_table_with_sample.reference b/tests/queries/0_stateless/01942_create_table_with_sample.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/01942_create_table_with_sample.sql b/tests/queries/0_stateless/01942_create_table_with_sample.sql new file mode 100644 index 00000000000..6320edd7a31 --- /dev/null +++ b/tests/queries/0_stateless/01942_create_table_with_sample.sql @@ -0,0 +1,14 @@ +CREATE TABLE IF NOT EXISTS sample_incorrect +(`x` UUID) +ENGINE = MergeTree +ORDER BY tuple(x) +SAMPLE BY x; -- { serverError 59 } + +DROP TABLE IF EXISTS sample_correct; +CREATE TABLE IF NOT EXISTS sample_correct +(`x` String) +ENGINE = MergeTree +ORDER BY tuple(sipHash64(x)) +SAMPLE BY sipHash64(x); + +DROP TABLE sample_correct; diff --git a/tests/queries/0_stateless/01942_untuple_transformers_msan.reference b/tests/queries/0_stateless/01942_untuple_transformers_msan.reference new file mode 100644 index 00000000000..82dea36febd --- /dev/null +++ b/tests/queries/0_stateless/01942_untuple_transformers_msan.reference @@ -0,0 +1 @@ +100.0000991821289 \N \N 1 1024 \N diff --git a/tests/queries/0_stateless/01942_untuple_transformers_msan.sql b/tests/queries/0_stateless/01942_untuple_transformers_msan.sql new file mode 100644 index 00000000000..c1be25d34ac --- /dev/null +++ b/tests/queries/0_stateless/01942_untuple_transformers_msan.sql @@ -0,0 +1 @@ +SELECT untuple(tuple(100.0000991821289)), NULL, untuple((toDateTime(9223372036854775806, -1, NULL, NULL, toDateTime(NULL, NULL)), * EXCEPT b)), NULL FROM (SELECT 1 AS a, 1024, NULL AS b); diff --git a/tests/queries/0_stateless/01943_log_column_sizes.reference b/tests/queries/0_stateless/01943_log_column_sizes.reference new file mode 100644 index 00000000000..91ae12e38ce --- /dev/null +++ b/tests/queries/0_stateless/01943_log_column_sizes.reference @@ -0,0 +1,6 @@ +27 +33 +105 +27 +33 +105 diff --git a/tests/queries/0_stateless/01943_log_column_sizes.sql b/tests/queries/0_stateless/01943_log_column_sizes.sql new file mode 100644 index 00000000000..c6cd48c33d9 --- /dev/null +++ b/tests/queries/0_stateless/01943_log_column_sizes.sql @@ -0,0 +1,14 @@ +DROP TABLE IF EXISTS test_log; +DROP TABLE IF EXISTS test_tiny_log; + +CREATE TABLE test_log (x UInt8, s String, a Array(Nullable(String))) ENGINE = Log; +CREATE TABLE test_tiny_log (x UInt8, s String, a Array(Nullable(String))) ENGINE = TinyLog; + +INSERT INTO test_log VALUES (64, 'Value1', ['Value2', 'Value3', NULL]); +INSERT INTO test_tiny_log VALUES (64, 'Value1', ['Value2', 'Value3', NULL]); + +SELECT data_compressed_bytes FROM system.columns WHERE table = 'test_log' AND database = currentDatabase(); +SELECT data_compressed_bytes FROM system.columns WHERE table = 'test_tiny_log' AND database = currentDatabase(); + +DROP TABLE test_log; +DROP TABLE test_tiny_log; \ No newline at end of file diff --git a/tests/queries/0_stateless/01943_non_deterministic_order_key.reference b/tests/queries/0_stateless/01943_non_deterministic_order_key.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/01943_non_deterministic_order_key.sql b/tests/queries/0_stateless/01943_non_deterministic_order_key.sql new file mode 100644 index 00000000000..200a88ec677 --- /dev/null +++ b/tests/queries/0_stateless/01943_non_deterministic_order_key.sql @@ -0,0 +1,3 @@ +CREATE TABLE a (number UInt64) ENGINE = MergeTree ORDER BY if(now() > toDateTime('2020-06-01 13:31:40'), toInt64(number), -number); -- { serverError 36 } +CREATE TABLE b (number UInt64) ENGINE = MergeTree ORDER BY now() > toDateTime(number); -- { serverError 36 } +CREATE TABLE c (number UInt64) ENGINE = MergeTree ORDER BY now(); -- { serverError 36 } diff --git a/tests/queries/0_stateless/01943_pmj_non_joined_stuck.reference.j2 b/tests/queries/0_stateless/01943_pmj_non_joined_stuck.reference.j2 new file mode 100644 index 00000000000..8e54cd28808 --- /dev/null +++ b/tests/queries/0_stateless/01943_pmj_non_joined_stuck.reference.j2 @@ -0,0 +1,3 @@ +{% for i in range(24) -%} +1 +{% endfor -%} diff --git a/tests/queries/0_stateless/01943_pmj_non_joined_stuck.sql.j2 b/tests/queries/0_stateless/01943_pmj_non_joined_stuck.sql.j2 new file mode 100644 index 00000000000..32838b66e83 --- /dev/null +++ b/tests/queries/0_stateless/01943_pmj_non_joined_stuck.sql.j2 @@ -0,0 +1,9 @@ +SET max_block_size = 6, join_algorithm = 'partial_merge'; + +{% for i in range(4, 16) -%} +SELECT count() == {{ i }} FROM (SELECT 100 AS s) AS js1 ALL RIGHT JOIN ( SELECT number AS s FROM numbers({{ i }}) ) AS js2 USING (s); +{% endfor -%} + +{% for i in range(4, 16) -%} +SELECT count() == {{ i + 1 }} FROM (SELECT 100 AS s) AS js1 ALL FULL JOIN ( SELECT number AS s FROM numbers({{ i }}) ) AS js2 USING (s); +{% endfor -%} diff --git a/tests/queries/0_stateless/01943_query_id_check.reference b/tests/queries/0_stateless/01943_query_id_check.reference new file mode 100644 index 00000000000..324d49f8907 --- /dev/null +++ b/tests/queries/0_stateless/01943_query_id_check.reference @@ -0,0 +1,7 @@ +CREATE TABLE tmp ENGINE = TinyLog AS SELECT queryID(); +CREATE TABLE tmp ENGINE = TinyLog AS SELECT initialQueryID(); +3 +3 +1 +1 +3 diff --git a/tests/queries/0_stateless/01943_query_id_check.sql b/tests/queries/0_stateless/01943_query_id_check.sql new file mode 100644 index 00000000000..6e3d281386d --- /dev/null +++ b/tests/queries/0_stateless/01943_query_id_check.sql @@ -0,0 +1,21 @@ +DROP TABLE IF EXISTS tmp; + +CREATE TABLE tmp ENGINE = TinyLog AS SELECT queryID(); +SYSTEM FLUSH LOGS; +SELECT query FROM system.query_log WHERE query_id = (SELECT * FROM tmp) AND current_database = currentDatabase() LIMIT 1; +DROP TABLE tmp; + +CREATE TABLE tmp ENGINE = TinyLog AS SELECT initialQueryID(); +SYSTEM FLUSH LOGS; +SELECT query FROM system.query_log WHERE initial_query_id = (SELECT * FROM tmp) AND current_database = currentDatabase() LIMIT 1; +DROP TABLE tmp; + +CREATE TABLE tmp (str String) ENGINE = Log; +INSERT INTO tmp (*) VALUES ('a') +SELECT count() FROM (SELECT initialQueryID() FROM remote('127.0.0.{1..3}', currentDatabase(), 'tmp') GROUP BY queryID()); +SELECT count() FROM (SELECT queryID() FROM remote('127.0.0.{1..3}', currentDatabase(), 'tmp') GROUP BY queryID()); +SELECT count() FROM (SELECT queryID() AS t FROM remote('127.0.0.{1..3}', currentDatabase(), 'tmp') GROUP BY queryID() HAVING t == initialQueryID()); +SELECT count(DISTINCT t) FROM (SELECT initialQueryID() AS t FROM remote('127.0.0.{1..3}', currentDatabase(), 'tmp') GROUP BY queryID()); +SELECT count(DISTINCT t) FROM (SELECT queryID() AS t FROM remote('127.0.0.{1..3}', currentDatabase(), 'tmp') GROUP BY queryID()); +DROP TABLE tmp; + diff --git a/tests/queries/0_stateless/01944_range_max_elements.reference b/tests/queries/0_stateless/01944_range_max_elements.reference new file mode 100644 index 00000000000..7763ac4ce96 --- /dev/null +++ b/tests/queries/0_stateless/01944_range_max_elements.reference @@ -0,0 +1,33 @@ +[] +[0] +[0,1] +[] +[0] +[0,1] +[] +[0] +[0,1] +[] +[] +[0] +[0,1] +[] +[0] +[0,1] +[] +[0] +[0,1] +[] +[0] +[] +[0] +[0,1] +[] +[0] +[0,1] +[] +[0] +[0,1] +[] +[0] +[0,1] diff --git a/tests/queries/0_stateless/01944_range_max_elements.sql b/tests/queries/0_stateless/01944_range_max_elements.sql new file mode 100644 index 00000000000..c18f61e3190 --- /dev/null +++ b/tests/queries/0_stateless/01944_range_max_elements.sql @@ -0,0 +1,7 @@ +SET function_range_max_elements_in_block = 10; +SELECT range(number % 3) FROM numbers(10); +SELECT range(number % 3) FROM numbers(11); +SELECT range(number % 3) FROM numbers(12); -- { serverError 69 } + +SET function_range_max_elements_in_block = 12; +SELECT range(number % 3) FROM numbers(12); diff --git a/tests/queries/0_stateless/01945_show_debug_warning.expect b/tests/queries/0_stateless/01945_show_debug_warning.expect new file mode 100755 index 00000000000..7f14fdfbc96 --- /dev/null +++ b/tests/queries/0_stateless/01945_show_debug_warning.expect @@ -0,0 +1,50 @@ +#!/usr/bin/expect -f + +# This is a test for system.warnings. Testing in interactive mode is necessary, +# as we want to see certain warnings from client + +log_user 0 +set timeout 60 +match_max 100000 + +# A default timeout action is to do nothing, change it to fail +expect_after { + timeout { + exit 1 + } +} + +set basedir [file dirname $argv0] +set Debug_type 0 + +spawn bash -c "source $basedir/../shell_config.sh ; \$CLICKHOUSE_CLIENT_BINARY \$CLICKHOUSE_CLIENT_OPT --disable_suggestion" +expect ":) " + +# Check debug type +send -- "SELECT value FROM system.build_options WHERE name='BUILD_TYPE'\r" +expect { +"Debug" { + set Debug_type 1 + expect ":) " + } +"RelWithDebInfo" +} + +send -- "q\r" +expect eof + +if { $Debug_type > 0} { + +spawn bash -c "source $basedir/../shell_config.sh ; \$CLICKHOUSE_CLIENT_BINARY \$CLICKHOUSE_CLIENT_OPT --disable_suggestion" +expect "Warnings:" +expect " * Server was built in debug mode. It will work slowly." +expect ":) " + +# Check debug message in system.warnings +send -- "SELECT message FROM system.warnings WHERE message='Server was built in debug mode. It will work slowly.'\r" +expect "Server was built in debug mode. It will work slowly." +expect ":) " + +send -- "q\r" +expect eof +} diff --git a/tests/queries/0_stateless/01945_show_debug_warning.reference b/tests/queries/0_stateless/01945_show_debug_warning.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/01945_system_warnings.expect b/tests/queries/0_stateless/01945_system_warnings.expect new file mode 100755 index 00000000000..01a314429f8 --- /dev/null +++ b/tests/queries/0_stateless/01945_system_warnings.expect @@ -0,0 +1,40 @@ +#!/usr/bin/expect -f + +# This is a test for system.warnings. Testing in interactive mode is necessary, +# as we want to see certain warnings from client + +log_user 0 +set timeout 60 +match_max 100000 + +# A default timeout action is to do nothing, change it to fail +expect_after { + timeout { + exit 1 + } +} + +set basedir [file dirname $argv0] +spawn bash -c "source $basedir/../shell_config.sh ; \$CLICKHOUSE_CLIENT_BINARY \$CLICKHOUSE_CLIENT_OPT --disable_suggestion" +expect ":) " + +#find out BUILD TYPE +send -- "SELECT value FROM system.build_options WHERE name='BUILD_TYPE'\r" +expect { + "Debug" { + # Check debug message in system.warnings + send -- "SELECT message FROM system.warnings WHERE message='Server was built in debug mode. It will work slowly.'\r" + expect "Server was built in debug mode. It will work slowly." + expect ":) " + } + "RelWithDebInfo" { + # Check empty to find out existence + send -- "SELECT message FROM system.warnings WHERE 0=1\r" + expect "Ok." + expect ":) " + } +} + +# Finish test +send -- "q\r" +expect eof diff --git a/tests/queries/0_stateless/01945_system_warnings.reference b/tests/queries/0_stateless/01945_system_warnings.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/01946_profile_sleep.reference b/tests/queries/0_stateless/01946_profile_sleep.reference new file mode 100644 index 00000000000..cc2d9ab80f9 --- /dev/null +++ b/tests/queries/0_stateless/01946_profile_sleep.reference @@ -0,0 +1,6 @@ +{"'SLEEP #1 CHECK'":"SLEEP #1 CHECK","calls":"1","microseconds":"1000"} +{"'SLEEP #2 CHECK'":"SLEEP #2 CHECK","calls":"1","microseconds":"1000"} +{"'SLEEP #3 CHECK'":"SLEEP #3 CHECK","calls":"1","microseconds":"1000"} +{"'SLEEP #4 CHECK'":"SLEEP #4 CHECK","calls":"2","microseconds":"2000"} +{"'SLEEP #5 CHECK'":"SLEEP #5 CHECK","calls":"0","microseconds":"0"} +{"'SLEEP #6 CHECK'":"SLEEP #6 CHECK","calls":"10","microseconds":"10000"} diff --git a/tests/queries/0_stateless/01946_profile_sleep.sql b/tests/queries/0_stateless/01946_profile_sleep.sql new file mode 100644 index 00000000000..01c203fb73e --- /dev/null +++ b/tests/queries/0_stateless/01946_profile_sleep.sql @@ -0,0 +1,65 @@ +SET log_queries=1; +SET log_profile_events=true; + +SELECT 'SLEEP #1 TEST', sleep(0.001) FORMAT Null; +SYSTEM FLUSH LOGS; +SELECT 'SLEEP #1 CHECK', ProfileEvents['SleepFunctionCalls'] as calls, ProfileEvents['SleepFunctionMicroseconds'] as microseconds +FROM system.query_log +WHERE query like '%SELECT ''SLEEP #1 TEST''%' + AND type > 1 + AND current_database = currentDatabase() + AND event_date >= yesterday() + FORMAT JSONEachRow; + +SELECT 'SLEEP #2 TEST', sleep(0.001) FROM numbers(2) FORMAT Null; +SYSTEM FLUSH LOGS; +SELECT 'SLEEP #2 CHECK', ProfileEvents['SleepFunctionCalls'] as calls, ProfileEvents['SleepFunctionMicroseconds'] as microseconds +FROM system.query_log +WHERE query like '%SELECT ''SLEEP #2 TEST''%' + AND type > 1 + AND current_database = currentDatabase() + AND event_date >= yesterday() + FORMAT JSONEachRow; + +SELECT 'SLEEP #3 TEST', sleepEachRow(0.001) FORMAT Null; +SYSTEM FLUSH LOGS; +SELECT 'SLEEP #3 CHECK', ProfileEvents['SleepFunctionCalls'] as calls, ProfileEvents['SleepFunctionMicroseconds'] as microseconds +FROM system.query_log +WHERE query like '%SELECT ''SLEEP #3 TEST''%' + AND type > 1 + AND current_database = currentDatabase() + AND event_date >= yesterday() + FORMAT JSONEachRow; + +SELECT 'SLEEP #4 TEST', sleepEachRow(0.001) FROM numbers(2) FORMAT Null; +SYSTEM FLUSH LOGS; +SELECT 'SLEEP #4 CHECK', ProfileEvents['SleepFunctionCalls'] as calls, ProfileEvents['SleepFunctionMicroseconds'] as microseconds +FROM system.query_log +WHERE query like '%SELECT ''SLEEP #4 TEST''%' + AND type > 1 + AND current_database = currentDatabase() + AND event_date >= yesterday() + FORMAT JSONEachRow; + + +CREATE VIEW sleep_view AS SELECT sleepEachRow(0.001) FROM system.numbers; +SYSTEM FLUSH LOGS; +SELECT 'SLEEP #5 CHECK', ProfileEvents['SleepFunctionCalls'] as calls, ProfileEvents['SleepFunctionMicroseconds'] as microseconds +FROM system.query_log +WHERE query like '%CREATE VIEW sleep_view AS%' + AND type > 1 + AND current_database = currentDatabase() + AND event_date >= yesterday() + FORMAT JSONEachRow; + +SELECT 'SLEEP #6 TEST', sleepEachRow(0.001) FROM sleep_view LIMIT 10 FORMAT Null; +SYSTEM FLUSH LOGS; +SELECT 'SLEEP #6 CHECK', ProfileEvents['SleepFunctionCalls'] as calls, ProfileEvents['SleepFunctionMicroseconds'] as microseconds +FROM system.query_log +WHERE query like '%SELECT ''SLEEP #6 TEST''%' + AND type > 1 + AND current_database = currentDatabase() + AND event_date >= yesterday() + FORMAT JSONEachRow; + +DROP TABLE sleep_view; diff --git a/tests/queries/0_stateless/01946_test.reference b/tests/queries/0_stateless/01946_test.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/01946_test_wrong_host_name_access.reference b/tests/queries/0_stateless/01946_test_wrong_host_name_access.reference new file mode 100644 index 00000000000..1191247b6d9 --- /dev/null +++ b/tests/queries/0_stateless/01946_test_wrong_host_name_access.reference @@ -0,0 +1,2 @@ +1 +2 diff --git a/tests/queries/0_stateless/01946_test_wrong_host_name_access.sh b/tests/queries/0_stateless/01946_test_wrong_host_name_access.sh new file mode 100755 index 00000000000..86e1fdd768f --- /dev/null +++ b/tests/queries/0_stateless/01946_test_wrong_host_name_access.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +MYHOSTNAME=$(hostname -f) + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +${CLICKHOUSE_CLIENT} --multiquery --query " + DROP USER IF EXISTS dns_fail_1, dns_fail_2; + CREATE USER dns_fail_1 HOST NAME 'non.existing.host.name', '${MYHOSTNAME}'; + CREATE USER dns_fail_2 HOST NAME '${MYHOSTNAME}', 'non.existing.host.name';" + +${CLICKHOUSE_CLIENT} --query "SELECT 1" --user dns_fail_1 --host ${MYHOSTNAME} + +${CLICKHOUSE_CLIENT} --query "SELECT 2" --user dns_fail_2 --host ${MYHOSTNAME} + +${CLICKHOUSE_CLIENT} --query "DROP USER IF EXISTS dns_fail_1, dns_fail_2" + +${CLICKHOUSE_CLIENT} --query "SYSTEM DROP DNS CACHE" diff --git a/tests/queries/0_stateless/01946_test_zstd_decompression_with_escape_sequence_at_the_end_of_buffer.reference b/tests/queries/0_stateless/01946_test_zstd_decompression_with_escape_sequence_at_the_end_of_buffer.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/01946_test_zstd_decompression_with_escape_sequence_at_the_end_of_buffer.sh b/tests/queries/0_stateless/01946_test_zstd_decompression_with_escape_sequence_at_the_end_of_buffer.sh new file mode 100755 index 00000000000..abca5cdfa3b --- /dev/null +++ b/tests/queries/0_stateless/01946_test_zstd_decompression_with_escape_sequence_at_the_end_of_buffer.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + + +# See 01658_read_file_to_string_column.sh +user_files_path=$(clickhouse-client --query "select _path,_file from file('nonexist.txt', 'CSV', 'val1 char')" 2>&1 | grep Exception | awk '{gsub("/nonexist.txt","",$9); print $9}') +mkdir -p ${user_files_path}/ +cp $CUR_DIR/data_zstd/test_01946.zstd ${user_files_path}/ + +${CLICKHOUSE_CLIENT} --multiline --multiquery --query " +set max_read_buffer_size = 65536; +set input_format_parallel_parsing = 0; +select * from file('test_01946.zstd', 'JSONEachRow', 'foo String') limit 30 format Null; +set input_format_parallel_parsing = 1; +select * from file('test_01946.zstd', 'JSONEachRow', 'foo String') limit 30 format Null; +" + diff --git a/tests/queries/0_stateless/01946_tskv.reference b/tests/queries/0_stateless/01946_tskv.reference new file mode 100644 index 00000000000..5a3b19fa88f --- /dev/null +++ b/tests/queries/0_stateless/01946_tskv.reference @@ -0,0 +1 @@ +can contain = symbol diff --git a/tests/queries/0_stateless/01946_tskv.sh b/tests/queries/0_stateless/01946_tskv.sh new file mode 100755 index 00000000000..ecc18d205d2 --- /dev/null +++ b/tests/queries/0_stateless/01946_tskv.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +$CLICKHOUSE_CLIENT --query="DROP TABLE IF EXISTS tskv"; +$CLICKHOUSE_CLIENT --query="CREATE TABLE tskv (text String) ENGINE = Memory"; + +# shellcheck disable=SC2028 +echo -n 'tskv text=can contain \= symbol +' | $CLICKHOUSE_CLIENT --query="INSERT INTO tskv FORMAT TSKV"; + +$CLICKHOUSE_CLIENT --query="SELECT * FROM tskv"; +$CLICKHOUSE_CLIENT --query="DROP TABLE tskv"; diff --git a/tests/queries/0_stateless/01947_multiple_pipe_read.reference b/tests/queries/0_stateless/01947_multiple_pipe_read.reference new file mode 100644 index 00000000000..de88ec2140e --- /dev/null +++ b/tests/queries/0_stateless/01947_multiple_pipe_read.reference @@ -0,0 +1,86 @@ +File generated: +0 BBB +1 BBB +2 BBB +3 BBB +4 AAA +5 BBB +6 AAA +****************** +Read twice from a regular file +0 BBB +1 BBB +2 BBB +3 BBB +4 AAA +5 BBB +6 AAA +0 BBB +1 BBB +2 BBB +3 BBB +4 AAA +5 BBB +6 AAA +--- +0 BBB +1 BBB +2 BBB +3 BBB +4 AAA +5 BBB +6 AAA +--- +0 BBB +1 BBB +2 BBB +3 BBB +4 AAA +5 BBB +6 AAA +0 BBB +1 BBB +2 BBB +3 BBB +4 AAA +5 BBB +6 AAA +****************** +Read twice from file descriptor that corresponds to a regular file +0 BBB +1 BBB +2 BBB +3 BBB +4 AAA +5 BBB +6 AAA +0 BBB +1 BBB +2 BBB +3 BBB +4 AAA +5 BBB +6 AAA +--- +0 BBB +1 BBB +2 BBB +3 BBB +4 AAA +5 BBB +6 AAA +--- +0 BBB +1 BBB +2 BBB +3 BBB +4 AAA +5 BBB +6 AAA +0 BBB +1 BBB +2 BBB +3 BBB +4 AAA +5 BBB +6 AAA diff --git a/tests/queries/0_stateless/01947_multiple_pipe_read.sh b/tests/queries/0_stateless/01947_multiple_pipe_read.sh new file mode 100755 index 00000000000..de9ca47f8cf --- /dev/null +++ b/tests/queries/0_stateless/01947_multiple_pipe_read.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +SAMPLE_FILE=$(mktemp 01947_multiple_pipe_read_sample_data_XXXXXX.csv) + +echo 'File generated:' +${CLICKHOUSE_LOCAL} -q "SELECT number AS x, if(number in (4,6), 'AAA', 'BBB') AS s from numbers(7)" > "$SAMPLE_FILE" +cat "$SAMPLE_FILE" + +echo '******************' +echo 'Read twice from a regular file' +${CLICKHOUSE_LOCAL} --structure 'x UInt64, s String' -q 'select * from table; select * from table;' --file "$SAMPLE_FILE" +echo '---' +${CLICKHOUSE_LOCAL} --structure 'x UInt64, s String' -q 'select * from table WHERE x IN (select x from table);' --file "$SAMPLE_FILE" +echo '---' +${CLICKHOUSE_LOCAL} --structure 'x UInt64, s String' -q 'select * from table UNION ALL select * from table;' --file "$SAMPLE_FILE" + +echo '******************' +echo 'Read twice from file descriptor that corresponds to a regular file' +${CLICKHOUSE_LOCAL} --structure 'x UInt64, s String' -q 'select * from table; select * from table;' < "$SAMPLE_FILE" +echo '---' +${CLICKHOUSE_LOCAL} --structure 'x UInt64, s String' -q 'select * from table WHERE x IN (select x from table);' < "$SAMPLE_FILE" +echo '---' +${CLICKHOUSE_LOCAL} --structure 'x UInt64, s String' -q 'select * from table UNION ALL select * from table;' < "$SAMPLE_FILE" + +rm "$SAMPLE_FILE" diff --git a/tests/queries/0_stateless/01947_mv_subquery.reference b/tests/queries/0_stateless/01947_mv_subquery.reference new file mode 100644 index 00000000000..fe65b417907 --- /dev/null +++ b/tests/queries/0_stateless/01947_mv_subquery.reference @@ -0,0 +1,6 @@ +{"test":"1947 #1 CHECK - TRUE","sleep_calls":"0","sleep_microseconds":"0"} +{"test":"1947 #2 CHECK - TRUE","sleep_calls":"2","sleep_microseconds":"2000"} +{"test":"1947 #3 CHECK - TRUE","sleep_calls":"0","sleep_microseconds":"0"} +{"test":"1947 #1 CHECK - FALSE","sleep_calls":"0","sleep_microseconds":"0"} +{"test":"1947 #2 CHECK - FALSE","sleep_calls":"2","sleep_microseconds":"2000"} +{"test":"1947 #3 CHECK - FALSE","sleep_calls":"0","sleep_microseconds":"0"} diff --git a/tests/queries/0_stateless/01947_mv_subquery.sql b/tests/queries/0_stateless/01947_mv_subquery.sql new file mode 100644 index 00000000000..ae67e46e0ae --- /dev/null +++ b/tests/queries/0_stateless/01947_mv_subquery.sql @@ -0,0 +1,145 @@ +SET log_queries=1; +SET log_profile_events=true; + +CREATE TABLE src Engine=MergeTree ORDER BY id AS SELECT number as id, toInt32(1) as value FROM numbers(1); +CREATE TABLE dst (id UInt64, delta Int64) Engine=MergeTree ORDER BY id; + +-- First we try with default values (https://github.com/ClickHouse/ClickHouse/issues/9587) +SET use_index_for_in_with_subqueries = 1; + +CREATE MATERIALIZED VIEW src2dst_true TO dst AS +SELECT + id, + src.value - deltas_sum as delta +FROM src +LEFT JOIN +( + SELECT id, sum(delta) as deltas_sum FROM dst + WHERE id IN (SELECT id FROM src WHERE not sleepEachRow(0.001)) + GROUP BY id +) _a +USING (id); + +-- Inserting 2 numbers should require 2 calls to sleep +INSERT into src SELECT number + 100 as id, 1 FROM numbers(2); + +-- Describe should not need to call sleep +DESCRIBE ( SELECT '1947 #3 QUERY - TRUE', + id, + src.value - deltas_sum as delta + FROM src + LEFT JOIN + ( + SELECT id, sum(delta) as deltas_sum FROM dst + WHERE id IN (SELECT id FROM src WHERE not sleepEachRow(0.001)) + GROUP BY id + ) _a + USING (id) + ) FORMAT Null; + + +SYSTEM FLUSH LOGS; + +SELECT '1947 #1 CHECK - TRUE' as test, + ProfileEvents['SleepFunctionCalls'] as sleep_calls, + ProfileEvents['SleepFunctionMicroseconds'] as sleep_microseconds +FROM system.query_log +WHERE query like '%CREATE MATERIALIZED VIEW src2dst_true%' + AND type > 1 + AND current_database = currentDatabase() + AND event_date >= yesterday() + FORMAT JSONEachRow; + +SELECT '1947 #2 CHECK - TRUE' as test, + ProfileEvents['SleepFunctionCalls'] as sleep_calls, + ProfileEvents['SleepFunctionMicroseconds'] as sleep_microseconds +FROM system.query_log +WHERE query like '%INSERT into src SELECT number + 100 as id, 1 FROM numbers(2)%' + AND type > 1 + AND current_database = currentDatabase() + AND event_date >= yesterday() + FORMAT JSONEachRow; + +SELECT '1947 #3 CHECK - TRUE' as test, + ProfileEvents['SleepFunctionCalls'] as sleep_calls, + ProfileEvents['SleepFunctionMicroseconds'] as sleep_microseconds +FROM system.query_log +WHERE query like '%DESCRIBE ( SELECT ''1947 #3 QUERY - TRUE'',%' + AND type > 1 + AND current_database = currentDatabase() + AND event_date >= yesterday() + FORMAT JSONEachRow; + +DROP TABLE src2dst_true; + + +-- Retry the same but using use_index_for_in_with_subqueries = 0 + +SET use_index_for_in_with_subqueries = 0; + +CREATE MATERIALIZED VIEW src2dst_false TO dst AS +SELECT + id, + src.value - deltas_sum as delta +FROM src +LEFT JOIN +( + SELECT id, sum(delta) as deltas_sum FROM dst + WHERE id IN (SELECT id FROM src WHERE not sleepEachRow(0.001)) + GROUP BY id +) _a +USING (id); + +-- Inserting 2 numbers should require 2 calls to sleep +INSERT into src SELECT number + 200 as id, 1 FROM numbers(2); + +-- Describe should not need to call sleep +DESCRIBE ( SELECT '1947 #3 QUERY - FALSE', + id, + src.value - deltas_sum as delta + FROM src + LEFT JOIN + ( + SELECT id, sum(delta) as deltas_sum FROM dst + WHERE id IN (SELECT id FROM src WHERE not sleepEachRow(0.001)) + GROUP BY id + ) _a + USING (id) + ) FORMAT Null; + +SYSTEM FLUSH LOGS; + +SELECT '1947 #1 CHECK - FALSE' as test, + ProfileEvents['SleepFunctionCalls'] as sleep_calls, + ProfileEvents['SleepFunctionMicroseconds'] as sleep_microseconds +FROM system.query_log +WHERE query like '%CREATE MATERIALIZED VIEW src2dst_false%' + AND type > 1 + AND current_database = currentDatabase() + AND event_date >= yesterday() + FORMAT JSONEachRow; + +SELECT '1947 #2 CHECK - FALSE' as test, + ProfileEvents['SleepFunctionCalls'] as sleep_calls, + ProfileEvents['SleepFunctionMicroseconds'] as sleep_microseconds +FROM system.query_log +WHERE query like '%INSERT into src SELECT number + 200 as id, 1 FROM numbers(2)%' + AND type > 1 + AND current_database = currentDatabase() + AND event_date >= yesterday() + FORMAT JSONEachRow; + +SELECT '1947 #3 CHECK - FALSE' as test, + ProfileEvents['SleepFunctionCalls'] as sleep_calls, + ProfileEvents['SleepFunctionMicroseconds'] as sleep_microseconds +FROM system.query_log +WHERE query like '%DESCRIBE ( SELECT ''1947 #3 QUERY - FALSE'',%' + AND type > 1 + AND current_database = currentDatabase() + AND event_date >= yesterday() + FORMAT JSONEachRow; + +DROP TABLE src2dst_false; + +DROP TABLE src; +DROP TABLE dst; diff --git a/tests/queries/0_stateless/01948_dictionary_quoted_database_name.reference b/tests/queries/0_stateless/01948_dictionary_quoted_database_name.reference new file mode 100644 index 00000000000..6a9fb68a92e --- /dev/null +++ b/tests/queries/0_stateless/01948_dictionary_quoted_database_name.reference @@ -0,0 +1,2 @@ +0 Value +0 Value diff --git a/tests/queries/0_stateless/01948_dictionary_quoted_database_name.sql b/tests/queries/0_stateless/01948_dictionary_quoted_database_name.sql new file mode 100644 index 00000000000..21e8e07c724 --- /dev/null +++ b/tests/queries/0_stateless/01948_dictionary_quoted_database_name.sql @@ -0,0 +1,38 @@ +DROP DATABASE IF EXISTS `01945.db`; +CREATE DATABASE `01945.db`; + +CREATE TABLE `01945.db`.test_dictionary_values +( + id UInt64, + value String +) ENGINE=TinyLog; + +INSERT INTO `01945.db`.test_dictionary_values VALUES (0, 'Value'); + +CREATE DICTIONARY `01945.db`.test_dictionary +( + id UInt64, + value String +) +PRIMARY KEY id +LAYOUT(DIRECT()) +SOURCE(CLICKHOUSE(DB '01945.db' TABLE 'test_dictionary_values')); + +SELECT * FROM `01945.db`.test_dictionary; +DROP DICTIONARY `01945.db`.test_dictionary; + +CREATE DICTIONARY `01945.db`.`test_dictionary.test` +( + id UInt64, + value String +) +PRIMARY KEY id +LAYOUT(DIRECT()) +SOURCE(CLICKHOUSE(DB '01945.db' TABLE 'test_dictionary_values')); + +SELECT * FROM `01945.db`.`test_dictionary.test`; +DROP DICTIONARY `01945.db`.`test_dictionary.test`; + + +DROP TABLE `01945.db`.test_dictionary_values; +DROP DATABASE `01945.db`; diff --git a/tests/queries/0_stateless/01948_group_bitmap_and_or_xor_fix.reference b/tests/queries/0_stateless/01948_group_bitmap_and_or_xor_fix.reference new file mode 100644 index 00000000000..1cec1260860 --- /dev/null +++ b/tests/queries/0_stateless/01948_group_bitmap_and_or_xor_fix.reference @@ -0,0 +1 @@ +1 1 0 diff --git a/tests/queries/0_stateless/01948_group_bitmap_and_or_xor_fix.sql b/tests/queries/0_stateless/01948_group_bitmap_and_or_xor_fix.sql new file mode 100644 index 00000000000..7a7c603ffa5 --- /dev/null +++ b/tests/queries/0_stateless/01948_group_bitmap_and_or_xor_fix.sql @@ -0,0 +1 @@ +SELECT groupBitmapAnd(bitmapBuild([toInt32(1)])), groupBitmapOr(bitmapBuild([toInt32(1)])), groupBitmapXor(bitmapBuild([toInt32(1)])) FROM cluster(test_cluster_two_shards, numbers(10)); diff --git a/tests/queries/0_stateless/01948_heredoc.reference b/tests/queries/0_stateless/01948_heredoc.reference new file mode 100644 index 00000000000..2f40275e1d2 --- /dev/null +++ b/tests/queries/0_stateless/01948_heredoc.reference @@ -0,0 +1,14 @@ + +VALUE + +VALUE +\'VALUE\' +$do$ $ doc$ $doc $ $doco$ +$do$ $ doc$ $doc $ $doco$ $do$ $ doc$ $doc $ $doco$ +ТЕСТ +该类型的引擎 +VALUE +VALUE +\nvalue1\nvalue2\nvalue3\n +\'\\xc3\\x28\' +\'\\xc3\\x28\' diff --git a/tests/queries/0_stateless/01948_heredoc.sql b/tests/queries/0_stateless/01948_heredoc.sql new file mode 100644 index 00000000000..4a4ced004e3 --- /dev/null +++ b/tests/queries/0_stateless/01948_heredoc.sql @@ -0,0 +1,22 @@ +SELECT $$$$; +SELECT $$VALUE$$; +SELECT $doc$$doc$; +SELECT $doc$VALUE$doc$; +SELECT $doc$'VALUE'$doc$; +SELECT $doc$$do$ $ doc$ $doc $ $doco$$doc$; +SELECT $doc$$do$ $ doc$ $doc $ $doco$$doc$, $doc$$do$ $ doc$ $doc $ $doco$$doc$; + +SELECT $doc$ТЕСТ$doc$; +SELECT $doc$该类型的引擎$doc$; + +SELECT $РАЗДЕЛИТЕЛЬ$VALUE$РАЗДЕЛИТЕЛЬ$; +SELECT $该类型的引擎$VALUE$该类型的引擎$; + +SELECT $$ +value1 +value2 +value3 +$$; + +SELECT $doc$'\xc3\x28'$doc$; +SELECT $\xc3\x28$'\xc3\x28'$\xc3\x28$; diff --git a/tests/queries/0_stateless/01949_clickhouse_local_with_remote_localhost.reference b/tests/queries/0_stateless/01949_clickhouse_local_with_remote_localhost.reference new file mode 100644 index 00000000000..e342541fca6 --- /dev/null +++ b/tests/queries/0_stateless/01949_clickhouse_local_with_remote_localhost.reference @@ -0,0 +1,8 @@ +Code:81. +"test2",0 +"test2",1 +"test2",2 +Code:81. +"test4",0 +"test4",1 +"test4",2 diff --git a/tests/queries/0_stateless/01949_clickhouse_local_with_remote_localhost.sh b/tests/queries/0_stateless/01949_clickhouse_local_with_remote_localhost.sh new file mode 100755 index 00000000000..efd49d47017 --- /dev/null +++ b/tests/queries/0_stateless/01949_clickhouse_local_with_remote_localhost.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + + +${CLICKHOUSE_CLIENT} --query "CREATE TABLE ${CLICKHOUSE_DATABASE}.remote_table (a Int64) ENGINE=TinyLog AS SELECT * FROM system.numbers limit 10;" + +if [ "$CLICKHOUSE_HOST" == "localhost" ]; then + # Connecting to 127.0.0.1 will connect to clickhouse-local itself, where the table doesn't exist + ${CLICKHOUSE_LOCAL} -q "SELECT 'test1', * FROM remote('127.0.0.1', '${CLICKHOUSE_DATABASE}.remote_table') LIMIT 3;" 2>&1 | awk '{print $1 $2}' + + # Now connecting to 127.0.0.1:9000 will connect to the database we are running tests against + ${CLICKHOUSE_LOCAL} -q "SELECT 'test2', * FROM remote('127.0.0.1:${CLICKHOUSE_PORT_TCP}', '${CLICKHOUSE_DATABASE}.remote_table') LIMIT 3 FORMAT CSV;" 2>&1 \ + | grep -av "ASan doesn't fully support makecontext/swapcontext functions" + + # Same test now against localhost + ${CLICKHOUSE_LOCAL} -q "SELECT 'test3', * FROM remote('localhost', '${CLICKHOUSE_DATABASE}.remote_table') LIMIT 3;" 2>&1 | awk '{print $1 $2}' + + ${CLICKHOUSE_LOCAL} -q "SELECT 'test4', * FROM remote('localhost:${CLICKHOUSE_PORT_TCP}', '${CLICKHOUSE_DATABASE}.remote_table') LIMIT 3 FORMAT CSV;" 2>&1 \ + | grep -av "ASan doesn't fully support makecontext/swapcontext functions" +else + # Can't test without localhost + echo Code:81. + echo \"test2\",0 + echo \"test2\",1 + echo \"test2\",2 + echo Code:81. + echo \"test4\",0 + echo \"test4\",1 + echo \"test4\",2 +fi + + +${CLICKHOUSE_CLIENT} --query "DROP TABLE ${CLICKHOUSE_DATABASE}.remote_table;" diff --git a/tests/queries/0_stateless/01949_heredoc_unfinished.reference b/tests/queries/0_stateless/01949_heredoc_unfinished.reference new file mode 100644 index 00000000000..234840fd3dd --- /dev/null +++ b/tests/queries/0_stateless/01949_heredoc_unfinished.reference @@ -0,0 +1,6 @@ +doc +abc +abc +1 +1 +1 diff --git a/tests/queries/0_stateless/01949_heredoc_unfinished.sh b/tests/queries/0_stateless/01949_heredoc_unfinished.sh new file mode 100755 index 00000000000..8ab9ffd6406 --- /dev/null +++ b/tests/queries/0_stateless/01949_heredoc_unfinished.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +curl -sS "${CLICKHOUSE_URL}&query=SELECT%20%24%24doc%24%24VALUE%24%24doc%24%24"; +curl -sS "${CLICKHOUSE_URL}&query=SELECT%20%24%24abc%24%24"; +curl -sS "${CLICKHOUSE_URL}&query=SELECT%20%24%24abc%24%24d"; +curl -sS "${CLICKHOUSE_URL}&query=SELECT%20%24%24ab" | grep -c "DB::Exception"; +curl -sS "${CLICKHOUSE_URL}&query=SELECT%20%24%24" | grep -c "DB::Exception"; +curl -sS "${CLICKHOUSE_URL}&query=SELECT%20%24" | grep -c "DB::Exception"; diff --git a/tests/queries/0_stateless/01950_kill_large_group_by_query.reference b/tests/queries/0_stateless/01950_kill_large_group_by_query.reference new file mode 100644 index 00000000000..1602d6587ad --- /dev/null +++ b/tests/queries/0_stateless/01950_kill_large_group_by_query.reference @@ -0,0 +1,2 @@ +finished test_01948_tcp_default default SELECT * FROM\n (\n SELECT a.name as n\n FROM\n (\n SELECT \'Name\' as name, number FROM system.numbers LIMIT 2000000\n ) AS a,\n (\n SELECT \'Name\' as name, number FROM system.numbers LIMIT 2000000\n ) as b\n GROUP BY n\n )\n LIMIT 20\n FORMAT Null +finished test_01948_http_default default SELECT * FROM\n (\n SELECT a.name as n\n FROM\n (\n SELECT \'Name\' as name, number FROM system.numbers LIMIT 2000000\n ) AS a,\n (\n SELECT \'Name\' as name, number FROM system.numbers LIMIT 2000000\n ) as b\n GROUP BY n\n )\n LIMIT 20\n FORMAT Null diff --git a/tests/queries/0_stateless/01950_kill_large_group_by_query.sh b/tests/queries/0_stateless/01950_kill_large_group_by_query.sh new file mode 100755 index 00000000000..465b923187e --- /dev/null +++ b/tests/queries/0_stateless/01950_kill_large_group_by_query.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +set -e -o pipefail + +function wait_for_query_to_start() +{ + while [[ $($CLICKHOUSE_CLIENT -q "SELECT count() FROM system.processes WHERE query_id = '$1'") == 0 ]]; do sleep 0.1; done +} + + +# TCP CLIENT + +$CLICKHOUSE_CLIENT --max_execution_time 10 --query_id "test_01948_tcp_$CLICKHOUSE_DATABASE" -q \ + "SELECT * FROM + ( + SELECT a.name as n + FROM + ( + SELECT 'Name' as name, number FROM system.numbers LIMIT 2000000 + ) AS a, + ( + SELECT 'Name' as name, number FROM system.numbers LIMIT 2000000 + ) as b + GROUP BY n + ) + LIMIT 20 + FORMAT Null" > /dev/null 2>&1 & +wait_for_query_to_start "test_01948_tcp_$CLICKHOUSE_DATABASE" +$CLICKHOUSE_CLIENT --max_execution_time 10 -q "KILL QUERY WHERE query_id = 'test_01948_tcp_$CLICKHOUSE_DATABASE' SYNC" + + +# HTTP CLIENT + +${CLICKHOUSE_CURL_COMMAND} -q --max-time 10 -sS "$CLICKHOUSE_URL&query_id=test_01948_http_$CLICKHOUSE_DATABASE" -d \ + "SELECT * FROM + ( + SELECT a.name as n + FROM + ( + SELECT 'Name' as name, number FROM system.numbers LIMIT 2000000 + ) AS a, + ( + SELECT 'Name' as name, number FROM system.numbers LIMIT 2000000 + ) as b + GROUP BY n + ) + LIMIT 20 + FORMAT Null" > /dev/null 2>&1 & +wait_for_query_to_start "test_01948_http_$CLICKHOUSE_DATABASE" +$CLICKHOUSE_CURL --max-time 10 -sS "$CLICKHOUSE_URL" -d "KILL QUERY WHERE query_id = 'test_01948_http_$CLICKHOUSE_DATABASE' SYNC" diff --git a/tests/queries/0_stateless/01951_distributed_push_down_limit.reference b/tests/queries/0_stateless/01951_distributed_push_down_limit.reference new file mode 100644 index 00000000000..ca3bbc4cb33 --- /dev/null +++ b/tests/queries/0_stateless/01951_distributed_push_down_limit.reference @@ -0,0 +1,32 @@ +-- { echo } +explain select * from remote('127.{1,2}', view(select * from numbers(1e6))) order by number limit 10 settings distributed_push_down_limit=0; +Expression (Projection) + Limit (preliminary LIMIT (without OFFSET)) + MergingSorted (Merge sorted streams after aggregation stage for ORDER BY) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + Union + MergingSorted (Merge sorted streams for ORDER BY) + MergeSorting (Merge sorted blocks for ORDER BY) + PartialSorting (Sort each block for ORDER BY) + Expression (Before ORDER BY) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + Expression ((Convert VIEW subquery result to VIEW table structure + (Materialize constants after VIEW subquery + (Projection + Before ORDER BY)))) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + ReadFromStorage (SystemNumbers) + ReadFromRemote (Read from remote replica) +explain select * from remote('127.{1,2}', view(select * from numbers(1e6))) order by number limit 10 settings distributed_push_down_limit=1; +Expression (Projection) + Limit (preliminary LIMIT (without OFFSET)) + MergingSorted (Merge sorted streams after aggregation stage for ORDER BY) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + Union + Limit (preliminary LIMIT (with OFFSET)) + MergingSorted (Merge sorted streams for ORDER BY) + MergeSorting (Merge sorted blocks for ORDER BY) + PartialSorting (Sort each block for ORDER BY) + Expression (Before ORDER BY) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + Expression ((Convert VIEW subquery result to VIEW table structure + (Materialize constants after VIEW subquery + (Projection + Before ORDER BY)))) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + ReadFromStorage (SystemNumbers) + ReadFromRemote (Read from remote replica) diff --git a/tests/queries/0_stateless/01951_distributed_push_down_limit.sql b/tests/queries/0_stateless/01951_distributed_push_down_limit.sql new file mode 100644 index 00000000000..0d6e2069215 --- /dev/null +++ b/tests/queries/0_stateless/01951_distributed_push_down_limit.sql @@ -0,0 +1,3 @@ +-- { echo } +explain select * from remote('127.{1,2}', view(select * from numbers(1e6))) order by number limit 10 settings distributed_push_down_limit=0; +explain select * from remote('127.{1,2}', view(select * from numbers(1e6))) order by number limit 10 settings distributed_push_down_limit=1; diff --git a/tests/queries/0_stateless/01952_optimize_distributed_group_by_sharding_key.reference b/tests/queries/0_stateless/01952_optimize_distributed_group_by_sharding_key.reference new file mode 100644 index 00000000000..10787068f43 --- /dev/null +++ b/tests/queries/0_stateless/01952_optimize_distributed_group_by_sharding_key.reference @@ -0,0 +1,115 @@ +-- { echo } +explain select distinct k1 from remote('127.{1,2}', view(select 1 k1, 2 k2, 3 v from numbers(2)), cityHash64(k1, k2)); -- not optimized +Expression (Projection) + Distinct + SettingQuotaAndLimits (Set limits and quota after reading from storage) + Union + Distinct (Preliminary DISTINCT) + Expression (Before ORDER BY) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + Expression ((Convert VIEW subquery result to VIEW table structure + (Materialize constants after VIEW subquery + (Projection + Before ORDER BY)))) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + ReadFromStorage (SystemNumbers) + ReadFromRemote (Read from remote replica) +explain select distinct k1, k2 from remote('127.{1,2}', view(select 1 k1, 2 k2, 3 v from numbers(2)), cityHash64(k1, k2)); -- optimized +SettingQuotaAndLimits (Set limits and quota after reading from storage) + Union + Expression (Projection) + Distinct + Distinct (Preliminary DISTINCT) + Expression (Before ORDER BY) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + Expression ((Convert VIEW subquery result to VIEW table structure + (Materialize constants after VIEW subquery + (Projection + Before ORDER BY)))) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + ReadFromStorage (SystemNumbers) + ReadFromRemote (Read from remote replica) +explain select distinct on (k1) k2 from remote('127.{1,2}', view(select 1 k1, 2 k2, 3 v from numbers(2)), cityHash64(k1, k2)); -- not optimized +Expression (Projection) + LimitBy + Expression (Before LIMIT BY) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + Union + LimitBy + Expression ((Before LIMIT BY + Before ORDER BY)) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + Expression ((Convert VIEW subquery result to VIEW table structure + (Materialize constants after VIEW subquery + (Projection + Before ORDER BY)))) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + ReadFromStorage (SystemNumbers) + ReadFromRemote (Read from remote replica) +explain select distinct on (k1, k2) v from remote('127.{1,2}', view(select 1 k1, 2 k2, 3 v from numbers(2)), cityHash64(k1, k2)); -- optimized +SettingQuotaAndLimits (Set limits and quota after reading from storage) + Union + Expression (Projection) + LimitBy + Expression ((Before LIMIT BY + Before ORDER BY)) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + Expression ((Convert VIEW subquery result to VIEW table structure + (Materialize constants after VIEW subquery + (Projection + Before ORDER BY)))) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + ReadFromStorage (SystemNumbers) + ReadFromRemote (Read from remote replica) +explain select distinct k1 from remote('127.{1,2}', view(select 1 k1, 2 k2, 3 v from numbers(2)), cityHash64(k1, k2)) order by v; -- not optimized +Expression (Projection) + Distinct + MergingSorted (Merge sorted streams for ORDER BY, without aggregation) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + Union + MergingSorted (Merge sorted streams for ORDER BY) + MergeSorting (Merge sorted blocks for ORDER BY) + PartialSorting (Sort each block for ORDER BY) + Distinct (Preliminary DISTINCT) + Expression (Before ORDER BY) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + Expression ((Convert VIEW subquery result to VIEW table structure + (Materialize constants after VIEW subquery + (Projection + Before ORDER BY)))) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + ReadFromStorage (SystemNumbers) + ReadFromRemote (Read from remote replica) +explain select distinct k1, k2 from remote('127.{1,2}', view(select 1 k1, 2 k2, 3 v from numbers(2)), cityHash64(k1, k2)) order by v; -- optimized +Expression (Projection) + MergingSorted (Merge sorted streams after aggregation stage for ORDER BY) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + Union + Distinct + MergingSorted (Merge sorted streams for ORDER BY) + MergeSorting (Merge sorted blocks for ORDER BY) + PartialSorting (Sort each block for ORDER BY) + Distinct (Preliminary DISTINCT) + Expression (Before ORDER BY) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + Expression ((Convert VIEW subquery result to VIEW table structure + (Materialize constants after VIEW subquery + (Projection + Before ORDER BY)))) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + ReadFromStorage (SystemNumbers) + ReadFromRemote (Read from remote replica) +explain select distinct on (k1) k2 from remote('127.{1,2}', view(select 1 k1, 2 k2, 3 v from numbers(2)), cityHash64(k1, k2)) order by v; -- not optimized +Expression (Projection) + LimitBy + Expression (Before LIMIT BY) + MergingSorted (Merge sorted streams for ORDER BY, without aggregation) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + Union + LimitBy + Expression (Before LIMIT BY) + MergingSorted (Merge sorted streams for ORDER BY) + MergeSorting (Merge sorted blocks for ORDER BY) + PartialSorting (Sort each block for ORDER BY) + Expression (Before ORDER BY) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + Expression ((Convert VIEW subquery result to VIEW table structure + (Materialize constants after VIEW subquery + (Projection + Before ORDER BY)))) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + ReadFromStorage (SystemNumbers) + ReadFromRemote (Read from remote replica) +explain select distinct on (k1, k2) v from remote('127.{1,2}', view(select 1 k1, 2 k2, 3 v from numbers(2)), cityHash64(k1, k2)) order by v; -- optimized +Expression (Projection) + MergingSorted (Merge sorted streams after aggregation stage for ORDER BY) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + Union + LimitBy + Expression (Before LIMIT BY) + MergingSorted (Merge sorted streams for ORDER BY) + MergeSorting (Merge sorted blocks for ORDER BY) + PartialSorting (Sort each block for ORDER BY) + Expression (Before ORDER BY) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + Expression ((Convert VIEW subquery result to VIEW table structure + (Materialize constants after VIEW subquery + (Projection + Before ORDER BY)))) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + ReadFromStorage (SystemNumbers) + ReadFromRemote (Read from remote replica) diff --git a/tests/queries/0_stateless/01952_optimize_distributed_group_by_sharding_key.sql b/tests/queries/0_stateless/01952_optimize_distributed_group_by_sharding_key.sql new file mode 100644 index 00000000000..2ae872f72b0 --- /dev/null +++ b/tests/queries/0_stateless/01952_optimize_distributed_group_by_sharding_key.sql @@ -0,0 +1,13 @@ +set optimize_skip_unused_shards=1; +set optimize_distributed_group_by_sharding_key=1; + +-- { echo } +explain select distinct k1 from remote('127.{1,2}', view(select 1 k1, 2 k2, 3 v from numbers(2)), cityHash64(k1, k2)); -- not optimized +explain select distinct k1, k2 from remote('127.{1,2}', view(select 1 k1, 2 k2, 3 v from numbers(2)), cityHash64(k1, k2)); -- optimized +explain select distinct on (k1) k2 from remote('127.{1,2}', view(select 1 k1, 2 k2, 3 v from numbers(2)), cityHash64(k1, k2)); -- not optimized +explain select distinct on (k1, k2) v from remote('127.{1,2}', view(select 1 k1, 2 k2, 3 v from numbers(2)), cityHash64(k1, k2)); -- optimized + +explain select distinct k1 from remote('127.{1,2}', view(select 1 k1, 2 k2, 3 v from numbers(2)), cityHash64(k1, k2)) order by v; -- not optimized +explain select distinct k1, k2 from remote('127.{1,2}', view(select 1 k1, 2 k2, 3 v from numbers(2)), cityHash64(k1, k2)) order by v; -- optimized +explain select distinct on (k1) k2 from remote('127.{1,2}', view(select 1 k1, 2 k2, 3 v from numbers(2)), cityHash64(k1, k2)) order by v; -- not optimized +explain select distinct on (k1, k2) v from remote('127.{1,2}', view(select 1 k1, 2 k2, 3 v from numbers(2)), cityHash64(k1, k2)) order by v; -- optimized diff --git a/tests/queries/0_stateless/01954_clickhouse_benchmark_multiple_long.config.xml b/tests/queries/0_stateless/01954_clickhouse_benchmark_multiple_long.config.xml new file mode 100644 index 00000000000..e51779006ab --- /dev/null +++ b/tests/queries/0_stateless/01954_clickhouse_benchmark_multiple_long.config.xml @@ -0,0 +1,33 @@ + + + + trace + true + + + 9000 + + 0 + + + + + + + ::/0 + + + default + default + 1 + + + + + + + + + + + diff --git a/tests/queries/0_stateless/01954_clickhouse_benchmark_multiple_long.reference b/tests/queries/0_stateless/01954_clickhouse_benchmark_multiple_long.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/01954_clickhouse_benchmark_multiple_long.sh b/tests/queries/0_stateless/01954_clickhouse_benchmark_multiple_long.sh new file mode 100755 index 00000000000..069695c16db --- /dev/null +++ b/tests/queries/0_stateless/01954_clickhouse_benchmark_multiple_long.sh @@ -0,0 +1,186 @@ +#!/usr/bin/env bash + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +BASE="$CUR_DIR/$(basename "${BASH_SOURCE[0]}" .sh)" + +server_pids=() +paths=() + +function cleanup() +{ + local pid + for pid in "${server_pids[@]}"; do + kill -9 "$pid" + done + + echo "Test failed." >&2 + tail -n1000 "$BASE".clickhouse-server*.log "$BASE".clickhouse-benchmark*.log >&2 + rm -f "$BASE".clickhouse-server*.log "$BASE".clickhouse-benchmark*.log + + local path + for path in "${paths[@]}"; do + rm -fr "$path" + done + + exit 1 +} + +function start_server() +{ + local log=$1 && shift + + local server_opts=( + "--config-file=$BASE.config.xml" + "--" + # we will discover the real port later. + "--tcp_port=0" + "--shutdown_wait_unfinished=0" + "--listen_host=127.1" + ) + CLICKHOUSE_WATCHDOG_ENABLE=0 $CLICKHOUSE_SERVER_BINARY "${server_opts[@]}" "$@" >& "$log" & + local pid=$! + + echo "$pid" +} + +function get_server_port() +{ + local pid=$1 && shift + local port='' i=0 retries=300 + # wait until server will start to listen (max 30 seconds) + while [[ -z $port ]] && [[ $i -lt $retries ]]; do + port="$(lsof -n -a -P -i tcp -s tcp:LISTEN -p "$pid" 2>/dev/null | awk -F'[ :]' '/LISTEN/ { print $(NF-1) }')" + ((++i)) + sleep 0.1 + done + if [[ -z $port ]]; then + echo "Cannot wait for LISTEN socket" >&2 + exit 1 + fi + echo "$port" +} + +function wait_server_port() +{ + local port=$1 && shift + # wait for the server to start accepting tcp connections (max 30 seconds) + local i=0 retries=300 + while ! $CLICKHOUSE_CLIENT_BINARY --host 127.1 --port "$port" --format Null -q 'select 1' 2>/dev/null && [[ $i -lt $retries ]]; do + sleep 0.1 + done + if ! $CLICKHOUSE_CLIENT_BINARY --host 127.1 --port "$port" --format Null -q 'select 1'; then + echo "Cannot wait until server will start accepting connections on " >&2 + exit 1 + fi +} + +function execute_query() +{ + local port=$1 && shift + $CLICKHOUSE_CLIENT_BINARY --host 127.1 --port "$port" "$@" +} + +function make_server() +{ + local log=$1 && shift + + local pid + pid="$(start_server "$log" "$@")" + + local port + port="$(get_server_port "$pid")" + wait_server_port "$port" + + echo "$pid" "$port" +} + +function terminate_servers() +{ + local pid + for pid in "${server_pids[@]}"; do + kill -9 "$pid" + # NOTE: we cannot wait the server pid since it was created in a subshell + done + + rm -f "$BASE".clickhouse-server*.log "$BASE".clickhouse-benchmark*.log + + local path + for path in "${paths[@]}"; do + rm -fr "$path" + done +} + +function test_clickhouse_benchmark_multi_hosts() +{ + local benchmark_opts=( + --iterations 10000 + --host 127.1 --port "$port1" + --host 127.1 --port "$port2" + --query 'select 1' + --concurrency 10 + ) + clickhouse-benchmark "${benchmark_opts[@]}" >& "$(mktemp "$BASE.clickhouse-benchmark.XXXXXX.log")" + + local queries1 queries2 + queries1="$(execute_query "$port1" --query "select value from system.events where event = 'Query'")" + queries2="$(execute_query "$port2" --query "select value from system.events where event = 'Query'")" + + if [[ $queries1 -lt 4000 ]] || [[ $queries1 -gt 6000 ]]; then + echo "server1 (port=$port1) handled $queries1 queries" >&2 + fi + if [[ $queries2 -lt 4000 ]] || [[ $queries2 -gt 6000 ]]; then + echo "server1 (port=$port2) handled $queries2 queries" >&2 + fi +} +function test_clickhouse_benchmark_multi_hosts_roundrobin() +{ + local benchmark_opts=( + --iterations 10000 + --host 127.1 --port "$port1" + --host 127.1 --port "$port2" + --query 'select 1' + --concurrency 10 + --roundrobin + ) + clickhouse-benchmark "${benchmark_opts[@]}" >& "$(mktemp "$BASE.clickhouse-benchmark.XXXXXX.log")" + + local queries1 queries2 + queries1="$(execute_query "$port1" --query "select value from system.events where event = 'Query'")" + queries2="$(execute_query "$port2" --query "select value from system.events where event = 'Query'")" + + # NOTE: it should take into account test_clickhouse_benchmark_multi_hosts queries too. + # that's why it is [9000, 11000] instead of [4000, 6000] + if [[ $queries1 -lt 9000 ]] || [[ $queries1 -gt 11000 ]]; then + echo "server1 (port=$port1) handled $queries1 queries (with --roundrobin)" >&2 + fi + if [[ $queries2 -lt 9000 ]] || [[ $queries2 -gt 11000 ]]; then + echo "server1 (port=$port2) handled $queries2 queries (with --roundrobin)" >&2 + fi +} + +function main() +{ + trap cleanup EXIT + + local path port1 port2 + + path="$(mktemp -d "$BASE.server1.XXXXXX")" + paths+=( "$path" ) + read -r pid1 port1 <<<"$(make_server "$(mktemp "$BASE.clickhouse-server-XXXXXX.log")" --path "$path")" + server_pids+=( "$pid1" ) + + path="$(mktemp -d "$BASE.server2.XXXXXX")" + paths+=( "$path" ) + read -r pid2 port2 <<<"$(make_server "$(mktemp "$BASE.clickhouse-server-XXXXXX.log")" --path "$path")" + server_pids+=( "$pid2" ) + + test_clickhouse_benchmark_multi_hosts + test_clickhouse_benchmark_multi_hosts_roundrobin + + terminate_servers + trap '' EXIT +} +main "$@" diff --git a/tests/queries/0_stateless/01955_clickhouse_benchmark_connection_hang.reference b/tests/queries/0_stateless/01955_clickhouse_benchmark_connection_hang.reference new file mode 100644 index 00000000000..9e388b62601 --- /dev/null +++ b/tests/queries/0_stateless/01955_clickhouse_benchmark_connection_hang.reference @@ -0,0 +1,3 @@ +Loaded 1 queries. +I/O error: Too many open files +70 diff --git a/tests/queries/0_stateless/01955_clickhouse_benchmark_connection_hang.sh b/tests/queries/0_stateless/01955_clickhouse_benchmark_connection_hang.sh new file mode 100755 index 00000000000..9085d646a28 --- /dev/null +++ b/tests/queries/0_stateless/01955_clickhouse_benchmark_connection_hang.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash +# shellcheck disable=SC2086 + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +# NOTE: Tests with limit for number of opened files cannot be run under UBsan. +# +# UBsan needs to create pipe each time it need to check the type: +# +# pipe() +# __sanitizer::IsAccessibleMemoryRange(unsigned long, unsigned long) +# __ubsan::checkDynamicType(void*, void*, unsigned long) + 271 +# HandleDynamicTypeCacheMiss(__ubsan::DynamicTypeCacheMissData*, unsigned long, unsigned long, __ubsan::ReportOptions) + 34 +# __ubsan_handle_dynamic_type_cache_miss_abort + 58 +# +# Obviously it will fail if RLIMIT_NOFILE exceeded (like in this test), and the UBsan will falsely report [1]: +# +# 01955_clickhouse_benchmark_connection_hang: [ FAIL ] 1.56 sec. - result differs with reference: +# --- /usr/share/clickhouse-test/queries/0_stateless/01955_clickhouse_benchmark_connection_hang.reference 2021-07-21 11:14:58.000000000 +0300 +# +++ /tmp/clickhouse-test/0_stateless/01955_clickhouse_benchmark_connection_hang.stdout 2021-07-21 11:53:45.684050372 +0300 +# @@ -1,3 +1,22 @@ +# Loaded 1 queries. +# -I/O error: Too many open files +# -70 +# +../contrib/libcxx/include/memory:3212:19: runtime error: member call on address 0x00002939d5c0 which does not point to an object of type 'std::__1::__shared_weak_count' +# +0x00002939d5c0: note: object has invalid vptr +# + +# +==558==WARNING: Can't create a socket pair to start external symbolizer (errno: 24) +# +==558==WARNING: Can't create a socket pair to start external symbolizer (errno: 24) +# +==558==WARNING: Can't create a socket pair to start external symbolizer (errno: 24) +# +==558==WARNING: Can't create a socket pair to start external symbolizer (errno: 24) +# +==558==WARNING: Can't create a socket pair to start external symbolizer (errno: 24) +# +==558==WARNING: Failed to use and restart external symbolizer! +# + #0 0xfe86b57 (/usr/bin/clickhouse+0xfe86b57) +# + #1 0xfe83fd7 (/usr/bin/clickhouse+0xfe83fd7) +# + #2 0xfe89af4 (/usr/bin/clickhouse+0xfe89af4) +# + #3 0xfe81fa9 (/usr/bin/clickhouse+0xfe81fa9) +# + #4 0x1f377609 (/usr/bin/clickhouse+0x1f377609) +# + #5 0xfe7e2a1 (/usr/bin/clickhouse+0xfe7e2a1) +# + #6 0xfce1003 (/usr/bin/clickhouse+0xfce1003) +# + #7 0x7f3345bd30b2 (/lib/x86_64-linux-gnu/libc.so.6+0x270b2) +# + #8 0xfcbf0ed (/usr/bin/clickhouse+0xfcbf0ed) +# + +# +SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior ../contrib/libcxx/include/memory:3212:19 in +# +1 +# +# Stacktrace from lldb: +# +# thread #1, name = 'clickhouse-benc', stop reason = Dynamic type mismatch +# * frame #0: 0x000000000fffc070 clickhouse`__ubsan_on_report +# frame #1: 0x000000000fff6511 clickhouse`__ubsan::Diag::~Diag() + 209 +# frame #2: 0x000000000fffcb11 clickhouse`HandleDynamicTypeCacheMiss(__ubsan::DynamicTypeCacheMissData*, unsigned long, unsigned long, __ubsan::ReportOptions) + 609 +# frame #3: 0x000000000fffcf2a clickhouse`__ubsan_handle_dynamic_type_cache_miss_abort + 58 +# frame #4: 0x00000000101a33f8 clickhouse`std::__1::shared_ptr::PoolEntryHelper>::~shared_ptr(this=) + 152 at memory:3212 +# frame #5: 0x00000000101a267a clickhouse`PoolBase::Entry::~Entry(this=) + 26 at PoolBase.h:67 +# frame #6: 0x00000000101a0878 clickhouse`DB::ConnectionPool::get(this=, timeouts=0x00007fffffffc278, settings=, force_connected=true) + 664 at ConnectionPool.h:93 +# frame #7: 0x00000000101a6395 clickhouse`DB::Benchmark::runBenchmark(this=) + 981 at Benchmark.cpp:309 +# frame #8: 0x000000001019e84a clickhouse`DB::Benchmark::main(this=0x00007fffffffd8c8, (null)=) + 586 at Benchmark.cpp:128 +# frame #9: 0x000000001f5d028a clickhouse`Poco::Util::Application::run(this=0x00007fffffffd8c8) + 42 at Application.cpp:334 +# frame #10: 0x000000001019ab42 clickhouse`mainEntryClickHouseBenchmark(argc=, argv=) + 6978 at Benchmark.cpp:655 +# frame #11: 0x000000000fffdfc4 clickhouse`main(argc_=, argv_=) + 356 at main.cpp:366 +# frame #12: 0x00007ffff7de6d0a libc.so.6`__libc_start_main(main=(clickhouse`main at main.cpp:339), argc=7, argv=0x00007fffffffe1e8, init=, fini=, rtld_fini=, stack_end=0x00007fffffffe1d8) + 234 at libc-start.c:308 +# frame #13: 0x000000000ffdc0aa clickhouse`_start + 42 +# +# [1]: https://clickhouse-test-reports.s3.yandex.net/26656/f17ca450ac991603e6400c7caef49c493ac69739/functional_stateless_tests_(ubsan).html#fail1 + +# Limit number of files to 50, and we will get EMFILE for some of socket() +prlimit --nofile=50 $CLICKHOUSE_BENCHMARK --iterations 1 --concurrency 50 --query 'select 1' 2>&1 +echo $? diff --git a/tests/queries/0_stateless/01956_skip_unavailable_shards_excessive_attempts.reference b/tests/queries/0_stateless/01956_skip_unavailable_shards_excessive_attempts.reference new file mode 100644 index 00000000000..f2322e4ffc4 --- /dev/null +++ b/tests/queries/0_stateless/01956_skip_unavailable_shards_excessive_attempts.reference @@ -0,0 +1 @@ +Connection failed at try №1, diff --git a/tests/queries/0_stateless/01956_skip_unavailable_shards_excessive_attempts.sh b/tests/queries/0_stateless/01956_skip_unavailable_shards_excessive_attempts.sh new file mode 100755 index 00000000000..0e2f1857aed --- /dev/null +++ b/tests/queries/0_stateless/01956_skip_unavailable_shards_excessive_attempts.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +CLICKHOUSE_CLIENT_SERVER_LOGS_LEVEL=trace + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +opts=( + "--connections_with_failover_max_tries=1" + "--skip_unavailable_shards=1" +) +$CLICKHOUSE_CLIENT --query "select * from remote('255.255.255.255', system.one)" "${opts[@]}" 2>&1 | grep -o 'Connection failed at try.*,' diff --git a/tests/queries/0_stateless/01957_heredoc_more.reference b/tests/queries/0_stateless/01957_heredoc_more.reference new file mode 100644 index 00000000000..e092ff416d6 --- /dev/null +++ b/tests/queries/0_stateless/01957_heredoc_more.reference @@ -0,0 +1 @@ +FFFE80BB diff --git a/tests/queries/0_stateless/01957_heredoc_more.sql b/tests/queries/0_stateless/01957_heredoc_more.sql new file mode 100644 index 00000000000..61681ad39c0 --- /dev/null +++ b/tests/queries/0_stateless/01957_heredoc_more.sql @@ -0,0 +1 @@ +SELECT hex($$$$); diff --git a/tests/queries/0_stateless/01958_partial_hour_timezone.reference b/tests/queries/0_stateless/01958_partial_hour_timezone.reference new file mode 100644 index 00000000000..a86391b491c --- /dev/null +++ b/tests/queries/0_stateless/01958_partial_hour_timezone.reference @@ -0,0 +1,20 @@ +Row 1: +────── +toUnixTimestamp(t): 14459031 +timeZoneOffset(t): -2670 +formatDateTime(t, '%F %T', 'Africa/Monrovia'): 1970-06-17 07:39:21 +toString(t, 'Africa/Monrovia'): 1970-06-17 07:39:21 +toStartOfMinute(t): 1970-06-17 07:39:00 +toStartOfFiveMinute(t): 1970-06-17 07:35:00 +toStartOfFifteenMinutes(t): 1970-06-17 07:30:00 +toStartOfTenMinutes(t): 1970-06-17 07:30:00 +toStartOfHour(t): 1970-06-17 07:00:00 +toStartOfDay(t): 1970-06-17 00:00:00 +toStartOfWeek(t): 1970-06-14 +toStartOfInterval(t, toIntervalSecond(1)): 1970-06-17 07:39:21 +toStartOfInterval(t, toIntervalMinute(1)): 1970-06-17 07:39:00 +toStartOfInterval(t, toIntervalMinute(2)): 1970-06-17 07:38:00 +toStartOfInterval(t, toIntervalMinute(5)): 1970-06-17 07:35:00 +toStartOfInterval(t, toIntervalMinute(60)): 1970-06-17 07:00:00 +addMinutes(t, 1): 1970-06-17 07:40:21 +addMinutes(t, 60): 1970-06-17 08:39:21 diff --git a/tests/queries/0_stateless/01958_partial_hour_timezone.sql b/tests/queries/0_stateless/01958_partial_hour_timezone.sql new file mode 100644 index 00000000000..9bcb03ea4f2 --- /dev/null +++ b/tests/queries/0_stateless/01958_partial_hour_timezone.sql @@ -0,0 +1,21 @@ +-- Appeared in https://github.com/ClickHouse/ClickHouse/pull/26978#issuecomment-890889362 +WITH toDateTime('1970-06-17 07:39:21', 'Africa/Monrovia') as t +SELECT toUnixTimestamp(t), + timeZoneOffset(t), + formatDateTime(t, '%F %T', 'Africa/Monrovia'), + toString(t, 'Africa/Monrovia'), + toStartOfMinute(t), + toStartOfFiveMinute(t), + toStartOfFifteenMinutes(t), + toStartOfTenMinutes(t), + toStartOfHour(t), + toStartOfDay(t), + toStartOfWeek(t), + toStartOfInterval(t, INTERVAL 1 second), + toStartOfInterval(t, INTERVAL 1 minute), + toStartOfInterval(t, INTERVAL 2 minute), + toStartOfInterval(t, INTERVAL 5 minute), + toStartOfInterval(t, INTERVAL 60 minute), + addMinutes(t, 1), + addMinutes(t, 60) +FORMAT Vertical; diff --git a/tests/queries/0_stateless/01960_lambda_precedence.reference b/tests/queries/0_stateless/01960_lambda_precedence.reference new file mode 100644 index 00000000000..96e36988183 --- /dev/null +++ b/tests/queries/0_stateless/01960_lambda_precedence.reference @@ -0,0 +1,3 @@ +1000 [2,3,4] 1010 +1 +1 diff --git a/tests/queries/0_stateless/01960_lambda_precedence.sql b/tests/queries/0_stateless/01960_lambda_precedence.sql new file mode 100644 index 00000000000..a3ff1424cf2 --- /dev/null +++ b/tests/queries/0_stateless/01960_lambda_precedence.sql @@ -0,0 +1,26 @@ +SELECT + 1000 AS a, + arrayMap(a -> (a + 1), [1, 2, 3]), + a + 10 as c; + + +-- https://github.com/ClickHouse/ClickHouse/issues/5046 +SELECT sum(c1) AS v +FROM + ( + SELECT + 1 AS c1, + ['v'] AS c2 + ) +WHERE arrayExists(v -> (v = 'v'), c2); + + +SELECT sum(c1) AS v +FROM + ( + SELECT + 1 AS c1, + ['v'] AS c2, + ['d'] AS d + ) +WHERE arrayExists(i -> (d = ['d']), c2); diff --git a/tests/queries/0_stateless/01961_roaring_memory_tracking.reference b/tests/queries/0_stateless/01961_roaring_memory_tracking.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/01961_roaring_memory_tracking.sql b/tests/queries/0_stateless/01961_roaring_memory_tracking.sql new file mode 100644 index 00000000000..57d71cdc91c --- /dev/null +++ b/tests/queries/0_stateless/01961_roaring_memory_tracking.sql @@ -0,0 +1,2 @@ +SET max_memory_usage = '100M'; +SELECT cityHash64(rand() % 1000) as n, groupBitmapState(number) FROM numbers_mt(2000000000) GROUP BY n; -- { serverError 241 } diff --git a/tests/queries/0_stateless/01999_grant_with_replace.reference b/tests/queries/0_stateless/01999_grant_with_replace.reference new file mode 100644 index 00000000000..9e089a05e52 --- /dev/null +++ b/tests/queries/0_stateless/01999_grant_with_replace.reference @@ -0,0 +1,36 @@ +CREATE USER test_user_01999 +A +B +GRANT SELECT ON db1.* TO test_user_01999 +GRANT SHOW TABLES, SHOW COLUMNS, SHOW DICTIONARIES ON db2.tb2 TO test_user_01999 +C +GRANT SELECT(col1) ON db3.table TO test_user_01999 +D +GRANT SELECT(col3) ON db3.table3 TO test_user_01999 +GRANT SELECT(col1, col2) ON db4.table4 TO test_user_01999 +E +GRANT SELECT(cola) ON db5.table TO test_user_01999 +GRANT INSERT(colb) ON db6.tb61 TO test_user_01999 +GRANT SHOW ON db7.* TO test_user_01999 +F +GRANT SELECT ON all.* TO test_user_01999 +G +H +GRANT SELECT ON db1.tb1 TO test_user_01999 +GRANT test_role_01999 TO test_user_01999 +I +GRANT test_role_01999 TO test_user_01999 +J +GRANT SHOW ON db8.* TO test_user_01999 +GRANT test_role_01999 TO test_user_01999 +K +GRANT SHOW ON db8.* TO test_user_01999 +L +GRANT SELECT ON db9.tb3 TO test_user_01999 +M +GRANT SELECT ON db9.tb3 TO test_user_01999 +GRANT test_role_01999 TO test_user_01999 +N +GRANT SELECT ON db9.tb3 TO test_user_01999 +GRANT test_role_01999_1 TO test_user_01999 +O diff --git a/tests/queries/0_stateless/01999_grant_with_replace.sql b/tests/queries/0_stateless/01999_grant_with_replace.sql new file mode 100644 index 00000000000..31a9187c0d2 --- /dev/null +++ b/tests/queries/0_stateless/01999_grant_with_replace.sql @@ -0,0 +1,75 @@ +DROP USER IF EXISTS test_user_01999; + +CREATE USER test_user_01999; +SHOW CREATE USER test_user_01999; + +SELECT 'A'; +SHOW GRANTS FOR test_user_01999; + +GRANT SELECT ON db1.* TO test_user_01999; +GRANT SHOW ON db2.tb2 TO test_user_01999; + +SELECT 'B'; +SHOW GRANTS FOR test_user_01999; + +GRANT SELECT(col1) ON db3.table TO test_user_01999 WITH REPLACE OPTION; + +SELECT 'C'; +SHOW GRANTS FOR test_user_01999; + +GRANT SELECT(col3) ON db3.table3, SELECT(col1, col2) ON db4.table4 TO test_user_01999 WITH REPLACE OPTION; + +SELECT 'D'; +SHOW GRANTS FOR test_user_01999; + +GRANT SELECT(cola) ON db5.table, INSERT(colb) ON db6.tb61, SHOW ON db7.* TO test_user_01999 WITH REPLACE OPTION; + +SELECT 'E'; +SHOW GRANTS FOR test_user_01999; + +SELECT 'F'; +GRANT SELECT ON all.* TO test_user_01999 WITH REPLACE OPTION; +SHOW GRANTS FOR test_user_01999; + +SELECT 'G'; +GRANT USAGE ON *.* TO test_user_01999 WITH REPLACE OPTION; +SHOW GRANTS FOR test_user_01999; + +SELECT 'H'; +DROP ROLE IF EXISTS test_role_01999; +CREATE role test_role_01999; +GRANT test_role_01999 to test_user_01999; +GRANT SELECT ON db1.tb1 TO test_user_01999; +SHOW GRANTS FOR test_user_01999; + +SELECT 'I'; +GRANT NONE ON *.* TO test_user_01999 WITH REPLACE OPTION; +SHOW GRANTS FOR test_user_01999; + +SELECT 'J'; +GRANT SHOW ON db8.* TO test_user_01999; +SHOW GRANTS FOR test_user_01999; + +SELECT 'K'; +GRANT NONE TO test_user_01999 WITH REPLACE OPTION; +SHOW GRANTS FOR test_user_01999; + +SELECT 'L'; +GRANT NONE ON *.*, SELECT on db9.tb3 TO test_user_01999 WITH REPLACE OPTION; +SHOW GRANTS FOR test_user_01999; + +SELECT 'M'; +GRANT test_role_01999 to test_user_01999; +SHOW GRANTS FOR test_user_01999; + +SELECT 'N'; +DROP ROLE IF EXISTS test_role_01999_1; +CREATE role test_role_01999_1; +GRANT NONE, test_role_01999_1 TO test_user_01999 WITH REPLACE OPTION; +SHOW GRANTS FOR test_user_01999; + +DROP USER IF EXISTS test_user_01999; +DROP ROLE IF EXISTS test_role_01999; +DROP ROLE IF EXISTS test_role_01999_1; + +SELECT 'O'; diff --git a/tests/queries/0_stateless/02000_default_from_default_empty_column.reference b/tests/queries/0_stateless/02000_default_from_default_empty_column.reference new file mode 100644 index 00000000000..bb48d0eda85 --- /dev/null +++ b/tests/queries/0_stateless/02000_default_from_default_empty_column.reference @@ -0,0 +1 @@ +1 diff --git a/tests/queries/0_stateless/02000_default_from_default_empty_column.sql b/tests/queries/0_stateless/02000_default_from_default_empty_column.sql new file mode 100644 index 00000000000..5ca642628d4 --- /dev/null +++ b/tests/queries/0_stateless/02000_default_from_default_empty_column.sql @@ -0,0 +1,17 @@ +DROP TABLE IF EXISTS test; + +CREATE TABLE test (col Int8) ENGINE=MergeTree ORDER BY tuple() +SETTINGS vertical_merge_algorithm_min_rows_to_activate=1, + vertical_merge_algorithm_min_columns_to_activate=1, + min_bytes_for_wide_part = 0; + + +INSERT INTO test VALUES (1); +ALTER TABLE test ADD COLUMN s1 String; +ALTER TABLE test ADD COLUMN s2 String DEFAULT s1; + +OPTIMIZE TABLE test FINAL; + +SELECT * FROM test; + +DROP TABLE IF EXISTS test; diff --git a/tests/queries/0_stateless/02000_table_function_cluster_macros.reference b/tests/queries/0_stateless/02000_table_function_cluster_macros.reference new file mode 100644 index 00000000000..6ed281c757a --- /dev/null +++ b/tests/queries/0_stateless/02000_table_function_cluster_macros.reference @@ -0,0 +1,2 @@ +1 +1 diff --git a/tests/queries/0_stateless/02000_table_function_cluster_macros.sql b/tests/queries/0_stateless/02000_table_function_cluster_macros.sql new file mode 100644 index 00000000000..f1bc1358b55 --- /dev/null +++ b/tests/queries/0_stateless/02000_table_function_cluster_macros.sql @@ -0,0 +1,2 @@ +SELECT _shard_num FROM cluster("{default_cluster_macro}", system.one); +SELECT _shard_num FROM clusterAllReplicas("{default_cluster_macro}", system.one); diff --git a/tests/queries/0_stateless/02001_add_default_database_to_system_users.reference b/tests/queries/0_stateless/02001_add_default_database_to_system_users.reference new file mode 100644 index 00000000000..bec3a35ee8b --- /dev/null +++ b/tests/queries/0_stateless/02001_add_default_database_to_system_users.reference @@ -0,0 +1 @@ +system diff --git a/tests/queries/0_stateless/02001_add_default_database_to_system_users.sql b/tests/queries/0_stateless/02001_add_default_database_to_system_users.sql new file mode 100644 index 00000000000..b006f9acb22 --- /dev/null +++ b/tests/queries/0_stateless/02001_add_default_database_to_system_users.sql @@ -0,0 +1,3 @@ +create user if not exists u_02001 default database system; +select default_database from system.users where name = 'u_02001'; +drop user if exists u_02001; diff --git a/tests/queries/0_stateless/02001_compress_output_file.reference b/tests/queries/0_stateless/02001_compress_output_file.reference new file mode 100644 index 00000000000..6f51dfc24e1 --- /dev/null +++ b/tests/queries/0_stateless/02001_compress_output_file.reference @@ -0,0 +1,2 @@ +Hello, World! From client. +Hello, World! From local. diff --git a/tests/queries/0_stateless/02001_compress_output_file.sh b/tests/queries/0_stateless/02001_compress_output_file.sh new file mode 100755 index 00000000000..11df227cc14 --- /dev/null +++ b/tests/queries/0_stateless/02001_compress_output_file.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +set -e + +[ -e "${CLICKHOUSE_TMP}"/test_compression_of_output_file_from_client.gz ] && rm "${CLICKHOUSE_TMP}"/test_compression_of_output_file_from_client.gz + +${CLICKHOUSE_CLIENT} --query "SELECT * FROM (SELECT 'Hello, World! From client.') INTO OUTFILE '${CLICKHOUSE_TMP}/test_compression_of_output_file_from_client.gz'" +gunzip ${CLICKHOUSE_TMP}/test_compression_of_output_file_from_client.gz +cat ${CLICKHOUSE_TMP}/test_compression_of_output_file_from_client + +rm -f "${CLICKHOUSE_TMP}/test_compression_of_output_file_from_client" + +[ -e "${CLICKHOUSE_TMP}"/test_compression_of_output_file_from_local.gz ] && rm "${CLICKHOUSE_TMP}"/test_compression_of_output_file_from_local.gz + +${CLICKHOUSE_LOCAL} --query "SELECT * FROM (SELECT 'Hello, World! From local.') INTO OUTFILE '${CLICKHOUSE_TMP}/test_compression_of_output_file_from_local.gz'" +gunzip ${CLICKHOUSE_TMP}/test_compression_of_output_file_from_local.gz +cat ${CLICKHOUSE_TMP}/test_compression_of_output_file_from_local + +rm -f "${CLICKHOUSE_TMP}/test_compression_of_output_file_from_local" diff --git a/tests/queries/0_stateless/02001_dist_on_dist_WithMergeableStateAfterAggregation.reference b/tests/queries/0_stateless/02001_dist_on_dist_WithMergeableStateAfterAggregation.reference new file mode 100644 index 00000000000..6c680840239 --- /dev/null +++ b/tests/queries/0_stateless/02001_dist_on_dist_WithMergeableStateAfterAggregation.reference @@ -0,0 +1,8 @@ +-- { echo } +select dummy as foo from remote('127.{2,3}', currentDatabase(), dist) limit 1 settings prefer_localhost_replica=0, distributed_push_down_limit=0; +0 +select dummy as foo from remote('127.{2,3}', currentDatabase(), dist) limit 1 settings prefer_localhost_replica=0, distributed_push_down_limit=1; +0 +select dummy as foo from remote('127.{2,3}', currentDatabase(), dist) limit 1 settings prefer_localhost_replica=0, distributed_group_by_no_merge=1; +0 +0 diff --git a/tests/queries/0_stateless/02001_dist_on_dist_WithMergeableStateAfterAggregation.sql b/tests/queries/0_stateless/02001_dist_on_dist_WithMergeableStateAfterAggregation.sql new file mode 100644 index 00000000000..0925df1888d --- /dev/null +++ b/tests/queries/0_stateless/02001_dist_on_dist_WithMergeableStateAfterAggregation.sql @@ -0,0 +1,6 @@ +drop table if exists dist; +create table dist as system.one engine=Distributed('test_shard_localhost', system, one); +-- { echo } +select dummy as foo from remote('127.{2,3}', currentDatabase(), dist) limit 1 settings prefer_localhost_replica=0, distributed_push_down_limit=0; +select dummy as foo from remote('127.{2,3}', currentDatabase(), dist) limit 1 settings prefer_localhost_replica=0, distributed_push_down_limit=1; +select dummy as foo from remote('127.{2,3}', currentDatabase(), dist) limit 1 settings prefer_localhost_replica=0, distributed_group_by_no_merge=1; diff --git a/tests/queries/0_stateless/02001_hostname_test.reference b/tests/queries/0_stateless/02001_hostname_test.reference new file mode 100644 index 00000000000..da8a2d07eab --- /dev/null +++ b/tests/queries/0_stateless/02001_hostname_test.reference @@ -0,0 +1,2 @@ +localhost +localhost 2 diff --git a/tests/queries/0_stateless/02001_hostname_test.sql b/tests/queries/0_stateless/02001_hostname_test.sql new file mode 100644 index 00000000000..a8c7a8dab0c --- /dev/null +++ b/tests/queries/0_stateless/02001_hostname_test.sql @@ -0,0 +1,2 @@ +select hostname(); +select hostName() h, count() from cluster(test_cluster_two_shards, system.one) group by h; diff --git a/tests/queries/0_stateless/02001_shard_num_shard_count.reference b/tests/queries/0_stateless/02001_shard_num_shard_count.reference new file mode 100644 index 00000000000..34c5e7514f4 --- /dev/null +++ b/tests/queries/0_stateless/02001_shard_num_shard_count.reference @@ -0,0 +1,7 @@ +0 0 +1 3 +2 3 +3 3 +1 3 +2 3 +3 3 diff --git a/tests/queries/0_stateless/02001_shard_num_shard_count.sql b/tests/queries/0_stateless/02001_shard_num_shard_count.sql new file mode 100644 index 00000000000..daf1084a614 --- /dev/null +++ b/tests/queries/0_stateless/02001_shard_num_shard_count.sql @@ -0,0 +1,3 @@ +select shardNum() n, shardCount() c; +select shardNum() n, shardCount() c from remote('127.0.0.{1,2,3}', system.one) order by n settings prefer_localhost_replica = 0; +select shardNum() n, shardCount() c from remote('127.0.0.{1,2,3}', system.one) order by n settings prefer_localhost_replica = 1; diff --git a/tests/queries/0_stateless/02002_global_subqueries_subquery_or_table_name.reference b/tests/queries/0_stateless/02002_global_subqueries_subquery_or_table_name.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/02002_global_subqueries_subquery_or_table_name.sql b/tests/queries/0_stateless/02002_global_subqueries_subquery_or_table_name.sql new file mode 100644 index 00000000000..1b24617569c --- /dev/null +++ b/tests/queries/0_stateless/02002_global_subqueries_subquery_or_table_name.sql @@ -0,0 +1,5 @@ +SELECT + cityHash64(number GLOBAL IN (NULL, -2147483648, -9223372036854775808), nan, 1024, NULL, NULL, 1.000100016593933, NULL), + (NULL, cityHash64(inf, -2147483648, NULL, NULL, 10.000100135803223), cityHash64(1.1754943508222875e-38, NULL, NULL, NULL), 2147483647) +FROM cluster(test_cluster_two_shards_localhost, numbers((NULL, cityHash64(0., 65536, NULL, NULL, 10000000000., NULL), 0) GLOBAL IN (some_identifier), 65536)) +WHERE number GLOBAL IN [1025] --{serverError 284} diff --git a/tests/queries/0_stateless/02002_parse_map_int_key.reference b/tests/queries/0_stateless/02002_parse_map_int_key.reference new file mode 100644 index 00000000000..dc02589d4bc --- /dev/null +++ b/tests/queries/0_stateless/02002_parse_map_int_key.reference @@ -0,0 +1 @@ +{1:2,3:4,5:6,7:8} {'2021-05-20':1,'2021-05-21':2,'2021-05-22':3,'2021-05-23':4} diff --git a/tests/queries/0_stateless/02002_parse_map_int_key.sql b/tests/queries/0_stateless/02002_parse_map_int_key.sql new file mode 100644 index 00000000000..ecd2a090975 --- /dev/null +++ b/tests/queries/0_stateless/02002_parse_map_int_key.sql @@ -0,0 +1,11 @@ +SET allow_experimental_map_type = 1; + +DROP TABLE IF EXISTS t_map_int_key; +CREATE TABLE t_map_int_key (m1 Map(UInt32, UInt32), m2 Map(Date, UInt32)) ENGINE = Memory; + +INSERT INTO t_map_int_key FORMAT CSV "{1:2, 3: 4, 5 :6, 7 : 8}","{'2021-05-20':1, '2021-05-21': 2, '2021-05-22' :3, '2021-05-23' : 4}" +; + +SELECT m1, m2 FROM t_map_int_key; + +DROP TABLE t_map_int_key; diff --git a/tests/queries/0_stateless/02002_row_level_filter_bug.reference b/tests/queries/0_stateless/02002_row_level_filter_bug.reference new file mode 100644 index 00000000000..ea14f6fa1dd --- /dev/null +++ b/tests/queries/0_stateless/02002_row_level_filter_bug.reference @@ -0,0 +1,3 @@ +600 +AWD 3130 2021-07-15 600 +0 diff --git a/tests/queries/0_stateless/02002_row_level_filter_bug.sh b/tests/queries/0_stateless/02002_row_level_filter_bug.sh new file mode 100755 index 00000000000..7e19374c123 --- /dev/null +++ b/tests/queries/0_stateless/02002_row_level_filter_bug.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + + +$CLICKHOUSE_CLIENT --query "drop table if exists test_table" +$CLICKHOUSE_CLIENT --query "CREATE TABLE test_table +( + a UInt16 DEFAULT 0, + c LowCardinality(String) DEFAULT '', + t_date LowCardinality(String) DEFAULT '', + ex LowCardinality(String) DEFAULT '', + team LowCardinality(String) DEFAULT '', + g LowCardinality(String) DEFAULT '', + mt FixedString(1) DEFAULT ' ', + rw_ts Int64 DEFAULT 0, + exr_t Int64 DEFAULT 0, + en UInt16 DEFAULT 0, + f_t Int64 DEFAULT 0, + j UInt64 DEFAULT 0, + oj UInt64 DEFAULT 0 +) +ENGINE = MergeTree +PARTITION BY (c, t_date) +ORDER BY (ex, team, g, mt, rw_ts, exr_t, en, f_t, j, oj) +SETTINGS index_granularity = 8192" + +$CLICKHOUSE_CLIENT --query " +INSERT INTO test_table(t_date, c,team, a) SELECT +arrayJoin([toDate('2021-07-15'),toDate('2021-07-16')]) as t_date, +arrayJoin(['aur','rua']) as c, +arrayJoin(['AWD','ZZZ']) as team, +arrayJoin([3183,3106,0,3130,3108,3126,3109,3107,3182,3180,3129,3128,3125,3266]) as a +FROM numbers(600);" + +$CLICKHOUSE_CLIENT --query "DROP ROLE IF exists AWD;" +$CLICKHOUSE_CLIENT --query "create role AWD;" +$CLICKHOUSE_CLIENT --query "REVOKE ALL ON *.* FROM AWD;" + +$CLICKHOUSE_CLIENT --query "DROP USER IF EXISTS AWD_user;" +$CLICKHOUSE_CLIENT --query "CREATE USER AWD_user IDENTIFIED WITH plaintext_password BY 'AWD_pwd' DEFAULT ROLE AWD;" + +$CLICKHOUSE_CLIENT --query "GRANT SELECT ON test_table TO AWD;" + +$CLICKHOUSE_CLIENT --query "DROP ROW POLICY IF EXISTS ttt_bu_test_table_AWD ON test_table;" +$CLICKHOUSE_CLIENT --query "CREATE ROW POLICY ttt_bu_test_table_AWD ON test_table FOR SELECT USING team = 'AWD' TO AWD;" + +$CLICKHOUSE_CLIENT --user=AWD_user --password=AWD_pwd --query " +SELECT count() AS count + FROM test_table +WHERE + t_date = '2021-07-15' AND c = 'aur' AND a=3130; +" + +$CLICKHOUSE_CLIENT --user=AWD_user --password=AWD_pwd --query " +SELECT + team, + a, + t_date, + count() AS count +FROM test_table +WHERE (t_date = '2021-07-15') AND (c = 'aur') AND (a = 3130) +GROUP BY + team, + a, + t_date; +" + +$CLICKHOUSE_CLIENT --user=AWD_user --password=AWD_pwd --query " +SELECT count() AS count +FROM test_table +WHERE (t_date = '2021-07-15') AND (c = 'aur') AND (a = 313) +" diff --git a/tests/queries/0_stateless/02002_sampling_and_unknown_column_bug.reference b/tests/queries/0_stateless/02002_sampling_and_unknown_column_bug.reference new file mode 100644 index 00000000000..9315e86b328 --- /dev/null +++ b/tests/queries/0_stateless/02002_sampling_and_unknown_column_bug.reference @@ -0,0 +1,2 @@ +1 +1 1 1 diff --git a/tests/queries/0_stateless/02002_sampling_and_unknown_column_bug.sql b/tests/queries/0_stateless/02002_sampling_and_unknown_column_bug.sql new file mode 100644 index 00000000000..838d7a5526b --- /dev/null +++ b/tests/queries/0_stateless/02002_sampling_and_unknown_column_bug.sql @@ -0,0 +1,20 @@ +drop table if exists sessions; +CREATE TABLE sessions +( + `user_id` UInt64 +) +ENGINE = MergeTree +ORDER BY user_id +SAMPLE BY user_id; + +insert into sessions values(1); + +SELECT + sum(user_id * _sample_factor) +FROM sessions +SAMPLE 10000000; + +SELECT + uniq(user_id) a, min(_sample_factor) x, a*x +FROM sessions +SAMPLE 10000000; diff --git a/tests/queries/0_stateless/02002_system_table_with_tuple.reference b/tests/queries/0_stateless/02002_system_table_with_tuple.reference new file mode 100644 index 00000000000..d00491fd7e5 --- /dev/null +++ b/tests/queries/0_stateless/02002_system_table_with_tuple.reference @@ -0,0 +1 @@ +1 diff --git a/tests/queries/0_stateless/02002_system_table_with_tuple.sh b/tests/queries/0_stateless/02002_system_table_with_tuple.sh new file mode 100755 index 00000000000..2abf5b8b525 --- /dev/null +++ b/tests/queries/0_stateless/02002_system_table_with_tuple.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +$CLICKHOUSE_CLIENT -q "SELECT count() > 0 FROM system.tables \ + WHERE database IN ('system', '$CLICKHOUSE_DATABASE') \ + SETTINGS legacy_column_name_of_tuple_literal = 1" diff --git a/tests/queries/0_stateless/02003_WithMergeableStateAfterAggregationAndLimit_LIMIT_BY_LIMIT_OFFSET.reference b/tests/queries/0_stateless/02003_WithMergeableStateAfterAggregationAndLimit_LIMIT_BY_LIMIT_OFFSET.reference new file mode 100644 index 00000000000..6cdb80167d1 --- /dev/null +++ b/tests/queries/0_stateless/02003_WithMergeableStateAfterAggregationAndLimit_LIMIT_BY_LIMIT_OFFSET.reference @@ -0,0 +1,38 @@ +-- { echo } +SELECT * +FROM remote('127.{1,2}', view( + SELECT number%20 number + FROM numbers(40) + WHERE (number % 2) = (shardNum() - 1) +), number) +GROUP BY number +ORDER BY number ASC +LIMIT 1 BY number +LIMIT 5, 5 +SETTINGS + optimize_skip_unused_shards=1, + optimize_distributed_group_by_sharding_key=1, + distributed_push_down_limit=1; +5 +6 +7 +8 +9 +SELECT * +FROM remote('127.{1,2}', view( + SELECT number%20 number + FROM numbers(40) + WHERE (number % 2) = (shardNum() - 1) +), number) +GROUP BY number +ORDER BY number ASC +LIMIT 1 BY number +LIMIT 5, 5 +SETTINGS + distributed_group_by_no_merge=2, + distributed_push_down_limit=1; +5 +6 +7 +8 +9 diff --git a/tests/queries/0_stateless/02003_WithMergeableStateAfterAggregationAndLimit_LIMIT_BY_LIMIT_OFFSET.sql b/tests/queries/0_stateless/02003_WithMergeableStateAfterAggregationAndLimit_LIMIT_BY_LIMIT_OFFSET.sql new file mode 100644 index 00000000000..1a446a80603 --- /dev/null +++ b/tests/queries/0_stateless/02003_WithMergeableStateAfterAggregationAndLimit_LIMIT_BY_LIMIT_OFFSET.sql @@ -0,0 +1,36 @@ +-- Here we use a trick with shardNum() to generate unique data on each shard. +-- Since distributed_group_by_no_merge=2 will use WithMergeableStateAfterAggregationAndLimit, +-- which assume that the data on shards is unique +-- (LIMIT BY will be applied only on shards, not on the initiator). + +-- To distinguish echoing from the comments above we use SELECT FORMAT Null. +SELECT '' FORMAT Null; + +-- { echo } +SELECT * +FROM remote('127.{1,2}', view( + SELECT number%20 number + FROM numbers(40) + WHERE (number % 2) = (shardNum() - 1) +), number) +GROUP BY number +ORDER BY number ASC +LIMIT 1 BY number +LIMIT 5, 5 +SETTINGS + optimize_skip_unused_shards=1, + optimize_distributed_group_by_sharding_key=1, + distributed_push_down_limit=1; +SELECT * +FROM remote('127.{1,2}', view( + SELECT number%20 number + FROM numbers(40) + WHERE (number % 2) = (shardNum() - 1) +), number) +GROUP BY number +ORDER BY number ASC +LIMIT 1 BY number +LIMIT 5, 5 +SETTINGS + distributed_group_by_no_merge=2, + distributed_push_down_limit=1; diff --git a/tests/queries/0_stateless/02003_bug_from_23515.reference b/tests/queries/0_stateless/02003_bug_from_23515.reference new file mode 100644 index 00000000000..d00491fd7e5 --- /dev/null +++ b/tests/queries/0_stateless/02003_bug_from_23515.reference @@ -0,0 +1 @@ +1 diff --git a/tests/queries/0_stateless/02003_bug_from_23515.sql b/tests/queries/0_stateless/02003_bug_from_23515.sql new file mode 100644 index 00000000000..febd59b0755 --- /dev/null +++ b/tests/queries/0_stateless/02003_bug_from_23515.sql @@ -0,0 +1,10 @@ +drop table if exists tab; +create table tab (a LowCardinality(String), b LowCardinality(String)) engine = MergeTree partition by a order by tuple() settings min_bytes_for_wide_part = 0, min_rows_for_wide_part = 0; + +insert into tab values ('1', 'a'), ('2', 'b'); +SELECT a = '1' FROM tab WHERE a = '1' and b='a'; + +-- Fuzzed +SELECT * FROM tab WHERE (a = '1') AND 0 AND (b = 'a'); + +drop table if exists tab; diff --git a/tests/queries/0_stateless/02003_compress_bz2.reference b/tests/queries/0_stateless/02003_compress_bz2.reference new file mode 100644 index 00000000000..8ab686eafeb --- /dev/null +++ b/tests/queries/0_stateless/02003_compress_bz2.reference @@ -0,0 +1 @@ +Hello, World! diff --git a/tests/queries/0_stateless/02003_compress_bz2.sh b/tests/queries/0_stateless/02003_compress_bz2.sh new file mode 100755 index 00000000000..b65ce2f233b --- /dev/null +++ b/tests/queries/0_stateless/02003_compress_bz2.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +USER_FILES_PATH=$(clickhouse-client --query "select _path,_file from file('nonexist.txt', 'CSV', 'val1 char')" 2>&1 | grep Exception | awk '{gsub("/nonexist.txt","",$9); print $9}') +WORKING_FOLDER_02003="${USER_FILES_PATH}/${CLICKHOUSE_DATABASE}" + +rm -rf "${WORKING_FOLDER_02003}" +mkdir "${WORKING_FOLDER_02003}" + +${CLICKHOUSE_CLIENT} --query "SELECT * FROM (SELECT 'Hello, World!' as String) INTO OUTFILE '${WORKING_FOLDER_02003}/bz2_compression.bz2'" +bzip2 -t ${WORKING_FOLDER_02003}/bz2_compression.bz2 +${CLICKHOUSE_CLIENT} --query "SELECT * FROM file('${WORKING_FOLDER_02003}/bz2_compression.bz2', 'TabSeparated', 'col String')" + +rm -rf "${WORKING_FOLDER_02003}" diff --git a/tests/queries/0_stateless/02003_memory_limit_in_client.expect b/tests/queries/0_stateless/02003_memory_limit_in_client.expect new file mode 100755 index 00000000000..49b81240829 --- /dev/null +++ b/tests/queries/0_stateless/02003_memory_limit_in_client.expect @@ -0,0 +1,40 @@ +#!/usr/bin/expect -f + +# This is a test for system.warnings. Testing in interactive mode is necessary, +# as we want to see certain warnings from client + +log_user 0 +set timeout 60 +match_max 100000 + +# A default timeout action is to do nothing, change it to fail +expect_after { + timeout { + exit 1 + } +} + +set basedir [file dirname $argv0] +spawn bash -c "source $basedir/../shell_config.sh ; \$CLICKHOUSE_CLIENT_BINARY \$CLICKHOUSE_CLIENT_OPT --disable_suggestion --max_memory_usage_in_client=1" +expect ":) " + +send -- "SELECT arrayMap(x -> range(x), range(number)) FROM numbers(1000)\r" +expect "Code: 241" + +expect ":) " + +# Exit. +send -- "\4" +expect eof + +set basedir [file dirname $argv0] +spawn bash -c "source $basedir/../shell_config.sh ; \$CLICKHOUSE_CLIENT_BINARY \$CLICKHOUSE_CLIENT_OPT --disable_suggestion --max_memory_usage_in_client=1" +expect ":) " + +send -- "SELECT * FROM (SELECT * FROM system.numbers LIMIT 600000) as num WHERE num.number=60000\r" +expect "60000" +expect ":) " + +# Exit. +send -- "\4" +expect eof diff --git a/tests/queries/0_stateless/02003_memory_limit_in_client.reference b/tests/queries/0_stateless/02003_memory_limit_in_client.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/02004_intersect_except_operators.reference b/tests/queries/0_stateless/02004_intersect_except_operators.reference new file mode 100644 index 00000000000..85559496f2f --- /dev/null +++ b/tests/queries/0_stateless/02004_intersect_except_operators.reference @@ -0,0 +1,136 @@ +-- { echo } +select 1 intersect select 1; +1 +select 2 intersect select 1; +select 1 except select 1; +select 2 except select 1; +2 +select number from numbers(20) intersect select number from numbers(5, 5); +5 +6 +7 +8 +9 +select number from numbers(10) except select number from numbers(5); +5 +6 +7 +8 +9 +select number, number+10 from numbers(12) except select number+5, number+15 from numbers(10); +0 10 +1 11 +2 12 +3 13 +4 14 +select 1 except select 2 intersect select 1; +1 +select 1 except select 2 intersect select 2; +1 +select 1 intersect select 1 except select 2; +1 +select 1 intersect select 1 except select 1; +select 1 intersect select 1 except select 2 intersect select 1 except select 3 intersect select 1; +1 +select 1 intersect select 1 except select 2 intersect select 1 except select 3 intersect select 2; +1 +select 1 intersect select 1 except select 2 intersect select 1 except select 3 intersect select 2 except select 1; +select number from numbers(10) except select 5; +0 +1 +2 +3 +4 +6 +7 +8 +9 +select number from numbers(100) intersect select number from numbers(20, 60) except select number from numbers(30, 20) except select number from numbers(60, 20); +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +select * from (select 1 intersect select 1); +1 +with (select number from numbers(10) intersect select 5) as a select a * 10; +50 +with (select 5 except select 1) as a select a except select 5; +with (select number from numbers(10) intersect select 5) as a select a intersect select 1; +with (select number from numbers(10) intersect select 5) as a select a except select 1; +5 +select count() from (select number from numbers(10) except select 5); +9 +select count() from (select number from numbers(1000000) intersect select number from numbers(200000, 600000)); +600000 +select count() from (select number from numbers(100) intersect select number from numbers(20, 60) except select number from numbers(30, 20) except select number from numbers(60, 20)); +20 +select count() from (select number from numbers(100) intersect select number from numbers(20, 60) except select number from numbers(30, 20) except select number from numbers(60, 20) union all select number from numbers(100, 10)); +30 +select count() from (select number from numbers(1000000) intersect select number from numbers(200000, 600000) except select number from numbers(300000, 200000) except select number from numbers(600000, 200000)); +200000 +select count() from (select 1 intersect select 1) limit 100; +1 +select count() from (select 1 except select 2) limit 100; +1 +with (select count() from (select 1 union distinct select 2 except select 1)) as max +select count() from (select 1 union all select max) limit 100; +2 +select 1 union all select 1 intersect select 1; +1 +1 +select 1 union all select 1 intersect select 2; +1 +select * from (select 1 union all select 2 union all select 3 union all select 4 except select 3 union all select 5) order by 1; +1 +2 +4 +5 +select * from (select 1 union all select 2 union all select 3 union all select 4 intersect select 3 union all select 5) order by 1; +1 +2 +3 +5 +select * from (select 1 union all select 2 union all select 3 union all select 4 intersect select 3 union all select 5 except select 1) order by 1; +2 +3 +5 +select 1 intersect (select 1 except select 2); +1 +select 1 union all select 2 except (select 2 except select 1 union all select 1) except select 4; +select 1 intersect select count() from (select 1 except select 2 intersect select 2 union all select 1); +explain syntax select 1 intersect select 1; +SELECT 1 +INTERSECT +SELECT 1 +explain syntax select 1 except select 1; +SELECT 1 +EXCEPT +SELECT 1 +explain syntax select 1 union all select 2 except (select 2 except select 1 union all select 1) except select 4; +SELECT 1 +UNION ALL +SELECT 2 +EXCEPT +SELECT 2 +EXCEPT +SELECT 1 +UNION ALL +SELECT 1 +EXCEPT +SELECT 4 diff --git a/tests/queries/0_stateless/02004_intersect_except_operators.sql b/tests/queries/0_stateless/02004_intersect_except_operators.sql new file mode 100644 index 00000000000..b95051cba65 --- /dev/null +++ b/tests/queries/0_stateless/02004_intersect_except_operators.sql @@ -0,0 +1,50 @@ +-- { echo } +select 1 intersect select 1; +select 2 intersect select 1; +select 1 except select 1; +select 2 except select 1; + +select number from numbers(20) intersect select number from numbers(5, 5); +select number from numbers(10) except select number from numbers(5); +select number, number+10 from numbers(12) except select number+5, number+15 from numbers(10); + +select 1 except select 2 intersect select 1; +select 1 except select 2 intersect select 2; +select 1 intersect select 1 except select 2; +select 1 intersect select 1 except select 1; +select 1 intersect select 1 except select 2 intersect select 1 except select 3 intersect select 1; +select 1 intersect select 1 except select 2 intersect select 1 except select 3 intersect select 2; +select 1 intersect select 1 except select 2 intersect select 1 except select 3 intersect select 2 except select 1; + +select number from numbers(10) except select 5; +select number from numbers(100) intersect select number from numbers(20, 60) except select number from numbers(30, 20) except select number from numbers(60, 20); + +select * from (select 1 intersect select 1); +with (select number from numbers(10) intersect select 5) as a select a * 10; +with (select 5 except select 1) as a select a except select 5; +with (select number from numbers(10) intersect select 5) as a select a intersect select 1; +with (select number from numbers(10) intersect select 5) as a select a except select 1; +select count() from (select number from numbers(10) except select 5); +select count() from (select number from numbers(1000000) intersect select number from numbers(200000, 600000)); +select count() from (select number from numbers(100) intersect select number from numbers(20, 60) except select number from numbers(30, 20) except select number from numbers(60, 20)); +select count() from (select number from numbers(100) intersect select number from numbers(20, 60) except select number from numbers(30, 20) except select number from numbers(60, 20) union all select number from numbers(100, 10)); +select count() from (select number from numbers(1000000) intersect select number from numbers(200000, 600000) except select number from numbers(300000, 200000) except select number from numbers(600000, 200000)); + +select count() from (select 1 intersect select 1) limit 100; +select count() from (select 1 except select 2) limit 100; +with (select count() from (select 1 union distinct select 2 except select 1)) as max +select count() from (select 1 union all select max) limit 100; + +select 1 union all select 1 intersect select 1; +select 1 union all select 1 intersect select 2; +select * from (select 1 union all select 2 union all select 3 union all select 4 except select 3 union all select 5) order by 1; +select * from (select 1 union all select 2 union all select 3 union all select 4 intersect select 3 union all select 5) order by 1; +select * from (select 1 union all select 2 union all select 3 union all select 4 intersect select 3 union all select 5 except select 1) order by 1; + +select 1 intersect (select 1 except select 2); +select 1 union all select 2 except (select 2 except select 1 union all select 1) except select 4; +select 1 intersect select count() from (select 1 except select 2 intersect select 2 union all select 1); + +explain syntax select 1 intersect select 1; +explain syntax select 1 except select 1; +explain syntax select 1 union all select 2 except (select 2 except select 1 union all select 1) except select 4; diff --git a/tests/queries/0_stateless/02004_invalid_partition_mutation_stuck.reference b/tests/queries/0_stateless/02004_invalid_partition_mutation_stuck.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/02004_invalid_partition_mutation_stuck.sql b/tests/queries/0_stateless/02004_invalid_partition_mutation_stuck.sql new file mode 100644 index 00000000000..481a5565095 --- /dev/null +++ b/tests/queries/0_stateless/02004_invalid_partition_mutation_stuck.sql @@ -0,0 +1,33 @@ +SET mutations_sync=2; + +DROP TABLE IF EXISTS rep_data; +CREATE TABLE rep_data +( + p Int, + t DateTime, + INDEX idx t TYPE minmax GRANULARITY 1 +) +ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/rep_data', '1') +PARTITION BY p +ORDER BY t +SETTINGS number_of_free_entries_in_pool_to_execute_mutation=0; +INSERT INTO rep_data VALUES (1, now()); +ALTER TABLE rep_data MATERIALIZE INDEX idx IN PARTITION ID 'NO_SUCH_PART'; -- { serverError 248 } +ALTER TABLE rep_data MATERIALIZE INDEX idx IN PARTITION ID '1'; +ALTER TABLE rep_data MATERIALIZE INDEX idx IN PARTITION ID '2'; + +DROP TABLE IF EXISTS data; +CREATE TABLE data +( + p Int, + t DateTime, + INDEX idx t TYPE minmax GRANULARITY 1 +) +ENGINE = MergeTree +PARTITION BY p +ORDER BY t +SETTINGS number_of_free_entries_in_pool_to_execute_mutation=0; +INSERT INTO data VALUES (1, now()); +ALTER TABLE data MATERIALIZE INDEX idx IN PARTITION ID 'NO_SUCH_PART'; -- { serverError 341 } +ALTER TABLE data MATERIALIZE INDEX idx IN PARTITION ID '1'; +ALTER TABLE data MATERIALIZE INDEX idx IN PARTITION ID '2'; diff --git a/tests/queries/0_stateless/02004_max_hyperscan_regex_length.reference b/tests/queries/0_stateless/02004_max_hyperscan_regex_length.reference new file mode 100644 index 00000000000..87e68c152c3 --- /dev/null +++ b/tests/queries/0_stateless/02004_max_hyperscan_regex_length.reference @@ -0,0 +1,6 @@ +1 +1 +[1] +1 +1 +[1] diff --git a/tests/queries/0_stateless/02004_max_hyperscan_regex_length.sql b/tests/queries/0_stateless/02004_max_hyperscan_regex_length.sql new file mode 100644 index 00000000000..6058ef2f430 --- /dev/null +++ b/tests/queries/0_stateless/02004_max_hyperscan_regex_length.sql @@ -0,0 +1,26 @@ +set max_hyperscan_regexp_length = 1; +set max_hyperscan_regexp_total_length = 1; + +select multiMatchAny('123', ['1']); +select multiMatchAny('123', ['12']); -- { serverError 36 } +select multiMatchAny('123', ['1', '2']); -- { serverError 36 } + +select multiMatchAnyIndex('123', ['1']); +select multiMatchAnyIndex('123', ['12']); -- { serverError 36 } +select multiMatchAnyIndex('123', ['1', '2']); -- { serverError 36 } + +select multiMatchAllIndices('123', ['1']); +select multiMatchAllIndices('123', ['12']); -- { serverError 36 } +select multiMatchAllIndices('123', ['1', '2']); -- { serverError 36 } + +select multiFuzzyMatchAny('123', 0, ['1']); +select multiFuzzyMatchAny('123', 0, ['12']); -- { serverError 36 } +select multiFuzzyMatchAny('123', 0, ['1', '2']); -- { serverError 36 } + +select multiFuzzyMatchAnyIndex('123', 0, ['1']); +select multiFuzzyMatchAnyIndex('123', 0, ['12']); -- { serverError 36 } +select multiFuzzyMatchAnyIndex('123', 0, ['1', '2']); -- { serverError 36 } + +select multiFuzzyMatchAllIndices('123', 0, ['1']); +select multiFuzzyMatchAllIndices('123', 0, ['12']); -- { serverError 36 } +select multiFuzzyMatchAllIndices('123', 0, ['1', '2']); -- { serverError 36 } diff --git a/tests/queries/0_stateless/02005_log_formatted_queries.reference b/tests/queries/0_stateless/02005_log_formatted_queries.reference new file mode 100644 index 00000000000..3ddd8b0d64f --- /dev/null +++ b/tests/queries/0_stateless/02005_log_formatted_queries.reference @@ -0,0 +1,3 @@ +02005_log_formatted_queries.sql +select \'02005_log_formatted_queries.sql\' from system.one; SELECT \'02005_log_formatted_queries.sql\' FROM system.one +select \'02005_log_formatted_queries.sql\' from system.one; SELECT \'02005_log_formatted_queries.sql\' FROM system.one diff --git a/tests/queries/0_stateless/02005_log_formatted_queries.sql b/tests/queries/0_stateless/02005_log_formatted_queries.sql new file mode 100644 index 00000000000..62f839af0f0 --- /dev/null +++ b/tests/queries/0_stateless/02005_log_formatted_queries.sql @@ -0,0 +1,5 @@ +set log_formatted_queries = 1; + +select '02005_log_formatted_queries.sql' from system.one; +system flush logs; +select query, formatted_query from system.query_log where current_database = currentDatabase() and query = 'select \'02005_log_formatted_queries.sql\' from system.one;' and event_date >= yesterday() and event_time > now() - interval 5 minute; diff --git a/tests/queries/0_stateless/02006_client_test_hint_error_name.reference b/tests/queries/0_stateless/02006_client_test_hint_error_name.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/02006_client_test_hint_error_name.sql b/tests/queries/0_stateless/02006_client_test_hint_error_name.sql new file mode 100644 index 00000000000..268406a8054 --- /dev/null +++ b/tests/queries/0_stateless/02006_client_test_hint_error_name.sql @@ -0,0 +1 @@ +select throwIf(1); -- { serverError FUNCTION_THROW_IF_VALUE_IS_NON_ZERO } diff --git a/tests/queries/0_stateless/02006_client_test_hint_no_such_error_name.reference b/tests/queries/0_stateless/02006_client_test_hint_no_such_error_name.reference new file mode 100644 index 00000000000..40bea919c93 --- /dev/null +++ b/tests/queries/0_stateless/02006_client_test_hint_no_such_error_name.reference @@ -0,0 +1 @@ +No error code with name: 'FOOBAR'. (NO_SUCH_ERROR_CODE) diff --git a/tests/queries/0_stateless/02006_client_test_hint_no_such_error_name.sh b/tests/queries/0_stateless/02006_client_test_hint_no_such_error_name.sh new file mode 100755 index 00000000000..15ede23a510 --- /dev/null +++ b/tests/queries/0_stateless/02006_client_test_hint_no_such_error_name.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +$CLICKHOUSE_CLIENT --testmode -n -q 'select 1 -- { clientError FOOBAR }' |& grep -o 'No error code with name:.*' diff --git a/tests/queries/0_stateless/02006_todatetime64_from_string.reference b/tests/queries/0_stateless/02006_todatetime64_from_string.reference new file mode 100644 index 00000000000..e95351fe815 --- /dev/null +++ b/tests/queries/0_stateless/02006_todatetime64_from_string.reference @@ -0,0 +1 @@ +2021-03-21 23:00:00.000 diff --git a/tests/queries/0_stateless/02006_todatetime64_from_string.sql b/tests/queries/0_stateless/02006_todatetime64_from_string.sql new file mode 100644 index 00000000000..305dd49f70e --- /dev/null +++ b/tests/queries/0_stateless/02006_todatetime64_from_string.sql @@ -0,0 +1 @@ +SELECT toDateTime64('2021-03-22', 3, 'Asia/Tehran'); diff --git a/tests/queries/0_stateless/02006_use_constants_in_with_and_select.reference b/tests/queries/0_stateless/02006_use_constants_in_with_and_select.reference new file mode 100644 index 00000000000..bbf008ffdf2 --- /dev/null +++ b/tests/queries/0_stateless/02006_use_constants_in_with_and_select.reference @@ -0,0 +1,5 @@ +1 [1] +[1] +99.9 +0.1 99.9 +[99.9] diff --git a/tests/queries/0_stateless/02006_use_constants_in_with_and_select.sql b/tests/queries/0_stateless/02006_use_constants_in_with_and_select.sql new file mode 100644 index 00000000000..91171c9ab7b --- /dev/null +++ b/tests/queries/0_stateless/02006_use_constants_in_with_and_select.sql @@ -0,0 +1,36 @@ +SELECT + 1 AS max_size, + groupArray(max_size)(col) +FROM + ( + SELECT 1 AS col + UNION ALL + SELECT 2 + ); + +WITH 1 AS max_size +SELECT groupArray(max_size)(col) +FROM + ( + SELECT 1 as col + UNION ALL + SELECT 2 + ); + +WITH 0.1 AS level +SELECT quantile(level)(number) +FROM numbers(1000); + +SELECT 0.1 AS level, quantile(level)(number) +FROM numbers(1000); + +WITH + 0.1 AS level, + 1 AS max_size +SELECT groupArray(max_size)(col) +FROM + ( + SELECT quantile(level)(number) AS col + FROM numbers(1000) + ); + diff --git a/tests/queries/0_stateless/02007_join_use_nulls.reference b/tests/queries/0_stateless/02007_join_use_nulls.reference new file mode 100644 index 00000000000..30ee87bf91d --- /dev/null +++ b/tests/queries/0_stateless/02007_join_use_nulls.reference @@ -0,0 +1,8 @@ +1 2 3 1 3 +1 UInt8 2 UInt8 3 Nullable(UInt8) +1 LowCardinality(UInt8) 2 LowCardinality(UInt8) 3 LowCardinality(Nullable(UInt8)) +1 LowCardinality(UInt8) 2 LowCardinality(UInt8) 1 LowCardinality(Nullable(UInt8)) +1 UInt8 2 UInt8 3 Nullable(UInt8) +1 UInt8 2 UInt8 1 Nullable(UInt8) 3 Nullable(UInt8) +1 LowCardinality(UInt8) 2 LowCardinality(UInt8) 3 LowCardinality(Nullable(UInt8)) +1 LowCardinality(UInt8) 2 LowCardinality(UInt8) 1 LowCardinality(Nullable(UInt8)) 3 LowCardinality(Nullable(UInt8)) diff --git a/tests/queries/0_stateless/02007_join_use_nulls.sql b/tests/queries/0_stateless/02007_join_use_nulls.sql new file mode 100644 index 00000000000..e08fffce3b7 --- /dev/null +++ b/tests/queries/0_stateless/02007_join_use_nulls.sql @@ -0,0 +1,11 @@ +SET join_use_nulls = 1; + +SELECT *, d.* FROM ( SELECT 1 AS id, 2 AS value ) a SEMI LEFT JOIN ( SELECT 1 AS id, 3 AS values ) AS d USING id; + +SELECT id, toTypeName(id), value, toTypeName(value), d.values, toTypeName(d.values) FROM ( SELECT 1 AS id, 2 AS value ) a SEMI LEFT JOIN ( SELECT 1 AS id, 3 AS values ) AS d USING id; +SELECT id, toTypeName(id), value, toTypeName(value), d.values, toTypeName(d.values) FROM ( SELECT toLowCardinality(1) AS id, toLowCardinality(2) AS value ) a SEMI LEFT JOIN ( SELECT toLowCardinality(1) AS id, toLowCardinality(3) AS values ) AS d USING id; +SELECT id, toTypeName(id), value, toTypeName(value), d.id, toTypeName(d.id) FROM ( SELECT toLowCardinality(1) AS id, toLowCardinality(2) AS value ) a SEMI LEFT JOIN ( SELECT toLowCardinality(1) AS id, toLowCardinality(3) AS values ) AS d USING id; +SELECT id, toTypeName(id), value, toTypeName(value), d.values, toTypeName(d.values) FROM ( SELECT 1 AS id, 2 AS value ) a SEMI LEFT JOIN ( SELECT 1 AS id, 3 AS values ) AS d USING id; +SELECT id, toTypeName(id), value, toTypeName(value), d.id, toTypeName(d.id) , d.values, toTypeName(d.values) FROM ( SELECT 1 AS id, 2 AS value ) a SEMI LEFT JOIN ( SELECT 1 AS id, 3 AS values ) AS d USING id; +SELECT id, toTypeName(id), value, toTypeName(value), d.values, toTypeName(d.values) FROM ( SELECT toLowCardinality(1) AS id, toLowCardinality(2) AS value ) a SEMI LEFT JOIN ( SELECT toLowCardinality(1) AS id, toLowCardinality(3) AS values ) AS d USING id; +SELECT id, toTypeName(id), value, toTypeName(value), d.id, toTypeName(d.id) , d.values, toTypeName(d.values) FROM ( SELECT toLowCardinality(1) AS id, toLowCardinality(2) AS value ) a SEMI LEFT JOIN ( SELECT toLowCardinality(1) AS id, toLowCardinality(3) AS values ) AS d USING id; diff --git a/tests/queries/0_stateless/02007_test_any_all_operators.reference b/tests/queries/0_stateless/02007_test_any_all_operators.reference new file mode 100644 index 00000000000..a232320d15c --- /dev/null +++ b/tests/queries/0_stateless/02007_test_any_all_operators.reference @@ -0,0 +1,51 @@ +-- { echo } +select 1 == any (select number from numbers(10)); +1 +select 1 == any (select number from numbers(2, 10)); +0 +select 1 != all (select 1 from numbers(10)); +0 +select 1 != all (select number from numbers(10)); +0 +select 1 == all (select 1 from numbers(10)); +1 +select 1 == all (select number from numbers(10)); +0 +select 1 != any (select 1 from numbers(10)); +0 +select 1 != any (select number from numbers(10)); +1 +select number as a from numbers(10) where a == any (select number from numbers(3, 3)); +3 +4 +5 +select number as a from numbers(10) where a != any (select 5 from numbers(3, 3)); +0 +1 +2 +3 +4 +6 +7 +8 +9 +select 1 < any (select 1 from numbers(10)); +0 +select 1 <= any (select 1 from numbers(10)); +1 +select 1 < any (select number from numbers(10)); +1 +select 1 > any (select number from numbers(10)); +1 +select 1 >= any (select number from numbers(10)); +1 +select 11 > all (select number from numbers(10)); +1 +select 11 <= all (select number from numbers(11)); +0 +select 11 < all (select 11 from numbers(10)); +0 +select 11 > all (select 11 from numbers(10)); +0 +select 11 >= all (select 11 from numbers(10)); +1 diff --git a/tests/queries/0_stateless/02007_test_any_all_operators.sql b/tests/queries/0_stateless/02007_test_any_all_operators.sql new file mode 100644 index 00000000000..10d7325afca --- /dev/null +++ b/tests/queries/0_stateless/02007_test_any_all_operators.sql @@ -0,0 +1,26 @@ +-- { echo } +select 1 == any (select number from numbers(10)); +select 1 == any (select number from numbers(2, 10)); + +select 1 != all (select 1 from numbers(10)); +select 1 != all (select number from numbers(10)); + +select 1 == all (select 1 from numbers(10)); +select 1 == all (select number from numbers(10)); + +select 1 != any (select 1 from numbers(10)); +select 1 != any (select number from numbers(10)); + +select number as a from numbers(10) where a == any (select number from numbers(3, 3)); +select number as a from numbers(10) where a != any (select 5 from numbers(3, 3)); + +select 1 < any (select 1 from numbers(10)); +select 1 <= any (select 1 from numbers(10)); +select 1 < any (select number from numbers(10)); +select 1 > any (select number from numbers(10)); +select 1 >= any (select number from numbers(10)); +select 11 > all (select number from numbers(10)); +select 11 <= all (select number from numbers(11)); +select 11 < all (select 11 from numbers(10)); +select 11 > all (select 11 from numbers(10)); +select 11 >= all (select 11 from numbers(10)); diff --git a/tests/queries/0_stateless/02008_aliased_column_distributed_bug.reference b/tests/queries/0_stateless/02008_aliased_column_distributed_bug.reference new file mode 100644 index 00000000000..406c915e7d7 --- /dev/null +++ b/tests/queries/0_stateless/02008_aliased_column_distributed_bug.reference @@ -0,0 +1,20 @@ +0 +0 +0 +0 +0 +0 +6 +7 +8 +9 +0 +0 +0 +0 +0 +0 +6 +7 +8 +9 diff --git a/tests/queries/0_stateless/02008_aliased_column_distributed_bug.sql b/tests/queries/0_stateless/02008_aliased_column_distributed_bug.sql new file mode 100644 index 00000000000..92cc30c38dc --- /dev/null +++ b/tests/queries/0_stateless/02008_aliased_column_distributed_bug.sql @@ -0,0 +1,16 @@ +DROP TABLE IF EXISTS click_storage; +DROP TABLE IF EXISTS click_storage_dst; + +CREATE TABLE click_storage ( `PhraseID` UInt64, `PhraseProcessedID` UInt64 ALIAS if(PhraseID > 5, PhraseID, 0) ) ENGINE = MergeTree() ORDER BY tuple(); +INSERT INTO click_storage SELECT number AS PhraseID from numbers(10); + +CREATE TABLE click_storage_dst ( `PhraseID` UInt64, `PhraseProcessedID` UInt64 ) ENGINE = Distributed(test_shard_localhost, currentDatabase(), 'click_storage'); + +SET prefer_localhost_replica = 1; +SELECT materialize(PhraseProcessedID) FROM click_storage_dst; + +SET prefer_localhost_replica = 0; +SELECT materialize(PhraseProcessedID) FROM click_storage_dst; + +DROP TABLE IF EXISTS click_storage; +DROP TABLE IF EXISTS click_storage_dst; diff --git a/tests/queries/0_stateless/02008_complex_key_range_hashed_dictionary.reference b/tests/queries/0_stateless/02008_complex_key_range_hashed_dictionary.reference new file mode 100644 index 00000000000..41a12f88906 --- /dev/null +++ b/tests/queries/0_stateless/02008_complex_key_range_hashed_dictionary.reference @@ -0,0 +1,58 @@ +Dictionary not nullable +dictGet +0.33 +0.42 +0.46 +0.2 +0.4 +dictHas +1 +1 +1 +0 +select columns from dictionary +allColumns +2019-05-05 2019-05-20 1 1 0.33 +2019-05-21 2019-05-30 1 1 0.42 +2019-05-21 2019-05-30 2 2 0.46 +noColumns +1 +1 +1 +onlySpecificColumns +1 2019-05-05 0.33 +1 2019-05-21 0.42 +2 2019-05-21 0.46 +onlySpecificColumn +0.33 +0.42 +0.46 +Dictionary nullable +dictGet +0.33 +0.42 +\N +0.2 +0.4 +dictHas +1 +1 +1 +0 +select columns from dictionary +allColumns +2019-05-05 2019-05-20 1 1 0.33 +2019-05-21 2019-05-30 1 1 0.42 +2019-05-21 2019-05-30 2 2 \N +noColumns +1 +1 +1 +onlySpecificColumns +1 2019-05-05 0.33 +1 2019-05-21 0.42 +2 2019-05-21 \N +onlySpecificColumn +0.33 +0.42 +\N diff --git a/tests/queries/0_stateless/02008_complex_key_range_hashed_dictionary.sql b/tests/queries/0_stateless/02008_complex_key_range_hashed_dictionary.sql new file mode 100644 index 00000000000..ba6ed30b609 --- /dev/null +++ b/tests/queries/0_stateless/02008_complex_key_range_hashed_dictionary.sql @@ -0,0 +1,109 @@ +DROP TABLE IF EXISTS date_table; +CREATE TABLE date_table +( + CountryID UInt64, + CountryKey String, + StartDate Date, + EndDate Date, + Tax Float64 +) +ENGINE = MergeTree() +ORDER BY CountryID; + +INSERT INTO date_table VALUES(1, '1', toDate('2019-05-05'), toDate('2019-05-20'), 0.33); +INSERT INTO date_table VALUES(1, '1', toDate('2019-05-21'), toDate('2019-05-30'), 0.42); +INSERT INTO date_table VALUES(2, '2', toDate('2019-05-21'), toDate('2019-05-30'), 0.46); + +DROP DICTIONARY IF EXISTS range_dictionary; +CREATE DICTIONARY range_dictionary +( + CountryID UInt64, + CountryKey String, + StartDate Date, + EndDate Date, + Tax Float64 DEFAULT 0.2 +) +PRIMARY KEY CountryID, CountryKey +SOURCE(CLICKHOUSE(TABLE 'date_table')) +LIFETIME(MIN 1 MAX 1000) +LAYOUT(COMPLEX_KEY_RANGE_HASHED()) +RANGE(MIN StartDate MAX EndDate); + +SELECT 'Dictionary not nullable'; +SELECT 'dictGet'; +SELECT dictGet('range_dictionary', 'Tax', (toUInt64(1), '1'), toDate('2019-05-15')); +SELECT dictGet('range_dictionary', 'Tax', (toUInt64(1), '1'), toDate('2019-05-29')); +SELECT dictGet('range_dictionary', 'Tax', (toUInt64(2), '2'), toDate('2019-05-29')); +SELECT dictGet('range_dictionary', 'Tax', (toUInt64(2), '2'), toDate('2019-05-31')); +SELECT dictGetOrDefault('range_dictionary', 'Tax', (toUInt64(2), '2'), toDate('2019-05-31'), 0.4); +SELECT 'dictHas'; +SELECT dictHas('range_dictionary', (toUInt64(1), '1'), toDate('2019-05-15')); +SELECT dictHas('range_dictionary', (toUInt64(1), '1'), toDate('2019-05-29')); +SELECT dictHas('range_dictionary', (toUInt64(2), '2'), toDate('2019-05-29')); +SELECT dictHas('range_dictionary', (toUInt64(2), '2'), toDate('2019-05-31')); +SELECT 'select columns from dictionary'; +SELECT 'allColumns'; +SELECT * FROM range_dictionary; +SELECT 'noColumns'; +SELECT 1 FROM range_dictionary; +SELECT 'onlySpecificColumns'; +SELECT CountryID, StartDate, Tax FROM range_dictionary; +SELECT 'onlySpecificColumn'; +SELECT Tax FROM range_dictionary; + +DROP TABLE date_table; +DROP DICTIONARY range_dictionary; + +CREATE TABLE date_table +( + CountryID UInt64, + CountryKey String, + StartDate Date, + EndDate Date, + Tax Nullable(Float64) +) +ENGINE = MergeTree() +ORDER BY CountryID; + +INSERT INTO date_table VALUES(1, '1', toDate('2019-05-05'), toDate('2019-05-20'), 0.33); +INSERT INTO date_table VALUES(1, '1', toDate('2019-05-21'), toDate('2019-05-30'), 0.42); +INSERT INTO date_table VALUES(2, '2', toDate('2019-05-21'), toDate('2019-05-30'), NULL); + +CREATE DICTIONARY range_dictionary_nullable +( + CountryID UInt64, + CountryKey String, + StartDate Date, + EndDate Date, + Tax Nullable(Float64) DEFAULT 0.2 +) +PRIMARY KEY CountryID, CountryKey +SOURCE(CLICKHOUSE(TABLE 'date_table')) +LIFETIME(MIN 1 MAX 1000) +LAYOUT(COMPLEX_KEY_RANGE_HASHED()) +RANGE(MIN StartDate MAX EndDate); + +SELECT 'Dictionary nullable'; +SELECT 'dictGet'; +SELECT dictGet('range_dictionary_nullable', 'Tax', (toUInt64(1), '1'), toDate('2019-05-15')); +SELECT dictGet('range_dictionary_nullable', 'Tax', (toUInt64(1), '1'), toDate('2019-05-29')); +SELECT dictGet('range_dictionary_nullable', 'Tax', (toUInt64(2), '2'), toDate('2019-05-29')); +SELECT dictGet('range_dictionary_nullable', 'Tax', (toUInt64(2), '2'), toDate('2019-05-31')); +SELECT dictGetOrDefault('range_dictionary_nullable', 'Tax', (toUInt64(2), '2'), toDate('2019-05-31'), 0.4); +SELECT 'dictHas'; +SELECT dictHas('range_dictionary_nullable', (toUInt64(1), '1'), toDate('2019-05-15')); +SELECT dictHas('range_dictionary_nullable', (toUInt64(1), '1'), toDate('2019-05-29')); +SELECT dictHas('range_dictionary_nullable', (toUInt64(2), '2'), toDate('2019-05-29')); +SELECT dictHas('range_dictionary_nullable', (toUInt64(2), '2'), toDate('2019-05-31')); +SELECT 'select columns from dictionary'; +SELECT 'allColumns'; +SELECT * FROM range_dictionary_nullable; +SELECT 'noColumns'; +SELECT 1 FROM range_dictionary_nullable; +SELECT 'onlySpecificColumns'; +SELECT CountryID, StartDate, Tax FROM range_dictionary_nullable; +SELECT 'onlySpecificColumn'; +SELECT Tax FROM range_dictionary_nullable; + +DROP TABLE date_table; +DROP DICTIONARY range_dictionary_nullable; diff --git a/tests/queries/0_stateless/02008_test_union_distinct_in_subquery.reference b/tests/queries/0_stateless/02008_test_union_distinct_in_subquery.reference new file mode 100644 index 00000000000..e4f1a68c87a --- /dev/null +++ b/tests/queries/0_stateless/02008_test_union_distinct_in_subquery.reference @@ -0,0 +1,26 @@ +-- { echo } +select count() from (select * from test union distinct select * from test); +5 +select count() from (select * from test union distinct select * from test union all select * from test); +10 +select count() from (select * from test union distinct select * from test except select * from test where name = '3'); +4 +select count() from (select * from test intersect (select * from test where toUInt8(name) < 4) union distinct (select * from test where name = '5' or name = '1') except select * from test where name = '3'); +3 +with (select count() from (select * from test union distinct select * from test except select * from test where toUInt8(name) > 3)) as max +select count() from (select * from test union all select * from test where toUInt8(name) < max); +7 +with (select count() from (select * from test union distinct select * from test except select * from test where toUInt8(name) > 3)) as max +select count() from (select * from test except select * from test where toUInt8(name) < max); +3 +select uuid from test union distinct select uuid from test; +00000000-0000-0000-0000-000000000000 +select uuid from test union distinct select uuid from test union all select uuid from test where name = '1'; +00000000-0000-0000-0000-000000000000 +00000000-0000-0000-0000-000000000000 +select uuid from (select * from test union distinct select * from test); +00000000-0000-0000-0000-000000000000 +00000000-0000-0000-0000-000000000000 +00000000-0000-0000-0000-000000000000 +00000000-0000-0000-0000-000000000000 +00000000-0000-0000-0000-000000000000 diff --git a/tests/queries/0_stateless/02008_test_union_distinct_in_subquery.sql b/tests/queries/0_stateless/02008_test_union_distinct_in_subquery.sql new file mode 100644 index 00000000000..c5d270a4c8c --- /dev/null +++ b/tests/queries/0_stateless/02008_test_union_distinct_in_subquery.sql @@ -0,0 +1,23 @@ +drop table if exists test; +create table test (name String, uuid UUID) engine=Memory(); +insert into test select '1', '00000000-0000-0000-0000-000000000000'; +insert into test select '2', '00000000-0000-0000-0000-000000000000'; +insert into test select '3', '00000000-0000-0000-0000-000000000000'; +insert into test select '4', '00000000-0000-0000-0000-000000000000'; +insert into test select '5', '00000000-0000-0000-0000-000000000000'; + +-- { echo } +select count() from (select * from test union distinct select * from test); +select count() from (select * from test union distinct select * from test union all select * from test); +select count() from (select * from test union distinct select * from test except select * from test where name = '3'); +select count() from (select * from test intersect (select * from test where toUInt8(name) < 4) union distinct (select * from test where name = '5' or name = '1') except select * from test where name = '3'); + +with (select count() from (select * from test union distinct select * from test except select * from test where toUInt8(name) > 3)) as max +select count() from (select * from test union all select * from test where toUInt8(name) < max); +with (select count() from (select * from test union distinct select * from test except select * from test where toUInt8(name) > 3)) as max +select count() from (select * from test except select * from test where toUInt8(name) < max); + +select uuid from test union distinct select uuid from test; +select uuid from test union distinct select uuid from test union all select uuid from test where name = '1'; +select uuid from (select * from test union distinct select * from test); + diff --git a/tests/queries/0_stateless/02008_tuple_to_name_value_pairs.reference b/tests/queries/0_stateless/02008_tuple_to_name_value_pairs.reference new file mode 100644 index 00000000000..90d15b16dcd --- /dev/null +++ b/tests/queries/0_stateless/02008_tuple_to_name_value_pairs.reference @@ -0,0 +1,6 @@ +[('1',1),('2',2),('3',3)] +[('a',(1,2)),('b',(3,4))] +[('a',(5,6)),('b',(7,8))] +CPU 3.3 +Memory 5.5 +Disk 6.6 diff --git a/tests/queries/0_stateless/02008_tuple_to_name_value_pairs.sql b/tests/queries/0_stateless/02008_tuple_to_name_value_pairs.sql new file mode 100644 index 00000000000..9204975b579 --- /dev/null +++ b/tests/queries/0_stateless/02008_tuple_to_name_value_pairs.sql @@ -0,0 +1,25 @@ +SELECT tupleToNameValuePairs(tuple(1, 2, 3)); + +DROP TABLE IF EXISTS test02008; +CREATE TABLE test02008 ( + col Tuple( + a Tuple(key1 int, key2 int), + b Tuple(key1 int, key3 int) + ) +) ENGINE=Memory(); +INSERT INTO test02008 VALUES (tuple(tuple(1, 2), tuple(3, 4))); +INSERT INTO test02008 VALUES (tuple(tuple(5, 6), tuple(7, 8))); +SELECT tupleToNameValuePairs(col) FROM test02008 ORDER BY col; + +DROP TABLE IF EXISTS test02008; +CREATE TABLE test02008 ( + col Tuple(CPU double, Memory double, Disk double) +) ENGINE=Memory(); +INSERT INTO test02008 VALUES (tuple(3.3, 5.5, 6.6)); +SELECT untuple(arrayJoin(tupleToNameValuePairs(col))) from test02008; + +DROP TABLE IF EXISTS test02008; +SELECT tupleToNameValuePairs(tuple(1, 1.3)); -- { serverError 43; } +SELECT tupleToNameValuePairs(tuple(1, [1,2])); -- { serverError 43; } +SELECT tupleToNameValuePairs(tuple(1, 'a')); -- { serverError 43; } +SELECT tupleToNameValuePairs(33); -- { serverError 43; } diff --git a/tests/queries/0_stateless/02009_array_join_partition.reference b/tests/queries/0_stateless/02009_array_join_partition.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/02009_array_join_partition.sql b/tests/queries/0_stateless/02009_array_join_partition.sql new file mode 100644 index 00000000000..a78efe96f66 --- /dev/null +++ b/tests/queries/0_stateless/02009_array_join_partition.sql @@ -0,0 +1,4 @@ +CREATE TABLE table_2009_part (`i` Int64, `d` Date, `s` String) ENGINE = MergeTree PARTITION BY toYYYYMM(d) ORDER BY i; + +ALTER TABLE table_2009_part ATTACH PARTITION tuple(arrayJoin([0, 1])); -- {serverError 248} +ALTER TABLE table_2009_part ATTACH PARTITION tuple(toYYYYMM(toDate([arrayJoin([arrayJoin([arrayJoin([arrayJoin([3, materialize(NULL), arrayJoin([1025, materialize(NULL), materialize(NULL)]), NULL])])]), materialize(NULL)])], NULL))); -- {serverError 248} diff --git a/tests/queries/0_stateless/02009_body_query_params.reference b/tests/queries/0_stateless/02009_body_query_params.reference new file mode 100644 index 00000000000..f78e78ca220 --- /dev/null +++ b/tests/queries/0_stateless/02009_body_query_params.reference @@ -0,0 +1,3 @@ +1 +1 +1 2 diff --git a/tests/queries/0_stateless/02009_body_query_params.sh b/tests/queries/0_stateless/02009_body_query_params.sh new file mode 100755 index 00000000000..494d208ee1a --- /dev/null +++ b/tests/queries/0_stateless/02009_body_query_params.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +curl -sS -F param_id=1 -X POST "${CLICKHOUSE_URL}&query=select%201%20as%20c%20where%20c%20%3D%20%7Bid%3AUInt8%7D"; +curl -sS -X GET "${CLICKHOUSE_URL}&query=select%201%20as%20c%20where%20c%20%3D%20%7Bid%3AUInt8%7D¶m_id=1"; +curl -sS -F param_id=1 -X POST "${CLICKHOUSE_URL}&query=select%201%20as%20c%2C%202%20as%20c2%20where%20c%20%3D%20%7Bid%3AUInt8%7D%20and%20c2%20%3D%20%20%7Bid2%3AUInt8%7D¶m_id2=2"; diff --git a/tests/queries/0_stateless/02009_decimal_no_trailing_zeros.reference b/tests/queries/0_stateless/02009_decimal_no_trailing_zeros.reference new file mode 100644 index 00000000000..58f5180322a --- /dev/null +++ b/tests/queries/0_stateless/02009_decimal_no_trailing_zeros.reference @@ -0,0 +1,63 @@ +-- { echo } + +SELECT 1.123::Decimal64(1); +1.1 +SELECT 1.123::Decimal64(2); +1.12 +SELECT 1.123::Decimal64(3); +1.123 +SELECT 1.123::Decimal64(4); +1.123 +SELECT 1.123::Decimal64(5); +1.123 +SELECT 1.123::Decimal64(10); +1.123 +SELECT 1::Decimal64(0); +1 +SELECT 1::Decimal64(1); +1 +SELECT 1::Decimal64(10); +1 +SELECT 1.1234567::Decimal32(8); +1.1234567 +SELECT 1.1234567890::Decimal64(10); +1.123456789 +SELECT 1.1234567890::Decimal128(10); +1.123456789 +SELECT 1.1234567890::Decimal256(10); +1.123456789 +SELECT 1.123456789012345678901::Decimal256(20); +1.1234567890123456789 +SELECT 1.123456789012345678901::Decimal256(22); +1.123456789012345678901 +SET output_format_decimal_trailing_zeros = 1; +SELECT 1.123::Decimal64(1); +1.1 +SELECT 1.123::Decimal64(2); +1.12 +SELECT 1.123::Decimal64(3); +1.123 +SELECT 1.123::Decimal64(4); +1.1230 +SELECT 1.123::Decimal64(5); +1.12300 +SELECT 1.123::Decimal64(10); +1.1230000000 +SELECT 1::Decimal64(0); +1 +SELECT 1::Decimal64(1); +1.0 +SELECT 1::Decimal64(10); +1.0000000000 +SELECT 1.1234567::Decimal32(8); +1.12345670 +SELECT 1.1234567890::Decimal64(10); +1.1234567890 +SELECT 1.1234567890::Decimal128(10); +1.1234567890 +SELECT 1.1234567890::Decimal256(10); +1.1234567890 +SELECT 1.123456789012345678901::Decimal256(20); +1.12345678901234567890 +SELECT 1.123456789012345678901::Decimal256(22); +1.1234567890123456789010 diff --git a/tests/queries/0_stateless/02009_decimal_no_trailing_zeros.sql b/tests/queries/0_stateless/02009_decimal_no_trailing_zeros.sql new file mode 100644 index 00000000000..e88e878b378 --- /dev/null +++ b/tests/queries/0_stateless/02009_decimal_no_trailing_zeros.sql @@ -0,0 +1,37 @@ +-- { echo } + +SELECT 1.123::Decimal64(1); +SELECT 1.123::Decimal64(2); +SELECT 1.123::Decimal64(3); +SELECT 1.123::Decimal64(4); +SELECT 1.123::Decimal64(5); +SELECT 1.123::Decimal64(10); +SELECT 1::Decimal64(0); +SELECT 1::Decimal64(1); +SELECT 1::Decimal64(10); + +SELECT 1.1234567::Decimal32(8); +SELECT 1.1234567890::Decimal64(10); +SELECT 1.1234567890::Decimal128(10); +SELECT 1.1234567890::Decimal256(10); +SELECT 1.123456789012345678901::Decimal256(20); +SELECT 1.123456789012345678901::Decimal256(22); + +SET output_format_decimal_trailing_zeros = 1; + +SELECT 1.123::Decimal64(1); +SELECT 1.123::Decimal64(2); +SELECT 1.123::Decimal64(3); +SELECT 1.123::Decimal64(4); +SELECT 1.123::Decimal64(5); +SELECT 1.123::Decimal64(10); +SELECT 1::Decimal64(0); +SELECT 1::Decimal64(1); +SELECT 1::Decimal64(10); + +SELECT 1.1234567::Decimal32(8); +SELECT 1.1234567890::Decimal64(10); +SELECT 1.1234567890::Decimal128(10); +SELECT 1.1234567890::Decimal256(10); +SELECT 1.123456789012345678901::Decimal256(20); +SELECT 1.123456789012345678901::Decimal256(22); diff --git a/tests/queries/0_stateless/02009_mysql_client_empty_result.reference b/tests/queries/0_stateless/02009_mysql_client_empty_result.reference new file mode 100644 index 00000000000..f11935a87d3 --- /dev/null +++ b/tests/queries/0_stateless/02009_mysql_client_empty_result.reference @@ -0,0 +1,4 @@ +x +1 +i +3 diff --git a/tests/queries/0_stateless/02009_mysql_client_empty_result.sh b/tests/queries/0_stateless/02009_mysql_client_empty_result.sh new file mode 100755 index 00000000000..cc1d0aece77 --- /dev/null +++ b/tests/queries/0_stateless/02009_mysql_client_empty_result.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +${MYSQL_CLIENT} --batch --execute 'SELECT 1 AS x' +${MYSQL_CLIENT} --batch --execute 'SELECT 1 AS x WHERE 0' + +${MYSQL_CLIENT} <<<" + DROP TABLE IF EXISTS b; + CREATE TABLE b (i UInt8) ENGINE=MergeTree() PRIMARY KEY(i) ORDER BY (i); + INSERT INTO b VALUES (1), (2), (3); +" + +${MYSQL_CLIENT} --batch --execute 'SELECT * FROM b WHERE i>=3;' +${MYSQL_CLIENT} --batch --execute 'SELECT * FROM b WHERE i>=300;' + +${MYSQL_CLIENT} <<<" + DROP TABLE b; +" diff --git a/tests/queries/0_stateless/02010_array_index_bad_cast.reference b/tests/queries/0_stateless/02010_array_index_bad_cast.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/02010_array_index_bad_cast.sql b/tests/queries/0_stateless/02010_array_index_bad_cast.sql new file mode 100644 index 00000000000..19c58bb28a7 --- /dev/null +++ b/tests/queries/0_stateless/02010_array_index_bad_cast.sql @@ -0,0 +1,2 @@ +-- This query throws exception about uncomparable data types (but at least it does not introduce bad cast in code). +SELECT has(materialize(CAST(['2021-07-14'] AS Array(LowCardinality(Nullable(DateTime))))), materialize('2021-07-14'::DateTime64(7))); -- { serverError 44 } diff --git a/tests/queries/0_stateless/02011_http_parsing.reference b/tests/queries/0_stateless/02011_http_parsing.reference new file mode 100644 index 00000000000..e059b92b8b7 --- /dev/null +++ b/tests/queries/0_stateless/02011_http_parsing.reference @@ -0,0 +1,6 @@ +One +Two +Three +Four +Five +Six diff --git a/tests/queries/0_stateless/02011_http_parsing.sh b/tests/queries/0_stateless/02011_http_parsing.sh new file mode 100755 index 00000000000..8021f7c550b --- /dev/null +++ b/tests/queries/0_stateless/02011_http_parsing.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +echo -ne 'One\nTwo\n' | ${CLICKHOUSE_CURL} -sSF 'metrics_list=@-;' "${CLICKHOUSE_URL}/?metrics_list_format=TSV&metrics_list_structure=Path+String&query=SELECT+*+FROM+metrics_list"; +echo -ne 'Three\nFour' | ${CLICKHOUSE_CURL} -sSF 'metrics_list=@-;' "${CLICKHOUSE_URL}/?metrics_list_format=TSV&metrics_list_structure=Path+String&query=SELECT+*+FROM+metrics_list"; +echo -ne 'Five\n' | ${CLICKHOUSE_CURL} -sSF 'metrics_list=@-;' "${CLICKHOUSE_URL}/?metrics_list_format=TSV&metrics_list_structure=Path+String&query=SELECT+*+FROM+metrics_list"; +echo -ne 'Six' | ${CLICKHOUSE_CURL} -sSF 'metrics_list=@-;' "${CLICKHOUSE_URL}/?metrics_list_format=TSV&metrics_list_structure=Path+String&query=SELECT+*+FROM+metrics_list"; diff --git a/tests/queries/0_stateless/arcadia_skip_list.txt b/tests/queries/0_stateless/arcadia_skip_list.txt index 8453094cc65..606015c369f 100644 --- a/tests/queries/0_stateless/arcadia_skip_list.txt +++ b/tests/queries/0_stateless/arcadia_skip_list.txt @@ -93,6 +93,8 @@ 01138_join_on_distributed_and_tmp 01153_attach_mv_uuid 01155_rename_move_materialized_view +01157_replace_table +01185_create_or_replace_table 01191_rename_dictionary 01200_mutations_memory_consumption 01211_optimize_skip_unused_shards_type_mismatch @@ -215,6 +217,7 @@ 01747_join_view_filter_dictionary 01748_dictionary_table_dot 01755_client_highlight_multi_line_comment_regression +01756_optimize_skip_unused_shards_rewrite_in 00950_dict_get 01683_flat_dictionary 01681_cache_dictionary_simple_key @@ -251,4 +254,16 @@ 01924_argmax_bitmap_state 01914_exchange_dictionaries 01923_different_expression_name_alias +01930_optimize_skip_unused_shards_rewrite_in 01932_null_valid_identifier +00918_json_functions +01889_sql_json_functions +01849_geoToS2 +01851_s2_to_geo +01852_s2_get_neighbours +01853_s2_cells_intersect +01854_s2_cap_contains +01854_s2_cap_union +01428_h3_range_check +01442_h3kring_range_check +01906_h3_to_geo diff --git a/tests/queries/0_stateless/data_orc_arrow_parquet_nested/nested_nested_table.arrow b/tests/queries/0_stateless/data_orc_arrow_parquet_nested/nested_nested_table.arrow new file mode 100644 index 00000000000..2f3709d079e Binary files /dev/null and b/tests/queries/0_stateless/data_orc_arrow_parquet_nested/nested_nested_table.arrow differ diff --git a/tests/queries/0_stateless/data_orc_arrow_parquet_nested/nested_nested_table.orc b/tests/queries/0_stateless/data_orc_arrow_parquet_nested/nested_nested_table.orc new file mode 100644 index 00000000000..4112df41a52 Binary files /dev/null and b/tests/queries/0_stateless/data_orc_arrow_parquet_nested/nested_nested_table.orc differ diff --git a/tests/queries/0_stateless/data_orc_arrow_parquet_nested/nested_nested_table.parquet b/tests/queries/0_stateless/data_orc_arrow_parquet_nested/nested_nested_table.parquet new file mode 100644 index 00000000000..c73fba8d483 Binary files /dev/null and b/tests/queries/0_stateless/data_orc_arrow_parquet_nested/nested_nested_table.parquet differ diff --git a/tests/queries/0_stateless/data_orc_arrow_parquet_nested/nested_table.arrow b/tests/queries/0_stateless/data_orc_arrow_parquet_nested/nested_table.arrow new file mode 100644 index 00000000000..0d5682e7d62 Binary files /dev/null and b/tests/queries/0_stateless/data_orc_arrow_parquet_nested/nested_table.arrow differ diff --git a/tests/queries/0_stateless/data_orc_arrow_parquet_nested/nested_table.orc b/tests/queries/0_stateless/data_orc_arrow_parquet_nested/nested_table.orc new file mode 100644 index 00000000000..6fd8ac5477b Binary files /dev/null and b/tests/queries/0_stateless/data_orc_arrow_parquet_nested/nested_table.orc differ diff --git a/tests/queries/0_stateless/data_orc_arrow_parquet_nested/nested_table.parquet b/tests/queries/0_stateless/data_orc_arrow_parquet_nested/nested_table.parquet new file mode 100644 index 00000000000..0bdcc288107 Binary files /dev/null and b/tests/queries/0_stateless/data_orc_arrow_parquet_nested/nested_table.parquet differ diff --git a/tests/queries/0_stateless/data_parquet/alltypes_list.parquet.columns b/tests/queries/0_stateless/data_parquet/alltypes_list.parquet.columns index b633ca86bbf..794ee47d757 100644 --- a/tests/queries/0_stateless/data_parquet/alltypes_list.parquet.columns +++ b/tests/queries/0_stateless/data_parquet/alltypes_list.parquet.columns @@ -1 +1 @@ -`a1` Array(Int8), `a2` Array(UInt8), `a3` Array(Int16), `a4` Array(UInt16), `a5` Array(Int32), `a6` Array(UInt32), `a7` Array(Int64), `a8` Array(UInt64), `a9` Array(String), `a10` Array(FixedString(4)), `a11` Array(Float32), `a12` Array(Float64), `a13` Array(Date), `a14` Array(Datetime), `a15` Array(Decimal(4, 2)), `a16` Array(Decimal(10, 2)), `a17` Array(Decimal(25, 2)) +`a1` Array(Int8), `a2` Array(UInt8), `a3` Array(Int16), `a4` Array(UInt16), `a5` Array(Int32), `a6` Array(UInt32), `a7` Array(Int64), `a8` Array(UInt64), `a9` Array(String), `a10` Array(FixedString(4)), `a11` Array(Float32), `a12` Array(Float64), `a13` Array(Date), `a14` Array(Datetime('Europe/Moscow')), `a15` Array(Decimal(4, 2)), `a16` Array(Decimal(10, 2)), `a17` Array(Decimal(25, 2)) diff --git a/tests/queries/0_stateless/data_parquet/datatype-date32.parquet b/tests/queries/0_stateless/data_parquet/datatype-date32.parquet new file mode 100644 index 00000000000..e9ba92a6948 Binary files /dev/null and b/tests/queries/0_stateless/data_parquet/datatype-date32.parquet differ diff --git a/tests/queries/0_stateless/data_parquet/datatype-date32.parquet.columns b/tests/queries/0_stateless/data_parquet/datatype-date32.parquet.columns new file mode 100644 index 00000000000..202a8a7087b --- /dev/null +++ b/tests/queries/0_stateless/data_parquet/datatype-date32.parquet.columns @@ -0,0 +1 @@ +`date32` Date32 \ No newline at end of file diff --git a/tests/queries/0_stateless/data_parquet/nonnullable.impala.parquet.columns b/tests/queries/0_stateless/data_parquet/nonnullable.impala.parquet.columns index 299ec3b6af2..3eafbc1bb02 100644 --- a/tests/queries/0_stateless/data_parquet/nonnullable.impala.parquet.columns +++ b/tests/queries/0_stateless/data_parquet/nonnullable.impala.parquet.columns @@ -1 +1 @@ -`ID` Nullable(Int64), `Int_Array` Array(Nullable(Int32)), `int_array_array` Array(Array(Nullable(Int32))), `Int_Map` Map(String, Nullable(Int32)), `int_map_array` Array(Map(String, Nullable(Int32))), `nested_Struct` Tuple(Nullable(Int32), Array(Nullable(Int32)), Tuple(Array(Array(Tuple(Nullable(Int32))))), Map(String, Tuple(Tuple(Array(Nullable(Float64)))))) +`ID` Nullable(Int64), `Int_Array` Array(Nullable(Int32)), `int_array_array` Array(Array(Nullable(Int32))), `Int_Map` Map(String, Nullable(Int32)), `int_map_array` Array(Map(String, Nullable(Int32))), `nested_Struct` Tuple(Nullable(Int32), Array(Nullable(Int32)), Tuple(Array(Array(Tuple(Nullable(Int32), Nullable(String))))), Map(String, Tuple(Tuple(Array(Nullable(Float64)))))) diff --git a/tests/queries/0_stateless/data_parquet/nullable.impala.parquet.columns b/tests/queries/0_stateless/data_parquet/nullable.impala.parquet.columns index 6fcbcdd4a0b..f8e51d8b43a 100644 --- a/tests/queries/0_stateless/data_parquet/nullable.impala.parquet.columns +++ b/tests/queries/0_stateless/data_parquet/nullable.impala.parquet.columns @@ -1 +1 @@ -`id` Nullable(Int64), `int_array` Array(Nullable(Int32)), `int_array_Array` Array(Array(Nullable(Int32))), `int_map` Map(String, Nullable(Int32)), `int_Map_Array` Array(Map(String, Nullable(Int32))), `nested_struct` Tuple(Nullable(Int32), Array(Nullable(Int32)), Tuple(Array(Array(Tuple(Nullable(Int32))))), Map(String, Tuple(Tuple(Array(Nullable(Float64)))))) +`id` Nullable(Int64), `int_array` Array(Nullable(Int32)), `int_array_Array` Array(Array(Nullable(Int32))), `int_map` Map(String, Nullable(Int32)), `int_Map_Array` Array(Map(String, Nullable(Int32))), `nested_struct` Tuple(Nullable(Int32), Array(Nullable(Int32)), Tuple(Array(Array(Tuple(Nullable(Int32), Nullable(String))))), Map(String, Tuple(Tuple(Array(Nullable(Float64)))))) diff --git a/tests/queries/0_stateless/data_parquet/v0.7.1.column-metadata-handling.parquet.columns b/tests/queries/0_stateless/data_parquet/v0.7.1.column-metadata-handling.parquet.columns index 3d08da2522c..df35127ede8 100644 --- a/tests/queries/0_stateless/data_parquet/v0.7.1.column-metadata-handling.parquet.columns +++ b/tests/queries/0_stateless/data_parquet/v0.7.1.column-metadata-handling.parquet.columns @@ -1 +1 @@ -`a` Nullable(Int64), `b` Nullable(Float64), `c` Nullable(DateTime), `index` Nullable(String), `__index_level_1__` Nullable(DateTime) +`a` Nullable(Int64), `b` Nullable(Float64), `c` Nullable(DateTime('Europe/Moscow')), `index` Nullable(String), `__index_level_1__` Nullable(DateTime('Europe/Moscow')) diff --git a/tests/queries/0_stateless/data_zstd/test_01946.zstd b/tests/queries/0_stateless/data_zstd/test_01946.zstd new file mode 100644 index 00000000000..c021b112dad Binary files /dev/null and b/tests/queries/0_stateless/data_zstd/test_01946.zstd differ diff --git a/tests/queries/0_stateless/helpers/00900_parquet_create_table_columns.py b/tests/queries/0_stateless/helpers/00900_parquet_create_table_columns.py index 1a41da8c8b4..92606c9cb26 100755 --- a/tests/queries/0_stateless/helpers/00900_parquet_create_table_columns.py +++ b/tests/queries/0_stateless/helpers/00900_parquet_create_table_columns.py @@ -4,8 +4,8 @@ import json import sys TYPE_PARQUET_CONVERTED_TO_CLICKHOUSE = { - "TIMESTAMP_MICROS": "DateTime", - "TIMESTAMP_MILLIS": "DateTime", + "TIMESTAMP_MICROS": "DateTime('Europe/Moscow')", + "TIMESTAMP_MILLIS": "DateTime('Europe/Moscow')", "UTF8": "String", } diff --git a/tests/queries/0_stateless/test_abxi8n/parquet_decimal0.parquet b/tests/queries/0_stateless/test_abxi8n/parquet_decimal0.parquet new file mode 100644 index 00000000000..cfa6cc2e0b6 Binary files /dev/null and b/tests/queries/0_stateless/test_abxi8n/parquet_decimal0.parquet differ diff --git a/tests/queries/0_stateless/test_abxi8n/parquet_decimal1.parquet b/tests/queries/0_stateless/test_abxi8n/parquet_decimal1.parquet new file mode 100644 index 00000000000..19d5e387f8d Binary files /dev/null and b/tests/queries/0_stateless/test_abxi8n/parquet_decimal1.parquet differ diff --git a/tests/queries/0_stateless/test_abxi8n/parquet_decimal2.parquet b/tests/queries/0_stateless/test_abxi8n/parquet_decimal2.parquet new file mode 100644 index 00000000000..c722f9701c8 Binary files /dev/null and b/tests/queries/0_stateless/test_abxi8n/parquet_decimal2.parquet differ diff --git a/tests/queries/0_stateless/test_abxi8n/parquet_decimal3_1.parquet b/tests/queries/0_stateless/test_abxi8n/parquet_decimal3_1.parquet new file mode 100644 index 00000000000..39acd4a8c14 Binary files /dev/null and b/tests/queries/0_stateless/test_abxi8n/parquet_decimal3_1.parquet differ diff --git a/tests/queries/0_stateless/test_abxi8n/parquet_decimal3_2.parquet b/tests/queries/0_stateless/test_abxi8n/parquet_decimal3_2.parquet new file mode 100644 index 00000000000..0de83a7eeb6 Binary files /dev/null and b/tests/queries/0_stateless/test_abxi8n/parquet_decimal3_2.parquet differ diff --git a/tests/queries/0_stateless/test_abxi8n/parquet_decimal3_3.parquet b/tests/queries/0_stateless/test_abxi8n/parquet_decimal3_3.parquet new file mode 100644 index 00000000000..ad2e746c4fd Binary files /dev/null and b/tests/queries/0_stateless/test_abxi8n/parquet_decimal3_3.parquet differ diff --git a/tests/queries/0_stateless/test_dozlem/arrays.arrow b/tests/queries/0_stateless/test_dozlem/arrays.arrow new file mode 100644 index 00000000000..9ab37ff5890 Binary files /dev/null and b/tests/queries/0_stateless/test_dozlem/arrays.arrow differ diff --git a/tests/queries/0_stateless/test_dozlem/arrow_all_types_1.arrow b/tests/queries/0_stateless/test_dozlem/arrow_all_types_1.arrow new file mode 100644 index 00000000000..e52e997d12f Binary files /dev/null and b/tests/queries/0_stateless/test_dozlem/arrow_all_types_1.arrow differ diff --git a/tests/queries/0_stateless/test_dozlem/arrow_all_types_2.arrow b/tests/queries/0_stateless/test_dozlem/arrow_all_types_2.arrow new file mode 100644 index 00000000000..04e1214ef84 Binary files /dev/null and b/tests/queries/0_stateless/test_dozlem/arrow_all_types_2.arrow differ diff --git a/tests/queries/0_stateless/test_dozlem/arrow_all_types_5.arrow b/tests/queries/0_stateless/test_dozlem/arrow_all_types_5.arrow new file mode 100644 index 00000000000..29de25ee984 Binary files /dev/null and b/tests/queries/0_stateless/test_dozlem/arrow_all_types_5.arrow differ diff --git a/tests/queries/0_stateless/test_dozlem/dicts.arrow b/tests/queries/0_stateless/test_dozlem/dicts.arrow new file mode 100644 index 00000000000..c2af6dfedee Binary files /dev/null and b/tests/queries/0_stateless/test_dozlem/dicts.arrow differ diff --git a/tests/queries/0_stateless/test_dozlem/nullable_arrays.arrow b/tests/queries/0_stateless/test_dozlem/nullable_arrays.arrow new file mode 100644 index 00000000000..2e497d358c6 Binary files /dev/null and b/tests/queries/0_stateless/test_dozlem/nullable_arrays.arrow differ diff --git a/tests/queries/1_stateful/00011_sorting.sql b/tests/queries/1_stateful/00011_sorting.sql index 8c6ae457566..381be7b7dd4 100644 --- a/tests/queries/1_stateful/00011_sorting.sql +++ b/tests/queries/1_stateful/00011_sorting.sql @@ -1 +1 @@ -SELECT EventTime FROM test.hits ORDER BY EventTime DESC LIMIT 10 +SELECT EventTime::DateTime('Europe/Moscow') FROM test.hits ORDER BY EventTime DESC LIMIT 10 diff --git a/tests/queries/1_stateful/00012_sorting_distributed.sql b/tests/queries/1_stateful/00012_sorting_distributed.sql index 51f249b3db8..b0cdb8bd8a2 100644 --- a/tests/queries/1_stateful/00012_sorting_distributed.sql +++ b/tests/queries/1_stateful/00012_sorting_distributed.sql @@ -1 +1 @@ -SELECT EventTime FROM remote('127.0.0.{1,2}', test, hits) ORDER BY EventTime DESC LIMIT 10 +SELECT EventTime::DateTime('Europe/Moscow') FROM remote('127.0.0.{1,2}', test, hits) ORDER BY EventTime DESC LIMIT 10 diff --git a/tests/queries/1_stateful/00066_sorting_distributed_many_replicas.sql b/tests/queries/1_stateful/00066_sorting_distributed_many_replicas.sql index d0636133186..4bc563712c0 100644 --- a/tests/queries/1_stateful/00066_sorting_distributed_many_replicas.sql +++ b/tests/queries/1_stateful/00066_sorting_distributed_many_replicas.sql @@ -1,2 +1,2 @@ SET max_parallel_replicas = 2; -SELECT EventTime FROM remote('127.0.0.{1|2}', test, hits) ORDER BY EventTime DESC LIMIT 10 +SELECT EventTime::DateTime('Europe/Moscow') FROM remote('127.0.0.{1|2}', test, hits) ORDER BY EventTime DESC LIMIT 10 diff --git a/tests/queries/1_stateful/00071_merge_tree_optimize_aio.sql b/tests/queries/1_stateful/00071_merge_tree_optimize_aio.sql index 1891cd63555..241f0f9b13b 100644 --- a/tests/queries/1_stateful/00071_merge_tree_optimize_aio.sql +++ b/tests/queries/1_stateful/00071_merge_tree_optimize_aio.sql @@ -1,6 +1,6 @@ DROP TABLE IF EXISTS test.hits_snippet; -CREATE TABLE test.hits_snippet(EventTime DateTime, EventDate Date, CounterID UInt32, UserID UInt64, URL String, Referer String) ENGINE = MergeTree(EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID), EventTime), 8192); +CREATE TABLE test.hits_snippet(EventTime DateTime('Europe/Moscow'), EventDate Date, CounterID UInt32, UserID UInt64, URL String, Referer String) ENGINE = MergeTree(EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID), EventTime), 8192); SET min_insert_block_size_rows = 0, min_insert_block_size_bytes = 0; SET max_block_size = 4096; diff --git a/tests/queries/1_stateful/00072_compare_date_and_string_index.sql b/tests/queries/1_stateful/00072_compare_date_and_string_index.sql index 90f1c875acd..af5d932fecb 100644 --- a/tests/queries/1_stateful/00072_compare_date_and_string_index.sql +++ b/tests/queries/1_stateful/00072_compare_date_and_string_index.sql @@ -15,7 +15,7 @@ SELECT count() FROM test.hits WHERE EventDate IN (toDate('2014-03-18'), toDate(' SELECT count() FROM test.hits WHERE EventDate = concat('2014-0', '3-18'); DROP TABLE IF EXISTS test.hits_indexed_by_time; -CREATE TABLE test.hits_indexed_by_time (EventDate Date, EventTime DateTime) ENGINE = MergeTree(EventDate, EventTime, 8192); +CREATE TABLE test.hits_indexed_by_time (EventDate Date, EventTime DateTime('Europe/Moscow')) ENGINE = MergeTree ORDER BY (EventDate, EventTime); INSERT INTO test.hits_indexed_by_time SELECT EventDate, EventTime FROM test.hits; SELECT count() FROM test.hits_indexed_by_time WHERE EventTime = '2014-03-18 01:02:03'; @@ -25,12 +25,12 @@ SELECT count() FROM test.hits_indexed_by_time WHERE EventTime <= '2014-03-18 01: SELECT count() FROM test.hits_indexed_by_time WHERE EventTime >= '2014-03-18 01:02:03'; SELECT count() FROM test.hits_indexed_by_time WHERE EventTime IN ('2014-03-18 01:02:03', '2014-03-19 04:05:06'); -SELECT count() FROM test.hits_indexed_by_time WHERE EventTime = toDateTime('2014-03-18 01:02:03'); -SELECT count() FROM test.hits_indexed_by_time WHERE EventTime < toDateTime('2014-03-18 01:02:03'); -SELECT count() FROM test.hits_indexed_by_time WHERE EventTime > toDateTime('2014-03-18 01:02:03'); -SELECT count() FROM test.hits_indexed_by_time WHERE EventTime <= toDateTime('2014-03-18 01:02:03'); -SELECT count() FROM test.hits_indexed_by_time WHERE EventTime >= toDateTime('2014-03-18 01:02:03'); -SELECT count() FROM test.hits_indexed_by_time WHERE EventTime IN (toDateTime('2014-03-18 01:02:03'), toDateTime('2014-03-19 04:05:06')); +SELECT count() FROM test.hits_indexed_by_time WHERE EventTime = toDateTime('2014-03-18 01:02:03', 'Europe/Moscow'); +SELECT count() FROM test.hits_indexed_by_time WHERE EventTime < toDateTime('2014-03-18 01:02:03', 'Europe/Moscow'); +SELECT count() FROM test.hits_indexed_by_time WHERE EventTime > toDateTime('2014-03-18 01:02:03', 'Europe/Moscow'); +SELECT count() FROM test.hits_indexed_by_time WHERE EventTime <= toDateTime('2014-03-18 01:02:03', 'Europe/Moscow'); +SELECT count() FROM test.hits_indexed_by_time WHERE EventTime >= toDateTime('2014-03-18 01:02:03', 'Europe/Moscow'); +SELECT count() FROM test.hits_indexed_by_time WHERE EventTime IN (toDateTime('2014-03-18 01:02:03', 'Europe/Moscow'), toDateTime('2014-03-19 04:05:06', 'Europe/Moscow')); SELECT count() FROM test.hits_indexed_by_time WHERE EventTime = concat('2014-03-18 ', '01:02:03'); diff --git a/tests/queries/1_stateful/00075_left_array_join.sql b/tests/queries/1_stateful/00075_left_array_join.sql index 424276cf036..52a48462b9d 100644 --- a/tests/queries/1_stateful/00075_left_array_join.sql +++ b/tests/queries/1_stateful/00075_left_array_join.sql @@ -1,2 +1,2 @@ -SELECT UserID, EventTime, pp.Key1, pp.Key2, ParsedParams.Key1 FROM test.hits ARRAY JOIN ParsedParams AS pp WHERE CounterID = 1704509 ORDER BY UserID, EventTime, pp.Key1, pp.Key2 LIMIT 100; -SELECT UserID, EventTime, pp.Key1, pp.Key2, ParsedParams.Key1 FROM test.hits LEFT ARRAY JOIN ParsedParams AS pp WHERE CounterID = 1704509 ORDER BY UserID, EventTime, pp.Key1, pp.Key2 LIMIT 100; +SELECT UserID, EventTime::DateTime('Europe/Moscow'), pp.Key1, pp.Key2, ParsedParams.Key1 FROM test.hits ARRAY JOIN ParsedParams AS pp WHERE CounterID = 1704509 ORDER BY UserID, EventTime, pp.Key1, pp.Key2 LIMIT 100; +SELECT UserID, EventTime::DateTime('Europe/Moscow'), pp.Key1, pp.Key2, ParsedParams.Key1 FROM test.hits LEFT ARRAY JOIN ParsedParams AS pp WHERE CounterID = 1704509 ORDER BY UserID, EventTime, pp.Key1, pp.Key2 LIMIT 100; diff --git a/tests/queries/1_stateful/00091_prewhere_two_conditions.sql b/tests/queries/1_stateful/00091_prewhere_two_conditions.sql index 201ff788006..c5952be83b6 100644 --- a/tests/queries/1_stateful/00091_prewhere_two_conditions.sql +++ b/tests/queries/1_stateful/00091_prewhere_two_conditions.sql @@ -2,12 +2,12 @@ SET max_bytes_to_read = 600000000; SET optimize_move_to_prewhere = 1; -SELECT uniq(URL) FROM test.hits WHERE EventTime >= '2014-03-20 00:00:00' AND EventTime < '2014-03-21 00:00:00'; -SELECT uniq(URL) FROM test.hits WHERE EventTime >= '2014-03-20 00:00:00' AND URL != '' AND EventTime < '2014-03-21 00:00:00'; -SELECT uniq(*) FROM test.hits WHERE EventTime >= '2014-03-20 00:00:00' AND EventTime < '2014-03-21 00:00:00' AND EventDate = '2014-03-21'; -WITH EventTime AS xyz SELECT uniq(*) FROM test.hits WHERE xyz >= '2014-03-20 00:00:00' AND xyz < '2014-03-21 00:00:00' AND EventDate = '2014-03-21'; +SELECT uniq(URL) FROM test.hits WHERE toTimeZone(EventTime, 'Europe/Moscow') >= '2014-03-20 00:00:00' AND toTimeZone(EventTime, 'Europe/Moscow') < '2014-03-21 00:00:00'; +SELECT uniq(URL) FROM test.hits WHERE toTimeZone(EventTime, 'Europe/Moscow') >= '2014-03-20 00:00:00' AND URL != '' AND toTimeZone(EventTime, 'Europe/Moscow') < '2014-03-21 00:00:00'; +SELECT uniq(*) FROM test.hits WHERE toTimeZone(EventTime, 'Europe/Moscow') >= '2014-03-20 00:00:00' AND toTimeZone(EventTime, 'Europe/Moscow') < '2014-03-21 00:00:00' AND EventDate = '2014-03-21'; +WITH toTimeZone(EventTime, 'Europe/Moscow') AS xyz SELECT uniq(*) FROM test.hits WHERE xyz >= '2014-03-20 00:00:00' AND xyz < '2014-03-21 00:00:00' AND EventDate = '2014-03-21'; SET optimize_move_to_prewhere = 0; -SELECT uniq(URL) FROM test.hits WHERE EventTime >= '2014-03-20 00:00:00' AND EventTime < '2014-03-21 00:00:00'; -- { serverError 307 } -SELECT uniq(URL) FROM test.hits WHERE EventTime >= '2014-03-20 00:00:00' AND URL != '' AND EventTime < '2014-03-21 00:00:00'; -- { serverError 307 } +SELECT uniq(URL) FROM test.hits WHERE toTimeZone(EventTime, 'Europe/Moscow') >= '2014-03-20 00:00:00' AND toTimeZone(EventTime, 'Europe/Moscow') < '2014-03-21 00:00:00'; -- { serverError 307 } +SELECT uniq(URL) FROM test.hits WHERE toTimeZone(EventTime, 'Europe/Moscow') >= '2014-03-20 00:00:00' AND URL != '' AND toTimeZone(EventTime, 'Europe/Moscow') < '2014-03-21 00:00:00'; -- { serverError 307 } diff --git a/tests/queries/1_stateful/00159_parallel_formatting_csv_and_friends.sh b/tests/queries/1_stateful/00159_parallel_formatting_csv_and_friends.sh index dc14928afa6..a6b5620812d 100755 --- a/tests/queries/1_stateful/00159_parallel_formatting_csv_and_friends.sh +++ b/tests/queries/1_stateful/00159_parallel_formatting_csv_and_friends.sh @@ -10,10 +10,10 @@ for format in "${FORMATS[@]}" do echo "$format, false"; $CLICKHOUSE_CLIENT --output_format_parallel_formatting=false -q \ - "SELECT ClientEventTime as a, MobilePhoneModel as b, ClientIP6 as c FROM test.hits ORDER BY a, b, c Format $format" | md5sum + "SELECT ClientEventTime::DateTime('Europe/Moscow') as a, MobilePhoneModel as b, ClientIP6 as c FROM test.hits ORDER BY a, b, c Format $format" | md5sum echo "$format, true"; $CLICKHOUSE_CLIENT --output_format_parallel_formatting=true -q \ - "SELECT ClientEventTime as a, MobilePhoneModel as b, ClientIP6 as c FROM test.hits ORDER BY a, b, c Format $format" | md5sum + "SELECT ClientEventTime::DateTime('Europe/Moscow') as a, MobilePhoneModel as b, ClientIP6 as c FROM test.hits ORDER BY a, b, c Format $format" | md5sum done diff --git a/tests/queries/1_stateful/00159_parallel_formatting_http.sh b/tests/queries/1_stateful/00159_parallel_formatting_http.sh index a4e68de6a3f..1dcae50812e 100755 --- a/tests/queries/1_stateful/00159_parallel_formatting_http.sh +++ b/tests/queries/1_stateful/00159_parallel_formatting_http.sh @@ -10,8 +10,8 @@ FORMATS=('TSV' 'CSV' 'JSONCompactEachRow') for format in "${FORMATS[@]}" do echo "$format, false"; - ${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&query=SELECT+ClientEventTime+as+a,MobilePhoneModel+as+b,ClientIP6+as+c+FROM+test.hits+ORDER+BY+a,b,c+LIMIT+1000000+Format+$format&output_format_parallel_formatting=false" -d' ' | md5sum + ${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&query=SELECT+ClientEventTime::DateTime('Europe/Moscow')+as+a,MobilePhoneModel+as+b,ClientIP6+as+c+FROM+test.hits+ORDER+BY+a,b,c+LIMIT+1000000+Format+$format&output_format_parallel_formatting=false" -d' ' | md5sum echo "$format, true"; - ${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&query=SELECT+ClientEventTime+as+a,MobilePhoneModel+as+b,ClientIP6+as+c+FROM+test.hits+ORDER+BY+a,b,c+LIMIT+1000000+Format+$format&output_format_parallel_formatting=true" -d' ' | md5sum + ${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&query=SELECT+ClientEventTime::DateTime('Europe/Moscow')+as+a,MobilePhoneModel+as+b,ClientIP6+as+c+FROM+test.hits+ORDER+BY+a,b,c+LIMIT+1000000+Format+$format&output_format_parallel_formatting=true" -d' ' | md5sum done diff --git a/tests/queries/1_stateful/00159_parallel_formatting_json_and_friends.reference b/tests/queries/1_stateful/00159_parallel_formatting_json_and_friends.reference index 96353f350ec..6d663c33057 100644 --- a/tests/queries/1_stateful/00159_parallel_formatting_json_and_friends.reference +++ b/tests/queries/1_stateful/00159_parallel_formatting_json_and_friends.reference @@ -7,6 +7,6 @@ ba1081a754a06ef6563840b2d8d4d327 - JSONCompactEachRow, true ba1081a754a06ef6563840b2d8d4d327 - JSONCompactStringsEachRowWithNamesAndTypes, false -902e53f621d5336aa7f702a5d6b64b42 - +31ded3cd9971b124450fb5a44a8bce63 - JSONCompactStringsEachRowWithNamesAndTypes, true -902e53f621d5336aa7f702a5d6b64b42 - +31ded3cd9971b124450fb5a44a8bce63 - diff --git a/tests/queries/1_stateful/00159_parallel_formatting_json_and_friends.sh b/tests/queries/1_stateful/00159_parallel_formatting_json_and_friends.sh index e02515d5c16..9f61b454d56 100755 --- a/tests/queries/1_stateful/00159_parallel_formatting_json_and_friends.sh +++ b/tests/queries/1_stateful/00159_parallel_formatting_json_and_friends.sh @@ -11,9 +11,9 @@ for format in "${FORMATS[@]}" do echo "$format, false"; $CLICKHOUSE_CLIENT --output_format_parallel_formatting=false -q \ - "SELECT ClientEventTime as a, MobilePhoneModel as b, ClientIP6 as c FROM test.hits ORDER BY a, b, c Format $format" | md5sum + "SELECT ClientEventTime::DateTime('Europe/Moscow') as a, MobilePhoneModel as b, ClientIP6 as c FROM test.hits ORDER BY a, b, c Format $format" | md5sum echo "$format, true"; $CLICKHOUSE_CLIENT --output_format_parallel_formatting=true -q \ - "SELECT ClientEventTime as a, MobilePhoneModel as b, ClientIP6 as c FROM test.hits ORDER BY a, b, c Format $format" | md5sum + "SELECT ClientEventTime::DateTime('Europe/Moscow') as a, MobilePhoneModel as b, ClientIP6 as c FROM test.hits ORDER BY a, b, c Format $format" | md5sum done diff --git a/tests/queries/1_stateful/00159_parallel_formatting_tsv_and_friends.sh b/tests/queries/1_stateful/00159_parallel_formatting_tsv_and_friends.sh index a81dfdc33b4..02d083c0498 100755 --- a/tests/queries/1_stateful/00159_parallel_formatting_tsv_and_friends.sh +++ b/tests/queries/1_stateful/00159_parallel_formatting_tsv_and_friends.sh @@ -11,9 +11,9 @@ for format in "${FORMATS[@]}" do echo "$format, false"; $CLICKHOUSE_CLIENT --output_format_parallel_formatting=false -q \ - "SELECT ClientEventTime as a, MobilePhoneModel as b, ClientIP6 as c FROM test.hits ORDER BY a, b, c Format $format" | md5sum + "SELECT ClientEventTime::DateTime('Europe/Moscow') as a, MobilePhoneModel as b, ClientIP6 as c FROM test.hits ORDER BY a, b, c Format $format" | md5sum echo "$format, true"; $CLICKHOUSE_CLIENT --output_format_parallel_formatting=true -q \ - "SELECT ClientEventTime as a, MobilePhoneModel as b, ClientIP6 as c FROM test.hits ORDER BY a, b, c Format $format" | md5sum + "SELECT ClientEventTime::DateTime('Europe/Moscow') as a, MobilePhoneModel as b, ClientIP6 as c FROM test.hits ORDER BY a, b, c Format $format" | md5sum done diff --git a/tests/queries/1_stateful/00161_parallel_parsing_with_names.sh b/tests/queries/1_stateful/00161_parallel_parsing_with_names.sh index ca9984900e1..777d95fa0af 100755 --- a/tests/queries/1_stateful/00161_parallel_parsing_with_names.sh +++ b/tests/queries/1_stateful/00161_parallel_parsing_with_names.sh @@ -10,23 +10,23 @@ $CLICKHOUSE_CLIENT -q "DROP TABLE IF EXISTS parsing_with_names" for format in "${FORMATS[@]}" do # Columns are permuted - $CLICKHOUSE_CLIENT -q "CREATE TABLE parsing_with_names(c FixedString(16), a DateTime, b String) ENGINE=Memory()" - + $CLICKHOUSE_CLIENT -q "CREATE TABLE parsing_with_names(c FixedString(16), a DateTime('Europe/Moscow'), b String) ENGINE=Memory()" + echo "$format, false"; $CLICKHOUSE_CLIENT --output_format_parallel_formatting=false -q \ - "SELECT URLRegions as d, ClientEventTime as a, MobilePhoneModel as b, ParamPrice as e, ClientIP6 as c FROM test.hits LIMIT 50000 Format $format" | \ + "SELECT URLRegions as d, toTimeZone(ClientEventTime, 'Europe/Moscow') as a, MobilePhoneModel as b, ParamPrice as e, ClientIP6 as c FROM test.hits LIMIT 50000 Format $format" | \ $CLICKHOUSE_CLIENT --input_format_skip_unknown_fields=1 --input_format_parallel_parsing=false -q "INSERT INTO parsing_with_names FORMAT $format" $CLICKHOUSE_CLIENT -q "SELECT * FROM parsing_with_names;" | md5sum $CLICKHOUSE_CLIENT -q "DROP TABLE IF EXISTS parsing_with_names" - - $CLICKHOUSE_CLIENT -q "CREATE TABLE parsing_with_names(c FixedString(16), a DateTime, b String) ENGINE=Memory()" + + $CLICKHOUSE_CLIENT -q "CREATE TABLE parsing_with_names(c FixedString(16), a DateTime('Europe/Moscow'), b String) ENGINE=Memory()" echo "$format, true"; $CLICKHOUSE_CLIENT --output_format_parallel_formatting=false -q \ - "SELECT URLRegions as d, ClientEventTime as a, MobilePhoneModel as b, ParamPrice as e, ClientIP6 as c FROM test.hits LIMIT 50000 Format $format" | \ + "SELECT URLRegions as d, toTimeZone(ClientEventTime, 'Europe/Moscow') as a, MobilePhoneModel as b, ParamPrice as e, ClientIP6 as c FROM test.hits LIMIT 50000 Format $format" | \ $CLICKHOUSE_CLIENT --input_format_skip_unknown_fields=1 --input_format_parallel_parsing=true -q "INSERT INTO parsing_with_names FORMAT $format" $CLICKHOUSE_CLIENT -q "SELECT * FROM parsing_with_names;" | md5sum $CLICKHOUSE_CLIENT -q "DROP TABLE IF EXISTS parsing_with_names" -done \ No newline at end of file +done diff --git a/tests/queries/1_stateful/00163_column_oriented_formats.sh b/tests/queries/1_stateful/00163_column_oriented_formats.sh index 1363ccf3c00..50ad20cbe92 100755 --- a/tests/queries/1_stateful/00163_column_oriented_formats.sh +++ b/tests/queries/1_stateful/00163_column_oriented_formats.sh @@ -11,7 +11,7 @@ for format in "${FORMATS[@]}" do echo $format $CLICKHOUSE_CLIENT -q "DROP TABLE IF EXISTS 00163_column_oriented SYNC" - $CLICKHOUSE_CLIENT -q "CREATE TABLE 00163_column_oriented(ClientEventTime DateTime, MobilePhoneModel String, ClientIP6 FixedString(16)) ENGINE=File($format)" + $CLICKHOUSE_CLIENT -q "CREATE TABLE 00163_column_oriented(ClientEventTime DateTime('Europe/Moscow'), MobilePhoneModel String, ClientIP6 FixedString(16)) ENGINE=File($format)" $CLICKHOUSE_CLIENT -q "INSERT INTO 00163_column_oriented SELECT ClientEventTime, MobilePhoneModel, ClientIP6 FROM test.hits ORDER BY ClientEventTime, MobilePhoneModel, ClientIP6 LIMIT 100" $CLICKHOUSE_CLIENT -q "SELECT ClientEventTime from 00163_column_oriented" | md5sum $CLICKHOUSE_CLIENT -q "SELECT MobilePhoneModel from 00163_column_oriented" | md5sum diff --git a/tests/queries/1_stateful/00165_jit_aggregate_functions.reference b/tests/queries/1_stateful/00165_jit_aggregate_functions.reference index 2d94ad190ca..fa084170f53 100644 --- a/tests/queries/1_stateful/00165_jit_aggregate_functions.reference +++ b/tests/queries/1_stateful/00165_jit_aggregate_functions.reference @@ -1,128 +1,140 @@ Aggregation using JIT compilation Simple functions -1704509 4611700827100483880 9223360787015464643 10441337359398154812 19954243669348.844 9648741.579254271 523264 -732797 4611701940806302259 9223355550934604746 977192643464016658 2054229034942.3723 51998323.94457991 475698 -598875 4611701407242345792 9223362250391155632 9312163881623734456 27615161624211.875 12261797.824844675 337212 -792887 4611699550286611812 9223290551912005343 6930300520201292824 27479710385933.586 53095331.60360441 252197 -3807842 4611710821592843606 9223326163906184987 16710274896338005145 85240848090850.69 22373416.533275086 196036 -25703952 4611709443519524003 9223353913449113943 9946868158853570839 67568783303242.086 3154349.826950714 147211 -716829 4611852156092872082 9223361623076951140 15381015774917924786 170693446547158.72 201431892.4773785 90109 -59183 4611730685242027332 9223354909338698162 8078812522502896568 94622946187035.42 1425270865.0901496 85379 -33010362 4611704682869732882 9223268545373999677 2064452191838585926 26532987929602.555 3695122.4062526934 77807 -800784 4611752907938305166 9223340418389788041 18082918611792817587 233352070043266.62 36535786.81446395 77492 -20810645 4611712185532639162 9223218900001937412 4996531385439292694 68246505203164.63 6316535.831023813 73213 -25843850 4611690025407720929 9223346023778617822 12755881190906812868 185015319325648.16 9962165.34831339 68945 -23447120 4611796031755620254 9223329309291309758 17231649548755339966 255019232629204.38 7937191.271698021 67570 -14739804 4611692230555590277 9223313509005166531 2458378896777063244 38308020331864.36 14590240.469105456 64174 -32077710 4611884228437061959 9223352444952988904 12965822147651192908 214467085941034.7 7257521.096258734 60456 -22446879 4611846229717089436 9223124373140579096 13530160492087688838 231724477077663.4 4737362.521046629 58389 -170282 4611833225706935900 9223371583739401906 8076893424988479310 141657635880324.8 1613795518.1065989 57017 -11482817 4611708000353743073 9223337838355779113 14841435427430843458 283531099960470.8 9938452.835998287 52345 -63469 4611695097019173921 9223353530156141191 6296784708578574520 120762239817777.88 579655378.4603049 52142 -29103473 4611744585914335132 9223333530281362537 5908285283932344933 123712996438970.34 867841.595541967 47758 +1704509 4611700827100483880 9223360787015464643 10441337359398154812 19954243669348.844 9648741.579254271 523264 9223372036854775807 4611686018427387904 4544239379628300646 +732797 4611701940806302259 9223355550934604746 977192643464016658 2054229034942.3723 51998323.94457991 475698 9223372036854775807 4611686018427387904 4091184823334377716 +598875 4611701407242345792 9223362250391155632 9312163881623734456 27615161624211.875 12261797.824844675 337212 9223372036854775807 4611686018427387904 3725992504798702670 +792887 4611699550286611812 9223290551912005343 6930300520201292824 27479710385933.586 53095331.60360441 252197 9223372036854775807 4611686018427387904 6536441508464694614 +3807842 4611710821592843606 9223326163906184987 16710274896338005145 85240848090850.69 22373416.533275086 196036 9223372036854775807 4611686018427387904 1797862753609257231 +25703952 4611709443519524003 9223353913449113943 9946868158853570839 67568783303242.086 3154349.826950714 147211 9223372036854775807 4611686018427387904 8737124378202300429 +716829 4611852156092872082 9223361623076951140 15381015774917924786 170693446547158.72 201431892.4773785 90109 9223372036854775807 4611686018427387904 8209915323001116338 +59183 4611730685242027332 9223354909338698162 8078812522502896568 94622946187035.42 1425270865.0901496 85379 9223372036854775807 4611686018427387904 8909082036598843562 +33010362 4611704682869732882 9223268545373999677 2064452191838585926 26532987929602.555 3695122.4062526934 77807 9223372036854775807 4611686018427387904 5411365383789552292 +800784 4611752907938305166 9223340418389788041 18082918611792817587 233352070043266.62 36535786.81446395 77492 9223372036854775807 4611686018427387904 2059255810151375435 +20810645 4611712185532639162 9223218900001937412 4996531385439292694 68246505203164.63 6316535.831023813 73213 9223372036854775807 4611686018427387904 8852740550386113674 +25843850 4611690025407720929 9223346023778617822 12755881190906812868 185015319325648.16 9962165.34831339 68945 9223372036854775807 4611686018427387904 7849665866595760148 +23447120 4611796031755620254 9223329309291309758 17231649548755339966 255019232629204.38 7937191.271698021 67570 9223372036854775807 4611686018427387904 3435410911925610424 +14739804 4611692230555590277 9223313509005166531 2458378896777063244 38308020331864.36 14590240.469105456 64174 9223372036854775807 4611686018427387904 511910855240035342 +32077710 4611884228437061959 9223352444952988904 12965822147651192908 214467085941034.7 7257521.096258734 60456 9223372036854775807 4611686018427387904 2256071920672551964 +22446879 4611846229717089436 9223124373140579096 13530160492087688838 231724477077663.4 4737362.521046629 58389 9223372036854775807 4611686018427387904 6236276364886386410 +170282 4611833225706935900 9223371583739401906 8076893424988479310 141657635880324.8 1613795518.1065989 57017 9223372036854775807 4611686018427387904 4755775861151848768 +11482817 4611708000353743073 9223337838355779113 14841435427430843458 283531099960470.8 9938452.835998287 52345 9223372036854775807 4611686018427387904 5371586112642152558 +63469 4611695097019173921 9223353530156141191 6296784708578574520 120762239817777.88 579655378.4603049 52142 9223372036854775807 4611686018427387904 4150567963952988110 +29103473 4611744585914335132 9223333530281362537 5908285283932344933 123712996438970.34 867841.595541967 47758 9223372036854775807 4611686018427387904 3238284030821087319 Simple functions with non compilable function -1704509 4611700827100483880 9223360787015464643 10441337359398154812 4611686018427387904 19954243669348.844 9648741.579254271 523264 -732797 4611701940806302259 9223355550934604746 977192643464016658 4611686018427387904 2054229034942.3723 51998323.94457991 475698 -598875 4611701407242345792 9223362250391155632 9312163881623734456 4611686018427387904 27615161624211.875 12261797.824844675 337212 -792887 4611699550286611812 9223290551912005343 6930300520201292824 4611686018427387904 27479710385933.586 53095331.60360441 252197 -3807842 4611710821592843606 9223326163906184987 16710274896338005145 4611686018427387904 85240848090850.69 22373416.533275086 196036 -25703952 4611709443519524003 9223353913449113943 9946868158853570839 4611686018427387904 67568783303242.086 3154349.826950714 147211 -716829 4611852156092872082 9223361623076951140 15381015774917924786 4611686018427387904 170693446547158.72 201431892.4773785 90109 -59183 4611730685242027332 9223354909338698162 8078812522502896568 4611686018427387904 94622946187035.42 1425270865.0901496 85379 -33010362 4611704682869732882 9223268545373999677 2064452191838585926 4611686018427387904 26532987929602.555 3695122.4062526934 77807 -800784 4611752907938305166 9223340418389788041 18082918611792817587 4611686018427387904 233352070043266.62 36535786.81446395 77492 -20810645 4611712185532639162 9223218900001937412 4996531385439292694 4611686018427387904 68246505203164.63 6316535.831023813 73213 -25843850 4611690025407720929 9223346023778617822 12755881190906812868 4611686018427387904 185015319325648.16 9962165.34831339 68945 -23447120 4611796031755620254 9223329309291309758 17231649548755339966 4611686018427387904 255019232629204.38 7937191.271698021 67570 -14739804 4611692230555590277 9223313509005166531 2458378896777063244 4611686018427387904 38308020331864.36 14590240.469105456 64174 -32077710 4611884228437061959 9223352444952988904 12965822147651192908 4611686018427387904 214467085941034.7 7257521.096258734 60456 -22446879 4611846229717089436 9223124373140579096 13530160492087688838 4611686018427387904 231724477077663.4 4737362.521046629 58389 -170282 4611833225706935900 9223371583739401906 8076893424988479310 4611686018427387904 141657635880324.8 1613795518.1065989 57017 -11482817 4611708000353743073 9223337838355779113 14841435427430843458 4611686018427387904 283531099960470.8 9938452.835998287 52345 -63469 4611695097019173921 9223353530156141191 6296784708578574520 4611686018427387904 120762239817777.88 579655378.4603049 52142 -29103473 4611744585914335132 9223333530281362537 5908285283932344933 4611686018427387904 123712996438970.34 867841.595541967 47758 +1704509 4611700827100483880 9223360787015464643 10441337359398154812 3620921835565807284859452 19954243669348.844 9648741.579254271 523264 9223372036854775807 4611686018427387904 4544239379628300646 +732797 4611701940806302259 9223355550934604746 977192643464016658 3289442827160604417733394 2054229034942.3723 51998323.94457991 475698 9223372036854775807 4611686018427387904 4091184823334377716 +598875 4611701407242345792 9223362250391155632 9312163881623734456 2330921446573746856380600 27615161624211.875 12261797.824844675 337212 9223372036854775807 4611686018427387904 3725992504798702670 +792887 4611699550286611812 9223290551912005343 6930300520201292824 1745179600137886041476120 27479710385933.586 53095331.60360441 252197 9223372036854775807 4611686018427387904 6536441508464694614 +3807842 4611710821592843606 9223326163906184987 16710274896338005145 1356295121550317411019929 85240848090850.69 22373416.533275086 196036 9223372036854775807 4611686018427387904 1797862753609257231 +25703952 4611709443519524003 9223353913449113943 9946868158853570839 1018731388338768841564439 67568783303242.086 3154349.826950714 147211 9223372036854775807 4611686018427387904 8737124378202300429 +716829 4611852156092872082 9223361623076951140 15381015774917924786 623810478612337115371442 170693446547158.72 201431892.4773785 90109 9223372036854775807 4611686018427387904 8209915323001116338 +59183 4611730685242027332 9223354909338698162 8078812522502896568 589916507545680254024632 94622946187035.42 1425270865.0901496 85379 9223372036854775807 4611686018427387904 8909082036598843562 +33010362 4611704682869732882 9223268545373999677 2064452191838585926 538517864195994778911814 26532987929602.555 3695122.4062526934 77807 9223372036854775807 4611686018427387904 5411365383789552292 +800784 4611752907938305166 9223340418389788041 18082918611792817587 535545510122473785781683 233352070043266.62 36535786.81446395 77492 9223372036854775807 4611686018427387904 2059255810151375435 +20810645 4611712185532639162 9223218900001937412 4996531385439292694 506405014842860050255126 68246505203164.63 6316535.831023813 73213 9223372036854775807 4611686018427387904 8852740550386113674 +25843850 4611690025407720929 9223346023778617822 12755881190906812868 476547495537329753708996 185015319325648.16 9962165.34831339 68945 9223372036854775807 4611686018427387904 7849665866595760148 +23447120 4611796031755620254 9223329309291309758 17231649548755339966 467236365548464278670014 255019232629204.38 7937191.271698021 67570 9223372036854775807 4611686018427387904 3435410911925610424 +14739804 4611692230555590277 9223313509005166531 2458378896777063244 444126268697527941770060 38308020331864.36 14590240.469105456 64174 9223372036854775807 4611686018427387904 511910855240035342 +32077710 4611884228437061959 9223352444952988904 12965822147651192908 417407443977973675608140 214467085941034.7 7257521.096258734 60456 9223372036854775807 4611686018427387904 2256071920672551964 +22446879 4611846229717089436 9223124373140579096 13530160492087688838 403462269796593691082374 231724477077663.4 4737362.521046629 58389 9223372036854775807 4611686018427387904 6236276364886386410 +170282 4611833225706935900 9223371583739401906 8076893424988479310 394417911933408911581006 141657635880324.8 1613795518.1065989 57017 9223372036854775807 4611686018427387904 4755775861151848768 +11482817 4611708000353743073 9223337838355779113 14841435427430843458 361995300393829962204226 283531099960470.8 9938452.835998287 52345 9223372036854775807 4611686018427387904 5371586112642152558 +63469 4611695097019173921 9223353530156141191 6296784708578574520 360843057610541117735096 120762239817777.88 579655378.4603049 52142 9223372036854775807 4611686018427387904 4150567963952988110 +29103473 4611744585914335132 9223333530281362537 5908285283932344933 330534668598011678200421 123712996438970.34 867841.595541967 47758 9223372036854775807 4611686018427387904 3238284030821087319 Simple functions if combinator -1704509 4611700827100483880 9223310246721229500 16398241567152875142 62618822667209.71 2224726.7626273884 261874 -732797 4611721382223060002 9223355550934604746 16281585268876620522 68472164943295.68 5898616.931652982 237784 -598875 4611701407242345792 9223362250391155632 3577699408183553052 21300140553347.42 53771550.26565126 167966 -792887 4611699550286611812 9223164887726235740 7088177025760385824 56461952267903.89 92835869.96920013 125539 -3807842 4611710821592843606 9223283397553859544 5756765290752687660 58835559208469.4 39794091.419183925 97845 -25703952 4611784761593342388 9223241341744449690 4782279928971192568 65182094768443.91 9276773.708181158 73368 -716829 4611852156092872082 9223361623076951140 8613712481895484190 191445613359755.62 291083243.75407773 44993 -59183 4611730685242027332 9223354909338698162 18369075291092794110 429013599530392 5925109959.715378 42817 -33010362 4611704682869732882 9223092117352620518 9991152681891671022 257099731913529.5 12412830.045471078 38861 -800784 4611752907938305166 9223309994342931384 5251877538869750510 135472890315726.03 53535427.52018088 38767 -20810645 4611712185532639162 9223218900001937412 11803718472901310700 323593455407553 10496765.20741332 36477 -25843850 4611744529689964352 9223346023778617822 127137885677350808 3700925266420.715 18966925.191309396 34353 -23447120 4611796031755620254 9223329309291309758 1841522159325376278 54534534450526.42 6271211.193812284 33768 -14739804 4611762063154116632 9223007205463222212 16302703534054321116 506987919332451.8 6885575.861759452 32156 -32077710 4612033458080771112 9223352444952988904 421072759851674408 13955745719596.793 12220152.393889504 30172 -22446879 4611846229717089436 9223124373140579096 6577134317587565298 224866980668999.47 2482202.163802278 29249 -170282 4611833225706935900 9223371583739401906 15764226366913732386 551447384017691 2515144222.953728 28587 -11482817 4611990575414646848 9223302669582414438 9828522700609834800 378121905921203.2 34845264.2080656 25993 -63469 4612175339998036670 9222961628400798084 17239621485933250238 663164390134376.5 7825349797.6059 25996 -29103473 4611744585914335132 9223035551850347954 12590190375872647672 525927999326314.7 26049107.15514301 23939 +1704509 4611700827100483880 9223310246721229500 16398241567152875142 62618822667209.71 2224726.7626273884 261874 9223372036854775806 4611686018427387904 4518874482384062894 +732797 4611721382223060002 9223355550934604746 16281585268876620522 68472164943295.68 5898616.931652982 237784 9223372036854775806 4611686018427387904 3641900047478154650 +598875 4611701407242345792 9223362250391155632 3577699408183553052 21300140553347.42 53771550.26565126 167966 9223372036854775806 4611686018427387904 1688477495230210408 +792887 4611699550286611812 9223164887726235740 7088177025760385824 56461952267903.89 92835869.96920013 125539 9223372036854775806 4611686018427387904 4850868151095058072 +3807842 4611710821592843606 9223283397553859544 5756765290752687660 58835559208469.4 39794091.419183925 97845 9223372036854775806 4611686018427387904 6845214684357194564 +25703952 4611784761593342388 9223241341744449690 4782279928971192568 65182094768443.91 9276773.708181158 73368 9223372036854775806 4611686018427387904 1384302533387727316 +716829 4611852156092872082 9223361623076951140 8613712481895484190 191445613359755.62 291083243.75407773 44993 9223372036854775806 4611686018427387904 6344483471397203854 +59183 4611730685242027332 9223354909338698162 18369075291092794110 429013599530392 5925109959.715378 42817 9223372036854775806 4611686018427387904 5909305558020042898 +33010362 4611704682869732882 9223092117352620518 9991152681891671022 257099731913529.5 12412830.045471078 38861 9223372036854775806 4611686018427387904 4672855013852508626 +800784 4611752907938305166 9223309994342931384 5251877538869750510 135472890315726.03 53535427.52018088 38767 9223372036854775806 4611686018427387904 7801864489649220514 +20810645 4611712185532639162 9223218900001937412 11803718472901310700 323593455407553 10496765.20741332 36477 9223372036854775806 4611686018427387904 5941995311893397960 +25843850 4611744529689964352 9223346023778617822 127137885677350808 3700925266420.715 18966925.191309396 34353 9223372036854775806 4611686018427387904 6700111718676827412 +23447120 4611796031755620254 9223329309291309758 1841522159325376278 54534534450526.42 6271211.193812284 33768 9223372036854775806 4611686018427387904 2325654077031843898 +14739804 4611762063154116632 9223007205463222212 16302703534054321116 506987919332451.8 6885575.861759452 32156 9223372036854775806 4611686018427387904 2114922310535979832 +32077710 4612033458080771112 9223352444952988904 421072759851674408 13955745719596.793 12220152.393889504 30172 9223372036854775806 4611686018427387904 4399934528735249092 +22446879 4611846229717089436 9223124373140579096 6577134317587565298 224866980668999.47 2482202.163802278 29249 9223372036854775806 4611686018427387904 8763910740678180498 +170282 4611833225706935900 9223371583739401906 15764226366913732386 551447384017691 2515144222.953728 28587 9223372036854775806 4611686018427387904 8217388408377809010 +11482817 4611990575414646848 9223302669582414438 9828522700609834800 378121905921203.2 34845264.2080656 25993 9223372036854775806 4611686018427387904 4689180182672571856 +63469 4612175339998036670 9222961628400798084 17239621485933250238 663164390134376.5 7825349797.6059 25996 9223372036854775806 4611686018427387904 2067736879306995526 +29103473 4611744585914335132 9223035551850347954 12590190375872647672 525927999326314.7 26049107.15514301 23939 9223372036854775806 4611686018427387904 8318055464870862444 +Simple functions without key +4611686725751467379 9223371678237104442 3626326766789368100 408650940859.2896 104735.01095549858 8873898 9223372036854775807 4611686018427387904 3818489297630359920 +Simple functions with non compilable function without key +4611686725751467379 9223371678237104442 3626326766789368100 61384643584599682996279588 408650940859.2896 104735.01095549858 8873898 9223372036854775807 4611686018427387904 3818489297630359920 +Simple functions if combinator without key +4611687533683519016 9223371678237104442 4124667747700004330 930178817930.5122 321189.2280948817 4434274 9223372036854775806 4611686018427387904 2265422677606390266 Aggregation without JIT compilation Simple functions -1704509 4611700827100483880 9223360787015464643 10441337359398154812 19954243669348.844 9648741.579254271 523264 -732797 4611701940806302259 9223355550934604746 977192643464016658 2054229034942.3723 51998323.94457991 475698 -598875 4611701407242345792 9223362250391155632 9312163881623734456 27615161624211.875 12261797.824844675 337212 -792887 4611699550286611812 9223290551912005343 6930300520201292824 27479710385933.586 53095331.60360441 252197 -3807842 4611710821592843606 9223326163906184987 16710274896338005145 85240848090850.69 22373416.533275086 196036 -25703952 4611709443519524003 9223353913449113943 9946868158853570839 67568783303242.086 3154349.826950714 147211 -716829 4611852156092872082 9223361623076951140 15381015774917924786 170693446547158.72 201431892.4773785 90109 -59183 4611730685242027332 9223354909338698162 8078812522502896568 94622946187035.42 1425270865.0901496 85379 -33010362 4611704682869732882 9223268545373999677 2064452191838585926 26532987929602.555 3695122.4062526934 77807 -800784 4611752907938305166 9223340418389788041 18082918611792817587 233352070043266.62 36535786.81446395 77492 -20810645 4611712185532639162 9223218900001937412 4996531385439292694 68246505203164.63 6316535.831023813 73213 -25843850 4611690025407720929 9223346023778617822 12755881190906812868 185015319325648.16 9962165.34831339 68945 -23447120 4611796031755620254 9223329309291309758 17231649548755339966 255019232629204.38 7937191.271698021 67570 -14739804 4611692230555590277 9223313509005166531 2458378896777063244 38308020331864.36 14590240.469105456 64174 -32077710 4611884228437061959 9223352444952988904 12965822147651192908 214467085941034.7 7257521.096258734 60456 -22446879 4611846229717089436 9223124373140579096 13530160492087688838 231724477077663.4 4737362.521046629 58389 -170282 4611833225706935900 9223371583739401906 8076893424988479310 141657635880324.8 1613795518.1065989 57017 -11482817 4611708000353743073 9223337838355779113 14841435427430843458 283531099960470.8 9938452.835998287 52345 -63469 4611695097019173921 9223353530156141191 6296784708578574520 120762239817777.88 579655378.4603049 52142 -29103473 4611744585914335132 9223333530281362537 5908285283932344933 123712996438970.34 867841.595541967 47758 +1704509 4611700827100483880 9223360787015464643 10441337359398154812 19954243669348.844 9648741.579254271 523264 9223372036854775807 4611686018427387904 4544239379628300646 +732797 4611701940806302259 9223355550934604746 977192643464016658 2054229034942.3723 51998323.94457991 475698 9223372036854775807 4611686018427387904 4091184823334377716 +598875 4611701407242345792 9223362250391155632 9312163881623734456 27615161624211.875 12261797.824844675 337212 9223372036854775807 4611686018427387904 3725992504798702670 +792887 4611699550286611812 9223290551912005343 6930300520201292824 27479710385933.586 53095331.60360441 252197 9223372036854775807 4611686018427387904 6536441508464694614 +3807842 4611710821592843606 9223326163906184987 16710274896338005145 85240848090850.69 22373416.533275086 196036 9223372036854775807 4611686018427387904 1797862753609257231 +25703952 4611709443519524003 9223353913449113943 9946868158853570839 67568783303242.086 3154349.826950714 147211 9223372036854775807 4611686018427387904 8737124378202300429 +716829 4611852156092872082 9223361623076951140 15381015774917924786 170693446547158.72 201431892.4773785 90109 9223372036854775807 4611686018427387904 8209915323001116338 +59183 4611730685242027332 9223354909338698162 8078812522502896568 94622946187035.42 1425270865.0901496 85379 9223372036854775807 4611686018427387904 8909082036598843562 +33010362 4611704682869732882 9223268545373999677 2064452191838585926 26532987929602.555 3695122.4062526934 77807 9223372036854775807 4611686018427387904 5411365383789552292 +800784 4611752907938305166 9223340418389788041 18082918611792817587 233352070043266.62 36535786.81446395 77492 9223372036854775807 4611686018427387904 2059255810151375435 +20810645 4611712185532639162 9223218900001937412 4996531385439292694 68246505203164.63 6316535.831023813 73213 9223372036854775807 4611686018427387904 8852740550386113674 +25843850 4611690025407720929 9223346023778617822 12755881190906812868 185015319325648.16 9962165.34831339 68945 9223372036854775807 4611686018427387904 7849665866595760148 +23447120 4611796031755620254 9223329309291309758 17231649548755339966 255019232629204.38 7937191.271698021 67570 9223372036854775807 4611686018427387904 3435410911925610424 +14739804 4611692230555590277 9223313509005166531 2458378896777063244 38308020331864.36 14590240.469105456 64174 9223372036854775807 4611686018427387904 511910855240035342 +32077710 4611884228437061959 9223352444952988904 12965822147651192908 214467085941034.7 7257521.096258734 60456 9223372036854775807 4611686018427387904 2256071920672551964 +22446879 4611846229717089436 9223124373140579096 13530160492087688838 231724477077663.4 4737362.521046629 58389 9223372036854775807 4611686018427387904 6236276364886386410 +170282 4611833225706935900 9223371583739401906 8076893424988479310 141657635880324.8 1613795518.1065989 57017 9223372036854775807 4611686018427387904 4755775861151848768 +11482817 4611708000353743073 9223337838355779113 14841435427430843458 283531099960470.8 9938452.835998287 52345 9223372036854775807 4611686018427387904 5371586112642152558 +63469 4611695097019173921 9223353530156141191 6296784708578574520 120762239817777.88 579655378.4603049 52142 9223372036854775807 4611686018427387904 4150567963952988110 +29103473 4611744585914335132 9223333530281362537 5908285283932344933 123712996438970.34 867841.595541967 47758 9223372036854775807 4611686018427387904 3238284030821087319 Simple functions with non compilable function -1704509 4611700827100483880 9223360787015464643 10441337359398154812 4611686018427387904 19954243669348.844 9648741.579254271 523264 -732797 4611701940806302259 9223355550934604746 977192643464016658 4611686018427387904 2054229034942.3723 51998323.94457991 475698 -598875 4611701407242345792 9223362250391155632 9312163881623734456 4611686018427387904 27615161624211.875 12261797.824844675 337212 -792887 4611699550286611812 9223290551912005343 6930300520201292824 4611686018427387904 27479710385933.586 53095331.60360441 252197 -3807842 4611710821592843606 9223326163906184987 16710274896338005145 4611686018427387904 85240848090850.69 22373416.533275086 196036 -25703952 4611709443519524003 9223353913449113943 9946868158853570839 4611686018427387904 67568783303242.086 3154349.826950714 147211 -716829 4611852156092872082 9223361623076951140 15381015774917924786 4611686018427387904 170693446547158.72 201431892.4773785 90109 -59183 4611730685242027332 9223354909338698162 8078812522502896568 4611686018427387904 94622946187035.42 1425270865.0901496 85379 -33010362 4611704682869732882 9223268545373999677 2064452191838585926 4611686018427387904 26532987929602.555 3695122.4062526934 77807 -800784 4611752907938305166 9223340418389788041 18082918611792817587 4611686018427387904 233352070043266.62 36535786.81446395 77492 -20810645 4611712185532639162 9223218900001937412 4996531385439292694 4611686018427387904 68246505203164.63 6316535.831023813 73213 -25843850 4611690025407720929 9223346023778617822 12755881190906812868 4611686018427387904 185015319325648.16 9962165.34831339 68945 -23447120 4611796031755620254 9223329309291309758 17231649548755339966 4611686018427387904 255019232629204.38 7937191.271698021 67570 -14739804 4611692230555590277 9223313509005166531 2458378896777063244 4611686018427387904 38308020331864.36 14590240.469105456 64174 -32077710 4611884228437061959 9223352444952988904 12965822147651192908 4611686018427387904 214467085941034.7 7257521.096258734 60456 -22446879 4611846229717089436 9223124373140579096 13530160492087688838 4611686018427387904 231724477077663.4 4737362.521046629 58389 -170282 4611833225706935900 9223371583739401906 8076893424988479310 4611686018427387904 141657635880324.8 1613795518.1065989 57017 -11482817 4611708000353743073 9223337838355779113 14841435427430843458 4611686018427387904 283531099960470.8 9938452.835998287 52345 -63469 4611695097019173921 9223353530156141191 6296784708578574520 4611686018427387904 120762239817777.88 579655378.4603049 52142 -29103473 4611744585914335132 9223333530281362537 5908285283932344933 4611686018427387904 123712996438970.34 867841.595541967 47758 +1704509 4611700827100483880 9223360787015464643 10441337359398154812 3620921835565807284859452 19954243669348.844 9648741.579254271 523264 9223372036854775807 4611686018427387904 4544239379628300646 +732797 4611701940806302259 9223355550934604746 977192643464016658 3289442827160604417733394 2054229034942.3723 51998323.94457991 475698 9223372036854775807 4611686018427387904 4091184823334377716 +598875 4611701407242345792 9223362250391155632 9312163881623734456 2330921446573746856380600 27615161624211.875 12261797.824844675 337212 9223372036854775807 4611686018427387904 3725992504798702670 +792887 4611699550286611812 9223290551912005343 6930300520201292824 1745179600137886041476120 27479710385933.586 53095331.60360441 252197 9223372036854775807 4611686018427387904 6536441508464694614 +3807842 4611710821592843606 9223326163906184987 16710274896338005145 1356295121550317411019929 85240848090850.69 22373416.533275086 196036 9223372036854775807 4611686018427387904 1797862753609257231 +25703952 4611709443519524003 9223353913449113943 9946868158853570839 1018731388338768841564439 67568783303242.086 3154349.826950714 147211 9223372036854775807 4611686018427387904 8737124378202300429 +716829 4611852156092872082 9223361623076951140 15381015774917924786 623810478612337115371442 170693446547158.72 201431892.4773785 90109 9223372036854775807 4611686018427387904 8209915323001116338 +59183 4611730685242027332 9223354909338698162 8078812522502896568 589916507545680254024632 94622946187035.42 1425270865.0901496 85379 9223372036854775807 4611686018427387904 8909082036598843562 +33010362 4611704682869732882 9223268545373999677 2064452191838585926 538517864195994778911814 26532987929602.555 3695122.4062526934 77807 9223372036854775807 4611686018427387904 5411365383789552292 +800784 4611752907938305166 9223340418389788041 18082918611792817587 535545510122473785781683 233352070043266.62 36535786.81446395 77492 9223372036854775807 4611686018427387904 2059255810151375435 +20810645 4611712185532639162 9223218900001937412 4996531385439292694 506405014842860050255126 68246505203164.63 6316535.831023813 73213 9223372036854775807 4611686018427387904 8852740550386113674 +25843850 4611690025407720929 9223346023778617822 12755881190906812868 476547495537329753708996 185015319325648.16 9962165.34831339 68945 9223372036854775807 4611686018427387904 7849665866595760148 +23447120 4611796031755620254 9223329309291309758 17231649548755339966 467236365548464278670014 255019232629204.38 7937191.271698021 67570 9223372036854775807 4611686018427387904 3435410911925610424 +14739804 4611692230555590277 9223313509005166531 2458378896777063244 444126268697527941770060 38308020331864.36 14590240.469105456 64174 9223372036854775807 4611686018427387904 511910855240035342 +32077710 4611884228437061959 9223352444952988904 12965822147651192908 417407443977973675608140 214467085941034.7 7257521.096258734 60456 9223372036854775807 4611686018427387904 2256071920672551964 +22446879 4611846229717089436 9223124373140579096 13530160492087688838 403462269796593691082374 231724477077663.4 4737362.521046629 58389 9223372036854775807 4611686018427387904 6236276364886386410 +170282 4611833225706935900 9223371583739401906 8076893424988479310 394417911933408911581006 141657635880324.8 1613795518.1065989 57017 9223372036854775807 4611686018427387904 4755775861151848768 +11482817 4611708000353743073 9223337838355779113 14841435427430843458 361995300393829962204226 283531099960470.8 9938452.835998287 52345 9223372036854775807 4611686018427387904 5371586112642152558 +63469 4611695097019173921 9223353530156141191 6296784708578574520 360843057610541117735096 120762239817777.88 579655378.4603049 52142 9223372036854775807 4611686018427387904 4150567963952988110 +29103473 4611744585914335132 9223333530281362537 5908285283932344933 330534668598011678200421 123712996438970.34 867841.595541967 47758 9223372036854775807 4611686018427387904 3238284030821087319 Simple functions if combinator -1704509 4611700827100483880 9223310246721229500 16398241567152875142 2224726.7626273884 261874 -732797 4611721382223060002 9223355550934604746 16281585268876620522 5898616.931652982 237784 -598875 4611701407242345792 9223362250391155632 3577699408183553052 53771550.26565126 167966 -792887 4611699550286611812 9223164887726235740 7088177025760385824 92835869.96920013 125539 -3807842 4611710821592843606 9223283397553859544 5756765290752687660 39794091.419183925 97845 -25703952 4611784761593342388 9223241341744449690 4782279928971192568 9276773.708181158 73368 -716829 4611852156092872082 9223361623076951140 8613712481895484190 291083243.75407773 44993 -59183 4611730685242027332 9223354909338698162 18369075291092794110 5925109959.715378 42817 -33010362 4611704682869732882 9223092117352620518 9991152681891671022 12412830.045471078 38861 -800784 4611752907938305166 9223309994342931384 5251877538869750510 53535427.52018088 38767 -20810645 4611712185532639162 9223218900001937412 11803718472901310700 10496765.20741332 36477 -25843850 4611744529689964352 9223346023778617822 127137885677350808 18966925.191309396 34353 -23447120 4611796031755620254 9223329309291309758 1841522159325376278 6271211.193812284 33768 -14739804 4611762063154116632 9223007205463222212 16302703534054321116 6885575.861759452 32156 -32077710 4612033458080771112 9223352444952988904 421072759851674408 12220152.393889504 30172 -22446879 4611846229717089436 9223124373140579096 6577134317587565298 2482202.163802278 29249 -170282 4611833225706935900 9223371583739401906 15764226366913732386 2515144222.953728 28587 -11482817 4611990575414646848 9223302669582414438 9828522700609834800 34845264.2080656 25993 -63469 4612175339998036670 9222961628400798084 17239621485933250238 7825349797.6059 25996 -29103473 4611744585914335132 9223035551850347954 12590190375872647672 26049107.15514301 23939 +1704509 4611700827100483880 9223310246721229500 16398241567152875142 62618822667209.71 2224726.7626273884 261874 9223372036854775806 4611686018427387904 4518874482384062894 +732797 4611721382223060002 9223355550934604746 16281585268876620522 68472164943295.68 5898616.931652982 237784 9223372036854775806 4611686018427387904 3641900047478154650 +598875 4611701407242345792 9223362250391155632 3577699408183553052 21300140553347.42 53771550.26565126 167966 9223372036854775806 4611686018427387904 1688477495230210408 +792887 4611699550286611812 9223164887726235740 7088177025760385824 56461952267903.89 92835869.96920013 125539 9223372036854775806 4611686018427387904 4850868151095058072 +3807842 4611710821592843606 9223283397553859544 5756765290752687660 58835559208469.4 39794091.419183925 97845 9223372036854775806 4611686018427387904 6845214684357194564 +25703952 4611784761593342388 9223241341744449690 4782279928971192568 65182094768443.91 9276773.708181158 73368 9223372036854775806 4611686018427387904 1384302533387727316 +716829 4611852156092872082 9223361623076951140 8613712481895484190 191445613359755.62 291083243.75407773 44993 9223372036854775806 4611686018427387904 6344483471397203854 +59183 4611730685242027332 9223354909338698162 18369075291092794110 429013599530392 5925109959.715378 42817 9223372036854775806 4611686018427387904 5909305558020042898 +33010362 4611704682869732882 9223092117352620518 9991152681891671022 257099731913529.5 12412830.045471078 38861 9223372036854775806 4611686018427387904 4672855013852508626 +800784 4611752907938305166 9223309994342931384 5251877538869750510 135472890315726.03 53535427.52018088 38767 9223372036854775806 4611686018427387904 7801864489649220514 +20810645 4611712185532639162 9223218900001937412 11803718472901310700 323593455407553 10496765.20741332 36477 9223372036854775806 4611686018427387904 5941995311893397960 +25843850 4611744529689964352 9223346023778617822 127137885677350808 3700925266420.715 18966925.191309396 34353 9223372036854775806 4611686018427387904 6700111718676827412 +23447120 4611796031755620254 9223329309291309758 1841522159325376278 54534534450526.42 6271211.193812284 33768 9223372036854775806 4611686018427387904 2325654077031843898 +14739804 4611762063154116632 9223007205463222212 16302703534054321116 506987919332451.8 6885575.861759452 32156 9223372036854775806 4611686018427387904 2114922310535979832 +32077710 4612033458080771112 9223352444952988904 421072759851674408 13955745719596.793 12220152.393889504 30172 9223372036854775806 4611686018427387904 4399934528735249092 +22446879 4611846229717089436 9223124373140579096 6577134317587565298 224866980668999.47 2482202.163802278 29249 9223372036854775806 4611686018427387904 8763910740678180498 +170282 4611833225706935900 9223371583739401906 15764226366913732386 551447384017691 2515144222.953728 28587 9223372036854775806 4611686018427387904 8217388408377809010 +11482817 4611990575414646848 9223302669582414438 9828522700609834800 378121905921203.2 34845264.2080656 25993 9223372036854775806 4611686018427387904 4689180182672571856 +63469 4612175339998036670 9222961628400798084 17239621485933250238 663164390134376.5 7825349797.6059 25996 9223372036854775806 4611686018427387904 2067736879306995526 +29103473 4611744585914335132 9223035551850347954 12590190375872647672 525927999326314.7 26049107.15514301 23939 9223372036854775806 4611686018427387904 8318055464870862444 +Simple functions without key +4611686725751467379 9223371678237104442 3626326766789368100 408650940859.2896 104735.01095549858 8873898 9223372036854775807 4611686018427387904 3818489297630359920 +Simple functions with non compilable function without key +4611686725751467379 9223371678237104442 3626326766789368100 61384643584599682996279588 408650940859.2896 104735.01095549858 8873898 9223372036854775807 4611686018427387904 3818489297630359920 +Simple functions if combinator without key +4611687533683519016 9223371678237104442 4124667747700004330 930178817930.5122 321189.2280948817 4434274 9223372036854775806 4611686018427387904 2265422677606390266 diff --git a/tests/queries/1_stateful/00165_jit_aggregate_functions.sql b/tests/queries/1_stateful/00165_jit_aggregate_functions.sql index 90917209d1b..c826a129b2a 100644 --- a/tests/queries/1_stateful/00165_jit_aggregate_functions.sql +++ b/tests/queries/1_stateful/00165_jit_aggregate_functions.sql @@ -5,35 +5,199 @@ SELECT 'Aggregation using JIT compilation'; SELECT 'Simple functions'; -SELECT CounterID, min(WatchID), max(WatchID), sum(WatchID), avg(WatchID), avgWeighted(WatchID, CounterID), count(WatchID) FROM test.hits +SELECT + CounterID, + min(WatchID), + max(WatchID), + sum(WatchID), + avg(WatchID), + avgWeighted(WatchID, CounterID), + count(WatchID), + groupBitOr(WatchID), + groupBitAnd(WatchID), + groupBitXor(WatchID) +FROM test.hits GROUP BY CounterID ORDER BY count() DESC LIMIT 20; SELECT 'Simple functions with non compilable function'; -SELECT CounterID, min(WatchID), max(WatchID), sum(WatchID), groupBitAnd(WatchID), avg(WatchID), avgWeighted(WatchID, CounterID), count(WatchID) FROM test.hits +SELECT + CounterID, + min(WatchID), + max(WatchID), + sum(WatchID), + sum(toUInt128(WatchID)), + avg(WatchID), + avgWeighted(WatchID, CounterID), + count(WatchID), + groupBitOr(WatchID), + groupBitAnd(WatchID), + groupBitXor(WatchID) +FROM test.hits GROUP BY CounterID ORDER BY count() DESC LIMIT 20; SELECT 'Simple functions if combinator'; WITH (WatchID % 2 == 0) AS predicate -SELECT CounterID, minIf(WatchID,predicate), maxIf(WatchID, predicate), sumIf(WatchID, predicate), avgIf(WatchID, predicate), avgWeightedIf(WatchID, CounterID, predicate), countIf(WatchID, predicate) FROM test.hits +SELECT + CounterID, + minIf(WatchID,predicate), + maxIf(WatchID, predicate), + sumIf(WatchID, predicate), + avgIf(WatchID, predicate), + avgWeightedIf(WatchID, CounterID, predicate), + countIf(WatchID, predicate), + groupBitOrIf(WatchID, predicate), + groupBitAndIf(WatchID, predicate), + groupBitXorIf(WatchID, predicate) +FROM test.hits GROUP BY CounterID ORDER BY count() DESC LIMIT 20; +SELECT 'Simple functions without key'; + +SELECT + min(WatchID) AS min_watch_id, + max(WatchID), + sum(WatchID), + avg(WatchID), + avgWeighted(WatchID, CounterID), + count(WatchID), + groupBitOr(WatchID), + groupBitAnd(WatchID), + groupBitXor(WatchID) +FROM test.hits +ORDER BY min_watch_id DESC LIMIT 20; + +SELECT 'Simple functions with non compilable function without key'; + +SELECT + min(WatchID) AS min_watch_id, + max(WatchID), + sum(WatchID), + sum(toUInt128(WatchID)), + avg(WatchID), + avgWeighted(WatchID, CounterID), + count(WatchID), + groupBitOr(WatchID), + groupBitAnd(WatchID), + groupBitXor(WatchID) +FROM test.hits +ORDER BY min_watch_id DESC LIMIT 20; + +SELECT 'Simple functions if combinator without key'; + +WITH (WatchID % 2 == 0) AS predicate +SELECT + minIf(WatchID, predicate) as min_watch_id, + maxIf(WatchID, predicate), + sumIf(WatchID, predicate), + avgIf(WatchID, predicate), + avgWeightedIf(WatchID, CounterID, predicate), + countIf(WatchID, predicate), + groupBitOrIf(WatchID, predicate), + groupBitAndIf(WatchID, predicate), + groupBitXorIf(WatchID, predicate) +FROM test.hits +ORDER BY min_watch_id +DESC LIMIT 20; + SET compile_aggregate_expressions = 0; SELECT 'Aggregation without JIT compilation'; SELECT 'Simple functions'; -SELECT CounterID, min(WatchID), max(WatchID), sum(WatchID), avg(WatchID), avgWeighted(WatchID, CounterID), count(WatchID) FROM test.hits +SELECT + CounterID, + min(WatchID), + max(WatchID), + sum(WatchID), + avg(WatchID), + avgWeighted(WatchID, CounterID), + count(WatchID), + groupBitOr(WatchID), + groupBitAnd(WatchID), + groupBitXor(WatchID) +FROM test.hits GROUP BY CounterID ORDER BY count() DESC LIMIT 20; SELECT 'Simple functions with non compilable function'; -SELECT CounterID, min(WatchID), max(WatchID), sum(WatchID), groupBitAnd(WatchID), avg(WatchID), avgWeighted(WatchID, CounterID), count(WatchID) FROM test.hits +SELECT + CounterID, + min(WatchID), + max(WatchID), + sum(WatchID), + sum(toUInt128(WatchID)), + avg(WatchID), + avgWeighted(WatchID, CounterID), + count(WatchID), + groupBitOr(WatchID), + groupBitAnd(WatchID), + groupBitXor(WatchID) +FROM test.hits GROUP BY CounterID ORDER BY count() DESC LIMIT 20; SELECT 'Simple functions if combinator'; WITH (WatchID % 2 == 0) AS predicate -SELECT CounterID, minIf(WatchID,predicate), maxIf(WatchID, predicate), sumIf(WatchID, predicate), avgWeightedIf(WatchID, CounterID, predicate), countIf(WatchID, predicate) FROM test.hits +SELECT + CounterID, + minIf(WatchID,predicate), + maxIf(WatchID, predicate), + sumIf(WatchID, predicate), + avgIf(WatchID, predicate), + avgWeightedIf(WatchID, CounterID, predicate), + countIf(WatchID, predicate), + groupBitOrIf(WatchID, predicate), + groupBitAndIf(WatchID, predicate), + groupBitXorIf(WatchID, predicate) +FROM test.hits GROUP BY CounterID ORDER BY count() DESC LIMIT 20; + +SELECT 'Simple functions without key'; + +SELECT + min(WatchID) AS min_watch_id, + max(WatchID), + sum(WatchID), + avg(WatchID), + avgWeighted(WatchID, CounterID), + count(WatchID), + groupBitOr(WatchID), + groupBitAnd(WatchID), + groupBitXor(WatchID) +FROM test.hits +ORDER BY min_watch_id DESC LIMIT 20; + +SELECT 'Simple functions with non compilable function without key'; + +SELECT + min(WatchID) AS min_watch_id, + max(WatchID), + sum(WatchID), + sum(toUInt128(WatchID)), + avg(WatchID), + avgWeighted(WatchID, CounterID), + count(WatchID), + groupBitOr(WatchID), + groupBitAnd(WatchID), + groupBitXor(WatchID) +FROM test.hits +ORDER BY min_watch_id DESC LIMIT 20; + +SELECT 'Simple functions if combinator without key'; + +WITH (WatchID % 2 == 0) AS predicate +SELECT + minIf(WatchID, predicate) as min_watch_id, + maxIf(WatchID, predicate), + sumIf(WatchID, predicate), + avgIf(WatchID, predicate), + avgWeightedIf(WatchID, CounterID, predicate), + countIf(WatchID, predicate), + groupBitOrIf(WatchID, predicate), + groupBitAndIf(WatchID, predicate), + groupBitXorIf(WatchID, predicate) +FROM test.hits +ORDER BY min_watch_id +DESC LIMIT 20; diff --git a/tests/queries/1_stateful/00166_explain_estimate.reference b/tests/queries/1_stateful/00166_explain_estimate.reference new file mode 100644 index 00000000000..71ddd681581 --- /dev/null +++ b/tests/queries/1_stateful/00166_explain_estimate.reference @@ -0,0 +1,5 @@ +test hits 1 57344 7 +test hits 1 8839168 1079 +test hits 1 835584 102 +test hits 1 8003584 977 +test hits 2 581632 71 diff --git a/tests/queries/1_stateful/00166_explain_estimate.sql b/tests/queries/1_stateful/00166_explain_estimate.sql new file mode 100644 index 00000000000..06725ff7f9f --- /dev/null +++ b/tests/queries/1_stateful/00166_explain_estimate.sql @@ -0,0 +1,5 @@ +EXPLAIN ESTIMATE SELECT count() FROM test.hits WHERE CounterID = 29103473; +EXPLAIN ESTIMATE SELECT count() FROM test.hits WHERE CounterID != 29103473; +EXPLAIN ESTIMATE SELECT count() FROM test.hits WHERE CounterID > 29103473; +EXPLAIN ESTIMATE SELECT count() FROM test.hits WHERE CounterID < 29103473; +EXPLAIN ESTIMATE SELECT count() FROM test.hits WHERE CounterID = 29103473 UNION ALL SELECT count() FROM test.hits WHERE CounterID = 1704509; diff --git a/tests/queries/conftest.py b/tests/queries/conftest.py index 2a5ebd2bf3c..2d13443e981 100644 --- a/tests/queries/conftest.py +++ b/tests/queries/conftest.py @@ -11,7 +11,6 @@ from .server import ServerThread def pytest_addoption(parser): parser.addoption("--builddir", action="store", default=None, help="Path to build directory to use binaries from") - parser.addoption("--antlr", action="store_true", default=False, help="Use ANTLR parser") # HTML report hooks @@ -32,8 +31,7 @@ def pytest_itemcollected(item): @pytest.fixture(scope='module') def cmdopts(request): return { - 'builddir': request.config.getoption("--builddir"), - 'antlr': request.config.getoption("--antlr"), + 'builddir': request.config.getoption("--builddir") } @@ -48,11 +46,6 @@ def bin_prefix(cmdopts): return prefix -@pytest.fixture(scope='module') -def use_antlr(cmdopts): - return cmdopts['antlr'] - - # TODO: also support stateful queries. QUERIES_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), '0_stateless') diff --git a/tests/queries/query_test.py b/tests/queries/query_test.py index 952e93c09cd..1735febee44 100644 --- a/tests/queries/query_test.py +++ b/tests/queries/query_test.py @@ -12,6 +12,7 @@ SKIP_LIST = [ # these couple of tests hangs everything "00600_replace_running_query", "00987_distributed_stack_overflow", + "01954_clickhouse_benchmark_multiple_long", # just fail "00133_long_shard_memory_tracker_and_exception_safety", @@ -155,11 +156,9 @@ def check_result(result, error, return_code, reference, replace_map): pytrace=False) -def run_client(use_antlr, bin_prefix, port, database, query, reference, replace_map=None): +def run_client(bin_prefix, port, database, query, reference, replace_map=None): # We can't use `text=True` since some tests may return binary data cmd = [bin_prefix + '-client', '--port', str(port), '-d', database, '-m', '-n', '--testmode'] - if use_antlr: - cmd.append('--use_antlr_parser=1') client = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) result, error = client.communicate(query.encode('utf-8')) assert client.returncode is not None, "Client should exit after processing all queries" @@ -167,7 +166,7 @@ def run_client(use_antlr, bin_prefix, port, database, query, reference, replace_ check_result(result, error, client.returncode, reference, replace_map) -def run_shell(use_antlr, bin_prefix, server, database, path, reference, replace_map=None): +def run_shell(bin_prefix, server, database, path, reference, replace_map=None): env = { 'CLICKHOUSE_BINARY': bin_prefix, 'CLICKHOUSE_DATABASE': database, @@ -181,8 +180,6 @@ def run_shell(use_antlr, bin_prefix, server, database, path, reference, replace_ 'CLICKHOUSE_CONFIG_CLIENT': server.client_config, 'PROTOC_BINARY': os.path.abspath(os.path.join(os.path.dirname(bin_prefix), '..', 'contrib', 'protobuf', 'protoc')), # FIXME: adhoc solution } - if use_antlr: - env['CLICKHOUSE_CLIENT_OPT'] = '--use_antlr_parser=1' shell = subprocess.Popen([path], env=env, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) result, error = shell.communicate() assert shell.returncode is not None, "Script should exit after executing all commands" @@ -196,7 +193,7 @@ def random_str(length=10): return ''.join(random.choice(alphabet) for _ in range(length)) -def test_sql_query(use_antlr, bin_prefix, sql_query, standalone_server): +def test_sql_query(bin_prefix, sql_query, standalone_server): for test in SKIP_LIST: if test in sql_query: pytest.skip("Test matches skip-list: " + test) @@ -216,21 +213,21 @@ def test_sql_query(use_antlr, bin_prefix, sql_query, standalone_server): reference = file.read() random_name = 'test_{random}'.format(random=random_str()) - run_client(use_antlr, bin_prefix, tcp_port, 'default', 'CREATE DATABASE {random};'.format(random=random_name), b'') + run_client(bin_prefix, tcp_port, 'default', 'CREATE DATABASE {random};'.format(random=random_name), b'') - run_client(use_antlr, bin_prefix, tcp_port, random_name, query, reference, {random_name: 'default'}) + run_client(bin_prefix, tcp_port, random_name, query, reference, {random_name: 'default'}) query = "SELECT 'SHOW ORPHANED TABLES'; SELECT name FROM system.tables WHERE database != 'system' ORDER BY (database, name);" - run_client(use_antlr, bin_prefix, tcp_port, 'default', query, b'SHOW ORPHANED TABLES\n') + run_client(bin_prefix, tcp_port, 'default', query, b'SHOW ORPHANED TABLES\n') query = 'DROP DATABASE {random};'.format(random=random_name) - run_client(use_antlr, bin_prefix, tcp_port, 'default', query, b'') + run_client(bin_prefix, tcp_port, 'default', query, b'') query = "SELECT 'SHOW ORPHANED DATABASES'; SHOW DATABASES;" - run_client(use_antlr, bin_prefix, tcp_port, 'default', query, b'SHOW ORPHANED DATABASES\ndefault\nsystem\n') + run_client(bin_prefix, tcp_port, 'default', query, b'SHOW ORPHANED DATABASES\ndefault\nsystem\n') -def test_shell_query(use_antlr, bin_prefix, shell_query, standalone_server): +def test_shell_query(bin_prefix, shell_query, standalone_server): for test in SKIP_LIST: if test in shell_query: pytest.skip("Test matches skip-list: " + test) @@ -249,15 +246,15 @@ def test_shell_query(use_antlr, bin_prefix, shell_query, standalone_server): random_name = 'test_{random}'.format(random=random_str()) query = 'CREATE DATABASE {random};'.format(random=random_name) - run_client(use_antlr, bin_prefix, tcp_port, 'default', query, b'') + run_client(bin_prefix, tcp_port, 'default', query, b'') - run_shell(use_antlr, bin_prefix, standalone_server, random_name, shell_path, reference, {random_name: 'default'}) + run_shell(bin_prefix, standalone_server, random_name, shell_path, reference, {random_name: 'default'}) query = "SELECT 'SHOW ORPHANED TABLES'; SELECT name FROM system.tables WHERE database != 'system' ORDER BY (database, name);" - run_client(use_antlr, bin_prefix, tcp_port, 'default', query, b'SHOW ORPHANED TABLES\n') + run_client(bin_prefix, tcp_port, 'default', query, b'SHOW ORPHANED TABLES\n') query = 'DROP DATABASE {random};'.format(random=random_name) - run_client(use_antlr, bin_prefix, tcp_port, 'default', query, b'') + run_client(bin_prefix, tcp_port, 'default', query, b'') query = "SELECT 'SHOW ORPHANED DATABASES'; SHOW DATABASES;" - run_client(use_antlr, bin_prefix, tcp_port, 'default', query, b'SHOW ORPHANED DATABASES\ndefault\nsystem\n') + run_client(bin_prefix, tcp_port, 'default', query, b'SHOW ORPHANED DATABASES\ndefault\nsystem\n') diff --git a/tests/queries/shell_config.sh b/tests/queries/shell_config.sh index e768a773255..ae279c93527 100644 --- a/tests/queries/shell_config.sh +++ b/tests/queries/shell_config.sh @@ -73,7 +73,7 @@ export CLICKHOUSE_PORT_MYSQL=${CLICKHOUSE_PORT_MYSQL:="9004"} export CLICKHOUSE_PORT_POSTGRESQL=${CLICKHOUSE_PORT_POSTGRESQL:=$(${CLICKHOUSE_EXTRACT_CONFIG} --try --key=postgresql_port 2>/dev/null)} 2>/dev/null export CLICKHOUSE_PORT_POSTGRESQL=${CLICKHOUSE_PORT_POSTGRESQL:="9005"} -export CLICKHOUSE_CLIENT_SECURE=${CLICKHOUSE_CLIENT_SECURE:=$(echo ${CLICKHOUSE_CLIENT} | sed 's/'"--port=${CLICKHOUSE_PORT_TCP}"'/'"--secure --port=${CLICKHOUSE_PORT_TCP_SECURE}"'/g')} +export CLICKHOUSE_CLIENT_SECURE=${CLICKHOUSE_CLIENT_SECURE:=$(echo "${CLICKHOUSE_CLIENT}" | sed 's/'"--port=${CLICKHOUSE_PORT_TCP}"'//g; s/$/'"--secure --port=${CLICKHOUSE_PORT_TCP_SECURE}"'/g')} # Add database and log comment to url params if [ -v CLICKHOUSE_URL_PARAMS ] diff --git a/tests/queries/skip_list.json b/tests/queries/skip_list.json index 829eb8dd547..83ad14c44dc 100644 --- a/tests/queries/skip_list.json +++ b/tests/queries/skip_list.json @@ -41,7 +41,8 @@ "01473_event_time_microseconds", "01526_max_untracked_memory", /// requires TraceCollector, does not available under sanitizers "01594_too_low_memory_limits", /// requires jemalloc to track small allocations - "01193_metadata_loading" + "01193_metadata_loading", + "01955_clickhouse_benchmark_connection_hang" /// Limits RLIMIT_NOFILE, see comment in the test ], "memory-sanitizer": [ "capnproto", @@ -109,6 +110,8 @@ "00510_materizlized_view_and_deduplication_zookeeper", "00738_lock_for_inner_table", "01153_attach_mv_uuid", + "01157_replace_table", + "01185_create_or_replace_table", /// Sometimes cannot lock file most likely due to concurrent or adjacent tests, but we don't care how it works in Ordinary database. "rocksdb", "01914_exchange_dictionaries" /// Requires Atomic database @@ -118,16 +121,14 @@ "memory_tracking", "memory_usage", "live_view", - "01181_db_atomic_drop_on_cluster", - "01175_distributed_ddl_output_mode", - "01415_sticking_mutations", - "00980_zookeeper_merge_tree_alter_settings", "01148_zookeeper_path_macros_unfolding", - "01294_system_distributed_on_cluster", "01269_create_with_null", "01451_replicated_detach_drop_and_quorum", "01188_attach_table_from_path", - "01149_zookeeper_mutation_stuck_after_replace_partition", + /// ON CLUSTER is not allowed + "01181_db_atomic_drop_on_cluster", + "01175_distributed_ddl_output_mode", + "01415_sticking_mutations", /// user_files "01721_engine_file_truncate_on_insert", /// Fails due to additional replicas or shards @@ -136,6 +137,7 @@ "01532_execute_merges_on_single_replica", "00652_replicated_mutations_default_database_zookeeper", "00620_optimize_on_nonleader_replica_zookeeper", + "01158_zookeeper_log", /// grep -c "01018_ddl_dictionaries_bad_queries", "00908_bloom_filter_index", @@ -156,6 +158,9 @@ "00152_insert_different_granularity", "00054_merge_tree_partitions", "01781_merge_tree_deduplication", + "00980_zookeeper_merge_tree_alter_settings", + "00980_merge_alter_settings", + "02009_array_join_partition", /// Old syntax is not allowed "01062_alter_on_mutataion_zookeeper", "00925_zookeeper_empty_replicated_merge_tree_optimize_final", @@ -173,41 +178,39 @@ /// Does not support renaming of multiple tables in single query "00634_rename_view", "00140_rename", + /// Different query_id + "01943_query_id_check", /// Requires investigation "00953_zookeeper_suetin_deduplication_bug", - "01783_http_chunk_size" + "01783_http_chunk_size", + "00166_explain_estimate" ], "polymorphic-parts": [ "01508_partition_pruning_long", /// bug, shoud be fixed - "01482_move_to_prewhere_and_cast" /// bug, shoud be fixed + "01482_move_to_prewhere_and_cast", /// bug, shoud be fixed + "01158_zookeeper_log" ], "parallel": [ /// Pessimistic list of tests which work badly in parallel. /// Probably they need better investigation. - "00062_replicated_merge_tree_alter_zookeeper", "00080_show_tables_and_system_tables", "00101_materialized_views_and_insert_without_explicit_database", "00109_shard_totals_after_having", "00110_external_sort", "00116_storage_set", - "00121_drop_column_zookeeper", "00133_long_shard_memory_tracker_and_exception_safety", "00158_buffer_and_nonexistent_table", "00180_attach_materialized_view", - "00226_zookeeper_deduplication_and_unexpected_parts", - "00236_replicated_drop_on_non_leader_zookeeper", "00305_http_and_readonly", "00311_array_primary_key", "00417_kill_query", "00423_storage_log_single_thread", "00429_long_http_bufferization", "00446_clear_column_in_partition_concurrent_zookeeper", - "00446_clear_column_in_partition_zookeeper", "00463_long_sessions_in_http_interface", "00505_shard_secure", "00508_materialized_view_to", - "00516_deduplication_after_drop_partition_zookeeper", "00534_functions_bad_arguments10", "00552_or_nullable", "00564_versioned_collapsing_merge_tree", @@ -225,7 +228,6 @@ "00626_replace_partition_from_table", "00626_replace_partition_from_table_zookeeper", "00633_materialized_view_and_too_many_parts_zookeeper", - "00643_cast_zookeeper", "00652_mergetree_mutations", "00652_replicated_mutations_zookeeper", "00682_empty_parts_merge", @@ -241,7 +243,6 @@ "00751_default_databasename_for_view", "00753_alter_attach", "00754_alter_modify_column_partitions", - "00754_alter_modify_order_by_replicated_zookeeper", "00763_long_lock_buffer_alter_destination_table", "00800_versatile_storage_join", "00804_test_alter_compression_codecs", @@ -256,22 +257,18 @@ "00857_global_joinsavel_table_alias", "00899_long_attach_memory_limit", "00910_buffer_prewhere", - "00910_zookeeper_custom_compression_codecs_replicated", "00926_adaptive_index_granularity_merge_tree", "00926_adaptive_index_granularity_pk", "00926_adaptive_index_granularity_replacing_merge_tree", - "00926_zookeeper_adaptive_index_granularity_replicated_merge_tree", "00933_alter_ttl", "00933_reserved_word", "00933_test_fix_extra_seek_on_compressed_cache", - "00933_ttl_replicated_zookeeper", "00933_ttl_with_default", "00950_dict_get", "00955_test_final_mark", "00976_ttl_with_old_parts", "00980_merge_alter_settings", "00980_zookeeper_merge_tree_alter_settings", - "00988_constraints_replication_zookeeper", "00989_parallel_parts_loading", "00992_system_parts_race_condition_zookeeper_long", "00993_system_parts_race_condition_drop_zookeeper", @@ -343,7 +340,6 @@ "01125_dict_ddl_cannot_add_column", "01127_month_partitioning_consistency_select", "01130_in_memory_parts_partitons", - "01135_default_and_alter_zookeeper", "01148_zookeeper_path_macros_unfolding", "01150_ddl_guard_rwr", "01153_attach_mv_uuid", @@ -368,11 +364,9 @@ "01254_dict_load_after_detach_attach", "01257_dictionary_mismatch_types", "01259_dictionary_custom_settings_ddl", - "01267_alter_default_key_columns_zookeeper", "01268_dictionary_direct_layout", "01269_alias_type_differs", "01272_suspicious_codecs", - "01277_alter_rename_column_constraint_zookeeper", "01280_ssd_complex_key_dictionary", "01280_ttl_where_group_by", "01281_group_by_limit_memory_tracking", @@ -386,7 +380,6 @@ "01305_replica_create_drop_zookeeper", "01307_multiple_leaders_zookeeper", "01318_long_unsuccessful_mutation_zookeeper", - "01319_manual_write_to_replicas", "01320_create_sync_race_condition_zookeeper", "01338_long_select_and_alter", "01338_long_select_and_alter_zookeeper", @@ -395,7 +388,6 @@ "01357_version_collapsing_attach_detach_zookeeper", "01375_compact_parts_codecs", "01376_GROUP_BY_injective_elimination_dictGet", - "01378_alter_rename_with_ttl_zookeeper", "01383_remote_ambiguous_column_shard", "01388_clear_all_columns", "01391_join_on_dict_crash", @@ -407,7 +399,6 @@ "01415_sticking_mutations", "01417_freeze_partition_verbose", "01417_freeze_partition_verbose_zookeeper", - "01430_modify_sample_by_zookeeper", "01444_create_table_drop_database_race", "01454_storagememory_data_race_challenge", "01455_rank_correlation_spearman", @@ -419,7 +410,6 @@ "01470_show_databases_like", "01471_calculate_ttl_during_merge", "01487_distributed_in_not_default_db", - "01493_alter_remove_properties_zookeeper", "01493_storage_set_persistency", "01494_storage_join_persistency", "01501_cache_dictionary_all_fields", @@ -431,7 +421,6 @@ "01526_complex_key_dict_direct_layout", "01527_clickhouse_local_optimize", "01527_dist_sharding_key_dictGet_reload", - "01530_drop_database_atomic_sync", "01541_max_memory_usage_for_user_long", "01542_dictionary_load_exception_race", "01545_system_errors", // looks at the difference of values in system.errors @@ -447,30 +436,23 @@ "01601_detach_permanently", "01602_show_create_view", "01603_rename_overwrite_bug", - "01666_blns", "01646_system_restart_replicas_smoke", // system restart replicas is a global query "01656_test_query_log_factories_info", "01658_read_file_to_stringcolumn", - "01669_columns_declaration_serde", "01676_dictget_in_default_expression", "01681_cache_dictionary_simple_key", "01682_cache_dictionary_complex_key", "01683_flat_dictionary", "01684_ssd_cache_dictionary_simple_key", "01685_ssd_cache_dictionary_complex_key", - "01700_system_zookeeper_path_in", "01702_system_query_log", // It's ok to execute in parallel with oter tests but not several instances of the same test. "01702_system_query_log", // Runs many global system queries - "01715_background_checker_blather_zookeeper", "01721_engine_file_truncate_on_insert", // It's ok to execute in parallel but not several instances of the same test. "01722_long_brotli_http_compression_json_format", // It is broken in some unimaginable way with the genius error 'cannot write to ofstream'. Not sure how to debug this - "01747_alter_partition_key_enum_zookeeper", "01748_dictionary_table_dot", // creates database "01760_polygon_dictionaries", "01760_system_dictionaries", - "01761_alter_decimal_zookeeper", "01360_materialized_view_with_join_on_query_log", // creates and drops MVs on query_log, which may interrupt flushes. - "01509_parallel_quorum_insert_no_replicas", // It's ok to execute in parallel with oter tests but not several instances of the same test. "attach", "ddl_dictionaries", "dictionary", @@ -484,12 +466,14 @@ "01702_system_query_log", // It's ok to execute in parallel with oter tests but not several instances of the same test. "01748_dictionary_table_dot", // creates database "00950_dict_get", + "01615_random_one_shard_insertion", "01683_flat_dictionary", "01681_cache_dictionary_simple_key", "01682_cache_dictionary_complex_key", "01684_ssd_cache_dictionary_simple_key", "01685_ssd_cache_dictionary_complex_key", "01737_clickhouse_server_wait_server_pool_long", // This test is fully compatible to run in parallel, however under ASAN processes are pretty heavy and may fail under flaky adress check. + "01954_clickhouse_benchmark_round_robin", // This test is fully compatible to run in parallel, however under ASAN processes are pretty heavy and may fail under flaky adress check. "01594_too_low_memory_limits", // This test is fully compatible to run in parallel, however under ASAN processes are pretty heavy and may fail under flaky adress check. "01760_system_dictionaries", "01760_polygon_dictionaries", @@ -500,10 +484,10 @@ "01804_dictionary_decimal256_type", "01850_dist_INSERT_preserve_error", // uses cluster with different static databases shard_0/shard_1 "01821_table_comment", - "01710_projection_fetch", "01824_prefer_global_in_and_join", "01870_modulo_partition_key", "01870_buffer_flush", // creates database + "01889_sqlite_read_write", "01889_postgresql_protocol_null_fields", "01889_check_row_policy_defined_using_user_function", "01921_concurrent_ttl_and_normal_merges_zookeeper_long", // heavy test, better to run sequentially @@ -511,6 +495,19 @@ "01914_exchange_dictionaries", "01915_create_or_replace_dictionary", "01925_test_storage_merge_aliases", - "01933_client_replxx_convert_history" /// Uses non unique history file + "01933_client_replxx_convert_history", /// Uses non unique history file + "01939_user_with_default_database", //create user and database + "01999_grant_with_replace", + "01902_table_function_merge_db_repr", + "01946_test_zstd_decompression_with_escape_sequence_at_the_end_of_buffer", + "01946_test_wrong_host_name_access", + "01493_alter_remove_properties_zookeeper", + "00510_materizlized_view_and_deduplication_zookeeper", /// static UUID + "00509_extended_storage_definition_syntax_zookeeper", /// leftovers + "00083_create_merge_tree_zookeeper", /// leftovers + "01532_execute_merges_on_single_replica", /// static zk path + "01530_drop_database_atomic_sync", /// creates database + "02001_add_default_database_to_system_users", ///create user + "02002_row_level_filter_bug" ///create user ] } diff --git a/tests/server-test.xml b/tests/server-test.xml index dd21d55c78c..1f67317ad0a 100644 --- a/tests/server-test.xml +++ b/tests/server-test.xml @@ -1,5 +1,11 @@ - + trace diff --git a/tests/testflows/aes_encryption/configs/clickhouse/config.xml b/tests/testflows/aes_encryption/configs/clickhouse/config.xml index beeeafa5704..a7bb65f5b86 100644 --- a/tests/testflows/aes_encryption/configs/clickhouse/config.xml +++ b/tests/testflows/aes_encryption/configs/clickhouse/config.xml @@ -317,13 +317,13 @@ system part_log
+ toYYYYMM(event_date) 7500
- --> system part_log
+ toYYYYMM(event_date) 7500
- --> system part_log
+ toYYYYMM(event_date) 7500
- --> system part_log
+ toYYYYMM(event_date) 7500
- --> system part_log
+ toYYYYMM(event_date) 7500
- --> system part_log
+ toYYYYMM(event_date) 7500
- --> system part_log
+ toYYYYMM(event_date) 7500
- --> system part_log
+ toYYYYMM(event_date) 7500
- --> system part_log
+ toYYYYMM(event_date) 7500
- --> + + system + query_views_log
+ toYYYYMM(event_date) + 7500 +
+ system part_log
+ toYYYYMM(event_date) 7500
- --> system part_log
+ toYYYYMM(event_date) 7500
- -->