diff --git a/.github/ISSUE_TEMPLATE/85_bug-report.md b/.github/ISSUE_TEMPLATE/85_bug-report.md index bd59d17db3f..87a2d877e30 100644 --- a/.github/ISSUE_TEMPLATE/85_bug-report.md +++ b/.github/ISSUE_TEMPLATE/85_bug-report.md @@ -2,14 +2,14 @@ name: Bug report 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. -**Describe the bug** +**Describe what's wrong** > A clear and concise description of what works not as it is supposed to. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index d3fac8670e8..a2930beb89f 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -3,7 +3,7 @@ I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla Changelog category (leave one): - New Feature - Improvement -- Bug Fix +- Bug Fix (user-visible misbehaviour in official stable or prestable release) - Performance Improvement - Backward Incompatible Change - Build/Testing/Packaging Improvement diff --git a/CHANGELOG.md b/CHANGELOG.md index 10ed4dae1c9..71cdac17825 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,16 +1,19 @@ ### ClickHouse release v21.8, 2021-08-12 +#### Upgrade Notes +* New version is using `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)). If you want to *downgrade* from version 21.8 to older versions, you will need to cleanup system tables with logs manually. Look at `/var/lib/clickhouse/data/system/*_log`. + #### New Features -* 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) ([Yegor Levankov](https://github.com/elevankoff)). +* 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 `(U)Int128`, `U(Int256) types in `mapAdd` and `mapSubtract` functions. [#25596](https://github.com/ClickHouse/ClickHouse/pull/25596) ([Ildus Kurbangaliev](https://github.com/ildus)). +* 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 support for a part of SQLJSON standard. [#24148](https://github.com/ClickHouse/ClickHouse/pull/24148) ([l1tsolaiki](https://github.com/l1tsolaiki)). -* 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 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)). @@ -21,11 +24,11 @@ #### 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)). +* 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)). -* Fix error with query `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)). +* 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)). @@ -37,7 +40,7 @@ * 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 bug 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)). +* 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)). @@ -48,7 +51,7 @@ * 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 StorageS3 and StorageHDFS. Close [#25530](https://github.com/ClickHouse/ClickHouse/issues/25530). [#25550](https://github.com/ClickHouse/ClickHouse/pull/25550) ([Kseniia Sumarokova](https://github.com/kssenii)). +* 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)). @@ -60,13 +63,13 @@ * 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 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)). +* `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)). @@ -75,7 +78,7 @@ * 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 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)). +* 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)). @@ -94,20 +97,8 @@ * 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)). -* Fix empty history file conversion. [#26589](https://github.com/ClickHouse/ClickHouse/pull/26589) ([Azat Khuzhin](https://github.com/azat)). * 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)). -#### Build/Testing/Packaging Improvements - -* Disabling TestFlows LDAP module due to test fails. [#26065](https://github.com/ClickHouse/ClickHouse/pull/26065) ([vzakaznikov](https://github.com/vzakaznikov)). -* Enabling all TestFlows modules and fixing some tests. [#26011](https://github.com/ClickHouse/ClickHouse/pull/26011) ([vzakaznikov](https://github.com/vzakaznikov)). -* Add new tests for checking access rights for columns used in filters (`WHERE` / `PREWHERE` / row policy) of the `SELECT` statement after changes in [#24405](https://github.com/ClickHouse/ClickHouse/pull/24405). [#25619](https://github.com/ClickHouse/ClickHouse/pull/25619) ([Vitaly Baranov](https://github.com/vitlibar)). - -#### Other - -* Add `clickhouse-keeper-converter` tool which allows converting zookeeper logs and snapshots into `clickhouse-keeper` snapshot format. [#25428](https://github.com/ClickHouse/ClickHouse/pull/25428) ([alesapin](https://github.com/alesapin)). - - ### ClickHouse release v21.7, 2021-07-09 @@ -1294,13 +1285,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 1727caea766..de517b1b589 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,6 +45,7 @@ include (cmake/arch.cmake) include (cmake/target.cmake) include (cmake/tools.cmake) include (cmake/analysis.cmake) +include (cmake/git_status.cmake) # Ignore export() since we don't use it, # but it gets broken with a global targets via link_libraries() @@ -126,12 +127,13 @@ if (USE_STATIC_LIBRARIES) list(REVERSE CMAKE_FIND_LIBRARY_SUFFIXES) endif () -# Implies ${WITH_COVERAGE} option (ENABLE_FUZZING "Fuzzy testing using libfuzzer" OFF) if (ENABLE_FUZZING) + # Also set WITH_COVERAGE=1 for better fuzzing process + # By default this is disabled, because fuzzers are built in CI with the clickhouse itself. + # And we don't want to enable coverage for it. message (STATUS "Fuzzing instrumentation enabled") - set (WITH_COVERAGE ON) set (FUZZER "libfuzzer") endif() @@ -395,9 +397,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) @@ -592,7 +595,23 @@ macro (add_executable target) # disabled for TSAN and gcc since libtsan.a provides overrides too if (TARGET clickhouse_new_delete) # operator::new/delete for executables (MemoryTracker stuff) - target_link_libraries (${target} PRIVATE clickhouse_new_delete ${MALLOC_LIBRARIES}) + target_link_libraries (${target} PRIVATE clickhouse_new_delete) + endif() + + # In case of static jemalloc, because zone_register() is located in zone.c and + # is never used outside (it is declared as constructor) it is omitted + # by the linker, and so jemalloc will not be registered as system + # allocator under osx [1], and clickhouse will SIGSEGV. + # + # [1]: https://github.com/jemalloc/jemalloc/issues/708 + # + # About symbol name: + # - _zone_register not zone_register due to Mach-O binary format, + # - _je_zone_register due to JEMALLOC_PRIVATE_NAMESPACE=je_ under OS X. + # - but jemalloc-cmake does not run private_namespace.sh + # so symbol name should be _zone_register + if (ENABLE_JEMALLOC AND MAKE_STATIC_LIBRARIES AND OS_DARWIN) + set_property(TARGET ${target} APPEND PROPERTY LINK_OPTIONS -u_zone_register) endif() endif() endmacro() diff --git a/README.md b/README.md index 178547ea523..496a6357f44 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,3 @@ ClickHouse® is an open-source column-oriented database management system that a * [Code Browser](https://clickhouse.tech/codebrowser/html_report/ClickHouse/index.html) with syntax highlight and navigation. * [Contacts](https://clickhouse.tech/#contacts) can help to get your questions answered if there are any. * You can also [fill this form](https://clickhouse.tech/#meet) to meet Yandex ClickHouse team in person. - -## Upcoming Events -* [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/SECURITY.md b/SECURITY.md index 906b2966348..846b7e8239c 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,9 +1,11 @@ # Security Policy -## Supported Versions +## Security Announcements +Security fixes will be announced by posting them in the [security changelog](https://clickhouse.tech/docs/en/whats-new/security-changelog/) -The following versions of ClickHouse server are -currently being supported with security updates: +## Scope and Supported Versions + +The following versions of ClickHouse server are currently being supported with security updates: | Version | Supported | | ------- | ------------------ | @@ -11,18 +13,49 @@ currently being supported with security updates: | 18.x | :x: | | 19.x | :x: | | 20.1 | :x: | -| 20.3 | :white_check_mark: | +| 20.3 | :x: | | 20.4 | :x: | | 20.5 | :x: | | 20.6 | :x: | | 20.7 | :x: | -| 20.8 | :white_check_mark: | +| 20.8 | :x: | | 20.9 | :x: | | 20.10 | :x: | -| 20.11 | :white_check_mark: | -| 20.12 | :white_check_mark: | -| 21.1 | :white_check_mark: | +| 20.11 | :x: | +| 20.12 | :x: | +| 21.1 | :x: | +| 21.2 | :x: | +| 21.3 | ✅ | +| 21.4 | :x: | +| 21.5 | :x: | +| 21.6 | ✅ | +| 21.7 | ✅ | +| 21.8 | ✅ | ## Reporting a Vulnerability +We're extremely grateful for security researchers and users that report vulnerabilities to the ClickHouse Open Source Community. All reports are thoroughly investigated by developers. + To report a potential vulnerability in ClickHouse please send the details about it to [clickhouse-feedback@yandex-team.com](mailto:clickhouse-feedback@yandex-team.com). + +### When Should I Report a Vulnerability? + +- You think you discovered a potential security vulnerability in ClickHouse +- You are unsure how a vulnerability affects ClickHouse + +### When Should I NOT Report a Vulnerability? + +- You need help tuning ClickHouse components for security +- You need help applying security related updates +- Your issue is not security related + +## Security Vulnerability Response + +Each report is acknowledged and analyzed by ClickHouse maintainers within 5 working days. +As the security issue moves from triage, to identified fix, to release planning we will keep the reporter updated. + +## Public Disclosure Timing + +A public disclosure date is negotiated by the ClickHouse maintainers and the bug submitter. We prefer to fully disclose the bug as soon as possible once a user mitigation is available. It is reasonable to delay disclosure when the bug or the fix is not yet fully understood, the solution is not well-tested, or for vendor coordination. The timeframe for disclosure is from immediate (especially if it's already publicly known) to 90 days. For a vulnerability with a straightforward mitigation, we expect report date to disclosure date to be on the order of 7 days. + + diff --git a/base/common/insertAtEnd.h b/base/common/insertAtEnd.h new file mode 100644 index 00000000000..c4fef664511 --- /dev/null +++ b/base/common/insertAtEnd.h @@ -0,0 +1,28 @@ +#pragma once + +#include + +/// Appends a specified vector with elements of another vector. +template +void insertAtEnd(std::vector & dest, const std::vector & src) +{ + if (src.empty()) + return; + dest.reserve(dest.size() + src.size()); + dest.insert(dest.end(), src.begin(), src.end()); +} + +template +void insertAtEnd(std::vector & dest, std::vector && src) +{ + if (src.empty()) + return; + if (dest.empty()) + { + dest.swap(src); + return; + } + dest.reserve(dest.size() + src.size()); + dest.insert(dest.end(), std::make_move_iterator(src.begin()), std::make_move_iterator(src.end())); + src.clear(); +} diff --git a/base/common/unit.h b/base/common/unit.h new file mode 100644 index 00000000000..d5c8d5c9027 --- /dev/null +++ b/base/common/unit.h @@ -0,0 +1,10 @@ +#pragma once +#include + +constexpr size_t KiB = 1024; +constexpr size_t MiB = 1024 * KiB; +constexpr size_t GiB = 1024 * MiB; + +constexpr size_t operator"" _KiB(unsigned long long val) { return val * KiB; } +constexpr size_t operator"" _MiB(unsigned long long val) { return val * MiB; } +constexpr size_t operator"" _GiB(unsigned long long val) { return val * GiB; } diff --git a/base/common/wide_integer_impl.h b/base/common/wide_integer_impl.h index d2ef8b22d65..b8de5efb859 100644 --- a/base/common/wide_integer_impl.h +++ b/base/common/wide_integer_impl.h @@ -9,6 +9,7 @@ #include #include #include +#include #include @@ -39,6 +40,18 @@ static constexpr bool IntegralConcept() noexcept return std::is_integral_v || IsWideInteger::value; } +template +class IsTupleLike +{ + template + static auto check(U * p) -> decltype(std::tuple_size::value, int()); + template + static void check(...); + +public: + static constexpr const bool value = !std::is_void(nullptr))>::value; +}; + } namespace std @@ -152,7 +165,7 @@ namespace wide template struct integer::_impl { - static constexpr size_t _Bits = Bits; + static constexpr size_t _bits = Bits; static constexpr const unsigned byte_count = Bits / 8; static constexpr const unsigned item_count = byte_count / sizeof(base_type); static constexpr const unsigned base_bits = sizeof(base_type) * 8; @@ -227,6 +240,19 @@ struct integer::_impl self.items[i] = 0; } + template + constexpr static void wide_integer_from_tuple_like(integer & self, const TupleLike & tuple) noexcept + { + if constexpr (i < item_count) + { + if constexpr (i < std::tuple_size_v) + self.items[i] = std::get(tuple); + else + self.items[i] = 0; + wide_integer_from_tuple_like(self, tuple); + } + } + /** * N.B. t is constructed from double, so max(t) = max(double) ~ 2^310 * the recursive call happens when t / 2^64 > 2^64, so there won't be more than 5 of them. @@ -614,8 +640,8 @@ public: else { static_assert(IsWideInteger::value); - return std::common_type_t, integer>::_impl::operator_plus( - integer(lhs), rhs); + return std::common_type_t, integer>::_impl::operator_plus( + integer(lhs), rhs); } } @@ -632,8 +658,8 @@ public: else { static_assert(IsWideInteger::value); - return std::common_type_t, integer>::_impl::operator_minus( - integer(lhs), rhs); + return std::common_type_t, integer>::_impl::operator_minus( + integer(lhs), rhs); } } @@ -857,7 +883,7 @@ public: else { static_assert(IsWideInteger::value); - return std::common_type_t, integer>::operator_slash(T(lhs), rhs); + return std::common_type_t, integer>::operator_slash(T(lhs), rhs); } } @@ -877,7 +903,7 @@ public: else { static_assert(IsWideInteger::value); - return std::common_type_t, integer>::operator_percent(T(lhs), rhs); + return std::common_type_t, integer>::operator_percent(T(lhs), rhs); } } @@ -966,6 +992,8 @@ constexpr integer::integer(T rhs) noexcept { if constexpr (IsWideInteger::value) _impl::wide_integer_from_wide_integer(*this, rhs); + else if constexpr (IsTupleLike::value) + _impl::wide_integer_from_tuple_like(*this, rhs); else _impl::wide_integer_from_builtin(*this, rhs); } @@ -979,6 +1007,8 @@ constexpr integer::integer(std::initializer_list il) noexcept { if constexpr (IsWideInteger::value) _impl::wide_integer_from_wide_integer(*this, *il.begin()); + else if constexpr (IsTupleLike::value) + _impl::wide_integer_from_tuple_like(*this, *il.begin()); else _impl::wide_integer_from_builtin(*this, *il.begin()); } @@ -1007,7 +1037,10 @@ template template constexpr integer & integer::operator=(T rhs) noexcept { - _impl::wide_integer_from_builtin(*this, rhs); + if constexpr (IsTupleLike::value) + _impl::wide_integer_from_tuple_like(*this, rhs); + else + _impl::wide_integer_from_builtin(*this, rhs); return *this; } diff --git a/base/daemon/SentryWriter.cpp b/base/daemon/SentryWriter.cpp index 3571c64edd6..470e1deb362 100644 --- a/base/daemon/SentryWriter.cpp +++ b/base/daemon/SentryWriter.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #if !defined(ARCADIA_BUILD) # include "Common/config_version.h" @@ -38,6 +39,13 @@ void setExtras() if (!anonymize) sentry_set_extra("server_name", sentry_value_new_string(getFQDNOrHostName().c_str())); + DB::UUID server_uuid = DB::ServerUUID::get(); + if (server_uuid != DB::UUIDHelpers::Nil) + { + std::string server_uuid_str = DB::toString(server_uuid); + sentry_set_extra("server_uuid", sentry_value_new_string(server_uuid_str.c_str())); + } + sentry_set_tag("version", VERSION_STRING); sentry_set_extra("version_githash", sentry_value_new_string(VERSION_GITHASH)); sentry_set_extra("version_describe", sentry_value_new_string(VERSION_DESCRIBE)); 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/base/mysqlxx/PoolWithFailover.cpp b/base/mysqlxx/PoolWithFailover.cpp index e317ab7f228..f449708dc46 100644 --- a/base/mysqlxx/PoolWithFailover.cpp +++ b/base/mysqlxx/PoolWithFailover.cpp @@ -80,7 +80,9 @@ PoolWithFailover::PoolWithFailover( const std::string & password, unsigned default_connections_, unsigned max_connections_, - size_t max_tries_) + size_t max_tries_, + size_t connect_timeout, + size_t rw_timeout) : max_tries(max_tries_) , shareable(false) { @@ -90,8 +92,8 @@ PoolWithFailover::PoolWithFailover( replicas_by_priority[0].emplace_back(std::make_shared(database, host, user, password, port, /* socket_ = */ "", - MYSQLXX_DEFAULT_TIMEOUT, - MYSQLXX_DEFAULT_RW_TIMEOUT, + connect_timeout, + rw_timeout, default_connections_, max_connections_)); } @@ -130,7 +132,6 @@ PoolWithFailover::Entry PoolWithFailover::get() for (size_t try_no = 0; try_no < max_tries; ++try_no) { full_pool = nullptr; - for (auto & priority_replicas : replicas_by_priority) { Replicas & replicas = priority_replicas.second; diff --git a/base/mysqlxx/PoolWithFailover.h b/base/mysqlxx/PoolWithFailover.h index 1c7a63e76c0..e3c5ebe76e1 100644 --- a/base/mysqlxx/PoolWithFailover.h +++ b/base/mysqlxx/PoolWithFailover.h @@ -117,7 +117,9 @@ namespace mysqlxx const std::string & password, unsigned default_connections_ = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_START_CONNECTIONS, unsigned max_connections_ = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_CONNECTIONS, - size_t max_tries_ = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_TRIES); + size_t max_tries_ = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_TRIES, + size_t connect_timeout = MYSQLXX_DEFAULT_TIMEOUT, + size_t rw_timeout = MYSQLXX_DEFAULT_RW_TIMEOUT); PoolWithFailover(const PoolWithFailover & other); 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 18072566d04..03247b4b3ea 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 54454) +SET(VERSION_REVISION 54455) SET(VERSION_MAJOR 21) -SET(VERSION_MINOR 9) +SET(VERSION_MINOR 10) SET(VERSION_PATCH 1) -SET(VERSION_GITHASH f48c5af90c2ad51955d1ee3b6b05d006b03e4238) -SET(VERSION_DESCRIBE v21.9.1.1-prestable) -SET(VERSION_STRING 21.9.1.1) +SET(VERSION_GITHASH 09df5018f95edcd0f759d4689ac5d029dd400c2a) +SET(VERSION_DESCRIBE v21.10.1.1-testing) +SET(VERSION_STRING 21.10.1.1) # end of autochange diff --git a/cmake/git_status.cmake b/cmake/git_status.cmake new file mode 100644 index 00000000000..8748aacfedd --- /dev/null +++ b/cmake/git_status.cmake @@ -0,0 +1,17 @@ +# Print the status of the git repository (if git is available). +# This is useful for troubleshooting build failure reports +find_package(Git) + +if (Git_FOUND) + execute_process( + COMMAND ${GIT_EXECUTABLE} rev-parse HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_COMMIT_ID + OUTPUT_STRIP_TRAILING_WHITESPACE) + message(STATUS "HEAD's commit hash ${GIT_COMMIT_ID}") + execute_process( + COMMAND ${GIT_EXECUTABLE} status + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) +else() + message(STATUS "The git program could not be found.") +endif() diff --git a/contrib/arrow-cmake/CMakeLists.txt b/contrib/arrow-cmake/CMakeLists.txt index 2c72055a3e7..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" diff --git a/contrib/croaring-cmake/CMakeLists.txt b/contrib/croaring-cmake/CMakeLists.txt index 84cdccedbd3..3d327d068c1 100644 --- a/contrib/croaring-cmake/CMakeLists.txt +++ b/contrib/croaring-cmake/CMakeLists.txt @@ -27,13 +27,12 @@ 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) + -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/jemalloc-cmake/CMakeLists.txt b/contrib/jemalloc-cmake/CMakeLists.txt index 9531a5a4f9e..30dd3baa55b 100644 --- a/contrib/jemalloc-cmake/CMakeLists.txt +++ b/contrib/jemalloc-cmake/CMakeLists.txt @@ -139,9 +139,5 @@ target_compile_options(jemalloc PRIVATE -Wno-redundant-decls) target_compile_options(jemalloc PRIVATE -D_GNU_SOURCE) set_property(TARGET jemalloc APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS USE_JEMALLOC=1) -if (MAKE_STATIC_LIBRARIES) - # To detect whether we need to register jemalloc for osx as default zone. - set_property(TARGET jemalloc APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS BUNDLED_STATIC_JEMALLOC=1) -endif() message (STATUS "Using jemalloc") 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/libpqxx-cmake/CMakeLists.txt b/contrib/libpqxx-cmake/CMakeLists.txt index ae35538ccf4..65fa94cb3fd 100644 --- a/contrib/libpqxx-cmake/CMakeLists.txt +++ b/contrib/libpqxx-cmake/CMakeLists.txt @@ -22,6 +22,7 @@ set (SRCS "${LIBRARY_DIR}/src/transaction.cxx" "${LIBRARY_DIR}/src/transaction_base.cxx" "${LIBRARY_DIR}/src/row.cxx" + "${LIBRARY_DIR}/src/params.cxx" "${LIBRARY_DIR}/src/util.cxx" "${LIBRARY_DIR}/src/version.cxx" ) @@ -31,6 +32,7 @@ set (SRCS # conflicts with all includes of . set (HDRS "${LIBRARY_DIR}/include/pqxx/array.hxx" + "${LIBRARY_DIR}/include/pqxx/params.hxx" "${LIBRARY_DIR}/include/pqxx/binarystring.hxx" "${LIBRARY_DIR}/include/pqxx/composite.hxx" "${LIBRARY_DIR}/include/pqxx/connection.hxx" @@ -75,4 +77,3 @@ set(CM_CONFIG_PQ "${LIBRARY_DIR}/include/pqxx/config-internal-libpq.h") configure_file("${CM_CONFIG_H_IN}" "${CM_CONFIG_INT}" @ONLY) configure_file("${CM_CONFIG_H_IN}" "${CM_CONFIG_PUB}" @ONLY) configure_file("${CM_CONFIG_H_IN}" "${CM_CONFIG_PQ}" @ONLY) - diff --git a/contrib/librdkafka b/contrib/librdkafka index 43491d33ca2..b8554f16820 160000 --- a/contrib/librdkafka +++ b/contrib/librdkafka @@ -1 +1 @@ -Subproject commit 43491d33ca2826531d1e3cae70d4bf1e5249e3c9 +Subproject commit b8554f1682062c85ba519eb54ef2f90e02b812cb diff --git a/contrib/libunwind b/contrib/libunwind index 6b816d2fba3..c4ea9848a69 160000 --- a/contrib/libunwind +++ b/contrib/libunwind @@ -1 +1 @@ -Subproject commit 6b816d2fba3991f8fd6aaec17d92f68947eab667 +Subproject commit c4ea9848a697747dfa35325af9b3452f30841685 diff --git a/contrib/nanodbc b/contrib/nanodbc index 9fc45967551..df52a1232df 160000 --- a/contrib/nanodbc +++ b/contrib/nanodbc @@ -1 +1 @@ -Subproject commit 9fc459675515d491401727ec67fca38db721f28c +Subproject commit df52a1232dfa182f9af60974d001b91823afe9bc diff --git a/contrib/replxx b/contrib/replxx index c81be6c68b1..f97765df14f 160000 --- a/contrib/replxx +++ b/contrib/replxx @@ -1 +1 @@ -Subproject commit c81be6c68b146f15f2096b7ef80e3f21fe27004c +Subproject commit f97765df14f4a6236d69b8f14b53ef2051ebd95a diff --git a/debian/changelog b/debian/changelog index 38f740ae062..f3e740d20cf 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,5 @@ -clickhouse (21.9.1.1) unstable; urgency=low +clickhouse (21.10.1.1) unstable; urgency=low * Modified source code - -- clickhouse-release Sat, 10 Jul 2021 08:22:49 +0300 + -- clickhouse-release Sat, 17 Jul 2021 08:45:03 +0300 diff --git a/docker/builder/Dockerfile b/docker/builder/Dockerfile index 199b5217d79..abe102e9c80 100644 --- a/docker/builder/Dockerfile +++ b/docker/builder/Dockerfile @@ -2,6 +2,8 @@ FROM ubuntu:20.04 ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=11 +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update \ && apt-get install ca-certificates lsb-release wget gnupg apt-transport-https \ --yes --no-install-recommends --verbose-versions \ diff --git a/docker/client/Dockerfile b/docker/client/Dockerfile index f17fa8ade16..1b398b43c32 100644 --- a/docker/client/Dockerfile +++ b/docker/client/Dockerfile @@ -1,7 +1,9 @@ FROM ubuntu:18.04 ARG repository="deb https://repo.clickhouse.tech/deb/stable/ main/" -ARG version=21.9.1.* +ARG version=21.10.1.* + +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list RUN apt-get update \ && apt-get install --yes --no-install-recommends \ diff --git a/docker/packager/binary/Dockerfile b/docker/packager/binary/Dockerfile index 29225bbfeb8..0393669df48 100644 --- a/docker/packager/binary/Dockerfile +++ b/docker/packager/binary/Dockerfile @@ -3,6 +3,8 @@ FROM ubuntu:20.04 ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=11 +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update \ && apt-get install \ apt-transport-https \ diff --git a/docker/packager/binary/build.sh b/docker/packager/binary/build.sh index d6614bbb9e2..b9900e34bf1 100755 --- a/docker/packager/binary/build.sh +++ b/docker/packager/binary/build.sh @@ -83,6 +83,16 @@ then mv "$COMBINED_OUTPUT.tgz" /output fi +# Also build fuzzers if any sanitizer specified +if [ -n "$SANITIZER" ] +then + # Currently we are in build/build_docker directory + ../docker/packager/other/fuzzer.sh +fi + +ccache --show-config ||: +ccache --show-stats ||: + if [ "${CCACHE_DEBUG:-}" == "1" ] then find . -name '*.ccache-*' -print0 \ @@ -95,4 +105,3 @@ then # files in place, and will fail because this directory is not writable. tar -cv -I pixz -f /output/ccache.log.txz "$CCACHE_LOGFILE" fi - diff --git a/docker/packager/deb/Dockerfile b/docker/packager/deb/Dockerfile index 241b691cd23..294c8645455 100644 --- a/docker/packager/deb/Dockerfile +++ b/docker/packager/deb/Dockerfile @@ -3,6 +3,8 @@ FROM ubuntu:20.04 ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=11 +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update \ && apt-get install ca-certificates lsb-release wget gnupg apt-transport-https \ --yes --no-install-recommends --verbose-versions \ diff --git a/docker/packager/deb/build.sh b/docker/packager/deb/build.sh index 4e14574b738..46f6404363d 100755 --- a/docker/packager/deb/build.sh +++ b/docker/packager/deb/build.sh @@ -23,12 +23,24 @@ then echo "Place $BINARY_OUTPUT to output" mkdir /output/binary ||: # if exists mv /build/obj-*/programs/clickhouse* /output/binary + if [ "$BINARY_OUTPUT" = "tests" ] then mv /build/obj-*/src/unit_tests_dbms /output/binary fi fi +# Also build fuzzers if any sanitizer specified +if [ -n "$SANITIZER" ] +then + # Script is supposed that we are in build directory. + mkdir -p build/build_docker + cd build/build_docker + # Launching build script + ../docker/packager/other/fuzzer.sh + cd +fi + ccache --show-config ||: ccache --show-stats ||: diff --git a/docker/packager/other/fuzzer.sh b/docker/packager/other/fuzzer.sh new file mode 100755 index 00000000000..1a8b80c3f77 --- /dev/null +++ b/docker/packager/other/fuzzer.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +# This script is responsible for building all fuzzers, and copy them to output directory +# as an archive. +# Script is supposed that we are in build directory. + +set -x -e + +printenv + +# Delete previous cache, because we add a new flags -DENABLE_FUZZING=1 and -DFUZZER=libfuzzer +rm -f CMakeCache.txt +read -ra CMAKE_FLAGS <<< "${CMAKE_FLAGS:-}" +# Hope, that the most part of files will be in cache, so we just link new executables +cmake --debug-trycompile --verbose=1 -DCMAKE_VERBOSE_MAKEFILE=1 -LA -DCMAKE_C_COMPILER="$CC" -DCMAKE_CXX_COMPILER="$CXX" -DENABLE_CLICKHOUSE_ODBC_BRIDGE=OFF \ + -DENABLE_LIBRARIES=0 -DENABLE_SSL=1 -DUSE_INTERNAL_SSL_LIBRARY=1 -DUSE_UNWIND=ON -DENABLE_EMBEDDED_COMPILER=0 \ + -DENABLE_EXAMPLES=0 -DENABLE_UTILS=0 -DENABLE_THINLTO=0 "-DSANITIZE=$SANITIZER" \ + -DENABLE_FUZZING=1 -DFUZZER='libfuzzer' -DENABLE_TCMALLOC=0 -DENABLE_JEMALLOC=0 \ + -DENABLE_CHECK_HEAVY_BUILDS=1 "${CMAKE_FLAGS[@]}" .. + +FUZZER_TARGETS=$(find ../src -name '*_fuzzer.cpp' -execdir basename {} .cpp ';' | tr '\n' ' ') + +mkdir -p /output/fuzzers +for FUZZER_TARGET in $FUZZER_TARGETS +do + # shellcheck disable=SC2086 # No quotes because I want it to expand to nothing if empty. + ninja $NINJA_FLAGS $FUZZER_TARGET + # Find this binary in build directory and strip it + FUZZER_PATH=$(find ./src -name "$FUZZER_TARGET") + strip --strip-unneeded "$FUZZER_PATH" + mv "$FUZZER_PATH" /output/fuzzers +done + +tar -zcvf /output/fuzzers.tar.gz /output/fuzzers +rm -rf /output/fuzzers diff --git a/docker/packager/packager b/docker/packager/packager index c05c85d3e28..673878bce43 100755 --- a/docker/packager/packager +++ b/docker/packager/packager @@ -105,6 +105,9 @@ def parse_env_variables(build_type, compiler, sanitizer, package_type, image_typ if image_type == "deb" or image_type == "unbundled": result.append("DEB_CC={}".format(cc)) result.append("DEB_CXX={}".format(cxx)) + # For building fuzzers + result.append("CC={}".format(cc)) + result.append("CXX={}".format(cxx)) elif image_type == "binary": result.append("CC={}".format(cc)) result.append("CXX={}".format(cxx)) @@ -151,8 +154,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 07031aa2d1b..b2d9f555f19 100644 --- a/docker/packager/unbundled/Dockerfile +++ b/docker/packager/unbundled/Dockerfile @@ -5,6 +5,8 @@ RUN export CODENAME="$(lsb_release --codename --short | tr 'A-Z' 'a-z')" \ && 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 +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + # Libraries from OS are only needed to test the "unbundled" build (that is not used in production). RUN apt-get update \ && apt-get install \ diff --git a/docker/server/Dockerfile b/docker/server/Dockerfile index 5da9e703f4d..6307e74c633 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.9.1.* +ARG version=21.10.1.* ARG gosu_ver=1.10 # set non-empty deb_location_url url to create a docker image @@ -26,6 +26,8 @@ ARG DEBIAN_FRONTEND=noninteractive # installed to prevent picking those uid / gid by some unrelated software. # The same uid / gid (101) is used both for alpine and ubuntu. +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN groupadd -r clickhouse --gid=101 \ && useradd -r -g clickhouse --uid=101 --home-dir=/var/lib/clickhouse --shell=/bin/bash clickhouse \ && apt-get update \ diff --git a/docker/test/Dockerfile b/docker/test/Dockerfile index 5768753cd7c..62cfcf9e896 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.9.1.* +ARG version=21.10.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 29ac7a925b8..611ef6b7702 100644 --- a/docker/test/base/Dockerfile +++ b/docker/test/base/Dockerfile @@ -3,6 +3,8 @@ FROM ubuntu:20.04 ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=11 +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update \ && apt-get install ca-certificates lsb-release wget gnupg apt-transport-https \ --yes --no-install-recommends --verbose-versions \ diff --git a/docker/test/codebrowser/Dockerfile b/docker/test/codebrowser/Dockerfile index bb35258bed8..33173ab90f9 100644 --- a/docker/test/codebrowser/Dockerfile +++ b/docker/test/codebrowser/Dockerfile @@ -2,6 +2,8 @@ # docker run --volume=path_to_repo:/repo_folder --volume=path_to_result:/test_output yandex/clickhouse-codebrowser FROM yandex/clickhouse-binary-builder +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update && apt-get --yes --allow-unauthenticated install clang-9 libllvm9 libclang-9-dev # repo versions doesn't work correctly with C++17 diff --git a/docker/test/fasttest/Dockerfile b/docker/test/fasttest/Dockerfile index 916c94e7311..2e0bbcd350f 100644 --- a/docker/test/fasttest/Dockerfile +++ b/docker/test/fasttest/Dockerfile @@ -3,6 +3,8 @@ FROM ubuntu:20.04 ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=11 +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update \ && apt-get install ca-certificates lsb-release wget gnupg apt-transport-https \ --yes --no-install-recommends --verbose-versions \ diff --git a/docker/test/fasttest/run.sh b/docker/test/fasttest/run.sh index d0184bb1a64..00af261f6c8 100755 --- a/docker/test/fasttest/run.sh +++ b/docker/test/fasttest/run.sh @@ -303,6 +303,7 @@ function run_tests 01683_codec_encrypted # Depends on OpenSSL 01776_decrypt_aead_size_check # Depends on OpenSSL 01811_filter_by_null # Depends on OpenSSL + 02012_sha512_fixedstring # Depends on OpenSSL 01281_unsucceeded_insert_select_queries_counter 01292_create_user 01294_lazy_database_concurrent @@ -392,6 +393,12 @@ function run_tests 01853_s2_cells_intersect 01854_s2_cap_contains 01854_s2_cap_union + + # needs s3 + 01944_insert_partition_by + + # depends on Go + 02013_zlib_read_after_eof ) time clickhouse-test --hung-check -j 8 --order=random --use-skip-list \ diff --git a/docker/test/fuzzer/Dockerfile b/docker/test/fuzzer/Dockerfile index 57daba9cfd6..9a96ac1dfa7 100644 --- a/docker/test/fuzzer/Dockerfile +++ b/docker/test/fuzzer/Dockerfile @@ -5,6 +5,8 @@ ENV LANG=C.UTF-8 ENV TZ=Europe/Moscow RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install --yes --no-install-recommends \ ca-certificates \ @@ -14,6 +16,8 @@ RUN apt-get update \ p7zip-full \ parallel \ psmisc \ + python3 \ + python3-pip \ rsync \ tree \ tzdata \ @@ -23,6 +27,8 @@ RUN apt-get update \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* +RUN pip3 install Jinja2 + COPY * / SHELL ["/bin/bash", "-c"] diff --git a/docker/test/fuzzer/generate-test-j2.py b/docker/test/fuzzer/generate-test-j2.py new file mode 100755 index 00000000000..bcc1bf6bc84 --- /dev/null +++ b/docker/test/fuzzer/generate-test-j2.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 + +from argparse import ArgumentParser +import os +import jinja2 + + +def removesuffix(text, suffix): + """ + Added in python 3.9 + https://www.python.org/dev/peps/pep-0616/ + """ + if suffix and text.endswith(suffix): + return text[:-len(suffix)] + else: + return text[:] + + +def render_test_template(j2env, suite_dir, test_name): + """ + Render template for test and reference file if needed + """ + + test_base_name = removesuffix(test_name, ".sql.j2") + + 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 main(args): + suite_dir = args.path + + print(f"Scanning {suite_dir} directory...") + + j2env = jinja2.Environment( + loader=jinja2.FileSystemLoader(suite_dir), + keep_trailing_newline=True, + ) + + test_names = os.listdir(suite_dir) + for test_name in test_names: + if not test_name.endswith(".sql.j2"): + continue + new_name = render_test_template(j2env, suite_dir, test_name) + print(f"File {new_name} generated") + + +if __name__ == "__main__": + parser = ArgumentParser(description="Jinja2 test generator") + parser.add_argument("-p", "--path", help="Path to test dir", required=True) + main(parser.parse_args()) diff --git a/docker/test/fuzzer/run-fuzzer.sh b/docker/test/fuzzer/run-fuzzer.sh index 3b074ae46cd..9a389edc5b2 100755 --- a/docker/test/fuzzer/run-fuzzer.sh +++ b/docker/test/fuzzer/run-fuzzer.sh @@ -71,12 +71,12 @@ function watchdog kill -9 -- $fuzzer_pid ||: } -function filter_exists +function filter_exists_and_template { local path for path in "$@"; do if [ -e "$path" ]; then - echo "$path" + echo "$path" | sed -n 's/\.sql\.j2$/.gen.sql/' else echo "'$path' does not exists" >&2 fi @@ -85,11 +85,13 @@ function filter_exists function fuzz { + /generate-test-j2.py --path ch/tests/queries/0_stateless + # Obtain the list of newly added tests. They will be fuzzed in more extreme way than other tests. # Don't overwrite the NEW_TESTS_OPT so that it can be set from the environment. - NEW_TESTS="$(sed -n 's!\(^tests/queries/0_stateless/.*\.sql\)$!ch/\1!p' ci-changed-files.txt | sort -R)" + NEW_TESTS="$(sed -n 's!\(^tests/queries/0_stateless/.*\.sql\(\.j2\)\?\)$!ch/\1!p' ci-changed-files.txt | sort -R)" # ci-changed-files.txt contains also files that has been deleted/renamed, filter them out. - NEW_TESTS="$(filter_exists $NEW_TESTS)" + NEW_TESTS="$(filter_exists_and_template $NEW_TESTS)" if [[ -n "$NEW_TESTS" ]] then NEW_TESTS_OPT="${NEW_TESTS_OPT:---interleave-queries-file ${NEW_TESTS}}" @@ -226,7 +228,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/runner/Dockerfile b/docker/test/integration/runner/Dockerfile index 6bde4ef60db..cb69a00fc63 100644 --- a/docker/test/integration/runner/Dockerfile +++ b/docker/test/integration/runner/Dockerfile @@ -1,6 +1,8 @@ # docker build -t yandex/clickhouse-integration-tests-runner . FROM ubuntu:20.04 +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update \ && env DEBIAN_FRONTEND=noninteractive apt-get install --yes \ ca-certificates \ @@ -77,8 +79,9 @@ RUN python3 -m pip install \ pytest-timeout \ pytest-xdist \ pytest-repeat \ + pytz \ redis \ - tzlocal \ + tzlocal==2.1 \ urllib3 \ requests-kerberos \ pyhdfs diff --git a/docker/test/performance-comparison/Dockerfile b/docker/test/performance-comparison/Dockerfile index 5ec048de657..1a61c4b274a 100644 --- a/docker/test/performance-comparison/Dockerfile +++ b/docker/test/performance-comparison/Dockerfile @@ -5,6 +5,8 @@ ENV LANG=C.UTF-8 ENV TZ=Europe/Moscow RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install --yes --no-install-recommends \ bash \ diff --git a/docker/test/performance-comparison/compare.sh b/docker/test/performance-comparison/compare.sh index a6e1ee482d6..c97e8a6ed2b 100755 --- a/docker/test/performance-comparison/compare.sh +++ b/docker/test/performance-comparison/compare.sh @@ -641,6 +641,7 @@ create view partial_query_times as select * from -- Report for partial queries that we could only run on the new server (e.g. -- queries with new functions added in the tested PR). create table partial_queries_report engine File(TSV, 'report/partial-queries-report.tsv') + settings output_format_decimal_trailing_zeros = 1 as select toDecimal64(time_median, 3) time, toDecimal64(time_stddev / time_median, 3) relative_time_stddev, test, query_index, query_display_name @@ -713,8 +714,9 @@ create table queries engine File(TSVWithNamesAndTypes, 'report/queries.tsv') order by test, query_index, metric_name ; -create table changed_perf_report engine File(TSV, 'report/changed-perf.tsv') as - with +create table changed_perf_report engine File(TSV, 'report/changed-perf.tsv') + settings output_format_decimal_trailing_zeros = 1 + as with -- server_time is sometimes reported as zero (if it's less than 1 ms), -- so we have to work around this to not get an error about conversion -- of NaN to decimal. @@ -730,8 +732,9 @@ create table changed_perf_report engine File(TSV, 'report/changed-perf.tsv') as changed_fail, test, query_index, query_display_name from queries where changed_show order by abs(diff) desc; -create table unstable_queries_report engine File(TSV, 'report/unstable-queries.tsv') as - select +create table unstable_queries_report engine File(TSV, 'report/unstable-queries.tsv') + settings output_format_decimal_trailing_zeros = 1 + as select toDecimal64(left, 3), toDecimal64(right, 3), toDecimal64(diff, 3), toDecimal64(stat_threshold, 3), unstable_fail, test, query_index, query_display_name from queries where unstable_show order by stat_threshold desc; @@ -761,8 +764,9 @@ create view total_speedup as from test_speedup ; -create table test_perf_changes_report engine File(TSV, 'report/test-perf-changes.tsv') as - with +create table test_perf_changes_report engine File(TSV, 'report/test-perf-changes.tsv') + settings output_format_decimal_trailing_zeros = 1 + as with (times_speedup >= 1 ? '-' || toString(toDecimal64(times_speedup, 3)) || 'x' : '+' || toString(toDecimal64(1 / times_speedup, 3)) || 'x') @@ -788,8 +792,9 @@ create view total_client_time_per_query as select * from file('analyze/client-times.tsv', TSV, 'test text, query_index int, client float, server float'); -create table slow_on_client_report engine File(TSV, 'report/slow-on-client.tsv') as - select client, server, toDecimal64(client/server, 3) p, +create table slow_on_client_report engine File(TSV, 'report/slow-on-client.tsv') + settings output_format_decimal_trailing_zeros = 1 + as select client, server, toDecimal64(client/server, 3) p, test, query_display_name from total_client_time_per_query left join query_display_names using (test, query_index) where p > toDecimal64(1.02, 3) order by p desc; @@ -874,8 +879,9 @@ create view test_times_view_total as from test_times_view ; -create table test_times_report engine File(TSV, 'report/test-times.tsv') as - select +create table test_times_report engine File(TSV, 'report/test-times.tsv') + settings output_format_decimal_trailing_zeros = 1 + as select test, toDecimal64(real, 3), toDecimal64(total_client_time, 3), @@ -893,8 +899,9 @@ create table test_times_report engine File(TSV, 'report/test-times.tsv') as ; -- report for all queries page, only main metric -create table all_tests_report engine File(TSV, 'report/all-queries.tsv') as - with +create table all_tests_report engine File(TSV, 'report/all-queries.tsv') + settings output_format_decimal_trailing_zeros = 1 + as with -- server_time is sometimes reported as zero (if it's less than 1 ms), -- so we have to work around this to not get an error about conversion -- of NaN to decimal. @@ -1057,9 +1064,10 @@ create table unstable_run_traces engine File(TSVWithNamesAndTypes, ; create table metric_devation engine File(TSVWithNamesAndTypes, - 'report/metric-deviation.$version.tsv') as + 'report/metric-deviation.$version.tsv') + settings output_format_decimal_trailing_zeros = 1 -- first goes the key used to split the file with grep - select test, query_index, query_display_name, + as select test, query_index, query_display_name, toDecimal64(d, 3) d, q, metric from ( select @@ -1187,8 +1195,9 @@ create table metrics engine File(TSV, 'metrics/metrics.tsv') as ; -- Show metrics that have changed -create table changes engine File(TSV, 'metrics/changes.tsv') as - select metric, left, right, +create table changes engine File(TSV, 'metrics/changes.tsv') + settings output_format_decimal_trailing_zeros = 1 + as select metric, left, right, toDecimal64(diff, 3), toDecimal64(times_diff, 3) from ( select metric, median(left) as left, median(right) as right, diff --git a/docker/test/performance-comparison/download.sh b/docker/test/performance-comparison/download.sh index bd72547ec1c..49323c28700 100755 --- a/docker/test/performance-comparison/download.sh +++ b/docker/test/performance-comparison/download.sh @@ -13,7 +13,7 @@ left_sha=$2 # right_pr=$3 not used for now right_sha=$4 -datasets=${CHPC_DATASETS:-"hits1 hits10 hits100 values"} +datasets=${CHPC_DATASETS-"hits1 hits10 hits100 values"} declare -A dataset_paths dataset_paths["hits10"]="https://s3.mds.yandex.net/clickhouse-private-datasets/hits_10m_single/partitions/hits_10m_single.tar" diff --git a/docker/test/performance-comparison/entrypoint.sh b/docker/test/performance-comparison/entrypoint.sh index 614debce1c1..1295e5567fb 100755 --- a/docker/test/performance-comparison/entrypoint.sh +++ b/docker/test/performance-comparison/entrypoint.sh @@ -127,6 +127,15 @@ export PATH export REF_PR export REF_SHA +# Try to collect some core dumps. I've seen two patterns in Sandbox: +# 1) |/home/zomb-sandbox/venv/bin/python /home/zomb-sandbox/client/sandbox/bin/coredumper.py %e %p %g %u %s %P %c +# Not sure what this script does (puts them to sandbox resources, logs some messages?), +# and it's not accessible from inside docker anyway. +# 2) something like %e.%p.core.dmp. The dump should end up in the workspace directory. +# At least we remove the ulimit and then try to pack some common file names into output. +ulimit -c unlimited +cat /proc/sys/kernel/core_pattern + # Start the main comparison script. { \ time ../download.sh "$REF_PR" "$REF_SHA" "$PR_TO_TEST" "$SHA_TO_TEST" && \ @@ -144,8 +153,11 @@ done dmesg -T > dmesg.log +ls -lath + 7z a '-x!*/tmp' /output/output.7z ./*.{log,tsv,html,txt,rep,svg,columns} \ {right,left}/{performance,scripts} {{right,left}/db,db0}/preprocessed_configs \ - report analyze benchmark metrics + report analyze benchmark metrics \ + ./*.core.dmp ./*.core cp compare.log /output diff --git a/docker/test/sqlancer/Dockerfile b/docker/test/sqlancer/Dockerfile index 253ca1b729a..67236402352 100644 --- a/docker/test/sqlancer/Dockerfile +++ b/docker/test/sqlancer/Dockerfile @@ -1,6 +1,8 @@ # docker build -t yandex/clickhouse-sqlancer-test . FROM ubuntu:20.04 +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update --yes && env DEBIAN_FRONTEND=noninteractive apt-get install wget unzip git openjdk-14-jdk maven python3 --yes --no-install-recommends RUN wget https://github.com/sqlancer/sqlancer/archive/master.zip -O /sqlancer.zip RUN mkdir /sqlancer && \ diff --git a/docker/test/stateless/Dockerfile b/docker/test/stateless/Dockerfile index f5fa86a6f33..39c8a2e5358 100644 --- a/docker/test/stateless/Dockerfile +++ b/docker/test/stateless/Dockerfile @@ -24,6 +24,8 @@ RUN apt-get update -y \ python3-pip \ qemu-user-static \ sudo \ + # golang version 1.13 on Ubuntu 20 is enough for tests + golang \ telnet \ tree \ unixodbc \ diff --git a/docker/test/style/Dockerfile b/docker/test/style/Dockerfile index 86595a77a54..c0b3b0102cf 100644 --- a/docker/test/style/Dockerfile +++ b/docker/test/style/Dockerfile @@ -1,6 +1,8 @@ # docker build -t yandex/clickhouse-style-test . FROM ubuntu:20.04 +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update && env DEBIAN_FRONTEND=noninteractive apt-get install --yes \ shellcheck \ libxml2-utils \ diff --git a/docker/test/testflows/runner/Dockerfile b/docker/test/testflows/runner/Dockerfile index 264b98c669d..81d431635b7 100644 --- a/docker/test/testflows/runner/Dockerfile +++ b/docker/test/testflows/runner/Dockerfile @@ -1,6 +1,8 @@ # docker build -t yandex/clickhouse-testflows-runner . FROM ubuntu:20.04 +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update \ && env DEBIAN_FRONTEND=noninteractive apt-get install --yes \ ca-certificates \ @@ -35,7 +37,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.7.20 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==2.1 pytz python-dateutil numpy ENV DOCKER_CHANNEL stable ENV DOCKER_VERSION 20.10.6 diff --git a/docs/en/development/contrib.md b/docs/en/development/contrib.md index 9daf6148324..803212330dd 100644 --- a/docs/en/development/contrib.md +++ b/docs/en/development/contrib.md @@ -5,6 +5,86 @@ toc_title: Third-Party Libraries Used # Third-Party Libraries Used {#third-party-libraries-used} +The list of third-party libraries: + +| Library name | License type | +|:-|:-| +| abseil-cpp | [Apache](https://github.com/ClickHouse-Extras/abseil-cpp/blob/4f3b686f86c3ebaba7e4e926e62a79cb1c659a54/LICENSE) | +| AMQP-CPP | [Apache](https://github.com/ClickHouse-Extras/AMQP-CPP/blob/1a6c51f4ac51ac56610fa95081bd2f349911375a/LICENSE) | +| arrow | [Apache](https://github.com/ClickHouse-Extras/arrow/blob/078e21bad344747b7656ef2d7a4f7410a0a303eb/LICENSE.txt) | +| avro | [Apache](https://github.com/ClickHouse-Extras/avro/blob/e43c46e87fd32eafdc09471e95344555454c5ef8/LICENSE.txt) | +| aws | [Apache](https://github.com/ClickHouse-Extras/aws-sdk-cpp/blob/7d48b2c8193679cc4516e5bd68ae4a64b94dae7d/LICENSE.txt) | +| aws-c-common | [Apache](https://github.com/ClickHouse-Extras/aws-c-common/blob/736a82d1697c108b04a277e66438a7f4e19b6857/LICENSE) | +| aws-c-event-stream | [Apache](https://github.com/ClickHouse-Extras/aws-c-event-stream/blob/3bc33662f9ccff4f4cbcf9509cc78c26e022fde0/LICENSE) | +| aws-checksums | [Apache](https://github.com/ClickHouse-Extras/aws-checksums/blob/519d6d9093819b6cf89ffff589a27ef8f83d0f65/LICENSE) | +| base64 | [BSD 2-clause](https://github.com/ClickHouse-Extras/Turbo-Base64/blob/af9b331f2b4f30b41c70f3a571ff904a8251c1d3/LICENSE) | +| boost | [Boost](https://github.com/ClickHouse-Extras/boost/blob/9cf09dbfd55a5c6202dedbdf40781a51b02c2675/LICENSE_1_0.txt) | +| boringssl | [BSD](https://github.com/ClickHouse-Extras/boringssl/blob/a6a2e2ab3e44d97ce98e51c558e989f211de7eb3/LICENSE) | +| brotli | [MIT](https://github.com/google/brotli/blob/63be8a99401992075c23e99f7c84de1c653e39e2/LICENSE) | +| capnproto | [MIT](https://github.com/capnproto/capnproto/blob/a00ccd91b3746ef2ab51d40fe3265829949d1ace/LICENSE) | +| cassandra | [Apache](https://github.com/ClickHouse-Extras/cpp-driver/blob/eb9b68dadbb4417a2c132ad4a1c2fa76e65e6fc1/LICENSE.txt) | +| cctz | [Apache](https://github.com/ClickHouse-Extras/cctz/blob/c0f1bcb97fd2782f7c3f972fadd5aad5affac4b8/LICENSE.txt) | +| cityhash102 | [MIT](https://github.com/ClickHouse/ClickHouse/blob/master/contrib/cityhash102/COPYING) | +| cppkafka | [BSD 2-clause](https://github.com/mfontanini/cppkafka/blob/5a119f689f8a4d90d10a9635e7ee2bee5c127de1/LICENSE) | +| croaring | [Apache](https://github.com/RoaringBitmap/CRoaring/blob/2c867e9f9c9e2a3a7032791f94c4c7ae3013f6e0/LICENSE) | +| curl | [Apache](https://github.com/curl/curl/blob/3b8bbbbd1609c638a3d3d0acb148a33dedb67be3/docs/LICENSE-MIXING.md) | +| cyrus-sasl | [BSD 2-clause](https://github.com/ClickHouse-Extras/cyrus-sasl/blob/e6466edfd638cc5073debe941c53345b18a09512/COPYING) | +| double-conversion | [BSD 3-clause](https://github.com/google/double-conversion/blob/cf2f0f3d547dc73b4612028a155b80536902ba02/LICENSE) | +| dragonbox | [Apache](https://github.com/ClickHouse-Extras/dragonbox/blob/923705af6fd953aa948fc175f6020b15f7359838/LICENSE-Apache2-LLVM) | +| fast_float | [Apache](https://github.com/fastfloat/fast_float/blob/7eae925b51fd0f570ccd5c880c12e3e27a23b86f/LICENSE) | +| fastops | [MIT](https://github.com/ClickHouse-Extras/fastops/blob/88752a5e03cf34639a4a37a4b41d8b463fffd2b5/LICENSE) | +| flatbuffers | [Apache](https://github.com/ClickHouse-Extras/flatbuffers/blob/eb3f827948241ce0e701516f16cd67324802bce9/LICENSE.txt) | +| fmtlib | [Unknown](https://github.com/fmtlib/fmt/blob/c108ee1d590089ccf642fc85652b845924067af2/LICENSE.rst) | +| gcem | [Apache](https://github.com/kthohr/gcem/blob/8d4f1b5d76ea8f6ff12f3f4f34cda45424556b00/LICENSE) | +| googletest | [BSD 3-clause](https://github.com/google/googletest/blob/e7e591764baba0a0c3c9ad0014430e7a27331d16/LICENSE) | +| grpc | [Apache](https://github.com/ClickHouse-Extras/grpc/blob/60c986e15cae70aade721d26badabab1f822fdd6/LICENSE) | +| h3 | [Apache](https://github.com/ClickHouse-Extras/h3/blob/c7f46cfd71fb60e2fefc90e28abe81657deff735/LICENSE) | +| hyperscan | [Boost](https://github.com/ClickHouse-Extras/hyperscan/blob/e9f08df0213fc637aac0a5bbde9beeaeba2fe9fa/LICENSE) | +| icu | [Public Domain](https://github.com/unicode-org/icu/blob/faa2f9f9e1fe74c5ed00eba371d2830134cdbea1/icu4c/LICENSE) | +| icudata | [Public Domain](https://github.com/ClickHouse-Extras/icudata/blob/f020820388e3faafb44cc643574a2d563dfde572/LICENSE) | +| jemalloc | [BSD 2-clause](https://github.com/ClickHouse-Extras/jemalloc/blob/e6891d9746143bf2cf617493d880ba5a0b9a3efd/COPYING) | +| krb5 | [MIT](https://github.com/ClickHouse-Extras/krb5/blob/5149dea4e2be0f67707383d2682b897c14631374/src/lib/gssapi/LICENSE) | +| libc-headers | [LGPL](https://github.com/ClickHouse-Extras/libc-headers/blob/a720b7105a610acbd7427eea475a5b6810c151eb/LICENSE) | +| libcpuid | [BSD 2-clause](https://github.com/ClickHouse-Extras/libcpuid/blob/8db3b8d2d32d22437f063ce692a1b9bb15e42d18/COPYING) | +| libcxx | [Apache](https://github.com/ClickHouse-Extras/libcxx/blob/2fa892f69acbaa40f8a18c6484854a6183a34482/LICENSE.TXT) | +| libcxxabi | [Apache](https://github.com/ClickHouse-Extras/libcxxabi/blob/df8f1e727dbc9e2bedf2282096fa189dc3fe0076/LICENSE.TXT) | +| libdivide | [zLib](https://github.com/ClickHouse/ClickHouse/blob/master/contrib/libdivide/LICENSE.txt) | +| libfarmhash | [MIT](https://github.com/ClickHouse/ClickHouse/blob/master/contrib/libfarmhash/COPYING) | +| libgsasl | [LGPL](https://github.com/ClickHouse-Extras/libgsasl/blob/383ee28e82f69fa16ed43b48bd9c8ee5b313ab84/LICENSE) | +| libhdfs3 | [Apache](https://github.com/ClickHouse-Extras/libhdfs3/blob/095b9d48b400abb72d967cb0539af13b1e3d90cf/LICENSE.txt) | +| libmetrohash | [Apache](https://github.com/ClickHouse/ClickHouse/blob/master/contrib/libmetrohash/LICENSE) | +| libpq | [Unknown](https://github.com/ClickHouse-Extras/libpq/blob/e071ea570f8985aa00e34f5b9d50a3cfe666327e/COPYRIGHT) | +| libpqxx | [BSD 3-clause](https://github.com/ClickHouse-Extras/libpqxx/blob/357608d11b7a1961c3fb7db2ef9a5dbb2e87da77/COPYING) | +| librdkafka | [MIT](https://github.com/ClickHouse-Extras/librdkafka/blob/b8554f1682062c85ba519eb54ef2f90e02b812cb/LICENSE.murmur2) | +| libunwind | [Apache](https://github.com/ClickHouse-Extras/libunwind/blob/6b816d2fba3991f8fd6aaec17d92f68947eab667/LICENSE.TXT) | +| libuv | [BSD](https://github.com/ClickHouse-Extras/libuv/blob/e2e9b7e9f978ce8a1367b5fe781d97d1ce9f94ab/LICENSE) | +| llvm | [Apache](https://github.com/ClickHouse-Extras/llvm/blob/e5751459412bce1391fb7a2e9bbc01e131bf72f1/llvm/LICENSE.TXT) | +| lz4 | [BSD](https://github.com/lz4/lz4/blob/f39b79fb02962a1cd880bbdecb6dffba4f754a11/LICENSE) | +| mariadb-connector-c | [LGPL](https://github.com/ClickHouse-Extras/mariadb-connector-c/blob/5f4034a3a6376416504f17186c55fe401c6d8e5e/COPYING.LIB) | +| miniselect | [Boost](https://github.com/danlark1/miniselect/blob/be0af6bd0b6eb044d1acc4f754b229972d99903a/LICENSE_1_0.txt) | +| msgpack-c | [Boost](https://github.com/msgpack/msgpack-c/blob/46684265d50b5d1b062d4c5c428ba08462844b1d/LICENSE_1_0.txt) | +| murmurhash | [Public Domain](https://github.com/ClickHouse/ClickHouse/blob/master/contrib/murmurhash/LICENSE) | +| NuRaft | [Apache](https://github.com/ClickHouse-Extras/NuRaft/blob/7ecb16844af6a9c283ad432d85ecc2e7d1544676/LICENSE) | +| openldap | [Unknown](https://github.com/ClickHouse-Extras/openldap/blob/0208811b6043ca06fda8631a5e473df1ec515ccb/LICENSE) | +| orc | [Apache](https://github.com/ClickHouse-Extras/orc/blob/0a936f6bbdb9303308973073f8623b5a8d82eae1/LICENSE) | +| poco | [Boost](https://github.com/ClickHouse-Extras/poco/blob/7351c4691b5d401f59e3959adfc5b4fa263b32da/LICENSE) | +| protobuf | [BSD 3-clause](https://github.com/ClickHouse-Extras/protobuf/blob/75601841d172c73ae6bf4ce8121f42b875cdbabd/LICENSE) | +| rapidjson | [MIT](https://github.com/ClickHouse-Extras/rapidjson/blob/c4ef90ccdbc21d5d5a628d08316bfd301e32d6fa/bin/jsonschema/LICENSE) | +| re2 | [BSD 3-clause](https://github.com/google/re2/blob/13ebb377c6ad763ca61d12dd6f88b1126bd0b911/LICENSE) | +| replxx | [BSD 3-clause](https://github.com/ClickHouse-Extras/replxx/blob/c81be6c68b146f15f2096b7ef80e3f21fe27004c/LICENSE.md) | +| rocksdb | [BSD 3-clause](https://github.com/ClickHouse-Extras/rocksdb/blob/b6480c69bf3ab6e298e0d019a07fd4f69029b26a/LICENSE.leveldb) | +| s2geometry | [Apache](https://github.com/ClickHouse-Extras/s2geometry/blob/20ea540d81f4575a3fc0aea585aac611bcd03ede/LICENSE) | +| sentry-native | [MIT](https://github.com/ClickHouse-Extras/sentry-native/blob/94644e92f0a3ff14bd35ed902a8622a2d15f7be4/LICENSE) | +| simdjson | [Apache](https://github.com/simdjson/simdjson/blob/8df32cea3359cb30120795da6020b3b73da01d38/LICENSE) | +| snappy | [Public Domain](https://github.com/google/snappy/blob/3f194acb57e0487531c96b97af61dcbd025a78a3/COPYING) | +| sparsehash-c11 | [BSD 3-clause](https://github.com/sparsehash/sparsehash-c11/blob/cf0bffaa456f23bc4174462a789b90f8b6f5f42f/LICENSE) | +| stats | [Apache](https://github.com/kthohr/stats/blob/b6dd459c10a88c7ea04693c007e9e35820c5d9ad/LICENSE) | +| thrift | [Apache](https://github.com/apache/thrift/blob/010ccf0a0c7023fea0f6bf4e4078ebdff7e61982/LICENSE) | +| unixodbc | [LGPL](https://github.com/ClickHouse-Extras/UnixODBC/blob/b0ad30f7f6289c12b76f04bfb9d466374bb32168/COPYING) | +| xz | [Public Domain](https://github.com/xz-mirror/xz/blob/869b9d1b4edd6df07f819d360d306251f8147353/COPYING) | +| zlib-ng | [zLib](https://github.com/ClickHouse-Extras/zlib-ng/blob/6a5e93b9007782115f7f7e5235dedc81c4f1facb/LICENSE.md) | +| zstd | [BSD](https://github.com/facebook/zstd/blob/a488ba114ec17ea1054b9057c26a046fc122b3b6/LICENSE) | + The list of third-party libraries can be obtained by the following query: ``` sql @@ -13,84 +93,6 @@ SELECT library_name, license_type, license_path FROM system.licenses ORDER BY li [Example](https://gh-api.clickhouse.tech/play?user=play#U0VMRUNUIGxpYnJhcnlfbmFtZSwgbGljZW5zZV90eXBlLCBsaWNlbnNlX3BhdGggRlJPTSBzeXN0ZW0ubGljZW5zZXMgT1JERVIgQlkgbGlicmFyeV9uYW1lIENPTExBVEUgJ2VuJw==) -| library_name | license_type | license_path | -|:-|:-|:-| -| abseil-cpp | Apache | /contrib/abseil-cpp/LICENSE | -| AMQP-CPP | Apache | /contrib/AMQP-CPP/LICENSE | -| arrow | Apache | /contrib/arrow/LICENSE.txt | -| avro | Apache | /contrib/avro/LICENSE.txt | -| aws | Apache | /contrib/aws/LICENSE.txt | -| aws-c-common | Apache | /contrib/aws-c-common/LICENSE | -| aws-c-event-stream | Apache | /contrib/aws-c-event-stream/LICENSE | -| aws-checksums | Apache | /contrib/aws-checksums/LICENSE | -| base64 | BSD 2-clause | /contrib/base64/LICENSE | -| boost | Boost | /contrib/boost/LICENSE_1_0.txt | -| boringssl | BSD | /contrib/boringssl/LICENSE | -| brotli | MIT | /contrib/brotli/LICENSE | -| capnproto | MIT | /contrib/capnproto/LICENSE | -| cassandra | Apache | /contrib/cassandra/LICENSE.txt | -| cctz | Apache | /contrib/cctz/LICENSE.txt | -| cityhash102 | MIT | /contrib/cityhash102/COPYING | -| cppkafka | BSD 2-clause | /contrib/cppkafka/LICENSE | -| croaring | Apache | /contrib/croaring/LICENSE | -| curl | Apache | /contrib/curl/docs/LICENSE-MIXING.md | -| cyrus-sasl | BSD 2-clause | /contrib/cyrus-sasl/COPYING | -| double-conversion | BSD 3-clause | /contrib/double-conversion/LICENSE | -| dragonbox | Apache | /contrib/dragonbox/LICENSE-Apache2-LLVM | -| fast_float | Apache | /contrib/fast_float/LICENSE | -| fastops | MIT | /contrib/fastops/LICENSE | -| flatbuffers | Apache | /contrib/flatbuffers/LICENSE.txt | -| fmtlib | Unknown | /contrib/fmtlib/LICENSE.rst | -| gcem | Apache | /contrib/gcem/LICENSE | -| googletest | BSD 3-clause | /contrib/googletest/LICENSE | -| grpc | Apache | /contrib/grpc/LICENSE | -| h3 | Apache | /contrib/h3/LICENSE | -| hyperscan | Boost | /contrib/hyperscan/LICENSE | -| icu | Public Domain | /contrib/icu/icu4c/LICENSE | -| icudata | Public Domain | /contrib/icudata/LICENSE | -| jemalloc | BSD 2-clause | /contrib/jemalloc/COPYING | -| krb5 | MIT | /contrib/krb5/src/lib/gssapi/LICENSE | -| libc-headers | LGPL | /contrib/libc-headers/LICENSE | -| libcpuid | BSD 2-clause | /contrib/libcpuid/COPYING | -| libcxx | Apache | /contrib/libcxx/LICENSE.TXT | -| libcxxabi | Apache | /contrib/libcxxabi/LICENSE.TXT | -| libdivide | zLib | /contrib/libdivide/LICENSE.txt | -| libfarmhash | MIT | /contrib/libfarmhash/COPYING | -| libgsasl | LGPL | /contrib/libgsasl/LICENSE | -| libhdfs3 | Apache | /contrib/libhdfs3/LICENSE.txt | -| libmetrohash | Apache | /contrib/libmetrohash/LICENSE | -| libpq | Unknown | /contrib/libpq/COPYRIGHT | -| libpqxx | BSD 3-clause | /contrib/libpqxx/COPYING | -| librdkafka | MIT | /contrib/librdkafka/LICENSE.murmur2 | -| libunwind | Apache | /contrib/libunwind/LICENSE.TXT | -| libuv | BSD | /contrib/libuv/LICENSE | -| llvm | Apache | /contrib/llvm/llvm/LICENSE.TXT | -| lz4 | BSD | /contrib/lz4/LICENSE | -| mariadb-connector-c | LGPL | /contrib/mariadb-connector-c/COPYING.LIB | -| miniselect | Boost | /contrib/miniselect/LICENSE_1_0.txt | -| msgpack-c | Boost | /contrib/msgpack-c/LICENSE_1_0.txt | -| murmurhash | Public Domain | /contrib/murmurhash/LICENSE | -| NuRaft | Apache | /contrib/NuRaft/LICENSE | -| openldap | Unknown | /contrib/openldap/LICENSE | -| orc | Apache | /contrib/orc/LICENSE | -| poco | Boost | /contrib/poco/LICENSE | -| protobuf | BSD 3-clause | /contrib/protobuf/LICENSE | -| rapidjson | MIT | /contrib/rapidjson/bin/jsonschema/LICENSE | -| 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 | -| sparsehash-c11 | BSD 3-clause | /contrib/sparsehash-c11/LICENSE | -| stats | Apache | /contrib/stats/LICENSE | -| thrift | Apache | /contrib/thrift/LICENSE | -| unixodbc | LGPL | /contrib/unixodbc/COPYING | -| 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. diff --git a/docs/en/engines/database-engines/index.md b/docs/en/engines/database-engines/index.md index 1d1028cbeb5..dd8959d2700 100644 --- a/docs/en/engines/database-engines/index.md +++ b/docs/en/engines/database-engines/index.md @@ -23,3 +23,5 @@ You can also use the following database engines: - [PostgreSQL](../../engines/database-engines/postgresql.md) - [Replicated](../../engines/database-engines/replicated.md) + +- [SQLite](../../engines/database-engines/sqlite.md) diff --git a/docs/en/engines/database-engines/materialized-mysql.md b/docs/en/engines/database-engines/materialized-mysql.md index ca550776d53..7e099ac3802 100644 --- a/docs/en/engines/database-engines/materialized-mysql.md +++ b/docs/en/engines/database-engines/materialized-mysql.md @@ -27,28 +27,33 @@ ENGINE = MaterializedMySQL('host:port', ['database' | database], 'user', 'passwo - `password` — User password. **Engine Settings** -- `max_rows_in_buffer` — Max rows that data is allowed to cache in memory(for single table and the cache data unable to query). when rows is exceeded, the data will be materialized. Default: `65505`. -- `max_bytes_in_buffer` — Max bytes that data is allowed to cache in memory(for single table and the cache data unable to query). when rows is exceeded, the data will be materialized. Default: `1048576`. -- `max_rows_in_buffers` — Max rows that data is allowed to cache in memory(for database and the cache data unable to query). when rows is exceeded, the data will be materialized. Default: `65505`. -- `max_bytes_in_buffers` — Max bytes that data is allowed to cache in memory(for database and the cache data unable to query). when rows is exceeded, the data will be materialized. Default: `1048576`. -- `max_flush_data_time` — Max 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 disable retry. Default: `1000`. -- `allows_query_when_mysql_lost` — Allow query materialized table when mysql is lost. Default: `0` (`false`). -``` + +- `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** +**Settings on MySQL-server Side** -For the correct work of `MaterializedMySQL`, there are few mandatory `MySQL`-side configuration settings that should be set: +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. Pay attention that while turning this mode `On` you should also specify `enforce_gtid_consistency = on`. +- `gtid_mode = on` since GTID based logging is a mandatory for providing correct `MaterializedMySQL` replication. -## Virtual columns {#virtual-columns} +!!! 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. @@ -78,13 +83,13 @@ When working with the `MaterializedMySQL` database engine, [ReplacingMergeTree]( | BLOB | [String](../../sql-reference/data-types/string.md) | | BINARY | [FixedString](../../sql-reference/data-types/fixedstring.md) | -Other types are not supported. If MySQL table contains a column of such type, ClickHouse throws exception "Unhandled data type" and stops replication. - [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 {#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: diff --git a/docs/en/engines/database-engines/replicated.md b/docs/en/engines/database-engines/replicated.md index ed8406e6a86..5ce73604207 100644 --- a/docs/en/engines/database-engines/replicated.md +++ b/docs/en/engines/database-engines/replicated.md @@ -1,3 +1,8 @@ +--- +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. diff --git a/docs/en/engines/database-engines/sqlite.md b/docs/en/engines/database-engines/sqlite.md new file mode 100644 index 00000000000..ee9db90859f --- /dev/null +++ b/docs/en/engines/database-engines/sqlite.md @@ -0,0 +1,80 @@ +--- +toc_priority: 32 +toc_title: SQLite +--- + +# SQLite {#sqlite} + +Allows to connect to [SQLite](https://www.sqlite.org/index.html) database and perform `INSERT` and `SELECT` queries to exchange data between ClickHouse and SQLite. + +## Creating a Database {#creating-a-database} + +``` sql + CREATE DATABASE sqlite_database + ENGINE = SQLite('db_path') +``` + +**Engine Parameters** + +- `db_path` — Path to a file with SQLite database. + +## Data Types Support {#data_types-support} + +| SQLite | ClickHouse | +|---------------|---------------------------------------------------------| +| INTEGER | [Int32](../../sql-reference/data-types/int-uint.md) | +| REAL | [Float32](../../sql-reference/data-types/float.md) | +| TEXT | [String](../../sql-reference/data-types/string.md) | +| BLOB | [String](../../sql-reference/data-types/string.md) | + +## Specifics and Recommendations {#specifics-and-recommendations} + +SQLite stores the entire database (definitions, tables, indices, and the data itself) as a single cross-platform file on a host machine. During writing SQLite locks the entire database file, therefore write operations are performed sequentially. Read operations can be multitasked. +SQLite does not require service management (such as startup scripts) or access control based on `GRANT` and passwords. Access control is handled by means of file-system permissions given to the database file itself. + +## Usage Example {#usage-example} + +Database in ClickHouse, connected to the SQLite: + +``` sql +CREATE DATABASE sqlite_db ENGINE = SQLite('sqlite.db'); +SHOW TABLES FROM sqlite_db; +``` + +``` text +┌──name───┐ +│ table1 │ +│ table2 │ +└─────────┘ +``` + +Shows the tables: + +``` sql +SELECT * FROM sqlite_db.table1; +``` + +``` text +┌─col1──┬─col2─┐ +│ line1 │ 1 │ +│ line2 │ 2 │ +│ line3 │ 3 │ +└───────┴──────┘ +``` +Inserting data into SQLite table from ClickHouse table: + +``` sql +CREATE TABLE clickhouse_table(`col1` String,`col2` Int16) ENGINE = MergeTree() ORDER BY col2; +INSERT INTO clickhouse_table VALUES ('text',10); +INSERT INTO sqlite_db.table1 SELECT * FROM clickhouse_table; +SELECT * FROM sqlite_db.table1; +``` + +``` text +┌─col1──┬─col2─┐ +│ line1 │ 1 │ +│ line2 │ 2 │ +│ line3 │ 3 │ +│ text │ 10 │ +└───────┴──────┘ +``` diff --git a/docs/en/engines/table-engines/integrations/index.md b/docs/en/engines/table-engines/integrations/index.md index eb1c5411e18..743d25ad616 100644 --- a/docs/en/engines/table-engines/integrations/index.md +++ b/docs/en/engines/table-engines/integrations/index.md @@ -19,3 +19,4 @@ List of supported integrations: - [EmbeddedRocksDB](../../../engines/table-engines/integrations/embedded-rocksdb.md) - [RabbitMQ](../../../engines/table-engines/integrations/rabbitmq.md) - [PostgreSQL](../../../engines/table-engines/integrations/postgresql.md) +- [SQLite](../../../engines/table-engines/integrations/sqlite.md) diff --git a/docs/en/engines/table-engines/integrations/postgresql.md b/docs/en/engines/table-engines/integrations/postgresql.md index 4c763153a36..53ab3f5088c 100644 --- a/docs/en/engines/table-engines/integrations/postgresql.md +++ b/docs/en/engines/table-engines/integrations/postgresql.md @@ -34,6 +34,7 @@ The table structure can differ from the original PostgreSQL table structure: - `user` — PostgreSQL user. - `password` — User password. - `schema` — Non-default table schema. Optional. +- `on conflict ...` — example: `ON CONFLICT DO NOTHING`. Optional. Note: adding this option will make insertion less efficient. ## Implementation Details {#implementation-details} diff --git a/docs/en/engines/table-engines/integrations/sqlite.md b/docs/en/engines/table-engines/integrations/sqlite.md new file mode 100644 index 00000000000..391f1696291 --- /dev/null +++ b/docs/en/engines/table-engines/integrations/sqlite.md @@ -0,0 +1,59 @@ +--- +toc_priority: 7 +toc_title: SQLite +--- + +# SQLite {#sqlite} + +The engine allows to import and export data to SQLite and supports queries to SQLite tables directly from ClickHouse. + +## Creating a Table {#creating-a-table} + +``` sql + CREATE TABLE [IF NOT EXISTS] [db.]table_name + ( + name1 [type1], + name2 [type2], ... + ) ENGINE = SQLite('db_path', 'table') +``` + +**Engine Parameters** + +- `db_path` — Path to SQLite file with a database. +- `table` — Name of a table in the SQLite database. + +## Usage Example {#usage-example} + +Shows a query creating the SQLite table: + +```sql +SHOW CREATE TABLE sqlite_db.table2; +``` + +``` text +CREATE TABLE SQLite.table2 +( + `col1` Nullable(Int32), + `col2` Nullable(String) +) +ENGINE = SQLite('sqlite.db','table2'); +``` + +Returns the data from the table: + +``` sql +SELECT * FROM sqlite_db.table2 ORDER BY col1; +``` + +```text +┌─col1─┬─col2──┐ +│ 1 │ text1 │ +│ 2 │ text2 │ +│ 3 │ text3 │ +└──────┴───────┘ +``` + +**See Also** + +- [SQLite](../../../engines/database-engines/sqlite.md) engine +- [sqlite](../../../sql-reference/table-functions/sqlite.md) table function \ No newline at end of file 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 0c900454cd0..ce41b288f0a 100644 --- a/docs/en/engines/table-engines/mergetree-family/mergetree.md +++ b/docs/en/engines/table-engines/mergetree-family/mergetree.md @@ -79,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. The result of sampling expression must be unsigned integer. 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. @@ -99,7 +99,9 @@ For a description of parameters, see the [CREATE query description](../../../sql - `use_minimalistic_part_header_in_zookeeper` — Storage method of the data parts headers in ZooKeeper. If `use_minimalistic_part_header_in_zookeeper=1`, then ZooKeeper stores less data. For more information, see the [setting description](../../../operations/server-configuration-parameters/settings.md#server-settings-use_minimalistic_part_header_in_zookeeper) in “Server configuration parameters”. - `min_merge_bytes_to_use_direct_io` — The minimum data volume for merge operation that is required for using direct I/O access to the storage disk. When merging data parts, ClickHouse calculates the total storage volume of all the data to be merged. If the volume exceeds `min_merge_bytes_to_use_direct_io` bytes, ClickHouse reads and writes the data to the storage disk using the direct I/O interface (`O_DIRECT` option). If `min_merge_bytes_to_use_direct_io = 0`, then direct I/O is disabled. Default value: `10 * 1024 * 1024 * 1024` bytes. - - `merge_with_ttl_timeout` — Minimum delay in seconds before repeating a merge with TTL. Default value: 86400 (1 day). + - `merge_with_ttl_timeout` — Minimum delay in seconds before repeating a merge with delete TTL. Default value: `14400` seconds (4 hours). + - `merge_with_recompression_ttl_timeout` — Minimum delay in seconds before repeating a merge with recompression TTL. Default value: `14400` seconds (4 hours). + - `try_fetch_recompressed_part_timeout` — Timeout (in seconds) before starting merge with recompression. During this time ClickHouse tries to fetch recompressed part from replica which assigned this merge with recompression. Default value: `7200` seconds (2 hours). - `write_final_mark` — Enables or disables writing the final index mark at the end of data part (after the last byte). Default value: 1. Don’t turn it off. - `merge_max_block_size` — Maximum number of rows in block for merge operations. Default value: 8192. - `storage_policy` — Storage policy. See [Using Multiple Block Devices for Data Storage](#table_engine-mergetree-multiple-volumes). @@ -333,7 +335,7 @@ SELECT count() FROM table WHERE u64 * i32 == 10 AND u64 * length(s) >= 1234 The optional `false_positive` parameter is the probability of receiving a false positive response from the filter. Possible values: (0, 1). Default value: 0.025. - Supported data types: `Int*`, `UInt*`, `Float*`, `Enum`, `Date`, `DateTime`, `String`, `FixedString`, `Array`, `LowCardinality`, `Nullable`. + Supported data types: `Int*`, `UInt*`, `Float*`, `Enum`, `Date`, `DateTime`, `String`, `FixedString`, `Array`, `LowCardinality`, `Nullable`, `UUID`. The following functions can use it: [equals](../../../sql-reference/functions/comparison-functions.md), [notEquals](../../../sql-reference/functions/comparison-functions.md), [in](../../../sql-reference/functions/in-functions.md), [notIn](../../../sql-reference/functions/in-functions.md), [has](../../../sql-reference/functions/array-functions.md). @@ -388,20 +390,27 @@ 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. +## Projections {#projections} +Projections are like [materialized views](../../../sql-reference/statements/create/view.md#materialized) 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: +Projections are an experimental feature. To enable them you must set the [allow_experimental_projection_optimization](../../../operations/settings/settings.md#allow-experimental-projection-optimization) to `1`. See also the [force_optimize_projection](../../../operations/settings/settings.md#force-optimize-projection) setting. -`SELECT [GROUP BY] [ORDER BY]` +Projections are not supported in the `SELECT` statements with the [FINAL](../../../sql-reference/statements/select/from.md#select-from-final) modifier. -It implicitly selects data from the parent table. +### Projection Query {#projection-query} +A projection query is what defines a projection. It implicitly selects data from the parent table. +**Syntax** -#### 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. +```sql +SELECT [GROUP BY] [ORDER BY] +``` -#### Query Analysis {#projection-query-analysis} +Projections can be modified or dropped with the [ALTER](../../../sql-reference/statements/alter/projection.md) statement. + +### Projection 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 [AggregatingMergeTree](aggregatingmergetree.md), and all aggregate functions are converted to `AggregateFunction`. If there is an `ORDER BY` clause, the `MergeTree` table uses it as its primary key expression. During the merge process the projection part is merged via its storage's merge routine. The checksum of the parent table's part is combined with 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. @@ -416,18 +425,20 @@ Reading from a table is automatically parallelized. Determines the lifetime of values. -The `TTL` clause can be set for the whole table and for each individual column. Table-level TTL can also specify logic of automatic move of data between disks and volumes. +The `TTL` clause can be set for the whole table and for each individual column. Table-level `TTL` can also specify the logic of automatic moving data between disks and volumes, or recompressing parts where all the data has been expired. Expressions must evaluate to [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md) data type. -Example: +**Syntax** + +Setting time-to-live for a column: ``` sql TTL time_column TTL time_column + interval ``` -To define `interval`, use [time interval](../../../sql-reference/operators/index.md#operators-datetime) operators. +To define `interval`, use [time interval](../../../sql-reference/operators/index.md#operators-datetime) operators, for example: ``` sql TTL date_time + INTERVAL 1 MONTH @@ -440,9 +451,9 @@ When the values in the column expire, ClickHouse replaces them with the default The `TTL` clause can’t be used for key columns. -Examples: +**Examples** -Creating a table with TTL +Creating a table with `TTL`: ``` sql CREATE TABLE example_table @@ -475,11 +486,11 @@ ALTER TABLE example_table ### Table TTL {#mergetree-table-ttl} -Table can have an expression for removal of expired rows, and multiple expressions for automatic move of parts between [disks or volumes](#table_engine-mergetree-multiple-volumes). When rows in the table expire, ClickHouse deletes all corresponding rows. For parts moving feature, all rows of a part must satisfy the movement expression criteria. +Table can have an expression for removal of expired rows, and multiple expressions for automatic move of parts between [disks or volumes](#table_engine-mergetree-multiple-volumes). When rows in the table expire, ClickHouse deletes all corresponding rows. For parts moving or recompressing, all rows of a part must satisfy the `TTL` expression criteria. ``` sql TTL expr - [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'][, DELETE|TO DISK 'aaa'|TO VOLUME 'bbb'] ... + [DELETE|RECOMPRESS codec_name1|TO DISK 'xxx'|TO VOLUME 'xxx'][, DELETE|RECOMPRESS codec_name2|TO DISK 'aaa'|TO VOLUME 'bbb'] ... [WHERE conditions] [GROUP BY key_expr [SET v1 = aggr_func(v1) [, v2 = aggr_func(v2) ...]] ] ``` @@ -487,11 +498,12 @@ TTL expr Type of TTL rule may follow each TTL expression. It affects an action which is to be done once the expression is satisfied (reaches current time): - `DELETE` - delete expired rows (default action); +- `RECOMPRESS codec_name` - recompress data part with the `codec_name`; - `TO DISK 'aaa'` - move part to the disk `aaa`; - `TO VOLUME 'bbb'` - move part to the disk `bbb`; - `GROUP BY` - aggregate expired rows. -With `WHERE` clause you may specify which of the expired rows to delete or aggregate (it cannot be applied to moves). +With `WHERE` clause you may specify which of the expired rows to delete or aggregate (it cannot be applied to moves or recompression). `GROUP BY` expression must be a prefix of the table primary key. @@ -499,7 +511,7 @@ If a column is not part of the `GROUP BY` expression and is not set explicitly i **Examples** -Creating a table with TTL: +Creating a table with `TTL`: ``` sql CREATE TABLE example_table @@ -515,7 +527,7 @@ TTL d + INTERVAL 1 MONTH [DELETE], d + INTERVAL 2 WEEK TO DISK 'bbb'; ``` -Altering TTL of the table: +Altering `TTL` of the table: ``` sql ALTER TABLE example_table @@ -536,6 +548,21 @@ ORDER BY d TTL d + INTERVAL 1 MONTH DELETE WHERE toDayOfWeek(d) = 1; ``` +Creating a table, where expired rows are recompressed: + +```sql +CREATE TABLE table_for_recompression +( + d DateTime, + key UInt64, + value String +) ENGINE MergeTree() +ORDER BY tuple() +PARTITION BY key +TTL d + INTERVAL 1 MONTH RECOMPRESS CODEC(ZSTD(17)), d + INTERVAL 1 YEAR RECOMPRESS CODEC(LZ4HC(10)) +SETTINGS min_rows_for_wide_part = 0, min_bytes_for_wide_part = 0; +``` + Creating a table, where expired rows are aggregated. In result rows `x` contains the maximum value accross the grouped rows, `y` — the minimum value, and `d` — any occasional value from grouped rows. ``` sql @@ -552,14 +579,19 @@ ORDER BY (k1, k2) TTL d + INTERVAL 1 MONTH GROUP BY k1, k2 SET x = max(x), y = min(y); ``` -**Removing Data** +### Removing Expired Data {#mergetree-removing-expired-data} -Data with an expired TTL is removed when ClickHouse merges data parts. +Data with an expired `TTL` is removed when ClickHouse merges data parts. -When ClickHouse see that data is expired, it performs an off-schedule merge. To control the frequency of such merges, you can set `merge_with_ttl_timeout`. If the value is too low, it will perform many off-schedule merges that may consume a lot of resources. +When ClickHouse detects that data is expired, it performs an off-schedule merge. To control the frequency of such merges, you can set `merge_with_ttl_timeout`. If the value is too low, it will perform many off-schedule merges that may consume a lot of resources. If you perform the `SELECT` query between merges, you may get expired data. To avoid it, use the [OPTIMIZE](../../../sql-reference/statements/optimize.md) query before `SELECT`. +**See Also** + +- [ttl_only_drop_parts](../../../operations/settings/settings.md#ttl_only_drop_parts) setting + + ## Using Multiple Block Devices for Data Storage {#table_engine-mergetree-multiple-volumes} ### Introduction {#introduction} @@ -844,44 +876,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. - -## Using HDFS for Data Storage {#table_engine-mergetree-hdfs} - -[HDFS](https://hadoop.apache.org/docs/r1.2.1/hdfs_design.html) is a distributed file system for remote data storage. - -`MergeTree` 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`. diff --git a/docs/en/engines/table-engines/mergetree-family/replication.md b/docs/en/engines/table-engines/mergetree-family/replication.md index 4fc30355927..277339f9b47 100644 --- a/docs/en/engines/table-engines/mergetree-family/replication.md +++ b/docs/en/engines/table-engines/mergetree-family/replication.md @@ -137,7 +137,7 @@ CREATE TABLE table_name ) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}', ver) PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) -SAMPLE BY intHash32(UserID) +SAMPLE BY intHash32(UserID); ```
@@ -150,12 +150,12 @@ CREATE TABLE table_name EventDate DateTime, CounterID UInt32, UserID UInt32 -) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}', EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID), EventTime), 8192) +) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}', EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID), EventTime), 8192); ```
-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.md#macros) section of the configuration file. Example: diff --git a/docs/en/engines/table-engines/special/buffer.md b/docs/en/engines/table-engines/special/buffer.md index cacb310a15c..0e7f0a53da8 100644 --- a/docs/en/engines/table-engines/special/buffer.md +++ b/docs/en/engines/table-engines/special/buffer.md @@ -56,6 +56,9 @@ The same thing happens if the subordinate table does not exist when the buffer i If you need to run ALTER for a subordinate table, and the Buffer table, we recommend first deleting the Buffer table, running ALTER for the subordinate table, then creating the Buffer table again. +!!! attention "Attention" + Running ALTER on the Buffer table in releases made before 28 Sep 2020 will cause a `Block structure mismatch` error (see [#15117](https://github.com/ClickHouse/ClickHouse/issues/15117)), so deleting the Buffer table and then recreating is the only option. It is advisable to check that this error is fixed in your release before trying to run ALTER on the Buffer table. + If the server is restarted abnormally, the data in the buffer is lost. `FINAL` and `SAMPLE` do not work correctly for Buffer tables. These conditions are passed to the destination table, but are not used for processing data in the buffer. If these features are required we recommend only using the Buffer table for writing, while reading from the destination table. diff --git a/docs/en/engines/table-engines/special/file.md b/docs/en/engines/table-engines/special/file.md index 17eef2b4941..cb5baf368d2 100644 --- a/docs/en/engines/table-engines/special/file.md +++ b/docs/en/engines/table-engines/special/file.md @@ -24,7 +24,7 @@ The `Format` parameter specifies one of the available file formats. To perform `INSERT` queries – for output. The available formats are listed in the [Formats](../../../interfaces/formats.md#formats) section. -ClickHouse does not allow specifying filesystem path for`File`. It will use folder defined by [path](../../../operations/server-configuration-parameters/settings.md) setting in server configuration. +ClickHouse does not allow specifying filesystem path for `File`. It will use folder defined by [path](../../../operations/server-configuration-parameters/settings.md) setting in server configuration. When creating table using `File(Format)` it creates empty subdirectory in that folder. When data is written to that table, it’s put into `data.Format` file in that subdirectory. diff --git a/docs/en/getting-started/example-datasets/menus.md b/docs/en/getting-started/example-datasets/menus.md index 87e4c75d0d4..8f330f39226 100644 --- a/docs/en/getting-started/example-datasets/menus.md +++ b/docs/en/getting-started/example-datasets/menus.md @@ -105,7 +105,7 @@ We use `Decimal` data type to store prices. Everything else is quite straightfor ## Import Data -Upload data into ClickHouse in parallel: +Upload data into ClickHouse: ``` clickhouse-client --format_csv_allow_single_quotes 0 --input_format_null_as_default 0 --query "INSERT INTO dish FORMAT CSVWithNames" < Dish.csv diff --git a/docs/en/interfaces/cli.md b/docs/en/interfaces/cli.md index 8457ea41857..70b7d59b037 100644 --- a/docs/en/interfaces/cli.md +++ b/docs/en/interfaces/cli.md @@ -141,7 +141,7 @@ Since version 20.5, `clickhouse-client` has automatic syntax highlighting (alway Example of a config file: -``` xml +```xml username password @@ -149,4 +149,30 @@ Example of a config file: ``` -[Original article](https://clickhouse.tech/docs/en/interfaces/cli/) +### Query ID Format {#query-id-format} + +In interactive mode `clickhouse-client` shows query ID for every query. By default, the ID is formatted like this: + +```sql +Query id: 927f137d-00f1-4175-8914-0dd066365e96 +``` + +A custom format may be specified in a configuration file inside a `query_id_formats` tag. `{query_id}` placeholder in the format string is replaced with the ID of a query. Several format strings are allowed inside the tag. +This feature can be used to generate URLs to facilitate profiling of queries. + +**Example** + +```xml + + + http://speedscope-host/#profileURL=qp%3Fid%3D{query_id} + + +``` + +If the configuration above is applied, the ID of a query is shown in the following format: + +``` text +speedscope:http://speedscope-host/#profileURL=qp%3Fid%3Dc8ecc783-e753-4b38-97f1-42cddfb98b7d +``` + diff --git a/docs/en/operations/clickhouse-keeper.md b/docs/en/operations/clickhouse-keeper.md index 5fc1baa003c..389cf2361f8 100644 --- a/docs/en/operations/clickhouse-keeper.md +++ b/docs/en/operations/clickhouse-keeper.md @@ -114,5 +114,5 @@ Seamlessly migration from ZooKeeper to `clickhouse-keeper` is impossible you hav 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. +4. Copy snapshot to `clickhouse-server` nodes with configured `keeper` or start `clickhouse-keeper` instead of ZooKeeper. Snapshot must persist on all nodes, otherwise empty nodes can be faster and one of them can becamse leader. diff --git a/docs/en/operations/configuration-files.md b/docs/en/operations/configuration-files.md index 5c942efc77f..aafad0220bd 100644 --- a/docs/en/operations/configuration-files.md +++ b/docs/en/operations/configuration-files.md @@ -7,7 +7,7 @@ toc_title: Configuration Files ClickHouse supports multi-file configuration management. The main server configuration file is `/etc/clickhouse-server/config.xml` or `/etc/clickhouse-server/config.yaml`. Other files must be in the `/etc/clickhouse-server/config.d` directory. Note, that any configuration file can be written either in XML or YAML, but mixing formats in one file is not supported. For example, you can have main configs as `config.xml` and `users.xml` and write additional files in `config.d` and `users.d` directories in `.yaml`. -All the configuration files should be in XML or YAML formats. All XML files should have the same root element, usually ``. As for YAML, `yandex:` should not be present, the parser will insert it automatically. +All XML files should have the same root element, usually ``. As for YAML, `yandex:` should not be present, the parser will insert it automatically. ## Override {#override} @@ -18,9 +18,21 @@ Some settings specified in the main configuration file can be overridden in othe - If `replace` is specified, it replaces the entire element with the specified one. - If `remove` is specified, it deletes the element. +You can also declare attributes as coming from environment variables by using `from_env="VARIABLE_NAME"`: + +```xml + + + + + + + +``` + ## Substitution {#substitution} -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)). +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#macros)). If you want to replace an entire element with a substitution use `include` as element name. diff --git a/docs/en/operations/server-configuration-parameters/settings.md b/docs/en/operations/server-configuration-parameters/settings.md index a620565b71a..66a2bde4b4b 100644 --- a/docs/en/operations/server-configuration-parameters/settings.md +++ b/docs/en/operations/server-configuration-parameters/settings.md @@ -486,7 +486,7 @@ Parameter substitutions for replicated tables. Can be omitted if replicated tables are not used. -For more information, see the section “[Creating replicated tables](../../engines/table-engines/mergetree-family/replication.md)”. +For more information, see the section [Creating replicated tables](../../engines/table-engines/mergetree-family/replication.md#creating-replicated-tables). **Example** @@ -1247,6 +1247,7 @@ Default value: `/var/lib/clickhouse/access/`. Section of the configuration file that contains settings: - Path to configuration file with predefined users. - Path to folder where users created by SQL commands are stored. +- ZooKeeper node path where users created by SQL commands are stored and replicated (experimental). If this section is specified, the path from [users_config](../../operations/server-configuration-parameters/settings.md#users-config) and [access_control_path](../../operations/server-configuration-parameters/settings.md#access_control_path) won't be used. @@ -1262,6 +1263,9 @@ The `user_directories` section can contain any number of items, the order of the /var/lib/clickhouse/access/ + + /clickhouse/access/ + ``` diff --git a/docs/en/operations/settings/settings.md b/docs/en/operations/settings/settings.md index 07bfe158a0a..a1c7d1aab32 100644 --- a/docs/en/operations/settings/settings.md +++ b/docs/en/operations/settings/settings.md @@ -2041,10 +2041,25 @@ Default value: 0. ## input_format_parallel_parsing {#input-format-parallel-parsing} -- Type: bool -- Default value: True +Enables or disables order-preserving parallel parsing of data formats. Supported only for [TSV](../../interfaces/formats.md#tabseparated), [TKSV](../../interfaces/formats.md#tskv), [CSV](../../interfaces/formats.md#csv) and [JSONEachRow](../../interfaces/formats.md#jsoneachrow) formats. -Enable order-preserving parallel parsing of data formats. Supported only for TSV, TKSV, CSV, and JSONEachRow formats. +Possible values: + +- 1 — Enabled. +- 0 — Disabled. + +Default value: `0`. + +## output_format_parallel_formatting {#output-format-parallel-formatting} + +Enables or disables parallel formatting of data formats. Supported only for [TSV](../../interfaces/formats.md#tabseparated), [TKSV](../../interfaces/formats.md#tskv), [CSV](../../interfaces/formats.md#csv) and [JSONEachRow](../../interfaces/formats.md#jsoneachrow) formats. + +Possible values: + +- 1 — Enabled. +- 0 — Disabled. + +Default value: `0`. ## min_chunk_bytes_for_parallel_parsing {#min-chunk-bytes-for-parallel-parsing} @@ -3420,3 +3435,25 @@ Possible values: - 1 — The table is automatically updated in the background, when schema changes are detected. Default value: `0`. + +## allow_experimental_projection_optimization {#allow-experimental-projection-optimization} + +Enables or disables [projection](../../engines/table-engines/mergetree-family/mergetree.md#projections) optimization when processing `SELECT` queries. + +Possible values: + +- 0 — Projection optimization disabled. +- 1 — Projection optimization enabled. + +Default value: `0`. + +## force_optimize_projection {#force-optimize-projection} + +Enables or disables the obligatory use of [projections](../../engines/table-engines/mergetree-family/mergetree.md#projections) in `SELECT` queries, when projection optimization is enabled (see [allow_experimental_projection_optimization](#allow-experimental-projection-optimization) setting). + +Possible values: + +- 0 — Projection optimization is not obligatory. +- 1 — Projection optimization is obligatory. + +Default value: `0`. diff --git a/docs/en/operations/storing-data.md b/docs/en/operations/storing-data.md index 08811819acb..f283a2939d8 100644 --- a/docs/en/operations/storing-data.md +++ b/docs/en/operations/storing-data.md @@ -5,10 +5,111 @@ 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)). +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. +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. \ No newline at end of file +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/opentelemetry_span_log.md b/docs/en/operations/system-tables/opentelemetry_span_log.md index e45a989742c..9e36eae7a1b 100644 --- a/docs/en/operations/system-tables/opentelemetry_span_log.md +++ b/docs/en/operations/system-tables/opentelemetry_span_log.md @@ -4,7 +4,7 @@ Contains information about [trace spans](https://opentracing.io/docs/overview/sp Columns: -- `trace_id` ([UUID](../../sql-reference/data-types/uuid.md) — ID of the trace for executed query. +- `trace_id` ([UUID](../../sql-reference/data-types/uuid.md)) — ID of the trace for executed query. - `span_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — ID of the `trace span`. diff --git a/docs/en/operations/system-tables/zookeeper_log.md b/docs/en/operations/system-tables/zookeeper_log.md new file mode 100644 index 00000000000..f7d86c6689b --- /dev/null +++ b/docs/en/operations/system-tables/zookeeper_log.md @@ -0,0 +1,129 @@ +# system.zookeeper_log {#system-zookeeper_log} + +This table contains information about the parameters of the request to the ZooKeeper server and the response from it. + +For requests, only columns with request parameters are filled in, and the remaining columns are filled with default values (`0` or `NULL`). When the response arrives, the data from the response is added to the other columns. + +Columns with request parameters: + +- `type` ([Enum](../../sql-reference/data-types/enum.md)) — Event type in the ZooKeeper client. Can have one of the following values: + - `Request` — The request has been sent. + - `Response` — The response was received. + - `Finalize` — The connection is lost, no response was received. +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — The date when the event happened. +- `event_time` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — The date and time when the event happened. +- `address` ([IPv6](../../sql-reference/data-types/domains/ipv6.md)) — IP address of ZooKeeper server that was used to make the request. +- `port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — The port of ZooKeeper server that was used to make the request. +- `session_id` ([Int64](../../sql-reference/data-types/int-uint.md)) — The session ID that the ZooKeeper server sets for each connection. +- `xid` ([Int32](../../sql-reference/data-types/int-uint.md)) — The ID of the request within the session. This is usually a sequential request number. It is the same for the request row and the paired `response`/`finalize` row. +- `has_watch` ([UInt8](../../sql-reference/data-types/int-uint.md)) — The request whether the [watch](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html#ch_zkWatches) has been set. +- `op_num` ([Enum](../../sql-reference/data-types/enum.md)) — The type of request or response. +- `path` ([String](../../sql-reference/data-types/string.md)) — The path to the ZooKeeper node specified in the request, or an empty string if the request not requires specifying a path. +- `data` ([String](../../sql-reference/data-types/string.md)) — The data written to the ZooKeeper node (for the `SET` and `CREATE` requests — what the request wanted to write, for the response to the `GET` request — what was read) or an empty string. +- `is_ephemeral` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Is the ZooKeeper node being created as an [ephemeral](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html#Ephemeral+Nodes). +- `is_sequential` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Is the ZooKeeper node being created as an [sequential](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html#Sequence+Nodes+--+Unique+Naming). +- `version` ([Nullable(Int32)](../../sql-reference/data-types/nullable.md)) — The version of the ZooKeeper node that the request expects when executing. This is supported for `CHECK`, `SET`, `REMOVE` requests (is relevant `-1` if the request does not check the version or `NULL` for other requests that do not support version checking). +- `requests_size` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The number of requests included in the multi request (this is a special request that consists of several consecutive ordinary requests and executes them atomically). All requests included in multi request will have the same `xid`. +- `request_idx` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The number of the request included in multi request (for multi request — `0`, then in order from `1`). + +Columns with request response parameters: + +- `zxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — ZooKeeper transaction ID. The serial number issued by the ZooKeeper server in response to a successfully executed request (`0` if the request was not executed/returned an error/the client does not know whether the request was executed). +- `error` ([Nullable(Enum)](../../sql-reference/data-types/nullable.md)) — Error code. Can have many values, here are just some of them: + - `ZOK` — The request was executed seccessfully. + - `ZCONNECTIONLOSS` — The connection was lost. + - `ZOPERATIONTIMEOUT` — The request execution timeout has expired. + - `ZSESSIONEXPIRED` — The session has expired. + - `NULL` — The request is completed. +- `watch_type` ([Nullable(Enum)](../../sql-reference/data-types/nullable.md)) — The type of the `watch` event (for responses with `op_num` = `Watch`), for the remaining responses: `NULL`. +- `watch_state` ([Nullable(Enum)](../../sql-reference/data-types/nullable.md)) — The status of the `watch` event (for responses with `op_num` = `Watch`), for the remaining responses: `NULL`. +- `path_created` ([String](../../sql-reference/data-types/string.md)) — The path to the created ZooKeeper node (for responses to the `CREATE` request), may differ from the `path` if the node is created as a `sequential`. +- `stat_czxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — The `zxid` of the change that caused this ZooKeeper node to be created. +- `stat_mzxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — The `zxid` of the change that last modified this ZooKeeper node. +- `stat_pzxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — The transaction ID of the change that last modified childern of this ZooKeeper node. +- `stat_version` ([Int32](../../sql-reference/data-types/int-uint.md)) — The number of changes to the data of this ZooKeeper node. +- `stat_cversion` ([Int32](../../sql-reference/data-types/int-uint.md)) — The number of changes to the children of this ZooKeeper node. +- `stat_dataLength` ([Int32](../../sql-reference/data-types/int-uint.md)) — The length of the data field of this ZooKeeper node. +- `stat_numChildren` ([Int32](../../sql-reference/data-types/int-uint.md)) — The number of children of this ZooKeeper node. +- `children` ([Array(String)](../../sql-reference/data-types/array.md)) — The list of child ZooKeeper nodes (for responses to `LIST` request). + +**Example** + +Query: + +``` sql +SELECT * FROM system.zookeeper_log WHERE (session_id = '106662742089334927') AND (xid = '10858') FORMAT Vertical; +``` + +Result: + +``` text +Row 1: +────── +type: Request +event_date: 2021-08-09 +event_time: 2021-08-09 21:38:30.291792 +address: :: +port: 2181 +session_id: 106662742089334927 +xid: 10858 +has_watch: 1 +op_num: List +path: /clickhouse/task_queue/ddl +data: +is_ephemeral: 0 +is_sequential: 0 +version: ᴺᵁᴸᴸ +requests_size: 0 +request_idx: 0 +zxid: 0 +error: ᴺᵁᴸᴸ +watch_type: ᴺᵁᴸᴸ +watch_state: ᴺᵁᴸᴸ +path_created: +stat_czxid: 0 +stat_mzxid: 0 +stat_pzxid: 0 +stat_version: 0 +stat_cversion: 0 +stat_dataLength: 0 +stat_numChildren: 0 +children: [] + +Row 2: +────── +type: Response +event_date: 2021-08-09 +event_time: 2021-08-09 21:38:30.292086 +address: :: +port: 2181 +session_id: 106662742089334927 +xid: 10858 +has_watch: 1 +op_num: List +path: /clickhouse/task_queue/ddl +data: +is_ephemeral: 0 +is_sequential: 0 +version: ᴺᵁᴸᴸ +requests_size: 0 +request_idx: 0 +zxid: 16926267 +error: ZOK +watch_type: ᴺᵁᴸᴸ +watch_state: ᴺᵁᴸᴸ +path_created: +stat_czxid: 16925469 +stat_mzxid: 16925469 +stat_pzxid: 16926179 +stat_version: 0 +stat_cversion: 7 +stat_dataLength: 0 +stat_numChildren: 7 +children: ['query-0000000006','query-0000000005','query-0000000004','query-0000000003','query-0000000002','query-0000000001','query-0000000000'] +``` + +**See Also** + +- [ZooKeeper](../../operations/tips.md#zookeeper) +- [ZooKeeper guide](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html) diff --git a/docs/en/sql-reference/aggregate-functions/parametric-functions.md b/docs/en/sql-reference/aggregate-functions/parametric-functions.md index bdf115acb34..3adedd0ae70 100644 --- a/docs/en/sql-reference/aggregate-functions/parametric-functions.md +++ b/docs/en/sql-reference/aggregate-functions/parametric-functions.md @@ -154,7 +154,7 @@ SELECT sequenceMatch('(?1)(?2)')(time, number = 1, number = 2, number = 3) FROM └──────────────────────────────────────────────────────────────────────────────────────────┘ ``` -In this case, the function couldn’t find the event chain matching the pattern, because the event for number 3 occured between 1 and 2. If in the same case we checked the condition for number 4, the sequence would match the pattern. +In this case, the function couldn’t find the event chain matching the pattern, because the event for number 3 occurred between 1 and 2. If in the same case we checked the condition for number 4, the sequence would match the pattern. ``` sql SELECT sequenceMatch('(?1)(?2)')(time, number = 1, number = 2, number = 4) FROM t @@ -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_deduplication'` — If the same condition holds for the sequence of events, then such repeating event interrupts further processing. - `'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. diff --git a/docs/en/sql-reference/data-types/date.md b/docs/en/sql-reference/data-types/date.md index 0cfac4d59fe..bd39de14d47 100644 --- a/docs/en/sql-reference/data-types/date.md +++ b/docs/en/sql-reference/data-types/date.md @@ -9,9 +9,9 @@ A date. Stored in two bytes as the number of days since 1970-01-01 (unsigned). A The date value is stored without the time zone. -## Examples {#examples} +**Example** -**1.** Creating a table with a `DateTime`-type column and inserting data into it: +Creating a table with a `Date`-type column and inserting data into it: ``` sql CREATE TABLE dt @@ -23,10 +23,7 @@ ENGINE = TinyLog; ``` ``` sql -INSERT INTO dt Values (1546300800, 1), ('2019-01-01', 2); -``` - -``` sql +INSERT INTO dt VALUES (1546300800, 1), ('2019-01-01', 2); SELECT * FROM dt; ``` @@ -37,11 +34,8 @@ SELECT * FROM dt; └────────────┴──────────┘ ``` -## See Also {#see-also} +**See Also** - [Functions for working with dates and times](../../sql-reference/functions/date-time-functions.md) - [Operators for working with dates and times](../../sql-reference/operators/index.md#operators-datetime) - [`DateTime` data type](../../sql-reference/data-types/datetime.md) - - -[Original article](https://clickhouse.tech/docs/en/data_types/date/) diff --git a/docs/en/sql-reference/data-types/date32.md b/docs/en/sql-reference/data-types/date32.md new file mode 100644 index 00000000000..592f952e1be --- /dev/null +++ b/docs/en/sql-reference/data-types/date32.md @@ -0,0 +1,40 @@ +--- +toc_priority: 48 +toc_title: Date32 +--- + +# Date32 {#data_type-datetime32} + +A date. Supports the date range same with [Datetime64](../../sql-reference/data-types/datetime64.md). Stored in four bytes as the number of days since 1925-01-01. Allows storing values till 2283-11-11. + +**Examples** + +Creating a table with a `Date32`-type column and inserting data into it: + +``` sql +CREATE TABLE new +( + `timestamp` Date32, + `event_id` UInt8 +) +ENGINE = TinyLog; +``` + +``` sql +INSERT INTO new VALUES (4102444800, 1), ('2100-01-01', 2); +SELECT * FROM new; +``` + +``` text +┌──timestamp─┬─event_id─┐ +│ 2100-01-01 │ 1 │ +│ 2100-01-01 │ 2 │ +└────────────┴──────────┘ +``` + +**See Also** + +- [toDate32](../../sql-reference/functions/type-conversion-functions.md#todate32) +- [toDate32OrZero](../../sql-reference/functions/type-conversion-functions.md#todate32-or-zero) +- [toDate32OrNull](../../sql-reference/functions/type-conversion-functions.md#todate32-or-null) + diff --git a/docs/en/sql-reference/data-types/datetime64.md b/docs/en/sql-reference/data-types/datetime64.md index 1d3725b9fb3..112461535f7 100644 --- a/docs/en/sql-reference/data-types/datetime64.md +++ b/docs/en/sql-reference/data-types/datetime64.md @@ -17,7 +17,7 @@ DateTime64(precision, [timezone]) Internally, stores data as a number of ‘ticks’ since epoch start (1970-01-01 00:00:00 UTC) as Int64. The tick resolution is determined by the precision parameter. Additionally, the `DateTime64` type can store time zone that is the same for the entire column, that affects how the values of the `DateTime64` type values are displayed in text format and how the values specified as strings are parsed (‘2020-01-01 05:00:01.000’). The time zone is not stored in the rows of the table (or in resultset), but is stored in the column metadata. See details in [DateTime](../../sql-reference/data-types/datetime.md). -Supported range from January 1, 1925 till December 31, 2283. +Supported range from January 1, 1925 till November 11, 2283. ## Examples {#examples} diff --git a/docs/en/sql-reference/data-types/string.md b/docs/en/sql-reference/data-types/string.md index cb3a70ec7f8..2cf11ac85a3 100644 --- a/docs/en/sql-reference/data-types/string.md +++ b/docs/en/sql-reference/data-types/string.md @@ -15,6 +15,6 @@ When creating tables, numeric parameters for string fields can be set (e.g. `VAR 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/functions/array-functions.md b/docs/en/sql-reference/functions/array-functions.md index 422bbe4b4ea..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} @@ -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/geo/h3.md b/docs/en/sql-reference/functions/geo/h3.md index e178603dc45..ad7b4657af7 100644 --- a/docs/en/sql-reference/functions/geo/h3.md +++ b/docs/en/sql-reference/functions/geo/h3.md @@ -197,7 +197,7 @@ Result: ## h3ToGeo {#h3togeo} -Returns `(lon, lat)` that corresponds to the provided H3 index. +Returns the geographical coordinates of longitude and latitude corresponding to the provided [H3](#h3index) index. **Syntax** @@ -207,20 +207,18 @@ h3ToGeo(h3Index) **Arguments** -- `h3Index` — H3 Index. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `h3Index` — H3 Index. [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). - +- A tuple consisting of two values: `tuple(lon,lat)`. `lon` — Longitude. [Float64](../../../sql-reference/data-types/float.md). `lat` — Latitude. [Float64](../../../sql-reference/data-types/float.md). **Example** Query: ``` sql -SELECT h3ToGeo(644325524701193974) coordinates; +SELECT h3ToGeo(644325524701193974) AS coordinates; ``` Result: @@ -230,6 +228,7 @@ Result: │ (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/hash-functions.md b/docs/en/sql-reference/functions/hash-functions.md index 35a42c49a41..227e2885417 100644 --- a/docs/en/sql-reference/functions/hash-functions.md +++ b/docs/en/sql-reference/functions/hash-functions.md @@ -143,7 +143,9 @@ It works faster than intHash32. Average quality. ## SHA256 {#sha256} -Calculates SHA-1, SHA-224, or SHA-256 from a string and returns the resulting set of bytes as FixedString(20), FixedString(28), or FixedString(32). +## SHA512 {#sha512} + +Calculates SHA-1, SHA-224, SHA-256 or SHA-512 from a string and returns the resulting set of bytes as FixedString(20), FixedString(28), FixedString(32), or FixedString(64). The function works fairly slowly (SHA-1 processes about 5 million short strings per second per processor core, while SHA-224 and SHA-256 process about 2.2 million). We recommend using this function only in cases when you need a specific hash function and you can’t select it. Even in these cases, we recommend applying the function offline and pre-calculating values when inserting them into the table, instead of applying it in SELECTS. diff --git a/docs/en/sql-reference/functions/other-functions.md b/docs/en/sql-reference/functions/other-functions.md index 577fdd668a2..cf77444b17f 100644 --- a/docs/en/sql-reference/functions/other-functions.md +++ b/docs/en/sql-reference/functions/other-functions.md @@ -2236,3 +2236,74 @@ defaultRoles() Type: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). +## queryID {#query-id} + +Returns the ID of the current query. Other parameters of a query can be extracted from the [system.query_log](../../operations/system-tables/query_log.md) table via `query_id`. + +In contrast to [initialQueryID](#initial-query-id) function, `queryID` can return different results on different shards (see example). + +**Syntax** + +``` sql +queryID() +``` + +**Returned value** + +- The ID of the current query. + +Type: [String](../../sql-reference/data-types/string.md) + +**Example** + +Query: + +``` sql +CREATE TABLE tmp (str String) ENGINE = Log; +INSERT INTO tmp (*) VALUES ('a'); +SELECT count(DISTINCT t) FROM (SELECT queryID() AS t FROM remote('127.0.0.{1..3}', currentDatabase(), 'tmp') GROUP BY queryID()); +``` + +Result: + +``` text +┌─count()─┐ +│ 3 │ +└─────────┘ +``` + +## initialQueryID {#initial-query-id} + +Returns the ID of the initial current query. Other parameters of a query can be extracted from the [system.query_log](../../operations/system-tables/query_log.md) table via `initial_query_id`. + +In contrast to [queryID](#query-id) function, `initialQueryID` returns the same results on different shards (see example). + +**Syntax** + +``` sql +initialQueryID() +``` + +**Returned value** + +- The ID of the initial current query. + +Type: [String](../../sql-reference/data-types/string.md) + +**Example** + +Query: + +``` sql +CREATE TABLE tmp (str String) ENGINE = Log; +INSERT INTO tmp (*) VALUES ('a'); +SELECT count(DISTINCT t) FROM (SELECT initialQueryID() AS t FROM remote('127.0.0.{1..3}', currentDatabase(), 'tmp') GROUP BY queryID()); +``` + +Result: + +``` text +┌─count()─┐ +│ 1 │ +└─────────┘ +``` diff --git a/docs/en/sql-reference/functions/string-functions.md b/docs/en/sql-reference/functions/string-functions.md index 8ec8aa7339d..c7c84c5aca6 100644 --- a/docs/en/sql-reference/functions/string-functions.md +++ b/docs/en/sql-reference/functions/string-functions.md @@ -10,17 +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 or UUID. -UUID is empty if it is all zeros (nil UUID). + +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 or UUID. +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} @@ -43,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. diff --git a/docs/en/sql-reference/functions/type-conversion-functions.md b/docs/en/sql-reference/functions/type-conversion-functions.md index efd28def688..05f39e2d4e6 100644 --- a/docs/en/sql-reference/functions/type-conversion-functions.md +++ b/docs/en/sql-reference/functions/type-conversion-functions.md @@ -152,6 +152,104 @@ Alias: `DATE`. ## toDateTimeOrNull {#todatetimeornull} +## toDate32 {#todate32} + +Converts the argument to the [Date32](../../sql-reference/data-types/date32.md) data type. If the value is outside the range returns the border values supported by `Date32`. If the argument has [Date](../../sql-reference/data-types/date.md) type, borders of `Date` are taken into account. + +**Syntax** + +``` sql +toDate32(expr) +``` + +**Arguments** + +- `expr` — The value. [String](../../sql-reference/data-types/string.md), [UInt32](../../sql-reference/data-types/int-uint.md) or [Date](../../sql-reference/data-types/date.md). + +**Returned value** + +- A calendar date. + +Type: [Date32](../../sql-reference/data-types/date32.md). + +**Example** + +1. The value is within the range: + +``` sql +SELECT toDate32('1955-01-01') AS value, toTypeName(value); +``` + +``` text +┌──────value─┬─toTypeName(toDate32('1925-01-01'))─┐ +│ 1955-01-01 │ Date32 │ +└────────────┴────────────────────────────────────┘ +``` + +2. The value is outside the range: + +``` sql +SELECT toDate32('1924-01-01') AS value, toTypeName(value); +``` + +``` text +┌──────value─┬─toTypeName(toDate32('1925-01-01'))─┐ +│ 1925-01-01 │ Date32 │ +└────────────┴────────────────────────────────────┘ +``` + +3. With `Date`-type argument: + +``` sql +SELECT toDate32(toDate('1924-01-01')) AS value, toTypeName(value); +``` + +``` text +┌──────value─┬─toTypeName(toDate32(toDate('1924-01-01')))─┐ +│ 1970-01-01 │ Date32 │ +└────────────┴────────────────────────────────────────────┘ +``` + +## toDate32OrZero {#todate32-or-zero} + +The same as [toDate32](#todate32) but returns the min value of [Date32](../../sql-reference/data-types/date32.md) if invalid argument is received. + +**Example** + +Query: + +``` sql +SELECT toDate32OrZero('1924-01-01'), toDate32OrZero(''); +``` + +Result: + +``` text +┌─toDate32OrZero('1924-01-01')─┬─toDate32OrZero('')─┐ +│ 1925-01-01 │ 1925-01-01 │ +└──────────────────────────────┴────────────────────┘ +``` + +## toDate32OrNull {#todate32-or-null} + +The same as [toDate32](#todate32) but returns `NULL` if invalid argument is received. + +**Example** + +Query: + +``` sql +SELECT toDate32OrNull('1955-01-01'), toDate32OrNull(''); +``` + +Result: + +``` text +┌─toDate32OrNull('1955-01-01')─┬─toDate32OrNull('')─┐ +│ 1955-01-01 │ ᴺᵁᴸᴸ │ +└──────────────────────────────┴────────────────────┘ +``` + ## toDecimal(32\|64\|128\|256) {#todecimal3264128256} Converts `value` to the [Decimal](../../sql-reference/data-types/decimal.md) data type with precision of `S`. The `value` can be a number or a string. The `S` (scale) parameter specifies the number of decimal places. @@ -1339,3 +1437,149 @@ Result: │ 2,"good" │ └───────────────────────────────────────────┘ ``` + +## snowflakeToDateTime {#snowflakeToDateTime} + +Extract time from snowflake id as DateTime format. + +**Syntax** + +``` sql +snowflakeToDateTime(value [, time_zone]) +``` + +**Parameters** + +- `value` — `snowflake id`, Int64 value. +- `time_zone` — [Timezone](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone). The function parses `time_string` according to the timezone. Optional. [String](../../sql-reference/data-types/string.md). + +**Returned value** + +- value converted to the `DateTime` data type. + +**Example** + +Query: + +``` sql +SELECT snowflakeToDateTime(CAST('1426860702823350272', 'Int64'), 'UTC'); +``` + +Result: + +``` text + +┌─snowflakeToDateTime(CAST('1426860702823350272', 'Int64'), 'UTC')─┐ +│ 2021-08-15 10:57:56 │ +└──────────────────────────────────────────────────────────────────┘ +``` + +## snowflakeToDateTime64 {#snowflakeToDateTime64} + +Extract time from snowflake id as DateTime64 format. + +**Syntax** + +``` sql +snowflakeToDateTime64(value [, time_zone]) +``` + +**Parameters** + +- `value` — `snowflake id`, Int64 value. +- `time_zone` — [Timezone](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone). The function parses `time_string` according to the timezone. Optional. [String](../../sql-reference/data-types/string.md). + +**Returned value** + +- value converted to the `DateTime64` data type. + +**Example** + +Query: + +``` sql +SELECT snowflakeToDateTime64(CAST('1426860802823350272', 'Int64'), 'UTC'); +``` + +Result: + +``` text + +┌─snowflakeToDateTime64(CAST('1426860802823350272', 'Int64'), 'UTC')─┐ +│ 2021-08-15 10:58:19.841 │ +└────────────────────────────────────────────────────────────────────┘ +``` + +## dateTimeToSnowflake {#dateTimeToSnowflake} + +Convert DateTime to the first snowflake id at the giving time. + +**Syntax** + +``` sql +dateTimeToSnowflake(value) +``` + +**Parameters** + +- `value` — Date and time. [DateTime](../../sql-reference/data-types/datetime.md). + + +**Returned value** + +- `value` converted to the `Int64` data type as the first snowflake id at that time. + +**Example** + +Query: + +``` sql +WITH toDateTime('2021-08-15 18:57:56', 'Asia/Shanghai') AS dt +SELECT dateTimeToSnowflake(dt); +``` + +Result: + +``` text + +┌─dateTimeToSnowflake(dt)─┐ +│ 1426860702823350272 │ +└─────────────────────────┘ +``` + + +## dateTime64ToSnowflake {#dateTime64ToSnowflake} + +Convert DateTime64 to the first snowflake id at the giving time. + +**Syntax** + +``` sql +dateTime64ToSnowflake(value) +``` + +**Parameters** + +- `value` — Date and time. [DateTime64](../../sql-reference/data-types/datetime64.md). + + +**Returned value** + +- `value` converted to the `Int64` data type as the first snowflake id at that time. + +**Example** + +Query: + +``` sql +WITH toDateTime64('2021-08-15 18:57:56.492', 3, 'Asia/Shanghai') AS dt64 +SELECT dateTime64ToSnowflake(dt64); +``` + +Result: + +``` text +┌─dateTime64ToSnowflake(dt64)─┐ +│ 1426860704886947840 │ +└─────────────────────────────┘ +``` \ No newline at end of file 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/statements/alter/projection.md b/docs/en/sql-reference/statements/alter/projection.md index 07a13fc23c4..429241ebf13 100644 --- a/docs/en/sql-reference/statements/alter/projection.md +++ b/docs/en/sql-reference/statements/alter/projection.md @@ -5,7 +5,7 @@ toc_title: PROJECTION # Manipulating Projections {#manipulations-with-projections} -The following operations are available: +The following operations with [projections](../../../engines/table-engines/mergetree-family/mergetree.md#projections) are available: - `ALTER TABLE [db].name ADD PROJECTION name AS SELECT [GROUP BY] [ORDER BY]` - Adds projection description to tables metadata. @@ -15,7 +15,7 @@ The following operations are available: - `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. +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. diff --git a/docs/en/sql-reference/statements/explain.md b/docs/en/sql-reference/statements/explain.md index 0ab2cedd73e..9afea708d16 100644 --- a/docs/en/sql-reference/statements/explain.md +++ b/docs/en/sql-reference/statements/explain.md @@ -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/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/index.md b/docs/en/sql-reference/statements/select/index.md index 04273ca1d4d..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) diff --git a/docs/en/sql-reference/statements/select/join.md b/docs/en/sql-reference/statements/select/join.md index 0002e6db313..8f265bc3371 100644 --- a/docs/en/sql-reference/statements/select/join.md +++ b/docs/en/sql-reference/statements/select/join.md @@ -6,7 +6,7 @@ toc_title: JOIN Join produces a new table by combining columns from one or multiple tables by using values common to each. It is a common operation in databases with SQL support, which corresponds to [relational algebra](https://en.wikipedia.org/wiki/Relational_algebra#Joins_and_join-like_operators) join. The special case of one table join is often referred to as “self-join”. -Syntax: +**Syntax** ``` sql SELECT @@ -38,7 +38,7 @@ Additional join types available in ClickHouse: ## Settings {#join-settings} -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 overridden using [join_default_strictness](../../../operations/settings/settings.md#settings-join_default_strictness) 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. @@ -52,6 +52,61 @@ The behavior of ClickHouse server for `ANY JOIN` operations depends on the [any_ - [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) +## ON Section Conditions {on-section-conditions} + +An `ON` section can contain several conditions combined using the `AND` operator. Conditions specifying join keys must refer both left and right tables and must use the equality operator. Other conditions may use other logical operators but they must refer either the left or the right table of a query. +Rows are joined if the whole complex condition is met. If the conditions are not met, still rows may be included in the result depending on the `JOIN` type. Note that if the same conditions are placed in a `WHERE` section and they are not met, then rows are always filtered out from the result. + +!!! note "Note" + The `OR` operator inside an `ON` section is not supported yet. + +!!! note "Note" + If a condition refers columns from different tables, then only the equality operator (`=`) is supported so far. + +**Example** + +Consider `table_1` and `table_2`: + +``` +┌─Id─┬─name─┐ ┌─Id─┬─text───────────┬─scores─┐ +│ 1 │ A │ │ 1 │ Text A │ 10 │ +│ 2 │ B │ │ 1 │ Another text A │ 12 │ +│ 3 │ C │ │ 2 │ Text B │ 15 │ +└────┴──────┘ └────┴────────────────┴────────┘ +``` + +Query with one join key condition and an additional condition for `table_2`: + +``` sql +SELECT name, text FROM table_1 LEFT OUTER JOIN table_2 + ON table_1.Id = table_2.Id AND startsWith(table_2.text, 'Text'); +``` + +Note that the result contains the row with the name `C` and the empty text column. It is included into the result because an `OUTER` type of a join is used. + +``` +┌─name─┬─text───┐ +│ A │ Text A │ +│ B │ Text B │ +│ C │ │ +└──────┴────────┘ +``` + +Query with `INNER` type of a join and multiple conditions: + +``` sql +SELECT name, text, scores FROM table_1 INNER JOIN table_2 + ON table_1.Id = table_2.Id AND table_2.scores > 10 AND startsWith(table_2.text, 'Text'); +``` + +Result: + +``` +┌─name─┬─text───┬─scores─┐ +│ B │ Text B │ 15 │ +└──────┴────────┴────────┘ +``` + ## ASOF JOIN Usage {#asof-join-usage} `ASOF JOIN` is useful when you need to join records that have no exact match. @@ -59,7 +114,7 @@ The behavior of ClickHouse server for `ANY JOIN` operations depends on the [any_ Algorithm requires the special column in tables. This column: - Must contain an ordered sequence. -- Can be one of the following types: [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). +- Can be one of the following types: [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). - Can’t be the only column in the `JOIN` clause. Syntax `ASOF JOIN ... ON`: @@ -84,7 +139,7 @@ ASOF JOIN table_2 USING (equi_column1, ... equi_columnN, asof_column) ``` -`ASOF JOIN` uses `equi_columnX` for joining on equality and `asof_column` for joining on the closest match with the `table_1.asof_column >= table_2.asof_column` condition. The `asof_column` column always the last one in the `USING` clause. +`ASOF JOIN` uses `equi_columnX` for joining on equality and `asof_column` for joining on the closest match with the `table_1.asof_column >= table_2.asof_column` condition. The `asof_column` column is always the last one in the `USING` clause. For example, consider the following tables: diff --git a/docs/en/sql-reference/statements/system.md b/docs/en/sql-reference/statements/system.md index d1526c10203..cf2a99a4c5f 100644 --- a/docs/en/sql-reference/statements/system.md +++ b/docs/en/sql-reference/statements/system.md @@ -311,12 +311,12 @@ One may execute query after: - Individual replica path `/replicas/replica_name/` loss. Replica attaches locally found parts and sends info about them to Zookeeper. -Parts present on replica before metadata loss are not re-fetched from other replicas if not being outdated -(so replica restoration does not mean re-downloading all data over the network). +Parts present on a replica before metadata loss are not re-fetched from other ones if not being outdated (so replica restoration does not mean re-downloading all data over the network). -Caveat: parts in all states are moved to `detached/` folder. Parts active before data loss (Committed) are attached. +!!! warning "Warning" + Parts in all states are moved to `detached/` folder. Parts active before data loss (committed) are attached. -#### Syntax +**Syntax** ```sql SYSTEM RESTORE REPLICA [db.]replicated_merge_tree_family_table_name [ON CLUSTER cluster_name] @@ -328,11 +328,11 @@ Alternative syntax: SYSTEM RESTORE REPLICA [ON CLUSTER cluster_name] [db.]replicated_merge_tree_family_table_name ``` -#### Example +**Example** + +Creating a table on multiple servers. After the replica's metadata in ZooKeeper is lost, the table will attach as read-only as metadata is missing. The last query needs to execute on every replica. ```sql --- Creating table on multiple servers - CREATE TABLE test(n UInt32) ENGINE = ReplicatedMergeTree('/clickhouse/tables/test/', '{replica}') ORDER BY n PARTITION BY n % 10; @@ -341,8 +341,14 @@ INSERT INTO test SELECT * FROM numbers(1000); -- zookeeper_delete_path("/clickhouse/tables/test", recursive=True) <- root loss. -SYSTEM RESTART REPLICA test; -- Table will attach as readonly as metadata is missing. -SYSTEM RESTORE REPLICA test; -- Need to execute on every replica, another way: RESTORE REPLICA test ON CLUSTER cluster +SYSTEM RESTART REPLICA test; +SYSTEM RESTORE REPLICA test; +``` + +Another way: + +```sql +SYSTEM RESTORE REPLICA test ON CLUSTER cluster; ``` ### RESTART REPLICAS {#query_language-system-restart-replicas} diff --git a/docs/en/sql-reference/table-functions/cluster.md b/docs/en/sql-reference/table-functions/cluster.md index 2856e66db9b..a02c2a10fb7 100644 --- a/docs/en/sql-reference/table-functions/cluster.md +++ b/docs/en/sql-reference/table-functions/cluster.md @@ -6,12 +6,13 @@ toc_title: cluster # cluster, clusterAllReplicas {#cluster-clusterallreplicas} Allows to access all shards in an existing cluster which configured in `remote_servers` section without creating a [Distributed](../../engines/table-engines/special/distributed.md) table. One replica of each shard is queried. -`clusterAllReplicas` - same as `cluster` but all replicas are queried. Each replica in a cluster is used as separate shard/connection. + +`clusterAllReplicas` function — same as `cluster`, but all replicas are queried. Each replica in a cluster is used as a separate shard/connection. !!! note "Note" - All available clusters are listed in the `system.clusters` table. + All available clusters are listed in the [system.clusters](../../operations/system-tables/clusters.md) table. -Signatures: +**Syntax** ``` sql cluster('cluster_name', db.table[, sharding_key]) @@ -19,10 +20,27 @@ cluster('cluster_name', db, table[, sharding_key]) clusterAllReplicas('cluster_name', db.table[, sharding_key]) clusterAllReplicas('cluster_name', db, table[, sharding_key]) ``` +**Arguments** -`cluster_name` – Name of a cluster that is used to build a set of addresses and connection parameters to remote and local servers. +- `cluster_name` – Name of a cluster that is used to build a set of addresses and connection parameters to remote and local servers. +- `db.table` or `db`, `table` - Name of a database and a table. +- `sharding_key` - A sharding key. Optional. Needs to be specified if the cluster has more than one shard. -`sharding_key` - When insert into cluster function with more than one shard, sharding_key need to be provided. +**Returned value** + +The dataset from clusters. + +**Using Macros** + +`cluster_name` can contain macros — substitution in curly brackets. The substituted value is taken from the [macros](../../operations/server-configuration-parameters/settings.md#macros) section of the server configuration file. + +Example: + +```sql +SELECT * FROM cluster('{cluster}', default.example_table); +``` + +**Usage and Recommendations** Using the `cluster` and `clusterAllReplicas` table functions are less efficient than creating a `Distributed` table because in this case, the server connection is re-established for every request. When processing a large number of queries, please always create the `Distributed` table ahead of time, and do not use the `cluster` and `clusterAllReplicas` table functions. diff --git a/docs/en/sql-reference/table-functions/index.md b/docs/en/sql-reference/table-functions/index.md index d65a18ab985..64afe30ef18 100644 --- a/docs/en/sql-reference/table-functions/index.md +++ b/docs/en/sql-reference/table-functions/index.md @@ -14,7 +14,7 @@ You can use table functions in: The method for creating a temporary table that is available only in the current query. The table is deleted when the query finishes. -- [CREATE TABLE AS \](../../sql-reference/statements/create/table.md) query. +- [CREATE TABLE AS table_function()](../../sql-reference/statements/create/table.md) query. It's one of the methods of creating a table. @@ -34,5 +34,6 @@ You can use table functions in: | [odbc](../../sql-reference/table-functions/odbc.md) | Creates a [ODBC](../../engines/table-engines/integrations/odbc.md)-engine table. | | [hdfs](../../sql-reference/table-functions/hdfs.md) | Creates a [HDFS](../../engines/table-engines/integrations/hdfs.md)-engine table. | | [s3](../../sql-reference/table-functions/s3.md) | Creates a [S3](../../engines/table-engines/integrations/s3.md)-engine table. | +| [sqlite](../../sql-reference/table-functions/sqlite.md) | Creates a [sqlite](../../engines/table-engines/integrations/sqlite.md)-engine table. | [Original article](https://clickhouse.tech/docs/en/sql-reference/table-functions/) diff --git a/docs/en/sql-reference/table-functions/sqlite.md b/docs/en/sql-reference/table-functions/sqlite.md new file mode 100644 index 00000000000..be7bd92d7e7 --- /dev/null +++ b/docs/en/sql-reference/table-functions/sqlite.md @@ -0,0 +1,45 @@ +--- +toc_priority: 55 +toc_title: sqlite +--- + +## sqlite {#sqlite} + +Allows to perform queries on a data stored in an [SQLite](../../engines/database-engines/sqlite.md) database. + +**Syntax** + +``` sql + sqlite('db_path', 'table_name') +``` + +**Arguments** + +- `db_path` — Path to a file with an SQLite database. [String](../../sql-reference/data-types/string.md). +- `table_name` — Name of a table in the SQLite database. [String](../../sql-reference/data-types/string.md). + +**Returned value** + +- A table object with the same columns as in the original `SQLite` table. + +**Example** + +Query: + +``` sql +SELECT * FROM sqlite('sqlite.db', 'table1') ORDER BY col2; +``` + +Result: + +``` text +┌─col1──┬─col2─┐ +│ line1 │ 1 │ +│ line2 │ 2 │ +│ line3 │ 3 │ +└───────┴──────┘ +``` + +**See Also** + +- [SQLite](../../engines/table-engines/integrations/sqlite.md) table engine \ No newline at end of file diff --git a/docs/ru/development/architecture.md b/docs/ru/development/architecture.md index d2cfc44b711..8317377b3db 100644 --- a/docs/ru/development/architecture.md +++ b/docs/ru/development/architecture.md @@ -36,7 +36,7 @@ ClickHouse - полноценная колоночная СУБД. Данные `IDataType` и `IColumn` слабо связаны друг с другом. Различные типы данных могут быть представлены в памяти с помощью одной реализации `IColumn`. Например, и `DataTypeUInt32`, и `DataTypeDateTime` в памяти представлены как `ColumnUInt32` или `ColumnConstUInt32`. В добавок к этому, один тип данных может быть представлен различными реализациями `IColumn`. Например, `DataTypeUInt8` может быть представлен как `ColumnUInt8` и `ColumnConstUInt8`. -`IDataType` хранит только метаданные. Например, `DataTypeUInt8` не хранить ничего (кроме скрытого указателя `vptr`), а `DataTypeFixedString` хранит только `N` (фиксированный размер строки). +`IDataType` хранит только метаданные. Например, `DataTypeUInt8` не хранит ничего (кроме скрытого указателя `vptr`), а `DataTypeFixedString` хранит только `N` (фиксированный размер строки). В `IDataType` есть вспомогательные методы для данных различного формата. Среди них методы сериализации значений, допускающих использование кавычек, сериализации значения в JSON или XML. Среди них нет прямого соответствия форматам данных. Например, различные форматы `Pretty` и `TabSeparated` могут использовать один вспомогательный метод `serializeTextEscaped` интерфейса `IDataType`. @@ -62,7 +62,7 @@ ClickHouse - полноценная колоночная СУБД. Данные > Потоки блоков используют «втягивающий» (pull) подход к управлению потоком выполнения: когда вы вытягиваете блок из первого потока, он, следовательно, вытягивает необходимые блоки из вложенных потоков, так и работает весь конвейер выполнения. Ни «pull» ни «push» не имеют явного преимущества, потому что поток управления неявный, и это ограничивает в реализации различных функций, таких как одновременное выполнение нескольких запросов (слияние нескольких конвейеров вместе). Это ограничение можно преодолеть с помощью сопрограмм (coroutines) или просто запуском дополнительных потоков, которые ждут друг друга. У нас может быть больше возможностей, если мы сделаем поток управления явным: если мы локализуем логику для передачи данных из одной расчетной единицы в другую вне этих расчетных единиц. Читайте эту [статью](http://journal.stuffwithstuff.com/2013/01/13/iteration-inside-and-out/) для углубленного изучения. -Следует отметить, что конвейер выполнения запроса создает временные данные на каждом шаге. Мы стараемся сохранить размер блока достаточно маленьким, чтобы временные данные помещались в кэш процессора. При таком допущении запись и чтение временных данных практически бесплатны по сравнению с другими расчетами. Мы могли бы рассмотреть альтернативу, которая заключается в том, чтобы объединить многие операции в конвеере вместе. Это может сделать конвейер как можно короче и удалить большую часть временных данных, что может быть преимуществом, но у такого подхода также есть недостатки. Например, разделенный конвейер позволяет легко реализовать кэширование промежуточных данных, использование промежуточных данных из аналогичных запросов, выполняемых одновременно, и объединение конвейеров для аналогичных запросов. +Следует отметить, что конвейер выполнения запроса создает временные данные на каждом шаге. Мы стараемся сохранить размер блока достаточно маленьким, чтобы временные данные помещались в кэш процессора. При таком допущении запись и чтение временных данных практически бесплатны по сравнению с другими расчетами. Мы могли бы рассмотреть альтернативу, которая заключается в том, чтобы объединить многие операции в конвейере вместе. Это может сделать конвейер как можно короче и удалить большую часть временных данных, что может быть преимуществом, но у такого подхода также есть недостатки. Например, разделенный конвейер позволяет легко реализовать кэширование промежуточных данных, использование промежуточных данных из аналогичных запросов, выполняемых одновременно, и объединение конвейеров для аналогичных запросов. ## Форматы {#formats} @@ -119,7 +119,7 @@ ClickHouse - полноценная колоночная СУБД. Данные Существуют обычные функции и агрегатные функции. Агрегатные функции смотрите в следующем разделе. -Обычный функции не изменяют число строк и работают так, как если бы обрабатывали каждую строку независимо. В действительности же, функции вызываются не к отдельным строкам, а блокам данных для реализации векторизованного выполнения запросов. +Обычные функции не изменяют число строк и работают так, как если бы обрабатывали каждую строку независимо. В действительности же, функции вызываются не к отдельным строкам, а блокам данных для реализации векторизованного выполнения запросов. Некоторые функции, такие как [blockSize](../sql-reference/functions/other-functions.md#function-blocksize), [rowNumberInBlock](../sql-reference/functions/other-functions.md#function-rownumberinblock), и [runningAccumulate](../sql-reference/functions/other-functions.md#runningaccumulate), эксплуатируют блочную обработку и нарушают независимость строк. @@ -162,7 +162,7 @@ ClickHouse имеет сильную типизацию, поэтому нет Сервера в кластере в основном независимы. Вы можете создать `Распределенную` (`Distributed`) таблицу на одном или всех серверах в кластере. Такая таблица сама по себе не хранит данные - она только предоставляет возможность "просмотра" всех локальных таблиц на нескольких узлах кластера. При выполнении `SELECT` распределенная таблица переписывает запрос, выбирает удаленные узлы в соответствии с настройками балансировки нагрузки и отправляет им запрос. Распределенная таблица просит удаленные сервера обработать запрос до той стадии, когда промежуточные результаты с разных серверов могут быть объединены. Затем он получает промежуточные результаты и объединяет их. Распределенная таблица пытается возложить как можно больше работы на удаленные серверы и сократить объем промежуточных данных, передаваемых по сети. -Ситуация усложняется, при использовании подзапросов в случае `IN` или `JOIN`, когда каждый из них использует таблицу `Distributed`. Есть разные стратегии для выполнения таких запросов. +Ситуация усложняется при использовании подзапросов в случае `IN` или `JOIN`, когда каждый из них использует таблицу `Distributed`. Есть разные стратегии для выполнения таких запросов. Глобального плана выполнения распределенных запросов не существует. Каждый узел имеет собственный локальный план для своей части работы. У нас есть простое однонаправленное выполнение распределенных запросов: мы отправляем запросы на удаленные узлы и затем объединяем результаты. Но это невозможно для сложных запросов `GROUP BY` высокой кардинальности или запросов с большим числом временных данных в `JOIN`: в таких случаях нам необходимо перераспределить («reshuffle») данные между серверами, что требует дополнительной координации. ClickHouse не поддерживает выполнение запросов такого рода, и нам нужно работать над этим. diff --git a/docs/ru/development/contrib.md b/docs/ru/development/contrib.md index 33a533d7f75..72b039261fa 100644 --- a/docs/ru/development/contrib.md +++ b/docs/ru/development/contrib.md @@ -4,40 +4,95 @@ toc_title: "Используемые сторонние библиотеки" --- -# Используемые сторонние библиотеки {#ispolzuemye-storonnie-biblioteki} +# Используемые сторонние библиотеки {#third-party-libraries-used} -| Библиотека | Лицензия | -|---------------------|----------------------------------------------------------------------------------------------------------------------------------------------| -| base64 | [BSD 2-Clause License](https://github.com/aklomp/base64/blob/a27c565d1b6c676beaf297fe503c4518185666f7/LICENSE) | -| boost | [Boost Software License 1.0](https://github.com/ClickHouse-Extras/boost-extra/blob/6883b40449f378019aec792f9983ce3afc7ff16e/LICENSE_1_0.txt) | -| brotli | [MIT](https://github.com/google/brotli/blob/master/LICENSE) | -| capnproto | [MIT](https://github.com/capnproto/capnproto/blob/master/LICENSE) | -| cctz | [Apache License 2.0](https://github.com/google/cctz/blob/4f9776a310f4952454636363def82c2bf6641d5f/LICENSE.txt) | -| double-conversion | [BSD 3-Clause License](https://github.com/google/double-conversion/blob/cf2f0f3d547dc73b4612028a155b80536902ba02/LICENSE) | -| FastMemcpy | [MIT](https://github.com/ClickHouse/ClickHouse/blob/master/libs/libmemcpy/impl/LICENSE) | -| googletest | [BSD 3-Clause License](https://github.com/google/googletest/blob/master/LICENSE) | -| h3 | [Apache License 2.0](https://github.com/uber/h3/blob/master/LICENSE) | -| hyperscan | [BSD 3-Clause License](https://github.com/intel/hyperscan/blob/master/LICENSE) | -| libcxxabi | [BSD + MIT](https://github.com/ClickHouse/ClickHouse/blob/master/libs/libglibc-compatibility/libcxxabi/LICENSE.TXT) | -| libdivide | [Zlib License](https://github.com/ClickHouse/ClickHouse/blob/master/contrib/libdivide/LICENSE.txt) | -| libgsasl | [LGPL v2.1](https://github.com/ClickHouse-Extras/libgsasl/blob/3b8948a4042e34fb00b4fb987535dc9e02e39040/LICENSE) | -| libhdfs3 | [Apache License 2.0](https://github.com/ClickHouse-Extras/libhdfs3/blob/bd6505cbb0c130b0db695305b9a38546fa880e5a/LICENSE.txt) | -| libmetrohash | [Apache License 2.0](https://github.com/ClickHouse/ClickHouse/blob/master/contrib/libmetrohash/LICENSE) | -| libpcg-random | [Apache License 2.0](https://github.com/ClickHouse/ClickHouse/blob/master/contrib/libpcg-random/LICENSE-APACHE.txt) | -| libressl | [OpenSSL License](https://github.com/ClickHouse-Extras/ssl/blob/master/COPYING) | -| librdkafka | [BSD 2-Clause License](https://github.com/edenhill/librdkafka/blob/363dcad5a23dc29381cc626620e68ae418b3af19/LICENSE) | -| libwidechar_width | [CC0 1.0 Universal](https://github.com/ClickHouse/ClickHouse/blob/master/libs/libwidechar_width/LICENSE) | -| llvm | [BSD 3-Clause License](https://github.com/ClickHouse-Extras/llvm/blob/163def217817c90fb982a6daf384744d8472b92b/llvm/LICENSE.TXT) | -| lz4 | [BSD 2-Clause License](https://github.com/lz4/lz4/blob/c10863b98e1503af90616ae99725ecd120265dfb/LICENSE) | -| mariadb-connector-c | [LGPL v2.1](https://github.com/ClickHouse-Extras/mariadb-connector-c/blob/3.1/COPYING.LIB) | -| murmurhash | [Public Domain](https://github.com/ClickHouse/ClickHouse/blob/master/contrib/murmurhash/LICENSE) | -| pdqsort | [Zlib License](https://github.com/ClickHouse/ClickHouse/blob/master/contrib/pdqsort/license.txt) | -| poco | [Boost Software License - Version 1.0](https://github.com/ClickHouse-Extras/poco/blob/fe5505e56c27b6ecb0dcbc40c49dc2caf4e9637f/LICENSE) | -| protobuf | [BSD 3-Clause License](https://github.com/ClickHouse-Extras/protobuf/blob/12735370922a35f03999afff478e1c6d7aa917a4/LICENSE) | -| re2 | [BSD 3-Clause License](https://github.com/google/re2/blob/7cf8b88e8f70f97fd4926b56aa87e7f53b2717e0/LICENSE) | -| 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) | +Список сторонних библиотек: + +| Библиотека | Тип лицензии | +|:-|:-| +| abseil-cpp | [Apache](https://github.com/ClickHouse-Extras/abseil-cpp/blob/4f3b686f86c3ebaba7e4e926e62a79cb1c659a54/LICENSE) | +| AMQP-CPP | [Apache](https://github.com/ClickHouse-Extras/AMQP-CPP/blob/1a6c51f4ac51ac56610fa95081bd2f349911375a/LICENSE) | +| arrow | [Apache](https://github.com/ClickHouse-Extras/arrow/blob/078e21bad344747b7656ef2d7a4f7410a0a303eb/LICENSE.txt) | +| avro | [Apache](https://github.com/ClickHouse-Extras/avro/blob/e43c46e87fd32eafdc09471e95344555454c5ef8/LICENSE.txt) | +| aws | [Apache](https://github.com/ClickHouse-Extras/aws-sdk-cpp/blob/7d48b2c8193679cc4516e5bd68ae4a64b94dae7d/LICENSE.txt) | +| aws-c-common | [Apache](https://github.com/ClickHouse-Extras/aws-c-common/blob/736a82d1697c108b04a277e66438a7f4e19b6857/LICENSE) | +| aws-c-event-stream | [Apache](https://github.com/ClickHouse-Extras/aws-c-event-stream/blob/3bc33662f9ccff4f4cbcf9509cc78c26e022fde0/LICENSE) | +| aws-checksums | [Apache](https://github.com/ClickHouse-Extras/aws-checksums/blob/519d6d9093819b6cf89ffff589a27ef8f83d0f65/LICENSE) | +| base64 | [BSD 2-clause](https://github.com/ClickHouse-Extras/Turbo-Base64/blob/af9b331f2b4f30b41c70f3a571ff904a8251c1d3/LICENSE) | +| boost | [Boost](https://github.com/ClickHouse-Extras/boost/blob/9cf09dbfd55a5c6202dedbdf40781a51b02c2675/LICENSE_1_0.txt) | +| boringssl | [BSD](https://github.com/ClickHouse-Extras/boringssl/blob/a6a2e2ab3e44d97ce98e51c558e989f211de7eb3/LICENSE) | +| brotli | [MIT](https://github.com/google/brotli/blob/63be8a99401992075c23e99f7c84de1c653e39e2/LICENSE) | +| capnproto | [MIT](https://github.com/capnproto/capnproto/blob/a00ccd91b3746ef2ab51d40fe3265829949d1ace/LICENSE) | +| cassandra | [Apache](https://github.com/ClickHouse-Extras/cpp-driver/blob/eb9b68dadbb4417a2c132ad4a1c2fa76e65e6fc1/LICENSE.txt) | +| cctz | [Apache](https://github.com/ClickHouse-Extras/cctz/blob/c0f1bcb97fd2782f7c3f972fadd5aad5affac4b8/LICENSE.txt) | +| cityhash102 | [MIT](https://github.com/ClickHouse/ClickHouse/blob/master/contrib/cityhash102/COPYING) | +| cppkafka | [BSD 2-clause](https://github.com/mfontanini/cppkafka/blob/5a119f689f8a4d90d10a9635e7ee2bee5c127de1/LICENSE) | +| croaring | [Apache](https://github.com/RoaringBitmap/CRoaring/blob/2c867e9f9c9e2a3a7032791f94c4c7ae3013f6e0/LICENSE) | +| curl | [Apache](https://github.com/curl/curl/blob/3b8bbbbd1609c638a3d3d0acb148a33dedb67be3/docs/LICENSE-MIXING.md) | +| cyrus-sasl | [BSD 2-clause](https://github.com/ClickHouse-Extras/cyrus-sasl/blob/e6466edfd638cc5073debe941c53345b18a09512/COPYING) | +| double-conversion | [BSD 3-clause](https://github.com/google/double-conversion/blob/cf2f0f3d547dc73b4612028a155b80536902ba02/LICENSE) | +| dragonbox | [Apache](https://github.com/ClickHouse-Extras/dragonbox/blob/923705af6fd953aa948fc175f6020b15f7359838/LICENSE-Apache2-LLVM) | +| fast_float | [Apache](https://github.com/fastfloat/fast_float/blob/7eae925b51fd0f570ccd5c880c12e3e27a23b86f/LICENSE) | +| fastops | [MIT](https://github.com/ClickHouse-Extras/fastops/blob/88752a5e03cf34639a4a37a4b41d8b463fffd2b5/LICENSE) | +| flatbuffers | [Apache](https://github.com/ClickHouse-Extras/flatbuffers/blob/eb3f827948241ce0e701516f16cd67324802bce9/LICENSE.txt) | +| fmtlib | [Unknown](https://github.com/fmtlib/fmt/blob/c108ee1d590089ccf642fc85652b845924067af2/LICENSE.rst) | +| gcem | [Apache](https://github.com/kthohr/gcem/blob/8d4f1b5d76ea8f6ff12f3f4f34cda45424556b00/LICENSE) | +| googletest | [BSD 3-clause](https://github.com/google/googletest/blob/e7e591764baba0a0c3c9ad0014430e7a27331d16/LICENSE) | +| grpc | [Apache](https://github.com/ClickHouse-Extras/grpc/blob/60c986e15cae70aade721d26badabab1f822fdd6/LICENSE) | +| h3 | [Apache](https://github.com/ClickHouse-Extras/h3/blob/c7f46cfd71fb60e2fefc90e28abe81657deff735/LICENSE) | +| hyperscan | [Boost](https://github.com/ClickHouse-Extras/hyperscan/blob/e9f08df0213fc637aac0a5bbde9beeaeba2fe9fa/LICENSE) | +| icu | [Public Domain](https://github.com/unicode-org/icu/blob/faa2f9f9e1fe74c5ed00eba371d2830134cdbea1/icu4c/LICENSE) | +| icudata | [Public Domain](https://github.com/ClickHouse-Extras/icudata/blob/f020820388e3faafb44cc643574a2d563dfde572/LICENSE) | +| jemalloc | [BSD 2-clause](https://github.com/ClickHouse-Extras/jemalloc/blob/e6891d9746143bf2cf617493d880ba5a0b9a3efd/COPYING) | +| krb5 | [MIT](https://github.com/ClickHouse-Extras/krb5/blob/5149dea4e2be0f67707383d2682b897c14631374/src/lib/gssapi/LICENSE) | +| libc-headers | [LGPL](https://github.com/ClickHouse-Extras/libc-headers/blob/a720b7105a610acbd7427eea475a5b6810c151eb/LICENSE) | +| libcpuid | [BSD 2-clause](https://github.com/ClickHouse-Extras/libcpuid/blob/8db3b8d2d32d22437f063ce692a1b9bb15e42d18/COPYING) | +| libcxx | [Apache](https://github.com/ClickHouse-Extras/libcxx/blob/2fa892f69acbaa40f8a18c6484854a6183a34482/LICENSE.TXT) | +| libcxxabi | [Apache](https://github.com/ClickHouse-Extras/libcxxabi/blob/df8f1e727dbc9e2bedf2282096fa189dc3fe0076/LICENSE.TXT) | +| libdivide | [zLib](https://github.com/ClickHouse/ClickHouse/blob/master/contrib/libdivide/LICENSE.txt) | +| libfarmhash | [MIT](https://github.com/ClickHouse/ClickHouse/blob/master/contrib/libfarmhash/COPYING) | +| libgsasl | [LGPL](https://github.com/ClickHouse-Extras/libgsasl/blob/383ee28e82f69fa16ed43b48bd9c8ee5b313ab84/LICENSE) | +| libhdfs3 | [Apache](https://github.com/ClickHouse-Extras/libhdfs3/blob/095b9d48b400abb72d967cb0539af13b1e3d90cf/LICENSE.txt) | +| libmetrohash | [Apache](https://github.com/ClickHouse/ClickHouse/blob/master/contrib/libmetrohash/LICENSE) | +| libpq | [Unknown](https://github.com/ClickHouse-Extras/libpq/blob/e071ea570f8985aa00e34f5b9d50a3cfe666327e/COPYRIGHT) | +| libpqxx | [BSD 3-clause](https://github.com/ClickHouse-Extras/libpqxx/blob/357608d11b7a1961c3fb7db2ef9a5dbb2e87da77/COPYING) | +| librdkafka | [MIT](https://github.com/ClickHouse-Extras/librdkafka/blob/b8554f1682062c85ba519eb54ef2f90e02b812cb/LICENSE.murmur2) | +| libunwind | [Apache](https://github.com/ClickHouse-Extras/libunwind/blob/6b816d2fba3991f8fd6aaec17d92f68947eab667/LICENSE.TXT) | +| libuv | [BSD](https://github.com/ClickHouse-Extras/libuv/blob/e2e9b7e9f978ce8a1367b5fe781d97d1ce9f94ab/LICENSE) | +| llvm | [Apache](https://github.com/ClickHouse-Extras/llvm/blob/e5751459412bce1391fb7a2e9bbc01e131bf72f1/llvm/LICENSE.TXT) | +| lz4 | [BSD](https://github.com/lz4/lz4/blob/f39b79fb02962a1cd880bbdecb6dffba4f754a11/LICENSE) | +| mariadb-connector-c | [LGPL](https://github.com/ClickHouse-Extras/mariadb-connector-c/blob/5f4034a3a6376416504f17186c55fe401c6d8e5e/COPYING.LIB) | +| miniselect | [Boost](https://github.com/danlark1/miniselect/blob/be0af6bd0b6eb044d1acc4f754b229972d99903a/LICENSE_1_0.txt) | +| msgpack-c | [Boost](https://github.com/msgpack/msgpack-c/blob/46684265d50b5d1b062d4c5c428ba08462844b1d/LICENSE_1_0.txt) | +| murmurhash | [Public Domain](https://github.com/ClickHouse/ClickHouse/blob/master/contrib/murmurhash/LICENSE) | +| NuRaft | [Apache](https://github.com/ClickHouse-Extras/NuRaft/blob/7ecb16844af6a9c283ad432d85ecc2e7d1544676/LICENSE) | +| openldap | [Unknown](https://github.com/ClickHouse-Extras/openldap/blob/0208811b6043ca06fda8631a5e473df1ec515ccb/LICENSE) | +| orc | [Apache](https://github.com/ClickHouse-Extras/orc/blob/0a936f6bbdb9303308973073f8623b5a8d82eae1/LICENSE) | +| poco | [Boost](https://github.com/ClickHouse-Extras/poco/blob/7351c4691b5d401f59e3959adfc5b4fa263b32da/LICENSE) | +| protobuf | [BSD 3-clause](https://github.com/ClickHouse-Extras/protobuf/blob/75601841d172c73ae6bf4ce8121f42b875cdbabd/LICENSE) | +| rapidjson | [MIT](https://github.com/ClickHouse-Extras/rapidjson/blob/c4ef90ccdbc21d5d5a628d08316bfd301e32d6fa/bin/jsonschema/LICENSE) | +| re2 | [BSD 3-clause](https://github.com/google/re2/blob/13ebb377c6ad763ca61d12dd6f88b1126bd0b911/LICENSE) | +| replxx | [BSD 3-clause](https://github.com/ClickHouse-Extras/replxx/blob/c81be6c68b146f15f2096b7ef80e3f21fe27004c/LICENSE.md) | +| rocksdb | [BSD 3-clause](https://github.com/ClickHouse-Extras/rocksdb/blob/b6480c69bf3ab6e298e0d019a07fd4f69029b26a/LICENSE.leveldb) | +| s2geometry | [Apache](https://github.com/ClickHouse-Extras/s2geometry/blob/20ea540d81f4575a3fc0aea585aac611bcd03ede/LICENSE) | +| sentry-native | [MIT](https://github.com/ClickHouse-Extras/sentry-native/blob/94644e92f0a3ff14bd35ed902a8622a2d15f7be4/LICENSE) | +| simdjson | [Apache](https://github.com/simdjson/simdjson/blob/8df32cea3359cb30120795da6020b3b73da01d38/LICENSE) | +| snappy | [Public Domain](https://github.com/google/snappy/blob/3f194acb57e0487531c96b97af61dcbd025a78a3/COPYING) | +| sparsehash-c11 | [BSD 3-clause](https://github.com/sparsehash/sparsehash-c11/blob/cf0bffaa456f23bc4174462a789b90f8b6f5f42f/LICENSE) | +| stats | [Apache](https://github.com/kthohr/stats/blob/b6dd459c10a88c7ea04693c007e9e35820c5d9ad/LICENSE) | +| thrift | [Apache](https://github.com/apache/thrift/blob/010ccf0a0c7023fea0f6bf4e4078ebdff7e61982/LICENSE) | +| unixodbc | [LGPL](https://github.com/ClickHouse-Extras/UnixODBC/blob/b0ad30f7f6289c12b76f04bfb9d466374bb32168/COPYING) | +| xz | [Public Domain](https://github.com/xz-mirror/xz/blob/869b9d1b4edd6df07f819d360d306251f8147353/COPYING) | +| zlib-ng | [zLib](https://github.com/ClickHouse-Extras/zlib-ng/blob/6a5e93b9007782115f7f7e5235dedc81c4f1facb/LICENSE.md) | +| zstd | [BSD](https://github.com/facebook/zstd/blob/a488ba114ec17ea1054b9057c26a046fc122b3b6/LICENSE) | + +Список всех сторонних библиотек можно получить с помощью запроса: + +``` sql +SELECT library_name, license_type, license_path FROM system.licenses ORDER BY library_name COLLATE 'en'; +``` + +[Пример](https://gh-api.clickhouse.tech/play?user=play#U0VMRUNUIGxpYnJhcnlfbmFtZSwgbGljZW5zZV90eXBlLCBsaWNlbnNlX3BhdGggRlJPTSBzeXN0ZW0ubGljZW5zZXMgT1JERVIgQlkgbGlicmFyeV9uYW1lIENPTExBVEUgJ2VuJw==) ## Рекомендации по добавлению сторонних библиотек и поддержанию в них пользовательских изменений {#adding-third-party-libraries} diff --git a/docs/ru/development/developer-instruction.md b/docs/ru/development/developer-instruction.md index d23c0bbbdca..c568db4731f 100644 --- a/docs/ru/development/developer-instruction.md +++ b/docs/ru/development/developer-instruction.md @@ -168,7 +168,13 @@ sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" 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 для сборки: diff --git a/docs/ru/engines/database-engines/materialized-mysql.md b/docs/ru/engines/database-engines/materialized-mysql.md index 0175e794cd5..1cd864c01e9 100644 --- a/docs/ru/engines/database-engines/materialized-mysql.md +++ b/docs/ru/engines/database-engines/materialized-mysql.md @@ -1,10 +1,12 @@ --- toc_priority: 29 -toc_title: MaterializedMySQL +toc_title: "[experimental] MaterializedMySQL" --- # [экспериментальный] MaterializedMySQL {#materialized-mysql} +**Это экспериментальный движок, который не следует использовать в продакшене.** + Создает базу данных ClickHouse со всеми таблицами, существующими в MySQL, и всеми данными в этих таблицах. Сервер ClickHouse работает как реплика MySQL. Он читает файл binlog и выполняет DDL and DML-запросы. @@ -23,6 +25,32 @@ ENGINE = MaterializedMySQL('host:port', ['database' | database], 'user', 'passwo - `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} При работе с движком баз данных `MaterializedMySQL` используются таблицы семейства [ReplacingMergeTree](../../engines/table-engines/mergetree-family/replacingmergetree.md) с виртуальными столбцами `_sign` и `_version`. @@ -51,13 +79,21 @@ ENGINE = MaterializedMySQL('host:port', ['database' | database], 'user', 'passwo | 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-запрос, он его игнорирует. @@ -158,3 +194,4 @@ SELECT * FROM mysql.test; └───┴─────┴──────┘ ``` +[Оригинальная статья](https://clickhouse.tech/docs/ru/engines/database-engines/materialized-mysql/) diff --git a/docs/ru/engines/database-engines/replicated.md b/docs/ru/engines/database-engines/replicated.md index f1d5755647a..b4850a8dafd 100644 --- a/docs/ru/engines/database-engines/replicated.md +++ b/docs/ru/engines/database-engines/replicated.md @@ -1,3 +1,7 @@ +--- +toc_priority: 36 +toc_title: Replicated +--- # [экспериментальный] Replicated {#replicated} diff --git a/docs/ru/engines/database-engines/sqlite.md b/docs/ru/engines/database-engines/sqlite.md new file mode 100644 index 00000000000..987ac187429 --- /dev/null +++ b/docs/ru/engines/database-engines/sqlite.md @@ -0,0 +1,79 @@ +--- +toc_priority: 32 +toc_title: SQLite +--- + +# SQLite {#sqlite} + +Движок баз данных позволяет подключаться к базе [SQLite](https://www.sqlite.org/index.html) и выполнять запросы `INSERT` и `SELECT` для обмена данными между ClickHouse и SQLite. + +## Создание базы данных {#creating-a-database} + +``` sql + CREATE DATABASE sqlite_database + ENGINE = SQLite('db_path') +``` + +**Параметры движка** + +- `db_path` — путь к файлу с базой данных SQLite. + +## Поддерживаемые типы данных {#data_types-support} + +| SQLite | ClickHouse | +|---------------|---------------------------------------------------------| +| INTEGER | [Int32](../../sql-reference/data-types/int-uint.md) | +| REAL | [Float32](../../sql-reference/data-types/float.md) | +| TEXT | [String](../../sql-reference/data-types/string.md) | +| BLOB | [String](../../sql-reference/data-types/string.md) | + +## Особенности и рекомендации {#specifics-and-recommendations} + +SQLite хранит всю базу данных (определения, таблицы, индексы и сами данные) в виде единого кроссплатформенного файла на хост-машине. Во время записи SQLite блокирует весь файл базы данных, поэтому операции записи выполняются последовательно. Операции чтения могут быть многозадачными. +SQLite не требует управления службами (например, сценариями запуска) или контроля доступа на основе `GRANT` и паролей. Контроль доступа осуществляется с помощью разрешений файловой системы, предоставляемых самому файлу базы данных. + +## Примеры использования {#usage-example} + +Отобразим список таблиц базы данных в ClickHouse, подключенной к SQLite: + +``` sql +CREATE DATABASE sqlite_db ENGINE = SQLite('sqlite.db'); +SHOW TABLES FROM sqlite_db; +``` + +``` text +┌──name───┐ +│ table1 │ +│ table2 │ +└─────────┘ +``` +Отобразим содержимое таблицы: + +``` sql +SELECT * FROM sqlite_db.table1; +``` + +``` text +┌─col1──┬─col2─┐ +│ line1 │ 1 │ +│ line2 │ 2 │ +│ line3 │ 3 │ +└───────┴──────┘ +``` +Вставим данные в таблицу SQLite из таблицы ClickHouse: + +``` sql +CREATE TABLE clickhouse_table(`col1` String,`col2` Int16) ENGINE = MergeTree() ORDER BY col2; +INSERT INTO clickhouse_table VALUES ('text',10); +INSERT INTO sqlite_db.table1 SELECT * FROM clickhouse_table; +SELECT * FROM sqlite_db.table1; +``` + +``` text +┌─col1──┬─col2─┐ +│ line1 │ 1 │ +│ line2 │ 2 │ +│ line3 │ 3 │ +│ text │ 10 │ +└───────┴──────┘ +``` diff --git a/docs/ru/engines/table-engines/integrations/sqlite.md b/docs/ru/engines/table-engines/integrations/sqlite.md new file mode 100644 index 00000000000..825b49cfde6 --- /dev/null +++ b/docs/ru/engines/table-engines/integrations/sqlite.md @@ -0,0 +1,59 @@ +--- +toc_priority: 7 +toc_title: SQLite +--- + +# SQLite {#sqlite} + +Движок позволяет импортировать и экспортировать данные из SQLite, а также поддерживает отправку запросов к таблицам SQLite напрямую из ClickHouse. + +## Создание таблицы {#creating-a-table} + +``` sql + CREATE TABLE [IF NOT EXISTS] [db.]table_name + ( + name1 [type1], + name2 [type2], ... + ) ENGINE = SQLite('db_path', 'table') +``` + +**Параметры движка** + +- `db_path` — путь к файлу с базой данных SQLite. +- `table` — имя таблицы в базе данных SQLite. + +## Примеры использования {#usage-example} + +Отобразим запрос, с помощью которого была создана таблица SQLite: + +```sql +SHOW CREATE TABLE sqlite_db.table2; +``` + +``` text +CREATE TABLE SQLite.table2 +( + `col1` Nullable(Int32), + `col2` Nullable(String) +) +ENGINE = SQLite('sqlite.db','table2'); +``` + +Получим данные из таблицы: + +``` sql +SELECT * FROM sqlite_db.table2 ORDER BY col1; +``` + +```text +┌─col1─┬─col2──┐ +│ 1 │ text1 │ +│ 2 │ text2 │ +│ 3 │ text3 │ +└──────┴───────┘ +``` + +**См. также** + +- [SQLite](../../../engines/database-engines/sqlite.md) движок баз данных +- [sqlite](../../../sql-reference/table-functions/sqlite.md) табличная функция diff --git a/docs/ru/engines/table-engines/mergetree-family/graphitemergetree.md b/docs/ru/engines/table-engines/mergetree-family/graphitemergetree.md index 891d5227100..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. @@ -173,4 +171,4 @@ default !!! warning "Внимание" - Прореживание данных производится во время слияний. Обычно для старых партций слияния не запускаются, поэтому для прореживания надо иницировать незапланированное слияние используя [optimize](../../../sql-reference/statements/optimize/). Или использовать дополнительные инструменты, например [graphite-ch-optimizer](https://github.com/innogames/graphite-ch-optimizer). + Прореживание данных производится во время слияний. Обычно для старых партций слияния не запускаются, поэтому для прореживания надо иницировать незапланированное слияние используя [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 4bced6254d1..e8152441101 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` — список правил, определяющих длительности хранения строк, а также задающих правила перемещения частей на определённые тома или диски. Необязательный параметр. @@ -86,7 +86,9 @@ ORDER BY expr - `enable_mixed_granularity_parts` — включает или выключает переход к ограничению размера гранул с помощью настройки `index_granularity_bytes`. Настройка `index_granularity_bytes` улучшает производительность ClickHouse при выборке данных из таблиц с большими (десятки и сотни мегабайтов) строками. Если у вас есть таблицы с большими строками, можно включить эту настройку, чтобы повысить эффективность запросов `SELECT`. - `use_minimalistic_part_header_in_zookeeper` — Способ хранения заголовков кусков данных в ZooKeeper. Если `use_minimalistic_part_header_in_zookeeper = 1`, то ZooKeeper хранит меньше данных. Подробнее читайте в [описании настройки](../../../operations/server-configuration-parameters/settings.md#server-settings-use_minimalistic_part_header_in_zookeeper) в разделе "Конфигурационные параметры сервера". - `min_merge_bytes_to_use_direct_io` — минимальный объём данных при слиянии, необходимый для прямого (небуферизованного) чтения/записи (direct I/O) на диск. При слиянии частей данных ClickHouse вычисляет общий объём хранения всех данных, подлежащих слиянию. Если общий объём хранения всех данных для чтения превышает `min_bytes_to_use_direct_io` байт, тогда ClickHouse использует флаг `O_DIRECT` при чтении данных с диска. Если `min_merge_bytes_to_use_direct_io = 0`, тогда прямой ввод-вывод отключен. Значение по умолчанию: `10 * 1024 * 1024 * 1024` байтов. - - `merge_with_ttl_timeout` — минимальное время в секундах перед повторным слиянием с TTL. По умолчанию — 86400 (1 день). + - `merge_with_ttl_timeout` — минимальное время в секундах перед повторным слиянием для удаления данных с истекшим TTL. По умолчанию: `14400` секунд (4 часа). + - `merge_with_recompression_ttl_timeout` — минимальное время в секундах перед повторным слиянием для повторного сжатия данных с истекшим TTL. По умолчанию: `14400` секунд (4 часа). + - `try_fetch_recompressed_part_timeout` — время ожидания (в секундах) перед началом слияния с повторным сжатием. В течение этого времени ClickHouse пытается извлечь сжатую часть из реплики, которая назначила это слияние. Значение по умолчанию: `7200` секунд (2 часа). - `write_final_mark` — включает или отключает запись последней засечки индекса в конце куска данных, указывающей за последний байт. По умолчанию — 1. Не отключайте её. - `merge_max_block_size` — максимальное количество строк в блоке для операций слияния. Значение по умолчанию: 8192. - `storage_policy` — политика хранения данных. Смотрите [Хранение данных таблицы на нескольких блочных устройствах](#table_engine-mergetree-multiple-volumes). @@ -375,6 +377,34 @@ INDEX b (u64 * length(str), i32 + f64 * 100, date, str) TYPE set(100) GRANULARIT - `s != 1` - `NOT startsWith(s, 'test')` +## Проекции {#projections} +Проекции похожи на [материализованные представления](../../../sql-reference/statements/create/view.md#materialized), но определяются на уровне кусков данных. Это обеспечивает гарантии согласованности данных наряду с автоматическим использованием в запросах. + +Проекции — это экспериментальная возможность. Чтобы включить поддержку проекций, установите настройку [allow_experimental_projection_optimization](../../../operations/settings/settings.md#allow-experimental-projection-optimization) в значение `1`. См. также настройку [force_optimize_projection ](../../../operations/settings/settings.md#force-optimize-projection). + +Проекции не поддерживаются для запросов `SELECT` с модификатором [FINAL](../../../sql-reference/statements/select/from.md#select-from-final). + +### Запрос проекции {#projection-query} +Запрос проекции — это то, что определяет проекцию. Такой запрос неявно выбирает данные из родительской таблицы. +**Синтаксис** + +```sql +SELECT [GROUP BY] [ORDER BY] +``` + +Проекции можно изменить или удалить с помощью запроса [ALTER](../../../sql-reference/statements/alter/projection.md). + +### Хранение проекции {#projection-storage} +Проекции хранятся в каталоге куска данных. Это похоже на хранение индексов, но используется подкаталог, в котором хранится анонимный кусок таблицы `MergeTree`. Таблица создается запросом определения проекции. +Если присутствует секция `GROUP BY`, то используется движок [AggregatingMergeTree](aggregatingmergetree.md), а все агрегатные функции преобразуются в `AggregateFunction`. +Если присутствует секция `ORDER BY`, таблица `MergeTree` использует ее в качестве выражения для первичного ключа. +Во время процесса слияния кусок данных проекции объединяется с помощью процедуры слияния хранилища. Контрольная сумма куска данных родительской таблицы включает кусок данных проекции. Другие процедуры аналогичны индексам пропуска данных. + +### Анализ запросов {#projection-query-analysis} +1. Проверьте, можно ли использовать проекцию в данном запросе, то есть, что с ней получается тот же результат, что и с запросом к базовой таблице. +2. Выберите наиболее подходящее совпадение, содержащее наименьшее количество гранул для чтения. +3. План запроса, который использует проекции, отличается от того, который использует исходные куски данных. Если в некоторых кусках проекции отсутствуют, можно расширить план, чтобы «проецировать» на лету. + ## Конкурентный доступ к данным {#concurrent-data-access} Для конкурентного доступа к таблице используется мультиверсионность. То есть, при одновременном чтении и обновлении таблицы, данные будут читаться из набора кусочков, актуального на момент запроса. Длинных блокировок нет. Вставки никак не мешают чтениям. @@ -383,20 +413,22 @@ INDEX b (u64 * length(str), i32 + f64 * 100, date, str) TYPE set(100) GRANULARIT ## TTL для столбцов и таблиц {#table_engine-mergetree-ttl} -Определяет время жизни значений, а также правила перемещения данных на другой диск или том. +Определяет время жизни значений. -Секция `TTL` может быть установлена как для всей таблицы, так и для каждого отдельного столбца. Правила `TTL` для таблицы позволяют указать целевые диски или тома для фонового перемещения на них частей данных. +Секция `TTL` может быть установлена как для всей таблицы, так и для каждого отдельного столбца. Для таблиц можно установить правила `TTL` для фонового перемещения кусков данных на целевые диски или тома, или правила повторного сжатия кусков данных. Выражения должны возвращать тип [Date](../../../engines/table-engines/mergetree-family/mergetree.md) или [DateTime](../../../engines/table-engines/mergetree-family/mergetree.md). -Для задания времени жизни столбца, например: +**Синтаксис** + +Для задания времени жизни столбца: ``` sql TTL time_column TTL time_column + interval ``` -Чтобы задать `interval`, используйте операторы [интервала времени](../../../engines/table-engines/mergetree-family/mergetree.md#operators-datetime). +Чтобы задать `interval`, используйте операторы [интервала времени](../../../engines/table-engines/mergetree-family/mergetree.md#operators-datetime), например: ``` sql TTL date_time + INTERVAL 1 MONTH @@ -405,13 +437,13 @@ TTL date_time + INTERVAL 15 HOUR ### TTL столбца {#mergetree-column-ttl} -Когда срок действия значений в столбце истечет, ClickHouse заменит их значениями по умолчанию для типа данных столбца. Если срок действия всех значений столбцов в части данных истек, ClickHouse удаляет столбец из куска данных в файловой системе. +Когда срок действия значений в столбце истечёт, ClickHouse заменит их значениями по умолчанию для типа данных столбца. Если срок действия всех значений столбцов в части данных истек, ClickHouse удаляет столбец из куска данных в файловой системе. Секцию `TTL` нельзя использовать для ключевых столбцов. -Примеры: +**Примеры** -Создание таблицы с TTL +Создание таблицы с `TTL`: ``` sql CREATE TABLE example_table @@ -426,7 +458,7 @@ PARTITION BY toYYYYMM(d) ORDER BY d; ``` -Добавление TTL на колонку существующей таблицы +Добавление `TTL` на колонку существующей таблицы: ``` sql ALTER TABLE example_table @@ -434,7 +466,7 @@ ALTER TABLE example_table c String TTL d + INTERVAL 1 DAY; ``` -Изменение TTL у колонки +Изменение `TTL` у колонки: ``` sql ALTER TABLE example_table @@ -444,23 +476,24 @@ ALTER TABLE example_table ### TTL таблицы {#mergetree-table-ttl} -Для таблицы можно задать одно выражение для устаревания данных, а также несколько выражений, по срабатывании которых данные переместятся на [некоторый диск или том](#table_engine-mergetree-multiple-volumes). Когда некоторые данные в таблице устаревают, ClickHouse удаляет все соответствующие строки. +Для таблицы можно задать одно выражение для устаревания данных, а также несколько выражений, при срабатывании которых данные будут перемещены на [некоторый диск или том](#table_engine-mergetree-multiple-volumes). Когда некоторые данные в таблице устаревают, ClickHouse удаляет все соответствующие строки. Операции перемещения или повторного сжатия данных выполняются только когда устаревают все данные в куске. ``` sql TTL expr - [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'][, DELETE|TO DISK 'aaa'|TO VOLUME 'bbb'] ... + [DELETE|RECOMPRESS codec_name1|TO DISK 'xxx'|TO VOLUME 'xxx'][, DELETE|RECOMPRESS codec_name2|TO DISK 'aaa'|TO VOLUME 'bbb'] ... [WHERE conditions] [GROUP BY key_expr [SET v1 = aggr_func(v1) [, v2 = aggr_func(v2) ...]] ] ``` -За каждым TTL выражением может следовать тип действия, которое выполняется после достижения времени, соответствующего результату TTL выражения: +За каждым `TTL` выражением может следовать тип действия, которое выполняется после достижения времени, соответствующего результату `TTL` выражения: - `DELETE` - удалить данные (действие по умолчанию); +- `RECOMPRESS codec_name` - повторно сжать данные с помощью кодека `codec_name`; - `TO DISK 'aaa'` - переместить данные на диск `aaa`; - `TO VOLUME 'bbb'` - переместить данные на том `bbb`; - `GROUP BY` - агрегировать данные. -В секции `WHERE` можно задать условие удаления или агрегирования устаревших строк (для перемещения условие `WHERE` не применимо). +В секции `WHERE` можно задать условие удаления или агрегирования устаревших строк (для перемещения и сжатия условие `WHERE` не применимо). Колонки, по которым агрегируются данные в `GROUP BY`, должны являться префиксом первичного ключа таблицы. @@ -468,7 +501,7 @@ TTL expr **Примеры** -Создание таблицы с TTL: +Создание таблицы с `TTL`: ``` sql CREATE TABLE example_table @@ -484,7 +517,7 @@ TTL d + INTERVAL 1 MONTH [DELETE], d + INTERVAL 2 WEEK TO DISK 'bbb'; ``` -Изменение TTL: +Изменение `TTL`: ``` sql ALTER TABLE example_table @@ -505,6 +538,21 @@ ORDER BY d TTL d + INTERVAL 1 MONTH DELETE WHERE toDayOfWeek(d) = 1; ``` +Создание таблицы, в которой куски с устаревшими данными повторно сжимаются: + +```sql +CREATE TABLE table_for_recompression +( + d DateTime, + key UInt64, + value String +) ENGINE MergeTree() +ORDER BY tuple() +PARTITION BY key +TTL d + INTERVAL 1 MONTH RECOMPRESS CODEC(ZSTD(17)), d + INTERVAL 1 YEAR RECOMPRESS CODEC(LZ4HC(10)) +SETTINGS min_rows_for_wide_part = 0, min_bytes_for_wide_part = 0; +``` + Создание таблицы, где устаревшие строки агрегируются. В результирующих строках колонка `x` содержит максимальное значение по сгруппированным строкам, `y` — минимальное значение, а `d` — случайное значение из одной из сгуппированных строк. ``` sql @@ -521,14 +569,18 @@ ORDER BY (k1, k2) TTL d + INTERVAL 1 MONTH GROUP BY k1, k2 SET x = max(x), y = min(y); ``` -**Удаление данных** +### Удаление устаревших данных {#mergetree-removing-expired-data} -Данные с истекшим TTL удаляются, когда ClickHouse мёржит куски данных. +Данные с истекшим `TTL` удаляются, когда ClickHouse мёржит куски данных. Когда ClickHouse видит, что некоторые данные устарели, он выполняет внеплановые мёржи. Для управление частотой подобных мёржей, можно задать настройку `merge_with_ttl_timeout`. Если её значение слишком низкое, придется выполнять много внеплановых мёржей, которые могут начать потреблять значительную долю ресурсов сервера. Если вы выполните запрос `SELECT` между слияниями вы можете получить устаревшие данные. Чтобы избежать этого используйте запрос [OPTIMIZE](../../../engines/table-engines/mergetree-family/mergetree.md#misc_operations-optimize) перед `SELECT`. +**См. также** + +- настройку [ttl_only_drop_parts](../../../operations/settings/settings.md#ttl_only_drop_parts) + ## Хранение данных таблицы на нескольких блочных устройствах {#table_engine-mergetree-multiple-volumes} ### Введение {#introduction} @@ -809,44 +861,3 @@ SETTINGS storage_policy = 'moving_from_ssd_to_hdd' ``` Если диск сконфигурирован как `cold`, данные будут переноситься в S3 при срабатывании правил TTL или когда свободное место на локальном диске станет меньше порогового значения, которое определяется как `move_factor * disk_size`. - -## Использование сервиса HDFS для хранения данных {#table_engine-mergetree-hdfs} - -[HDFS](https://hadoop.apache.org/docs/r1.2.1/hdfs_design.html) — это распределенная файловая система для удаленного хранения данных. - -Таблицы семейства `MergeTree` могут хранить данные в сервисе HDFS при использовании диска типа `HDFS`. - -Пример конфигурации: -``` xml - - - - - hdfs - hdfs://hdfs1:9000/clickhouse/ - - - - - -
- hdfs -
-
-
-
-
- - - 0 - -
-``` - -Обязательные параметры: - -- `endpoint` — URL точки приема запроса на стороне HDFS в формате `path`. URL точки должен содержать путь к корневой директории на сервере, где хранятся данные. - -Необязательные параметры: - -- `min_bytes_for_seek` — минимальное количество байтов, которые используются для операций поиска вместо последовательного чтения. Значение по умолчанию: 1 МБайт. diff --git a/docs/ru/engines/table-engines/mergetree-family/replication.md b/docs/ru/engines/table-engines/mergetree-family/replication.md index 6a259ebd3b8..db749ba455e 100644 --- a/docs/ru/engines/table-engines/mergetree-family/replication.md +++ b/docs/ru/engines/table-engines/mergetree-family/replication.md @@ -102,7 +102,7 @@ CREATE TABLE table_name ) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}', ver) PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) -SAMPLE BY intHash32(UserID) +SAMPLE BY intHash32(UserID); ```
@@ -115,12 +115,12 @@ CREATE TABLE table_name EventDate DateTime, CounterID UInt32, UserID UInt32 -) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}', EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID), EventTime), 8192) +) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}', EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID), EventTime), 8192); ```
-Как видно в примере, эти параметры могут содержать подстановки в фигурных скобках. Подставляемые значения достаются из конфигурационного файла, из секции «[macros](../../../operations/server-configuration-parameters/settings/#macros)». +Как видно в примере, эти параметры могут содержать подстановки в фигурных скобках. Эти подстановки заменяются на соответствующие значения из конфигурационного файла, из секции [macros](../../../operations/server-configuration-parameters/settings.md#macros). Пример: diff --git a/docs/ru/engines/table-engines/special/buffer.md b/docs/ru/engines/table-engines/special/buffer.md index ba865b72b78..0c1ae591ae3 100644 --- a/docs/ru/engines/table-engines/special/buffer.md +++ b/docs/ru/engines/table-engines/special/buffer.md @@ -48,7 +48,10 @@ CREATE TABLE merge.hits_buffer AS merge.hits ENGINE = Buffer(merge, hits, 16, 10 Если у одного из столбцов таблицы Buffer и подчинённой таблицы не совпадает тип, то в лог сервера будет записано сообщение об ошибке и буфер будет очищен. То же самое происходит, если подчинённая таблица не существует в момент сброса буфера. -Если есть необходимость выполнить ALTER для подчинённой таблицы и для таблицы Buffer, то рекомендуется удалить таблицу Buffer, затем выполнить ALTER подчинённой таблицы, а затем создать таблицу Buffer заново. +Если есть необходимость выполнить ALTER для подчинённой таблицы и для таблицы Buffer, то рекомендуется удалить таблицу Buffer, затем выполнить ALTER подчинённой таблицы, а после создать таблицу Buffer заново. + +!!! attention "Внимание" + В релизах до 28 сентября 2020 года выполнение ALTER на таблице Buffer ломает структуру блоков и вызывает ошибку (см. [#15117](https://github.com/ClickHouse/ClickHouse/issues/15117)), поэтому удаление буфера и его пересоздание — единственный вариант миграции для данного движка. Перед выполнением ALTER на таблице Buffer убедитесь, что в вашей версии эта ошибка устранена. При нештатном перезапуске сервера, данные, находящиеся в буфере, будут потеряны. diff --git a/docs/ru/interfaces/cli.md b/docs/ru/interfaces/cli.md index 277b73a6d36..bbb66b70371 100644 --- a/docs/ru/interfaces/cli.md +++ b/docs/ru/interfaces/cli.md @@ -26,7 +26,7 @@ Connected to ClickHouse server version 20.13.1 revision 54442. Клиент может быть использован в интерактивном и не интерактивном (batch) режиме. Чтобы использовать batch режим, укажите параметр query, или отправьте данные в stdin (проверяется, что stdin - не терминал), или и то, и другое. -Аналогично HTTP интерфейсу, при использовании одновременно параметра query и отправке данных в stdin, запрос составляется из конкатенации параметра query, перевода строки, и данных в stdin. Это удобно для больших INSERT запросов. +Аналогично HTTP интерфейсу, при использовании одновременно параметра query и отправке данных в stdin, запрос составляется из конкатенации параметра query, перевода строки и данных в stdin. Это удобно для больших `INSERT` запросов. Примеры использования клиента для вставки данных: @@ -41,17 +41,17 @@ _EOF $ cat file.csv | clickhouse-client --database=test --query="INSERT INTO test FORMAT CSV"; ``` -В batch режиме в качестве формата данных по умолчанию используется формат TabSeparated. Формат может быть указан в секции FORMAT запроса. +В batch режиме в качестве формата данных по умолчанию используется формат `TabSeparated`. Формат может быть указан в запросе в секции `FORMAT`. -По умолчанию, в batch режиме вы можете выполнить только один запрос. Чтобы выполнить несколько запросов из «скрипта», используйте параметр –multiquery. Это работает для всех запросов кроме INSERT. Результаты запросов выводятся подряд без дополнительных разделителей. -Также, при необходимости выполнить много запросов, вы можете запускать clickhouse-client на каждый запрос. Заметим, что запуск программы clickhouse-client может занимать десятки миллисекунд. +По умолчанию в batch режиме вы можете выполнить только один запрос. Чтобы выполнить несколько запросов из «скрипта», используйте параметр `–-multiquery`. Это работает для всех запросов кроме `INSERT`. Результаты запросов выводятся подряд без дополнительных разделителей. +Если нужно выполнить много запросов, вы можете запускать clickhouse-client отдельно на каждый запрос. Заметим, что запуск программы clickhouse-client может занимать десятки миллисекунд. -В интерактивном режиме, вы получите командную строку, в которую можно вводить запросы. +В интерактивном режиме вы получаете командную строку, в которую можно вводить запросы. Если не указано multiline (по умолчанию): -Чтобы выполнить запрос, нажмите Enter. Точка с запятой на конце запроса не обязательна. Чтобы ввести запрос, состоящий из нескольких строк, перед переводом строки, введите символ обратного слеша: `\` - тогда после нажатия Enter, вам предложат ввести следующую строку запроса. +Чтобы выполнить запрос, нажмите Enter. Точка с запятой на конце запроса необязательна. Чтобы ввести запрос, состоящий из нескольких строк, в конце строки поставьте символ обратного слеша `\`, тогда после нажатия Enter вы сможете ввести следующую строку запроса. -Если указано multiline (многострочный режим): +Если указан параметр `--multiline` (многострочный режим): Чтобы выполнить запрос, завершите его точкой с запятой и нажмите Enter. Если в конце введённой строки не было точки с запятой, то вам предложат ввести следующую строчку запроса. Исполняется только один запрос, поэтому всё, что введено после точки с запятой, игнорируется. @@ -61,20 +61,20 @@ $ cat file.csv | clickhouse-client --database=test --query="INSERT INTO test FOR Командная строка сделана на основе readline (и history) (или libedit, или без какой-либо библиотеки, в зависимости от сборки) - то есть, в ней работают привычные сочетания клавиш, а также присутствует история. История пишется в `~/.clickhouse-client-history`. -По умолчанию, в качестве формата, используется формат PrettyCompact (красивые таблички). Вы можете изменить формат с помощью секции FORMAT запроса, или с помощью указания `\G` на конце запроса, с помощью аргумента командной строки `--format` или `--vertical`, или с помощью конфигурационного файла клиента. +По умолчанию используется формат вывода `PrettyCompact` (он поддерживает красивый вывод таблиц). Вы можете изменить формат вывода результатов запроса следующими способами: с помощью секции `FORMAT` в запросе, указав символ `\G` в конце запроса, используя аргументы командной строки `--format` или `--vertical` или с помощью конфигурационного файла клиента. -Чтобы выйти из клиента, нажмите Ctrl+D, или наберите вместо запроса одно из: «exit», «quit», «logout», «учше», «йгше», «дщпщге», «exit;», «quit;», «logout;», «учшеж», «йгшеж», «дщпщгеж», «q», «й», «q», «Q», «:q», «й», «Й», «Жй» +Чтобы выйти из клиента, нажмите Ctrl+D или наберите вместо запроса одно из: «exit», «quit», «logout», «учше», «йгше», «дщпщге», «exit;», «quit;», «logout;», «учшеж», «йгшеж», «дщпщгеж», «q», «й», «q», «Q», «:q», «й», «Й», «Жй». -При выполнении запроса, клиент показывает: +При выполнении запроса клиент показывает: -1. Прогресс выполнение запроса, который обновляется не чаще, чем 10 раз в секунду (по умолчанию). При быстрых запросах, прогресс может не успеть отобразиться. +1. Прогресс выполнение запроса, который обновляется не чаще, чем 10 раз в секунду (по умолчанию). При быстрых запросах прогресс может не успеть отобразиться. 2. Отформатированный запрос после его парсинга - для отладки. 3. Результат в заданном формате. 4. Количество строк результата, прошедшее время, а также среднюю скорость выполнения запроса. -Вы можете прервать длинный запрос, нажав Ctrl+C. При этом вам всё равно придётся чуть-чуть подождать, пока сервер остановит запрос. На некоторых стадиях выполнения, запрос невозможно прервать. Если вы не дождётесь и нажмёте Ctrl+C второй раз, то клиент будет завершён. +Вы можете прервать длинный запрос, нажав Ctrl+C. При этом вам всё равно придётся чуть-чуть подождать, пока сервер остановит запрос. На некоторых стадиях выполнения запрос невозможно прервать. Если вы не дождётесь и нажмёте Ctrl+C второй раз, то клиент будет завершён. -Клиент командной строки позволяет передать внешние данные (внешние временные таблицы) для использования запроса. Подробнее смотрите раздел «Внешние данные для обработки запроса» +Клиент командной строки позволяет передать внешние данные (внешние временные таблицы) для выполнения запроса. Подробнее смотрите раздел «Внешние данные для обработки запроса». ### Запросы с параметрами {#cli-queries-with-parameters} @@ -84,7 +84,7 @@ $ cat file.csv | clickhouse-client --database=test --query="INSERT INTO test FOR clickhouse-client --param_parName="[1, 2]" -q "SELECT * FROM table WHERE a = {parName:Array(UInt16)}" ``` -#### Cинтаксис запроса {#cli-queries-with-parameters-syntax} +#### Синтаксис запроса {#cli-queries-with-parameters-syntax} Отформатируйте запрос обычным способом. Представьте значения, которые вы хотите передать из параметров приложения в запрос в следующем формате: @@ -155,3 +155,29 @@ $ clickhouse-client --param_tbl="numbers" --param_db="system" --param_col="numbe ``` +### Формат ID запроса {#query-id-format} + +В интерактивном режиме `clickhouse-client` показывает ID для каждого запроса. По умолчанию ID выводится в таком виде: + +```sql +Query id: 927f137d-00f1-4175-8914-0dd066365e96 +``` + +Произвольный формат ID можно задать в конфигурационном файле внутри тега `query_id_formats`. ID подставляется вместо `{query_id}` в строке формата. В теге может быть перечислено несколько строк формата. +Эта возможность может быть полезна для генерации URL, с помощью которых выполняется профилирование запросов. + +**Пример** + +```xml + + + http://speedscope-host/#profileURL=qp%3Fid%3D{query_id} + + +``` + +Если применить приведённую выше конфигурацию, то ID запроса будет выводиться в следующем виде: + +``` text +speedscope:http://speedscope-host/#profileURL=qp%3Fid%3Dc8ecc783-e753-4b38-97f1-42cddfb98b7d +``` diff --git a/docs/ru/operations/configuration-files.md b/docs/ru/operations/configuration-files.md index 8b4b0da8f2b..2d39aa20375 100644 --- a/docs/ru/operations/configuration-files.md +++ b/docs/ru/operations/configuration-files.md @@ -6,19 +6,51 @@ toc_title: "Конфигурационные файлы" # Конфигурационные файлы {#configuration_files} -Основной конфигурационный файл сервера - `config.xml` или `config.yaml`. Он расположен в директории `/etc/clickhouse-server/`. +ClickHouse поддерживает многофайловое управление конфигурацией. Основной конфигурационный файл сервера — `/etc/clickhouse-server/config.xml` или `/etc/clickhouse-server/config.yaml`. Остальные файлы должны находиться в директории `/etc/clickhouse-server/config.d`. Обратите внимание, что конфигурационные файлы могут быть записаны в форматах XML или YAML, но смешение этих форматов в одном файле не поддерживается. Например, можно хранить основные конфигурационные файлы как `config.xml` и `users.xml`, а дополнительные файлы записать в директории `config.d` и `users.d` в формате `.yaml`. -Отдельные настройки могут быть переопределены в файлах `*.xml` и `*.conf`, а также `.yaml` (для файлов в формате YAML) из директории `config.d` рядом с конфигом. +Все XML файлы должны иметь одинаковый корневой элемент, обычно ``. Для YAML элемент `yandex:` должен отсутствовать, так как парсер вставляет его автоматически. -У элементов этих конфигурационных файлов могут быть указаны атрибуты `replace` или `remove`. +## Переопределение {#override} -Если ни один не указан - объединить содержимое элементов рекурсивно с заменой значений совпадающих детей. +Некоторые настройки, определенные в основном конфигурационном файле, могут быть переопределены в других файлах: -Если указано `replace` - заменить весь элемент на указанный. +- У элементов этих конфигурационных файлов могут быть указаны атрибуты `replace` или `remove`. +- Если ни один атрибут не указан, сервер объединит содержимое элементов рекурсивно, заменяя совпадающие значения дочерних элементов. +- Если указан атрибут `replace`, сервер заменит весь элемент на указанный. +- Если указан атрибут `remove`, сервер удалит элемент. -Если указано `remove` - удалить элемент. +Также возможно указать атрибуты как переменные среды с помощью `from_env="VARIABLE_NAME"`: -Также в конфиге могут быть указаны «подстановки». Если у элемента присутствует атрибут `incl`, то в качестве значения будет использована соответствующая подстановка из файла. По умолчанию, путь к файлу с подстановками - `/etc/metrika.xml`. Он может быть изменён в конфигурации сервера в элементе [include_from](server-configuration-parameters/settings.md#server_configuration_parameters-include_from). Значения подстановок указываются в элементах `/yandex/имя_подстановки` этого файла. Если подстановка, заданная в `incl` отсутствует, то в лог попадает соответствующая запись. Чтобы ClickHouse не писал в лог об отсутствии подстановки, необходимо указать атрибут `optional="true"` (например, настройка [macros](server-configuration-parameters/settings.md)). +```xml + + + + + + + +``` + +## Подстановки {#substitution} + +В конфигурационном файле могут быть указаны «подстановки». Если у элемента присутствует атрибут `incl`, то в качестве значения будет использована соответствующая подстановка из файла. По умолчанию путь к файлу с подстановками - `/etc/metrika.xml`. Он может быть изменён в конфигурации сервера в элементе [include_from](server-configuration-parameters/settings.md#server_configuration_parameters-include_from). Значения подстановок указываются в элементах `/yandex/имя_подстановки` этого файла. Если подстановка, заданная в `incl`, отсутствует, то делается соответствующая запись в лог. Чтобы ClickHouse фиксировал в логе отсутствие подстановки, необходимо указать атрибут `optional="true"` (например, настройки для [macros](server-configuration-parameters/settings.md#macros)). + +Если нужно заменить весь элемент подстановкой, можно использовать `include` как имя элемента. + +Пример подстановки XML: + +```xml + + + + + + + + + + +``` Подстановки могут также выполняться из ZooKeeper. Для этого укажите у элемента атрибут `from_zk = "/path/to/node"`. Значение элемента заменится на содержимое узла `/path/to/node` в ZooKeeper. В ZooKeeper-узел также можно положить целое XML-поддерево, оно будет целиком вставлено в исходный элемент. @@ -115,3 +147,9 @@ seq: 123 abc ``` + +## Детали реализации {#implementation-details} + +При старте сервера для каждого конфигурационного файла создаются файлы предобработки `file-preprocessed.xml`. Они содержат все выполненные подстановки и переопределения (эти сведения записываются просто для информации). Если в конфигурационном файле настроены подстановки ZooKeeper, но при старте сервера ZooKeeper не доступен, то сервер загружает конфигурацию из соответствующего файла предобработки. + +Сервер отслеживает как изменения в конфигурационных файлах, так и файлы и узы ZooKeeper, которые были использованы при выполнении подстановок и переопределений, и на ходу перезагружает настройки для пользователей и кластеров. Это означает, что можно изменять кластеры, пользователей и их настройки без перезапуска сервера. diff --git a/docs/ru/operations/server-configuration-parameters/settings.md b/docs/ru/operations/server-configuration-parameters/settings.md index a8ae3f7eb3e..98c5748ba41 100644 --- a/docs/ru/operations/server-configuration-parameters/settings.md +++ b/docs/ru/operations/server-configuration-parameters/settings.md @@ -465,9 +465,9 @@ ClickHouse проверяет условия для `min_part_size` и `min_part Подстановки параметров реплицируемых таблиц. -Можно не указывать, если реплицируемых таблицы не используются. +Можно не указывать, если реплицируемые таблицы не используются. -Подробнее смотрите в разделе «[Создание реплицируемых таблиц](../../engines/table-engines/mergetree-family/replication.md)». +Подробнее смотрите в разделе [Создание реплицируемых таблиц](../../engines/table-engines/mergetree-family/replication.md#creating-replicated-tables). **Пример** diff --git a/docs/ru/operations/settings/settings.md b/docs/ru/operations/settings/settings.md index 209c2e2001d..aac9c30658c 100644 --- a/docs/ru/operations/settings/settings.md +++ b/docs/ru/operations/settings/settings.md @@ -1865,10 +1865,25 @@ ClickHouse генерирует исключение ## input_format_parallel_parsing {#input-format-parallel-parsing} -- Тип: bool -- Значение по умолчанию: True +Включает или отключает режим, при котором входящие данные разбиваются на части, парсинг каждой из которых осуществляется параллельно с сохранением исходного порядка. Поддерживается только для форматов [TSV](../../interfaces/formats.md#tabseparated), [TKSV](../../interfaces/formats.md#tskv), [CSV](../../interfaces/formats.md#csv) и [JSONEachRow](../../interfaces/formats.md#jsoneachrow). -Включает режим, при котором входящие данные парсятся параллельно, но с сохранением исходного порядка следования. Поддерживается только для форматов TSV, TKSV, CSV и JSONEachRow. +Возможные значения: + +- 1 — включен режим параллельного разбора. +- 0 — отключен режим параллельного разбора. + +Значение по умолчанию: `0`. + +## output_format_parallel_formatting {#output-format-parallel-formatting} + +Включает или отключает режим, при котором исходящие данные форматируются параллельно с сохранением исходного порядка. Поддерживается только для форматов [TSV](../../interfaces/formats.md#tabseparated), [TKSV](../../interfaces/formats.md#tskv), [CSV](../../interfaces/formats.md#csv) и [JSONEachRow](../../interfaces/formats.md#jsoneachrow). + +Возможные значения: + +- 1 — включен режим параллельного форматирования. +- 0 — отключен режим параллельного форматирования. + +Значение по умолчанию: `0`. ## min_chunk_bytes_for_parallel_parsing {#min-chunk-bytes-for-parallel-parsing} @@ -3237,3 +3252,25 @@ SETTINGS index_granularity = 8192 │ - 1 — таблица обновляется автоматически в фоновом режиме при обнаружении изменений схемы. Значение по умолчанию: `0`. + +## allow_experimental_projection_optimization {#allow-experimental-projection-optimization} + +Включает или отключает поддержку [проекций](../../engines/table-engines/mergetree-family/mergetree.md#projections) при обработке запросов `SELECT`. + +Возможные значения: + +- 0 — Проекции не поддерживаются. +- 1 — Проекции поддерживаются. + +Значение по умолчанию: `0`. + +## force_optimize_projection {#force-optimize-projection} + +Включает или отключает обязательное использование [проекций](../../engines/table-engines/mergetree-family/mergetree.md#projections) в запросах `SELECT`, если поддержка проекций включена (см. настройку [allow_experimental_projection_optimization](#allow-experimental-projection-optimization)). + +Возможные значения: + +- 0 — Проекции используются опционально. +- 1 — Проекции обязательно используются. + +Значение по умолчанию: `0`. \ No newline at end of file diff --git a/docs/ru/operations/storing-data.md b/docs/ru/operations/storing-data.md index 7af7cf3313d..45b77fdb5ec 100644 --- a/docs/ru/operations/storing-data.md +++ b/docs/ru/operations/storing-data.md @@ -5,10 +5,110 @@ 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)). +Данные, которые обрабатываются в 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). +Для работы с данными, хранящимися в файловой системе `Amazon S3`, используйте движок [S3](../engines/table-engines/integrations/s3.md), а для работы с данными в файловой системе Hadoop — движок [HDFS](../engines/table-engines/integrations/hdfs.md). ## Репликация без копирования данных {#zero-copy} -Для дисков `s3` и `HDFS` в ClickHouse поддерживается репликация без копирования данных (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/opentelemetry_span_log.md b/docs/ru/operations/system-tables/opentelemetry_span_log.md index c421a602300..5c96f22b6c2 100644 --- a/docs/ru/operations/system-tables/opentelemetry_span_log.md +++ b/docs/ru/operations/system-tables/opentelemetry_span_log.md @@ -4,7 +4,7 @@ Столбцы: -- `trace_id` ([UUID](../../sql-reference/data-types/uuid.md) — идентификатор трассировки для выполненного запроса. +- `trace_id` ([UUID](../../sql-reference/data-types/uuid.md)) — идентификатор трассировки для выполненного запроса. - `span_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — идентификатор `trace span`. diff --git a/docs/ru/operations/system-tables/zookeeper_log.md b/docs/ru/operations/system-tables/zookeeper_log.md new file mode 100644 index 00000000000..16f02cb0489 --- /dev/null +++ b/docs/ru/operations/system-tables/zookeeper_log.md @@ -0,0 +1,129 @@ +# system.zookeeper_log {#system-zookeeper_log} + +Эта таблица содержит информацию о параметрах запроса к серверу ZooKeeper и ответа от него. + +Для запросов заполняются только столбцы с параметрами запроса, а остальные столбцы заполняются значениями по умолчанию (`0` или `NULL`). Когда поступает ответ, данные добавляются в столбцы с параметрами ответа на запрос. + +Столбцы с параметрами запроса: + +- `type` ([Enum](../../sql-reference/data-types/enum.md)) — тип события в клиенте ZooKeeper. Может иметь одно из следующих значений: + - `Request` — запрос отправлен. + - `Response` — ответ получен. + - `Finalize` — соединение разорвано, ответ не получен. +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — дата, когда произошло событие. +- `event_time` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — дата и время, когда произошло событие. +- `address` ([IPv6](../../sql-reference/data-types/domains/ipv6.md)) — IP адрес сервера ZooKeeper, с которого был сделан запрос. +- `port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — порт сервера ZooKeeper, с которого был сделан запрос. +- `session_id` ([Int64](../../sql-reference/data-types/int-uint.md)) — идентификатор сессии, который сервер ZooKeeper создает для каждого соединения. +- `xid` ([Int32](../../sql-reference/data-types/int-uint.md)) — идентификатор запроса внутри сессии. Обычно это последовательный номер запроса, одинаковый у строки запроса и у парной строки `response`/`finalize`. +- `has_watch` ([UInt8](../../sql-reference/data-types/int-uint.md)) — установлен ли запрос [watch](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html#ch_zkWatches). +- `op_num` ([Enum](../../sql-reference/data-types/enum.md)) — тип запроса или ответа на запрос. +- `path` ([String](../../sql-reference/data-types/string.md)) — путь к узлу ZooKeeper, указанный в запросе. Пустая строка, если запрос не требует указания пути. +- `data` ([String](../../sql-reference/data-types/string.md)) — данные, записанные на узле ZooKeeper (для запросов `SET` и `CREATE` — что запрос хотел записать, для ответа на запрос `GET` — что было прочитано), или пустая строка. +- `is_ephemeral` ([UInt8](../../sql-reference/data-types/int-uint.md)) — создается ли узел ZooKeeper как [ephemeral](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html#Ephemeral+Nodes). +- `is_sequential` ([UInt8](../../sql-reference/data-types/int-uint.md)) — создается ли узел ZooKeeper как [sequential](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html#Sequence+Nodes+--+Unique+Naming). +- `version` ([Nullable(Int32)](../../sql-reference/data-types/nullable.md)) — версия узла ZooKeeper, которую запрос ожидает увидеть при выполнении. Поддерживается для запросов `CHECK`, `SET`, `REMOVE` (`-1` — запрос не проверяет версию, `NULL` — для других запросов, которые не поддерживают проверку версии). +- `requests_size` ([UInt32](../../sql-reference/data-types/int-uint.md)) — количество запросов, включенных в мультизапрос (это специальный запрос, который состоит из нескольких последовательных обычных запросов, выполняющихся атомарно). Все запросы, включенные в мультизапрос, имеют одинаковый `xid`. +- `request_idx` ([UInt32](../../sql-reference/data-types/int-uint.md)) — номер запроса, включенного в мультизапрос (`0` — для мультизапроса, далее по порядку с `1`). + +Столбцы с параметрами ответа на запрос: + +- `zxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — идентификатор транзакции в ZooKeeper. Последовательный номер, выданный сервером ZooKeeper в ответе на успешно выполненный запрос (`0` — запрос не был выполнен, возвращена ошибка или клиент ZooKeeper не знает, был ли выполнен запрос). +- `error` ([Nullable(Enum)](../../sql-reference/data-types/nullable.md)) — код ошибки. Может иметь много значений, здесь приведены только некоторые из них: + - `ZOK` — запрос успешно выполнен. + - `ZCONNECTIONLOSS` — соединение разорвано. + - `ZOPERATIONTIMEOUT` — истекло время ожидания выполнения запроса. + - `ZSESSIONEXPIRED` — истекло время сессии. + - `NULL` — выполнен запрос. +- `watch_type` ([Nullable(Enum)](../../sql-reference/data-types/nullable.md)) — тип события `watch` (для ответов на запрос при `op_num` = `Watch`), для остальных ответов: `NULL`. +- `watch_state` ([Nullable(Enum)](../../sql-reference/data-types/nullable.md)) — статус события `watch` (для ответов на запрос при `op_num` = `Watch`), для остальных ответов: `NULL`. +- `path_created` ([String](../../sql-reference/data-types/string.md)) — путь к созданному узлу ZooKeeper (для ответов на запрос `CREATE`). Может отличаться от `path`, если узел создается как `sequential`. +- `stat_czxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — идентификатор транзакции, в результате которой был создан узел ZooKeeper. +- `stat_mzxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — идентификатор транзакции, которая последней модифицировала узел ZooKeeper. +- `stat_pzxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — идентификатор транзакции, которая последней модифицировала дочерние узлы ZooKeeper. +- `stat_version` ([Int32](../../sql-reference/data-types/int-uint.md)) — количество изменений в данных узла ZooKeeper. +- `stat_cversion` ([Int32](../../sql-reference/data-types/int-uint.md)) — количество изменений в дочерних узлах ZooKeeper. +- `stat_dataLength` ([Int32](../../sql-reference/data-types/int-uint.md)) — длина поля данных узла ZooKeeper. +- `stat_numChildren` ([Int32](../../sql-reference/data-types/int-uint.md)) — количество дочерних узлов ZooKeeper. +- `children` ([Array(String)](../../sql-reference/data-types/array.md)) — список дочерних узлов ZooKeeper (для ответов на запрос `LIST`). + +**Пример** + +Запрос: + +``` sql +SELECT * FROM system.zookeeper_log WHERE (session_id = '106662742089334927') AND (xid = '10858') FORMAT Vertical; +``` + +Результат: + +``` text +Row 1: +────── +type: Request +event_date: 2021-08-09 +event_time: 2021-08-09 21:38:30.291792 +address: :: +port: 2181 +session_id: 106662742089334927 +xid: 10858 +has_watch: 1 +op_num: List +path: /clickhouse/task_queue/ddl +data: +is_ephemeral: 0 +is_sequential: 0 +version: ᴺᵁᴸᴸ +requests_size: 0 +request_idx: 0 +zxid: 0 +error: ᴺᵁᴸᴸ +watch_type: ᴺᵁᴸᴸ +watch_state: ᴺᵁᴸᴸ +path_created: +stat_czxid: 0 +stat_mzxid: 0 +stat_pzxid: 0 +stat_version: 0 +stat_cversion: 0 +stat_dataLength: 0 +stat_numChildren: 0 +children: [] + +Row 2: +────── +type: Response +event_date: 2021-08-09 +event_time: 2021-08-09 21:38:30.292086 +address: :: +port: 2181 +session_id: 106662742089334927 +xid: 10858 +has_watch: 1 +op_num: List +path: /clickhouse/task_queue/ddl +data: +is_ephemeral: 0 +is_sequential: 0 +version: ᴺᵁᴸᴸ +requests_size: 0 +request_idx: 0 +zxid: 16926267 +error: ZOK +watch_type: ᴺᵁᴸᴸ +watch_state: ᴺᵁᴸᴸ +path_created: +stat_czxid: 16925469 +stat_mzxid: 16925469 +stat_pzxid: 16926179 +stat_version: 0 +stat_cversion: 7 +stat_dataLength: 0 +stat_numChildren: 7 +children: ['query-0000000006','query-0000000005','query-0000000004','query-0000000003','query-0000000002','query-0000000001','query-0000000000'] +``` + +**См. также** + +- [ZooKeeper](../../operations/tips.md#zookeeper) +- [Руководство по ZooKeeper](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html) diff --git a/docs/ru/sql-reference/aggregate-functions/parametric-functions.md b/docs/ru/sql-reference/aggregate-functions/parametric-functions.md index b1eefc3fc16..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 "Предупреждение" События, произошедшие в одну и ту же секунду, располагаются в последовательности в неопределенном порядке, что может повлиять на результат работы функции. diff --git a/docs/ru/sql-reference/data-types/date.md b/docs/ru/sql-reference/data-types/date.md index 50508de96a3..17b4ec99d9a 100644 --- a/docs/ru/sql-reference/data-types/date.md +++ b/docs/ru/sql-reference/data-types/date.md @@ -9,9 +9,9 @@ toc_title: Date Дата хранится без учёта часового пояса. -## Примеры {#examples} +**Пример** -**1.** Создание таблицы и добавление в неё данных: +Создание таблицы и добавление в неё данных: ``` sql CREATE TABLE dt @@ -24,9 +24,6 @@ ENGINE = TinyLog; ``` sql INSERT INTO dt Values (1546300800, 1), ('2019-01-01', 2); -``` - -``` sql SELECT * FROM dt; ``` @@ -37,7 +34,7 @@ SELECT * FROM dt; └────────────┴──────────┘ ``` -## Смотрите также {#see-also} +**См. также** - [Функции для работы с датой и временем](../../sql-reference/functions/date-time-functions.md) - [Операторы для работы с датой и временем](../../sql-reference/operators/index.md#operators-datetime) diff --git a/docs/ru/sql-reference/data-types/date32.md b/docs/ru/sql-reference/data-types/date32.md new file mode 100644 index 00000000000..a335eba8e80 --- /dev/null +++ b/docs/ru/sql-reference/data-types/date32.md @@ -0,0 +1,40 @@ +--- +toc_priority: 48 +toc_title: Date32 +--- + +# Date32 {#data_type-datetime32} + +Дата. Поддерживается такой же диапазон дат, как для типа [Datetime64](../../sql-reference/data-types/datetime64.md). Значение хранится в четырех байтах и соответствует числу дней с 1925-01-01 по 2283-11-11. + +**Пример** + +Создание таблицы со столбцом типа `Date32`и добавление в нее данных: + +``` sql +CREATE TABLE new +( + `timestamp` Date32, + `event_id` UInt8 +) +ENGINE = TinyLog; +``` + +``` sql +INSERT INTO new VALUES (4102444800, 1), ('2100-01-01', 2); +SELECT * FROM new; +``` + +``` text +┌──timestamp─┬─event_id─┐ +│ 2100-01-01 │ 1 │ +│ 2100-01-01 │ 2 │ +└────────────┴──────────┘ +``` + +**См. также** + +- [toDate32](../../sql-reference/functions/type-conversion-functions.md#todate32) +- [toDate32OrZero](../../sql-reference/functions/type-conversion-functions.md#todate32-or-zero) +- [toDate32OrNull](../../sql-reference/functions/type-conversion-functions.md#todate32-or-null) + diff --git a/docs/ru/sql-reference/data-types/datetime64.md b/docs/ru/sql-reference/data-types/datetime64.md index 3a08da75bb7..73daada3af3 100644 --- a/docs/ru/sql-reference/data-types/datetime64.md +++ b/docs/ru/sql-reference/data-types/datetime64.md @@ -17,7 +17,7 @@ DateTime64(precision, [timezone]) Данные хранятся в виде количества ‘тиков’, прошедших с момента начала эпохи (1970-01-01 00:00:00 UTC), в Int64. Размер тика определяется параметром precision. Дополнительно, тип `DateTime64` позволяет хранить часовой пояс, единый для всей колонки, который влияет на то, как будут отображаться значения типа `DateTime64` в текстовом виде и как будут парситься значения заданные в виде строк (‘2020-01-01 05:00:01.000’). Часовой пояс не хранится в строках таблицы (выборки), а хранится в метаданных колонки. Подробнее см. [DateTime](datetime.md). -Поддерживаются значения от 1 января 1925 г. и до 31 декабря 2283 г. +Поддерживаются значения от 1 января 1925 г. и до 11 ноября 2283 г. ## Примеры {#examples} diff --git a/docs/ru/sql-reference/functions/array-functions.md b/docs/ru/sql-reference/functions/array-functions.md index 52fd63864ce..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} @@ -836,7 +906,7 @@ SELECT arrayEnumerateDense([10, 20, 10, 30]) ## arrayIntersect(arr) {#array-functions-arrayintersect} -Принимает несколько массивов, возвращает массив с элементами, присутствующими во всех исходных массивах. Элементы на выходе следуют в порядке следования в первом массиве. +Принимает несколько массивов, возвращает массив с элементами, присутствующими во всех исходных массивах. Пример: diff --git a/docs/ru/sql-reference/functions/geo/h3.md b/docs/ru/sql-reference/functions/geo/h3.md index 088814c4d7d..bc47ca72a39 100644 --- a/docs/ru/sql-reference/functions/geo/h3.md +++ b/docs/ru/sql-reference/functions/geo/h3.md @@ -193,6 +193,40 @@ SELECT geoToH3(37.79506683, 55.71290588, 15) as h3Index; └────────────────────┘ ``` +## h3ToGeo {#h3togeo} + +Возвращает географические координаты долготы и широты, соответствующие указанному [H3](#h3index)-индексу. + +**Синтаксис** + +``` sql +h3ToGeo(h3Index) +``` + +**Аргументы** + +- `h3Index` — [H3](#h3index)-индекс. [UInt64](../../../sql-reference/data-types/int-uint.md). + +**Возвращаемые значения** + +- кортеж из двух значений: `tuple(lon,lat)`, где `lon` — долгота [Float64](../../../sql-reference/data-types/float.md), `lat` — широта [Float64](../../../sql-reference/data-types/float.md). + +**Пример** + +Запрос: + +``` sql +SELECT h3ToGeo(644325524701193974) coordinates; +``` + +Результат: + +``` text +┌─coordinates───────────────────────────┐ +│ (37.79506616830252,55.71290243145668) │ +└───────────────────────────────────────┘ +``` + ## h3kRing {#h3kring} Возвращает [H3](#h3index)-индексы шестигранников в радиусе `k` от данного в произвольном порядке. diff --git a/docs/ru/sql-reference/functions/other-functions.md b/docs/ru/sql-reference/functions/other-functions.md index c023786b788..5aae0eee9f9 100644 --- a/docs/ru/sql-reference/functions/other-functions.md +++ b/docs/ru/sql-reference/functions/other-functions.md @@ -2185,3 +2185,75 @@ defaultRoles() - Список ролей по умолчанию. Тип: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). + +## queryID {#query-id} + +Возвращает идентификатор текущего запроса. Другие параметры запроса могут быть извлечены из системной таблицы [system.query_log](../../operations/system-tables/query_log.md) через `query_id`. + +В отличие от [initialQueryID](#initial-query-id), функция `queryID` может возвращать различные значения для разных шардов (см. пример). + +**Синтаксис** + +``` sql +queryID() +``` + +**Возвращаемое значение** + +- Идентификатор текущего запроса. + +Тип: [String](../../sql-reference/data-types/string.md) + +**Пример** + +Запрос: + +``` sql +CREATE TABLE tmp (str String) ENGINE = Log; +INSERT INTO tmp (*) VALUES ('a'); +SELECT count(DISTINCT t) FROM (SELECT queryID() AS t FROM remote('127.0.0.{1..3}', currentDatabase(), 'tmp') GROUP BY queryID()); +``` + +Результат: + +``` text +┌─count()─┐ +│ 3 │ +└─────────┘ +``` + +## initialQueryID {#initial-query-id} + +Возвращает идентификатор родительского запроса. Другие параметры запроса могут быть извлечены из системной таблицы [system.query_log](../../operations/system-tables/query_log.md) через `initial_query_id`. + +В отличие от [queryID](#query-id), функция `initialQueryID` возвращает одинаковые значения для разных шардов (см. пример). + +**Синтаксис** + +``` sql +initialQueryID() +``` + +**Возвращаемое значение** + +- Идентификатор родительского запроса. + +Тип: [String](../../sql-reference/data-types/string.md) + +**Пример** + +Запрос: + +``` sql +CREATE TABLE tmp (str String) ENGINE = Log; +INSERT INTO tmp (*) VALUES ('a'); +SELECT count(DISTINCT t) FROM (SELECT initialQueryID() AS t FROM remote('127.0.0.{1..3}', currentDatabase(), 'tmp') GROUP BY queryID()); +``` + +Результат: + +``` text +┌─count()─┐ +│ 1 │ +└─────────┘ +``` diff --git a/docs/ru/sql-reference/functions/string-functions.md b/docs/ru/sql-reference/functions/string-functions.md index b587a991db1..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-символы латиницы в строке в нижний регистр. diff --git a/docs/ru/sql-reference/functions/type-conversion-functions.md b/docs/ru/sql-reference/functions/type-conversion-functions.md index 757afca9588..16639386b67 100644 --- a/docs/ru/sql-reference/functions/type-conversion-functions.md +++ b/docs/ru/sql-reference/functions/type-conversion-functions.md @@ -152,6 +152,104 @@ Cиноним: `DATE`. ## toDateTimeOrNull {#todatetimeornull} +## toDate32 {#todate32} + +Конвертирует аргумент в значение типа [Date32](../../sql-reference/data-types/date32.md). Если значение выходит за границы диапазона, возвращается пограничное значение `Date32`. Если аргумент имеет тип [Date](../../sql-reference/data-types/date.md), учитываются границы типа `Date`. + +**Синтаксис** + +``` sql +toDate32(value) +``` + +**Аргументы** + +- `value` — Значение даты. [String](../../sql-reference/data-types/string.md), [UInt32](../../sql-reference/data-types/int-uint.md) или [Date](../../sql-reference/data-types/date.md). + +**Возвращаемое значение** + +- Календарная дата. + +Тип: [Date32](../../sql-reference/data-types/date32.md). + +**Пример** + +1. Значение находится в границах диапазона: + +``` sql +SELECT toDate32('1955-01-01') AS value, toTypeName(value); +``` + +``` text +┌──────value─┬─toTypeName(toDate32('1925-01-01'))─┐ +│ 1955-01-01 │ Date32 │ +└────────────┴────────────────────────────────────┘ +``` + +2. Значение выходит за границы диапазона: + +``` sql +SELECT toDate32('1924-01-01') AS value, toTypeName(value); +``` + +``` text +┌──────value─┬─toTypeName(toDate32('1925-01-01'))─┐ +│ 1925-01-01 │ Date32 │ +└────────────┴────────────────────────────────────┘ +``` + +3. С аргументом типа `Date`: + +``` sql +SELECT toDate32(toDate('1924-01-01')) AS value, toTypeName(value); +``` + +``` text +┌──────value─┬─toTypeName(toDate32(toDate('1924-01-01')))─┐ +│ 1970-01-01 │ Date32 │ +└────────────┴────────────────────────────────────────────┘ +``` + +## toDate32OrZero {#todate32-or-zero} + +То же самое, что и [toDate32](#todate32), но возвращает минимальное значение типа [Date32](../../sql-reference/data-types/date32.md), если получен недопустимый аргумент. + +**Пример** + +Запрос: + +``` sql +SELECT toDate32OrZero('1924-01-01'), toDate32OrZero(''); +``` + +Результат: + +``` text +┌─toDate32OrZero('1924-01-01')─┬─toDate32OrZero('')─┐ +│ 1925-01-01 │ 1925-01-01 │ +└──────────────────────────────┴────────────────────┘ +``` + +## toDate32OrNull {#todate32-or-null} + +То же самое, что и [toDate32](#todate32), но возвращает `NULL`, если получен недопустимый аргумент. + +**Пример** + +Запрос: + +``` sql +SELECT toDate32OrNull('1955-01-01'), toDate32OrNull(''); +``` + +Результат: + +``` text +┌─toDate32OrNull('1955-01-01')─┬─toDate32OrNull('')─┐ +│ 1955-01-01 │ ᴺᵁᴸᴸ │ +└──────────────────────────────┴────────────────────┘ +``` + ## toDecimal(32\|64\|128\|256) {#todecimal3264128} Преобразует `value` к типу данных [Decimal](../../sql-reference/functions/type-conversion-functions.md) с точностью `S`. `value` может быть числом или строкой. Параметр `S` (scale) задаёт число десятичных знаков. 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/statements/alter/projection.md b/docs/ru/sql-reference/statements/alter/projection.md new file mode 100644 index 00000000000..4b0d7f7865b --- /dev/null +++ b/docs/ru/sql-reference/statements/alter/projection.md @@ -0,0 +1,23 @@ +--- +toc_priority: 49 +toc_title: PROJECTION +--- + +# Манипуляции с проекциями {#manipulations-with-projections} + +Доступны следующие операции с [проекциями](../../../engines/table-engines/mergetree-family/mergetree.md#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/explain.md b/docs/ru/sql-reference/statements/explain.md index c11c33ae99a..7a028b31a12 100644 --- a/docs/ru/sql-reference/statements/explain.md +++ b/docs/ru/sql-reference/statements/explain.md @@ -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/select/distinct.md b/docs/ru/sql-reference/statements/select/distinct.md index f57c2a42593..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/index.md b/docs/ru/sql-reference/statements/select/index.md index a0a862cbf55..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 ...] @@ -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) diff --git a/docs/ru/sql-reference/statements/select/join.md b/docs/ru/sql-reference/statements/select/join.md index 03018a953ce..3cbd07326b3 100644 --- a/docs/ru/sql-reference/statements/select/join.md +++ b/docs/ru/sql-reference/statements/select/join.md @@ -6,7 +6,7 @@ toc_title: JOIN `JOIN` создаёт новую таблицу путем объединения столбцов из одной или нескольких таблиц с использованием общих для каждой из них значений. Это обычная операция в базах данных с поддержкой SQL, которая соответствует join из [реляционной алгебры](https://en.wikipedia.org/wiki/Relational_algebra#Joins_and_join-like_operators). Частный случай соединения одной таблицы часто называют self-join. -Синтаксис: +**Синтаксис** ``` sql SELECT @@ -19,7 +19,7 @@ FROM ## Поддерживаемые типы соединения {#select-join-types} -Все типы из стандартого [SQL JOIN](https://en.wikipedia.org/wiki/Join_(SQL)) поддерживаются: +Все типы из стандартного [SQL JOIN](https://en.wikipedia.org/wiki/Join_(SQL)) поддерживаются: - `INNER JOIN`, возвращаются только совпадающие строки. - `LEFT OUTER JOIN`, не совпадающие строки из левой таблицы возвращаются в дополнение к совпадающим строкам. @@ -33,7 +33,7 @@ FROM - `LEFT SEMI JOIN` и `RIGHT SEMI JOIN`, белый список по ключам соединения, не производит декартово произведение. - `LEFT ANTI JOIN` и `RIGHT ANTI JOIN`, черный список по ключам соединения, не производит декартово произведение. -- `LEFT ANY JOIN`, `RIGHT ANY JOIN` и `INNER ANY JOIN`, Частично (для противоположных сторон `LEFT` и `RIGHT`) или полностью (для `INNER` и `FULL`) отключает декартово произведение для стандартых видов `JOIN`. +- `LEFT ANY JOIN`, `RIGHT ANY JOIN` и `INNER ANY JOIN`, Частично (для противоположных сторон `LEFT` и `RIGHT`) или полностью (для `INNER` и `FULL`) отключает декартово произведение для стандартных видов `JOIN`. - `ASOF JOIN` и `LEFT ASOF JOIN`, Для соединения последовательностей по нечеткому совпадению. Использование `ASOF JOIN` описано ниже. ## Настройки {#join-settings} @@ -52,6 +52,61 @@ FROM - [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) +## Условия в секции ON {on-section-conditions} + +Секция `ON` может содержать несколько условий, связанных оператором `AND`. Условия, задающие ключи соединения, должны содержать столбцы левой и правой таблицы и должны использовать оператор равенства. Прочие условия могут использовать другие логические операторы, но в отдельном условии могут использоваться столбцы либо только левой, либо только правой таблицы. +Строки объединяются только тогда, когда всё составное условие выполнено. Если оно не выполнено, то строки могут попасть в результат в зависимости от типа `JOIN`. Обратите внимание, что если то же самое условие поместить в секцию `WHERE`, то строки, для которых оно не выполняется, никогда не попаду в результат. + +!!! note "Примечание" + Оператор `OR` внутри секции `ON` пока не поддерживается. + +!!! note "Примечание" + Если в условии использованы столбцы из разных таблиц, то пока поддерживается только оператор равенства (`=`). + +**Пример** + +Рассмотрим `table_1` и `table_2`: + +``` +┌─Id─┬─name─┐ ┌─Id─┬─text───────────┬─scores─┐ +│ 1 │ A │ │ 1 │ Text A │ 10 │ +│ 2 │ B │ │ 1 │ Another text A │ 12 │ +│ 3 │ C │ │ 2 │ Text B │ 15 │ +└────┴──────┘ └────┴────────────────┴────────┘ +``` + +Запрос с одним условием, задающим ключ соединения, и дополнительным условием для `table_2`: + +``` sql +SELECT name, text FROM table_1 LEFT OUTER JOIN table_2 + ON table_1.Id = table_2.Id AND startsWith(table_2.text, 'Text'); +``` + +Обратите внимание, что результат содержит строку с именем `C` и пустым текстом. Строка включена в результат, потому что использован тип соединения `OUTER`. + +``` +┌─name─┬─text───┐ +│ A │ Text A │ +│ B │ Text B │ +│ C │ │ +└──────┴────────┘ +``` + +Запрос с типом соединения `INNER` и несколькими условиями: + +``` sql +SELECT name, text, scores FROM table_1 INNER JOIN table_2 + ON table_1.Id = table_2.Id AND table_2.scores > 10 AND startsWith(table_2.text, 'Text'); +``` + +Результат: + +``` +┌─name─┬─text───┬─scores─┐ +│ B │ Text B │ 15 │ +└──────┴────────┴────────┘ +``` + ## Использование ASOF JOIN {#asof-join-usage} `ASOF JOIN` применим в том случае, когда необходимо объединять записи, которые не имеют точного совпадения. @@ -59,7 +114,7 @@ FROM Для работы алгоритма необходим специальный столбец в таблицах. Этот столбец: - Должен содержать упорядоченную последовательность. -- Может быть одного из следующих типов: [Int*, UInt*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Date](../../data-types/date.md), [DateTime](../../data-types/datetime.md), [Decimal*](../../data-types/decimal.md). +- Может быть одного из следующих типов: [Int, UInt](../../data-types/int-uint.md), [Float](../../data-types/float.md), [Date](../../data-types/date.md), [DateTime](../../data-types/datetime.md), [Decimal](../../data-types/decimal.md). - Не может быть единственным столбцом в секции `JOIN`. Синтаксис `ASOF JOIN ... ON`: diff --git a/docs/ru/sql-reference/statements/system.md b/docs/ru/sql-reference/statements/system.md index 634343d112f..e123f506d46 100644 --- a/docs/ru/sql-reference/statements/system.md +++ b/docs/ru/sql-reference/statements/system.md @@ -36,6 +36,7 @@ toc_title: SYSTEM - [START REPLICATION QUEUES](#query_language-system-start-replication-queues) - [SYNC REPLICA](#query_language-system-sync-replica) - [RESTART REPLICA](#query_language-system-restart-replica) +- [RESTORE REPLICA](#query_language-system-restore-replica) - [RESTART REPLICAS](#query_language-system-restart-replicas) ## RELOAD EMBEDDED DICTIONARIES] {#query_language-system-reload-emdedded-dictionaries} @@ -287,13 +288,66 @@ SYSTEM SYNC REPLICA [db.]replicated_merge_tree_family_table_name ### RESTART REPLICA {#query_language-system-restart-replica} -Реинициализация состояния Zookeeper-сессий для таблицы семейства `ReplicatedMergeTree`. Сравнивает текущее состояние с тем, что хранится в Zookeeper, как источник правды, и добавляет задачи в очередь репликации в Zookeeper, если необходимо. -Инициализация очереди репликации на основе данных ZooKeeper происходит так же, как при attach table. На короткое время таблица станет недоступной для любых операций. +Реинициализирует состояние сессий Zookeeper для таблицы семейства `ReplicatedMergeTree`. Сравнивает текущее состояние с состоянием в Zookeeper (как с эталоном) и при необходимости добавляет задачи в очередь репликации в Zookeeper. +Инициализация очереди репликации на основе данных ZooKeeper происходит так же, как при `ATTACH TABLE`. Некоторое время таблица будет недоступна для любых операций. ``` sql SYSTEM RESTART REPLICA [db.]replicated_merge_tree_family_table_name ``` +### RESTORE REPLICA {#query_language-system-restore-replica} + +Восстанавливает реплику, если метаданные в Zookeeper потеряны, но сами данные возможно существуют. + +Работает только с таблицами семейства `ReplicatedMergeTree` и только если таблица находится в readonly-режиме. + +Запрос можно выполнить если: + + - потерян корневой путь ZooKeeper `/`; + - потерян путь реплик `/replicas`; + - потерян путь конкретной реплики `/replicas/replica_name/`. + +К реплике прикрепляются локально найденные куски, информация о них отправляется в Zookeeper. +Если присутствующие в реплике до потери метаданных данные не устарели, они не скачиваются повторно с других реплик. Поэтому восстановление реплики не означает повторную загрузку всех данных по сети. + +!!! warning "Предупреждение" + Потерянные данные в любых состояниях перемещаются в папку `detached/`. Куски, активные до потери данных (находившиеся в состоянии Committed), прикрепляются. + +**Синтаксис** + +```sql +SYSTEM RESTORE REPLICA [db.]replicated_merge_tree_family_table_name [ON CLUSTER cluster_name] +``` + +Альтернативный синтаксис: + +```sql +SYSTEM RESTORE REPLICA [ON CLUSTER cluster_name] [db.]replicated_merge_tree_family_table_name +``` + +**Пример** + +Создание таблицы на нескольких серверах. После потери корневого пути реплики таблица будет прикреплена только для чтения, так как метаданные отсутствуют. Последний запрос необходимо выполнить на каждой реплике. + +```sql +CREATE TABLE test(n UInt32) +ENGINE = ReplicatedMergeTree('/clickhouse/tables/test/', '{replica}') +ORDER BY n PARTITION BY n % 10; + +INSERT INTO test SELECT * FROM numbers(1000); + +-- zookeeper_delete_path("/clickhouse/tables/test", recursive=True) <- root loss. + +SYSTEM RESTART REPLICA test; +SYSTEM RESTORE REPLICA test; +``` + +Альтернативный способ: + +```sql +SYSTEM RESTORE REPLICA test ON CLUSTER cluster; +``` + ### RESTART REPLICAS {#query_language-system-restart-replicas} Реинициализация состояния ZooKeeper-сессий для всех `ReplicatedMergeTree` таблиц. Сравнивает текущее состояние реплики с тем, что хранится в ZooKeeper, как c источником правды, и добавляет задачи в очередь репликации в ZooKeeper, если необходимо. diff --git a/docs/ru/sql-reference/table-functions/cluster.md b/docs/ru/sql-reference/table-functions/cluster.md index 1a087971afe..a9cff862293 100644 --- a/docs/ru/sql-reference/table-functions/cluster.md +++ b/docs/ru/sql-reference/table-functions/cluster.md @@ -5,22 +5,44 @@ toc_title: cluster # cluster, clusterAllReplicas {#cluster-clusterallreplicas} -Позволяет обратиться ко всем серверам существующего кластера, который присутствует в таблице `system.clusters` и сконфигурирован в секцци `remote_servers` без создания таблицы типа `Distributed`. -`clusterAllReplicas` - работает также как `cluster` но каждая реплика в кластере будет использована как отдельный шард/отдельное соединение. +Позволяет обратиться ко всем шардам существующего кластера, который сконфигурирован в секции `remote_servers` без создания таблицы типа [Distributed](../../engines/table-engines/special/distributed.md). В запросе используется одна реплика каждого шарда. +Функция `clusterAllReplicas` работает также как `cluster`, но каждая реплика в кластере используется как отдельный шард/отдельное соединение. -Сигнатуры: +!!! note "Примечание" + Все доступные кластеры перечислены в таблице [system.clusters](../../operations/system-tables/clusters.md). + +**Синтаксис** ``` sql -cluster('cluster_name', db.table) -cluster('cluster_name', db, table) -clusterAllReplicas('cluster_name', db.table) -clusterAllReplicas('cluster_name', db, table) +cluster('cluster_name', db.table[, sharding_key]) +cluster('cluster_name', db, table[, sharding_key]) +clusterAllReplicas('cluster_name', db.table[, sharding_key]) +clusterAllReplicas('cluster_name', db, table[, sharding_key]) +``` +**Аргументы** + +- `cluster_name` – имя кластера, который обозначает подмножество адресов и параметров подключения к удаленным и локальным серверам, входящим в кластер. +- `db.table` или `db`, `table` - имя базы данных и таблицы. +- `sharding_key` - ключ шардирования. Необязательный аргумент. Указывается, если данные добавляются более чем в один шард кластера. + +**Возвращаемое значение** + +Набор данных из кластеров. + +**Использование макросов** + +`cluster_name` может содержать макрос — подстановку в фигурных скобках. Эта подстановка заменяется на соответствующее значение из секции [macros](../../operations/server-configuration-parameters/settings.md#macros) конфигурационного файла . + +Пример: + +```sql +SELECT * FROM cluster('{cluster}', default.example_table); ``` -`cluster_name` – имя кластера, который обязан присутствовать в таблице `system.clusters` и обозначает подмножество адресов и параметров подключения к удаленным и локальным серверам, входящим в кластер. +**Использование и рекомендации** -Использование табличных функций `cluster` и `clusterAllReplicas` менее оптимальное чем создание таблицы типа `Distributed`, поскольку в этом случае соединение с сервером переустанавливается на каждый запрос. При обработке большого количества запросов, всегда создавайте `Distributed` таблицу заранее и не используйте табличные функции `cluster` и `clusterAllReplicas`. +Использование табличных функций `cluster` и `clusterAllReplicas` менее оптимально, чем создание таблицы типа `Distributed`, поскольку в этом случае при каждом новом запросе устанавливается новое соединение с сервером. При обработке большого количества запросов всегда создавайте `Distributed` таблицу заранее и не используйте табличные функции `cluster` и `clusterAllReplicas`. Табличные функции `cluster` and `clusterAllReplicas` могут быть полезны в следующих случаях: @@ -30,7 +52,7 @@ clusterAllReplicas('cluster_name', db, table) Настройки соединения `user`, `password`, `host`, `post`, `compression`, `secure` берутся из секции `` файлов конфигурации. См. подробности в разделе [Distributed](../../engines/table-engines/special/distributed.md) -**See Also** +**См. также** - [skip_unavailable_shards](../../operations/settings/settings.md#settings-skip_unavailable_shards) - [load_balancing](../../operations/settings/settings.md#settings-load_balancing) diff --git a/docs/ru/sql-reference/table-functions/sqlite.md b/docs/ru/sql-reference/table-functions/sqlite.md new file mode 100644 index 00000000000..3ff61455e62 --- /dev/null +++ b/docs/ru/sql-reference/table-functions/sqlite.md @@ -0,0 +1,45 @@ +--- +toc_priority: 55 +toc_title: sqlite +--- + +## sqlite {#sqlite} + +Позволяет выполнять запросы к данным, хранящимся в базе данных [SQLite](../../engines/database-engines/sqlite.md). + +**Синтаксис** + +``` sql + sqlite('db_path', 'table_name') +``` + +**Аргументы** + +- `db_path` — путь к файлу с базой данных SQLite. [String](../../sql-reference/data-types/string.md). +- `table_name` — имя таблицы в базе данных SQLite. [String](../../sql-reference/data-types/string.md). + +**Возвращаемое значение** + +- Объект таблицы с теми же столбцами, что и в исходной таблице `SQLite`. + +**Пример** + +Запрос: + +``` sql +SELECT * FROM sqlite('sqlite.db', 'table1') ORDER BY col2; +``` + +Результат: + +``` text +┌─col1──┬─col2─┐ +│ line1 │ 1 │ +│ line2 │ 2 │ +│ line3 │ 3 │ +└───────┴──────┘ +``` + +**См. также** + +- [SQLite](../../engines/table-engines/integrations/sqlite.md) движок таблиц \ No newline at end of file diff --git a/docs/zh/engines/database-engines/mysql.md b/docs/zh/engines/database-engines/mysql.md index fa2cb1ea8e5..04a25711a72 100644 --- a/docs/zh/engines/database-engines/mysql.md +++ b/docs/zh/engines/database-engines/mysql.md @@ -38,13 +38,13 @@ ENGINE = MySQL('host:port', ['database' | database], 'user', 'password') | BIGINT | [Int64](../../sql-reference/data-types/int-uint.md) | | FLOAT | [Float32](../../sql-reference/data-types/float.md) | | DOUBLE | [Float64](../../sql-reference/data-types/float.md) | -| DATE | [日期](../../sql-reference/data-types/date.md) | -| DATETIME, TIMESTAMP | [日期时间](../../sql-reference/data-types/datetime.md) | -| BINARY | [固定字符串](../../sql-reference/data-types/fixedstring.md) | +| DATE | [Date](../../sql-reference/data-types/date.md) | +| DATETIME, TIMESTAMP | [DateTime](../../sql-reference/data-types/datetime.md) | +| BINARY | [FixedString](../../sql-reference/data-types/fixedstring.md) | -其他的MySQL数据类型将全部都转换为[字符串](../../sql-reference/data-types/string.md)。 +其他的MySQL数据类型将全部都转换为[String](../../sql-reference/data-types/string.md)。 -同时以上的所有类型都支持[可为空](../../sql-reference/data-types/nullable.md)。 +同时以上的所有类型都支持[Nullable](../../sql-reference/data-types/nullable.md)。 ## 使用示例 {#shi-yong-shi-li} diff --git a/docs/zh/getting-started/example-datasets/star-schema.md b/docs/zh/getting-started/example-datasets/star-schema.md index fcb6e90c694..563b7922238 100644 --- a/docs/zh/getting-started/example-datasets/star-schema.md +++ b/docs/zh/getting-started/example-datasets/star-schema.md @@ -7,7 +7,7 @@ toc_title: Star Schema Benchmark 编译 dbgen: -``` bash +```bash $ git clone git@github.com:vadimtk/ssb-dbgen.git $ cd ssb-dbgen $ make @@ -16,9 +16,9 @@ $ make 开始生成数据: !!! warning "注意" - 使用`-s 100`dbgen将生成6亿行数据(67GB), 如果使用`-s 1000`它会生成60亿行数据(这需要很多时间)) +使用`-s 100`dbgen 将生成 6 亿行数据(67GB), 如果使用`-s 1000`它会生成 60 亿行数据(这需要很多时间)) -``` bash +```bash $ ./dbgen -s 1000 -T c $ ./dbgen -s 1000 -T l $ ./dbgen -s 1000 -T p @@ -26,9 +26,9 @@ $ ./dbgen -s 1000 -T s $ ./dbgen -s 1000 -T d ``` -在ClickHouse中创建数据表: +在 ClickHouse 中创建数据表: -``` sql +```sql CREATE TABLE customer ( C_CUSTKEY UInt32, @@ -93,7 +93,7 @@ ENGINE = MergeTree ORDER BY S_SUPPKEY; 写入数据: -``` bash +```bash $ clickhouse-client --query "INSERT INTO customer FORMAT CSV" < customer.tbl $ clickhouse-client --query "INSERT INTO part FORMAT CSV" < part.tbl $ clickhouse-client --query "INSERT INTO supplier FORMAT CSV" < supplier.tbl @@ -102,100 +102,267 @@ $ clickhouse-client --query "INSERT INTO lineorder FORMAT CSV" < lineorder.tbl 将`star schema`转换为`flat schema`: -``` sql -SET max_memory_usage = 20000000000, allow_experimental_multiple_joins_emulation = 1; +```sql +SET max_memory_usage = 20000000000; CREATE TABLE lineorder_flat ENGINE = MergeTree PARTITION BY toYear(LO_ORDERDATE) ORDER BY (LO_ORDERDATE, LO_ORDERKEY) AS -SELECT l.*, c.*, s.*, p.* -FROM lineorder l - ANY INNER JOIN customer c ON (c.C_CUSTKEY = l.LO_CUSTKEY) - ANY INNER JOIN supplier s ON (s.S_SUPPKEY = l.LO_SUPPKEY) - ANY INNER JOIN part p ON (p.P_PARTKEY = l.LO_PARTKEY); - -ALTER TABLE lineorder_flat DROP COLUMN C_CUSTKEY, DROP COLUMN S_SUPPKEY, DROP COLUMN P_PARTKEY; +SELECT + l.LO_ORDERKEY AS LO_ORDERKEY, + l.LO_LINENUMBER AS LO_LINENUMBER, + l.LO_CUSTKEY AS LO_CUSTKEY, + l.LO_PARTKEY AS LO_PARTKEY, + l.LO_SUPPKEY AS LO_SUPPKEY, + l.LO_ORDERDATE AS LO_ORDERDATE, + l.LO_ORDERPRIORITY AS LO_ORDERPRIORITY, + l.LO_SHIPPRIORITY AS LO_SHIPPRIORITY, + l.LO_QUANTITY AS LO_QUANTITY, + l.LO_EXTENDEDPRICE AS LO_EXTENDEDPRICE, + l.LO_ORDTOTALPRICE AS LO_ORDTOTALPRICE, + l.LO_DISCOUNT AS LO_DISCOUNT, + l.LO_REVENUE AS LO_REVENUE, + l.LO_SUPPLYCOST AS LO_SUPPLYCOST, + l.LO_TAX AS LO_TAX, + l.LO_COMMITDATE AS LO_COMMITDATE, + l.LO_SHIPMODE AS LO_SHIPMODE, + c.C_NAME AS C_NAME, + c.C_ADDRESS AS C_ADDRESS, + c.C_CITY AS C_CITY, + c.C_NATION AS C_NATION, + c.C_REGION AS C_REGION, + c.C_PHONE AS C_PHONE, + c.C_MKTSEGMENT AS C_MKTSEGMENT, + s.S_NAME AS S_NAME, + s.S_ADDRESS AS S_ADDRESS, + s.S_CITY AS S_CITY, + s.S_NATION AS S_NATION, + s.S_REGION AS S_REGION, + s.S_PHONE AS S_PHONE, + p.P_NAME AS P_NAME, + p.P_MFGR AS P_MFGR, + p.P_CATEGORY AS P_CATEGORY, + p.P_BRAND AS P_BRAND, + p.P_COLOR AS P_COLOR, + p.P_TYPE AS P_TYPE, + p.P_SIZE AS P_SIZE, + p.P_CONTAINER AS P_CONTAINER +FROM lineorder AS l +INNER JOIN customer AS c ON c.C_CUSTKEY = l.LO_CUSTKEY +INNER JOIN supplier AS s ON s.S_SUPPKEY = l.LO_SUPPKEY +INNER JOIN part AS p ON p.P_PARTKEY = l.LO_PARTKEY; ``` 运行查询: Q1.1 -``` sql -SELECT sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue FROM lineorder_flat WHERE toYear(LO_ORDERDATE) = 1993 AND LO_DISCOUNT BETWEEN 1 AND 3 AND LO_QUANTITY < 25; +```sql +SELECT sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue +FROM lineorder_flat +WHERE toYear(LO_ORDERDATE) = 1993 AND LO_DISCOUNT BETWEEN 1 AND 3 AND LO_QUANTITY < 25; ``` Q1.2 -``` sql -SELECT sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue FROM lineorder_flat WHERE toYYYYMM(LO_ORDERDATE) = 199401 AND LO_DISCOUNT BETWEEN 4 AND 6 AND LO_QUANTITY BETWEEN 26 AND 35; +```sql +SELECT sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue +FROM lineorder_flat +WHERE toYYYYMM(LO_ORDERDATE) = 199401 AND LO_DISCOUNT BETWEEN 4 AND 6 AND LO_QUANTITY BETWEEN 26 AND 35; ``` Q1.3 -``` sql -SELECT sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue FROM lineorder_flat WHERE toISOWeek(LO_ORDERDATE) = 6 AND toYear(LO_ORDERDATE) = 1994 AND LO_DISCOUNT BETWEEN 5 AND 7 AND LO_QUANTITY BETWEEN 26 AND 35; +```sql +SELECT sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue +FROM lineorder_flat +WHERE toISOWeek(LO_ORDERDATE) = 6 AND toYear(LO_ORDERDATE) = 1994 + AND LO_DISCOUNT BETWEEN 5 AND 7 AND LO_QUANTITY BETWEEN 26 AND 35; ``` Q2.1 -``` sql -SELECT sum(LO_REVENUE), toYear(LO_ORDERDATE) AS year, P_BRAND FROM lineorder_flat WHERE P_CATEGORY = 'MFGR#12' AND S_REGION = 'AMERICA' GROUP BY year, P_BRAND ORDER BY year, P_BRAND; +```sql +SELECT + sum(LO_REVENUE), + toYear(LO_ORDERDATE) AS year, + P_BRAND +FROM lineorder_flat +WHERE P_CATEGORY = 'MFGR#12' AND S_REGION = 'AMERICA' +GROUP BY + year, + P_BRAND +ORDER BY + year, + P_BRAND; ``` Q2.2 -``` sql -SELECT sum(LO_REVENUE), toYear(LO_ORDERDATE) AS year, P_BRAND FROM lineorder_flat WHERE P_BRAND BETWEEN 'MFGR#2221' AND 'MFGR#2228' AND S_REGION = 'ASIA' GROUP BY year, P_BRAND ORDER BY year, P_BRAND; +```sql +SELECT + sum(LO_REVENUE), + toYear(LO_ORDERDATE) AS year, + P_BRAND +FROM lineorder_flat +WHERE P_BRAND >= 'MFGR#2221' AND P_BRAND <= 'MFGR#2228' AND S_REGION = 'ASIA' +GROUP BY + year, + P_BRAND +ORDER BY + year, + P_BRAND; ``` Q2.3 -``` sql -SELECT sum(LO_REVENUE), toYear(LO_ORDERDATE) AS year, P_BRAND FROM lineorder_flat WHERE P_BRAND = 'MFGR#2239' AND S_REGION = 'EUROPE' GROUP BY year, P_BRAND ORDER BY year, P_BRAND; +```sql +SELECT + sum(LO_REVENUE), + toYear(LO_ORDERDATE) AS year, + P_BRAND +FROM lineorder_flat +WHERE P_BRAND = 'MFGR#2239' AND S_REGION = 'EUROPE' +GROUP BY + year, + P_BRAND +ORDER BY + year, + P_BRAND; ``` Q3.1 -``` sql -SELECT C_NATION, S_NATION, toYear(LO_ORDERDATE) AS year, sum(LO_REVENUE) AS revenue FROM lineorder_flat WHERE C_REGION = 'ASIA' AND S_REGION = 'ASIA' AND year >= 1992 AND year <= 1997 GROUP BY C_NATION, S_NATION, year ORDER BY year asc, revenue desc; +```sql +SELECT + C_NATION, + S_NATION, + toYear(LO_ORDERDATE) AS year, + sum(LO_REVENUE) AS revenue +FROM lineorder_flat +WHERE C_REGION = 'ASIA' AND S_REGION = 'ASIA' AND year >= 1992 AND year <= 1997 +GROUP BY + C_NATION, + S_NATION, + year +ORDER BY + year ASC, + revenue DESC; ``` Q3.2 -``` sql -SELECT C_CITY, S_CITY, toYear(LO_ORDERDATE) AS year, sum(LO_REVENUE) AS revenue FROM lineorder_flat WHERE C_NATION = 'UNITED STATES' AND S_NATION = 'UNITED STATES' AND year >= 1992 AND year <= 1997 GROUP BY C_CITY, S_CITY, year ORDER BY year asc, revenue desc; +```sql +SELECT + C_CITY, + S_CITY, + toYear(LO_ORDERDATE) AS year, + sum(LO_REVENUE) AS revenue +FROM lineorder_flat +WHERE C_NATION = 'UNITED STATES' AND S_NATION = 'UNITED STATES' AND year >= 1992 AND year <= 1997 +GROUP BY + C_CITY, + S_CITY, + year +ORDER BY + year ASC, + revenue DESC; ``` Q3.3 -``` sql -SELECT C_CITY, S_CITY, toYear(LO_ORDERDATE) AS year, sum(LO_REVENUE) AS revenue FROM lineorder_flat WHERE (C_CITY = 'UNITED KI1' OR C_CITY = 'UNITED KI5') AND (S_CITY = 'UNITED KI1' OR S_CITY = 'UNITED KI5') AND year >= 1992 AND year <= 1997 GROUP BY C_CITY, S_CITY, year ORDER BY year asc, revenue desc; +```sql +SELECT + C_CITY, + S_CITY, + toYear(LO_ORDERDATE) AS year, + sum(LO_REVENUE) AS revenue +FROM lineorder_flat +WHERE (C_CITY = 'UNITED KI1' OR C_CITY = 'UNITED KI5') AND (S_CITY = 'UNITED KI1' OR S_CITY = 'UNITED KI5') AND year >= 1992 AND year <= 1997 +GROUP BY + C_CITY, + S_CITY, + year +ORDER BY + year ASC, + revenue DESC; ``` Q3.4 -``` sql -SELECT C_CITY, S_CITY, toYear(LO_ORDERDATE) AS year, sum(LO_REVENUE) AS revenue FROM lineorder_flat WHERE (C_CITY = 'UNITED KI1' OR C_CITY = 'UNITED KI5') AND (S_CITY = 'UNITED KI1' OR S_CITY = 'UNITED KI5') AND toYYYYMM(LO_ORDERDATE) = '199712' GROUP BY C_CITY, S_CITY, year ORDER BY year asc, revenue desc; +```sql +SELECT + C_CITY, + S_CITY, + toYear(LO_ORDERDATE) AS year, + sum(LO_REVENUE) AS revenue +FROM lineorder_flat +WHERE (C_CITY = 'UNITED KI1' OR C_CITY = 'UNITED KI5') AND (S_CITY = 'UNITED KI1' OR S_CITY = 'UNITED KI5') AND toYYYYMM(LO_ORDERDATE) = 199712 +GROUP BY + C_CITY, + S_CITY, + year +ORDER BY + year ASC, + revenue DESC; ``` Q4.1 -``` sql -SELECT toYear(LO_ORDERDATE) AS year, C_NATION, sum(LO_REVENUE - LO_SUPPLYCOST) AS profit FROM lineorder_flat WHERE C_REGION = 'AMERICA' AND S_REGION = 'AMERICA' AND (P_MFGR = 'MFGR#1' OR P_MFGR = 'MFGR#2') GROUP BY year, C_NATION ORDER BY year, C_NATION; +```sql +SELECT + toYear(LO_ORDERDATE) AS year, + C_NATION, + sum(LO_REVENUE - LO_SUPPLYCOST) AS profit +FROM lineorder_flat +WHERE C_REGION = 'AMERICA' AND S_REGION = 'AMERICA' AND (P_MFGR = 'MFGR#1' OR P_MFGR = 'MFGR#2') +GROUP BY + year, + C_NATION +ORDER BY + year ASC, + C_NATION ASC; ``` Q4.2 -``` sql -SELECT toYear(LO_ORDERDATE) AS year, S_NATION, P_CATEGORY, sum(LO_REVENUE - LO_SUPPLYCOST) AS profit FROM lineorder_flat WHERE C_REGION = 'AMERICA' AND S_REGION = 'AMERICA' AND (year = 1997 OR year = 1998) AND (P_MFGR = 'MFGR#1' OR P_MFGR = 'MFGR#2') GROUP BY year, S_NATION, P_CATEGORY ORDER BY year, S_NATION, P_CATEGORY; +```sql +SELECT + toYear(LO_ORDERDATE) AS year, + S_NATION, + P_CATEGORY, + sum(LO_REVENUE - LO_SUPPLYCOST) AS profit +FROM lineorder_flat +WHERE C_REGION = 'AMERICA' AND S_REGION = 'AMERICA' AND (year = 1997 OR year = 1998) AND (P_MFGR = 'MFGR#1' OR P_MFGR = 'MFGR#2') +GROUP BY + year, + S_NATION, + P_CATEGORY +ORDER BY + year ASC, + S_NATION ASC, + P_CATEGORY ASC; ``` Q4.3 -``` sql -SELECT toYear(LO_ORDERDATE) AS year, S_CITY, P_BRAND, sum(LO_REVENUE - LO_SUPPLYCOST) AS profit FROM lineorder_flat WHERE S_NATION = 'UNITED STATES' AND (year = 1997 OR year = 1998) AND P_CATEGORY = 'MFGR#14' GROUP BY year, S_CITY, P_BRAND ORDER BY year, S_CITY, P_BRAND; +```sql +SELECT + toYear(LO_ORDERDATE) AS year, + S_CITY, + P_BRAND, + sum(LO_REVENUE - LO_SUPPLYCOST) AS profit +FROM lineorder_flat +WHERE S_NATION = 'UNITED STATES' AND (year = 1997 OR year = 1998) AND P_CATEGORY = 'MFGR#14' +GROUP BY + year, + S_CITY, + P_BRAND +ORDER BY + year ASC, + S_CITY ASC, + P_BRAND ASC; ``` [原始文章](https://clickhouse.tech/docs/en/getting_started/example_datasets/star_schema/) diff --git a/docs/zh/operations/backup.md b/docs/zh/operations/backup.md index 6d517e6ccb3..dbaafc8b8a7 100644 --- a/docs/zh/operations/backup.md +++ b/docs/zh/operations/backup.md @@ -1,13 +1,11 @@ --- -machine_translated: true -machine_translated_rev: 72537a2d527c63c07aa5d2361a8829f3895cf2bd toc_priority: 49 toc_title: "\u6570\u636E\u5907\u4EFD" --- # 数据备份 {#data-backup} -尽管 [副本] (../engines/table-engines/mergetree-family/replication.md) 可以提供针对硬件的错误防护, 但是它不能预防人为操作失误: 数据的意外删除, 错误表的删除或者错误集群上表的删除, 以及导致错误数据处理或者数据损坏的软件bug. 在很多案例中,这类意外可能会影响所有的副本. ClickHouse 有内置的保护措施可以预防一些错误 — 例如, 默认情况下 [不能人工删除使用带有MergeTree引擎且包含超过50Gb数据的表] (server-configuration-parameters/settings.md#max-table-size-to-drop). 但是,这些保护措施不能覆盖所有可能情况,并且这些措施可以被绕过。 +尽管 [副本](../engines/table-engines/mergetree-family/replication.md) 可以提供针对硬件的错误防护, 但是它不能预防人为操作失误: 数据的意外删除, 错误表的删除或者错误集群上表的删除, 以及导致错误数据处理或者数据损坏的软件bug. 在很多案例中,这类意外可能会影响所有的副本. ClickHouse 有内置的保护措施可以预防一些错误 — 例如, 默认情况下 [不能人工删除使用带有MergeTree引擎且包含超过50Gb数据的表](server-configuration-parameters/settings.md#max-table-size-to-drop). 但是,这些保护措施不能覆盖所有可能情况,并且这些措施可以被绕过。 为了有效地减少可能的人为错误,您应该 **提前** 仔细的准备备份和数据还原的策略. @@ -18,26 +16,26 @@ toc_title: "\u6570\u636E\u5907\u4EFD" ## 将源数据复制到其它地方 {#duplicating-source-data-somewhere-else} -通常摄入到ClickHouse的数据是通过某种持久队列传递的,例如 [Apache Kafka] (https://kafka.apache.org). 在这种情况下,可以配置一组额外的订阅服务器,这些订阅服务器将在写入ClickHouse时读取相同的数据流,并将其存储在冷存储中。 大多数公司已经有一些默认推荐的冷存储,可能是对象存储或分布式文件系统,如 [HDFS] (https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html). +通常摄入到ClickHouse的数据是通过某种持久队列传递的,例如 [Apache Kafka](https://kafka.apache.org). 在这种情况下,可以配置一组额外的订阅服务器,这些订阅服务器将在写入ClickHouse时读取相同的数据流,并将其存储在冷存储中。 大多数公司已经有一些默认推荐的冷存储,可能是对象存储或分布式文件系统,如 [HDFS](https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html). ## 文件系统快照 {#filesystem-snapshots} -某些本地文件系统提供快照功能(例如, [ZFS] (https://en.wikipedia.org/wiki/ZFS)),但它们可能不是提供实时查询的最佳选择。 一个可能的解决方案是使用这种文件系统创建额外的副本,并将它们与用于`SELECT` 查询的 [分布式] (../engines/table-engines/special/distributed.md) 表分离。 任何修改数据的查询都无法访问此类副本上的快照。 作为回报,这些副本可能具有特殊的硬件配置,每个服务器附加更多的磁盘,这将是经济高效的。 +某些本地文件系统提供快照功能(例如, [ZFS](https://en.wikipedia.org/wiki/ZFS)),但它们可能不是提供实时查询的最佳选择。 一个可能的解决方案是使用这种文件系统创建额外的副本,并将它们与用于`SELECT` 查询的 [分布式](../engines/table-engines/special/distributed.md) 表分离。 任何修改数据的查询都无法访问此类副本上的快照。 作为回报,这些副本可能具有特殊的硬件配置,每个服务器附加更多的磁盘,这将是经济高效的。 ## clickhouse-copier {#clickhouse-copier} -[clickhouse-copier] (utilities/clickhouse-copier.md) 是一个多功能工具,最初创建它是为了用于重新切分pb大小的表。 因为它能够在ClickHouse表和集群之间可靠地复制数据,所以它也可用于备份和还原数据。 +[clickhouse-copier](utilities/clickhouse-copier.md) 是一个多功能工具,最初创建它是为了用于重新切分pb大小的表。 因为它能够在ClickHouse表和集群之间可靠地复制数据,所以它也可用于备份和还原数据。 对于较小的数据量,一个简单的 `INSERT INTO ... SELECT ...` 到远程表也可以工作。 ## part操作 {#manipulations-with-parts} -ClickHouse允许使用 `ALTER TABLE ... FREEZE PARTITION ...` 查询以创建表分区的本地副本。 这是利用硬链接(hardlink)到 `/var/lib/clickhouse/shadow/` 文件夹中实现的,所以它通常不会因为旧数据而占用额外的磁盘空间。 创建的文件副本不由ClickHouse服务器处理,所以你可以把它们留在那里:你将有一个简单的备份,不需要任何额外的外部系统,但它仍然容易出现硬件问题。 出于这个原因,最好将它们远程复制到另一个位置,然后删除本地副本。 分布式文件系统和对象存储仍然是一个不错的选择,但是具有足够大容量的正常附加文件服务器也可以工作(在这种情况下,传输将通过网络文件系统或者也许是 [rsync] (https://en.wikipedia.org/wiki/Rsync) 来进行). +ClickHouse允许使用 `ALTER TABLE ... FREEZE PARTITION ...` 查询以创建表分区的本地副本。 这是利用硬链接(hardlink)到 `/var/lib/clickhouse/shadow/` 文件夹中实现的,所以它通常不会因为旧数据而占用额外的磁盘空间。 创建的文件副本不由ClickHouse服务器处理,所以你可以把它们留在那里:你将有一个简单的备份,不需要任何额外的外部系统,但它仍然容易出现硬件问题。 出于这个原因,最好将它们远程复制到另一个位置,然后删除本地副本。 分布式文件系统和对象存储仍然是一个不错的选择,但是具有足够大容量的正常附加文件服务器也可以工作(在这种情况下,传输将通过网络文件系统或者也许是 [rsync](https://en.wikipedia.org/wiki/Rsync) 来进行). 数据可以使用 `ALTER TABLE ... ATTACH PARTITION ...` 从备份中恢复。 -有关与分区操作相关的查询的详细信息,请参阅 [更改文档] (../sql-reference/statements/alter.md#alter_manipulations-with-partitions). +有关与分区操作相关的查询的详细信息,请参阅 [更改文档](../sql-reference/statements/alter.md#alter_manipulations-with-partitions). -第三方工具可用于自动化此方法: [clickhouse-backup] (https://github.com/AlexAkulov/clickhouse-backup). +第三方工具可用于自动化此方法: [clickhouse-backup](https://github.com/AlexAkulov/clickhouse-backup). -[原始文章] (https://clickhouse.tech/docs/en/operations/backup/) +[原始文章](https://clickhouse.tech/docs/en/operations/backup/) 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/troubleshooting.md b/docs/zh/operations/troubleshooting.md index 56b18aa1307..8d1defd6366 100644 --- a/docs/zh/operations/troubleshooting.md +++ b/docs/zh/operations/troubleshooting.md @@ -26,7 +26,7 @@ toc_title: "常见问题" ### 服务器未运行 {#server-is-not-running} -**检查服务器是否运行nnig** +**检查服务器是否正在运行** 命令: diff --git a/docs/zh/sql-reference/functions/ym-dict-functions.md b/docs/zh/sql-reference/functions/ym-dict-functions.md index 429105084dd..2f2b2f80d25 100644 --- a/docs/zh/sql-reference/functions/ym-dict-functions.md +++ b/docs/zh/sql-reference/functions/ym-dict-functions.md @@ -1,8 +1,8 @@ -# 功能与Yandex的工作。梅特里卡词典 {#functions-for-working-with-yandex-metrica-dictionaries} +# 使用 Yandex.Metrica 字典函数 {#functions-for-working-with-yandex-metrica-dictionaries} -为了使下面的功能正常工作,服务器配置必须指定获取所有Yandex的路径和地址。梅特里卡字典. 字典在任何这些函数的第一次调用时加载。 如果无法加载引用列表,则会引发异常。 +为了使下面的功能正常工作,服务器配置必须指定获取所有 Yandex.Metrica 字典的路径和地址。Yandex.Metrica 字典在任何这些函数的第一次调用时加载。 如果无法加载引用列表,则会引发异常。 -For information about creating reference lists, see the section «Dictionaries». +有关创建引用列表的信息,请参阅 «字典» 部分. ## 多个地理基 {#multiple-geobases} @@ -17,18 +17,18 @@ ClickHouse支持同时使用多个备选地理基(区域层次结构),以 所有字典都在运行时重新加载(每隔一定数量的秒重新加载一次,如builtin_dictionaries_reload_interval config参数中定义,或默认情况下每小时一次)。 但是,可用字典列表在服务器启动时定义一次。 -All functions for working with regions have an optional argument at the end – the dictionary key. It is referred to as the geobase. +所有处理区域的函数都在末尾有一个可选参数—字典键。它被称为地基。 示例: - regionToCountry(RegionID) – Uses the default dictionary: /opt/geo/regions_hierarchy.txt - regionToCountry(RegionID, '') – Uses the default dictionary: /opt/geo/regions_hierarchy.txt - regionToCountry(RegionID, 'ua') – Uses the dictionary for the 'ua' key: /opt/geo/regions_hierarchy_ua.txt + regionToCountry(RegionID) – 使用默认路径: /opt/geo/regions_hierarchy.txt + regionToCountry(RegionID, '') – 使用默认路径: /opt/geo/regions_hierarchy.txt + regionToCountry(RegionID, 'ua') – 使用字典中的'ua' 键: /opt/geo/regions_hierarchy_ua.txt -### ツ环板(ョツ嘉ッツ偲青regionシツ氾カツ鉄ツ工ツ渉\]) {#regiontocityid-geobase} +### regionToCity(id[, geobase]) {#regiontocityid-geobase} -Accepts a UInt32 number – the region ID from the Yandex geobase. If this region is a city or part of a city, it returns the region ID for the appropriate city. Otherwise, returns 0. +从 Yandex geobase 接收一个 UInt32 数字类型的区域ID 。如果该区域是一个城市或城市的一部分,它将返回相应城市的区域ID。否则,返回0。 -### 虏茅驴麓卤戮碌禄路戮鲁拢\]) {#regiontoareaid-geobase} +### regionToArea(id[, geobase]) {#regiontoareaid-geobase} 将区域转换为区域(地理数据库中的类型5)。 在所有其他方式,这个功能是一样的 ‘regionToCity’. @@ -84,36 +84,58 @@ LIMIT 15 │ Federation of Bosnia and Herzegovina │ └──────────────────────────────────────────────────────────┘ -### 虏茅驴麓卤戮碌禄路戮鲁拢(陆毛隆隆(803)888-8325\]) {#regiontocountryid-geobase} +### regionToCountry(id[, geobase]) {#regiontocountryid-geobase} 将区域转换为国家。 在所有其他方式,这个功能是一样的 ‘regionToCity’. 示例: `regionToCountry(toUInt32(213)) = 225` 转换莫斯科(213)到俄罗斯(225)。 -### 掳胫((禄脢鹿脷露胫鲁隆鹿((酶-11-16""\[脪陆,ase\]) {#regiontocontinentid-geobase} +### regionToContinent(id[, geobase]) {#regiontocontinentid-geobase} 将区域转换为大陆。 在所有其他方式,这个功能是一样的 ‘regionToCity’. 示例: `regionToContinent(toUInt32(213)) = 10001` 将莫斯科(213)转换为欧亚大陆(10001)。 -### ツ环板(ョツ嘉ッツ偲青regionャツ静ャツ青サツ催ャツ渉\]) {#regiontopopulationid-geobase} +### regionToTopContinent (#regiontotopcontinent) {#regiontotopcontinent-regiontotopcontinent} + +查找该区域层次结构中最高的大陆。 + +**语法** + +``` sql +regionToTopContinent(id[, geobase]) +``` + +**参数** + +- `id` — Yandex geobase 的区域 ID. [UInt32](../../sql-reference/data-types/int-uint.md). +- `geobase` — 字典的建. 参阅 [Multiple Geobases](#multiple-geobases). [String](../../sql-reference/data-types/string.md). 可选. + +**返回值** + +- 顶级大陆的标识符(当您在区域层次结构中攀爬时,是后者)。 +- 0,如果没有。 + +类型: `UInt32`. + +### regionToPopulation(id\[, geobase\]) {#regiontopopulationid-geobase} 获取区域的人口。 -The population can be recorded in files with the geobase. See the section «External dictionaries». +人口可以记录在文件与地球基。请参阅«外部词典»部分。 如果没有为该区域记录人口,则返回0。 在Yandex地理数据库中,可能会为子区域记录人口,但不会为父区域记录人口。 ### regionIn(lhs,rhs\[,地理数据库\]) {#regioninlhs-rhs-geobase} 检查是否 ‘lhs’ 属于一个区域 ‘rhs’ 区域。 如果属于UInt8,则返回等于1的数字,如果不属于则返回0。 -The relationship is reflexive – any region also belongs to itself. +这种关系是反射的——任何地区也属于自己。 -### ツ暗ェツ氾环催ツ団ツ法ツ人\]) {#regionhierarchyid-geobase} +### regionHierarchy(id\[, geobase\]) {#regionhierarchyid-geobase} -Accepts a UInt32 number – the region ID from the Yandex geobase. Returns an array of region IDs consisting of the passed region and all parents along the chain. +从 Yandex geobase 接收一个 UInt32 数字类型的区域ID。返回一个区域ID数组,由传递的区域和链上的所有父节点组成。 示例: `regionHierarchy(toUInt32(213)) = [213,1,3,225,10001,10000]`. -### 地区名称(id\[,郎\]) {#regiontonameid-lang} +### regionToName(id\[, lang\]) {#regiontonameid-lang} -Accepts a UInt32 number – the region ID from the Yandex geobase. A string with the name of the language can be passed as a second argument. Supported languages are: ru, en, ua, uk, by, kz, tr. If the second argument is omitted, the language ‘ru’ is used. If the language is not supported, an exception is thrown. Returns a string – the name of the region in the corresponding language. If the region with the specified ID doesn’t exist, an empty string is returned. +从 Yandex geobase 接收一个 UInt32 数字类型的区域ID。带有语言名称的字符串可以作为第二个参数传递。支持的语言有:ru, en, ua, uk, by, kz, tr。如果省略第二个参数,则使用' ru '语言。如果不支持该语言,则抛出异常。返回一个字符串-对应语言的区域名称。如果指定ID的区域不存在,则返回一个空字符串。 `ua` 和 `uk` 都意味着乌克兰。 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 14442167042..65e245750b3 100644 --- a/programs/client/Client.cpp +++ b/programs/client/Client.cpp @@ -2,6 +2,7 @@ #include "Common/MemoryTracker.h" #include "Columns/ColumnsNumber.h" #include "ConnectionParameters.h" +#include "IO/CompressionMethod.h" #include "QueryFuzzer.h" #include "Suggest.h" #include "TestHint.h" @@ -128,6 +129,7 @@ namespace ErrorCodes extern const int UNRECOGNIZED_ARGUMENTS; extern const int SYNTAX_ERROR; extern const int TOO_DEEP_RECURSION; + extern const int AUTHENTICATION_FAILED; } @@ -772,31 +774,50 @@ private: << connection_parameters.host << ":" << connection_parameters.port << (!connection_parameters.user.empty() ? " as user " + connection_parameters.user : "") << "." << std::endl; - connection = std::make_unique( - connection_parameters.host, - connection_parameters.port, - connection_parameters.default_database, - connection_parameters.user, - connection_parameters.password, - "", /* cluster */ - "", /* cluster_secret */ - "client", - connection_parameters.compression, - connection_parameters.security); - String server_name; UInt64 server_version_major = 0; UInt64 server_version_minor = 0; UInt64 server_version_patch = 0; - if (max_client_network_bandwidth) + try { - ThrottlerPtr throttler = std::make_shared(max_client_network_bandwidth, 0, ""); - connection->setThrottler(throttler); - } + connection = std::make_unique( + connection_parameters.host, + connection_parameters.port, + connection_parameters.default_database, + connection_parameters.user, + connection_parameters.password, + "", /* cluster */ + "", /* cluster_secret */ + "client", + connection_parameters.compression, + connection_parameters.security); - connection->getServerVersion( - connection_parameters.timeouts, server_name, server_version_major, server_version_minor, server_version_patch, server_revision); + if (max_client_network_bandwidth) + { + ThrottlerPtr throttler = std::make_shared(max_client_network_bandwidth, 0, ""); + connection->setThrottler(throttler); + } + + connection->getServerVersion( + connection_parameters.timeouts, server_name, server_version_major, server_version_minor, server_version_patch, server_revision); + } + catch (const Exception & e) + { + /// It is typical when users install ClickHouse, type some password and instantly forget it. + if ((connection_parameters.user.empty() || connection_parameters.user == "default") + && e.code() == DB::ErrorCodes::AUTHENTICATION_FAILED) + { + std::cerr << std::endl + << "If you have installed ClickHouse and forgot password you can reset it in the configuration file." << std::endl + << "The password for default user is typically located at /etc/clickhouse-server/users.d/default-password.xml" << std::endl + << "and deleting this file will reset the password." << std::endl + << "See also /etc/clickhouse-server/users.xml on the server where ClickHouse is installed." << std::endl + << std::endl; + } + + throw; + } server_version = toString(server_version_major) + "." + toString(server_version_minor) + "." + toString(server_version_patch); @@ -1823,7 +1844,7 @@ private: void processInsertQuery() { const auto parsed_insert_query = parsed_query->as(); - if (!parsed_insert_query.data && (is_interactive || (!stdin_is_a_tty && std_in.eof()))) + if ((!parsed_insert_query.data && !parsed_insert_query.infile) && (is_interactive || (!stdin_is_a_tty && std_in.eof()))) throw Exception("No data to insert", ErrorCodes::NO_DATA_TO_INSERT); connection->sendQuery( @@ -1894,7 +1915,24 @@ private: if (!parsed_insert_query) return; - if (parsed_insert_query->data) + if (parsed_insert_query->infile) + { + const auto & in_file_node = parsed_insert_query->infile->as(); + const auto in_file = in_file_node.value.safeGet(); + + auto in_buffer = wrapReadBufferWithCompressionMethod(std::make_unique(in_file), chooseCompressionMethod(in_file, "")); + + try + { + sendDataFrom(*in_buffer, sample, columns_description); + } + catch (Exception & e) + { + e.addMessage("data for INSERT was parsed from file"); + throw; + } + } + else if (parsed_insert_query->data) { /// Send data contained in the query. ReadBufferFromMemory data_in(parsed_insert_query->data, parsed_insert_query->end - parsed_insert_query->data); 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/keeper/Keeper.cpp b/programs/keeper/Keeper.cpp index 60695cbfeeb..759feffb90e 100644 --- a/programs/keeper/Keeper.cpp +++ b/programs/keeper/Keeper.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -299,9 +300,9 @@ int Keeper::main(const std::vector & /*args*/) if (config().has("keeper_server.storage_path")) path = config().getString("keeper_server.storage_path"); else if (config().has("keeper_server.log_storage_path")) - path = config().getString("keeper_server.log_storage_path"); + path = std::filesystem::path(config().getString("keeper_server.log_storage_path")).parent_path(); else if (config().has("keeper_server.snapshot_storage_path")) - path = config().getString("keeper_server.snapshot_storage_path"); + path = std::filesystem::path(config().getString("keeper_server.snapshot_storage_path")).parent_path(); else path = std::filesystem::path{KEEPER_DEFAULT_PATH}; @@ -326,6 +327,8 @@ int Keeper::main(const std::vector & /*args*/) } } + DB::ServerUUID::load(path + "/uuid", log); + const Settings & settings = global_context->getSettingsRef(); GlobalThreadPool::initialize(config().getUInt("max_thread_pool_size", 100)); @@ -356,7 +359,7 @@ int Keeper::main(const std::vector & /*args*/) auto servers = std::make_shared>(); /// Initialize test keeper RAFT. Do nothing if no nu_keeper_server in config. - global_context->initializeKeeperStorageDispatcher(); + global_context->initializeKeeperDispatcher(); for (const auto & listen_host : listen_hosts) { /// TCP Keeper @@ -425,7 +428,7 @@ int Keeper::main(const std::vector & /*args*/) else LOG_INFO(log, "Closed connections to Keeper."); - global_context->shutdownKeeperStorageDispatcher(); + global_context->shutdownKeeperDispatcher(); /// Wait server pool to avoid use-after-free of destroyed context in the handlers server_pool.joinAll(); diff --git a/programs/local/LocalServer.cpp b/programs/local/LocalServer.cpp index e256338a538..b4496c121d5 100644 --- a/programs/local/LocalServer.cpp +++ b/programs/local/LocalServer.cpp @@ -12,6 +12,8 @@ #include #include #include +#include +#include #include #include #include @@ -286,6 +288,12 @@ try /// Lock path directory before read status.emplace(path + "status", StatusFile::write_full_info); + fs::create_directories(fs::path(path) / "user_defined/"); + LOG_DEBUG(log, "Loading user defined objects from {}", path); + Poco::File(path + "user_defined/").createDirectories(); + UserDefinedObjectsLoader::instance().loadObjects(global_context); + LOG_DEBUG(log, "Loaded user defined objects."); + LOG_DEBUG(log, "Loading metadata from {}", path); fs::create_directories(fs::path(path) / "data/"); fs::create_directories(fs::path(path) / "metadata/"); @@ -374,14 +382,13 @@ void LocalServer::processQueries() if (!parse_res.second) throw Exception("Cannot parse and execute the following part of query: " + String(parse_res.first), ErrorCodes::SYNTAX_ERROR); - /// we can't mutate global global_context (can lead to races, as it was already passed to some background threads) - /// so we can't reuse it safely as a query context and need a copy here - auto context = Context::createCopy(global_context); + /// Authenticate and create a context to execute queries. + Session session{global_context, ClientInfo::Interface::LOCAL}; + session.authenticate("default", "", {}); - context->makeSessionContext(); - context->makeQueryContext(); - - context->setUser("default", "", Poco::Net::SocketAddress{}); + /// Use the same context for all queries. + auto context = session.makeQueryContext(); + context->makeSessionContext(); /// initial_create_query requires a session context to be set. context->setCurrentQueryId(""); applyCmdSettings(context); diff --git a/programs/odbc-bridge/ODBCBlockOutputStream.cpp b/programs/odbc-bridge/ODBCBlockOutputStream.cpp index b4b514d1473..8a4387c2389 100644 --- a/programs/odbc-bridge/ODBCBlockOutputStream.cpp +++ b/programs/odbc-bridge/ODBCBlockOutputStream.cpp @@ -5,40 +5,16 @@ #include #include #include -#include -#include -#include #include "getIdentifierQuote.h" #include #include #include +#include namespace DB { -namespace -{ - using ValueType = ExternalResultDescription::ValueType; - - std::string getInsertQuery(const std::string & db_name, const std::string & table_name, const ColumnsWithTypeAndName & columns, IdentifierQuotingStyle quoting) - { - ASTInsertQuery query; - query.table_id.database_name = db_name; - query.table_id.table_name = table_name; - query.columns = std::make_shared(','); - query.children.push_back(query.columns); - for (const auto & column : columns) - query.columns->children.emplace_back(std::make_shared(column.name)); - - WriteBufferFromOwnString buf; - IAST::FormatSettings settings(buf, true); - settings.always_quote_identifiers = true; - settings.identifier_quoting_style = quoting; - query.IAST::format(settings); - return buf.str(); - } -} ODBCBlockOutputStream::ODBCBlockOutputStream(nanodbc::ConnectionHolderPtr connection_holder_, const std::string & remote_database_name_, diff --git a/programs/odbc-bridge/ODBCBlockOutputStream.h b/programs/odbc-bridge/ODBCBlockOutputStream.h index 1b42119e490..16a1602d3cd 100644 --- a/programs/odbc-bridge/ODBCBlockOutputStream.h +++ b/programs/odbc-bridge/ODBCBlockOutputStream.h @@ -13,6 +13,7 @@ namespace DB class ODBCBlockOutputStream : public IBlockOutputStream { +using ValueType = ExternalResultDescription::ValueType; public: ODBCBlockOutputStream( diff --git a/programs/server/Server.cpp b/programs/server/Server.cpp index c69c48bb23d..b7ef8cbec9c 100644 --- a/programs/server/Server.cpp +++ b/programs/server/Server.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -52,6 +53,7 @@ #include #include #include +#include #include #include #include @@ -79,7 +81,6 @@ #include #include - #if !defined(ARCADIA_BUILD) # include "config_core.h" # include "Common/config_version.h" @@ -97,7 +98,7 @@ #endif #if USE_SSL -# if USE_INTERNAL_SSL_LIBRARY +# if USE_INTERNAL_SSL_LIBRARY && !defined(ARCADIA_BUILD) # include # endif # include @@ -146,7 +147,6 @@ static bool jemallocOptionEnabled(const char *name) static bool jemallocOptionEnabled(const char *) { return 0; } #endif - int mainEntryClickHouseServer(int argc, char ** argv) { DB::Server app; @@ -358,6 +358,7 @@ void Server::createServer(const std::string & listen_host, const char * port_nam try { func(port); + global_context->registerServerPort(port_name, port); } catch (const Poco::Exception &) { @@ -667,13 +668,14 @@ if (ThreadFuzzer::instance().isEffective()) global_context->setRemoteHostFilter(config()); - std::string path = getCanonicalPath(config().getString("path", DBMS_DEFAULT_PATH)); + std::string path_str = getCanonicalPath(config().getString("path", DBMS_DEFAULT_PATH)); + fs::path path = path_str; std::string default_database = config().getString("default_database", "default"); /// Check that the process user id matches the owner of the data. const auto effective_user_id = geteuid(); struct stat statbuf; - if (stat(path.c_str(), &statbuf) == 0 && effective_user_id != statbuf.st_uid) + if (stat(path_str.c_str(), &statbuf) == 0 && effective_user_id != statbuf.st_uid) { const auto effective_user = getUserName(effective_user_id); const auto data_owner = getUserName(statbuf.st_uid); @@ -690,9 +692,11 @@ if (ThreadFuzzer::instance().isEffective()) } } - global_context->setPath(path); + global_context->setPath(path_str); - StatusFile status{path + "status", StatusFile::write_full_info}; + StatusFile status{path / "status", StatusFile::write_full_info}; + + DB::ServerUUID::load(path / "uuid", log); /// Try to increase limit on number of open files. { @@ -726,19 +730,23 @@ if (ThreadFuzzer::instance().isEffective()) /// Storage with temporary data for processing of heavy queries. { - std::string tmp_path = config().getString("tmp_path", path + "tmp/"); + std::string tmp_path = config().getString("tmp_path", path / "tmp/"); std::string tmp_policy = config().getString("tmp_policy", ""); const VolumePtr & volume = global_context->setTemporaryStorage(tmp_path, tmp_policy); for (const DiskPtr & disk : volume->getDisks()) setupTmpPath(log, disk->getPath()); } + /// Storage keeping all the backups. + fs::create_directories(path / "backups"); + global_context->setBackupsVolume(config().getString("backups_path", path / "backups"), config().getString("backups_policy", "")); + /** Directory with 'flags': files indicating temporary settings for the server set by system administrator. * Flags may be cleared automatically after being applied by the server. * Examples: do repair of local data; clone all replicated tables from replica. */ { - auto flags_path = fs::path(path) / "flags/"; + auto flags_path = path / "flags/"; fs::create_directories(flags_path); global_context->setFlagsPath(flags_path); } @@ -747,29 +755,30 @@ if (ThreadFuzzer::instance().isEffective()) */ { - std::string user_files_path = config().getString("user_files_path", fs::path(path) / "user_files/"); + std::string user_files_path = config().getString("user_files_path", path / "user_files/"); global_context->setUserFilesPath(user_files_path); fs::create_directories(user_files_path); } { - std::string dictionaries_lib_path = config().getString("dictionaries_lib_path", fs::path(path) / "dictionaries_lib/"); + std::string dictionaries_lib_path = config().getString("dictionaries_lib_path", path / "dictionaries_lib/"); global_context->setDictionariesLibPath(dictionaries_lib_path); fs::create_directories(dictionaries_lib_path); } /// top_level_domains_lists { - const std::string & top_level_domains_path = config().getString("top_level_domains_path", fs::path(path) / "top_level_domains/"); + const std::string & top_level_domains_path = config().getString("top_level_domains_path", path / "top_level_domains/"); TLDListsHolder::getInstance().parseConfig(fs::path(top_level_domains_path) / "", config()); } { - fs::create_directories(fs::path(path) / "data/"); - fs::create_directories(fs::path(path) / "metadata/"); + fs::create_directories(path / "data/"); + fs::create_directories(path / "metadata/"); + fs::create_directories(path / "user_defined/"); /// Directory with metadata of tables, which was marked as dropped by Atomic database - fs::create_directories(fs::path(path) / "metadata_dropped/"); + fs::create_directories(path / "metadata_dropped/"); } if (config().has("interserver_http_port") && config().has("interserver_https_port")) @@ -952,7 +961,7 @@ if (ThreadFuzzer::instance().isEffective()) #endif /// Set path for format schema files - fs::path format_schema_path(config().getString("format_schema_path", fs::path(path) / "format_schemas/")); + fs::path format_schema_path(config().getString("format_schema_path", path / "format_schemas/")); global_context->setFormatSchemaPath(format_schema_path); fs::create_directories(format_schema_path); @@ -987,7 +996,7 @@ if (ThreadFuzzer::instance().isEffective()) { #if USE_NURAFT /// Initialize test keeper RAFT. Do nothing if no nu_keeper_server in config. - global_context->initializeKeeperStorageDispatcher(); + global_context->initializeKeeperDispatcher(); for (const auto & listen_host : listen_hosts) { /// TCP Keeper @@ -1070,12 +1079,15 @@ if (ThreadFuzzer::instance().isEffective()) else LOG_INFO(log, "Closed connections to servers for tables."); - global_context->shutdownKeeperStorageDispatcher(); + global_context->shutdownKeeperDispatcher(); } /// Wait server pool to avoid use-after-free of destroyed context in the handlers server_pool.joinAll(); + // Uses a raw pointer to global context for getting ZooKeeper. + main_config_reloader.reset(); + /** Explicitly destroy Context. It is more convenient than in destructor of Server, because logger is still available. * At this moment, no one could own shared part of Context. */ @@ -1088,7 +1100,19 @@ if (ThreadFuzzer::instance().isEffective()) /// system logs may copy global context. global_context->setCurrentDatabaseNameInGlobalContext(default_database); - LOG_INFO(log, "Loading metadata from {}", path); + LOG_INFO(log, "Loading user defined objects from {}", path_str); + try + { + UserDefinedObjectsLoader::instance().loadObjects(global_context); + } + catch (...) + { + tryLogCurrentException(log, "Caught exception while loading user defined objects"); + throw; + } + LOG_DEBUG(log, "Loaded user defined objects"); + + LOG_INFO(log, "Loading metadata from {}", path_str); try { @@ -1428,7 +1452,6 @@ if (ThreadFuzzer::instance().isEffective()) /// Must be done after initialization of `servers`, because async_metrics will access `servers` variable from its thread. async_metrics.start(); - global_context->enableNamedSessions(); { String level_str = config().getString("text_log.level", ""); @@ -1508,7 +1531,6 @@ if (ThreadFuzzer::instance().isEffective()) LOG_INFO(log, "Closed connections."); dns_cache_updater.reset(); - main_config_reloader.reset(); if (current_connections) { diff --git a/programs/server/config.xml b/programs/server/config.xml index 136b982a181..510a5e230f8 100644 --- a/programs/server/config.xml +++ b/programs/server/config.xml @@ -888,13 +888,13 @@ system part_log
+ toYYYYMM(event_date) 7500
- --> + @@ -28,7 +30,9 @@ - int needs explicit cast /// 2. customized types needs explicit cast template - enable_if_not_field_or_stringlike_t & + enable_if_not_field_or_bool_or_stringlike_t & operator=(T && rhs); + Field & operator= (bool rhs) { return *this = castToNearestFieldType(rhs); } + Field & operator= (const std::string_view & str); Field & operator= (const String & str) { return *this = std::string_view{str}; } Field & operator= (String && str); @@ -876,24 +891,14 @@ template <> inline constexpr const char * TypeName = template -decltype(auto) castToNearestFieldType(T && x) -{ - using U = NearestFieldType>; - if constexpr (std::is_same_v, U>) - return std::forward(x); - else - return U(x); -} - -template -Field::Field(T && rhs, enable_if_not_field_or_stringlike_t) //-V730 +Field::Field(T && rhs, enable_if_not_field_or_bool_or_stringlike_t) //-V730 { auto && val = castToNearestFieldType(std::forward(rhs)); createConcrete(std::forward(val)); } template -Field::enable_if_not_field_or_stringlike_t & +Field::enable_if_not_field_or_bool_or_stringlike_t & Field::operator=(T && rhs) { auto && val = castToNearestFieldType(std::forward(rhs)); @@ -908,7 +913,6 @@ Field::operator=(T && rhs) return *this; } - inline Field & Field::operator=(const std::string_view & str) { if (which != Types::String) @@ -974,9 +978,9 @@ __attribute__ ((noreturn)) inline void writeText(const AggregateFunctionStateDat } template -inline void writeText(const DecimalField & value, WriteBuffer & buf) +inline void writeText(const DecimalField & value, WriteBuffer & buf, bool trailing_zeros = false) { - writeText(value.getValue(), value.getScale(), buf); + writeText(value.getValue(), value.getScale(), buf, trailing_zeros); } template diff --git a/src/Core/MySQL/Authentication.cpp b/src/Core/MySQL/Authentication.cpp index 658c86795b1..aeb9a411082 100644 --- a/src/Core/MySQL/Authentication.cpp +++ b/src/Core/MySQL/Authentication.cpp @@ -2,8 +2,7 @@ #include #include #include -#include -#include +#include #include #include @@ -73,7 +72,7 @@ Native41::Native41(const String & password, const String & auth_plugin_data) } void Native41::authenticate( - const String & user_name, std::optional auth_response, ContextMutablePtr context, + const String & user_name, Session & session, std::optional auth_response, std::shared_ptr packet_endpoint, bool, const Poco::Net::SocketAddress & address) { if (!auth_response) @@ -86,7 +85,7 @@ void Native41::authenticate( if (auth_response->empty()) { - context->setUser(user_name, "", address); + session.authenticate(user_name, "", address); return; } @@ -96,9 +95,7 @@ void Native41::authenticate( + " bytes, received: " + std::to_string(auth_response->size()) + " bytes.", ErrorCodes::UNKNOWN_EXCEPTION); - auto user = context->getAccessControlManager().read(user_name); - - Poco::SHA1Engine::Digest double_sha1_value = user->authentication.getPasswordDoubleSHA1(); + Poco::SHA1Engine::Digest double_sha1_value = session.getPasswordDoubleSHA1(user_name); assert(double_sha1_value.size() == Poco::SHA1Engine::DIGEST_SIZE); Poco::SHA1Engine engine; @@ -111,7 +108,7 @@ void Native41::authenticate( { password_sha1[i] = digest[i] ^ static_cast((*auth_response)[i]); } - context->setUser(user_name, password_sha1, address); + session.authenticate(user_name, password_sha1, address); } #if USE_SSL @@ -136,7 +133,7 @@ Sha256Password::Sha256Password(RSA & public_key_, RSA & private_key_, Poco::Logg } void Sha256Password::authenticate( - const String & user_name, std::optional auth_response, ContextMutablePtr context, + const String & user_name, Session & session, std::optional auth_response, std::shared_ptr packet_endpoint, bool is_secure_connection, const Poco::Net::SocketAddress & address) { if (!auth_response) @@ -231,7 +228,7 @@ void Sha256Password::authenticate( password.pop_back(); } - context->setUser(user_name, password, address); + session.authenticate(user_name, password, address); } #endif diff --git a/src/Core/MySQL/Authentication.h b/src/Core/MySQL/Authentication.h index acbda2bdb58..a60e769434e 100644 --- a/src/Core/MySQL/Authentication.h +++ b/src/Core/MySQL/Authentication.h @@ -15,6 +15,7 @@ namespace DB { +class Session; namespace MySQLProtocol { @@ -32,7 +33,7 @@ public: virtual String getAuthPluginData() = 0; virtual void authenticate( - const String & user_name, std::optional auth_response, ContextMutablePtr context, + const String & user_name, Session & session, std::optional auth_response, std::shared_ptr packet_endpoint, bool is_secure_connection, const Poco::Net::SocketAddress & address) = 0; }; @@ -49,7 +50,7 @@ public: String getAuthPluginData() override { return scramble; } void authenticate( - const String & user_name, std::optional auth_response, ContextMutablePtr context, + const String & user_name, Session & session, std::optional auth_response, std::shared_ptr packet_endpoint, bool /* is_secure_connection */, const Poco::Net::SocketAddress & address) override; private: @@ -69,7 +70,7 @@ public: String getAuthPluginData() override { return scramble; } void authenticate( - const String & user_name, std::optional auth_response, ContextMutablePtr context, + const String & user_name, Session & session, std::optional auth_response, std::shared_ptr packet_endpoint, bool is_secure_connection, const Poco::Net::SocketAddress & address) override; private: diff --git a/src/Core/NamesAndTypes.cpp b/src/Core/NamesAndTypes.cpp index 91191c73fd0..b47f5a6823b 100644 --- a/src/Core/NamesAndTypes.cpp +++ b/src/Core/NamesAndTypes.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -6,7 +7,6 @@ #include #include #include -#include namespace DB @@ -163,12 +163,7 @@ NamesAndTypesList NamesAndTypesList::filter(const Names & names) const NamesAndTypesList NamesAndTypesList::addTypes(const Names & names) const { /// NOTE: It's better to make a map in `IStorage` than to create it here every time again. -#if !defined(ARCADIA_BUILD) - google::dense_hash_map types; -#else - google::sparsehash::dense_hash_map types; -#endif - types.set_empty_key(StringRef()); + HashMapWithSavedHash types; for (const auto & column : *this) types[column.name] = &column.type; @@ -176,10 +171,11 @@ NamesAndTypesList NamesAndTypesList::addTypes(const Names & names) const NamesAndTypesList res; for (const String & name : names) { - auto it = types.find(name); + const auto * it = types.find(name); if (it == types.end()) - throw Exception("No column " + name, ErrorCodes::THERE_IS_NO_COLUMN); - res.emplace_back(name, *it->second); + throw Exception(ErrorCodes::THERE_IS_NO_COLUMN, "No column {}", name); + + res.emplace_back(name, *it->getMapped()); } return res; diff --git a/src/Core/PostgreSQL/insertPostgreSQLValue.cpp b/src/Core/PostgreSQL/insertPostgreSQLValue.cpp index 19560cec9ea..4f31c8dfb52 100644 --- a/src/Core/PostgreSQL/insertPostgreSQLValue.cpp +++ b/src/Core/PostgreSQL/insertPostgreSQLValue.cpp @@ -110,7 +110,7 @@ void insertPostgreSQLValue( readDateTime64Text(time, 6, in, assert_cast(data_type.get())->getTimeZone()); if (time < 0) time = 0; - assert_cast &>(column).insertValue(time); + assert_cast(column).insertValue(time); break; } case ExternalResultDescription::ValueType::vtDecimal32: [[fallthrough]]; diff --git a/src/Core/PostgreSQLProtocol.h b/src/Core/PostgreSQLProtocol.h index 114abc0101f..aef0ed6ab25 100644 --- a/src/Core/PostgreSQLProtocol.h +++ b/src/Core/PostgreSQLProtocol.h @@ -1,13 +1,11 @@ #pragma once -#include -#include #include -#include #include #include #include #include +#include #include #include #include @@ -803,12 +801,13 @@ protected: static void setPassword( const String & user_name, const String & password, - ContextMutablePtr context, + Session & session, Messaging::MessageTransport & mt, const Poco::Net::SocketAddress & address) { - try { - context->setUser(user_name, password, address); + try + { + session.authenticate(user_name, password, address); } catch (const Exception &) { @@ -822,7 +821,7 @@ protected: public: virtual void authenticate( const String & user_name, - ContextMutablePtr context, + Session & session, Messaging::MessageTransport & mt, const Poco::Net::SocketAddress & address) = 0; @@ -836,11 +835,11 @@ class NoPasswordAuth : public AuthenticationMethod public: void authenticate( const String & user_name, - ContextMutablePtr context, + Session & session, Messaging::MessageTransport & mt, const Poco::Net::SocketAddress & address) override { - setPassword(user_name, "", context, mt, address); + return setPassword(user_name, "", session, mt, address); } Authentication::Type getType() const override @@ -854,7 +853,7 @@ class CleartextPasswordAuth : public AuthenticationMethod public: void authenticate( const String & user_name, - ContextMutablePtr context, + Session & session, Messaging::MessageTransport & mt, const Poco::Net::SocketAddress & address) override { @@ -864,7 +863,7 @@ public: if (type == Messaging::FrontMessageType::PASSWORD_MESSAGE) { std::unique_ptr password = mt.receive(); - setPassword(user_name, password->password, context, mt, address); + return setPassword(user_name, password->password, session, mt, address); } else throw Exception( @@ -897,16 +896,15 @@ public: void authenticate( const String & user_name, - ContextMutablePtr context, + Session & session, Messaging::MessageTransport & mt, const Poco::Net::SocketAddress & address) { - auto user = context->getAccessControlManager().read(user_name); - Authentication::Type user_auth_type = user->authentication.getType(); + Authentication::Type user_auth_type = session.getAuthenticationType(user_name); if (type_to_method.find(user_auth_type) != type_to_method.end()) { - type_to_method[user_auth_type]->authenticate(user_name, context, mt, address); + type_to_method[user_auth_type]->authenticate(user_name, session, mt, address); mt.send(Messaging::AuthenticationOk(), true); LOG_DEBUG(log, "Authentication for user {} was successful.", user_name); return; diff --git a/src/Core/ServerUUID.cpp b/src/Core/ServerUUID.cpp new file mode 100644 index 00000000000..721c406ff5f --- /dev/null +++ b/src/Core/ServerUUID.cpp @@ -0,0 +1,56 @@ +#include +#include +#include +#include +#include +#include + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int CANNOT_CREATE_FILE; +} + +void ServerUUID::load(const fs::path & server_uuid_file, Poco::Logger * log) +{ + /// Write a uuid file containing a unique uuid if the file doesn't already exist during server start. + + if (fs::exists(server_uuid_file)) + { + try + { + UUID uuid; + ReadBufferFromFile in(server_uuid_file); + readUUIDText(uuid, in); + assertEOF(in); + server_uuid = uuid; + return; + } + catch (...) + { + /// As for now it's ok to just overwrite it, because persistency in not essential. + LOG_ERROR(log, "Cannot read server UUID from file {}: {}. Will overwrite it", + server_uuid_file.string(), getCurrentExceptionMessage(true)); + } + } + + try + { + UUID new_uuid = UUIDHelpers::generateV4(); + auto uuid_str = toString(new_uuid); + WriteBufferFromFile out(server_uuid_file); + out.write(uuid_str.data(), uuid_str.size()); + out.sync(); + out.finalize(); + server_uuid = new_uuid; + } + catch (...) + { + throw Exception(ErrorCodes::CANNOT_CREATE_FILE, "Caught Exception {} while writing the Server UUID file {}", + getCurrentExceptionMessage(false), server_uuid_file.string()); + } +} + +} diff --git a/src/Core/ServerUUID.h b/src/Core/ServerUUID.h new file mode 100644 index 00000000000..36bbf0e6315 --- /dev/null +++ b/src/Core/ServerUUID.h @@ -0,0 +1,26 @@ +#pragma once +#include +#include + +namespace fs = std::filesystem; +namespace Poco +{ + class Logger; +} + +namespace DB +{ + +class ServerUUID +{ + inline static UUID server_uuid = UUIDHelpers::Nil; + +public: + /// Returns persistent UUID of current clickhouse-server or clickhouse-keeper instance. + static UUID get() { return server_uuid; } + + /// Loads server UUID from file or creates new one. Should be called on daemon startup. + static void load(const fs::path & server_uuid_file, Poco::Logger * log); +}; + +} diff --git a/src/Core/Settings.h b/src/Core/Settings.h index 19f9f2a94c8..71f9708711f 100644 --- a/src/Core/Settings.h +++ b/src/Core/Settings.h @@ -55,7 +55,7 @@ class IColumn; M(Seconds, receive_timeout, DBMS_DEFAULT_RECEIVE_TIMEOUT_SEC, "", 0) \ M(Seconds, send_timeout, DBMS_DEFAULT_SEND_TIMEOUT_SEC, "", 0) \ M(Seconds, drain_timeout, DBMS_DEFAULT_DRAIN_TIMEOUT_SEC, "", 0) \ - M(Seconds, tcp_keep_alive_timeout, 0, "The time in seconds the connection needs to remain idle before TCP starts sending keepalive probes", 0) \ + M(Seconds, tcp_keep_alive_timeout, 290 /* less than DBMS_DEFAULT_RECEIVE_TIMEOUT_SEC */, "The time in seconds the connection needs to remain idle before TCP starts sending keepalive probes", 0) \ M(Milliseconds, hedged_connection_timeout_ms, DBMS_DEFAULT_HEDGED_CONNECTION_TIMEOUT_MS, "Connection timeout for establishing connection with replica for Hedged requests", 0) \ M(Milliseconds, receive_data_timeout_ms, DBMS_DEFAULT_RECEIVE_DATA_TIMEOUT_MS, "Connection timeout for receiving first packet of data or packet with positive progress from replica", 0) \ M(Bool, use_hedged_requests, true, "Use hedged requests for distributed queries", 0) \ @@ -114,17 +114,18 @@ class IColumn; M(UInt64, group_by_two_level_threshold_bytes, 50000000, "From what size of the aggregation state in bytes, a two-level aggregation begins to be used. 0 - the threshold is not set. Two-level aggregation is used when at least one of the thresholds is triggered.", 0) \ M(Bool, distributed_aggregation_memory_efficient, true, "Is the memory-saving mode of distributed aggregation enabled.", 0) \ M(UInt64, aggregation_memory_efficient_merge_threads, 0, "Number of threads to use for merge intermediate aggregation results in memory efficient mode. When bigger, then more memory is consumed. 0 means - same as 'max_threads'.", 0) \ + M(Bool, enable_positional_arguments, false, "Enable positional arguments in ORDER BY, GROUP BY and LIMIT BY", 0) \ \ M(UInt64, max_parallel_replicas, 1, "The maximum number of replicas of each shard used when the query is executed. For consistency (to get different parts of the same partition), this option only works for the specified sampling key. The lag of the replicas is not controlled.", 0) \ M(UInt64, parallel_replicas_count, 0, "", 0) \ M(UInt64, parallel_replica_offset, 0, "", 0) \ \ - M(Bool, skip_unavailable_shards, false, "If 1, ClickHouse silently skips unavailable shards and nodes unresolvable through DNS. Shard is marked as unavailable when none of the replicas can be reached.", 0) \ + M(Bool, skip_unavailable_shards, false, "If true, ClickHouse silently skips unavailable shards and nodes unresolvable through DNS. Shard is marked as unavailable when none of the replicas can be reached.", 0) \ \ M(UInt64, parallel_distributed_insert_select, 0, "Process distributed INSERT SELECT query in the same cluster on local tables on every shard, if 1 SELECT is executed on each shard, if 2 SELECT and INSERT is executed on each shard", 0) \ M(UInt64, distributed_group_by_no_merge, 0, "If 1, Do not merge aggregation states from different servers for distributed queries (shards will process query up to the Complete stage, initiator just proxies the data from the shards). If 2 the initiator will apply ORDER BY and LIMIT stages (it is not in case when shard process query up to the Complete stage)", 0) \ M(UInt64, distributed_push_down_limit, 1, "If 1, LIMIT will be applied on each shard separatelly. Usually you don't need to use it, since this will be done automatically if it is possible, i.e. for simple query SELECT FROM LIMIT.", 0) \ - M(Bool, optimize_distributed_group_by_sharding_key, false, "Optimize GROUP BY sharding_key queries (by avoiding costly aggregation on the initiator server).", 0) \ + M(Bool, optimize_distributed_group_by_sharding_key, true, "Optimize GROUP BY sharding_key queries (by avoiding costly aggregation on the initiator server).", 0) \ M(UInt64, optimize_skip_unused_shards_limit, 1000, "Limit for number of sharding key values, turns off optimize_skip_unused_shards if the limit is reached", 0) \ M(Bool, optimize_skip_unused_shards, false, "Assumes that data is distributed by sharding_key. Optimization to skip unused shards if SELECT query filters by sharding_key.", 0) \ M(Bool, optimize_skip_unused_shards_rewrite_in, true, "Rewrite IN in query for remote shards to exclude values that does not belong to the shard (requires optimize_skip_unused_shards)", 0) \ @@ -156,8 +157,8 @@ class IColumn; M(UInt64, min_bytes_to_use_mmap_io, 0, "The minimum number of bytes for reading the data with mmap option during SELECT queries execution. 0 - disabled.", 0) \ M(Bool, checksum_on_read, true, "Validate checksums on reading. It is enabled by default and should be always enabled in production. Please do not expect any benefits in disabling this setting. It may only be used for experiments and benchmarks. The setting only applicable for tables of MergeTree family. Checksums are always validated for other table engines and when receiving data over network.", 0) \ \ - M(Bool, force_index_by_date, 0, "Throw an exception if there is a partition key in a table, and it is not used.", 0) \ - M(Bool, force_primary_key, 0, "Throw an exception if there is primary key in a table, and it is not used.", 0) \ + M(Bool, force_index_by_date, false, "Throw an exception if there is a partition key in a table, and it is not used.", 0) \ + M(Bool, force_primary_key, false, "Throw an exception if there is primary key in a table, and it is not used.", 0) \ M(String, force_data_skipping_indices, "", "Comma separated list of strings or literals with the name of the data skipping indices that should be used during query execution, otherwise an exception will be thrown.", 0) \ \ M(Float, max_streams_to_max_threads_ratio, 1, "Allows you to use more sources than the number of threads - to more evenly distribute work across threads. It is assumed that this is a temporary solution, since it will be possible in the future to make the number of sources equal to the number of threads, but for each source to dynamically select available work for itself.", 0) \ @@ -170,8 +171,8 @@ class IColumn; M(UInt64, priority, 0, "Priority of the query. 1 - the highest, higher value - lower priority; 0 - do not use priorities.", 0) \ M(Int64, os_thread_priority, 0, "If non zero - set corresponding 'nice' value for query processing threads. Can be used to adjust query priority for OS scheduler.", 0) \ \ - M(Bool, log_queries, 1, "Log requests and write the log to the system table.", 0) \ - M(Bool, log_formatted_queries, 0, "Log formatted queries and write the log to the system table.", 0) \ + M(Bool, log_queries, true, "Log requests and write the log to the system table.", 0) \ + M(Bool, log_formatted_queries, false, "Log formatted queries and write the log to the system table.", 0) \ M(LogQueriesType, log_queries_min_type, QueryLogElementType::QUERY_START, "Minimal type in query_log to log, possible values (from low to high): QUERY_START, QUERY_FINISH, EXCEPTION_BEFORE_START, EXCEPTION_WHILE_PROCESSING.", 0) \ M(Milliseconds, log_queries_min_query_duration_ms, 0, "Minimal time for the query to run, to get to the query_log/query_thread_log/query_views_log.", 0) \ M(UInt64, log_queries_cut_to_length, 100000, "If query length is greater than specified threshold (in bytes), then cut query when writing to query log. Also limit length of printed query in ordinary text log.", 0) \ @@ -197,10 +198,10 @@ class IColumn; \ M(Float, memory_tracker_fault_probability, 0., "For testing of `exception safety` - throw an exception every time you allocate memory with the specified probability.", 0) \ \ - M(Bool, enable_http_compression, 0, "Compress the result if the client over HTTP said that it understands data compressed by gzip or deflate.", 0) \ + M(Bool, enable_http_compression, false, "Compress the result if the client over HTTP said that it understands data compressed by gzip or deflate.", 0) \ M(Int64, http_zlib_compression_level, 3, "Compression level - used if the client on HTTP said that it understands data compressed by gzip or deflate.", 0) \ \ - M(Bool, http_native_compression_disable_checksumming_on_decompress, 0, "If you uncompress the POST data from the client compressed by the native format, do not check the checksum.", 0) \ + M(Bool, http_native_compression_disable_checksumming_on_decompress, false, "If you uncompress the POST data from the client compressed by the native format, do not check the checksum.", 0) \ \ M(String, count_distinct_implementation, "uniqExact", "What aggregate function to use for implementation of count(DISTINCT ...)", 0) \ \ @@ -214,9 +215,9 @@ class IColumn; \ M(UInt64, http_headers_progress_interval_ms, 100, "Do not send HTTP headers X-ClickHouse-Progress more frequently than at each specified interval.", 0) \ \ - M(Bool, fsync_metadata, 1, "Do fsync after changing metadata for tables and databases (.sql files). Could be disabled in case of poor latency on server with high load of DDL queries and high load of disk subsystem.", 0) \ + M(Bool, fsync_metadata, true, "Do fsync after changing metadata for tables and databases (.sql files). Could be disabled in case of poor latency on server with high load of DDL queries and high load of disk subsystem.", 0) \ \ - M(Bool, join_use_nulls, 0, "Use NULLs for non-joined rows of outer JOINs for types that can be inside Nullable. If false, use default value of corresponding columns data type.", IMPORTANT) \ + M(Bool, join_use_nulls, false, "Use NULLs for non-joined rows of outer JOINs for types that can be inside Nullable. If false, use default value of corresponding columns data type.", IMPORTANT) \ \ M(JoinStrictness, join_default_strictness, JoinStrictness::ALL, "Set default strictness in JOIN query. Possible values: empty string, 'ANY', 'ALL'. If empty, query without strictness will throw exception.", 0) \ M(Bool, any_join_distinct_right_table_keys, false, "Enable old ANY JOIN logic with many-to-one left-to-right table keys mapping for all ANY JOINs. It leads to confusing not equal results for 't1 ANY LEFT JOIN t2' and 't2 ANY RIGHT JOIN t1'. ANY RIGHT JOIN needs one-to-many keys mapping to be consistent with LEFT one.", IMPORTANT) \ @@ -224,7 +225,7 @@ class IColumn; M(UInt64, preferred_block_size_bytes, 1000000, "", 0) \ \ M(UInt64, max_replica_delay_for_distributed_queries, 300, "If set, distributed queries of Replicated tables will choose servers with replication delay in seconds less than the specified value (not inclusive). Zero means do not take delay into account.", 0) \ - M(Bool, fallback_to_stale_replicas_for_distributed_queries, 1, "Suppose max_replica_delay_for_distributed_queries is set and all replicas for the queried table are stale. If this setting is enabled, the query will be performed anyway, otherwise the error will be reported.", 0) \ + M(Bool, fallback_to_stale_replicas_for_distributed_queries, true, "Suppose max_replica_delay_for_distributed_queries is set and all replicas for the queried table are stale. If this setting is enabled, the query will be performed anyway, otherwise the error will be reported.", 0) \ M(UInt64, preferred_max_column_in_block_size_bytes, 0, "Limit on max column size in block while reading. Helps to decrease cache misses count. Should be close to L2 cache size.", 0) \ \ M(Bool, insert_distributed_sync, false, "If setting is enabled, insert query into distributed waits until data will be sent to all nodes in cluster.", 0) \ @@ -240,7 +241,7 @@ class IColumn; /** Settings for testing connection collector */ \ M(Milliseconds, sleep_in_receive_cancel_ms, 0, "Time to sleep in receiving cancel in TCPHandler", 0) \ \ - M(Bool, insert_allow_materialized_columns, 0, "If setting is enabled, Allow materialized columns in INSERT.", 0) \ + M(Bool, insert_allow_materialized_columns, false, "If setting is enabled, Allow materialized columns in INSERT.", 0) \ M(Seconds, http_connection_timeout, DEFAULT_HTTP_READ_BUFFER_CONNECTION_TIMEOUT, "HTTP connection timeout.", 0) \ M(Seconds, http_send_timeout, DEFAULT_HTTP_READ_BUFFER_TIMEOUT, "HTTP send timeout", 0) \ M(Seconds, http_receive_timeout, DEFAULT_HTTP_READ_BUFFER_TIMEOUT, "HTTP receive timeout", 0) \ @@ -252,6 +253,7 @@ class IColumn; M(Bool, use_index_for_in_with_subqueries, true, "Try using an index if there is a subquery or a table expression on the right side of the IN operator.", 0) \ M(Bool, joined_subquery_requires_alias, true, "Force joined subqueries and table functions to have aliases for correct name qualification.", 0) \ M(Bool, empty_result_for_aggregation_by_empty_set, false, "Return empty result when aggregating without keys on empty set.", 0) \ + M(Bool, empty_result_for_aggregation_by_constant_keys_on_empty_set, true, "Return empty result when aggregating by constant keys on empty set.", 0) \ M(Bool, allow_distributed_ddl, true, "If it is set to true, then a user is allowed to executed distributed DDL queries.", 0) \ M(Bool, allow_suspicious_codecs, false, "If it is set to true, allow to specify meaningless compression codecs.", 0) \ M(Bool, allow_experimental_codecs, false, "If it is set to true, allow to specify experimental compression codecs (but we don't have those yet and this option does nothing).", 0) \ @@ -352,24 +354,26 @@ class IColumn; M(UInt64, max_network_bandwidth_for_user, 0, "The maximum speed of data exchange over the network in bytes per second for all concurrently running user queries. Zero means unlimited.", 0)\ M(UInt64, max_network_bandwidth_for_all_users, 0, "The maximum speed of data exchange over the network in bytes per second for all concurrently running queries. Zero means unlimited.", 0) \ \ + M(UInt64, max_backup_threads, 0, "The maximum number of threads to execute a BACKUP or RESTORE request. By default, it is determined automatically.", 0) \ + \ M(Bool, log_profile_events, true, "Log query performance statistics into the query_log, query_thread_log and query_views_log.", 0) \ M(Bool, log_query_settings, true, "Log query settings into the query_log.", 0) \ M(Bool, log_query_threads, true, "Log query threads into system.query_thread_log table. This setting have effect only when 'log_queries' is true.", 0) \ M(Bool, log_query_views, true, "Log query dependent views into system.query_views_log table. This setting have effect only when 'log_queries' is true.", 0) \ M(String, log_comment, "", "Log comment into system.query_log table and server log. It can be set to arbitrary string no longer than max_query_size.", 0) \ M(LogsLevel, send_logs_level, LogsLevel::fatal, "Send server text logs with specified minimum level to client. Valid values: 'trace', 'debug', 'information', 'warning', 'error', 'fatal', 'none'", 0) \ - M(Bool, enable_optimize_predicate_expression, 1, "If it is set to true, optimize predicates to subqueries.", 0) \ - M(Bool, enable_optimize_predicate_expression_to_final_subquery, 1, "Allow push predicate to final subquery.", 0) \ - M(Bool, allow_push_predicate_when_subquery_contains_with, 1, "Allows push predicate when subquery contains WITH clause", 0) \ + M(Bool, enable_optimize_predicate_expression, true, "If it is set to true, optimize predicates to subqueries.", 0) \ + M(Bool, enable_optimize_predicate_expression_to_final_subquery, true, "Allow push predicate to final subquery.", 0) \ + M(Bool, allow_push_predicate_when_subquery_contains_with, true, "Allows push predicate when subquery contains WITH clause", 0) \ \ M(UInt64, low_cardinality_max_dictionary_size, 8192, "Maximum size (in rows) of shared global dictionary for LowCardinality type.", 0) \ M(Bool, low_cardinality_use_single_dictionary_for_part, false, "LowCardinality type serialization setting. If is true, than will use additional keys when global dictionary overflows. Otherwise, will create several shared dictionaries.", 0) \ M(Bool, decimal_check_overflow, true, "Check overflow of decimal arithmetic/comparison operations", 0) \ \ - M(Bool, prefer_localhost_replica, 1, "1 - always send query to local replica, if it exists. 0 - choose replica to send query between local and remote ones according to load_balancing", 0) \ + M(Bool, prefer_localhost_replica, true, "If it's true then queries will be always sent to local replica (if it exists). If it's false then replica to send a query will be chosen between local and remote ones according to load_balancing", 0) \ M(UInt64, max_fetch_partition_retries_count, 5, "Amount of retries while fetching partition from another host.", 0) \ M(UInt64, http_max_multipart_form_data_size, 1024 * 1024 * 1024, "Limit on size of multipart/form-data content. This setting cannot be parsed from URL parameters and should be set in user profile. Note that content is parsed and external tables are created in memory before start of query execution. And this is the only limit that has effect on that stage (limits on max memory usage and max execution time have no effect while reading HTTP form data).", 0) \ - M(Bool, calculate_text_stack_trace, 1, "Calculate text stack trace in case of exceptions during query execution. This is the default. It requires symbol lookups that may slow down fuzzing tests when huge amount of wrong queries are executed. In normal cases you should not disable this option.", 0) \ + M(Bool, calculate_text_stack_trace, true, "Calculate text stack trace in case of exceptions during query execution. This is the default. It requires symbol lookups that may slow down fuzzing tests when huge amount of wrong queries are executed. In normal cases you should not disable this option.", 0) \ M(Bool, allow_ddl, true, "If it is set to true, then a user is allowed to executed DDL queries.", 0) \ M(Bool, parallel_view_processing, false, "Enables pushing to attached views concurrently instead of sequentially.", 0) \ M(Bool, enable_unaligned_array_join, false, "Allow ARRAY JOIN with multiple arrays that have different sizes. When this settings is enabled, arrays will be resized to the longest one.", 0) \ @@ -478,6 +482,8 @@ class IColumn; M(UInt64, distributed_ddl_entry_format_version, 1, "Version of DDL entry to write into ZooKeeper", 0) \ M(UInt64, external_storage_max_read_rows, 0, "Limit maximum number of rows when table with external engine should flush history data. Now supported only for MySQL table engine, database engine, dictionary and MaterializedMySQL. If equal to 0, this setting is disabled", 0) \ M(UInt64, external_storage_max_read_bytes, 0, "Limit maximum number of bytes when table with external engine should flush history data. Now supported only for MySQL table engine, database engine, dictionary and MaterializedMySQL. If equal to 0, this setting is disabled", 0) \ + M(UInt64, external_storage_connect_timeout, 100, "Connect timeout for external database (Now supported for MySQL)", 0) \ + M(UInt64, external_storage_rw_timeout, 1800, "Read / write timeout for external database (Now supported for MySQL)", 0) \ M(UnionMode, union_default_mode, UnionMode::Unspecified, "Set default Union Mode in SelectWithUnion query. Possible values: empty string, 'ALL', 'DISTINCT'. If empty, query without Union Mode will throw exception.", 0) \ M(Bool, optimize_aggregators_of_group_by_keys, true, "Eliminates min/max/any/anyLast aggregators of GROUP BY keys in SELECT section", 0) \ M(Bool, optimize_group_by_function_keys, true, "Eliminates functions of other keys in GROUP BY section", 0) \ @@ -492,6 +498,7 @@ class IColumn; M(UInt64, offset, 0, "Offset on read rows from the most 'end' result for select query", 0) \ \ M(UInt64, function_range_max_elements_in_block, 500000000, "Maximum number of values generated by function 'range' per block of data (sum of array sizes for every row in a block, see also 'max_block_size' and 'min_insert_block_size_rows'). It is a safety threshold.", 0) \ + M(ShortCircuitFunctionEvaluation, short_circuit_function_evaluation, ShortCircuitFunctionEvaluation::ENABLE, "Setting for short-circuit function evaluation configuration. Possible values: 'enable', 'disable', 'force_enable'", 0) \ \ /** Experimental functions */ \ M(Bool, allow_experimental_funnel_functions, false, "Enable experimental functions for funnel analysis.", 0) \ @@ -515,8 +522,8 @@ class IColumn; #define FORMAT_FACTORY_SETTINGS(M) \ M(Char, format_csv_delimiter, ',', "The character to be considered as a delimiter in CSV data. If setting with a string, a string has to have a length of 1.", 0) \ - M(Bool, format_csv_allow_single_quotes, 1, "If it is set to true, allow strings in single quotes.", 0) \ - M(Bool, format_csv_allow_double_quotes, 1, "If it is set to true, allow strings in double quotes.", 0) \ + M(Bool, format_csv_allow_single_quotes, true, "If it is set to true, allow strings in single quotes.", 0) \ + M(Bool, format_csv_allow_double_quotes, true, "If it is set to true, allow strings in double quotes.", 0) \ M(Bool, output_format_csv_crlf_end_of_line, false, "If it is set true, end of line in CSV format will be \\r\\n instead of \\n.", 0) \ M(Bool, input_format_csv_unquoted_null_literal_as_null, false, "Consider unquoted NULL literal as \\N", 0) \ M(Bool, input_format_csv_enum_as_number, false, "Treat inserted enum values in CSV formats as enum indices \\N", 0) \ @@ -560,6 +567,7 @@ class IColumn; M(UInt64, output_format_avro_sync_interval, 16 * 1024, "Sync interval in bytes.", 0) \ M(Bool, output_format_tsv_crlf_end_of_line, false, "If it is set true, end of line in TSV format will be \\r\\n instead of \\n.", 0) \ M(String, output_format_tsv_null_representation, "\\N", "Custom NULL representation in TSV format", 0) \ + M(Bool, output_format_decimal_trailing_zeros, false, "Output trailing zeros when printing Decimal values. E.g. 1.230000 instead of 1.23.", 0) \ \ M(UInt64, input_format_allow_errors_num, 0, "Maximum absolute amount of errors while reading text formats (like CSV, TSV). In case of error, if at least absolute or relative amount of errors is lower than corresponding value, will skip until next line and continue.", 0) \ M(Float, input_format_allow_errors_ratio, 0, "Maximum relative amount of errors while reading text formats (like CSV, TSV). In case of error, if at least absolute or relative amount of errors is lower than corresponding value, will skip until next line and continue.", 0) \ diff --git a/src/Core/SettingsEnums.cpp b/src/Core/SettingsEnums.cpp index 26c2bd9b6af..213d365ad96 100644 --- a/src/Core/SettingsEnums.cpp +++ b/src/Core/SettingsEnums.cpp @@ -111,4 +111,9 @@ IMPLEMENT_SETTING_ENUM(DistributedDDLOutputMode, ErrorCodes::BAD_ARGUMENTS, IMPLEMENT_SETTING_ENUM(HandleKafkaErrorMode, ErrorCodes::BAD_ARGUMENTS, {{"default", HandleKafkaErrorMode::DEFAULT}, {"stream", HandleKafkaErrorMode::STREAM}}) + +IMPLEMENT_SETTING_ENUM(ShortCircuitFunctionEvaluation, ErrorCodes::BAD_ARGUMENTS, + {{"enable", ShortCircuitFunctionEvaluation::ENABLE}, + {"force_enable", ShortCircuitFunctionEvaluation::FORCE_ENABLE}, + {"disable", ShortCircuitFunctionEvaluation::DISABLE}}) } diff --git a/src/Core/SettingsEnums.h b/src/Core/SettingsEnums.h index f0dd10aacfb..d1dc71f621f 100644 --- a/src/Core/SettingsEnums.h +++ b/src/Core/SettingsEnums.h @@ -157,4 +157,14 @@ enum class HandleKafkaErrorMode }; DECLARE_SETTING_ENUM(HandleKafkaErrorMode) + +enum class ShortCircuitFunctionEvaluation +{ + ENABLE, // Use short-circuit function evaluation for functions that are suitable for it. + FORCE_ENABLE, // Use short-circuit function evaluation for all functions. + DISABLE, // Disable short-circuit function evaluation. +}; + +DECLARE_SETTING_ENUM(ShortCircuitFunctionEvaluation) + } diff --git a/src/Core/examples/CMakeLists.txt b/src/Core/examples/CMakeLists.txt index cd6450633ff..6b07dfbbfa6 100644 --- a/src/Core/examples/CMakeLists.txt +++ b/src/Core/examples/CMakeLists.txt @@ -8,11 +8,6 @@ target_link_libraries (field PRIVATE dbms) add_executable (string_ref_hash string_ref_hash.cpp) target_link_libraries (string_ref_hash PRIVATE clickhouse_common_io) -if (ENABLE_FUZZING) - add_executable (names_and_types_fuzzer names_and_types_fuzzer.cpp) - target_link_libraries (names_and_types_fuzzer PRIVATE dbms ${LIB_FUZZING_ENGINE}) -endif () - add_executable (mysql_protocol mysql_protocol.cpp) target_link_libraries (mysql_protocol PRIVATE dbms) if(USE_SSL) diff --git a/src/Core/fuzzers/CMakeLists.txt b/src/Core/fuzzers/CMakeLists.txt new file mode 100644 index 00000000000..a5416035010 --- /dev/null +++ b/src/Core/fuzzers/CMakeLists.txt @@ -0,0 +1,2 @@ +add_executable (names_and_types_fuzzer names_and_types_fuzzer.cpp) +target_link_libraries (names_and_types_fuzzer PRIVATE dbms ${LIB_FUZZING_ENGINE}) diff --git a/src/Core/examples/names_and_types_fuzzer.cpp b/src/Core/fuzzers/names_and_types_fuzzer.cpp similarity index 100% rename from src/Core/examples/names_and_types_fuzzer.cpp rename to src/Core/fuzzers/names_and_types_fuzzer.cpp diff --git a/src/Core/tests/gtest_move_field.cpp b/src/Core/tests/gtest_field.cpp similarity index 50% rename from src/Core/tests/gtest_move_field.cpp rename to src/Core/tests/gtest_field.cpp index 9c807039c6a..5230f13bf8a 100644 --- a/src/Core/tests/gtest_move_field.cpp +++ b/src/Core/tests/gtest_field.cpp @@ -3,6 +3,40 @@ using namespace DB; +GTEST_TEST(Field, FromBool) +{ + { + Field f{false}; + ASSERT_EQ(f.getType(), Field::Types::UInt64); + ASSERT_EQ(f.get(), 0); + ASSERT_EQ(f.get(), false); + } + + { + Field f{true}; + ASSERT_EQ(f.getType(), Field::Types::UInt64); + ASSERT_EQ(f.get(), 1); + ASSERT_EQ(f.get(), true); + } + + { + Field f; + f = false; + ASSERT_EQ(f.getType(), Field::Types::UInt64); + ASSERT_EQ(f.get(), 0); + ASSERT_EQ(f.get(), false); + } + + { + Field f; + f = true; + ASSERT_EQ(f.getType(), Field::Types::UInt64); + ASSERT_EQ(f.get(), 1); + ASSERT_EQ(f.get(), true); + } +} + + GTEST_TEST(Field, Move) { Field f; diff --git a/src/DataStreams/MongoDBBlockInputStream.cpp b/src/DataStreams/MongoDBSource.cpp similarity index 99% rename from src/DataStreams/MongoDBBlockInputStream.cpp rename to src/DataStreams/MongoDBSource.cpp index a0a8e3e40a5..c00d214249a 100644 --- a/src/DataStreams/MongoDBBlockInputStream.cpp +++ b/src/DataStreams/MongoDBSource.cpp @@ -1,3 +1,5 @@ +#include "MongoDBSource.h" + #include #include @@ -15,7 +17,6 @@ #include #include #include -#include #include #include #include diff --git a/src/DataStreams/MongoDBBlockInputStream.h b/src/DataStreams/MongoDBSource.h similarity index 100% rename from src/DataStreams/MongoDBBlockInputStream.h rename to src/DataStreams/MongoDBSource.h diff --git a/src/DataStreams/PostgreSQLBlockInputStream.cpp b/src/DataStreams/PostgreSQLSource.cpp similarity index 99% rename from src/DataStreams/PostgreSQLBlockInputStream.cpp rename to src/DataStreams/PostgreSQLSource.cpp index 0b50c453629..c3bde8c84ad 100644 --- a/src/DataStreams/PostgreSQLBlockInputStream.cpp +++ b/src/DataStreams/PostgreSQLSource.cpp @@ -1,4 +1,4 @@ -#include "PostgreSQLBlockInputStream.h" +#include "PostgreSQLSource.h" #if USE_LIBPQXX #include diff --git a/src/DataStreams/PostgreSQLBlockInputStream.h b/src/DataStreams/PostgreSQLSource.h similarity index 100% rename from src/DataStreams/PostgreSQLBlockInputStream.h rename to src/DataStreams/PostgreSQLSource.h diff --git a/src/DataStreams/PushingToViewsBlockOutputStream.cpp b/src/DataStreams/PushingToViewsBlockOutputStream.cpp index aec1209a454..4a7ef67f012 100644 --- a/src/DataStreams/PushingToViewsBlockOutputStream.cpp +++ b/src/DataStreams/PushingToViewsBlockOutputStream.cpp @@ -70,7 +70,7 @@ PushingToViewsBlockOutputStream::PushingToViewsBlockOutputStream( // Do not deduplicate insertions into MV if the main insertion is Ok if (disable_deduplication_for_children) - insert_context->setSetting("insert_deduplicate", Field{false}); + insert_context->setSetting("insert_deduplicate", false); // Separate min_insert_block_size_rows/min_insert_block_size_bytes for children if (insert_settings.min_insert_block_size_rows_for_materialized_views) @@ -342,19 +342,7 @@ void PushingToViewsBlockOutputStream::writeSuffix() runViewStage(view, stage_step, [&] { process_suffix(view); }); if (view.exception) - { exception_count.fetch_add(1, std::memory_order_relaxed); - } - else - { - LOG_TRACE( - log, - "Pushing (parallel {}) from {} to {} took {} ms.", - max_threads, - storage->getStorageID().getNameForLogs(), - view.table_id.getNameForLogs(), - view.runtime_stats.elapsed_ms); - } }); } pool.wait(); @@ -371,20 +359,22 @@ void PushingToViewsBlockOutputStream::writeSuffix() } runViewStage(view, stage_step, [&] { process_suffix(view); }); if (view.exception) - { exception_happened = true; - } - else - { - LOG_TRACE( - log, - "Pushing (sequentially) from {} to {} took {} ms.", - storage->getStorageID().getNameForLogs(), - view.table_id.getNameForLogs(), - view.runtime_stats.elapsed_ms); - } } } + + for (auto & view : views) + { + if (!view.exception) + LOG_TRACE( + log, + "Pushing ({}) from {} to {} took {} ms.", + max_threads <= 1 ? "sequentially" : ("parallel " + std::to_string(max_threads)), + storage->getStorageID().getNameForLogs(), + view.table_id.getNameForLogs(), + view.runtime_stats.elapsed_ms); + } + if (exception_happened) checkExceptionsInViews(); diff --git a/src/DataStreams/RemoteQueryExecutor.cpp b/src/DataStreams/RemoteQueryExecutor.cpp index 21e874691c1..3b207110a67 100644 --- a/src/DataStreams/RemoteQueryExecutor.cpp +++ b/src/DataStreams/RemoteQueryExecutor.cpp @@ -526,7 +526,18 @@ void RemoteQueryExecutor::tryCancel(const char * reason, std::unique_ptr 0). + /// + /// Also note that it is possible to get this situation even when + /// enough data already had been read. + (*read_context)->setTimer(); (*read_context)->cancel(); + } connections->sendCancel(); diff --git a/src/DataStreams/RemoteQueryExecutorReadContext.cpp b/src/DataStreams/RemoteQueryExecutorReadContext.cpp index c1f415bb597..6bdf52d2831 100644 --- a/src/DataStreams/RemoteQueryExecutorReadContext.cpp +++ b/src/DataStreams/RemoteQueryExecutorReadContext.cpp @@ -100,7 +100,7 @@ void RemoteQueryExecutorReadContext::setConnectionFD(int fd, Poco::Timespan time connection_fd = fd; epoll.add(connection_fd); - receive_timeout = timeout; + receive_timeout_usec = timeout.totalMicroseconds(); connection_fd_description = fd_description; } @@ -157,8 +157,8 @@ void RemoteQueryExecutorReadContext::setTimer() const /// Did not get packet yet. Init timeout for the next async reading. timer.reset(); - if (receive_timeout.totalMicroseconds()) - timer.setRelative(receive_timeout); + if (receive_timeout_usec) + timer.setRelative(receive_timeout_usec); } bool RemoteQueryExecutorReadContext::resumeRoutine() diff --git a/src/DataStreams/RemoteQueryExecutorReadContext.h b/src/DataStreams/RemoteQueryExecutorReadContext.h index 5c56bb73dd6..91e34dbb82c 100644 --- a/src/DataStreams/RemoteQueryExecutorReadContext.h +++ b/src/DataStreams/RemoteQueryExecutorReadContext.h @@ -34,7 +34,8 @@ public: /// This mutex for fiber is needed because fiber could be destroyed in cancel method from another thread. std::mutex fiber_lock; - Poco::Timespan receive_timeout; + /// atomic is required due to data-race between setConnectionFD() and setTimer() from the cancellation path. + std::atomic receive_timeout_usec = 0; IConnections & connections; Poco::Net::Socket * last_used_socket = nullptr; @@ -75,6 +76,7 @@ class RemoteQueryExecutorReadContext { public: void cancel() {} + void setTimer() {} }; } diff --git a/src/DataStreams/SQLiteBlockInputStream.cpp b/src/DataStreams/SQLiteSource.cpp similarity index 74% rename from src/DataStreams/SQLiteBlockInputStream.cpp rename to src/DataStreams/SQLiteSource.cpp index da7645d968d..d0d8724c2dd 100644 --- a/src/DataStreams/SQLiteBlockInputStream.cpp +++ b/src/DataStreams/SQLiteSource.cpp @@ -1,4 +1,4 @@ -#include "SQLiteBlockInputStream.h" +#include "SQLiteSource.h" #if USE_SQLITE #include @@ -22,21 +22,18 @@ namespace ErrorCodes extern const int SQLITE_ENGINE_ERROR; } -SQLiteBlockInputStream::SQLiteBlockInputStream( - SQLitePtr sqlite_db_, - const String & query_str_, - const Block & sample_block, - const UInt64 max_block_size_) - : query_str(query_str_) +SQLiteSource::SQLiteSource( + SQLitePtr sqlite_db_, + const String & query_str_, + const Block & sample_block, + const UInt64 max_block_size_) + : SourceWithProgress(sample_block.cloneEmpty()) + , query_str(query_str_) , max_block_size(max_block_size_) , sqlite_db(std::move(sqlite_db_)) { description.init(sample_block); -} - -void SQLiteBlockInputStream::readPrefix() -{ sqlite3_stmt * compiled_stmt = nullptr; int status = sqlite3_prepare_v2(sqlite_db.get(), query_str.c_str(), query_str.size() + 1, &compiled_stmt, nullptr); @@ -48,11 +45,10 @@ void SQLiteBlockInputStream::readPrefix() compiled_statement = std::unique_ptr(compiled_stmt, StatementDeleter()); } - -Block SQLiteBlockInputStream::readImpl() +Chunk SQLiteSource::generate() { if (!compiled_statement) - return Block(); + return {}; MutableColumns columns = description.sample_block.cloneEmptyColumns(); size_t num_rows = 0; @@ -73,30 +69,30 @@ Block SQLiteBlockInputStream::readImpl() else if (status != SQLITE_ROW) { throw Exception(ErrorCodes::SQLITE_ENGINE_ERROR, - "Expected SQLITE_ROW status, but got status {}. Error: {}, Message: {}", - status, sqlite3_errstr(status), sqlite3_errmsg(sqlite_db.get())); + "Expected SQLITE_ROW status, but got status {}. Error: {}, Message: {}", + status, sqlite3_errstr(status), sqlite3_errmsg(sqlite_db.get())); } int column_count = sqlite3_column_count(compiled_statement.get()); - for (const auto idx : collections::range(0, column_count)) - { - const auto & sample = description.sample_block.getByPosition(idx); - if (sqlite3_column_type(compiled_statement.get(), idx) == SQLITE_NULL) + for (int column_index = 0; column_index < column_count; ++column_index) + { + if (sqlite3_column_type(compiled_statement.get(), column_index) == SQLITE_NULL) { - insertDefaultSQLiteValue(*columns[idx], *sample.column); + columns[column_index]->insertDefault(); continue; } - if (description.types[idx].second) + auto & [type, is_nullable] = description.types[column_index]; + if (is_nullable) { - ColumnNullable & column_nullable = assert_cast(*columns[idx]); - insertValue(column_nullable.getNestedColumn(), description.types[idx].first, idx); + ColumnNullable & column_nullable = assert_cast(*columns[column_index]); + insertValue(column_nullable.getNestedColumn(), type, column_index); column_nullable.getNullMapData().emplace_back(0); } else { - insertValue(*columns[idx], description.types[idx].first, idx); + insertValue(*columns[column_index], type, column_index); } } @@ -104,18 +100,16 @@ Block SQLiteBlockInputStream::readImpl() break; } - return description.sample_block.cloneWithColumns(std::move(columns)); -} - - -void SQLiteBlockInputStream::readSuffix() -{ - if (compiled_statement) + if (num_rows == 0) + { compiled_statement.reset(); + return {}; + } + + return Chunk(std::move(columns), num_rows); } - -void SQLiteBlockInputStream::insertValue(IColumn & column, const ExternalResultDescription::ValueType type, size_t idx) +void SQLiteSource::insertValue(IColumn & column, ExternalResultDescription::ValueType type, size_t idx) { switch (type) { diff --git a/src/DataStreams/SQLiteBlockInputStream.h b/src/DataStreams/SQLiteSource.h similarity index 59% rename from src/DataStreams/SQLiteBlockInputStream.h rename to src/DataStreams/SQLiteSource.h index 35fc4801b4b..0f8b42c536b 100644 --- a/src/DataStreams/SQLiteBlockInputStream.h +++ b/src/DataStreams/SQLiteSource.h @@ -6,32 +6,28 @@ #if USE_SQLITE #include -#include +#include #include // Y_IGNORE namespace DB { -class SQLiteBlockInputStream : public IBlockInputStream + +class SQLiteSource : public SourceWithProgress { + using SQLitePtr = std::shared_ptr; public: - SQLiteBlockInputStream(SQLitePtr sqlite_db_, + SQLiteSource(SQLitePtr sqlite_db_, const String & query_str_, const Block & sample_block, UInt64 max_block_size_); String getName() const override { return "SQLite"; } - Block getHeader() const override { return description.sample_block.cloneEmpty(); } - private: - void insertDefaultSQLiteValue(IColumn & column, const IColumn & sample_column) - { - column.insertFrom(sample_column, 0); - } using ValueType = ExternalResultDescription::ValueType; @@ -40,19 +36,14 @@ private: void operator()(sqlite3_stmt * stmt) { sqlite3_finalize(stmt); } }; - void readPrefix() override; + Chunk generate() override; - Block readImpl() override; - - void readSuffix() override; - - void insertValue(IColumn & column, const ExternalResultDescription::ValueType type, size_t idx); + void insertValue(IColumn & column, ExternalResultDescription::ValueType type, size_t idx); String query_str; UInt64 max_block_size; ExternalResultDescription description; - SQLitePtr sqlite_db; std::unique_ptr compiled_statement; }; diff --git a/src/DataStreams/TTLBlockInputStream.cpp b/src/DataStreams/TTLBlockInputStream.cpp index 8b31da6d2f1..05d4ba0a395 100644 --- a/src/DataStreams/TTLBlockInputStream.cpp +++ b/src/DataStreams/TTLBlockInputStream.cpp @@ -76,17 +76,17 @@ TTLBlockInputStream::TTLBlockInputStream( algorithms.emplace_back(std::make_unique( description, old_ttl_infos.columns_ttl[name], current_time_, - force_, name, default_expression, default_column_name)); + force_, name, default_expression, default_column_name, isCompactPart(data_part))); } } for (const auto & move_ttl : metadata_snapshot_->getMoveTTLs()) - algorithms.emplace_back(std::make_unique( - move_ttl, old_ttl_infos.moves_ttl[move_ttl.result_column], current_time_, force_)); + algorithms.emplace_back(std::make_unique( + move_ttl, TTLUpdateField::MOVES_TTL, move_ttl.result_column, old_ttl_infos.moves_ttl[move_ttl.result_column], current_time_, force_)); for (const auto & recompression_ttl : metadata_snapshot_->getRecompressionTTLs()) - algorithms.emplace_back(std::make_unique( - recompression_ttl, old_ttl_infos.recompression_ttl[recompression_ttl.result_column], current_time_, force_)); + algorithms.emplace_back(std::make_unique( + recompression_ttl, TTLUpdateField::RECOMPRESSION_TTL, recompression_ttl.result_column, old_ttl_infos.recompression_ttl[recompression_ttl.result_column], current_time_, force_)); } Block reorderColumns(Block block, const Block & header) diff --git a/src/DataStreams/TTLCalcInputStream.cpp b/src/DataStreams/TTLCalcInputStream.cpp new file mode 100644 index 00000000000..2353e9ec259 --- /dev/null +++ b/src/DataStreams/TTLCalcInputStream.cpp @@ -0,0 +1,77 @@ +#include +#include + +namespace DB +{ + +TTLCalcInputStream::TTLCalcInputStream( + const BlockInputStreamPtr & input_, + const MergeTreeData & storage_, + const StorageMetadataPtr & metadata_snapshot_, + const MergeTreeData::MutableDataPartPtr & data_part_, + time_t current_time_, + bool force_) + : data_part(data_part_) + , log(&Poco::Logger::get(storage_.getLogName() + " (TTLCalcInputStream)")) +{ + children.push_back(input_); + header = children.at(0)->getHeader(); + auto old_ttl_infos = data_part->ttl_infos; + + if (metadata_snapshot_->hasRowsTTL()) + { + const auto & rows_ttl = metadata_snapshot_->getRowsTTL(); + algorithms.emplace_back(std::make_unique( + rows_ttl, TTLUpdateField::TABLE_TTL, rows_ttl.result_column, old_ttl_infos.table_ttl, current_time_, force_)); + } + + for (const auto & where_ttl : metadata_snapshot_->getRowsWhereTTLs()) + algorithms.emplace_back(std::make_unique( + where_ttl, TTLUpdateField::ROWS_WHERE_TTL, where_ttl.result_column, old_ttl_infos.rows_where_ttl[where_ttl.result_column], current_time_, force_)); + + for (const auto & group_by_ttl : metadata_snapshot_->getGroupByTTLs()) + algorithms.emplace_back(std::make_unique( + group_by_ttl, TTLUpdateField::GROUP_BY_TTL, group_by_ttl.result_column, old_ttl_infos.group_by_ttl[group_by_ttl.result_column], current_time_, force_)); + + if (metadata_snapshot_->hasAnyColumnTTL()) + { + for (const auto & [name, description] : metadata_snapshot_->getColumnTTLs()) + { + algorithms.emplace_back(std::make_unique( + description, TTLUpdateField::COLUMNS_TTL, name, old_ttl_infos.columns_ttl[name], current_time_, force_)); + } + } + + for (const auto & move_ttl : metadata_snapshot_->getMoveTTLs()) + algorithms.emplace_back(std::make_unique( + move_ttl, TTLUpdateField::MOVES_TTL, move_ttl.result_column, old_ttl_infos.moves_ttl[move_ttl.result_column], current_time_, force_)); + + for (const auto & recompression_ttl : metadata_snapshot_->getRecompressionTTLs()) + algorithms.emplace_back(std::make_unique( + recompression_ttl, TTLUpdateField::RECOMPRESSION_TTL, recompression_ttl.result_column, old_ttl_infos.recompression_ttl[recompression_ttl.result_column], current_time_, force_)); +} + +Block TTLCalcInputStream::readImpl() +{ + auto block = children.at(0)->read(); + for (const auto & algorithm : algorithms) + algorithm->execute(block); + + if (!block) + return block; + + Block res; + for (const auto & col : header) + res.insert(block.getByName(col.name)); + + return res; +} + +void TTLCalcInputStream::readSuffixImpl() +{ + data_part->ttl_infos = {}; + for (const auto & algorithm : algorithms) + algorithm->finalize(data_part); +} + +} diff --git a/src/DataStreams/TTLCalcInputStream.h b/src/DataStreams/TTLCalcInputStream.h new file mode 100644 index 00000000000..d1b629c2ad5 --- /dev/null +++ b/src/DataStreams/TTLCalcInputStream.h @@ -0,0 +1,44 @@ +#pragma once +#include +#include +#include +#include +#include +#include + +#include + +namespace DB +{ + +class TTLCalcInputStream : public IBlockInputStream +{ +public: + TTLCalcInputStream( + const BlockInputStreamPtr & input_, + const MergeTreeData & storage_, + const StorageMetadataPtr & metadata_snapshot_, + const MergeTreeData::MutableDataPartPtr & data_part_, + time_t current_time, + bool force_ + ); + + String getName() const override { return "TTL_CALC"; } + Block getHeader() const override { return header; } + +protected: + Block readImpl() override; + + /// Finalizes ttl infos and updates data part + void readSuffixImpl() override; + +private: + std::vector algorithms; + + /// ttl_infos and empty_columns are updating while reading + const MergeTreeData::MutableDataPartPtr & data_part; + Poco::Logger * log; + Block header; +}; + +} diff --git a/src/DataStreams/TTLColumnAlgorithm.cpp b/src/DataStreams/TTLColumnAlgorithm.cpp index 1318ea382db..71ad2a4e38f 100644 --- a/src/DataStreams/TTLColumnAlgorithm.cpp +++ b/src/DataStreams/TTLColumnAlgorithm.cpp @@ -10,11 +10,13 @@ TTLColumnAlgorithm::TTLColumnAlgorithm( bool force_, const String & column_name_, const ExpressionActionsPtr & default_expression_, - const String & default_column_name_) + const String & default_column_name_, + bool is_compact_part_) : ITTLAlgorithm(description_, old_ttl_info_, current_time_, force_) , column_name(column_name_) , default_expression(default_expression_) , default_column_name(default_column_name_) + , is_compact_part(is_compact_part_) { if (!isMinTTLExpired()) { @@ -40,7 +42,7 @@ void TTLColumnAlgorithm::execute(Block & block) return; /// Later drop full column - if (isMaxTTLExpired()) + if (isMaxTTLExpired() && !is_compact_part) return; auto default_column = executeExpressionAndGetColumn(default_expression, block, default_column_name); diff --git a/src/DataStreams/TTLColumnAlgorithm.h b/src/DataStreams/TTLColumnAlgorithm.h index e09dd663af0..ddf963eaee2 100644 --- a/src/DataStreams/TTLColumnAlgorithm.h +++ b/src/DataStreams/TTLColumnAlgorithm.h @@ -17,7 +17,9 @@ public: bool force_, const String & column_name_, const ExpressionActionsPtr & default_expression_, - const String & default_column_name_); + const String & default_column_name_, + bool is_compact_part_ + ); void execute(Block & block) override; void finalize(const MutableDataPartPtr & data_part) const override; @@ -28,6 +30,7 @@ private: const String default_column_name; bool is_fully_empty = true; + bool is_compact_part; }; } diff --git a/src/DataStreams/TTLUpdateInfoAlgorithm.cpp b/src/DataStreams/TTLUpdateInfoAlgorithm.cpp index d5feb14658b..6a983d052c1 100644 --- a/src/DataStreams/TTLUpdateInfoAlgorithm.cpp +++ b/src/DataStreams/TTLUpdateInfoAlgorithm.cpp @@ -4,8 +4,15 @@ namespace DB { TTLUpdateInfoAlgorithm::TTLUpdateInfoAlgorithm( - const TTLDescription & description_, const TTLInfo & old_ttl_info_, time_t current_time_, bool force_) + const TTLDescription & description_, + const TTLUpdateField ttl_update_field_, + const String ttl_update_key_, + const TTLInfo & old_ttl_info_, + time_t current_time_, + bool force_) : ITTLAlgorithm(description_, old_ttl_info_, current_time_, force_) + , ttl_update_field(ttl_update_field_) + , ttl_update_key(ttl_update_key_) { } @@ -22,26 +29,37 @@ void TTLUpdateInfoAlgorithm::execute(Block & block) } } -TTLMoveAlgorithm::TTLMoveAlgorithm( - const TTLDescription & description_, const TTLInfo & old_ttl_info_, time_t current_time_, bool force_) - : TTLUpdateInfoAlgorithm(description_, old_ttl_info_, current_time_, force_) +void TTLUpdateInfoAlgorithm::finalize(const MutableDataPartPtr & data_part) const { -} + if (ttl_update_field == TTLUpdateField::RECOMPRESSION_TTL) + { + data_part->ttl_infos.recompression_ttl[ttl_update_key] = new_ttl_info; + } + else if (ttl_update_field == TTLUpdateField::MOVES_TTL) + { + data_part->ttl_infos.moves_ttl[ttl_update_key] = new_ttl_info; + } + else if (ttl_update_field == TTLUpdateField::GROUP_BY_TTL) + { + data_part->ttl_infos.group_by_ttl[ttl_update_key] = new_ttl_info; + data_part->ttl_infos.updatePartMinMaxTTL(new_ttl_info.min, new_ttl_info.max); + } + else if (ttl_update_field == TTLUpdateField::ROWS_WHERE_TTL) + { + data_part->ttl_infos.rows_where_ttl[ttl_update_key] = new_ttl_info; + data_part->ttl_infos.updatePartMinMaxTTL(new_ttl_info.min, new_ttl_info.max); + } + else if (ttl_update_field == TTLUpdateField::TABLE_TTL) + { + data_part->ttl_infos.table_ttl = new_ttl_info; + data_part->ttl_infos.updatePartMinMaxTTL(new_ttl_info.min, new_ttl_info.max); + } + else if (ttl_update_field == TTLUpdateField::COLUMNS_TTL) + { + data_part->ttl_infos.columns_ttl[ttl_update_key] = new_ttl_info; + data_part->ttl_infos.updatePartMinMaxTTL(new_ttl_info.min, new_ttl_info.max); + } -void TTLMoveAlgorithm::finalize(const MutableDataPartPtr & data_part) const -{ - data_part->ttl_infos.moves_ttl[description.result_column] = new_ttl_info; -} - -TTLRecompressionAlgorithm::TTLRecompressionAlgorithm( - const TTLDescription & description_, const TTLInfo & old_ttl_info_, time_t current_time_, bool force_) - : TTLUpdateInfoAlgorithm(description_, old_ttl_info_, current_time_, force_) -{ -} - -void TTLRecompressionAlgorithm::finalize(const MutableDataPartPtr & data_part) const -{ - data_part->ttl_infos.recompression_ttl[description.result_column] = new_ttl_info; } } diff --git a/src/DataStreams/TTLUpdateInfoAlgorithm.h b/src/DataStreams/TTLUpdateInfoAlgorithm.h index c1ef0e1c90d..551211fc47f 100644 --- a/src/DataStreams/TTLUpdateInfoAlgorithm.h +++ b/src/DataStreams/TTLUpdateInfoAlgorithm.h @@ -5,28 +5,35 @@ namespace DB { +enum class TTLUpdateField +{ + COLUMNS_TTL, + TABLE_TTL, + ROWS_WHERE_TTL, + MOVES_TTL, + RECOMPRESSION_TTL, + GROUP_BY_TTL, +}; + /// Calculates new ttl_info and does nothing with data. class TTLUpdateInfoAlgorithm : public ITTLAlgorithm { public: - TTLUpdateInfoAlgorithm(const TTLDescription & description_, const TTLInfo & old_ttl_info_, time_t current_time_, bool force_); + TTLUpdateInfoAlgorithm( + const TTLDescription & description_, + const TTLUpdateField ttl_update_field_, + const String ttl_update_key_, + const TTLInfo & old_ttl_info_, + time_t current_time_, bool force_ + ); void execute(Block & block) override; - void finalize(const MutableDataPartPtr & data_part) const override = 0; + void finalize(const MutableDataPartPtr & data_part) const override; + +private: + const TTLUpdateField ttl_update_field; + const String ttl_update_key; }; -class TTLMoveAlgorithm final : public TTLUpdateInfoAlgorithm -{ -public: - TTLMoveAlgorithm(const TTLDescription & description_, const TTLInfo & old_ttl_info_, time_t current_time_, bool force_); - void finalize(const MutableDataPartPtr & data_part) const override; -}; - -class TTLRecompressionAlgorithm final : public TTLUpdateInfoAlgorithm -{ -public: - TTLRecompressionAlgorithm(const TTLDescription & description_, const TTLInfo & old_ttl_info_, time_t current_time_, bool force_); - void finalize(const MutableDataPartPtr & data_part) const override; -}; } diff --git a/src/DataStreams/ya.make b/src/DataStreams/ya.make index b1205828a7e..c16db808a5b 100644 --- a/src/DataStreams/ya.make +++ b/src/DataStreams/ya.make @@ -29,7 +29,7 @@ SRCS( ITTLAlgorithm.cpp InternalTextLogsRowOutputStream.cpp MaterializingBlockInputStream.cpp - MongoDBBlockInputStream.cpp + MongoDBSource.cpp NativeBlockInputStream.cpp NativeBlockOutputStream.cpp PushingToViewsBlockOutputStream.cpp @@ -37,7 +37,7 @@ SRCS( RemoteBlockOutputStream.cpp RemoteQueryExecutor.cpp RemoteQueryExecutorReadContext.cpp - SQLiteBlockInputStream.cpp + SQLiteSource.cpp SizeLimits.cpp SquashingBlockInputStream.cpp SquashingBlockOutputStream.cpp diff --git a/src/DataTypes/DataTypeEnum.h b/src/DataTypes/DataTypeEnum.h index 57657d1d110..92c72b87afa 100644 --- a/src/DataTypes/DataTypeEnum.h +++ b/src/DataTypes/DataTypeEnum.h @@ -27,6 +27,8 @@ public: bool isCategorial() const override { return true; } bool canBeInsideNullable() const override { return true; } bool isComparable() const override { return true; } + + virtual bool contains(const IDataType & rhs) const = 0; }; @@ -76,7 +78,7 @@ public: /// Example: /// Enum('a' = 1, 'b' = 2) -> Enum('c' = 1, 'b' = 2, 'd' = 3) OK /// Enum('a' = 1, 'b' = 2) -> Enum('a' = 2, 'b' = 1) NOT OK - bool contains(const IDataType & rhs) const; + bool contains(const IDataType & rhs) const override; SerializationPtr doGetDefaultSerialization() const override; }; diff --git a/src/DataTypes/DataTypeMap.cpp b/src/DataTypes/DataTypeMap.cpp index 8fd375aa86e..b0bf459b4ca 100644 --- a/src/DataTypes/DataTypeMap.cpp +++ b/src/DataTypes/DataTypeMap.cpp @@ -79,7 +79,7 @@ void DataTypeMap::assertKeyType() const std::string DataTypeMap::doGetName() const { WriteBufferFromOwnString s; - s << "Map(" << key_type->getName() << "," << value_type->getName() << ")"; + s << "Map(" << key_type->getName() << ", " << value_type->getName() << ")"; return s.str(); } diff --git a/src/DataTypes/IDataType.cpp b/src/DataTypes/IDataType.cpp index c0679557ec9..4b727a49861 100644 --- a/src/DataTypes/IDataType.cpp +++ b/src/DataTypes/IDataType.cpp @@ -26,23 +26,6 @@ namespace ErrorCodes IDataType::~IDataType() = default; -String IDataType::getName() const -{ - if (custom_name) - { - return custom_name->getName(); - } - else - { - return doGetName(); - } -} - -String IDataType::doGetName() const -{ - return getFamilyName(); -} - void IDataType::updateAvgValueSizeHint(const IColumn & column, double & avg_value_size_hint) { /// Update the average value size hint if amount of read rows isn't too small diff --git a/src/DataTypes/IDataType.h b/src/DataTypes/IDataType.h index c4f04282487..9d943769c0a 100644 --- a/src/DataTypes/IDataType.h +++ b/src/DataTypes/IDataType.h @@ -29,6 +29,13 @@ using DataTypes = std::vector; struct NameAndTypePair; class SerializationInfo; +struct DataTypeWithConstInfo +{ + DataTypePtr type; + bool is_const; +}; + +using DataTypesWithConstInfo = std::vector; /** Properties of data type. * @@ -55,7 +62,13 @@ public: /// static constexpr bool is_parametric = false; /// Name of data type (examples: UInt64, Array(String)). - String getName() const; + String getName() const + { + if (custom_name) + return custom_name->getName(); + else + return doGetName(); + } /// Name of data type family (example: FixedString, Array). virtual const char * getFamilyName() const = 0; @@ -98,7 +111,7 @@ public: void enumerateStreams(const SerializationPtr & serialization, const StreamCallbackWithType & callback) const { enumerateStreams(serialization, callback, {}); } protected: - virtual String doGetName() const; + virtual String doGetName() const { return getFamilyName(); } virtual SerializationPtr doGetDefaultSerialization() const = 0; DataTypePtr getTypeForSubstream(const ISerialization::SubstreamPath & substream_path) const; diff --git a/src/DataTypes/Serializations/ISerialization.cpp b/src/DataTypes/Serializations/ISerialization.cpp index ab2e8e1958b..7077c5bfa14 100644 --- a/src/DataTypes/Serializations/ISerialization.cpp +++ b/src/DataTypes/Serializations/ISerialization.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include diff --git a/src/DataTypes/Serializations/SerializationDecimal.cpp b/src/DataTypes/Serializations/SerializationDecimal.cpp index e0073c80aca..88c6d970980 100644 --- a/src/DataTypes/Serializations/SerializationDecimal.cpp +++ b/src/DataTypes/Serializations/SerializationDecimal.cpp @@ -44,10 +44,10 @@ void SerializationDecimal::readText(T & x, ReadBuffer & istr, UInt32 precisio } template -void SerializationDecimal::serializeText(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings &) const +void SerializationDecimal::serializeText(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const { T value = assert_cast(column).getData()[row_num]; - writeText(value, this->scale, ostr); + writeText(value, this->scale, ostr, settings.decimal_trailing_zeros); } template diff --git a/src/Databases/DatabaseAtomic.cpp b/src/Databases/DatabaseAtomic.cpp index b69b74451c7..b55277594be 100644 --- a/src/Databases/DatabaseAtomic.cpp +++ b/src/Databases/DatabaseAtomic.cpp @@ -403,7 +403,7 @@ void DatabaseAtomic::assertCanBeDetached(bool cleanup) } DatabaseTablesIteratorPtr -DatabaseAtomic::getTablesIterator(ContextPtr local_context, const IDatabase::FilterByNameFunction & filter_by_table_name) +DatabaseAtomic::getTablesIterator(ContextPtr local_context, const IDatabase::FilterByNameFunction & filter_by_table_name) const { auto base_iter = DatabaseWithOwnTablesBase::getTablesIterator(local_context, filter_by_table_name); return std::make_unique(std::move(typeid_cast(*base_iter))); diff --git a/src/Databases/DatabaseAtomic.h b/src/Databases/DatabaseAtomic.h index c5dedf00d23..21e841841bd 100644 --- a/src/Databases/DatabaseAtomic.h +++ b/src/Databases/DatabaseAtomic.h @@ -45,7 +45,7 @@ public: void drop(ContextPtr /*context*/) override; - DatabaseTablesIteratorPtr getTablesIterator(ContextPtr context, const FilterByNameFunction & filter_by_table_name) override; + DatabaseTablesIteratorPtr getTablesIterator(ContextPtr context, const FilterByNameFunction & filter_by_table_name) const override; void loadStoredObjects(ContextMutablePtr context, bool has_force_restore_data_flag, bool force_attach) override; diff --git a/src/Databases/DatabaseDictionary.cpp b/src/Databases/DatabaseDictionary.cpp index 40034015f27..ae5893647c2 100644 --- a/src/Databases/DatabaseDictionary.cpp +++ b/src/Databases/DatabaseDictionary.cpp @@ -52,7 +52,7 @@ DatabaseDictionary::DatabaseDictionary(const String & name_, ContextPtr context_ { } -Tables DatabaseDictionary::listTables(const FilterByNameFunction & filter_by_name) +Tables DatabaseDictionary::listTables(const FilterByNameFunction & filter_by_name) const { Tables tables; auto load_results = getContext()->getExternalDictionariesLoader().getLoadResults(filter_by_name); @@ -77,7 +77,7 @@ StoragePtr DatabaseDictionary::tryGetTable(const String & table_name, ContextPtr return createStorageDictionary(getDatabaseName(), load_result, getContext()); } -DatabaseTablesIteratorPtr DatabaseDictionary::getTablesIterator(ContextPtr, const FilterByNameFunction & filter_by_table_name) +DatabaseTablesIteratorPtr DatabaseDictionary::getTablesIterator(ContextPtr, const FilterByNameFunction & filter_by_table_name) const { return std::make_unique(listTables(filter_by_table_name), getDatabaseName()); } diff --git a/src/Databases/DatabaseDictionary.h b/src/Databases/DatabaseDictionary.h index 06402a96381..425d048aa65 100644 --- a/src/Databases/DatabaseDictionary.h +++ b/src/Databases/DatabaseDictionary.h @@ -34,7 +34,7 @@ public: StoragePtr tryGetTable(const String & table_name, ContextPtr context) const override; - DatabaseTablesIteratorPtr getTablesIterator(ContextPtr context, const FilterByNameFunction & filter_by_table_name) override; + DatabaseTablesIteratorPtr getTablesIterator(ContextPtr context, const FilterByNameFunction & filter_by_table_name) const override; bool empty() const override; @@ -50,7 +50,7 @@ protected: private: Poco::Logger * log; - Tables listTables(const FilterByNameFunction & filter_by_name); + Tables listTables(const FilterByNameFunction & filter_by_name) const; }; } diff --git a/src/Databases/DatabaseFactory.cpp b/src/Databases/DatabaseFactory.cpp index 75a3b9c9e1e..01bc8cb34c7 100644 --- a/src/Databases/DatabaseFactory.cpp +++ b/src/Databases/DatabaseFactory.cpp @@ -155,7 +155,13 @@ DatabasePtr DatabaseFactory::getImpl(const ASTCreateQuery & create, const String /// Split into replicas if needed. size_t max_addresses = context->getSettingsRef().glob_expansion_max_elements; auto addresses = parseRemoteDescriptionForExternalDatabase(host_port, max_addresses, 3306); - auto mysql_pool = mysqlxx::PoolWithFailover(mysql_database_name, addresses, mysql_user_name, mysql_user_password); + mysqlxx::PoolWithFailover mysql_pool(mysql_database_name, addresses, + mysql_user_name, mysql_user_password, + MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_START_CONNECTIONS, + MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_CONNECTIONS, + MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_TRIES, + context->getSettingsRef().external_storage_connect_timeout, + context->getSettingsRef().external_storage_rw_timeout); mysql_database_settings->loadFromQueryContext(context); mysql_database_settings->loadFromQuery(*engine_define); /// higher priority @@ -168,7 +174,6 @@ DatabasePtr DatabaseFactory::getImpl(const ASTCreateQuery & create, const String MySQLClient client(remote_host_name, remote_port, mysql_user_name, mysql_user_password); auto mysql_pool = mysqlxx::Pool(mysql_database_name, remote_host_name, mysql_user_name, mysql_user_password, remote_port); - auto materialize_mode_settings = std::make_unique(); if (engine_define->settings) diff --git a/src/Databases/DatabaseLazy.cpp b/src/Databases/DatabaseLazy.cpp index abcb8dbb974..5babb6c2975 100644 --- a/src/Databases/DatabaseLazy.cpp +++ b/src/Databases/DatabaseLazy.cpp @@ -143,7 +143,7 @@ StoragePtr DatabaseLazy::tryGetTable(const String & table_name) const return loadTable(table_name); } -DatabaseTablesIteratorPtr DatabaseLazy::getTablesIterator(ContextPtr, const FilterByNameFunction & filter_by_table_name) +DatabaseTablesIteratorPtr DatabaseLazy::getTablesIterator(ContextPtr, const FilterByNameFunction & filter_by_table_name) const { std::lock_guard lock(mutex); Strings filtered_tables; @@ -304,7 +304,7 @@ void DatabaseLazy::clearExpiredTables() const } -DatabaseLazyIterator::DatabaseLazyIterator(DatabaseLazy & database_, Strings && table_names_) +DatabaseLazyIterator::DatabaseLazyIterator(const DatabaseLazy & database_, Strings && table_names_) : IDatabaseTablesIterator(database_.database_name) , database(database_) , table_names(std::move(table_names_)) diff --git a/src/Databases/DatabaseLazy.h b/src/Databases/DatabaseLazy.h index 949869f4509..ab8fbfc5a25 100644 --- a/src/Databases/DatabaseLazy.h +++ b/src/Databases/DatabaseLazy.h @@ -64,7 +64,7 @@ public: bool empty() const override; - DatabaseTablesIteratorPtr getTablesIterator(ContextPtr context, const FilterByNameFunction & filter_by_table_name) override; + DatabaseTablesIteratorPtr getTablesIterator(ContextPtr context, const FilterByNameFunction & filter_by_table_name) const override; void attachTable(const String & table_name, const StoragePtr & table, const String & relative_table_path) override; @@ -119,7 +119,7 @@ class DatabaseLazyIterator final : public IDatabaseTablesIterator { public: DatabaseLazyIterator( - DatabaseLazy & database_, + const DatabaseLazy & database_, Strings && table_names_); void next() override; diff --git a/src/Databases/DatabaseOnDisk.h b/src/Databases/DatabaseOnDisk.h index 73b69dd43a5..e7dda7cb36b 100644 --- a/src/Databases/DatabaseOnDisk.h +++ b/src/Databases/DatabaseOnDisk.h @@ -11,7 +11,6 @@ namespace DB { class Context; - std::pair createTableFromAST( ASTCreateQuery ast_create_query, const String & database_name, diff --git a/src/Databases/DatabasesCommon.cpp b/src/Databases/DatabasesCommon.cpp index 9d79a0dfe96..8c0da37a111 100644 --- a/src/Databases/DatabasesCommon.cpp +++ b/src/Databases/DatabasesCommon.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -40,7 +41,7 @@ StoragePtr DatabaseWithOwnTablesBase::tryGetTable(const String & table_name, Con return {}; } -DatabaseTablesIteratorPtr DatabaseWithOwnTablesBase::getTablesIterator(ContextPtr, const FilterByNameFunction & filter_by_table_name) +DatabaseTablesIteratorPtr DatabaseWithOwnTablesBase::getTablesIterator(ContextPtr, const FilterByNameFunction & filter_by_table_name) const { std::lock_guard lock(mutex); if (!filter_by_table_name) diff --git a/src/Databases/DatabasesCommon.h b/src/Databases/DatabasesCommon.h index da1bd6c1852..4e5ee710298 100644 --- a/src/Databases/DatabasesCommon.h +++ b/src/Databases/DatabasesCommon.h @@ -29,7 +29,7 @@ public: StoragePtr detachTable(const String & table_name) override; - DatabaseTablesIteratorPtr getTablesIterator(ContextPtr context, const FilterByNameFunction & filter_by_table_name) override; + DatabaseTablesIteratorPtr getTablesIterator(ContextPtr context, const FilterByNameFunction & filter_by_table_name) const override; void shutdown() override; diff --git a/src/Databases/IDatabase.h b/src/Databases/IDatabase.h index 0c8382465f7..387c6882eab 100644 --- a/src/Databases/IDatabase.h +++ b/src/Databases/IDatabase.h @@ -137,7 +137,7 @@ public: /// Get an iterator that allows you to pass through all the tables. /// It is possible to have "hidden" tables that are not visible when passing through, but are visible if you get them by name using the functions above. - virtual DatabaseTablesIteratorPtr getTablesIterator(ContextPtr context, const FilterByNameFunction & filter_by_table_name = {}) = 0; + virtual DatabaseTablesIteratorPtr getTablesIterator(ContextPtr context, const FilterByNameFunction & filter_by_table_name = {}) const = 0; /// Is the database empty. virtual bool empty() const = 0; @@ -240,6 +240,12 @@ public: throw Exception(getEngineName() + ": RENAME DATABASE is not supported", ErrorCodes::NOT_IMPLEMENTED); } + /// Whether the contained tables should be written to a backup. + virtual DatabaseTablesIteratorPtr getTablesIteratorForBackup(ContextPtr context) const + { + return getTablesIterator(context); /// By default we backup each table. + } + /// Returns path for persistent data storage if the database supports it, empty string otherwise virtual String getDataPath() const { return {}; } diff --git a/src/Databases/MySQL/DatabaseMaterializedMySQL.cpp b/src/Databases/MySQL/DatabaseMaterializedMySQL.cpp index 4046c6929c2..ba9b30425dd 100644 --- a/src/Databases/MySQL/DatabaseMaterializedMySQL.cpp +++ b/src/Databases/MySQL/DatabaseMaterializedMySQL.cpp @@ -186,7 +186,7 @@ StoragePtr DatabaseMaterializedMySQL::tryGetTable(const String & name, Con template DatabaseTablesIteratorPtr -DatabaseMaterializedMySQL::getTablesIterator(ContextPtr context_, const DatabaseOnDisk::FilterByNameFunction & filter_by_table_name) +DatabaseMaterializedMySQL::getTablesIterator(ContextPtr context_, const DatabaseOnDisk::FilterByNameFunction & filter_by_table_name) const { if (!MaterializedMySQLSyncThread::isMySQLSyncThread()) { diff --git a/src/Databases/MySQL/DatabaseMaterializedMySQL.h b/src/Databases/MySQL/DatabaseMaterializedMySQL.h index cdeb8a595db..812a0fb64c8 100644 --- a/src/Databases/MySQL/DatabaseMaterializedMySQL.h +++ b/src/Databases/MySQL/DatabaseMaterializedMySQL.h @@ -61,7 +61,7 @@ public: StoragePtr tryGetTable(const String & name, ContextPtr context_) const override; - DatabaseTablesIteratorPtr getTablesIterator(ContextPtr context_, const DatabaseOnDisk::FilterByNameFunction & filter_by_table_name) override; + DatabaseTablesIteratorPtr getTablesIterator(ContextPtr context_, const DatabaseOnDisk::FilterByNameFunction & filter_by_table_name) const override; void assertCalledFromSyncThreadOrDrop(const char * method) const; diff --git a/src/Databases/MySQL/DatabaseMySQL.cpp b/src/Databases/MySQL/DatabaseMySQL.cpp index d4acd2af85e..1ebde547e6b 100644 --- a/src/Databases/MySQL/DatabaseMySQL.cpp +++ b/src/Databases/MySQL/DatabaseMySQL.cpp @@ -11,7 +11,7 @@ # include # include # include -# include +# include # include # include # include @@ -84,7 +84,7 @@ bool DatabaseMySQL::empty() const return true; } -DatabaseTablesIteratorPtr DatabaseMySQL::getTablesIterator(ContextPtr local_context, const FilterByNameFunction & filter_by_table_name) +DatabaseTablesIteratorPtr DatabaseMySQL::getTablesIterator(ContextPtr local_context, const FilterByNameFunction & filter_by_table_name) const { Tables tables; std::lock_guard lock(mutex); diff --git a/src/Databases/MySQL/DatabaseMySQL.h b/src/Databases/MySQL/DatabaseMySQL.h index 0b364f0d8d3..ac3417bf6a4 100644 --- a/src/Databases/MySQL/DatabaseMySQL.h +++ b/src/Databases/MySQL/DatabaseMySQL.h @@ -57,7 +57,7 @@ public: bool empty() const override; - DatabaseTablesIteratorPtr getTablesIterator(ContextPtr context, const FilterByNameFunction & filter_by_table_name) override; + DatabaseTablesIteratorPtr getTablesIterator(ContextPtr context, const FilterByNameFunction & filter_by_table_name) const override; ASTPtr getCreateDatabaseQuery() const override; diff --git a/src/Databases/MySQL/FetchTablesColumnsList.cpp b/src/Databases/MySQL/FetchTablesColumnsList.cpp index 353bcd877ee..c67dcefb433 100644 --- a/src/Databases/MySQL/FetchTablesColumnsList.cpp +++ b/src/Databases/MySQL/FetchTablesColumnsList.cpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/Databases/MySQL/MaterializeMetadata.cpp b/src/Databases/MySQL/MaterializeMetadata.cpp index 9f5100991aa..f684797c675 100644 --- a/src/Databases/MySQL/MaterializeMetadata.cpp +++ b/src/Databases/MySQL/MaterializeMetadata.cpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/Databases/MySQL/MaterializedMySQLSyncThread.cpp b/src/Databases/MySQL/MaterializedMySQLSyncThread.cpp index 5175e9d0467..53495aa3cb1 100644 --- a/src/Databases/MySQL/MaterializedMySQLSyncThread.cpp +++ b/src/Databases/MySQL/MaterializedMySQLSyncThread.cpp @@ -16,7 +16,7 @@ # include # include # include -# include +# include # include # include # include diff --git a/src/Databases/PostgreSQL/DatabaseMaterializedPostgreSQL.cpp b/src/Databases/PostgreSQL/DatabaseMaterializedPostgreSQL.cpp index 742eb28c7a4..fdd181373df 100644 --- a/src/Databases/PostgreSQL/DatabaseMaterializedPostgreSQL.cpp +++ b/src/Databases/PostgreSQL/DatabaseMaterializedPostgreSQL.cpp @@ -203,7 +203,7 @@ void DatabaseMaterializedPostgreSQL::drop(ContextPtr local_context) DatabaseTablesIteratorPtr DatabaseMaterializedPostgreSQL::getTablesIterator( - ContextPtr local_context, const DatabaseOnDisk::FilterByNameFunction & filter_by_table_name) + ContextPtr local_context, const DatabaseOnDisk::FilterByNameFunction & filter_by_table_name) const { /// Modify context into nested_context and pass query to Atomic database. return DatabaseAtomic::getTablesIterator(StorageMaterializedPostgreSQL::makeNestedTableContext(local_context), filter_by_table_name); diff --git a/src/Databases/PostgreSQL/DatabaseMaterializedPostgreSQL.h b/src/Databases/PostgreSQL/DatabaseMaterializedPostgreSQL.h index 7ca84f079ed..dd8b4dc438a 100644 --- a/src/Databases/PostgreSQL/DatabaseMaterializedPostgreSQL.h +++ b/src/Databases/PostgreSQL/DatabaseMaterializedPostgreSQL.h @@ -46,7 +46,7 @@ public: void loadStoredObjects(ContextMutablePtr, bool, bool force_attach) override; DatabaseTablesIteratorPtr getTablesIterator( - ContextPtr context, const DatabaseOnDisk::FilterByNameFunction & filter_by_table_name) override; + ContextPtr context, const DatabaseOnDisk::FilterByNameFunction & filter_by_table_name) const override; StoragePtr tryGetTable(const String & name, ContextPtr context) const override; diff --git a/src/Databases/PostgreSQL/DatabasePostgreSQL.cpp b/src/Databases/PostgreSQL/DatabasePostgreSQL.cpp index c848c784712..7db42b1971f 100644 --- a/src/Databases/PostgreSQL/DatabasePostgreSQL.cpp +++ b/src/Databases/PostgreSQL/DatabasePostgreSQL.cpp @@ -88,7 +88,7 @@ bool DatabasePostgreSQL::empty() const } -DatabaseTablesIteratorPtr DatabasePostgreSQL::getTablesIterator(ContextPtr local_context, const FilterByNameFunction & /* filter_by_table_name */) +DatabaseTablesIteratorPtr DatabasePostgreSQL::getTablesIterator(ContextPtr local_context, const FilterByNameFunction & /* filter_by_table_name */) const { std::lock_guard lock(mutex); @@ -164,7 +164,7 @@ StoragePtr DatabasePostgreSQL::tryGetTable(const String & table_name, ContextPtr } -StoragePtr DatabasePostgreSQL::fetchTable(const String & table_name, ContextPtr local_context, const bool table_checked) const +StoragePtr DatabasePostgreSQL::fetchTable(const String & table_name, ContextPtr, const bool table_checked) const { if (!cache_tables || !cached_tables.count(table_name)) { @@ -179,7 +179,7 @@ StoragePtr DatabasePostgreSQL::fetchTable(const String & table_name, ContextPtr auto storage = StoragePostgreSQL::create( StorageID(database_name, table_name), pool, table_name, - ColumnsDescription{*columns}, ConstraintsDescription{}, String{}, local_context, postgres_schema); + ColumnsDescription{*columns}, ConstraintsDescription{}, String{}, postgres_schema); if (cache_tables) cached_tables[table_name] = storage; diff --git a/src/Databases/PostgreSQL/DatabasePostgreSQL.h b/src/Databases/PostgreSQL/DatabasePostgreSQL.h index ec5fb441958..f863fdcbf3e 100644 --- a/src/Databases/PostgreSQL/DatabasePostgreSQL.h +++ b/src/Databases/PostgreSQL/DatabasePostgreSQL.h @@ -50,7 +50,7 @@ public: void loadStoredObjects(ContextMutablePtr, bool, bool force_attach) override; - DatabaseTablesIteratorPtr getTablesIterator(ContextPtr context, const FilterByNameFunction & filter_by_table_name) override; + DatabaseTablesIteratorPtr getTablesIterator(ContextPtr context, const FilterByNameFunction & filter_by_table_name) const override; bool isTableExist(const String & name, ContextPtr context) const override; StoragePtr tryGetTable(const String & name, ContextPtr context) const override; diff --git a/src/Databases/SQLite/DatabaseSQLite.cpp b/src/Databases/SQLite/DatabaseSQLite.cpp index b3966288316..9d6db555882 100644 --- a/src/Databases/SQLite/DatabaseSQLite.cpp +++ b/src/Databases/SQLite/DatabaseSQLite.cpp @@ -44,7 +44,7 @@ bool DatabaseSQLite::empty() const } -DatabaseTablesIteratorPtr DatabaseSQLite::getTablesIterator(ContextPtr local_context, const IDatabase::FilterByNameFunction &) +DatabaseTablesIteratorPtr DatabaseSQLite::getTablesIterator(ContextPtr local_context, const IDatabase::FilterByNameFunction &) const { std::lock_guard lock(mutex); diff --git a/src/Databases/SQLite/DatabaseSQLite.h b/src/Databases/SQLite/DatabaseSQLite.h index a754b56f8ed..18a571dd703 100644 --- a/src/Databases/SQLite/DatabaseSQLite.h +++ b/src/Databases/SQLite/DatabaseSQLite.h @@ -34,7 +34,7 @@ public: StoragePtr tryGetTable(const String & name, ContextPtr context) const override; - DatabaseTablesIteratorPtr getTablesIterator(ContextPtr context, const FilterByNameFunction & filter_by_table_name) override; + DatabaseTablesIteratorPtr getTablesIterator(ContextPtr context, const FilterByNameFunction & filter_by_table_name) const override; bool empty() const override; diff --git a/src/Dictionaries/CacheDictionary.cpp b/src/Dictionaries/CacheDictionary.cpp index a5f953ccc15..0b2044cfe2c 100644 --- a/src/Dictionaries/CacheDictionary.cpp +++ b/src/Dictionaries/CacheDictionary.cpp @@ -151,7 +151,7 @@ Columns CacheDictionary::getColumns( * use default value. */ - if (dictionary_key_type == DictionaryKeyType::complex) + if (dictionary_key_type == DictionaryKeyType::Complex) dict_struct.validateKeyTypes(key_types); DictionaryKeysArenaHolder arena_holder; @@ -268,7 +268,7 @@ ColumnUInt8::Ptr CacheDictionary::hasKeys(const Columns & k * Check that key was fetched during update for that key set true in result array. */ - if (dictionary_key_type == DictionaryKeyType::complex) + if (dictionary_key_type == DictionaryKeyType::Complex) dict_struct.validateKeyTypes(key_types); @@ -364,7 +364,7 @@ ColumnPtr CacheDictionary::getHierarchy( ColumnPtr key_column [[maybe_unused]], const DataTypePtr & key_type [[maybe_unused]]) const { - if (dictionary_key_type == DictionaryKeyType::simple) + if (dictionary_key_type == DictionaryKeyType::Simple) { size_t keys_found; auto result = getKeysHierarchyDefaultImplementation(this, key_column, key_type, keys_found); @@ -382,7 +382,7 @@ ColumnUInt8::Ptr CacheDictionary::isInHierarchy( ColumnPtr in_key_column [[maybe_unused]], const DataTypePtr & key_type [[maybe_unused]]) const { - if (dictionary_key_type == DictionaryKeyType::simple) + if (dictionary_key_type == DictionaryKeyType::Simple) { size_t keys_found; auto result = getKeysIsInHierarchyDefaultImplementation(this, key_column, in_key_column, key_type, keys_found); @@ -492,7 +492,7 @@ Pipe CacheDictionary::read(const Names & column_names, size /// Write lock on storage const ProfilingScopedWriteRWLock write_lock{rw_lock, ProfileEvents::DictCacheLockWriteNs}; - if constexpr (dictionary_key_type == DictionaryKeyType::simple) + if constexpr (dictionary_key_type == DictionaryKeyType::Simple) data.emplace(shared_from_this(), cache_storage_ptr->getCachedSimpleKeys(), column_names); else { @@ -534,7 +534,7 @@ void CacheDictionary::update(CacheDictionaryUpdateUnitPtr requested_keys_vector; std::vector requested_complex_key_rows; - if constexpr (dictionary_key_type == DictionaryKeyType::simple) + if constexpr (dictionary_key_type == DictionaryKeyType::Simple) requested_keys_vector.reserve(requested_keys.size()); else requested_complex_key_rows.reserve(requested_keys.size()); @@ -546,7 +546,7 @@ void CacheDictionary::update(CacheDictionaryUpdateUnitPtr::update(CacheDictionaryUpdateUnitPtrloadIds(requested_keys_vector)); else pipeline.init(current_source_ptr->loadKeys(update_unit_ptr->key_columns, requested_complex_key_rows)); @@ -684,7 +684,7 @@ void CacheDictionary::update(CacheDictionaryUpdateUnitPtr; -template class CacheDictionary; +template class CacheDictionary; +template class CacheDictionary; } diff --git a/src/Dictionaries/CacheDictionary.h b/src/Dictionaries/CacheDictionary.h index 613d73b0f83..0e2a2699c45 100644 --- a/src/Dictionaries/CacheDictionary.h +++ b/src/Dictionaries/CacheDictionary.h @@ -51,8 +51,7 @@ template class CacheDictionary final : public IDictionary { public: - using KeyType = std::conditional_t; - static_assert(dictionary_key_type != DictionaryKeyType::range, "Range key type is not supported by cache dictionary"); + using KeyType = std::conditional_t; CacheDictionary( const StorageID & dict_id_, @@ -118,7 +117,7 @@ public: DictionaryKeyType getKeyType() const override { - return dictionary_key_type == DictionaryKeyType::simple ? DictionaryKeyType::simple : DictionaryKeyType::complex; + return dictionary_key_type == DictionaryKeyType::Simple ? DictionaryKeyType::Simple : DictionaryKeyType::Complex; } ColumnPtr getColumn( @@ -141,7 +140,7 @@ public: std::exception_ptr getLastException() const override; - bool hasHierarchy() const override { return dictionary_key_type == DictionaryKeyType::simple && dict_struct.hierarchical_attribute_index.has_value(); } + bool hasHierarchy() const override { return dictionary_key_type == DictionaryKeyType::Simple && dict_struct.hierarchical_attribute_index.has_value(); } ColumnPtr getHierarchy(ColumnPtr key_column, const DataTypePtr & key_type) const override; @@ -151,7 +150,7 @@ public: const DataTypePtr & key_type) const override; private: - using FetchResult = std::conditional_t; + using FetchResult = std::conditional_t; static MutableColumns aggregateColumnsInOrderOfKeys( const PaddedPODArray & keys, @@ -219,7 +218,7 @@ private: }; -extern template class CacheDictionary; -extern template class CacheDictionary; +extern template class CacheDictionary; +extern template class CacheDictionary; } diff --git a/src/Dictionaries/CacheDictionaryStorage.h b/src/Dictionaries/CacheDictionaryStorage.h index 8374e649cd1..2c7e9ad7092 100644 --- a/src/Dictionaries/CacheDictionaryStorage.h +++ b/src/Dictionaries/CacheDictionaryStorage.h @@ -41,8 +41,7 @@ class CacheDictionaryStorage final : public ICacheDictionaryStorage static constexpr size_t max_collision_length = 10; public: - using KeyType = std::conditional_t; - static_assert(dictionary_key_type != DictionaryKeyType::range, "Range key type is not supported by CacheDictionaryStorage"); + using KeyType = std::conditional_t; explicit CacheDictionaryStorage( const DictionaryStructure & dictionary_structure, @@ -62,19 +61,19 @@ public: String getName() const override { - if (dictionary_key_type == DictionaryKeyType::simple) + if (dictionary_key_type == DictionaryKeyType::Simple) return "Cache"; else return "ComplexKeyCache"; } - bool supportsSimpleKeys() const override { return dictionary_key_type == DictionaryKeyType::simple; } + bool supportsSimpleKeys() const override { return dictionary_key_type == DictionaryKeyType::Simple; } SimpleKeysStorageFetchResult fetchColumnsForKeys( const PaddedPODArray & keys, const DictionaryStorageFetchRequest & fetch_request) override { - if constexpr (dictionary_key_type == DictionaryKeyType::simple) + if constexpr (dictionary_key_type == DictionaryKeyType::Simple) return fetchColumnsForKeysImpl(keys, fetch_request); else throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Method fetchColumnsForKeys is not supported for complex key storage"); @@ -82,7 +81,7 @@ public: void insertColumnsForKeys(const PaddedPODArray & keys, Columns columns) override { - if constexpr (dictionary_key_type == DictionaryKeyType::simple) + if constexpr (dictionary_key_type == DictionaryKeyType::Simple) insertColumnsForKeysImpl(keys, columns); else throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Method insertColumnsForKeys is not supported for complex key storage"); @@ -90,7 +89,7 @@ public: void insertDefaultKeys(const PaddedPODArray & keys) override { - if constexpr (dictionary_key_type == DictionaryKeyType::simple) + if constexpr (dictionary_key_type == DictionaryKeyType::Simple) insertDefaultKeysImpl(keys); else throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Method insertDefaultKeysImpl is not supported for complex key storage"); @@ -98,19 +97,19 @@ public: PaddedPODArray getCachedSimpleKeys() const override { - if constexpr (dictionary_key_type == DictionaryKeyType::simple) + if constexpr (dictionary_key_type == DictionaryKeyType::Simple) return getCachedKeysImpl(); else throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Method getCachedSimpleKeys is not supported for complex key storage"); } - bool supportsComplexKeys() const override { return dictionary_key_type == DictionaryKeyType::complex; } + bool supportsComplexKeys() const override { return dictionary_key_type == DictionaryKeyType::Complex; } ComplexKeysStorageFetchResult fetchColumnsForKeys( const PaddedPODArray & keys, const DictionaryStorageFetchRequest & column_fetch_requests) override { - if constexpr (dictionary_key_type == DictionaryKeyType::complex) + if constexpr (dictionary_key_type == DictionaryKeyType::Complex) return fetchColumnsForKeysImpl(keys, column_fetch_requests); else throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Method fetchColumnsForKeys is not supported for simple key storage"); @@ -118,7 +117,7 @@ public: void insertColumnsForKeys(const PaddedPODArray & keys, Columns columns) override { - if constexpr (dictionary_key_type == DictionaryKeyType::complex) + if constexpr (dictionary_key_type == DictionaryKeyType::Complex) insertColumnsForKeysImpl(keys, columns); else throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Method insertColumnsForKeys is not supported for simple key storage"); @@ -126,7 +125,7 @@ public: void insertDefaultKeys(const PaddedPODArray & keys) override { - if constexpr (dictionary_key_type == DictionaryKeyType::complex) + if constexpr (dictionary_key_type == DictionaryKeyType::Complex) insertDefaultKeysImpl(keys); else throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Method insertDefaultKeysImpl is not supported for simple key storage"); @@ -134,7 +133,7 @@ public: PaddedPODArray getCachedComplexKeys() const override { - if constexpr (dictionary_key_type == DictionaryKeyType::complex) + if constexpr (dictionary_key_type == DictionaryKeyType::Complex) return getCachedKeysImpl(); else throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Method getCachedComplexKeys is not supported for simple key storage"); diff --git a/src/Dictionaries/CacheDictionaryUpdateQueue.cpp b/src/Dictionaries/CacheDictionaryUpdateQueue.cpp index 310abed822f..1d96fcc108b 100644 --- a/src/Dictionaries/CacheDictionaryUpdateQueue.cpp +++ b/src/Dictionaries/CacheDictionaryUpdateQueue.cpp @@ -14,8 +14,8 @@ namespace ErrorCodes extern const int TIMEOUT_EXCEEDED; } -template class CacheDictionaryUpdateUnit; -template class CacheDictionaryUpdateUnit; +template class CacheDictionaryUpdateUnit; +template class CacheDictionaryUpdateUnit; template CacheDictionaryUpdateQueue::CacheDictionaryUpdateQueue( @@ -155,7 +155,7 @@ void CacheDictionaryUpdateQueue::updateThreadFunction() } } -template class CacheDictionaryUpdateQueue; -template class CacheDictionaryUpdateQueue; +template class CacheDictionaryUpdateQueue; +template class CacheDictionaryUpdateQueue; } diff --git a/src/Dictionaries/CacheDictionaryUpdateQueue.h b/src/Dictionaries/CacheDictionaryUpdateQueue.h index 3d27a157752..bcad376bc53 100644 --- a/src/Dictionaries/CacheDictionaryUpdateQueue.h +++ b/src/Dictionaries/CacheDictionaryUpdateQueue.h @@ -39,7 +39,7 @@ template class CacheDictionaryUpdateUnit { public: - using KeyType = std::conditional_t; + using KeyType = std::conditional_t; /// Constructor for complex keys update request explicit CacheDictionaryUpdateUnit( @@ -85,8 +85,8 @@ private: template using CacheDictionaryUpdateUnitPtr = std::shared_ptr>; -extern template class CacheDictionaryUpdateUnit; -extern template class CacheDictionaryUpdateUnit; +extern template class CacheDictionaryUpdateUnit; +extern template class CacheDictionaryUpdateUnit; struct CacheDictionaryUpdateQueueConfiguration { @@ -110,7 +110,6 @@ class CacheDictionaryUpdateQueue public: /// Client of update queue must provide this function in constructor and perform update using update unit. using UpdateFunction = std::function)>; - static_assert(dictionary_key_type != DictionaryKeyType::range, "Range key type is not supported by CacheDictionaryUpdateQueue"); CacheDictionaryUpdateQueue( String dictionary_name_for_logs_, @@ -167,7 +166,7 @@ private: std::atomic finished{false}; }; -extern template class CacheDictionaryUpdateQueue; -extern template class CacheDictionaryUpdateQueue; +extern template class CacheDictionaryUpdateQueue; +extern template class CacheDictionaryUpdateQueue; } diff --git a/src/Dictionaries/CassandraDictionarySource.cpp b/src/Dictionaries/CassandraDictionarySource.cpp index 98928312ec8..d9a4dd0fd22 100644 --- a/src/Dictionaries/CassandraDictionarySource.cpp +++ b/src/Dictionaries/CassandraDictionarySource.cpp @@ -17,7 +17,7 @@ void registerDictionarySourceCassandra(DictionarySourceFactory & factory) [[maybe_unused]] const Poco::Util::AbstractConfiguration & config, [[maybe_unused]] const std::string & config_prefix, [[maybe_unused]] Block & sample_block, - ContextPtr /* context */, + ContextPtr /* global_context */, const std::string & /* default_database */, bool /*created_from_ddl*/) -> DictionarySourcePtr { @@ -36,10 +36,10 @@ void registerDictionarySourceCassandra(DictionarySourceFactory & factory) #if USE_CASSANDRA -#include -#include -#include "CassandraBlockInputStream.h" #include +#include +#include +#include namespace DB { diff --git a/src/Dictionaries/CassandraBlockInputStream.cpp b/src/Dictionaries/CassandraSource.cpp similarity index 99% rename from src/Dictionaries/CassandraBlockInputStream.cpp rename to src/Dictionaries/CassandraSource.cpp index 384717e2ba2..1ebacdb2c2f 100644 --- a/src/Dictionaries/CassandraBlockInputStream.cpp +++ b/src/Dictionaries/CassandraSource.cpp @@ -10,7 +10,7 @@ #include #include #include -#include "CassandraBlockInputStream.h" +#include "CassandraSource.h" namespace DB diff --git a/src/Dictionaries/CassandraBlockInputStream.h b/src/Dictionaries/CassandraSource.h similarity index 100% rename from src/Dictionaries/CassandraBlockInputStream.h rename to src/Dictionaries/CassandraSource.h diff --git a/src/Dictionaries/ClickHouseDictionarySource.cpp b/src/Dictionaries/ClickHouseDictionarySource.cpp index 0f085a7c1a2..7348569442d 100644 --- a/src/Dictionaries/ClickHouseDictionarySource.cpp +++ b/src/Dictionaries/ClickHouseDictionarySource.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -63,19 +64,18 @@ ClickHouseDictionarySource::ClickHouseDictionarySource( const DictionaryStructure & dict_struct_, const Configuration & configuration_, const Block & sample_block_, - ContextPtr context_) + ContextMutablePtr context_, + std::shared_ptr local_session_) : update_time{std::chrono::system_clock::from_time_t(0)} , dict_struct{dict_struct_} , configuration{configuration_} , query_builder{dict_struct, configuration.db, "", configuration.table, configuration.query, configuration.where, IdentifierQuotingStyle::Backticks} , sample_block{sample_block_} - , context(Context::createCopy(context_)) + , local_session(local_session_) + , context(context_) , pool{createPool(configuration)} , load_all_query{query_builder.composeLoadAllQuery()} { - /// Query context is needed because some code in executeQuery function may assume it exists. - /// Current example is Context::getSampleBlockCache from InterpreterSelectWithUnionQuery::getSampleBlock. - context->makeQueryContext(); } ClickHouseDictionarySource::ClickHouseDictionarySource(const ClickHouseDictionarySource & other) @@ -85,11 +85,11 @@ ClickHouseDictionarySource::ClickHouseDictionarySource(const ClickHouseDictionar , invalidate_query_response{other.invalidate_query_response} , query_builder{dict_struct, configuration.db, "", configuration.table, configuration.query, configuration.where, IdentifierQuotingStyle::Backticks} , sample_block{other.sample_block} + , local_session(other.local_session) , context(Context::createCopy(other.context)) , pool{createPool(configuration)} , load_all_query{other.load_all_query} { - context->makeQueryContext(); } std::string ClickHouseDictionarySource::getUpdateFieldAndDate() @@ -222,14 +222,13 @@ void registerDictionarySourceClickHouse(DictionarySourceFactory & factory) const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, Block & sample_block, - ContextPtr context, + ContextPtr global_context, const std::string & default_database [[maybe_unused]], bool /* created_from_ddl */) -> DictionarySourcePtr { bool secure = config.getBool(config_prefix + ".secure", false); - auto context_copy = Context::createCopy(context); - UInt16 default_port = getPortFromContext(context_copy, secure); + UInt16 default_port = getPortFromContext(global_context, secure); std::string settings_config_prefix = config_prefix + ".clickhouse"; std::string host = config.getString(settings_config_prefix + ".host", "localhost"); @@ -252,12 +251,18 @@ void registerDictionarySourceClickHouse(DictionarySourceFactory & factory) .secure = config.getBool(settings_config_prefix + ".secure", false) }; - /// We should set user info even for the case when the dictionary is loaded in-process (without TCP communication). + ContextMutablePtr context; + std::shared_ptr local_session; if (configuration.is_local) { - context_copy->setUser(configuration.user, configuration.password, Poco::Net::SocketAddress("127.0.0.1", 0)); - context_copy = copyContextAndApplySettings(config_prefix, context_copy, config); + /// Start local session in case when the dictionary is loaded in-process (without TCP communication). + local_session = std::make_shared(global_context, ClientInfo::Interface::LOCAL); + local_session->authenticate(configuration.user, configuration.password, {}); + context = local_session->makeQueryContext(); + context->applySettingsChanges(readSettingsFromDictionaryConfig(config, config_prefix)); } + else + context = copyContextAndApplySettingsFromDictionaryConfig(global_context, config, config_prefix); String dictionary_name = config.getString(".dictionary.name", ""); String dictionary_database = config.getString(".dictionary.database", ""); @@ -265,7 +270,7 @@ void registerDictionarySourceClickHouse(DictionarySourceFactory & factory) if (dictionary_name == configuration.table && dictionary_database == configuration.db) throw Exception(ErrorCodes::BAD_ARGUMENTS, "ClickHouseDictionarySource table cannot be dictionary table"); - return std::make_unique(dict_struct, configuration, sample_block, context_copy); + return std::make_unique(dict_struct, configuration, sample_block, context, local_session); }; factory.registerSource("clickhouse", create_table_source); diff --git a/src/Dictionaries/ClickHouseDictionarySource.h b/src/Dictionaries/ClickHouseDictionarySource.h index 2daa296af3e..58243e43b15 100644 --- a/src/Dictionaries/ClickHouseDictionarySource.h +++ b/src/Dictionaries/ClickHouseDictionarySource.h @@ -39,7 +39,8 @@ public: const DictionaryStructure & dict_struct_, const Configuration & configuration_, const Block & sample_block_, - ContextPtr context); + ContextMutablePtr context_, + std::shared_ptr local_session_); /// copy-constructor is provided in order to support cloneability ClickHouseDictionarySource(const ClickHouseDictionarySource & other); @@ -81,6 +82,7 @@ private: mutable std::string invalidate_query_response; ExternalQueryBuilder query_builder; Block sample_block; + std::shared_ptr local_session; ContextMutablePtr context; ConnectionPoolWithFailoverPtr pool; const std::string load_all_query; diff --git a/src/Dictionaries/DictionaryFactory.cpp b/src/Dictionaries/DictionaryFactory.cpp index 62b28ed7d14..4cab42c9445 100644 --- a/src/Dictionaries/DictionaryFactory.cpp +++ b/src/Dictionaries/DictionaryFactory.cpp @@ -31,7 +31,7 @@ DictionaryPtr DictionaryFactory::create( const std::string & name, const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, - ContextPtr context, + ContextPtr global_context, bool created_from_ddl) const { Poco::Util::AbstractConfiguration::Keys keys; @@ -45,12 +45,9 @@ DictionaryPtr DictionaryFactory::create( const DictionaryStructure dict_struct{config, config_prefix}; DictionarySourcePtr source_ptr = DictionarySourceFactory::instance().create( - name, config, config_prefix + ".source", dict_struct, context, config.getString(config_prefix + ".database", ""), created_from_ddl); + name, config, config_prefix + ".source", dict_struct, global_context, config.getString(config_prefix + ".database", ""), created_from_ddl); LOG_TRACE(&Poco::Logger::get("DictionaryFactory"), "Created dictionary source '{}' for dictionary '{}'", source_ptr->toString(), name); - if (context->hasQueryContext() && context->getSettingsRef().log_queries) - context->getQueryContext()->addQueryFactoriesInfo(Context::QueryLogFactories::Dictionary, name); - const auto & layout_type = keys.front(); { @@ -58,7 +55,7 @@ DictionaryPtr DictionaryFactory::create( if (found != registered_layouts.end()) { const auto & layout_creator = found->second.layout_create_function; - return layout_creator(name, dict_struct, config, config_prefix, std::move(source_ptr), context, created_from_ddl); + return layout_creator(name, dict_struct, config, config_prefix, std::move(source_ptr), global_context, created_from_ddl); } } @@ -68,10 +65,10 @@ DictionaryPtr DictionaryFactory::create( layout_type); } -DictionaryPtr DictionaryFactory::create(const std::string & name, const ASTCreateQuery & ast, ContextPtr context) const +DictionaryPtr DictionaryFactory::create(const std::string & name, const ASTCreateQuery & ast, ContextPtr global_context) const { - auto configuration = getDictionaryConfigurationFromAST(ast, context); - return DictionaryFactory::create(name, *configuration, "dictionary", context, true); + auto configuration = getDictionaryConfigurationFromAST(ast, global_context); + return DictionaryFactory::create(name, *configuration, "dictionary", global_context, true); } bool DictionaryFactory::isComplex(const std::string & layout_type) const diff --git a/src/Dictionaries/DictionaryFactory.h b/src/Dictionaries/DictionaryFactory.h index b717009aa8a..b1dad340f4b 100644 --- a/src/Dictionaries/DictionaryFactory.h +++ b/src/Dictionaries/DictionaryFactory.h @@ -36,13 +36,13 @@ public: const std::string & name, const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, - ContextPtr context, + ContextPtr global_context, bool created_from_ddl) const; /// Create dictionary from DDL-query DictionaryPtr create(const std::string & name, const ASTCreateQuery & ast, - ContextPtr context) const; + ContextPtr global_context) const; using LayoutCreateFunction = std::function; bool isComplex(const std::string & layout_type) const; diff --git a/src/Dictionaries/DictionaryHelpers.cpp b/src/Dictionaries/DictionaryHelpers.cpp new file mode 100644 index 00000000000..b54b9eabfb6 --- /dev/null +++ b/src/Dictionaries/DictionaryHelpers.cpp @@ -0,0 +1,48 @@ +#include "DictionaryHelpers.h" + +namespace DB +{ + +MutableColumns deserializeColumnsFromKeys( + const DictionaryStructure & dictionary_structure, + const PaddedPODArray & keys, + size_t start, + size_t end) +{ + MutableColumns result_columns; + result_columns.reserve(dictionary_structure.key->size()); + + for (const DictionaryAttribute & attribute : *dictionary_structure.key) + result_columns.emplace_back(attribute.type->createColumn()); + + for (size_t index = start; index < end; ++index) + { + const auto & key = keys[index]; + const auto * ptr = key.data; + + for (auto & result_column : result_columns) + ptr = result_column->deserializeAndInsertFromArena(ptr); + } + + return result_columns; +} + +ColumnsWithTypeAndName deserializeColumnsWithTypeAndNameFromKeys( + const DictionaryStructure & dictionary_structure, + const PaddedPODArray & keys, + size_t start, + size_t end) +{ + ColumnsWithTypeAndName result; + MutableColumns columns = deserializeColumnsFromKeys(dictionary_structure, keys, start, end); + + for (size_t i = 0, num_columns = columns.size(); i < num_columns; ++i) + { + const auto & dictionary_attribute = (*dictionary_structure.key)[i]; + result.emplace_back(ColumnWithTypeAndName{std::move(columns[i]), dictionary_attribute.type, dictionary_attribute.name}); + } + + return result; +} + +} diff --git a/src/Dictionaries/DictionaryHelpers.h b/src/Dictionaries/DictionaryHelpers.h index dde41864ddc..0c04d87c959 100644 --- a/src/Dictionaries/DictionaryHelpers.h +++ b/src/Dictionaries/DictionaryHelpers.h @@ -380,14 +380,14 @@ template class DictionaryKeysArenaHolder; template <> -class DictionaryKeysArenaHolder +class DictionaryKeysArenaHolder { public: static Arena * getComplexKeyArena() { return nullptr; } }; template <> -class DictionaryKeysArenaHolder +class DictionaryKeysArenaHolder { public: @@ -402,8 +402,7 @@ template class DictionaryKeysExtractor { public: - using KeyType = std::conditional_t; - static_assert(key_type != DictionaryKeyType::range, "Range key type is not supported by DictionaryKeysExtractor"); + using KeyType = std::conditional_t; explicit DictionaryKeysExtractor(const Columns & key_columns_, Arena * complex_key_arena_) : key_columns(key_columns_) @@ -411,7 +410,7 @@ public: { assert(!key_columns.empty()); - if constexpr (key_type == DictionaryKeyType::simple) + if constexpr (key_type == DictionaryKeyType::Simple) { key_columns[0] = key_columns[0]->convertToFullColumnIfConst(); @@ -437,7 +436,7 @@ public: { assert(current_key_index < keys_size); - if constexpr (key_type == DictionaryKeyType::simple) + if constexpr (key_type == DictionaryKeyType::Simple) { const auto & column_vector = static_cast &>(*key_columns[0]); const auto & data = column_vector.getData(); @@ -465,7 +464,7 @@ public: void rollbackCurrentKey() const { - if constexpr (key_type == DictionaryKeyType::complex) + if constexpr (key_type == DictionaryKeyType::Complex) complex_key_arena->rollback(current_complex_key.size); } @@ -497,6 +496,20 @@ private: Arena * complex_key_arena; }; +/// Deserialize columns from keys array using dictionary structure +MutableColumns deserializeColumnsFromKeys( + const DictionaryStructure & dictionary_structure, + const PaddedPODArray & keys, + size_t start, + size_t end); + +/// Deserialize columns with type and name from keys array using dictionary structure +ColumnsWithTypeAndName deserializeColumnsWithTypeAndNameFromKeys( + const DictionaryStructure & dictionary_structure, + const PaddedPODArray & keys, + size_t start, + size_t end); + /** Merge block with blocks from stream. If there are duplicate keys in block they are filtered out. * In result block_to_update will be merged with blocks from stream. * Note: readPrefix readImpl readSuffix will be called on stream object during function execution. @@ -507,8 +520,7 @@ void mergeBlockWithPipe( Block & block_to_update, Pipe pipe) { - using KeyType = std::conditional_t; - static_assert(dictionary_key_type != DictionaryKeyType::range, "Range key type is not supported by updatePreviousyLoadedBlockWithStream"); + using KeyType = std::conditional_t; Columns saved_block_key_columns; saved_block_key_columns.reserve(key_columns_size); diff --git a/src/Dictionaries/DictionarySource.cpp b/src/Dictionaries/DictionarySource.cpp index 7ba6ea82ca9..a164543e1ff 100644 --- a/src/Dictionaries/DictionarySource.cpp +++ b/src/Dictionaries/DictionarySource.cpp @@ -29,7 +29,7 @@ DictionarySourceData::DictionarySourceData( , key_type(DictionaryInputStreamKeyType::ComplexKey) { const DictionaryStructure & dictionary_structure = dictionary->getStructure(); - fillKeyColumns(keys, 0, keys.size(), dictionary_structure, key_columns); + key_columns = deserializeColumnsWithTypeAndNameFromKeys(dictionary_structure, keys, 0, keys.size()); } DictionarySourceData::DictionarySourceData( @@ -132,7 +132,7 @@ Block DictionarySourceData::fillBlock( { ColumnPtr column; - if (dictionary_key_type == DictionaryKeyType::simple) + if (dictionary_key_type == DictionaryKeyType::Simple) { column = dictionary->getColumn( attribute.name, @@ -158,32 +158,4 @@ Block DictionarySourceData::fillBlock( return Block(block_columns); } -void DictionarySourceData::fillKeyColumns( - const PaddedPODArray & keys, - size_t start, - size_t size, - const DictionaryStructure & dictionary_structure, - ColumnsWithTypeAndName & result) -{ - MutableColumns columns; - columns.reserve(dictionary_structure.key->size()); - - for (const DictionaryAttribute & attribute : *dictionary_structure.key) - columns.emplace_back(attribute.type->createColumn()); - - for (size_t index = start; index < size; ++index) - { - const auto & key = keys[index]; - const auto *ptr = key.data; - for (auto & column : columns) - ptr = column->deserializeAndInsertFromArena(ptr); - } - - for (size_t i = 0, num_columns = columns.size(); i < num_columns; ++i) - { - const auto & dictionary_attribute = (*dictionary_structure.key)[i]; - result.emplace_back(ColumnWithTypeAndName{std::move(columns[i]), dictionary_attribute.type, dictionary_attribute.name}); - } -} - } diff --git a/src/Dictionaries/DictionarySource.h b/src/Dictionaries/DictionarySource.h index 195a3c66484..cd4b3120ac0 100644 --- a/src/Dictionaries/DictionarySource.h +++ b/src/Dictionaries/DictionarySource.h @@ -51,13 +51,6 @@ private: const DataTypes & types, ColumnsWithTypeAndName && view) const; - static void fillKeyColumns( - const PaddedPODArray & keys, - size_t start, - size_t size, - const DictionaryStructure & dictionary_structure, - ColumnsWithTypeAndName & result); - const size_t num_rows; std::shared_ptr dictionary; std::unordered_set column_names; diff --git a/src/Dictionaries/DictionarySourceFactory.cpp b/src/Dictionaries/DictionarySourceFactory.cpp index 1992c87d31f..80b60f29e37 100644 --- a/src/Dictionaries/DictionarySourceFactory.cpp +++ b/src/Dictionaries/DictionarySourceFactory.cpp @@ -80,7 +80,7 @@ DictionarySourcePtr DictionarySourceFactory::create( const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, const DictionaryStructure & dict_struct, - ContextPtr context, + ContextPtr global_context, const std::string & default_database, bool check_config) const { @@ -99,7 +99,7 @@ DictionarySourcePtr DictionarySourceFactory::create( { const auto & create_source = found->second; auto sample_block = createSampleBlock(dict_struct); - return create_source(dict_struct, config, config_prefix, sample_block, context, default_database, check_config); + return create_source(dict_struct, config, config_prefix, sample_block, global_context, default_database, check_config); } throw Exception(ErrorCodes::UNKNOWN_ELEMENT_IN_CONFIG, diff --git a/src/Dictionaries/DictionarySourceFactory.h b/src/Dictionaries/DictionarySourceFactory.h index bb583927ac4..f4c3fa12163 100644 --- a/src/Dictionaries/DictionarySourceFactory.h +++ b/src/Dictionaries/DictionarySourceFactory.h @@ -35,7 +35,7 @@ public: const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, Block & sample_block, - ContextPtr context, + ContextPtr global_context, const std::string & default_database, bool check_config)>; @@ -48,7 +48,7 @@ public: const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, const DictionaryStructure & dict_struct, - ContextPtr context, + ContextPtr global_context, const std::string & default_database, bool check_config) const; diff --git a/src/Dictionaries/DictionarySourceHelpers.cpp b/src/Dictionaries/DictionarySourceHelpers.cpp index 092e7187e8f..cf003dceb8e 100644 --- a/src/Dictionaries/DictionarySourceHelpers.cpp +++ b/src/Dictionaries/DictionarySourceHelpers.cpp @@ -59,30 +59,36 @@ Block blockForKeys( return block; } -ContextMutablePtr copyContextAndApplySettings( - const std::string & config_prefix, - ContextPtr context, - const Poco::Util::AbstractConfiguration & config) + +SettingsChanges readSettingsFromDictionaryConfig(const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix) { - auto local_context = Context::createCopy(context); - if (config.has(config_prefix + ".settings")) + if (!config.has(config_prefix + ".settings")) + return {}; + + const auto prefix = config_prefix + ".settings"; + + Poco::Util::AbstractConfiguration::Keys config_keys; + config.keys(prefix, config_keys); + + SettingsChanges changes; + + for (const std::string & key : config_keys) { - const auto prefix = config_prefix + ".settings"; - - Poco::Util::AbstractConfiguration::Keys config_keys; - config.keys(prefix, config_keys); - - SettingsChanges changes; - - for (const std::string & key : config_keys) - { - const auto value = config.getString(prefix + "." + key); - changes.emplace_back(key, value); - } - - local_context->applySettingsChanges(changes); + const auto value = config.getString(prefix + "." + key); + changes.emplace_back(key, value); } - return local_context; + + return changes; +} + + +ContextMutablePtr copyContextAndApplySettingsFromDictionaryConfig( + const ContextPtr & context, const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix) +{ + auto context_copy = Context::createCopy(context); + auto changes = readSettingsFromDictionaryConfig(config, config_prefix); + context_copy->applySettingsChanges(changes); + return context_copy; } static Block transformHeader(Block header, Block block_to_add) diff --git a/src/Dictionaries/DictionarySourceHelpers.h b/src/Dictionaries/DictionarySourceHelpers.h index b955b6ffb66..5470321745a 100644 --- a/src/Dictionaries/DictionarySourceHelpers.h +++ b/src/Dictionaries/DictionarySourceHelpers.h @@ -14,6 +14,7 @@ namespace DB { struct DictionaryStructure; +class SettingsChanges; /// For simple key @@ -29,10 +30,8 @@ Block blockForKeys( const std::vector & requested_rows); /// Used for applying settings to copied context in some register[...]Source functions -ContextMutablePtr copyContextAndApplySettings( - const std::string & config_prefix, - ContextPtr context, - const Poco::Util::AbstractConfiguration & config); +SettingsChanges readSettingsFromDictionaryConfig(const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix); +ContextMutablePtr copyContextAndApplySettingsFromDictionaryConfig(const ContextPtr & context, const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix); /** A stream, adds additional columns to each block that it will read from inner stream. * diff --git a/src/Dictionaries/DictionaryStructure.cpp b/src/Dictionaries/DictionaryStructure.cpp index 9f46addd912..97c1b98a823 100644 --- a/src/Dictionaries/DictionaryStructure.cpp +++ b/src/Dictionaries/DictionaryStructure.cpp @@ -134,42 +134,11 @@ DictionaryStructure::DictionaryStructure(const Poco::Util::AbstractConfiguration if (id->name.empty()) throw Exception(ErrorCodes::BAD_ARGUMENTS, "'id' cannot be empty"); - const char * range_default_type = "Date"; - if (config.has(structure_prefix + ".range_min")) - range_min.emplace(makeDictionaryTypedSpecialAttribute(config, structure_prefix + ".range_min", range_default_type)); - - if (config.has(structure_prefix + ".range_max")) - range_max.emplace(makeDictionaryTypedSpecialAttribute(config, structure_prefix + ".range_max", range_default_type)); - - if (range_min.has_value() != range_max.has_value()) - { - throw Exception(ErrorCodes::BAD_ARGUMENTS, - "Dictionary structure should have both 'range_min' and 'range_max' either specified or not."); - } - - if (range_min && range_max && !range_min->type->equals(*range_max->type)) - { - throw Exception(ErrorCodes::BAD_ARGUMENTS, - "Dictionary structure 'range_min' and 'range_max' should have same type, " - "'range_min' type: {}," - "'range_max' type: {}", - range_min->type->getName(), - range_max->type->getName()); - } - - if (range_min) - { - if (!range_min->type->isValueRepresentedByInteger()) - throw Exception(ErrorCodes::BAD_ARGUMENTS, - "Dictionary structure type of 'range_min' and 'range_max' should be an integer, Date, DateTime, or Enum." - " Actual 'range_min' and 'range_max' type is {}", - range_min->type->getName()); - } - - if (!id->expression.empty() || (range_min && !range_min->expression.empty()) || (range_max && !range_max->expression.empty())) + if (!id->expression.empty()) has_expressions = true; } + parseRangeConfiguration(config, structure_prefix); attributes = getAttributes(config, structure_prefix, /*complex_key_attributes =*/ false); for (size_t i = 0; i < attributes.size(); ++i) @@ -192,9 +161,6 @@ DictionaryStructure::DictionaryStructure(const Poco::Util::AbstractConfiguration } } - if (attributes.empty()) - throw Exception(ErrorCodes::BAD_ARGUMENTS, "Dictionary has no attributes defined"); - if (config.getBool(config_prefix + ".layout.ip_trie.access_to_key_from_attributes", false)) access_to_key_from_attributes = true; } @@ -439,4 +405,42 @@ std::vector DictionaryStructure::getAttributes( return res_attributes; } +void DictionaryStructure::parseRangeConfiguration(const Poco::Util::AbstractConfiguration & config, const std::string & structure_prefix) +{ + const char * range_default_type = "Date"; + if (config.has(structure_prefix + ".range_min")) + range_min.emplace(makeDictionaryTypedSpecialAttribute(config, structure_prefix + ".range_min", range_default_type)); + + if (config.has(structure_prefix + ".range_max")) + range_max.emplace(makeDictionaryTypedSpecialAttribute(config, structure_prefix + ".range_max", range_default_type)); + + if (range_min.has_value() != range_max.has_value()) + { + throw Exception(ErrorCodes::BAD_ARGUMENTS, + "Dictionary structure should have both 'range_min' and 'range_max' either specified or not."); + } + + if (range_min && range_max && !range_min->type->equals(*range_max->type)) + { + throw Exception(ErrorCodes::BAD_ARGUMENTS, + "Dictionary structure 'range_min' and 'range_max' should have same type, " + "'range_min' type: {}," + "'range_max' type: {}", + range_min->type->getName(), + range_max->type->getName()); + } + + if (range_min) + { + if (!range_min->type->isValueRepresentedByInteger()) + throw Exception(ErrorCodes::BAD_ARGUMENTS, + "Dictionary structure type of 'range_min' and 'range_max' should be an integer, Date, DateTime, or Enum." + " Actual 'range_min' and 'range_max' type is {}", + range_min->type->getName()); + } + + if ((range_min && !range_min->expression.empty()) || (range_max && !range_max->expression.empty())) + has_expressions = true; +} + } diff --git a/src/Dictionaries/DictionaryStructure.h b/src/Dictionaries/DictionaryStructure.h index 3ea640d77e8..6ab849d1d89 100644 --- a/src/Dictionaries/DictionaryStructure.h +++ b/src/Dictionaries/DictionaryStructure.h @@ -67,8 +67,9 @@ using DictionaryLifetime = ExternalLoadableLifetime; * - null_value, used as a default value for non-existent entries in the dictionary, * decimal representation for numeric attributes; * - hierarchical, whether this attribute defines a hierarchy; -* - injective, whether the mapping to parent is injective (can be used for optimization of GROUP BY?) -* - is_object_id, used in mongo dictionary, converts string key to objectid +* - injective, whether the mapping to parent is injective (can be used for optimization of GROUP BY?); +* - is_object_id, used in mongo dictionary, converts string key to objectid; +* - is_nullable, is attribute nullable; */ struct DictionaryAttribute final { @@ -153,6 +154,10 @@ private: const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, bool complex_key_attributes); + + /// parse range_min and range_max + void parseRangeConfiguration(const Poco::Util::AbstractConfiguration & config, const std::string & structure_prefix); + }; } diff --git a/src/Dictionaries/DirectDictionary.cpp b/src/Dictionaries/DirectDictionary.cpp index eb06701ab7a..10e7414b42f 100644 --- a/src/Dictionaries/DirectDictionary.cpp +++ b/src/Dictionaries/DirectDictionary.cpp @@ -40,7 +40,7 @@ Columns DirectDictionary::getColumns( const DataTypes & key_types [[maybe_unused]], const Columns & default_values_columns) const { - if constexpr (dictionary_key_type == DictionaryKeyType::complex) + if constexpr (dictionary_key_type == DictionaryKeyType::Complex) dict_struct.validateKeyTypes(key_types); DictionaryKeysArenaHolder arena_holder; @@ -161,7 +161,7 @@ ColumnUInt8::Ptr DirectDictionary::hasKeys( const Columns & key_columns, const DataTypes & key_types [[maybe_unused]]) const { - if constexpr (dictionary_key_type == DictionaryKeyType::complex) + if constexpr (dictionary_key_type == DictionaryKeyType::Complex) dict_struct.validateKeyTypes(key_types); DictionaryKeysArenaHolder arena_holder; @@ -230,7 +230,7 @@ ColumnPtr DirectDictionary::getHierarchy( ColumnPtr key_column, const DataTypePtr & key_type) const { - if (dictionary_key_type == DictionaryKeyType::simple) + if (dictionary_key_type == DictionaryKeyType::Simple) { size_t keys_found; auto result = getKeysHierarchyDefaultImplementation(this, key_column, key_type, keys_found); @@ -248,7 +248,7 @@ ColumnUInt8::Ptr DirectDictionary::isInHierarchy( ColumnPtr in_key_column, const DataTypePtr & key_type) const { - if (dictionary_key_type == DictionaryKeyType::simple) + if (dictionary_key_type == DictionaryKeyType::Simple) { size_t keys_found = 0; auto result = getKeysIsInHierarchyDefaultImplementation(this, key_column, in_key_column, key_type, keys_found); @@ -269,7 +269,7 @@ Pipe DirectDictionary::getSourceBlockInputStream( Pipe pipe; - if constexpr (dictionary_key_type == DictionaryKeyType::simple) + if constexpr (dictionary_key_type == DictionaryKeyType::Simple) { std::vector ids; ids.reserve(requested_keys_size); @@ -307,12 +307,12 @@ namespace const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, DictionarySourcePtr source_ptr, - ContextPtr /* context */, + ContextPtr /* global_context */, bool /* created_from_ddl */) { - const auto * layout_name = dictionary_key_type == DictionaryKeyType::simple ? "direct" : "complex_key_direct"; + const auto * layout_name = dictionary_key_type == DictionaryKeyType::Simple ? "direct" : "complex_key_direct"; - if constexpr (dictionary_key_type == DictionaryKeyType::simple) + if constexpr (dictionary_key_type == DictionaryKeyType::Simple) { if (dict_struct.key) throw Exception(ErrorCodes::UNSUPPORTED_METHOD, @@ -344,13 +344,13 @@ namespace } } -template class DirectDictionary; -template class DirectDictionary; +template class DirectDictionary; +template class DirectDictionary; void registerDictionaryDirect(DictionaryFactory & factory) { - factory.registerLayout("direct", createDirectDictionary, false); - factory.registerLayout("complex_key_direct", createDirectDictionary, true); + factory.registerLayout("direct", createDirectDictionary, false); + factory.registerLayout("complex_key_direct", createDirectDictionary, true); } diff --git a/src/Dictionaries/DirectDictionary.h b/src/Dictionaries/DirectDictionary.h index 4700e71d94b..ebe5f5fbbc7 100644 --- a/src/Dictionaries/DirectDictionary.h +++ b/src/Dictionaries/DirectDictionary.h @@ -20,8 +20,7 @@ template class DirectDictionary final : public IDictionary { public: - static_assert(dictionary_key_type != DictionaryKeyType::range, "Range key type is not supported by direct dictionary"); - using KeyType = std::conditional_t; + using KeyType = std::conditional_t; DirectDictionary( const StorageID & dict_id_, @@ -30,7 +29,7 @@ public: std::string getTypeName() const override { - if constexpr (dictionary_key_type == DictionaryKeyType::simple) + if constexpr (dictionary_key_type == DictionaryKeyType::Simple) return "Direct"; else return "ComplexKeyDirect"; @@ -110,7 +109,7 @@ private: mutable std::atomic found_count{0}; }; -extern template class DirectDictionary; -extern template class DirectDictionary; +extern template class DirectDictionary; +extern template class DirectDictionary; } diff --git a/src/Dictionaries/ExecutableDictionarySource.cpp b/src/Dictionaries/ExecutableDictionarySource.cpp index 8802d04ff30..5c6add34f1f 100644 --- a/src/Dictionaries/ExecutableDictionarySource.cpp +++ b/src/Dictionaries/ExecutableDictionarySource.cpp @@ -275,7 +275,7 @@ void registerDictionarySourceExecutable(DictionarySourceFactory & factory) const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, Block & sample_block, - ContextPtr context, + ContextPtr global_context, const std::string & /* default_database */, bool created_from_ddl) -> DictionarySourcePtr { @@ -285,10 +285,10 @@ void registerDictionarySourceExecutable(DictionarySourceFactory & factory) /// Executable dictionaries may execute arbitrary commands. /// It's OK for dictionaries created by administrator from xml-file, but /// maybe dangerous for dictionaries created from DDL-queries. - if (created_from_ddl && context->getApplicationType() != Context::ApplicationType::LOCAL) + if (created_from_ddl && global_context->getApplicationType() != Context::ApplicationType::LOCAL) throw Exception(ErrorCodes::DICTIONARY_ACCESS_DENIED, "Dictionaries with executable dictionary source are not allowed to be created from DDL query"); - auto context_local_copy = copyContextAndApplySettings(config_prefix, context, config); + auto context = copyContextAndApplySettingsFromDictionaryConfig(global_context, config, config_prefix); std::string settings_config_prefix = config_prefix + ".executable"; @@ -301,7 +301,7 @@ void registerDictionarySourceExecutable(DictionarySourceFactory & factory) .implicit_key = config.getBool(settings_config_prefix + ".implicit_key", false) }; - return std::make_unique(dict_struct, configuration, sample_block, context_local_copy); + return std::make_unique(dict_struct, configuration, sample_block, context); }; factory.registerSource("executable", create_table_source); diff --git a/src/Dictionaries/ExecutablePoolDictionarySource.cpp b/src/Dictionaries/ExecutablePoolDictionarySource.cpp index e97b4253407..41067016ce4 100644 --- a/src/Dictionaries/ExecutablePoolDictionarySource.cpp +++ b/src/Dictionaries/ExecutablePoolDictionarySource.cpp @@ -279,7 +279,7 @@ void registerDictionarySourceExecutablePool(DictionarySourceFactory & factory) const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, Block & sample_block, - ContextPtr context, + ContextPtr global_context, const std::string & /* default_database */, bool created_from_ddl) -> DictionarySourcePtr { @@ -289,17 +289,15 @@ void registerDictionarySourceExecutablePool(DictionarySourceFactory & factory) /// Executable dictionaries may execute arbitrary commands. /// It's OK for dictionaries created by administrator from xml-file, but /// maybe dangerous for dictionaries created from DDL-queries. - if (created_from_ddl && context->getApplicationType() != Context::ApplicationType::LOCAL) + if (created_from_ddl && global_context->getApplicationType() != Context::ApplicationType::LOCAL) throw Exception(ErrorCodes::DICTIONARY_ACCESS_DENIED, "Dictionaries with executable pool dictionary source are not allowed to be created from DDL query"); - auto context_local_copy = copyContextAndApplySettings(config_prefix, context, config); + ContextMutablePtr context = copyContextAndApplySettingsFromDictionaryConfig(global_context, config, config_prefix); /** Currently parallel parsing input format cannot read exactly max_block_size rows from input, * so it will be blocked on ReadBufferFromFileDescriptor because this file descriptor represent pipe that does not have eof. */ - auto settings_no_parallel_parsing = context_local_copy->getSettings(); - settings_no_parallel_parsing.input_format_parallel_parsing = false; - context_local_copy->setSettings(settings_no_parallel_parsing); + context->setSetting("input_format_parallel_parsing", false); String settings_config_prefix = config_prefix + ".executable_pool"; @@ -319,7 +317,7 @@ void registerDictionarySourceExecutablePool(DictionarySourceFactory & factory) .implicit_key = config.getBool(settings_config_prefix + ".implicit_key", false), }; - return std::make_unique(dict_struct, configuration, sample_block, context_local_copy); + return std::make_unique(dict_struct, configuration, sample_block, context); }; factory.registerSource("executable_pool", create_table_source); diff --git a/src/Dictionaries/ExternalQueryBuilder.cpp b/src/Dictionaries/ExternalQueryBuilder.cpp index 10c4f67d809..9ddaaeb573a 100644 --- a/src/Dictionaries/ExternalQueryBuilder.cpp +++ b/src/Dictionaries/ExternalQueryBuilder.cpp @@ -133,6 +133,29 @@ void ExternalQueryBuilder::composeLoadAllQuery(WriteBuffer & out) const writeQuoted(key.name, out); } + + if (dict_struct.range_min && dict_struct.range_max) + { + writeString(", ", out); + + if (!dict_struct.range_min->expression.empty()) + { + writeParenthesisedString(dict_struct.range_min->expression, out); + writeString(" AS ", out); + } + + writeQuoted(dict_struct.range_min->name, out); + + writeString(", ", out); + + if (!dict_struct.range_max->expression.empty()) + { + writeParenthesisedString(dict_struct.range_max->expression, out); + writeString(" AS ", out); + } + + writeQuoted(dict_struct.range_max->name, out); + } } for (const auto & attr : dict_struct.attributes) diff --git a/src/Dictionaries/FileDictionarySource.cpp b/src/Dictionaries/FileDictionarySource.cpp index bea14d88d1e..54ce5e4a448 100644 --- a/src/Dictionaries/FileDictionarySource.cpp +++ b/src/Dictionaries/FileDictionarySource.cpp @@ -77,7 +77,7 @@ void registerDictionarySourceFile(DictionarySourceFactory & factory) const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, Block & sample_block, - ContextPtr context, + ContextPtr global_context, const std::string & /* default_database */, bool created_from_ddl) -> DictionarySourcePtr { @@ -87,9 +87,9 @@ void registerDictionarySourceFile(DictionarySourceFactory & factory) const auto filepath = config.getString(config_prefix + ".file.path"); const auto format = config.getString(config_prefix + ".file.format"); - auto context_local_copy = copyContextAndApplySettings(config_prefix, context, config); + const auto context = copyContextAndApplySettingsFromDictionaryConfig(global_context, config, config_prefix); - return std::make_unique(filepath, format, sample_block, context_local_copy, created_from_ddl); + return std::make_unique(filepath, format, sample_block, context, created_from_ddl); }; factory.registerSource("file", create_table_source); diff --git a/src/Dictionaries/FlatDictionary.cpp b/src/Dictionaries/FlatDictionary.cpp index 639895ac8ac..5ecf3299ea6 100644 --- a/src/Dictionaries/FlatDictionary.cpp +++ b/src/Dictionaries/FlatDictionary.cpp @@ -289,8 +289,8 @@ void FlatDictionary::blockToAttributes(const Block & block) { const auto keys_column = block.safeGetByPosition(0).column; - DictionaryKeysArenaHolder arena_holder; - DictionaryKeysExtractor keys_extractor({ keys_column }, arena_holder.getComplexKeyArena()); + DictionaryKeysArenaHolder arena_holder; + DictionaryKeysExtractor keys_extractor({ keys_column }, arena_holder.getComplexKeyArena()); auto keys = keys_extractor.extractAllKeys(); HashSet already_processed_keys; @@ -344,7 +344,7 @@ void FlatDictionary::updateData() else { Pipe pipe(source_ptr->loadUpdatedAll()); - mergeBlockWithPipe( + mergeBlockWithPipe( dict_struct.getKeysSize(), *update_field_loaded_block, std::move(pipe)); @@ -557,7 +557,7 @@ void registerDictionaryFlat(DictionaryFactory & factory) const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, DictionarySourcePtr source_ptr, - ContextPtr /* context */, + ContextPtr /* global_context */, bool /* created_from_ddl */) -> DictionaryPtr { if (dict_struct.key) diff --git a/src/Dictionaries/FlatDictionary.h b/src/Dictionaries/FlatDictionary.h index e6a07200c05..196194ddb21 100644 --- a/src/Dictionaries/FlatDictionary.h +++ b/src/Dictionaries/FlatDictionary.h @@ -72,7 +72,7 @@ public: return dict_struct.getAttribute(attribute_name).injective; } - DictionaryKeyType getKeyType() const override { return DictionaryKeyType::simple; } + DictionaryKeyType getKeyType() const override { return DictionaryKeyType::Simple; } ColumnPtr getColumn( const std::string& attribute_name, diff --git a/src/Dictionaries/HTTPDictionarySource.cpp b/src/Dictionaries/HTTPDictionarySource.cpp index 4a80ebdf975..b5cf59b4474 100644 --- a/src/Dictionaries/HTTPDictionarySource.cpp +++ b/src/Dictionaries/HTTPDictionarySource.cpp @@ -213,13 +213,13 @@ void registerDictionarySourceHTTP(DictionarySourceFactory & factory) const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, Block & sample_block, - ContextPtr context, + ContextPtr global_context, const std::string & /* default_database */, bool created_from_ddl) -> DictionarySourcePtr { if (dict_struct.has_expressions) throw Exception(ErrorCodes::LOGICAL_ERROR, "Dictionary source of type `http` does not support attribute expressions"); - auto context_local_copy = copyContextAndApplySettings(config_prefix, context, config); + auto context = copyContextAndApplySettingsFromDictionaryConfig(global_context, config, config_prefix); const auto & settings_config_prefix = config_prefix + ".http"; const auto & credentials_prefix = settings_config_prefix + ".credentials"; @@ -258,7 +258,7 @@ void registerDictionarySourceHTTP(DictionarySourceFactory & factory) .header_entries = std::move(header_entries) }; - return std::make_unique(dict_struct, configuration, credentials, sample_block, context_local_copy, created_from_ddl); + return std::make_unique(dict_struct, configuration, credentials, sample_block, context, created_from_ddl); }; factory.registerSource("http", create_table_source); } diff --git a/src/Dictionaries/HashedDictionary.cpp b/src/Dictionaries/HashedDictionary.cpp index 189994dabf4..fd5865e24c0 100644 --- a/src/Dictionaries/HashedDictionary.cpp +++ b/src/Dictionaries/HashedDictionary.cpp @@ -61,7 +61,7 @@ ColumnPtr HashedDictionary::getColumn( const DataTypes & key_types [[maybe_unused]], const ColumnPtr & default_values_column) const { - if (dictionary_key_type == DictionaryKeyType::complex) + if (dictionary_key_type == DictionaryKeyType::Complex) dict_struct.validateKeyTypes(key_types); ColumnPtr result; @@ -163,7 +163,7 @@ ColumnPtr HashedDictionary::getColumn( template ColumnUInt8::Ptr HashedDictionary::hasKeys(const Columns & key_columns, const DataTypes & key_types) const { - if (dictionary_key_type == DictionaryKeyType::complex) + if (dictionary_key_type == DictionaryKeyType::Complex) dict_struct.validateKeyTypes(key_types); DictionaryKeysArenaHolder arena_holder; @@ -210,7 +210,7 @@ ColumnUInt8::Ptr HashedDictionary::hasKeys(const Co template ColumnPtr HashedDictionary::getHierarchy(ColumnPtr key_column [[maybe_unused]], const DataTypePtr &) const { - if constexpr (dictionary_key_type == DictionaryKeyType::simple) + if constexpr (dictionary_key_type == DictionaryKeyType::Simple) { PaddedPODArray keys_backup_storage; const auto & keys = getColumnVectorData(this, key_column, keys_backup_storage); @@ -258,7 +258,7 @@ ColumnUInt8::Ptr HashedDictionary::isInHierarchy( ColumnPtr in_key_column [[maybe_unused]], const DataTypePtr &) const { - if constexpr (dictionary_key_type == DictionaryKeyType::simple) + if constexpr (dictionary_key_type == DictionaryKeyType::Simple) { PaddedPODArray keys_backup_storage; const auto & keys = getColumnVectorData(this, key_column, keys_backup_storage); @@ -309,7 +309,7 @@ ColumnPtr HashedDictionary::getDescendants( const DataTypePtr &, size_t level [[maybe_unused]]) const { - if constexpr (dictionary_key_type == DictionaryKeyType::simple) + if constexpr (dictionary_key_type == DictionaryKeyType::Simple) { PaddedPODArray keys_backup; const auto & keys = getColumnVectorData(this, key_column, keys_backup); @@ -665,7 +665,7 @@ Pipe HashedDictionary::read(const Names & column_na }); } - if constexpr (dictionary_key_type == DictionaryKeyType::simple) + if constexpr (dictionary_key_type == DictionaryKeyType::Simple) return Pipe(std::make_shared(DictionarySourceData(shared_from_this(), std::move(keys), column_names), max_block_size)); else return Pipe(std::make_shared(DictionarySourceData(shared_from_this(), keys, column_names), max_block_size)); @@ -702,10 +702,10 @@ void HashedDictionary::getAttributeContainer(size_t }); } -template class HashedDictionary; -template class HashedDictionary; -template class HashedDictionary; -template class HashedDictionary; +template class HashedDictionary; +template class HashedDictionary; +template class HashedDictionary; +template class HashedDictionary; void registerDictionaryHashed(DictionaryFactory & factory) { @@ -717,9 +717,9 @@ void registerDictionaryHashed(DictionaryFactory & factory) DictionaryKeyType dictionary_key_type, bool sparse) -> DictionaryPtr { - if (dictionary_key_type == DictionaryKeyType::simple && dict_struct.key) + if (dictionary_key_type == DictionaryKeyType::Simple && dict_struct.key) throw Exception(ErrorCodes::UNSUPPORTED_METHOD, "'key' is not supported for simple key hashed dictionary"); - else if (dictionary_key_type == DictionaryKeyType::complex && dict_struct.id) + else if (dictionary_key_type == DictionaryKeyType::Complex && dict_struct.id) throw Exception(ErrorCodes::UNSUPPORTED_METHOD, "'id' is not supported for complex key hashed dictionary"); if (dict_struct.range_min || dict_struct.range_max) @@ -737,32 +737,32 @@ void registerDictionaryHashed(DictionaryFactory & factory) HashedDictionaryStorageConfiguration configuration{preallocate, require_nonempty, dict_lifetime}; - if (dictionary_key_type == DictionaryKeyType::simple) + if (dictionary_key_type == DictionaryKeyType::Simple) { if (sparse) - return std::make_unique>(dict_id, dict_struct, std::move(source_ptr), configuration); + return std::make_unique>(dict_id, dict_struct, std::move(source_ptr), configuration); else - return std::make_unique>(dict_id, dict_struct, std::move(source_ptr), configuration); + return std::make_unique>(dict_id, dict_struct, std::move(source_ptr), configuration); } else { if (sparse) - return std::make_unique>(dict_id, dict_struct, std::move(source_ptr), configuration); + return std::make_unique>(dict_id, dict_struct, std::move(source_ptr), configuration); else - return std::make_unique>(dict_id, dict_struct, std::move(source_ptr), configuration); + return std::make_unique>(dict_id, dict_struct, std::move(source_ptr), configuration); } }; using namespace std::placeholders; factory.registerLayout("hashed", - [=](auto && a, auto && b, auto && c, auto && d, DictionarySourcePtr e, ContextPtr /* context */, bool /*created_from_ddl*/){ return create_layout(a, b, c, d, std::move(e), DictionaryKeyType::simple, /* sparse = */ false); }, false); + [=](auto && a, auto && b, auto && c, auto && d, DictionarySourcePtr e, ContextPtr /* global_context */, bool /*created_from_ddl*/){ return create_layout(a, b, c, d, std::move(e), DictionaryKeyType::Simple, /* sparse = */ false); }, false); factory.registerLayout("sparse_hashed", - [=](auto && a, auto && b, auto && c, auto && d, DictionarySourcePtr e, ContextPtr /* context */, bool /*created_from_ddl*/){ return create_layout(a, b, c, d, std::move(e), DictionaryKeyType::simple, /* sparse = */ true); }, false); + [=](auto && a, auto && b, auto && c, auto && d, DictionarySourcePtr e, ContextPtr /* global_context */, bool /*created_from_ddl*/){ return create_layout(a, b, c, d, std::move(e), DictionaryKeyType::Simple, /* sparse = */ true); }, false); factory.registerLayout("complex_key_hashed", - [=](auto && a, auto && b, auto && c, auto && d, DictionarySourcePtr e, ContextPtr /* context */, bool /*created_from_ddl*/){ return create_layout(a, b, c, d, std::move(e), DictionaryKeyType::complex, /* sparse = */ false); }, true); + [=](auto && a, auto && b, auto && c, auto && d, DictionarySourcePtr e, ContextPtr /* global_context */, bool /*created_from_ddl*/){ return create_layout(a, b, c, d, std::move(e), DictionaryKeyType::Complex, /* sparse = */ false); }, true); factory.registerLayout("complex_key_sparse_hashed", - [=](auto && a, auto && b, auto && c, auto && d, DictionarySourcePtr e, ContextPtr /* context */, bool /*created_from_ddl*/){ return create_layout(a, b, c, d, std::move(e), DictionaryKeyType::complex, /* sparse = */ true); }, true); + [=](auto && a, auto && b, auto && c, auto && d, DictionarySourcePtr e, ContextPtr /* global_context */, bool /*created_from_ddl*/){ return create_layout(a, b, c, d, std::move(e), DictionaryKeyType::Complex, /* sparse = */ true); }, true); } diff --git a/src/Dictionaries/HashedDictionary.h b/src/Dictionaries/HashedDictionary.h index 33c5fbf98bf..d1e1f681fa1 100644 --- a/src/Dictionaries/HashedDictionary.h +++ b/src/Dictionaries/HashedDictionary.h @@ -5,7 +5,7 @@ #include #include -#include +#include #include #include @@ -35,8 +35,7 @@ template class HashedDictionary final : public IDictionary { public: - using KeyType = std::conditional_t; - static_assert(dictionary_key_type != DictionaryKeyType::range, "Range key type is not supported by hashed dictionary"); + using KeyType = std::conditional_t; HashedDictionary( const StorageID & dict_id_, @@ -47,11 +46,11 @@ public: std::string getTypeName() const override { - if constexpr (dictionary_key_type == DictionaryKeyType::simple && sparse) + if constexpr (dictionary_key_type == DictionaryKeyType::Simple && sparse) return "SparseHashed"; - else if constexpr (dictionary_key_type == DictionaryKeyType::simple && !sparse) + else if constexpr (dictionary_key_type == DictionaryKeyType::Simple && !sparse) return "Hashed"; - else if constexpr (dictionary_key_type == DictionaryKeyType::complex && sparse) + else if constexpr (dictionary_key_type == DictionaryKeyType::Complex && sparse) return "ComplexKeySparseHashed"; else return "ComplexKeyHashed"; @@ -102,7 +101,7 @@ public: ColumnUInt8::Ptr hasKeys(const Columns & key_columns, const DataTypes & key_types) const override; - bool hasHierarchy() const override { return dictionary_key_type == DictionaryKeyType::simple && dict_struct.hierarchical_attribute_index.has_value(); } + bool hasHierarchy() const override { return dictionary_key_type == DictionaryKeyType::Simple && dict_struct.hierarchical_attribute_index.has_value(); } ColumnPtr getHierarchy(ColumnPtr key_column, const DataTypePtr & hierarchy_attribute_type) const override; @@ -121,21 +120,13 @@ public: private: template using CollectionTypeNonSparse = std::conditional_t< - dictionary_key_type == DictionaryKeyType::simple, + dictionary_key_type == DictionaryKeyType::Simple, HashMap, HashMapWithSavedHash>>; -#if !defined(ARCADIA_BUILD) - template - using SparseHashMap = google::sparse_hash_map>; -#else - template - using SparseHashMap = google::sparsehash::sparse_hash_map>; -#endif - template using CollectionTypeSparse = std::conditional_t< - dictionary_key_type == DictionaryKeyType::simple, + dictionary_key_type == DictionaryKeyType::Simple, SparseHashMap, SparseHashMap>; @@ -219,10 +210,10 @@ private: Arena complex_key_arena; }; -extern template class HashedDictionary; -extern template class HashedDictionary; +extern template class HashedDictionary; +extern template class HashedDictionary; -extern template class HashedDictionary; -extern template class HashedDictionary; +extern template class HashedDictionary; +extern template class HashedDictionary; } diff --git a/src/Dictionaries/IDictionary.h b/src/Dictionaries/IDictionary.h index f9e0223a698..d7778cc0022 100644 --- a/src/Dictionaries/IDictionary.h +++ b/src/Dictionaries/IDictionary.h @@ -33,15 +33,20 @@ using DictionaryPtr = std::unique_ptr; * Simple is for dictionaries that support UInt64 key column. * * Complex is for dictionaries that support any combination of key columns. - * - * Range is for dictionary that support combination of UInt64 key column, - * and numeric representable range key column. */ enum class DictionaryKeyType { - simple, - complex, - range + Simple, + Complex +}; + +/** DictionarySpecialKeyType provides IDictionary client information about + * which special key type is supported by dictionary. + */ +enum class DictionarySpecialKeyType +{ + None, + Range }; /** @@ -56,6 +61,7 @@ struct IDictionary : public IExternalLoadable } const std::string & getFullName() const{ return full_name; } + StorageID getDictionaryID() const { std::lock_guard lock{name_mutex}; @@ -109,6 +115,8 @@ struct IDictionary : public IExternalLoadable */ virtual DictionaryKeyType getKeyType() const = 0; + virtual DictionarySpecialKeyType getSpecialKeyType() const { return DictionarySpecialKeyType::None;} + /** Subclass must validate key columns and keys types * and return column representation of dictionary attribute. * diff --git a/src/Dictionaries/IPAddressDictionary.cpp b/src/Dictionaries/IPAddressDictionary.cpp index fbe911c1d49..b688362d048 100644 --- a/src/Dictionaries/IPAddressDictionary.cpp +++ b/src/Dictionaries/IPAddressDictionary.cpp @@ -954,7 +954,7 @@ void registerDictionaryTrie(DictionaryFactory & factory) const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, DictionarySourcePtr source_ptr, - ContextPtr /* context */, + ContextPtr /* global_context */, bool /*created_from_ddl*/) -> DictionaryPtr { if (!dict_struct.key || dict_struct.key->size() != 1) diff --git a/src/Dictionaries/IPAddressDictionary.h b/src/Dictionaries/IPAddressDictionary.h index 94946e41ff8..4aba70dd14f 100644 --- a/src/Dictionaries/IPAddressDictionary.h +++ b/src/Dictionaries/IPAddressDictionary.h @@ -64,10 +64,10 @@ public: bool isInjective(const std::string & attribute_name) const override { - return dict_struct.attributes[&getAttribute(attribute_name) - attributes.data()].injective; + return dict_struct.getAttribute(attribute_name).injective; } - DictionaryKeyType getKeyType() const override { return DictionaryKeyType::complex; } + DictionaryKeyType getKeyType() const override { return DictionaryKeyType::Complex; } ColumnPtr getColumn( const std::string& attribute_name, diff --git a/src/Dictionaries/LibraryDictionarySource.cpp b/src/Dictionaries/LibraryDictionarySource.cpp index 288abde8788..2a47d4c9172 100644 --- a/src/Dictionaries/LibraryDictionarySource.cpp +++ b/src/Dictionaries/LibraryDictionarySource.cpp @@ -41,10 +41,13 @@ LibraryDictionarySource::LibraryDictionarySource( , sample_block{sample_block_} , context(Context::createCopy(context_)) { - if (fs::path(path).is_relative()) - path = fs::canonical(path); + bool path_checked = false; + if (fs::is_symlink(path)) + path_checked = symlinkStartsWith(path, context->getDictionariesLibPath()); + else + path_checked = pathStartsWith(path, context->getDictionariesLibPath()); - if (created_from_ddl && !pathStartsWith(path, context->getDictionariesLibPath())) + if (created_from_ddl && !path_checked) throw Exception(ErrorCodes::PATH_ACCESS_DENIED, "File path {} is not inside {}", path, context->getDictionariesLibPath()); if (!fs::exists(path)) @@ -183,11 +186,11 @@ void registerDictionarySourceLibrary(DictionarySourceFactory & factory) const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, Block & sample_block, - ContextPtr context, + ContextPtr global_context, const std::string & /* default_database */, bool created_from_ddl) -> DictionarySourcePtr { - return std::make_unique(dict_struct, config, config_prefix + ".library", sample_block, context, created_from_ddl); + return std::make_unique(dict_struct, config, config_prefix + ".library", sample_block, global_context, created_from_ddl); }; factory.registerSource("library", create_table_source); diff --git a/src/Dictionaries/MongoDBDictionarySource.cpp b/src/Dictionaries/MongoDBDictionarySource.cpp index a3c5119ade1..23ea9bc00e2 100644 --- a/src/Dictionaries/MongoDBDictionarySource.cpp +++ b/src/Dictionaries/MongoDBDictionarySource.cpp @@ -50,7 +50,7 @@ void registerDictionarySourceMongoDB(DictionarySourceFactory & factory) // Poco/MongoDB/BSONWriter.h:54: void writeCString(const std::string & value); // src/IO/WriteHelpers.h:146 #define writeCString(s, buf) #include -#include +#include namespace DB diff --git a/src/Dictionaries/MySQLDictionarySource.cpp b/src/Dictionaries/MySQLDictionarySource.cpp index 2eebb6970d0..bd53c1e60a7 100644 --- a/src/Dictionaries/MySQLDictionarySource.cpp +++ b/src/Dictionaries/MySQLDictionarySource.cpp @@ -31,11 +31,11 @@ void registerDictionarySourceMysql(DictionarySourceFactory & factory) [[maybe_unused]] const Poco::Util::AbstractConfiguration & config, [[maybe_unused]] const std::string & config_prefix, [[maybe_unused]] Block & sample_block, - [[maybe_unused]] ContextPtr context, + [[maybe_unused]] ContextPtr global_context, const std::string & /* default_database */, bool /* created_from_ddl */) -> DictionarySourcePtr { #if USE_MYSQL - StreamSettings mysql_input_stream_settings(context->getSettingsRef() + StreamSettings mysql_input_stream_settings(global_context->getSettingsRef() , config.getBool(config_prefix + ".mysql.close_connection", false) || config.getBool(config_prefix + ".mysql.share_connection", false) , false , config.getBool(config_prefix + ".mysql.fail_on_connection_loss", false) ? 1 : default_num_tries_on_connection_loss); diff --git a/src/Dictionaries/MySQLDictionarySource.h b/src/Dictionaries/MySQLDictionarySource.h index afa6aa61d28..66c3f216e07 100644 --- a/src/Dictionaries/MySQLDictionarySource.h +++ b/src/Dictionaries/MySQLDictionarySource.h @@ -12,7 +12,7 @@ # include "DictionaryStructure.h" # include "ExternalQueryBuilder.h" # include "IDictionarySource.h" -# include +# include namespace Poco { diff --git a/src/Dictionaries/PolygonDictionary.h b/src/Dictionaries/PolygonDictionary.h index 32771be4b16..9ab82890c49 100644 --- a/src/Dictionaries/PolygonDictionary.h +++ b/src/Dictionaries/PolygonDictionary.h @@ -86,7 +86,7 @@ public: bool isInjective(const std::string & attribute_name) const override { return dict_struct.getAttribute(attribute_name).injective; } - DictionaryKeyType getKeyType() const override { return DictionaryKeyType::complex; } + DictionaryKeyType getKeyType() const override { return DictionaryKeyType::Complex; } ColumnPtr getColumn( const std::string& attribute_name, diff --git a/src/Dictionaries/PolygonDictionaryImplementations.cpp b/src/Dictionaries/PolygonDictionaryImplementations.cpp index 7c3eb421a4a..72869ad57ba 100644 --- a/src/Dictionaries/PolygonDictionaryImplementations.cpp +++ b/src/Dictionaries/PolygonDictionaryImplementations.cpp @@ -167,7 +167,7 @@ DictionaryPtr createLayout(const std::string & , const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, DictionarySourcePtr source_ptr, - ContextPtr /* context */, + ContextPtr /* global_context */, bool /*created_from_ddl*/) { const String database = config.getString(config_prefix + ".database", ""); diff --git a/src/Dictionaries/PostgreSQLDictionarySource.cpp b/src/Dictionaries/PostgreSQLDictionarySource.cpp index 21b8809bc85..3fe9e899cd9 100644 --- a/src/Dictionaries/PostgreSQLDictionarySource.cpp +++ b/src/Dictionaries/PostgreSQLDictionarySource.cpp @@ -7,7 +7,7 @@ #if USE_LIBPQXX #include #include -#include +#include #include "readInvalidateQuery.h" #include #endif @@ -182,7 +182,7 @@ void registerDictionarySourcePostgreSQL(DictionarySourceFactory & factory) const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, Block & sample_block, - ContextPtr context, + ContextPtr global_context, const std::string & /* default_database */, bool /* created_from_ddl */) -> DictionarySourcePtr { @@ -190,8 +190,8 @@ void registerDictionarySourcePostgreSQL(DictionarySourceFactory & factory) const auto settings_config_prefix = config_prefix + ".postgresql"; auto pool = std::make_shared( config, settings_config_prefix, - context->getSettingsRef().postgresql_connection_pool_size, - context->getSettingsRef().postgresql_connection_pool_wait_timeout); + global_context->getSettingsRef().postgresql_connection_pool_size, + global_context->getSettingsRef().postgresql_connection_pool_wait_timeout); PostgreSQLDictionarySource::Configuration configuration { @@ -211,7 +211,7 @@ void registerDictionarySourcePostgreSQL(DictionarySourceFactory & factory) (void)config; (void)config_prefix; (void)sample_block; - (void)context; + (void)global_context; throw Exception(ErrorCodes::SUPPORT_IS_DISABLED, "Dictionary source of type `postgresql` is disabled because ClickHouse was built without postgresql support."); #endif diff --git a/src/Dictionaries/RangeDictionarySource.h b/src/Dictionaries/RangeDictionarySource.h index d4fce32a54f..dcc5b1ea3b8 100644 --- a/src/Dictionaries/RangeDictionarySource.h +++ b/src/Dictionaries/RangeDictionarySource.h @@ -14,170 +14,204 @@ namespace DB { -template +template class RangeDictionarySourceData { public: - using Key = UInt64; + + using KeyType = std::conditional_t; RangeDictionarySourceData( std::shared_ptr dictionary, const Names & column_names, - PaddedPODArray && ids_to_fill, + PaddedPODArray && keys, PaddedPODArray && start_dates, PaddedPODArray && end_dates); Block getBlock(size_t start, size_t length) const; - size_t getNumRows() const { return ids.size(); } + size_t getNumRows() const { return keys.size(); } private: Block fillBlock( - const PaddedPODArray & ids_to_fill, + const PaddedPODArray & keys_to_fill, const PaddedPODArray & block_start_dates, - const PaddedPODArray & block_end_dates) const; + const PaddedPODArray & block_end_dates, + size_t start, + size_t end) const; - PaddedPODArray makeDateKey( + PaddedPODArray makeDateKeys( const PaddedPODArray & block_start_dates, const PaddedPODArray & block_end_dates) const; std::shared_ptr dictionary; NameSet column_names; - PaddedPODArray ids; + PaddedPODArray keys; PaddedPODArray start_dates; PaddedPODArray end_dates; }; -template -RangeDictionarySourceData::RangeDictionarySourceData( +template +RangeDictionarySourceData::RangeDictionarySourceData( std::shared_ptr dictionary_, const Names & column_names_, - PaddedPODArray && ids_, + PaddedPODArray && keys, PaddedPODArray && block_start_dates, PaddedPODArray && block_end_dates) : dictionary(dictionary_) , column_names(column_names_.begin(), column_names_.end()) - , ids(std::move(ids_)) + , keys(std::move(keys)) , start_dates(std::move(block_start_dates)) , end_dates(std::move(block_end_dates)) { } -template -Block RangeDictionarySourceData::getBlock(size_t start, size_t length) const +template +Block RangeDictionarySourceData::getBlock(size_t start, size_t length) const { - PaddedPODArray block_ids; + PaddedPODArray block_keys; PaddedPODArray block_start_dates; PaddedPODArray block_end_dates; - block_ids.reserve(length); + block_keys.reserve(length); block_start_dates.reserve(length); block_end_dates.reserve(length); - for (auto idx : collections::range(start, start + length)) + for (size_t index = start; index < start + length; ++index) { - block_ids.push_back(ids[idx]); - block_start_dates.push_back(start_dates[idx]); - block_end_dates.push_back(end_dates[idx]); + block_keys.push_back(keys[index]); + block_start_dates.push_back(start_dates[index]); + block_end_dates.push_back(end_dates[index]); } - return fillBlock(block_ids, block_start_dates, block_end_dates); + return fillBlock(block_keys, block_start_dates, block_end_dates, start, start + length); } -template -PaddedPODArray RangeDictionarySourceData::makeDateKey( - const PaddedPODArray & block_start_dates, const PaddedPODArray & block_end_dates) const -{ - PaddedPODArray key(block_start_dates.size()); - for (size_t i = 0; i < key.size(); ++i) - { - if (RangeHashedDictionary::Range::isCorrectDate(block_start_dates[i])) - key[i] = block_start_dates[i]; - else - key[i] = block_end_dates[i]; - } - - return key; -} - - -template -Block RangeDictionarySourceData::fillBlock( - const PaddedPODArray & ids_to_fill, +template +PaddedPODArray RangeDictionarySourceData::makeDateKeys( const PaddedPODArray & block_start_dates, const PaddedPODArray & block_end_dates) const +{ + PaddedPODArray keys(block_start_dates.size()); + + for (size_t i = 0; i < keys.size(); ++i) + { + if (Range::isCorrectDate(block_start_dates[i])) + keys[i] = block_start_dates[i]; + else + keys[i] = block_end_dates[i]; + } + + return keys; +} + + +template +Block RangeDictionarySourceData::fillBlock( + const PaddedPODArray & keys_to_fill, + const PaddedPODArray & block_start_dates, + const PaddedPODArray & block_end_dates, + size_t start, + size_t end) const { ColumnsWithTypeAndName columns; - const DictionaryStructure & structure = dictionary->getStructure(); + const DictionaryStructure & dictionary_structure = dictionary->getStructure(); - auto ids_column = getColumnFromPODArray(ids_to_fill); - const std::string & id_column_name = structure.id->name; - if (column_names.find(id_column_name) != column_names.end()) - columns.emplace_back(ids_column, std::make_shared(), id_column_name); + DataTypes keys_types; + Columns keys_columns; + Strings keys_names = dictionary_structure.getKeysNames(); - auto date_key = makeDateKey(block_start_dates, block_end_dates); + if constexpr (dictionary_key_type == DictionaryKeyType::Simple) + { + keys_columns = {getColumnFromPODArray(keys_to_fill)}; + keys_types = {std::make_shared()}; + } + else + { + for (const auto & attribute : *dictionary_structure.key) + keys_types.emplace_back(attribute.type); + + auto deserialized_columns = deserializeColumnsFromKeys(dictionary_structure, keys, start, end); + for (auto & deserialized_column : deserialized_columns) + keys_columns.emplace_back(std::move(deserialized_column)); + } + + size_t keys_size = keys_names.size(); + + assert(keys_columns.size() == keys_size); + assert(keys_types.size() == keys_size); + + for (size_t i = 0; i < keys_size; ++i) + { + auto & key_name = keys_names[i]; + + if (column_names.find(key_name) != column_names.end()) + columns.emplace_back(keys_columns[i], keys_types[i], key_name); + } + + auto date_key = makeDateKeys(block_start_dates, block_end_dates); auto date_column = getColumnFromPODArray(date_key); + keys_columns.emplace_back(std::move(date_column)); + keys_types.emplace_back(std::make_shared()); - const std::string & range_min_column_name = structure.range_min->name; + const auto & range_min_column_name = dictionary_structure.range_min->name; if (column_names.find(range_min_column_name) != column_names.end()) { auto range_min_column = getColumnFromPODArray(block_start_dates); - columns.emplace_back(range_min_column, structure.range_max->type, range_min_column_name); + columns.emplace_back(range_min_column, dictionary_structure.range_max->type, range_min_column_name); } - const std::string & range_max_column_name = structure.range_max->name; + const auto & range_max_column_name = dictionary_structure.range_max->name; if (column_names.find(range_max_column_name) != column_names.end()) { auto range_max_column = getColumnFromPODArray(block_end_dates); - columns.emplace_back(range_max_column, structure.range_max->type, range_max_column_name); + columns.emplace_back(range_max_column, dictionary_structure.range_max->type, range_max_column_name); } - for (const auto idx : collections::range(0, structure.attributes.size())) + size_t attributes_size = dictionary_structure.attributes.size(); + for (size_t attribute_index = 0; attribute_index < attributes_size; ++attribute_index) { - const DictionaryAttribute & attribute = structure.attributes[idx]; - if (column_names.find(attribute.name) != column_names.end()) - { - ColumnPtr column = dictionary->getColumn( - attribute.name, - attribute.type, - {ids_column, date_column}, - {std::make_shared(), std::make_shared()}, - nullptr); - columns.emplace_back(column, attribute.type, attribute.name); - } + const auto & attribute = dictionary_structure.attributes[attribute_index]; + if (column_names.find(attribute.name) == column_names.end()) + continue; + + auto column = dictionary->getColumn( + attribute.name, + attribute.type, + keys_columns, + keys_types, + nullptr /* default_values_column*/); + + columns.emplace_back(std::move(column), attribute.type, attribute.name); } + return Block(columns); } -/* - * BlockInputStream implementation for external dictionaries - * read() returns single block consisting of the in-memory contents of the dictionaries - */ -template +template class RangeDictionarySource : public DictionarySourceBase { public: - using Key = UInt64; - RangeDictionarySource(RangeDictionarySourceData data_, size_t max_block_size); + RangeDictionarySource(RangeDictionarySourceData data_, size_t max_block_size); String getName() const override { return "RangeDictionarySource"; } protected: Block getBlock(size_t start, size_t length) const override; - RangeDictionarySourceData data; + RangeDictionarySourceData data; }; -template -RangeDictionarySource::RangeDictionarySource(RangeDictionarySourceData data_, size_t max_block_size) +template +RangeDictionarySource::RangeDictionarySource(RangeDictionarySourceData data_, size_t max_block_size) : DictionarySourceBase(data_.getBlock(0, 0), data_.getNumRows(), max_block_size) , data(std::move(data_)) { } -template -Block RangeDictionarySource::getBlock(size_t start, size_t length) const +template +Block RangeDictionarySource::getBlock(size_t start, size_t length) const { return data.getBlock(start, length); } diff --git a/src/Dictionaries/RangeHashedDictionary.cpp b/src/Dictionaries/RangeHashedDictionary.cpp index bbd70b51437..390871661c7 100644 --- a/src/Dictionaries/RangeHashedDictionary.cpp +++ b/src/Dictionaries/RangeHashedDictionary.cpp @@ -10,7 +10,8 @@ namespace { -using RangeStorageType = DB::RangeHashedDictionary::RangeStorageType; + +using RangeStorageType = DB::RangeStorageType; // Null values mean that specified boundary, either min or max is not set on range. // To simplify comparison, null value of min bound should be bigger than any other value, @@ -25,7 +26,7 @@ RangeStorageType getColumnIntValueOrDefault(const DB::IColumn & column, size_t i return default_value; const RangeStorageType result = static_cast(column.getInt(index)); - if (isDate && !DB::RangeHashedDictionary::Range::isCorrectDate(result)) + if (isDate && !DB::Range::isCorrectDate(result)) return default_value; return result; @@ -50,27 +51,26 @@ namespace ErrorCodes extern const int LOGICAL_ERROR; extern const int BAD_ARGUMENTS; extern const int DICTIONARY_IS_EMPTY; - extern const int TYPE_MISMATCH; extern const int UNSUPPORTED_METHOD; } -bool RangeHashedDictionary::Range::isCorrectDate(const RangeStorageType & date) +bool Range::isCorrectDate(const RangeStorageType & date) { return 0 < date && date <= DATE_LUT_MAX_DAY_NUM; } -bool RangeHashedDictionary::Range::contains(const RangeStorageType & value) const +bool Range::contains(const RangeStorageType & value) const { return left <= value && value <= right; } -static bool operator<(const RangeHashedDictionary::Range & left, const RangeHashedDictionary::Range & right) +static bool operator<(const Range & left, const Range & right) { return std::tie(left.left, left.right) < std::tie(right.left, right.right); } - -RangeHashedDictionary::RangeHashedDictionary( +template +RangeHashedDictionary::RangeHashedDictionary( const StorageID & dict_id_, const DictionaryStructure & dict_struct_, DictionarySourcePtr source_ptr_, @@ -87,29 +87,35 @@ RangeHashedDictionary::RangeHashedDictionary( calculateBytesAllocated(); } -ColumnPtr RangeHashedDictionary::getColumn( +template +ColumnPtr RangeHashedDictionary::getColumn( const std::string & attribute_name, const DataTypePtr & result_type, const Columns & key_columns, const DataTypes & key_types, const ColumnPtr & default_values_column) const { + if (dictionary_key_type == DictionaryKeyType::Complex) + { + auto key_types_copy = key_types; + key_types_copy.pop_back(); + dict_struct.validateKeyTypes(key_types_copy); + } + ColumnPtr result; - const auto & attribute = getAttribute(attribute_name); const auto & dictionary_attribute = dict_struct.getAttribute(attribute_name, result_type); - - auto keys_size = key_columns.front()->size(); + const size_t attribute_index = dict_struct.attribute_name_to_index.find(attribute_name)->second; + const auto & attribute = attributes[attribute_index]; /// Cast second column to storage type Columns modified_key_columns = key_columns; - - auto range_storage_column = key_columns[1]; - ColumnWithTypeAndName column_to_cast = {range_storage_column->convertToFullColumnIfConst(), key_types[1], ""}; - + auto range_storage_column = key_columns.back(); + ColumnWithTypeAndName column_to_cast = {range_storage_column->convertToFullColumnIfConst(), key_types.back(), ""}; auto range_column_storage_type = std::make_shared(); - modified_key_columns[1] = castColumnAccurate(column_to_cast, range_column_storage_type); + modified_key_columns.back() = castColumnAccurate(column_to_cast, range_column_storage_type); + size_t keys_size = key_columns.front()->size(); bool is_attribute_nullable = attribute.is_nullable; ColumnUInt8::MutablePtr col_null_map_to; @@ -204,24 +210,32 @@ ColumnPtr RangeHashedDictionary::getColumn( return result; } -ColumnUInt8::Ptr RangeHashedDictionary::hasKeys(const Columns & key_columns, const DataTypes & key_types) const +template +ColumnUInt8::Ptr RangeHashedDictionary::hasKeys(const Columns & key_columns, const DataTypes & key_types) const { - auto range_storage_column = key_columns[1]; - ColumnWithTypeAndName column_to_cast = {range_storage_column->convertToFullColumnIfConst(), key_types[1], ""}; - + if (dictionary_key_type == DictionaryKeyType::Complex) + { + auto key_types_copy = key_types; + key_types_copy.pop_back(); + dict_struct.validateKeyTypes(key_types_copy); + } auto range_column_storage_type = std::make_shared(); + auto range_storage_column = key_columns.back(); + ColumnWithTypeAndName column_to_cast = {range_storage_column->convertToFullColumnIfConst(), key_types.back(), ""}; auto range_column_updated = castColumnAccurate(column_to_cast, range_column_storage_type); - - PaddedPODArray key_backup_storage; PaddedPODArray range_backup_storage; - - const PaddedPODArray & ids = getColumnVectorData(this, key_columns[0], key_backup_storage); const PaddedPODArray & dates = getColumnVectorData(this, range_column_updated, range_backup_storage); + auto key_columns_copy = key_columns; + key_columns_copy.pop_back(); + DictionaryKeysArenaHolder arena_holder; + DictionaryKeysExtractor keys_extractor(key_columns_copy, arena_holder.getComplexKeyArena()); + const size_t keys_size = keys_extractor.getKeysSize(); + const auto & attribute = attributes.front(); - ColumnUInt8::Ptr result; - + auto result = ColumnUInt8::create(keys_size); + auto & out = result->getData(); size_t keys_found = 0; auto type_call = [&](const auto & dictionary_attribute_type) @@ -229,58 +243,48 @@ ColumnUInt8::Ptr RangeHashedDictionary::hasKeys(const Columns & key_columns, con using Type = std::decay_t; using AttributeType = typename Type::AttributeType; using ValueType = DictionaryValueType; - result = hasKeysImpl(attribute, ids, dates, keys_found); + + const auto & collection = std::get>(attribute.maps); + + for (size_t key_index = 0; key_index < keys_size; ++key_index) + { + const auto key = keys_extractor.extractCurrentKey(); + const auto it = collection.find(key); + + if (it) + { + const auto date = dates[key_index]; + const auto & ranges_and_values = it->getMapped(); + const auto val_it = std::find_if( + std::begin(ranges_and_values), + std::end(ranges_and_values), + [date](const Value & v) + { + return v.range.contains(date); + }); + + out[key_index] = val_it != std::end(ranges_and_values); + keys_found += out[key_index]; + } + else + { + out[key_index] = false; + } + + keys_extractor.rollbackCurrentKey(); + } }; callOnDictionaryAttributeType(attribute.type, type_call); - query_count.fetch_add(ids.size(), std::memory_order_relaxed); + query_count.fetch_add(keys_size, std::memory_order_relaxed); found_count.fetch_add(keys_found, std::memory_order_relaxed); return result; } -template -ColumnUInt8::Ptr RangeHashedDictionary::hasKeysImpl( - const Attribute & attribute, - const PaddedPODArray & ids, - const PaddedPODArray & dates, - size_t & keys_found) const -{ - auto result = ColumnUInt8::create(ids.size()); - auto& out = result->getData(); - - const auto & attr = *std::get>(attribute.maps); - - keys_found = 0; - - for (const auto row : collections::range(0, ids.size())) - { - const auto it = attr.find(ids[row]); - - if (it) - { - const auto date = dates[row]; - const auto & ranges_and_values = it->getMapped(); - const auto val_it = std::find_if( - std::begin(ranges_and_values), - std::end(ranges_and_values), - [date](const Value & v) - { - return v.range.contains(date); - }); - - out[row] = val_it != std::end(ranges_and_values); - keys_found += out[row]; - } - else - out[row] = false; - } - - return result; -} - -void RangeHashedDictionary::createAttributes() +template +void RangeHashedDictionary::createAttributes() { const auto size = dict_struct.attributes.size(); attributes.reserve(size); @@ -296,7 +300,8 @@ void RangeHashedDictionary::createAttributes() } } -void RangeHashedDictionary::loadData() +template +void RangeHashedDictionary::loadData() { QueryPipeline pipeline; pipeline.init(source_ptr->loadAll()); @@ -305,39 +310,60 @@ void RangeHashedDictionary::loadData() Block block; while (executor.pull(block)) { - const auto & id_column = *block.safeGetByPosition(0).column; + size_t skip_keys_size_offset = dict_struct.getKeysSize(); + + Columns key_columns; + key_columns.reserve(skip_keys_size_offset); + + /// Split into keys columns and attribute columns + for (size_t i = 0; i < skip_keys_size_offset; ++i) + key_columns.emplace_back(block.safeGetByPosition(i).column); + + DictionaryKeysArenaHolder arena_holder; + DictionaryKeysExtractor keys_extractor(key_columns, arena_holder.getComplexKeyArena()); + const size_t keys_size = keys_extractor.getKeysSize(); + + element_count += keys_size; // Support old behaviour, where invalid date means 'open range'. const bool is_date = isDate(dict_struct.range_min->type); - const auto & min_range_column = unwrapNullableColumn(*block.safeGetByPosition(1).column); - const auto & max_range_column = unwrapNullableColumn(*block.safeGetByPosition(2).column); + const auto & min_range_column = unwrapNullableColumn(*block.safeGetByPosition(skip_keys_size_offset).column); + const auto & max_range_column = unwrapNullableColumn(*block.safeGetByPosition(skip_keys_size_offset + 1).column); - element_count += id_column.size(); + skip_keys_size_offset += 2; - for (const auto attribute_idx : collections::range(0, attributes.size())) + for (size_t attribute_index = 0; attribute_index < attributes.size(); ++attribute_index) { - const auto & attribute_column = *block.safeGetByPosition(attribute_idx + 3).column; - auto & attribute = attributes[attribute_idx]; + const auto & attribute_column = *block.safeGetByPosition(attribute_index + skip_keys_size_offset).column; + auto & attribute = attributes[attribute_index]; - for (const auto row_idx : collections::range(0, id_column.size())) + for (size_t key_index = 0; key_index < keys_size; ++key_index) { + auto key = keys_extractor.extractCurrentKey(); + RangeStorageType lower_bound; RangeStorageType upper_bound; if (is_date) { - lower_bound = getColumnIntValueOrDefault(min_range_column, row_idx, is_date, 0); - upper_bound = getColumnIntValueOrDefault(max_range_column, row_idx, is_date, DATE_LUT_MAX_DAY_NUM + 1); + lower_bound = getColumnIntValueOrDefault(min_range_column, key_index, is_date, 0); + upper_bound = getColumnIntValueOrDefault(max_range_column, key_index, is_date, DATE_LUT_MAX_DAY_NUM + 1); } else { - lower_bound = getColumnIntValueOrDefault(min_range_column, row_idx, is_date, RANGE_MIN_NULL_VALUE); - upper_bound = getColumnIntValueOrDefault(max_range_column, row_idx, is_date, RANGE_MAX_NULL_VALUE); + lower_bound = getColumnIntValueOrDefault(min_range_column, key_index, is_date, RANGE_MIN_NULL_VALUE); + upper_bound = getColumnIntValueOrDefault(max_range_column, key_index, is_date, RANGE_MAX_NULL_VALUE); } - setAttributeValue(attribute, id_column.getUInt(row_idx), Range{lower_bound, upper_bound}, attribute_column[row_idx]); + if constexpr (std::is_same_v) + key = copyKeyInArena(key); + + setAttributeValue(attribute, key, Range{lower_bound, upper_bound}, attribute_column[key_index]); + keys_extractor.rollbackCurrentKey(); } + + keys_extractor.reset(); } } @@ -346,22 +372,8 @@ void RangeHashedDictionary::loadData() "{}: dictionary source is empty and 'require_nonempty' property is set."); } -template -void RangeHashedDictionary::addAttributeSize(const Attribute & attribute) -{ - const auto & map_ref = std::get>(attribute.maps); - bytes_allocated += sizeof(Collection) + map_ref->getBufferSizeInBytes(); - bucket_count = map_ref->getBufferSizeInCells(); -} - -template <> -void RangeHashedDictionary::addAttributeSize(const Attribute & attribute) -{ - addAttributeSize(attribute); - bytes_allocated += sizeof(Arena) + attribute.string_arena->size(); -} - -void RangeHashedDictionary::calculateBytesAllocated() +template +void RangeHashedDictionary::calculateBytesAllocated() { bytes_allocated += attributes.size() * sizeof(attributes.front()); @@ -371,14 +383,25 @@ void RangeHashedDictionary::calculateBytesAllocated() { using Type = std::decay_t; using AttributeType = typename Type::AttributeType; - addAttributeSize(attribute); + using ValueType = DictionaryValueType; + + const auto & collection = std::get>(attribute.maps); + bytes_allocated += sizeof(CollectionType) + collection.getBufferSizeInBytes(); + bucket_count = collection.getBufferSizeInCells(); + + if constexpr (std::is_same_v) + bytes_allocated += sizeof(Arena) + attribute.string_arena->size(); }; callOnDictionaryAttributeType(attribute.type, type_call); } + + if constexpr (dictionary_key_type == DictionaryKeyType::Complex) + bytes_allocated += complex_key_arena.size(); } -RangeHashedDictionary::Attribute RangeHashedDictionary::createAttribute(const DictionaryAttribute & dictionary_attribute) +template +typename RangeHashedDictionary::Attribute RangeHashedDictionary::createAttribute(const DictionaryAttribute & dictionary_attribute) { Attribute attribute{dictionary_attribute.underlying_type, dictionary_attribute.is_nullable, {}, {}}; @@ -391,7 +414,7 @@ RangeHashedDictionary::Attribute RangeHashedDictionary::createAttribute(const Di if constexpr (std::is_same_v) attribute.string_arena = std::make_unique(); - attribute.maps = std::make_unique>(); + attribute.maps = CollectionType(); }; callOnDictionaryAttributeType(dictionary_attribute.underlying_type, type_call); @@ -399,29 +422,35 @@ RangeHashedDictionary::Attribute RangeHashedDictionary::createAttribute(const Di return attribute; } +template template -void RangeHashedDictionary::getItemsImpl( +void RangeHashedDictionary::getItemsImpl( const Attribute & attribute, const Columns & key_columns, ValueSetter && set_value, DefaultValueExtractor & default_value_extractor) const { - PaddedPODArray key_backup_storage; - PaddedPODArray range_backup_storage; - - const PaddedPODArray & ids = getColumnVectorData(this, key_columns[0], key_backup_storage); - const PaddedPODArray & dates = getColumnVectorData(this, key_columns[1], range_backup_storage); - - const auto & attr = *std::get>(attribute.maps); + const auto & collection = std::get>(attribute.maps); size_t keys_found = 0; - for (const auto row : collections::range(0, ids.size())) + PaddedPODArray range_backup_storage; + const auto & dates = getColumnVectorData(this, key_columns.back(), range_backup_storage); + + auto key_columns_copy = key_columns; + key_columns_copy.pop_back(); + DictionaryKeysArenaHolder arena_holder; + DictionaryKeysExtractor keys_extractor(key_columns_copy, arena_holder.getComplexKeyArena()); + const size_t keys_size = keys_extractor.getKeysSize(); + + for (size_t key_index = 0; key_index < keys_size; ++key_index) { - const auto it = attr.find(ids[row]); + auto key = keys_extractor.extractCurrentKey(); + const auto it = collection.find(key); + if (it) { - const auto date = dates[row]; + const auto date = dates[key_index]; const auto & ranges_and_values = it->getMapped(); const auto val_it = std::find_if( std::begin(ranges_and_values), @@ -439,35 +468,38 @@ void RangeHashedDictionary::getItemsImpl( if constexpr (is_nullable) { if (value.has_value()) - set_value(row, *value, false); + set_value(key_index, *value, false); else - set_value(row, default_value_extractor[row], true); + set_value(key_index, default_value_extractor[key_index], true); } else { - set_value(row, *value, false); + set_value(key_index, *value, false); } + keys_extractor.rollbackCurrentKey(); continue; } } if constexpr (is_nullable) - set_value(row, default_value_extractor[row], default_value_extractor.isNullAt(row)); + set_value(key_index, default_value_extractor[key_index], default_value_extractor.isNullAt(key_index)); else - set_value(row, default_value_extractor[row], false); + set_value(key_index, default_value_extractor[key_index], false); + + keys_extractor.rollbackCurrentKey(); } - query_count.fetch_add(ids.size(), std::memory_order_relaxed); + query_count.fetch_add(keys_size, std::memory_order_relaxed); found_count.fetch_add(keys_found, std::memory_order_relaxed); } - +template template -void RangeHashedDictionary::setAttributeValueImpl(Attribute & attribute, const UInt64 id, const Range & range, const Field & value) +void RangeHashedDictionary::setAttributeValueImpl(Attribute & attribute, KeyType key, const Range & range, const Field & value) { using ValueType = std::conditional_t, StringRef, T>; - auto & map = *std::get>(attribute.maps); + auto & collection = std::get>(attribute.maps); Value value_to_insert; @@ -490,61 +522,47 @@ void RangeHashedDictionary::setAttributeValueImpl(Attribute & attribute, const U } } - const auto it = map.find(id); + const auto it = collection.find(key); if (it) { auto & values = it->getMapped(); - const auto insert_it - = std::lower_bound(std::begin(values), std::end(values), range, [](const Value & lhs, const Range & rhs_range) - { - return lhs.range < rhs_range; - }); + const auto insert_it = std::lower_bound( + std::begin(values), + std::end(values), + range, + [](const Value & lhs, const Range & rhs_range) + { + return lhs.range < rhs_range; + }); values.insert(insert_it, std::move(value_to_insert)); } else - map.insert({id, Values{std::move(value_to_insert)}}); + { + collection.insert({key, Values{std::move(value_to_insert)}}); + } } -void RangeHashedDictionary::setAttributeValue(Attribute & attribute, const UInt64 id, const Range & range, const Field & value) +template +void RangeHashedDictionary::setAttributeValue(Attribute & attribute, KeyType key, const Range & range, const Field & value) { auto type_call = [&](const auto &dictionary_attribute_type) { using Type = std::decay_t; using AttributeType = typename Type::AttributeType; - setAttributeValueImpl(attribute, id, range, value); + setAttributeValueImpl(attribute, key, range, value); }; callOnDictionaryAttributeType(attribute.type, type_call); } -const RangeHashedDictionary::Attribute & RangeHashedDictionary::getAttribute(const std::string & attribute_name) const -{ - const auto it = attribute_index_by_name.find(attribute_name); - if (it == std::end(attribute_index_by_name)) - throw Exception(ErrorCodes::BAD_ARGUMENTS, "{}: no such attribute '{}'", full_name, attribute_name); - - return attributes[it->second]; -} - -const RangeHashedDictionary::Attribute & -RangeHashedDictionary::getAttributeWithType(const std::string & attribute_name, const AttributeUnderlyingType type) const -{ - const auto & attribute = getAttribute(attribute_name); - if (attribute.type != type) - throw Exception(ErrorCodes::TYPE_MISMATCH, "attribute {} has type {}", - attribute_name, - toString(attribute.type)); - - return attribute; -} - +template template -void RangeHashedDictionary::getIdsAndDates( - PaddedPODArray & ids, +void RangeHashedDictionary::getKeysAndDates( + PaddedPODArray & keys, PaddedPODArray & start_dates, PaddedPODArray & end_dates) const { @@ -556,32 +574,33 @@ void RangeHashedDictionary::getIdsAndDates( using AttributeType = typename Type::AttributeType; using ValueType = DictionaryValueType; - getIdsAndDates(attribute, ids, start_dates, end_dates); + getKeysAndDates(attribute, keys, start_dates, end_dates); }; callOnDictionaryAttributeType(attribute.type, type_call); } +template template -void RangeHashedDictionary::getIdsAndDates( +void RangeHashedDictionary::getKeysAndDates( const Attribute & attribute, - PaddedPODArray & ids, + PaddedPODArray & keys, PaddedPODArray & start_dates, PaddedPODArray & end_dates) const { - const HashMap> & attr = *std::get>(attribute.maps); + const auto & collection = std::get>(attribute.maps); - ids.reserve(attr.size()); - start_dates.reserve(attr.size()); - end_dates.reserve(attr.size()); + keys.reserve(collection.size()); + start_dates.reserve(collection.size()); + end_dates.reserve(collection.size()); const bool is_date = isDate(dict_struct.range_min->type); - for (const auto & key : attr) + for (const auto & key : collection) { for (const auto & value : key.getMapped()) { - ids.push_back(key.getKey()); + keys.push_back(key.getKey()); start_dates.push_back(value.range.left); end_dates.push_back(value.range.right); @@ -592,33 +611,43 @@ void RangeHashedDictionary::getIdsAndDates( } } - +template template -Pipe RangeHashedDictionary::readImpl(const Names & column_names, size_t max_block_size) const +Pipe RangeHashedDictionary::readImpl(const Names & column_names, size_t max_block_size) const { - PaddedPODArray ids; + PaddedPODArray keys; PaddedPODArray start_dates; PaddedPODArray end_dates; - getIdsAndDates(ids, start_dates, end_dates); + getKeysAndDates(keys, start_dates, end_dates); - using RangeDictionarySourceType = RangeDictionarySource; + using RangeDictionarySourceType = RangeDictionarySource; - auto source = std::make_shared( - RangeDictionarySourceData( - shared_from_this(), - column_names, - std::move(ids), - std::move(start_dates), - std::move(end_dates)), - max_block_size); + auto source_data = RangeDictionarySourceData( + shared_from_this(), + column_names, + std::move(keys), + std::move(start_dates), + std::move(end_dates)); + auto source = std::make_shared(std::move(source_data), max_block_size); return Pipe(source); } +template +StringRef RangeHashedDictionary::copyKeyInArena(StringRef key) +{ + size_t key_size = key.size; + char * place_for_key = complex_key_arena.alloc(key_size); + memcpy(reinterpret_cast(place_for_key), reinterpret_cast(key.data), key_size); + StringRef updated_key{place_for_key, key_size}; + return updated_key; +} + +template struct RangeHashedDictionaryCallGetSourceImpl { Pipe pipe; - const RangeHashedDictionary * dict; + const RangeHashedDictionary * dict; const Names * column_names; size_t max_block_size; @@ -627,15 +656,16 @@ struct RangeHashedDictionaryCallGetSourceImpl { const auto & type = dict->dict_struct.range_min->type; if (pipe.empty() && dynamic_cast *>(type.get())) - pipe = dict->readImpl(*column_names, max_block_size); + pipe = dict->template readImpl(*column_names, max_block_size); } }; -Pipe RangeHashedDictionary::read(const Names & column_names, size_t max_block_size) const +template +Pipe RangeHashedDictionary::read(const Names & column_names, size_t max_block_size) const { using ListType = TypeList; - RangeHashedDictionaryCallGetSourceImpl callable; + RangeHashedDictionaryCallGetSourceImpl callable; callable.dict = this; callable.column_names = &column_names; callable.max_block_size = max_block_size; @@ -653,12 +683,12 @@ Pipe RangeHashedDictionary::read(const Names & column_names, size_t max_block_si void registerDictionaryRangeHashed(DictionaryFactory & factory) { - auto create_layout = [=](const std::string & full_name, + auto create_layout_simple = [=](const std::string & full_name, const DictionaryStructure & dict_struct, const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, DictionarySourcePtr source_ptr, - ContextPtr /* context */, + ContextPtr /* global_context */, bool /*created_from_ddl*/) -> DictionaryPtr { if (dict_struct.key) @@ -672,9 +702,32 @@ void registerDictionaryRangeHashed(DictionaryFactory & factory) const auto dict_id = StorageID::fromDictionaryConfig(config, config_prefix); const DictionaryLifetime dict_lifetime{config, config_prefix + ".lifetime"}; const bool require_nonempty = config.getBool(config_prefix + ".require_nonempty", false); - return std::make_unique(dict_id, dict_struct, std::move(source_ptr), dict_lifetime, require_nonempty); + return std::make_unique>(dict_id, dict_struct, std::move(source_ptr), dict_lifetime, require_nonempty); }; - factory.registerLayout("range_hashed", create_layout, false); + factory.registerLayout("range_hashed", create_layout_simple, false); + + auto create_layout_complex = [=](const std::string & full_name, + const DictionaryStructure & dict_struct, + const Poco::Util::AbstractConfiguration & config, + const std::string & config_prefix, + DictionarySourcePtr source_ptr, + ContextPtr /* context */, + bool /*created_from_ddl*/) -> DictionaryPtr + { + if (dict_struct.id) + throw Exception(ErrorCodes::UNSUPPORTED_METHOD, "'id' is not supported for dictionary of layout 'complex_key_range_hashed'"); + + if (!dict_struct.range_min || !dict_struct.range_max) + throw Exception(ErrorCodes::BAD_ARGUMENTS, + "{}: dictionary of layout 'complex_key_range_hashed' requires .structure.range_min and .structure.range_max", + full_name); + + const auto dict_id = StorageID::fromDictionaryConfig(config, config_prefix); + const DictionaryLifetime dict_lifetime{config, config_prefix + ".lifetime"}; + const bool require_nonempty = config.getBool(config_prefix + ".require_nonempty", false); + return std::make_unique>(dict_id, dict_struct, std::move(source_ptr), dict_lifetime, require_nonempty); + }; + factory.registerLayout("complex_key_range_hashed", create_layout_complex, true); } } diff --git a/src/Dictionaries/RangeHashedDictionary.h b/src/Dictionaries/RangeHashedDictionary.h index 13fa6ad570f..4cdab66a0e4 100644 --- a/src/Dictionaries/RangeHashedDictionary.h +++ b/src/Dictionaries/RangeHashedDictionary.h @@ -16,9 +16,24 @@ namespace DB { + +using RangeStorageType = Int64; + +struct Range +{ + RangeStorageType left; + RangeStorageType right; + + static bool isCorrectDate(const RangeStorageType & date); + bool contains(const RangeStorageType & value) const; +}; + +template class RangeHashedDictionary final : public IDictionary { public: + using KeyType = std::conditional_t; + RangeHashedDictionary( const StorageID & dict_id_, const DictionaryStructure & dict_struct_, @@ -59,10 +74,12 @@ public: bool isInjective(const std::string & attribute_name) const override { - return dict_struct.attributes[&getAttribute(attribute_name) - attributes.data()].injective; + return dict_struct.getAttribute(attribute_name).injective; } - DictionaryKeyType getKeyType() const override { return DictionaryKeyType::range; } + DictionaryKeyType getKeyType() const override { return dictionary_key_type; } + + DictionarySpecialKeyType getSpecialKeyType() const override { return DictionarySpecialKeyType::Range;} ColumnPtr getColumn( const std::string& attribute_name, @@ -73,19 +90,8 @@ public: ColumnUInt8::Ptr hasKeys(const Columns & key_columns, const DataTypes & key_types) const override; - using RangeStorageType = Int64; - Pipe read(const Names & column_names, size_t max_block_size) const override; - struct Range - { - RangeStorageType left; - RangeStorageType right; - - static bool isCorrectDate(const RangeStorageType & date); - bool contains(const RangeStorageType & value) const; - }; - private: template struct Value final @@ -96,10 +102,12 @@ private: template using Values = std::vector>; - template - using Collection = HashMap>; - template - using Ptr = std::unique_ptr>; + + template + using CollectionType = std::conditional_t< + dictionary_key_type == DictionaryKeyType::Simple, + HashMap>, + HashMapWithSavedHash, DefaultHash>>; struct Attribute final { @@ -108,27 +116,27 @@ private: bool is_nullable; std::variant< - Ptr, - Ptr, - Ptr, - Ptr, - Ptr, - Ptr, - Ptr, - Ptr, - Ptr, - Ptr, - Ptr, - Ptr, - Ptr, - Ptr, - Ptr, - Ptr, - Ptr, - Ptr, - Ptr, - Ptr, - Ptr> + CollectionType, + CollectionType, + CollectionType, + CollectionType, + CollectionType, + CollectionType, + CollectionType, + CollectionType, + CollectionType, + CollectionType, + CollectionType, + CollectionType, + CollectionType, + CollectionType, + CollectionType, + CollectionType, + CollectionType, + CollectionType, + CollectionType, + CollectionType, + CollectionType> maps; std::unique_ptr string_arena; }; @@ -137,9 +145,6 @@ private: void loadData(); - template - void addAttributeSize(const Attribute & attribute); - void calculateBytesAllocated(); static Attribute createAttribute(const DictionaryAttribute & dictionary_attribute); @@ -151,35 +156,30 @@ private: ValueSetter && set_value, DefaultValueExtractor & default_value_extractor) const; - template - ColumnUInt8::Ptr hasKeysImpl( - const Attribute & attribute, - const PaddedPODArray & ids, - const PaddedPODArray & dates, - size_t & keys_found) const; - template - static void setAttributeValueImpl(Attribute & attribute, const UInt64 id, const Range & range, const Field & value); + static void setAttributeValueImpl(Attribute & attribute, KeyType key, const Range & range, const Field & value); - static void setAttributeValue(Attribute & attribute, const UInt64 id, const Range & range, const Field & value); - - const Attribute & getAttribute(const std::string & attribute_name) const; - - const Attribute & getAttributeWithType(const std::string & name, const AttributeUnderlyingType type) const; + static void setAttributeValue(Attribute & attribute, KeyType key, const Range & range, const Field & value); template - void getIdsAndDates(PaddedPODArray & ids, PaddedPODArray & start_dates, PaddedPODArray & end_dates) const; + void getKeysAndDates( + PaddedPODArray & keys, + PaddedPODArray & start_dates, + PaddedPODArray & end_dates) const; template - void getIdsAndDates( + void getKeysAndDates( const Attribute & attribute, - PaddedPODArray & ids, + PaddedPODArray & keys, PaddedPODArray & start_dates, PaddedPODArray & end_dates) const; template Pipe readImpl(const Names & column_names, size_t max_block_size) const; + StringRef copyKeyInArena(StringRef key); + + template friend struct RangeHashedDictionaryCallGetSourceImpl; const DictionaryStructure dict_struct; @@ -189,6 +189,7 @@ private: std::map attribute_index_by_name; std::vector attributes; + Arena complex_key_arena; size_t bytes_allocated = 0; size_t element_count = 0; diff --git a/src/Dictionaries/RedisDictionarySource.cpp b/src/Dictionaries/RedisDictionarySource.cpp index bf309dd0e8a..24a14d8cc80 100644 --- a/src/Dictionaries/RedisDictionarySource.cpp +++ b/src/Dictionaries/RedisDictionarySource.cpp @@ -12,7 +12,7 @@ void registerDictionarySourceRedis(DictionarySourceFactory & factory) const Poco::Util::AbstractConfiguration & config, const String & config_prefix, Block & sample_block, - ContextPtr /* context */, + ContextPtr /* global_context */, const std::string & /* default_database */, bool /* created_from_ddl */) -> DictionarySourcePtr { return std::make_unique(dict_struct, config, config_prefix + ".redis", sample_block); @@ -31,7 +31,7 @@ void registerDictionarySourceRedis(DictionarySourceFactory & factory) #include -#include "RedisBlockInputStream.h" +#include "RedisSource.h" namespace DB diff --git a/src/Dictionaries/RedisBlockInputStream.cpp b/src/Dictionaries/RedisSource.cpp similarity index 99% rename from src/Dictionaries/RedisBlockInputStream.cpp rename to src/Dictionaries/RedisSource.cpp index c6e2546cf1e..ad5cf8a0977 100644 --- a/src/Dictionaries/RedisBlockInputStream.cpp +++ b/src/Dictionaries/RedisSource.cpp @@ -1,4 +1,4 @@ -#include "RedisBlockInputStream.h" +#include "RedisSource.h" #include #include diff --git a/src/Dictionaries/RedisBlockInputStream.h b/src/Dictionaries/RedisSource.h similarity index 100% rename from src/Dictionaries/RedisBlockInputStream.h rename to src/Dictionaries/RedisSource.h diff --git a/src/Dictionaries/SSDCacheDictionaryStorage.h b/src/Dictionaries/SSDCacheDictionaryStorage.h index bdb640c90be..e584b523376 100644 --- a/src/Dictionaries/SSDCacheDictionaryStorage.h +++ b/src/Dictionaries/SSDCacheDictionaryStorage.h @@ -823,8 +823,8 @@ template class SSDCacheDictionaryStorage final : public ICacheDictionaryStorage { public: - using SSDCacheKeyType = std::conditional_t; - using KeyType = std::conditional_t; + using SSDCacheKeyType = std::conditional_t; + using KeyType = std::conditional_t; explicit SSDCacheDictionaryStorage(const SSDCacheDictionaryStorageConfiguration & configuration_) : configuration(configuration_) @@ -838,19 +838,19 @@ public: String getName() const override { - if (dictionary_key_type == DictionaryKeyType::simple) + if (dictionary_key_type == DictionaryKeyType::Simple) return "SSDCache"; else return "SSDComplexKeyCache"; } - bool supportsSimpleKeys() const override { return dictionary_key_type == DictionaryKeyType::simple; } + bool supportsSimpleKeys() const override { return dictionary_key_type == DictionaryKeyType::Simple; } SimpleKeysStorageFetchResult fetchColumnsForKeys( const PaddedPODArray & keys, const DictionaryStorageFetchRequest & fetch_request) override { - if constexpr (dictionary_key_type == DictionaryKeyType::simple) + if constexpr (dictionary_key_type == DictionaryKeyType::Simple) return fetchColumnsForKeysImpl(keys, fetch_request); else throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Method insertColumnsForKeys is not supported for complex key storage"); @@ -858,7 +858,7 @@ public: void insertColumnsForKeys(const PaddedPODArray & keys, Columns columns) override { - if constexpr (dictionary_key_type == DictionaryKeyType::simple) + if constexpr (dictionary_key_type == DictionaryKeyType::Simple) insertColumnsForKeysImpl(keys, columns); else throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Method insertColumnsForKeys is not supported for complex key storage"); @@ -866,7 +866,7 @@ public: void insertDefaultKeys(const PaddedPODArray & keys) override { - if constexpr (dictionary_key_type == DictionaryKeyType::simple) + if constexpr (dictionary_key_type == DictionaryKeyType::Simple) insertDefaultKeysImpl(keys); else throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Method insertDefaultKeysImpl is not supported for complex key storage"); @@ -874,19 +874,19 @@ public: PaddedPODArray getCachedSimpleKeys() const override { - if constexpr (dictionary_key_type == DictionaryKeyType::simple) + if constexpr (dictionary_key_type == DictionaryKeyType::Simple) return getCachedKeysImpl(); else throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Method getCachedSimpleKeys is not supported for complex key storage"); } - bool supportsComplexKeys() const override { return dictionary_key_type == DictionaryKeyType::complex; } + bool supportsComplexKeys() const override { return dictionary_key_type == DictionaryKeyType::Complex; } ComplexKeysStorageFetchResult fetchColumnsForKeys( const PaddedPODArray & keys, const DictionaryStorageFetchRequest & fetch_request) override { - if constexpr (dictionary_key_type == DictionaryKeyType::complex) + if constexpr (dictionary_key_type == DictionaryKeyType::Complex) return fetchColumnsForKeysImpl(keys, fetch_request); else throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Method fetchColumnsForKeys is not supported for simple key storage"); @@ -894,7 +894,7 @@ public: void insertColumnsForKeys(const PaddedPODArray & keys, Columns columns) override { - if constexpr (dictionary_key_type == DictionaryKeyType::complex) + if constexpr (dictionary_key_type == DictionaryKeyType::Complex) insertColumnsForKeysImpl(keys, columns); else throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Method insertColumnsForKeys is not supported for simple key storage"); @@ -902,7 +902,7 @@ public: void insertDefaultKeys(const PaddedPODArray & keys) override { - if constexpr (dictionary_key_type == DictionaryKeyType::complex) + if constexpr (dictionary_key_type == DictionaryKeyType::Complex) insertDefaultKeysImpl(keys); else throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Method insertDefaultKeysImpl is not supported for simple key storage"); @@ -910,7 +910,7 @@ public: PaddedPODArray getCachedComplexKeys() const override { - if constexpr (dictionary_key_type == DictionaryKeyType::complex) + if constexpr (dictionary_key_type == DictionaryKeyType::Complex) return getCachedKeysImpl(); else throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Method getCachedSimpleKeys is not supported for simple key storage"); @@ -1134,7 +1134,7 @@ private: Cell cell; setCellDeadline(cell, now); - if constexpr (dictionary_key_type == DictionaryKeyType::complex) + if constexpr (dictionary_key_type == DictionaryKeyType::Complex) { /// Copy complex key into arena and put in cache size_t key_size = key.size; @@ -1166,7 +1166,7 @@ private: cell.state = Cell::default_value; - if constexpr (dictionary_key_type == DictionaryKeyType::complex) + if constexpr (dictionary_key_type == DictionaryKeyType::Complex) { /// Copy complex key into arena and put in cache size_t key_size = key.size; @@ -1382,7 +1382,7 @@ private: using ComplexKeyHashMap = HashMapWithSavedHash; using CacheMap = std::conditional_t< - dictionary_key_type == DictionaryKeyType::simple, + dictionary_key_type == DictionaryKeyType::Simple, SimpleKeyHashMap, ComplexKeyHashMap>; diff --git a/src/Dictionaries/XDBCDictionarySource.cpp b/src/Dictionaries/XDBCDictionarySource.cpp index 80d3df1caab..9fc7e92634b 100644 --- a/src/Dictionaries/XDBCDictionarySource.cpp +++ b/src/Dictionaries/XDBCDictionarySource.cpp @@ -222,7 +222,7 @@ Pipe XDBCDictionarySource::loadFromQuery(const Poco::URI & url, const Block & re }; auto read_buf = std::make_unique(url, Poco::Net::HTTPRequest::HTTP_POST, write_body_callback, timeouts); - auto format = FormatFactory::instance().getInput(IXDBCBridgeHelper::DEFAULT_FORMAT, *read_buf, sample_block, getContext(), max_block_size); + auto format = FormatFactory::instance().getInput(IXDBCBridgeHelper::DEFAULT_FORMAT, *read_buf, required_sample_block, getContext(), max_block_size); format->addBuffer(std::move(read_buf)); return Pipe(std::move(format)); @@ -234,12 +234,12 @@ void registerDictionarySourceXDBC(DictionarySourceFactory & factory) const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, Block & sample_block, - ContextPtr context, + ContextPtr global_context, const std::string & /* default_database */, bool /* check_config */) -> DictionarySourcePtr { #if USE_ODBC BridgeHelperPtr bridge = std::make_shared>( - context, context->getSettings().http_receive_timeout, config.getString(config_prefix + ".odbc.connection_string")); + global_context, global_context->getSettings().http_receive_timeout, config.getString(config_prefix + ".odbc.connection_string")); std::string settings_config_prefix = config_prefix + ".odbc"; @@ -255,13 +255,13 @@ void registerDictionarySourceXDBC(DictionarySourceFactory & factory) .update_lag = config.getUInt64(settings_config_prefix + ".update_lag", 1) }; - return std::make_unique(dict_struct, configuration, sample_block, context, bridge); + return std::make_unique(dict_struct, configuration, sample_block, global_context, bridge); #else (void)dict_struct; (void)config; (void)config_prefix; (void)sample_block; - (void)context; + (void)global_context; throw Exception(ErrorCodes::SUPPORT_IS_DISABLED, "Dictionary source of type `odbc` is disabled because poco library was built without ODBC support."); #endif @@ -276,7 +276,7 @@ void registerDictionarySourceJDBC(DictionarySourceFactory & factory) const Poco::Util::AbstractConfiguration & /* config */, const std::string & /* config_prefix */, Block & /* sample_block */, - ContextPtr /* context */, + ContextPtr /* global_context */, const std::string & /* default_database */, bool /* created_from_ddl */) -> DictionarySourcePtr { throw Exception(ErrorCodes::SUPPORT_IS_DISABLED, diff --git a/src/Dictionaries/getDictionaryConfigurationFromAST.cpp b/src/Dictionaries/getDictionaryConfigurationFromAST.cpp index ba81b1f1364..c8cb2611651 100644 --- a/src/Dictionaries/getDictionaryConfigurationFromAST.cpp +++ b/src/Dictionaries/getDictionaryConfigurationFromAST.cpp @@ -496,9 +496,6 @@ void checkAST(const ASTCreateQuery & query) if (!query.is_dictionary || query.dictionary == nullptr) throw Exception(ErrorCodes::INCORRECT_DICTIONARY_DEFINITION, "Cannot convert dictionary to configuration from non-dictionary AST."); - if (query.dictionary_attributes_list == nullptr || query.dictionary_attributes_list->children.empty()) - throw Exception(ErrorCodes::INCORRECT_DICTIONARY_DEFINITION, "Cannot create dictionary with empty attributes list"); - if (query.dictionary->layout == nullptr) throw Exception(ErrorCodes::INCORRECT_DICTIONARY_DEFINITION, "Cannot create dictionary with empty layout"); @@ -512,8 +509,6 @@ void checkAST(const ASTCreateQuery & query) if (query.dictionary->source == nullptr) throw Exception(ErrorCodes::INCORRECT_DICTIONARY_DEFINITION, "Cannot create dictionary with empty source"); - - /// Range can be empty } void checkPrimaryKey(const NamesToTypeNames & all_attrs, const Names & key_attrs) diff --git a/src/Dictionaries/getDictionaryConfigurationFromAST.h b/src/Dictionaries/getDictionaryConfigurationFromAST.h index de8659e4d7b..b464fdf1d8c 100644 --- a/src/Dictionaries/getDictionaryConfigurationFromAST.h +++ b/src/Dictionaries/getDictionaryConfigurationFromAST.h @@ -6,6 +6,7 @@ namespace DB { + using DictionaryConfigurationPtr = Poco::AutoPtr; /// Convert dictionary AST to Poco::AbstractConfiguration @@ -13,4 +14,5 @@ using DictionaryConfigurationPtr = Poco::AutoPtrgetUserFilesPath())) - throw Exception(ErrorCodes::PATH_ACCESS_DENIED, "File path {} is not inside {}", storage_configuration.file_path, context->getUserFilesPath()); + if (created_from_ddl && !pathStartsWith(storage_configuration.file_path, global_context->getUserFilesPath())) + throw Exception(ErrorCodes::PATH_ACCESS_DENIED, "File path {} is not inside {}", storage_configuration.file_path, global_context->getUserFilesPath()); storage = std::make_shared>(storage_configuration); } @@ -240,10 +239,10 @@ void registerDictionaryCache(DictionaryFactory & factory) const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, DictionarySourcePtr source_ptr, - ContextPtr context, + ContextPtr global_context, bool created_from_ddl) -> DictionaryPtr { - return createCacheDictionaryLayout(full_name, dict_struct, config, config_prefix, std::move(source_ptr), std::move(context), created_from_ddl); + return createCacheDictionaryLayout(full_name, dict_struct, config, config_prefix, std::move(source_ptr), global_context, created_from_ddl); }; factory.registerLayout("cache", create_simple_cache_layout, false); @@ -253,10 +252,10 @@ void registerDictionaryCache(DictionaryFactory & factory) const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, DictionarySourcePtr source_ptr, - ContextPtr context, + ContextPtr global_context, bool created_from_ddl) -> DictionaryPtr { - return createCacheDictionaryLayout(full_name, dict_struct, config, config_prefix, std::move(source_ptr), std::move(context), created_from_ddl); + return createCacheDictionaryLayout(full_name, dict_struct, config, config_prefix, std::move(source_ptr), global_context, created_from_ddl); }; factory.registerLayout("complex_key_cache", create_complex_key_cache_layout, true); @@ -268,10 +267,10 @@ void registerDictionaryCache(DictionaryFactory & factory) const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, DictionarySourcePtr source_ptr, - ContextPtr context, + ContextPtr global_context, bool created_from_ddl) -> DictionaryPtr { - return createCacheDictionaryLayout(full_name, dict_struct, config, config_prefix, std::move(source_ptr), std::move(context), created_from_ddl); + return createCacheDictionaryLayout(full_name, dict_struct, config, config_prefix, std::move(source_ptr), global_context, created_from_ddl); }; factory.registerLayout("ssd_cache", create_simple_ssd_cache_layout, false); @@ -281,9 +280,9 @@ void registerDictionaryCache(DictionaryFactory & factory) const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, DictionarySourcePtr source_ptr, - ContextPtr context, + ContextPtr global_context, bool created_from_ddl) -> DictionaryPtr { - return createCacheDictionaryLayout(full_name, dict_struct, config, config_prefix, std::move(source_ptr), std::move(context), created_from_ddl); + return createCacheDictionaryLayout(full_name, dict_struct, config, config_prefix, std::move(source_ptr), global_context, created_from_ddl); }; factory.registerLayout("complex_key_ssd_cache", create_complex_key_ssd_cache_layout, true); diff --git a/src/Dictionaries/ya.make b/src/Dictionaries/ya.make index 36152fe439a..6498367bb6a 100644 --- a/src/Dictionaries/ya.make +++ b/src/Dictionaries/ya.make @@ -22,13 +22,14 @@ NO_COMPILER_WARNINGS() SRCS( CacheDictionary.cpp CacheDictionaryUpdateQueue.cpp - CassandraBlockInputStream.cpp CassandraDictionarySource.cpp CassandraHelpers.cpp + CassandraSource.cpp ClickHouseDictionarySource.cpp - DictionaryBlockInputStream.cpp - DictionaryBlockInputStreamBase.cpp DictionaryFactory.cpp + DictionaryHelpers.cpp + DictionarySource.cpp + DictionarySourceBase.cpp DictionarySourceFactory.cpp DictionarySourceHelpers.cpp DictionaryStructure.cpp @@ -57,8 +58,8 @@ SRCS( PolygonDictionaryImplementations.cpp PolygonDictionaryUtils.cpp RangeHashedDictionary.cpp - RedisBlockInputStream.cpp RedisDictionarySource.cpp + RedisSource.cpp XDBCDictionarySource.cpp getDictionaryConfigurationFromAST.cpp readInvalidateQuery.cpp diff --git a/src/Disks/S3/DiskS3.cpp b/src/Disks/S3/DiskS3.cpp index 6dd29165566..7378a08d1ea 100644 --- a/src/Disks/S3/DiskS3.cpp +++ b/src/Disks/S3/DiskS3.cpp @@ -6,25 +6,37 @@ #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 // Y_IGNORE #include // Y_IGNORE #include // Y_IGNORE #include // Y_IGNORE #include // Y_IGNORE +#include // Y_IGNORE +#include // Y_IGNORE +#include // Y_IGNORE +#include // Y_IGNORE namespace DB @@ -388,16 +400,7 @@ void DiskS3::saveSchemaVersion(const int & version) void DiskS3::updateObjectMetadata(const String & key, const ObjectMetadata & metadata) { - auto settings = current_settings.get(); - Aws::S3::Model::CopyObjectRequest request; - request.SetCopySource(bucket + "/" + key); - request.SetBucket(bucket); - request.SetKey(key); - request.SetMetadata(metadata); - request.SetMetadataDirective(Aws::S3::Model::MetadataDirective::REPLACE); - - auto outcome = settings->client->CopyObject(request); - throwIfError(outcome); + copyObjectImpl(bucket, key, bucket, key, std::nullopt, metadata); } void DiskS3::migrateFileToRestorableSchema(const String & path) @@ -553,18 +556,124 @@ void DiskS3::listObjects(const String & source_bucket, const String & source_pat } while (outcome.GetResult().GetIsTruncated()); } -void DiskS3::copyObject(const String & src_bucket, const String & src_key, const String & dst_bucket, const String & dst_key) const +void DiskS3::copyObject(const String & src_bucket, const String & src_key, const String & dst_bucket, const String & dst_key, + std::optional head) const +{ + if (head && (head->GetContentLength() >= static_cast(5_GiB))) + copyObjectMultipartImpl(src_bucket, src_key, dst_bucket, dst_key, head); + else + copyObjectImpl(src_bucket, src_key, dst_bucket, dst_key); +} + +void DiskS3::copyObjectImpl(const String & src_bucket, const String & src_key, const String & dst_bucket, const String & dst_key, + std::optional head, + std::optional> metadata) const { auto settings = current_settings.get(); Aws::S3::Model::CopyObjectRequest request; request.SetCopySource(src_bucket + "/" + src_key); request.SetBucket(dst_bucket); request.SetKey(dst_key); + if (metadata) + { + request.SetMetadata(*metadata); + request.SetMetadataDirective(Aws::S3::Model::MetadataDirective::REPLACE); + } auto outcome = settings->client->CopyObject(request); + + if (!outcome.IsSuccess() && outcome.GetError().GetExceptionName() == "EntityTooLarge") + { // Can't come here with MinIO, MinIO allows single part upload for large objects. + copyObjectMultipartImpl(src_bucket, src_key, dst_bucket, dst_key, head, metadata); + return; + } + throwIfError(outcome); } +void DiskS3::copyObjectMultipartImpl(const String & src_bucket, const String & src_key, const String & dst_bucket, const String & dst_key, + std::optional head, + std::optional> metadata) const +{ + LOG_DEBUG(log, "Multipart copy upload has created. Src Bucket: {}, Src Key: {}, Dst Bucket: {}, Dst Key: {}, Metadata: {}", + src_bucket, src_key, dst_bucket, dst_key, metadata ? "REPLACE" : "NOT_SET"); + + auto settings = current_settings.get(); + + if (!head) + head = headObject(src_bucket, src_key); + + size_t size = head->GetContentLength(); + + String multipart_upload_id; + + { + Aws::S3::Model::CreateMultipartUploadRequest request; + request.SetBucket(dst_bucket); + request.SetKey(dst_key); + if (metadata) + request.SetMetadata(*metadata); + + auto outcome = settings->client->CreateMultipartUpload(request); + + throwIfError(outcome); + + multipart_upload_id = outcome.GetResult().GetUploadId(); + } + + std::vector part_tags; + + size_t upload_part_size = settings->s3_min_upload_part_size; + for (size_t position = 0, part_number = 1; position < size; ++part_number, position += upload_part_size) + { + Aws::S3::Model::UploadPartCopyRequest part_request; + part_request.SetCopySource(src_bucket + "/" + src_key); + part_request.SetBucket(dst_bucket); + part_request.SetKey(dst_key); + part_request.SetUploadId(multipart_upload_id); + part_request.SetPartNumber(part_number); + part_request.SetCopySourceRange(fmt::format("bytes={}-{}", position, std::min(size, position + upload_part_size) - 1)); + + auto outcome = settings->client->UploadPartCopy(part_request); + if (!outcome.IsSuccess()) + { + Aws::S3::Model::AbortMultipartUploadRequest abort_request; + abort_request.SetBucket(dst_bucket); + abort_request.SetKey(dst_key); + abort_request.SetUploadId(multipart_upload_id); + settings->client->AbortMultipartUpload(abort_request); + // In error case we throw exception later with first error from UploadPartCopy + } + throwIfError(outcome); + + auto etag = outcome.GetResult().GetCopyPartResult().GetETag(); + part_tags.push_back(etag); + } + + { + Aws::S3::Model::CompleteMultipartUploadRequest req; + req.SetBucket(dst_bucket); + req.SetKey(dst_key); + req.SetUploadId(multipart_upload_id); + + Aws::S3::Model::CompletedMultipartUpload multipart_upload; + for (size_t i = 0; i < part_tags.size(); ++i) + { + Aws::S3::Model::CompletedPart part; + multipart_upload.AddParts(part.WithETag(part_tags[i]).WithPartNumber(i + 1)); + } + + req.SetMultipartUpload(multipart_upload); + + auto outcome = settings->client->CompleteMultipartUpload(req); + + throwIfError(outcome); + + LOG_DEBUG(log, "Multipart copy upload has completed. Src Bucket: {}, Src Key: {}, Dst Bucket: {}, Dst Key: {}, " + "Upload_id: {}, Parts: {}", src_bucket, src_key, dst_bucket, dst_key, multipart_upload_id, part_tags.size()); + } +} + struct DiskS3::RestoreInformation { UInt64 revision = LATEST_REVISION; @@ -757,7 +866,7 @@ void DiskS3::processRestoreFiles(const String & source_bucket, const String & so /// Copy object if we restore to different bucket / path. if (bucket != source_bucket || remote_fs_root_path != source_path) - copyObject(source_bucket, key, bucket, remote_fs_root_path + relative_key); + copyObject(source_bucket, key, bucket, remote_fs_root_path + relative_key, head_result); metadata.addObject(relative_key, head_result.GetContentLength()); metadata.save(); diff --git a/src/Disks/S3/DiskS3.h b/src/Disks/S3/DiskS3.h index 133488ad31f..d881cee8f54 100644 --- a/src/Disks/S3/DiskS3.h +++ b/src/Disks/S3/DiskS3.h @@ -7,6 +7,7 @@ #if USE_AWS_S3 #include +#include #include #include "Disks/DiskFactory.h" #include "Disks/Executor.h" @@ -131,7 +132,15 @@ private: Aws::S3::Model::HeadObjectResult headObject(const String & source_bucket, const String & key) const; void listObjects(const String & source_bucket, const String & source_path, std::function callback) const; - void copyObject(const String & src_bucket, const String & src_key, const String & dst_bucket, const String & dst_key) const; + void copyObject(const String & src_bucket, const String & src_key, const String & dst_bucket, const String & dst_key, + std::optional head = std::nullopt) const; + + void copyObjectImpl(const String & src_bucket, const String & src_key, const String & dst_bucket, const String & dst_key, + std::optional head = std::nullopt, + std::optional> metadata = std::nullopt) const; + void copyObjectMultipartImpl(const String & src_bucket, const String & src_key, const String & dst_bucket, const String & dst_key, + std::optional head = std::nullopt, + std::optional> metadata = std::nullopt) const; /// Restore S3 metadata files on file system. void restore(); diff --git a/src/Disks/TemporaryFileOnDisk.cpp b/src/Disks/TemporaryFileOnDisk.cpp new file mode 100644 index 00000000000..90e51dcc369 --- /dev/null +++ b/src/Disks/TemporaryFileOnDisk.cpp @@ -0,0 +1,27 @@ +#include +#include +#include + + +namespace DB +{ + +TemporaryFileOnDisk::TemporaryFileOnDisk(const DiskPtr & disk_, const String & prefix_) + : disk(disk_) +{ + String dummy_prefix = "a/"; + filepath = Poco::TemporaryFile::tempName(dummy_prefix); + dummy_prefix += "tmp"; + assert(filepath.starts_with(dummy_prefix)); + filepath.replace(0, dummy_prefix.length(), prefix_); +} + +TemporaryFileOnDisk::~TemporaryFileOnDisk() +{ +#if 1 + if (disk && !filepath.empty()) + disk->removeRecursive(filepath); +#endif +} + +} diff --git a/src/Disks/TemporaryFileOnDisk.h b/src/Disks/TemporaryFileOnDisk.h new file mode 100644 index 00000000000..c854a600146 --- /dev/null +++ b/src/Disks/TemporaryFileOnDisk.h @@ -0,0 +1,29 @@ +#pragma once + +#include +#include + +namespace DB +{ +class IDisk; +using DiskPtr = std::shared_ptr; + +/// This class helps with the handling of temporary files or directories. +/// A unique name for the temporary file or directory is automatically chosen based on a specified prefix. +/// Optionally can create a directory in the constructor. +/// The destructor always removes the temporary file or directory with all contained files. +class TemporaryFileOnDisk +{ +public: + TemporaryFileOnDisk(const DiskPtr & disk_, const String & prefix_ = "tmp"); + ~TemporaryFileOnDisk(); + + DiskPtr getDisk() const { return disk; } + const String & getPath() const { return filepath; } + +private: + DiskPtr disk; + String filepath; +}; + +} diff --git a/src/Formats/FormatFactory.cpp b/src/Formats/FormatFactory.cpp index 2edb910033a..a014f85d45f 100644 --- a/src/Formats/FormatFactory.cpp +++ b/src/Formats/FormatFactory.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include @@ -19,10 +18,6 @@ #include -#if !defined(ARCADIA_BUILD) -# include -#endif - namespace DB { @@ -32,7 +27,6 @@ namespace ErrorCodes extern const int LOGICAL_ERROR; extern const int FORMAT_IS_NOT_SUITABLE_FOR_INPUT; extern const int FORMAT_IS_NOT_SUITABLE_FOR_OUTPUT; - extern const int UNSUPPORTED_METHOD; } const FormatFactory::Creators & FormatFactory::getCreators(const String & name) const @@ -87,6 +81,7 @@ FormatSettings getFormatSettings(ContextPtr context, const Settings & settings) format_settings.json.quote_64bit_integers = settings.output_format_json_quote_64bit_integers; format_settings.json.quote_denormals = settings.output_format_json_quote_denormals; format_settings.null_as_default = settings.input_format_null_as_default; + format_settings.decimal_trailing_zeros = settings.output_format_decimal_trailing_zeros; format_settings.parquet.row_group_size = settings.output_format_parquet_row_group_size; format_settings.parquet.import_nested = settings.input_format_parquet_import_nested; format_settings.pretty.charset = settings.output_format_pretty_grid_charset.toString() == "ASCII" ? FormatSettings::Pretty::Charset::ASCII : FormatSettings::Pretty::Charset::UTF8; @@ -215,8 +210,8 @@ BlockOutputStreamPtr FormatFactory::getOutputStreamParallelIfPossible( bool parallel_formatting = settings.output_format_parallel_formatting; auto format_settings = _format_settings ? *_format_settings : getFormatSettings(context); - if (output_getter && parallel_formatting && getCreators(name).supports_parallel_formatting && !settings.output_format_json_array_of_rows - && !format_settings.mysql_wire.sequence_id) + if (output_getter && parallel_formatting && getCreators(name).supports_parallel_formatting + && !settings.output_format_json_array_of_rows) { auto formatter_creator = [output_getter, sample, callback, format_settings] (WriteBuffer & output) -> OutputFormatPtr @@ -316,7 +311,7 @@ OutputFormatPtr FormatFactory::getOutputFormatParallelIfPossible( const Settings & settings = context->getSettingsRef(); if (settings.output_format_parallel_formatting && getCreators(name).supports_parallel_formatting - && !settings.output_format_json_array_of_rows && !format_settings.mysql_wire.sequence_id) + && !settings.output_format_json_array_of_rows) { auto formatter_creator = [output_getter, sample, callback, format_settings] (WriteBuffer & output) -> OutputFormatPtr @@ -354,10 +349,6 @@ OutputFormatPtr FormatFactory::getOutputFormat( auto format_settings = _format_settings ? *_format_settings : getFormatSettings(context); - /// If we're handling MySQL protocol connection right now then MySQLWire is only allowed output format. - if (format_settings.mysql_wire.sequence_id && (name != "MySQLWire")) - throw Exception(ErrorCodes::UNSUPPORTED_METHOD, "MySQL protocol does not support custom output formats"); - /** TODO: Materialization is needed, because formats can use the functions `IDataType`, * which only work with full columns. */ diff --git a/src/Formats/FormatSettings.h b/src/Formats/FormatSettings.h index d77a7c95d69..3e1e00584c0 100644 --- a/src/Formats/FormatSettings.h +++ b/src/Formats/FormatSettings.h @@ -28,6 +28,7 @@ struct FormatSettings bool write_statistics = true; bool import_nested_json = false; bool null_as_default = true; + bool decimal_trailing_zeros = false; enum class DateTimeInputFormat { diff --git a/src/Formats/MySQLBlockInputStream.cpp b/src/Formats/MySQLSource.cpp similarity index 97% rename from src/Formats/MySQLBlockInputStream.cpp rename to src/Formats/MySQLSource.cpp index 401d85f3d6b..e6cb9f5ff11 100644 --- a/src/Formats/MySQLBlockInputStream.cpp +++ b/src/Formats/MySQLSource.cpp @@ -19,7 +19,7 @@ #include #include #include -#include "MySQLBlockInputStream.h" +#include "MySQLSource.h" namespace DB @@ -100,12 +100,12 @@ void MySQLWithFailoverSource::onStart() catch (const mysqlxx::ConnectionLost & ecl) /// There are two retriable failures: CR_SERVER_GONE_ERROR, CR_SERVER_LOST { LOG_WARNING(log, "Failed connection ({}/{}). Trying to reconnect... (Info: {})", count_connect_attempts, settings->default_num_tries_on_connection_loss, ecl.displayText()); - } - if (++count_connect_attempts > settings->default_num_tries_on_connection_loss) - { - LOG_ERROR(log, "Failed to create connection to MySQL. ({}/{})", count_connect_attempts, settings->default_num_tries_on_connection_loss); - throw; + if (++count_connect_attempts > settings->default_num_tries_on_connection_loss) + { + LOG_ERROR(log, "Failed to create connection to MySQL. ({}/{})", count_connect_attempts, settings->default_num_tries_on_connection_loss); + throw; + } } } diff --git a/src/Formats/MySQLBlockInputStream.h b/src/Formats/MySQLSource.h similarity index 96% rename from src/Formats/MySQLBlockInputStream.h rename to src/Formats/MySQLSource.h index 9c33b4404ae..5938cb4b57f 100644 --- a/src/Formats/MySQLBlockInputStream.h +++ b/src/Formats/MySQLSource.h @@ -58,7 +58,7 @@ protected: ExternalResultDescription description; }; -/// Like MySQLBlockInputStream, but allocates connection only when reading is starting. +/// Like MySQLSource, but allocates connection only when reading is starting. /// It allows to create a lot of stream objects without occupation of all connection pool. /// Also makes attempts to reconnect in case of connection failures. class MySQLWithFailoverSource final : public MySQLSource diff --git a/src/Formats/ProtobufSerializer.cpp b/src/Formats/ProtobufSerializer.cpp index c5781ee6c9f..baeefa8f98e 100644 --- a/src/Formats/ProtobufSerializer.cpp +++ b/src/Formats/ProtobufSerializer.cpp @@ -1239,7 +1239,7 @@ namespace else { WriteBufferFromOwnString buf; - writeText(decimal, scale, buf); + writeText(decimal, scale, buf, false); cannotConvertValue(buf.str(), TypeName, field_descriptor.type_name()); } }; @@ -1316,9 +1316,9 @@ namespace { WriteBufferFromString buf{str}; if constexpr (std::is_same_v) - writeDateTimeText(decimal, scale, buf); + writeDateTimeText(decimal, scale, buf); else - writeText(decimal, scale, buf); + writeText(decimal, scale, buf, false); } DecimalType stringToDecimal(const String & str) const diff --git a/src/Formats/ya.make b/src/Formats/ya.make index 476e13f9a4f..90184350359 100644 --- a/src/Formats/ya.make +++ b/src/Formats/ya.make @@ -14,7 +14,7 @@ SRCS( FormatFactory.cpp FormatSchemaInfo.cpp JSONEachRowUtils.cpp - MySQLBlockInputStream.cpp + MySQLSource.cpp NativeFormat.cpp NullFormat.cpp ParsedTemplateFormatString.cpp diff --git a/src/Functions/CastOverloadResolver.cpp b/src/Functions/CastOverloadResolver.cpp new file mode 100644 index 00000000000..fd6fecc37d6 --- /dev/null +++ b/src/Functions/CastOverloadResolver.cpp @@ -0,0 +1,19 @@ +#include +#include + + +namespace DB +{ + +void registerCastOverloadResolvers(FunctionFactory & factory) +{ + factory.registerFunction>(FunctionFactory::CaseInsensitive); + factory.registerFunction>(); + factory.registerFunction>(); + + factory.registerFunction>(FunctionFactory::CaseInsensitive); + factory.registerFunction>(); + factory.registerFunction>(); +} + +} diff --git a/src/Functions/CastOverloadResolver.h b/src/Functions/CastOverloadResolver.h new file mode 100644 index 00000000000..ffd5dda4af3 --- /dev/null +++ b/src/Functions/CastOverloadResolver.h @@ -0,0 +1,121 @@ +#pragma once +#include + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int ILLEGAL_TYPE_OF_ARGUMENT; +} + +/* + * CastInternal does not preserve nullability of the data type, + * i.e. CastInternal(toNullable(toInt8(1)) as Int32) will be Int32(1). + * + * Cast preserves nullability according to setting `cast_keep_nullable`, + * i.e. Cast(toNullable(toInt8(1)) as Int32) will be Nullable(Int32(1)) if `cast_keep_nullable` == 1. +**/ +template +class CastOverloadResolverImpl : public IFunctionOverloadResolver +{ +public: + using MonotonicityForRange = FunctionCastBase::MonotonicityForRange; + using Diagnostic = FunctionCastBase::Diagnostic; + + static constexpr auto name = cast_type == CastType::accurate + ? CastName::accurate_cast_name + : (cast_type == CastType::accurateOrNull ? CastName::accurate_cast_or_null_name : CastName::cast_name); + + String getName() const override { return name; } + + size_t getNumberOfArguments() const override { return 2; } + + ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1}; } + + explicit CastOverloadResolverImpl(std::optional diagnostic_, bool keep_nullable_) + : diagnostic(std::move(diagnostic_)), keep_nullable(keep_nullable_) + { + } + + static FunctionOverloadResolverPtr create(ContextPtr context) + { + if constexpr (internal) + return createImpl(); + return createImpl({}, context->getSettingsRef().cast_keep_nullable); + } + + static FunctionOverloadResolverPtr createImpl(std::optional diagnostic = {}, bool keep_nullable = false) + { + assert(!internal || !keep_nullable); + return std::make_unique(std::move(diagnostic), keep_nullable); + } + +protected: + + FunctionBasePtr buildImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & return_type) const override + { + DataTypes data_types(arguments.size()); + + for (size_t i = 0; i < arguments.size(); ++i) + data_types[i] = arguments[i].type; + + auto monotonicity = MonotonicityHelper::getMonotonicityInformation(arguments.front().type, return_type.get()); + return std::make_unique>(name, std::move(monotonicity), data_types, return_type, diagnostic, cast_type); + } + + DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override + { + const auto & column = arguments.back().column; + if (!column) + throw Exception("Second argument to " + getName() + " must be a constant string describing type." + " Instead there is non-constant column of type " + arguments.back().type->getName(), + ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); + + const auto * type_col = checkAndGetColumnConst(column.get()); + if (!type_col) + throw Exception("Second argument to " + getName() + " must be a constant string describing type." + " Instead there is a column with the following structure: " + column->dumpStructure(), + ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); + + DataTypePtr type = DataTypeFactory::instance().get(type_col->getValue()); + + if constexpr (cast_type == CastType::accurateOrNull) + return makeNullable(type); + + if constexpr (internal) + return type; + + if (keep_nullable && arguments.front().type->isNullable() && type->canBeInsideNullable()) + return makeNullable(type); + + return type; + } + + bool useDefaultImplementationForNulls() const override { return false; } + bool useDefaultImplementationForLowCardinalityColumns() const override { return false; } + +private: + std::optional diagnostic; + bool keep_nullable; +}; + + +struct CastOverloadName +{ + static constexpr auto cast_name = "CAST"; + static constexpr auto accurate_cast_name = "accurateCast"; + static constexpr auto accurate_cast_or_null_name = "accurateCastOrNull"; +}; + +struct CastInternalOverloadName +{ + static constexpr auto cast_name = "_CAST"; + static constexpr auto accurate_cast_name = "accurate_Cast"; + static constexpr auto accurate_cast_or_null_name = "accurate_CastOrNull"; +}; + +template using CastOverloadResolver = CastOverloadResolverImpl; +template using CastInternalOverloadResolver = CastOverloadResolverImpl; + +} diff --git a/tests/queries/0_stateless/maps b/src/Functions/DateOrDateTimeFunctionsConvertion.cpp similarity index 100% rename from tests/queries/0_stateless/maps rename to src/Functions/DateOrDateTimeFunctionsConvertion.cpp diff --git a/src/Functions/FunctionBase64Conversion.h b/src/Functions/FunctionBase64Conversion.h index 29aa5913b83..c88acc98825 100644 --- a/src/Functions/FunctionBase64Conversion.h +++ b/src/Functions/FunctionBase64Conversion.h @@ -76,6 +76,8 @@ public: return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + bool useDefaultImplementationForConstants() const override { return true; diff --git a/src/Functions/FunctionBinaryArithmetic.h b/src/Functions/FunctionBinaryArithmetic.h index fc36541a078..4907bf6abda 100644 --- a/src/Functions/FunctionBinaryArithmetic.h +++ b/src/Functions/FunctionBinaryArithmetic.h @@ -955,6 +955,12 @@ public: size_t getNumberOfArguments() const override { return 2; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & arguments) const override + { + return ((IsOperation::div_int || IsOperation::modulo) && !arguments[1].is_const) + || (IsOperation::div_floating && (isDecimalOrNullableDecimal(arguments[0].type) || isDecimalOrNullableDecimal(arguments[1].type))); + } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { return getReturnTypeImplStatic(arguments, context); diff --git a/src/Functions/FunctionBitTestMany.h b/src/Functions/FunctionBitTestMany.h index c2797ee69b4..21ff1bc9846 100644 --- a/src/Functions/FunctionBitTestMany.h +++ b/src/Functions/FunctionBitTestMany.h @@ -29,6 +29,7 @@ public: String getName() const override { return name; } bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } size_t getNumberOfArguments() const override { return 0; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override diff --git a/src/Functions/FunctionChar.cpp b/src/Functions/FunctionChar.cpp index 1cbb60b7760..f50e212d9b2 100644 --- a/src/Functions/FunctionChar.cpp +++ b/src/Functions/FunctionChar.cpp @@ -30,6 +30,7 @@ public: bool isVariadic() const override { return true; } bool isInjective(const ColumnsWithTypeAndName &) const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } size_t getNumberOfArguments() const override { return 0; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override diff --git a/src/Functions/FunctionCustomWeekToSomething.h b/src/Functions/FunctionCustomWeekToSomething.h index b5ea01418c1..0fb91532c58 100644 --- a/src/Functions/FunctionCustomWeekToSomething.h +++ b/src/Functions/FunctionCustomWeekToSomething.h @@ -30,6 +30,7 @@ public: String getName() const override { return name; } bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } size_t getNumberOfArguments() const override { return 0; } DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override diff --git a/src/Functions/FunctionDateOrDateTimeAddInterval.h b/src/Functions/FunctionDateOrDateTimeAddInterval.h index cfb53a65f7f..2721a56fe8b 100644 --- a/src/Functions/FunctionDateOrDateTimeAddInterval.h +++ b/src/Functions/FunctionDateOrDateTimeAddInterval.h @@ -399,6 +399,7 @@ public: bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { diff --git a/src/Functions/FunctionDateOrDateTimeToSomething.h b/src/Functions/FunctionDateOrDateTimeToSomething.h index abf7f967653..5f23947ce7d 100644 --- a/src/Functions/FunctionDateOrDateTimeToSomething.h +++ b/src/Functions/FunctionDateOrDateTimeToSomething.h @@ -33,6 +33,7 @@ public: } bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } size_t getNumberOfArguments() const override { return 0; } DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override diff --git a/src/Functions/FunctionFQDN.cpp b/src/Functions/FunctionFQDN.cpp index 304aad17d22..9024167f13c 100644 --- a/src/Functions/FunctionFQDN.cpp +++ b/src/Functions/FunctionFQDN.cpp @@ -24,6 +24,8 @@ public: bool isDeterministic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + size_t getNumberOfArguments() const override { return 0; diff --git a/src/Functions/FunctionFactory.cpp b/src/Functions/FunctionFactory.cpp index b1437d58c09..64e5dce413d 100644 --- a/src/Functions/FunctionFactory.cpp +++ b/src/Functions/FunctionFactory.cpp @@ -26,8 +26,8 @@ const String & getFunctionCanonicalNameIfAny(const String & name) return FunctionFactory::instance().getCanonicalNameIfAny(name); } -void FunctionFactory::registerFunction(const - std::string & name, +void FunctionFactory::registerFunction( + const std::string & name, Value creator, CaseSensitiveness case_sensitiveness) { @@ -119,8 +119,8 @@ FunctionOverloadResolverPtr FunctionFactory::tryGetImpl( } FunctionOverloadResolverPtr FunctionFactory::tryGet( - const std::string & name, - ContextPtr context) const + const std::string & name, + ContextPtr context) const { auto impl = tryGetImpl(name, context); return impl ? std::move(impl) : nullptr; diff --git a/src/Functions/FunctionFile.cpp b/src/Functions/FunctionFile.cpp index 3239705281e..5a123c9557c 100644 --- a/src/Functions/FunctionFile.cpp +++ b/src/Functions/FunctionFile.cpp @@ -33,6 +33,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool isInjective(const ColumnsWithTypeAndName &) const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { diff --git a/src/Functions/FunctionHelpers.cpp b/src/Functions/FunctionHelpers.cpp index eac1a7ad1a1..16dd34d0162 100644 --- a/src/Functions/FunctionHelpers.cpp +++ b/src/Functions/FunctionHelpers.cpp @@ -303,4 +303,14 @@ NullPresence getNullPresense(const ColumnsWithTypeAndName & args) return res; } +bool isDecimalOrNullableDecimal(const DataTypePtr & type) +{ + WhichDataType which(type); + if (which.isDecimal()) + return true; + if (!which.isNullable()) + return false; + return isDecimal(assert_cast(type.get())->getNestedType()); +} + } diff --git a/src/Functions/FunctionHelpers.h b/src/Functions/FunctionHelpers.h index 5abe24f4e50..5fc8a06681a 100644 --- a/src/Functions/FunctionHelpers.h +++ b/src/Functions/FunctionHelpers.h @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -171,4 +172,5 @@ struct NullPresence NullPresence getNullPresense(const ColumnsWithTypeAndName & args); +bool isDecimalOrNullableDecimal(const DataTypePtr & type); } diff --git a/src/Functions/FunctionJoinGet.cpp b/src/Functions/FunctionJoinGet.cpp index a78cd70f419..ee173607437 100644 --- a/src/Functions/FunctionJoinGet.cpp +++ b/src/Functions/FunctionJoinGet.cpp @@ -90,11 +90,17 @@ FunctionBasePtr JoinGetOverloadResolver::buildImpl(const ColumnsWithTyp ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); auto [storage_join, attr_name] = getJoin(arguments, getContext()); DataTypes data_types(arguments.size() - 2); - for (size_t i = 2; i < arguments.size(); ++i) - data_types[i - 2] = arguments[i].type; + DataTypes argument_types(arguments.size()); + for (size_t i = 0; i < arguments.size(); ++i) + { + if (i >= 2) + data_types[i - 2] = arguments[i].type; + argument_types[i] = arguments[i].type; + } auto return_type = storage_join->joinGetCheckAndGetReturnType(data_types, attr_name, or_null); auto table_lock = storage_join->lockForShare(getContext()->getInitialQueryId(), getContext()->getSettingsRef().lock_acquire_timeout); - return std::make_unique>(table_lock, storage_join, attr_name, data_types, return_type); + + return std::make_unique>(table_lock, storage_join, attr_name, argument_types, return_type); } void registerFunctionJoinGet(FunctionFactory & factory) diff --git a/src/Functions/FunctionJoinGet.h b/src/Functions/FunctionJoinGet.h index c701625e9cd..3ddab51e2d9 100644 --- a/src/Functions/FunctionJoinGet.h +++ b/src/Functions/FunctionJoinGet.h @@ -60,6 +60,8 @@ public: String getName() const override { return name; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + const DataTypes & getArgumentTypes() const override { return argument_types; } const DataTypePtr & getResultType() const override { return return_type; } diff --git a/src/Functions/FunctionMathBinaryFloat64.h b/src/Functions/FunctionMathBinaryFloat64.h index 8cc012d3ab2..da6c71fdfbb 100644 --- a/src/Functions/FunctionMathBinaryFloat64.h +++ b/src/Functions/FunctionMathBinaryFloat64.h @@ -32,6 +32,7 @@ public: static_assert(Impl::rows_per_iteration > 0, "Impl must process at least one row per iteration"); bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } private: String getName() const override { return name; } diff --git a/src/Functions/FunctionMathConstFloat64.h b/src/Functions/FunctionMathConstFloat64.h index ab7d401e99e..1d866b3dcd8 100644 --- a/src/Functions/FunctionMathConstFloat64.h +++ b/src/Functions/FunctionMathConstFloat64.h @@ -20,6 +20,8 @@ private: size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes & /*arguments*/) const override { return std::make_shared(); diff --git a/src/Functions/FunctionMathUnary.h b/src/Functions/FunctionMathUnary.h index a637bbe3bd8..0c840bae2a3 100644 --- a/src/Functions/FunctionMathUnary.h +++ b/src/Functions/FunctionMathUnary.h @@ -41,6 +41,8 @@ private: String getName() const override { return name; } size_t getNumberOfArguments() const override { return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { const auto & arg = arguments.front(); diff --git a/src/Functions/FunctionNumericPredicate.h b/src/Functions/FunctionNumericPredicate.h index c539907ddc8..9613e97096b 100644 --- a/src/Functions/FunctionNumericPredicate.h +++ b/src/Functions/FunctionNumericPredicate.h @@ -38,6 +38,11 @@ public: return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override + { + return false; + } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (!isNativeNumber(arguments.front())) diff --git a/src/Functions/FunctionSQLJSON.h b/src/Functions/FunctionSQLJSON.h index 497909b5242..a9f030d1eee 100644 --- a/src/Functions/FunctionSQLJSON.h +++ b/src/Functions/FunctionSQLJSON.h @@ -153,6 +153,7 @@ public: size_t getNumberOfArguments() const override { return 0; } bool useDefaultImplementationForConstants() const override { return true; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {0}; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { diff --git a/src/Functions/FunctionSnowflake.h b/src/Functions/FunctionSnowflake.h new file mode 100644 index 00000000000..95d02de3a2b --- /dev/null +++ b/src/Functions/FunctionSnowflake.h @@ -0,0 +1,207 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include + + +namespace DB +{ +namespace ErrorCodes +{ + extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; + extern const int ILLEGAL_TYPE_OF_ARGUMENT; +} + +/** According to Twitter's post on Snowflake, we can extract the timestamp for a snowflake ID by right shifting + * the snowflake ID by 22 bits(10 bits machine ID and 12 bits sequence ID) and adding the Twitter epoch time of 1288834974657. + * https://en.wikipedia.org/wiki/Snowflake_ID + * https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake + * https://ws-dl.blogspot.com/2019/08/2019-08-03-tweetedat-finding-tweet.html +*/ +static constexpr long snowflake_epoch = 1288834974657L; +static constexpr int time_shift = 22; + +class FunctionDateTimeToSnowflake : public IFunction +{ +private: + const char * name; + +public: + FunctionDateTimeToSnowflake(const char * name_) : name(name_) { } + + String getName() const override { return name; } + size_t getNumberOfArguments() const override { return 1; } + bool isVariadic() const override { return false; } + bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + + DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override + { + if (!isDateTime(arguments[0].type)) + throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "The only argument for function {} must be DateTime", name); + + return std::make_shared(); + } + + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t input_rows_count) const override + { + const auto & src = arguments[0]; + const auto & col = *src.column; + + auto res_column = ColumnInt64::create(input_rows_count); + auto & result_data = res_column->getData(); + + const auto & source_data = typeid_cast(col).getData(); + for (size_t i = 0; i < input_rows_count; ++i) + { + result_data[i] = (Int64(source_data[i]) * 1000 - snowflake_epoch) << time_shift; + } + + return res_column; + } +}; + + +class FunctionSnowflakeToDateTime : public IFunction +{ +private: + const char * name; + +public: + FunctionSnowflakeToDateTime(const char * name_) : name(name_) { } + + String getName() const override { return name; } + size_t getNumberOfArguments() const override { return 0; } + bool isVariadic() const override { return true; } + bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + + DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override + { + if (arguments.size() < 1 || arguments.size() > 2) + throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} takes one or two arguments", name); + + if (!typeid_cast(arguments[0].type.get())) + throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "The first argument for function {} must be Int64", name); + + std::string timezone; + if (arguments.size() == 2) + timezone = extractTimeZoneNameFromFunctionArguments(arguments, 1, 0); + + return std::make_shared(timezone); + } + + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t input_rows_count) const override + { + const auto & src = arguments[0]; + const auto & col = *src.column; + + auto res_column = ColumnUInt32::create(input_rows_count); + auto & result_data = res_column->getData(); + + const auto & source_data = typeid_cast(col).getData(); + + for (size_t i = 0; i < input_rows_count; ++i) + { + result_data[i] = ((source_data[i] >> time_shift) + snowflake_epoch) / 1000; + } + return res_column; + } +}; + + +class FunctionDateTime64ToSnowflake : public IFunction +{ +private: + const char * name; + +public: + FunctionDateTime64ToSnowflake(const char * name_) : name(name_) { } + + String getName() const override { return name; } + size_t getNumberOfArguments() const override { return 1; } + bool isVariadic() const override { return false; } + bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + + DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override + { + if (!isDateTime64(arguments[0].type)) + throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "The only argument for function {} must be DateTime64", name); + + return std::make_shared(); + } + + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t input_rows_count) const override + { + const auto & src = arguments[0]; + const auto & col = *src.column; + + auto res_column = ColumnInt64::create(input_rows_count); + auto & result_data = res_column->getData(); + + const auto & source_data = typeid_cast &>(col).getData(); + for (size_t i = 0; i < input_rows_count; ++i) + { + result_data[i] = (source_data[i] - snowflake_epoch) << time_shift; + } + + return res_column; + } +}; + + +class FunctionSnowflakeToDateTime64 : public IFunction +{ +private: + const char * name; + +public: + FunctionSnowflakeToDateTime64(const char * name_) : name(name_) { } + + String getName() const override { return name; } + size_t getNumberOfArguments() const override { return 0; } + bool isVariadic() const override { return true; } + bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + + DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override + { + if (arguments.size() < 1 || arguments.size() > 2) + throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} takes one or two arguments", name); + + if (!typeid_cast(arguments[0].type.get())) + throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "The first argument for function {} must be Int64", name); + + std::string timezone; + if (arguments.size() == 2) + timezone = extractTimeZoneNameFromFunctionArguments(arguments, 1, 0); + + return std::make_shared(3, timezone); + } + + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t input_rows_count) const override + { + const auto & src = arguments[0]; + const auto & col = *src.column; + + auto res_column = ColumnDecimal::create(input_rows_count, 3); + auto & result_data = res_column->getData(); + + const auto & source_data = typeid_cast(col).getData(); + + for (size_t i = 0; i < input_rows_count; ++i) + { + result_data[i] = (source_data[i] >> time_shift) + snowflake_epoch; + } + return res_column; + } +}; + +} diff --git a/src/Functions/FunctionStartsEndsWith.h b/src/Functions/FunctionStartsEndsWith.h index 65dbf393290..5a3aba62f26 100644 --- a/src/Functions/FunctionStartsEndsWith.h +++ b/src/Functions/FunctionStartsEndsWith.h @@ -42,6 +42,11 @@ public: return name; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override + { + return true; + } + size_t getNumberOfArguments() const override { return 2; diff --git a/src/Functions/FunctionStringOrArrayToT.h b/src/Functions/FunctionStringOrArrayToT.h index 69f0741a741..3bf1f0a5d34 100644 --- a/src/Functions/FunctionStringOrArrayToT.h +++ b/src/Functions/FunctionStringOrArrayToT.h @@ -21,7 +21,7 @@ namespace ErrorCodes } -template +template class FunctionStringOrArrayToT : public IFunction { public: @@ -41,6 +41,11 @@ public: return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override + { + return is_suitable_for_short_circuit_arguments_execution; + } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (!isStringOrFixedString(arguments[0]) diff --git a/src/Functions/FunctionStringReplace.h b/src/Functions/FunctionStringReplace.h index 2e99f58531a..09aa5586929 100644 --- a/src/Functions/FunctionStringReplace.h +++ b/src/Functions/FunctionStringReplace.h @@ -29,6 +29,8 @@ public: size_t getNumberOfArguments() const override { return 3; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + bool useDefaultImplementationForConstants() const override { return true; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1, 2}; } diff --git a/src/Functions/FunctionStringToString.h b/src/Functions/FunctionStringToString.h index 26480a83995..4dafdb6627f 100644 --- a/src/Functions/FunctionStringToString.h +++ b/src/Functions/FunctionStringToString.h @@ -43,6 +43,11 @@ public: return is_injective; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override + { + return true; + } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (!isStringOrFixedString(arguments[0])) diff --git a/src/Functions/FunctionUnaryArithmetic.h b/src/Functions/FunctionUnaryArithmetic.h index 68fcfadfb84..f85eff3f3dd 100644 --- a/src/Functions/FunctionUnaryArithmetic.h +++ b/src/Functions/FunctionUnaryArithmetic.h @@ -120,6 +120,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool isInjective(const ColumnsWithTypeAndName &) const override { return is_injective; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } bool useDefaultImplementationForConstants() const override { return true; } diff --git a/src/Functions/FunctionUnixTimestamp64.h b/src/Functions/FunctionUnixTimestamp64.h index a4357c148ac..2e631ea22f0 100644 --- a/src/Functions/FunctionUnixTimestamp64.h +++ b/src/Functions/FunctionUnixTimestamp64.h @@ -35,6 +35,7 @@ public: String getName() const override { return name; } size_t getNumberOfArguments() const override { return 1; } bool isVariadic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } bool useDefaultImplementationForConstants() const override { return true; } DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override @@ -99,6 +100,7 @@ public: String getName() const override { return name; } size_t getNumberOfArguments() const override { return 0; } bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } bool useDefaultImplementationForConstants() const override { return true; } DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override diff --git a/src/Functions/FunctionsAES.h b/src/Functions/FunctionsAES.h index b76b454fd77..d524f3c9b9a 100644 --- a/src/Functions/FunctionsAES.h +++ b/src/Functions/FunctionsAES.h @@ -148,6 +148,7 @@ private: String getName() const override { return name; } bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } size_t getNumberOfArguments() const override { return 0; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {0}; } bool useDefaultImplementationForConstants() const override { return true; } @@ -423,6 +424,7 @@ private: String getName() const override { return name; } bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } size_t getNumberOfArguments() const override { return 0; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {0}; } bool useDefaultImplementationForConstants() const override { return true; } diff --git a/src/Functions/FunctionsBinaryRepr.cpp b/src/Functions/FunctionsBinaryRepr.cpp index 08d74b30166..7f0835d8edf 100644 --- a/src/Functions/FunctionsBinaryRepr.cpp +++ b/src/Functions/FunctionsBinaryRepr.cpp @@ -262,6 +262,8 @@ public: bool isInjective(const ColumnsWithTypeAndName &) const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { WhichDataType which(arguments[0]); @@ -494,6 +496,8 @@ public: size_t getNumberOfArguments() const override { return 1; } bool isInjective(const ColumnsWithTypeAndName &) const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (!isString(arguments[0])) diff --git a/src/Functions/FunctionsBitToArray.cpp b/src/Functions/FunctionsBitToArray.cpp index 32c45823e0f..309fbafaf91 100644 --- a/src/Functions/FunctionsBitToArray.cpp +++ b/src/Functions/FunctionsBitToArray.cpp @@ -45,6 +45,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool isInjective(const ColumnsWithTypeAndName &) const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { @@ -141,6 +142,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool isInjective(const ColumnsWithTypeAndName &) const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { @@ -227,6 +229,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool isInjective(const ColumnsWithTypeAndName &) const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/FunctionsBitmap.h b/src/Functions/FunctionsBitmap.h index 8155dbdcf8e..3d63ea42d28 100644 --- a/src/Functions/FunctionsBitmap.h +++ b/src/Functions/FunctionsBitmap.h @@ -99,6 +99,8 @@ public: bool isVariadic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + size_t getNumberOfArguments() const override { return 1; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override @@ -227,6 +229,8 @@ public: bool isVariadic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + size_t getNumberOfArguments() const override { return 1; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override @@ -317,6 +321,8 @@ public: bool isVariadic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + size_t getNumberOfArguments() const override { return 3; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override @@ -490,6 +496,8 @@ public: bool isVariadic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + size_t getNumberOfArguments() const override { return 3; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override @@ -656,6 +664,8 @@ public: bool isVariadic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + size_t getNumberOfArguments() const override { return 1; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override @@ -828,6 +838,8 @@ public: bool isVariadic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + size_t getNumberOfArguments() const override { return 2; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override @@ -932,6 +944,8 @@ public: bool isVariadic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + size_t getNumberOfArguments() const override { return 2; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override @@ -1075,6 +1089,8 @@ public: bool isVariadic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + size_t getNumberOfArguments() const override { return 2; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override diff --git a/src/Functions/FunctionsCodingIP.cpp b/src/Functions/FunctionsCodingIP.cpp index 20af7d41aca..1a217217787 100644 --- a/src/Functions/FunctionsCodingIP.cpp +++ b/src/Functions/FunctionsCodingIP.cpp @@ -50,6 +50,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool isInjective(const ColumnsWithTypeAndName &) const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { @@ -120,6 +121,8 @@ public: size_t getNumberOfArguments() const override { return 3; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { const auto * ptr = checkAndGetDataType(arguments[0].get()); @@ -249,6 +252,8 @@ public: size_t getNumberOfArguments() const override { return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (!isString(arguments[0])) @@ -324,6 +329,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool isInjective(const ColumnsWithTypeAndName &) const override { return mask_tail_octets == 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { @@ -385,6 +391,8 @@ public: size_t getNumberOfArguments() const override { return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (!isString(arguments[0])) @@ -445,6 +453,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool isInjective(const ColumnsWithTypeAndName &) const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { @@ -501,6 +510,8 @@ public: return name; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + size_t getNumberOfArguments() const override { return 1; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override @@ -521,6 +532,8 @@ public: String getName() const override { return name; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (!isString(arguments[0])) @@ -544,6 +557,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool isInjective(const ColumnsWithTypeAndName &) const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { @@ -674,6 +688,8 @@ public: size_t getNumberOfArguments() const override { return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (!isString(arguments[0])) @@ -763,6 +779,7 @@ public: String getName() const override { return name; } size_t getNumberOfArguments() const override { return 2; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { @@ -877,6 +894,7 @@ public: String getName() const override { return name; } size_t getNumberOfArguments() const override { return 2; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { @@ -958,6 +976,8 @@ public: String getName() const override { return name; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (!isString(arguments[0])) @@ -1004,6 +1024,8 @@ public: String getName() const override { return name; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (!isString(arguments[0])) diff --git a/src/Functions/FunctionsCodingUUID.cpp b/src/Functions/FunctionsCodingUUID.cpp index 5f3e7b0de4a..5ac1d585325 100644 --- a/src/Functions/FunctionsCodingUUID.cpp +++ b/src/Functions/FunctionsCodingUUID.cpp @@ -39,6 +39,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool isInjective(const ColumnsWithTypeAndName &) const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { @@ -137,6 +138,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool isInjective(const ColumnsWithTypeAndName &) const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/FunctionsComparison.h b/src/Functions/FunctionsComparison.h index b9c7c211b74..31356deb3fe 100644 --- a/src/Functions/FunctionsComparison.h +++ b/src/Functions/FunctionsComparison.h @@ -1071,6 +1071,8 @@ public: size_t getNumberOfArguments() const override { return 2; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + /// Get result types by argument types. If the function does not apply to these arguments, throw an exception. DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/FunctionsConsistentHashing.h b/src/Functions/FunctionsConsistentHashing.h index 4c393f6ee01..e946e05e4cc 100644 --- a/src/Functions/FunctionsConsistentHashing.h +++ b/src/Functions/FunctionsConsistentHashing.h @@ -39,6 +39,8 @@ public: return 2; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (!isInteger(arguments[0])) diff --git a/src/Functions/FunctionsConversion.cpp b/src/Functions/FunctionsConversion.cpp index d7686318efc..f32d5df8a21 100644 --- a/src/Functions/FunctionsConversion.cpp +++ b/src/Functions/FunctionsConversion.cpp @@ -7,6 +7,8 @@ namespace DB void registerFunctionFixedString(FunctionFactory & factory); +void registerCastOverloadResolvers(FunctionFactory & factory); + void registerFunctionsConversion(FunctionFactory & factory) { factory.registerFunction(); @@ -43,9 +45,7 @@ void registerFunctionsConversion(FunctionFactory & factory) factory.registerFunction(); - factory.registerFunction>(FunctionFactory::CaseInsensitive); - factory.registerFunction>(); - factory.registerFunction>(); + registerCastOverloadResolvers(factory); factory.registerFunction(); factory.registerFunction(); diff --git a/src/Functions/FunctionsConversion.h b/src/Functions/FunctionsConversion.h index 67a02e3fd34..75432c7c0d1 100644 --- a/src/Functions/FunctionsConversion.h +++ b/src/Functions/FunctionsConversion.h @@ -733,7 +733,7 @@ struct FormatImpl> template static ReturnType execute(const FieldType x, WriteBuffer & wb, const DataTypeDecimal * type, const DateLUTImpl *) { - writeText(x, type->getScale(), wb); + writeText(x, type->getScale(), wb, false); return ReturnType(true); } }; @@ -1454,6 +1454,10 @@ public: static constexpr bool to_string_or_fixed_string = std::is_same_v || std::is_same_v; + static constexpr bool to_date_or_datetime = std::is_same_v || + std::is_same_v || + std::is_same_v; + static FunctionPtr create(ContextPtr) { return std::make_shared(); } static FunctionPtr create() { return std::make_shared(); } @@ -1465,6 +1469,11 @@ public: bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } bool isInjective(const ColumnsWithTypeAndName &) const override { return std::is_same_v; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & arguments) const override + { + /// TODO: We can make more optimizations here. + return !(to_date_or_datetime && isNumber(*arguments[0].type)); + } using DefaultReturnTypeGetter = std::function; static DataTypePtr getReturnTypeDefaultImplementationForNulls(const ColumnsWithTypeAndName & arguments, const DefaultReturnTypeGetter & getter) @@ -1789,6 +1798,7 @@ public: } bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } size_t getNumberOfArguments() const override { return 0; } bool useDefaultImplementationForConstants() const override { return true; } @@ -2412,7 +2422,8 @@ private: std::optional diagnostic; }; -struct NameCast { static constexpr auto name = "CAST"; }; +struct CastName { static constexpr auto name = "CAST"; }; +struct CastInternalName { static constexpr auto name = "_CAST"; }; enum class CastType { @@ -2421,17 +2432,26 @@ enum class CastType accurateOrNull }; -class FunctionCast final : public IFunctionBase +class FunctionCastBase : public IFunctionBase +{ +public: + using MonotonicityForRange = std::function; + using Diagnostic = ExecutableFunctionCast::Diagnostic; +}; + +template +class FunctionCast final : public FunctionCastBase { public: using WrapperType = std::function; - using MonotonicityForRange = std::function; - using Diagnostic = ExecutableFunctionCast::Diagnostic; - FunctionCast(const char * name_, MonotonicityForRange && monotonicity_for_range_ - , const DataTypes & argument_types_, const DataTypePtr & return_type_ - , std::optional diagnostic_, CastType cast_type_) - : name(name_), monotonicity_for_range(std::move(monotonicity_for_range_)) + FunctionCast(const char * cast_name_ + , MonotonicityForRange && monotonicity_for_range_ + , const DataTypes & argument_types_ + , const DataTypePtr & return_type_ + , std::optional diagnostic_ + , CastType cast_type_) + : cast_name(cast_name_), monotonicity_for_range(std::move(monotonicity_for_range_)) , argument_types(argument_types_), return_type(return_type_), diagnostic(std::move(diagnostic_)) , cast_type(cast_type_) { @@ -2445,7 +2465,7 @@ public: try { return std::make_unique( - prepareUnpackDictionaries(getArgumentTypes()[0], getResultType()), name, diagnostic); + prepareUnpackDictionaries(getArgumentTypes()[0], getResultType()), cast_name, diagnostic); } catch (Exception & e) { @@ -2456,10 +2476,11 @@ public: } } - String getName() const override { return name; } + String getName() const override { return cast_name; } bool isDeterministic() const override { return true; } bool isDeterministicInScopeOfQuery() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } bool hasInformationAboutMonotonicity() const override { @@ -2473,7 +2494,7 @@ public: private: - const char * name; + const char * cast_name; MonotonicityForRange monotonicity_for_range; DataTypes argument_types; @@ -2515,7 +2536,7 @@ private: { /// In case when converting to Nullable type, we apply different parsing rule, /// that will not throw an exception but return NULL in case of malformed input. - FunctionPtr function = FunctionConvertFromString::create(); + FunctionPtr function = FunctionConvertFromString::create(); return createFunctionAdaptor(function, from_type); } else if (!can_apply_accurate_cast) @@ -2539,12 +2560,12 @@ private: { if (wrapper_cast_type == CastType::accurate) { - result_column = ConvertImpl::execute( + result_column = ConvertImpl::execute( arguments, result_type, input_rows_count, AccurateConvertStrategyAdditions()); } else { - result_column = ConvertImpl::execute( + result_column = ConvertImpl::execute( arguments, result_type, input_rows_count, AccurateOrNullConvertStrategyAdditions()); } @@ -2559,7 +2580,7 @@ private: { if (wrapper_cast_type == CastType::accurateOrNull) { - auto nullable_column_wrapper = FunctionCast::createToNullableColumnWrapper(); + auto nullable_column_wrapper = FunctionCast::createToNullableColumnWrapper(); return nullable_column_wrapper(arguments, result_type, column_nullable, input_rows_count); } else @@ -2631,7 +2652,7 @@ private: { AccurateConvertStrategyAdditions additions; additions.scale = scale; - result_column = ConvertImpl::execute( + result_column = ConvertImpl::execute( arguments, result_type, input_rows_count, additions); return true; @@ -2640,7 +2661,7 @@ private: { AccurateOrNullConvertStrategyAdditions additions; additions.scale = scale; - result_column = ConvertImpl::execute( + result_column = ConvertImpl::execute( arguments, result_type, input_rows_count, additions); return true; @@ -2653,14 +2674,14 @@ private: /// Consistent with CAST(Nullable(String) AS Nullable(Numbers)) /// In case when converting to Nullable type, we apply different parsing rule, /// that will not throw an exception but return NULL in case of malformed input. - result_column = ConvertImpl::execute( + result_column = ConvertImpl::execute( arguments, result_type, input_rows_count, scale); return true; } } - result_column = ConvertImpl::execute(arguments, result_type, input_rows_count, scale); + result_column = ConvertImpl::execute(arguments, result_type, input_rows_count, scale); return true; }); @@ -2670,7 +2691,7 @@ private: { if (wrapper_cast_type == CastType::accurateOrNull) { - auto nullable_column_wrapper = FunctionCast::createToNullableColumnWrapper(); + auto nullable_column_wrapper = FunctionCast::createToNullableColumnWrapper(); return nullable_column_wrapper(arguments, result_type, column_nullable, input_rows_count); } else @@ -2990,7 +3011,7 @@ private: template WrapperType createStringToEnumWrapper() const { - const char * function_name = name; + const char * function_name = cast_name; return [function_name] ( ColumnsWithTypeAndName & arguments, const DataTypePtr & res_type, const ColumnNullable * nullable_col, size_t /*input_rows_count*/) { @@ -3324,7 +3345,7 @@ private: class MonotonicityHelper { public: - using MonotonicityForRange = FunctionCast::MonotonicityForRange; + using MonotonicityForRange = FunctionCastBase::MonotonicityForRange; template static auto monotonicityForType(const DataType * const) @@ -3382,89 +3403,4 @@ public: } }; -template -class CastOverloadResolver : public IFunctionOverloadResolver -{ -public: - using MonotonicityForRange = FunctionCast::MonotonicityForRange; - using Diagnostic = FunctionCast::Diagnostic; - - static constexpr auto accurate_cast_name = "accurateCast"; - static constexpr auto accurate_cast_or_null_name = "accurateCastOrNull"; - static constexpr auto cast_name = "CAST"; - - static constexpr auto name = cast_type == CastType::accurate - ? accurate_cast_name - : (cast_type == CastType::accurateOrNull ? accurate_cast_or_null_name : cast_name); - - static FunctionOverloadResolverPtr create(ContextPtr context) - { - return createImpl(context->getSettingsRef().cast_keep_nullable); - } - - static FunctionOverloadResolverPtr createImpl(bool keep_nullable, std::optional diagnostic = {}) - { - return std::make_unique(keep_nullable, std::move(diagnostic)); - } - - - explicit CastOverloadResolver(bool keep_nullable_, std::optional diagnostic_ = {}) - : keep_nullable(keep_nullable_), diagnostic(std::move(diagnostic_)) - {} - - String getName() const override { return name; } - - size_t getNumberOfArguments() const override { return 2; } - - ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1}; } - -protected: - - FunctionBasePtr buildImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & return_type) const override - { - DataTypes data_types(arguments.size()); - - for (size_t i = 0; i < arguments.size(); ++i) - data_types[i] = arguments[i].type; - - auto monotonicity = MonotonicityHelper::getMonotonicityInformation(arguments.front().type, return_type.get()); - return std::make_unique(name, std::move(monotonicity), data_types, return_type, diagnostic, cast_type); - } - - DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override - { - const auto & column = arguments.back().column; - if (!column) - throw Exception("Second argument to " + getName() + " must be a constant string describing type." - " Instead there is non-constant column of type " + arguments.back().type->getName(), - ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); - - const auto * type_col = checkAndGetColumnConst(column.get()); - if (!type_col) - throw Exception("Second argument to " + getName() + " must be a constant string describing type." - " Instead there is a column with the following structure: " + column->dumpStructure(), - ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); - - DataTypePtr type = DataTypeFactory::instance().get(type_col->getValue()); - - if constexpr (cast_type == CastType::accurateOrNull) - { - return makeNullable(type); - } - else - { - if (keep_nullable && arguments.front().type->isNullable()) - return makeNullable(type); - return type; - } - } - - bool useDefaultImplementationForNulls() const override { return false; } - bool useDefaultImplementationForLowCardinalityColumns() const override { return false; } - -private: - bool keep_nullable; - std::optional diagnostic; -}; - } diff --git a/src/Functions/FunctionsEmbeddedDictionaries.h b/src/Functions/FunctionsEmbeddedDictionaries.h index 884f53125eb..fc08ffe4976 100644 --- a/src/Functions/FunctionsEmbeddedDictionaries.h +++ b/src/Functions/FunctionsEmbeddedDictionaries.h @@ -157,6 +157,7 @@ public: bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { @@ -251,6 +252,7 @@ public: bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { @@ -389,6 +391,7 @@ public: bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { @@ -595,6 +598,8 @@ public: /// even in face of fact that there are many different cities named Moscow. bool isInjective(const ColumnsWithTypeAndName &) const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (arguments.size() != 1 && arguments.size() != 2) diff --git a/src/Functions/FunctionsExternalDictionaries.h b/src/Functions/FunctionsExternalDictionaries.h index 118855b4bf8..5f94a1e1f4b 100644 --- a/src/Functions/FunctionsExternalDictionaries.h +++ b/src/Functions/FunctionsExternalDictionaries.h @@ -42,7 +42,6 @@ namespace ErrorCodes extern const int UNSUPPORTED_METHOD; extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; extern const int ILLEGAL_COLUMN; - extern const int BAD_ARGUMENTS; extern const int TYPE_MISMATCH; } @@ -146,6 +145,8 @@ public: bool isDeterministic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + bool useDefaultImplementationForConstants() const final { return true; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const final { return {0}; } @@ -180,15 +181,16 @@ public: auto dictionary = helper.getDictionary(arguments[0].column); auto dictionary_key_type = dictionary->getKeyType(); + auto dictionary_special_key_type = dictionary->getSpecialKeyType(); - const ColumnWithTypeAndName & key_column_with_type = arguments[1]; + const auto & key_column_with_type = arguments[1]; auto key_column = key_column_with_type.column; auto key_column_type = key_column_with_type.type; - ColumnPtr range_col = nullptr; - DataTypePtr range_col_type = nullptr; + ColumnPtr range_col; + DataTypePtr range_col_type; - if (dictionary_key_type == DictionaryKeyType::range) + if (dictionary_special_key_type == DictionarySpecialKeyType::Range) { if (arguments.size() != 3) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, @@ -205,7 +207,10 @@ public: getName()); } - if (dictionary_key_type == DictionaryKeyType::simple) + Columns key_columns; + DataTypes key_types; + + if (dictionary_key_type == DictionaryKeyType::Simple) { if (!WhichDataType(key_column_type).isUInt64()) throw Exception( @@ -214,16 +219,23 @@ public: getName(), key_column_with_type.type->getName()); - return dictionary->hasKeys({key_column}, {std::make_shared()}); + key_columns = {key_column}; + key_types = {std::make_shared()}; } - else if (dictionary_key_type == DictionaryKeyType::complex) + else if (dictionary_key_type == DictionaryKeyType::Complex) { /// Functions in external dictionaries_loader only support full-value (not constant) columns with keys. key_column = key_column->convertToFullColumnIfConst(); - size_t keys_size = dictionary->getStructure().getKeysSize(); - if (!isTuple(key_column_type)) + if (isTuple(key_column_type)) { + key_columns = assert_cast(*key_column).getColumnsCopy(); + key_types = assert_cast(*key_column_type).getElements(); + } + else + { + size_t keys_size = dictionary->getStructure().getKeysSize(); + if (keys_size > 1) { throw Exception( @@ -235,30 +247,19 @@ public: } else { - Columns tuple_columns = {std::move(key_column)}; - key_column = ColumnTuple::create(tuple_columns); - - DataTypes tuple_types = {key_column_type}; - key_column_type = std::make_shared(tuple_types); + key_columns = {key_column}; + key_types = {key_column_type}; } } - - const auto & key_columns = assert_cast(*key_column).getColumnsCopy(); - const auto & key_types = assert_cast(*key_column_type).getElements(); - - return dictionary->hasKeys(key_columns, key_types); } - else + + if (dictionary_special_key_type == DictionarySpecialKeyType::Range) { - if (!WhichDataType(key_column_type).isUInt64()) - throw Exception( - ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, - "Second argument of function {} must be UInt64 when dictionary is range. Actual type {}.", - getName(), - key_column_with_type.type->getName()); - - return dictionary->hasKeys({key_column, range_col}, {std::make_shared(), range_col_type}); + key_columns.emplace_back(range_col); + key_types.emplace_back(range_col_type); } + + return dictionary->hasKeys(key_columns, key_types); } private: @@ -288,6 +289,7 @@ public: String getName() const override { return name; } bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } size_t getNumberOfArguments() const override { return 0; } bool useDefaultImplementationForConstants() const final { return true; } @@ -355,13 +357,14 @@ public: auto dictionary = helper.getDictionary(dictionary_name); auto dictionary_key_type = dictionary->getKeyType(); + auto dictionary_special_key_type = dictionary->getSpecialKeyType(); size_t current_arguments_index = 3; ColumnPtr range_col = nullptr; DataTypePtr range_col_type = nullptr; - if (dictionary_key_type == DictionaryKeyType::range) + if (dictionary_special_key_type == DictionarySpecialKeyType::Range) { if (current_arguments_index >= arguments.size()) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, @@ -423,12 +426,13 @@ public: default_cols.emplace_back(nullptr); } - ColumnPtr result; + const auto & key_col_with_type = arguments[2]; + auto key_column = key_col_with_type.column; - const ColumnWithTypeAndName & key_col_with_type = arguments[2]; - const auto key_column = key_col_with_type.column; + Columns key_columns; + DataTypes key_types; - if (dictionary_key_type == DictionaryKeyType::simple) + if (dictionary_key_type == DictionaryKeyType::Simple) { if (!WhichDataType(key_col_with_type.type).isUInt64()) throw Exception( @@ -437,24 +441,24 @@ public: getName(), key_col_with_type.type->getName()); - result = executeDictionaryRequest( - dictionary, - attribute_names, - {key_column}, - {std::make_shared()}, - result_type, - default_cols); + key_columns = {key_column}; + key_types = {std::make_shared()}; } - else if (dictionary_key_type == DictionaryKeyType::complex) + else if (dictionary_key_type == DictionaryKeyType::Complex) { /// Functions in external dictionaries_loader only support full-value (not constant) columns with keys. - ColumnPtr key_column = key_col_with_type.column->convertToFullColumnIfConst(); + key_column = key_column->convertToFullColumnIfConst(); DataTypePtr key_column_type = key_col_with_type.type; - size_t keys_size = dictionary->getStructure().getKeysSize(); - - if (!isTuple(key_column_type)) + if (isTuple(key_column_type)) { + key_columns = assert_cast(*key_column).getColumnsCopy(); + key_types = assert_cast(*key_column_type).getElements(); + } + else if (!isTuple(key_column_type)) + { + size_t keys_size = dictionary->getStructure().getKeysSize(); + if (keys_size > 1) { throw Exception( @@ -466,46 +470,19 @@ public: } else { - Columns tuple_columns = {std::move(key_column)}; - key_column = ColumnTuple::create(tuple_columns); - - DataTypes tuple_types = {key_column_type}; - key_column_type = std::make_shared(tuple_types); + key_columns = {std::move(key_column)}; + key_types = {std::move(key_column_type)}; } } - - const auto & key_columns = assert_cast(*key_column).getColumnsCopy(); - const auto & key_types = assert_cast(*key_column_type).getElements(); - - result = executeDictionaryRequest( - dictionary, - attribute_names, - key_columns, - key_types, - result_type, - default_cols); } - else if (dictionary_key_type == DictionaryKeyType::range) + + if (dictionary_special_key_type == DictionarySpecialKeyType::Range) { - if (!WhichDataType(key_col_with_type.type).isUInt64()) - throw Exception( - ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, - "Third argument of function {} must be UInt64 when dictionary is range. Actual type {}.", - getName(), - key_col_with_type.type->getName()); - - result = executeDictionaryRequest( - dictionary, - attribute_names, - {key_column, range_col}, - {std::make_shared(), range_col_type}, - result_type, - default_cols); + key_columns.emplace_back(range_col); + key_types.emplace_back(range_col_type); } - else - throw Exception(ErrorCodes::BAD_ARGUMENTS, "Unknown dictionary identifier type"); - return result; + return executeDictionaryRequest(dictionary, attribute_names, key_columns, key_types, result_type, default_cols); } private: @@ -611,6 +588,8 @@ private: bool isDeterministic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + ColumnNumbers getArgumentsThatAreAlwaysConstant() const final { return {0, 1}; } bool isInjective(const ColumnsWithTypeAndName & sample_columns) const override @@ -750,6 +729,8 @@ private: bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + bool useDefaultImplementationForConstants() const override { return true; } bool useDefaultImplementationForNulls() const override { return false; } @@ -907,6 +888,7 @@ public: private: size_t getNumberOfArguments() const override { return 2; } bool isInjective(const ColumnsWithTypeAndName & /*sample_columns*/) const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } bool useDefaultImplementationForConstants() const final { return true; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const final { return {0}; } @@ -969,6 +951,7 @@ private: size_t getNumberOfArguments() const override { return 3; } bool useDefaultImplementationForConstants() const final { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const final { return {0}; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override @@ -1037,6 +1020,7 @@ private: bool useDefaultImplementationForConstants() const final { return true; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const final { return {0}; } bool isDeterministic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { @@ -1097,6 +1081,7 @@ private: bool useDefaultImplementationForConstants() const final { return true; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const final { return {0}; } bool isDeterministic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override diff --git a/src/Functions/FunctionsExternalModels.h b/src/Functions/FunctionsExternalModels.h index 8f8b0e0c860..ecfb4179638 100644 --- a/src/Functions/FunctionsExternalModels.h +++ b/src/Functions/FunctionsExternalModels.h @@ -25,6 +25,8 @@ public: bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + bool isDeterministic() const override { return false; } bool useDefaultImplementationForNulls() const override { return false; } diff --git a/src/Functions/FunctionsHashing.cpp b/src/Functions/FunctionsHashing.cpp index 5983e97a093..d218d6a74c4 100644 --- a/src/Functions/FunctionsHashing.cpp +++ b/src/Functions/FunctionsHashing.cpp @@ -14,6 +14,7 @@ void registerFunctionsHashing(FunctionFactory & factory) factory.registerFunction(); factory.registerFunction(); factory.registerFunction(); + factory.registerFunction(); #endif factory.registerFunction(); factory.registerFunction(); diff --git a/src/Functions/FunctionsHashing.h b/src/Functions/FunctionsHashing.h index d83ef024394..4c6f1485813 100644 --- a/src/Functions/FunctionsHashing.h +++ b/src/Functions/FunctionsHashing.h @@ -193,6 +193,20 @@ struct SHA256Impl SHA256_Final(out_char_data, &ctx); } }; + +struct SHA512Impl +{ + static constexpr auto name = "SHA512"; + enum { length = 64 }; + + static void apply(const char * begin, const size_t size, unsigned char * out_char_data) + { + SHA512_CTX ctx; + SHA512_Init(&ctx); + SHA512_Update(&ctx, reinterpret_cast(begin), size); + SHA512_Final(out_char_data, &ctx); + } +}; #endif struct SipHash64Impl @@ -556,6 +570,8 @@ public: bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t /*input_rows_count*/) const override { if (const ColumnString * col_from = checkAndGetColumn(arguments[0].column.get())) @@ -660,6 +676,8 @@ public: bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t /*input_rows_count*/) const override { const IDataType * from_type = arguments[0].type.get(); @@ -1046,6 +1064,7 @@ public: bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & /*arguments*/) const override { @@ -1192,6 +1211,7 @@ public: bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { @@ -1312,6 +1332,7 @@ using FunctionMD5 = FunctionStringHashFixedString; using FunctionSHA1 = FunctionStringHashFixedString; using FunctionSHA224 = FunctionStringHashFixedString; using FunctionSHA256 = FunctionStringHashFixedString; +using FunctionSHA512 = FunctionStringHashFixedString; #endif using FunctionSipHash128 = FunctionStringHashFixedString; using FunctionCityHash64 = FunctionAnyHash; diff --git a/src/Functions/FunctionsJSON.h b/src/Functions/FunctionsJSON.h index d0762ff9a8d..df17a39812b 100644 --- a/src/Functions/FunctionsJSON.h +++ b/src/Functions/FunctionsJSON.h @@ -287,6 +287,7 @@ public: bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { @@ -695,6 +696,8 @@ struct JSONExtractTree { if (element.isString()) return JSONExtractStringImpl::insertResultToColumn(dest, element, {}); + else if (element.isNull()) + return false; else return JSONExtractRawImpl::insertResultToColumn(dest, element, {}); } diff --git a/src/Functions/FunctionsLogical.cpp b/src/Functions/FunctionsLogical.cpp index f427c9a9440..f427deced3a 100644 --- a/src/Functions/FunctionsLogical.cpp +++ b/src/Functions/FunctionsLogical.cpp @@ -1,16 +1,18 @@ #include #include -#include -#include -#include #include #include +#include +#include #include +#include #include +#include #include #include #include +#include #include @@ -507,10 +509,109 @@ DataTypePtr FunctionAnyArityLogical::getReturnTypeImpl(const DataTyp : result_type; } +template +static void applyTernaryLogicImpl(const IColumn::Filter & mask, IColumn::Filter & null_bytemap) +{ + for (size_t i = 0; i != mask.size(); ++i) + { + UInt8 value = mask[i]; + if constexpr (inverted) + value = !value; + + if (null_bytemap[i] && value) + null_bytemap[i] = 0; + } +} + +template +static void applyTernaryLogic(const IColumn::Filter & mask, IColumn::Filter & null_bytemap) +{ + if (Name::name == NameAnd::name) + applyTernaryLogicImpl(mask, null_bytemap); + else if (Name::name == NameOr::name) + applyTernaryLogicImpl(mask, null_bytemap); +} + +template +ColumnPtr FunctionAnyArityLogical::executeShortCircuit(ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type) const +{ + if (Name::name != NameAnd::name && Name::name != NameOr::name) + throw Exception("Function " + getName() + " doesn't support short circuit execution", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); + + /// Let's denote x_i' = maskedExecute(x_i, mask). + /// 1) AND(x_0, x_1, x_2, ..., x_n) + /// We will support mask_i = x_0 & x_1 & ... & x_i. + /// Base: + /// mask_0 is 1 everywhere, x_0' = x_0. + /// Iteration: + /// mask_i = extractMask(mask_{i - 1}, x_{i - 1}') + /// x_i' = maskedExecute(x_i, mask) + /// Also we will treat NULL as 1 if x_i' is Nullable + /// to support ternary logic. + /// The result is mask_n. + /// + /// 1) OR(x_0, x_1, x_2, ..., x_n) + /// We will support mask_i = !x_0 & !x_1 & ... & !x_i. + /// mask_0 is 1 everywhere, x_0' = x_0. + /// mask = extractMask(mask, !x_{i - 1}') + /// x_i' = maskedExecute(x_i, mask) + /// Also we will treat NULL as 0 if x_i' is Nullable + /// to support ternary logic. + /// The result is !mask_n. + + bool inverted = Name::name != NameAnd::name; + UInt8 null_value = UInt8(Name::name == NameAnd::name); + IColumn::Filter mask(arguments[0].column->size(), 1); + + /// If result is nullable, we need to create null bytemap of the resulting column. + /// We will fill it while extracting mask from arguments. + std::unique_ptr nulls; + if (result_type->isNullable()) + nulls = std::make_unique(arguments[0].column->size(), 0); + + MaskInfo mask_info; + for (size_t i = 1; i <= arguments.size(); ++i) + { + if (inverted) + mask_info = extractInvertedMask(mask, arguments[i - 1].column, nulls.get(), null_value); + else + mask_info = extractMask(mask, arguments[i - 1].column, nulls.get(), null_value); + + /// If mask doesn't have ones, we don't need to execute the rest arguments, + /// because the result won't change. + if (!mask_info.has_ones || i == arguments.size()) + break; + + maskedExecute(arguments[i], mask, mask_info); + } + /// For OR function we need to inverse mask to get the resulting column. + if (inverted) + inverseMask(mask, mask_info); + + if (nulls) + applyTernaryLogic(mask, *nulls); + + MutableColumnPtr res = ColumnUInt8::create(); + typeid_cast(res.get())->getData() = std::move(mask); + + if (!nulls) + return res; + + MutableColumnPtr bytemap = ColumnUInt8::create(); + typeid_cast(bytemap.get())->getData() = std::move(*nulls); + return ColumnNullable::create(std::move(res), std::move(bytemap)); +} + template ColumnPtr FunctionAnyArityLogical::executeImpl( - const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count) const + const ColumnsWithTypeAndName & args, const DataTypePtr & result_type, size_t input_rows_count) const { + ColumnsWithTypeAndName arguments = std::move(args); + + /// Special implementation for short-circuit arguments. + if (checkShirtCircuitArguments(arguments) != -1) + return executeShortCircuit(arguments, result_type); + ColumnRawPtrs args_in; for (const auto & arg_index : arguments) args_in.push_back(arg_index.column.get()); diff --git a/src/Functions/FunctionsLogical.h b/src/Functions/FunctionsLogical.h index 264eeeef0fe..84b12fcb21d 100644 --- a/src/Functions/FunctionsLogical.h +++ b/src/Functions/FunctionsLogical.h @@ -31,6 +31,12 @@ namespace DB { + +struct NameAnd { static constexpr auto name = "and"; }; +struct NameOr { static constexpr auto name = "or"; }; +struct NameXor { static constexpr auto name = "xor"; }; +struct NameNot { static constexpr auto name = "not"; }; + namespace FunctionsLogicalDetail { namespace Ternary @@ -148,6 +154,15 @@ public: } bool isVariadic() const override { return true; } + bool isShortCircuit(ShortCircuitSettings & settings, size_t /*number_of_arguments*/) const override + { + settings.enable_lazy_execution_for_first_argument = false; + settings.enable_lazy_execution_for_common_descendants_of_arguments = true; + settings.force_enable_lazy_execution = false; + return name == NameAnd::name || name == NameOr::name; + } + ColumnPtr executeShortCircuit(ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type) const; + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } size_t getNumberOfArguments() const override { return 0; } bool useDefaultImplementationForNulls() const override { return !Impl::specialImplementationForNulls(); } @@ -155,7 +170,7 @@ public: /// Get result types by argument types. If the function does not apply to these arguments, throw an exception. DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override; - ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count) const override; + ColumnPtr executeImpl(const ColumnsWithTypeAndName & args, const DataTypePtr & result_type, size_t input_rows_count) const override; ColumnPtr getConstantResultForNonConstArguments(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type) const override; @@ -220,6 +235,8 @@ public: bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t /*input_rows_count*/) const override; #if USE_EMBEDDED_COMPILER @@ -235,11 +252,6 @@ public: } -struct NameAnd { static constexpr auto name = "and"; }; -struct NameOr { static constexpr auto name = "or"; }; -struct NameXor { static constexpr auto name = "xor"; }; -struct NameNot { static constexpr auto name = "not"; }; - using FunctionAnd = FunctionsLogicalDetail::FunctionAnyArityLogical; using FunctionOr = FunctionsLogicalDetail::FunctionAnyArityLogical; using FunctionXor = FunctionsLogicalDetail::FunctionAnyArityLogical; diff --git a/src/Functions/FunctionsMiscellaneous.h b/src/Functions/FunctionsMiscellaneous.h index 00a67a1c172..32700cb692e 100644 --- a/src/Functions/FunctionsMiscellaneous.h +++ b/src/Functions/FunctionsMiscellaneous.h @@ -77,6 +77,7 @@ public: bool isDeterministic() const override { return true; } bool isDeterministicInScopeOfQuery() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } const DataTypes & getArgumentTypes() const override { return argument_types; } const DataTypePtr & getResultType() const override { return return_type; } @@ -169,6 +170,7 @@ public: bool isDeterministic() const override { return true; } bool isDeterministicInScopeOfQuery() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } const DataTypes & getArgumentTypes() const override { return capture->captured_types; } const DataTypePtr & getResultType() const override { return return_type; } diff --git a/src/Functions/FunctionsMultiStringFuzzySearch.h b/src/Functions/FunctionsMultiStringFuzzySearch.h index a2d0c972abb..f0e1437b2aa 100644 --- a/src/Functions/FunctionsMultiStringFuzzySearch.h +++ b/src/Functions/FunctionsMultiStringFuzzySearch.h @@ -54,6 +54,7 @@ public: size_t getNumberOfArguments() const override { return 3; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1, 2}; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override diff --git a/src/Functions/FunctionsMultiStringPosition.h b/src/Functions/FunctionsMultiStringPosition.h index f36f7639ccd..1961f98f70a 100644 --- a/src/Functions/FunctionsMultiStringPosition.h +++ b/src/Functions/FunctionsMultiStringPosition.h @@ -58,6 +58,7 @@ public: size_t getNumberOfArguments() const override { return 2; } bool useDefaultImplementationForConstants() const override { return true; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1}; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/FunctionsMultiStringSearch.h b/src/Functions/FunctionsMultiStringSearch.h index 3dd2e8bfd09..6535035469f 100644 --- a/src/Functions/FunctionsMultiStringSearch.h +++ b/src/Functions/FunctionsMultiStringSearch.h @@ -67,6 +67,7 @@ public: size_t getNumberOfArguments() const override { return 2; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1}; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override diff --git a/src/Functions/FunctionsRandom.h b/src/Functions/FunctionsRandom.h index 75037d02a2d..2dacd6d6db9 100644 --- a/src/Functions/FunctionsRandom.h +++ b/src/Functions/FunctionsRandom.h @@ -60,6 +60,7 @@ public: bool isDeterministic() const override { return false; } bool isDeterministicInScopeOfQuery() const override { return false; } bool useDefaultImplementationForNulls() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } diff --git a/src/Functions/FunctionsRound.h b/src/Functions/FunctionsRound.h index 29e86b23c10..7b57426d751 100644 --- a/src/Functions/FunctionsRound.h +++ b/src/Functions/FunctionsRound.h @@ -529,6 +529,7 @@ public: bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } /// Get result types by argument types. If the function does not apply to these arguments, throw an exception. DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override @@ -637,6 +638,7 @@ public: size_t getNumberOfArguments() const override { return 2; } bool useDefaultImplementationForConstants() const override { return true; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1}; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/FunctionsStringArray.h b/src/Functions/FunctionsStringArray.h index 4d2312f207c..181cd896d46 100644 --- a/src/Functions/FunctionsStringArray.h +++ b/src/Functions/FunctionsStringArray.h @@ -552,6 +552,8 @@ public: return name; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + size_t getNumberOfArguments() const override { return Generator::getNumberOfArguments(); } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override @@ -716,6 +718,7 @@ public: } bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } size_t getNumberOfArguments() const override { return 0; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override diff --git a/src/Functions/FunctionsStringHash.h b/src/Functions/FunctionsStringHash.h index 37fa7d618b9..6f3e37cf7fe 100644 --- a/src/Functions/FunctionsStringHash.h +++ b/src/Functions/FunctionsStringHash.h @@ -41,6 +41,7 @@ public: size_t getNumberOfArguments() const override { return 0; } bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { diff --git a/src/Functions/FunctionsStringSearch.h b/src/Functions/FunctionsStringSearch.h index 0789247e2d4..d8463e69cf3 100644 --- a/src/Functions/FunctionsStringSearch.h +++ b/src/Functions/FunctionsStringSearch.h @@ -57,6 +57,8 @@ public: bool isVariadic() const override { return Impl::supports_start_pos; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + size_t getNumberOfArguments() const override { if (Impl::supports_start_pos) diff --git a/src/Functions/FunctionsStringSearchToString.h b/src/Functions/FunctionsStringSearchToString.h index af91a9511e1..b8fcac2206e 100644 --- a/src/Functions/FunctionsStringSearchToString.h +++ b/src/Functions/FunctionsStringSearchToString.h @@ -45,6 +45,8 @@ public: bool useDefaultImplementationForConstants() const override { return true; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1}; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (!isString(arguments[0])) diff --git a/src/Functions/FunctionsStringSimilarity.h b/src/Functions/FunctionsStringSimilarity.h index 6efb373aace..195e4c126c5 100644 --- a/src/Functions/FunctionsStringSimilarity.h +++ b/src/Functions/FunctionsStringSimilarity.h @@ -37,6 +37,8 @@ public: String getName() const override { return name; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + size_t getNumberOfArguments() const override { return 2; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override diff --git a/src/Functions/GatherUtils/Algorithms.h b/src/Functions/GatherUtils/Algorithms.h index fbd658ca7be..fd59cbd19aa 100644 --- a/src/Functions/GatherUtils/Algorithms.h +++ b/src/Functions/GatherUtils/Algorithms.h @@ -397,6 +397,9 @@ void NO_INLINE conditional(SourceA && src_a, SourceB && src_b, Sink && sink, con const UInt8 * cond_pos = condition.data(); const UInt8 * cond_end = cond_pos + condition.size(); + bool a_is_short = src_a.getColumnSize() < condition.size(); + bool b_is_short = src_b.getColumnSize() < condition.size(); + while (cond_pos < cond_end) { if (*cond_pos) @@ -404,9 +407,12 @@ void NO_INLINE conditional(SourceA && src_a, SourceB && src_b, Sink && sink, con else writeSlice(src_b.getWhole(), sink); + if (!a_is_short || *cond_pos) + src_a.next(); + if (!b_is_short || !*cond_pos) + src_b.next(); + ++cond_pos; - src_a.next(); - src_b.next(); sink.next(); } } diff --git a/src/Functions/GatherUtils/Sources.h b/src/Functions/GatherUtils/Sources.h index 9a459860a68..86b590646dc 100644 --- a/src/Functions/GatherUtils/Sources.h +++ b/src/Functions/GatherUtils/Sources.h @@ -281,6 +281,11 @@ struct StringSource return offsets[row_num] - prev_offset - 1; } + size_t getColumnSize() const + { + return offsets.size(); + } + Slice getWhole() const { return {&elements[prev_offset], offsets[row_num] - prev_offset - 1}; @@ -320,7 +325,7 @@ struct StringSource }; -/// Differs to StringSource by having 'offest' and 'length' in code points instead of bytes in getSlice* methods. +/// Differs to StringSource by having 'offset' and 'length' in code points instead of bytes in getSlice* methods. /** NOTE: The behaviour of substring and substringUTF8 is inconsistent when negative offset is greater than string size: * substring: * hello @@ -417,6 +422,7 @@ struct FixedStringSource const UInt8 * end; size_t string_size; size_t row_num = 0; + size_t column_size = 0; explicit FixedStringSource(const ColumnFixedString & col) : string_size(col.getN()) @@ -424,6 +430,7 @@ struct FixedStringSource const auto & chars = col.getChars(); pos = chars.data(); end = pos + chars.size(); + column_size = col.size(); } void next() @@ -452,6 +459,11 @@ struct FixedStringSource return string_size; } + size_t getColumnSize() const + { + return column_size; + } + Slice getWhole() const { return {pos, string_size}; diff --git a/src/Functions/IFunction.cpp b/src/Functions/IFunction.cpp index e3802b98abf..2c5cd59d05a 100644 --- a/src/Functions/IFunction.cpp +++ b/src/Functions/IFunction.cpp @@ -378,6 +378,7 @@ static std::optional removeNullables(const DataTypes & types) bool IFunction::isCompilable(const DataTypes & arguments) const { + if (useDefaultImplementationForNulls()) if (auto denulled = removeNullables(arguments)) return isCompilableImpl(*denulled); diff --git a/src/Functions/IFunction.h b/src/Functions/IFunction.h index c00baf2850b..db8a449f2b1 100644 --- a/src/Functions/IFunction.h +++ b/src/Functions/IFunction.h @@ -211,6 +211,42 @@ public: */ virtual bool hasInformationAboutMonotonicity() const { return false; } + struct ShortCircuitSettings + { + /// Should we enable lazy execution for the first argument of short-circuit function? + /// Example: if(cond, then, else), we don't need to execute cond lazily. + bool enable_lazy_execution_for_first_argument; + /// Should we enable lazy execution for functions, that are common descendants of + /// different short-circuit function arguments? + /// Example 1: if (cond, expr1(..., expr, ...), expr2(..., expr, ...)), we don't need + /// to execute expr lazily, because it's used in both branches. + /// Example 2: and(expr1, expr2(..., expr, ...), expr3(..., expr, ...)), here we + /// should enable lazy execution for expr, because it must be filtered by expr1. + bool enable_lazy_execution_for_common_descendants_of_arguments; + /// Should we enable lazy execution without checking isSuitableForShortCircuitArgumentsExecution? + /// Example: toTypeName(expr), even if expr contains functions that are not suitable for + /// lazy execution (because of their simplicity), we shouldn't execute them at all. + bool force_enable_lazy_execution; + }; + + /** Function is called "short-circuit" if it's arguments can be evaluated lazily + * (examples: and, or, if, multiIf). If function is short circuit, it should be + * able to work with lazy executed arguments, + * this method will be called before function execution. + * If function is short circuit, it must define all fields in settings for + * appropriate preparations. Number of arguments is provided because some settings might depend on it. + * Example: multiIf(cond, else, then) and multiIf(cond1, else1, cond2, else2, ...), the first + * version can enable enable_lazy_execution_for_common_descendants_of_arguments setting, the second - not. + */ + virtual bool isShortCircuit(ShortCircuitSettings & /*settings*/, size_t /*number_of_arguments*/) const { return false; } + + /** Should we evaluate this function lazily in short-circuit function arguments? + * If function can throw an exception or it's computationally heavy, then + * it's suitable, otherwise it's not (due to the overhead of lazy execution). + * Suitability may depend on function arguments. + */ + virtual bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const = 0; + /// The property of monotonicity for a certain range. struct Monotonicity { @@ -385,6 +421,11 @@ public: virtual bool isDeterministic() const { return true; } virtual bool isDeterministicInScopeOfQuery() const { return true; } virtual bool isStateful() const { return false; } + + using ShortCircuitSettings = IFunctionBase::ShortCircuitSettings; + virtual bool isShortCircuit(ShortCircuitSettings & /*settings*/, size_t /*number_of_arguments*/) const { return false; } + virtual bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const = 0; + virtual bool hasInformationAboutMonotonicity() const { return false; } using Monotonicity = IFunctionBase::Monotonicity; diff --git a/src/Functions/IFunctionAdaptors.h b/src/Functions/IFunctionAdaptors.h index 6a865af0dd3..9bfe010c0d0 100644 --- a/src/Functions/IFunctionAdaptors.h +++ b/src/Functions/IFunctionAdaptors.h @@ -80,6 +80,10 @@ public: bool isDeterministicInScopeOfQuery() const override { return function->isDeterministicInScopeOfQuery(); } + bool isShortCircuit(ShortCircuitSettings & settings, size_t number_of_arguments) const override { return function->isShortCircuit(settings, number_of_arguments); } + + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & args) const override { return function->isSuitableForShortCircuitArgumentsExecution(args); } + bool hasInformationAboutMonotonicity() const override { return function->hasInformationAboutMonotonicity(); } Monotonicity getMonotonicityForRange(const IDataType & type, const Field & left, const Field & right) const override diff --git a/src/Functions/LeastGreatestGeneric.h b/src/Functions/LeastGreatestGeneric.h index 68cfda7d116..a8bab0efd54 100644 --- a/src/Functions/LeastGreatestGeneric.h +++ b/src/Functions/LeastGreatestGeneric.h @@ -37,6 +37,7 @@ private: size_t getNumberOfArguments() const override { return 0; } bool isVariadic() const override { return true; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & types) const override { diff --git a/src/Functions/Regexps.h b/src/Functions/Regexps.h index 5da1224ab8c..d95e29926e9 100644 --- a/src/Functions/Regexps.h +++ b/src/Functions/Regexps.h @@ -61,7 +61,7 @@ namespace Regexps template inline Pool::Pointer get(const std::string & pattern) { - /// C++11 has thread-safe function-local statics on most modern compilers. + /// C++11 has thread-safe function-local static on most modern compilers. static Pool known_regexps; /// Different variables for different pattern parameters. return known_regexps.get(pattern, [&pattern] @@ -257,7 +257,7 @@ namespace MultiRegexps template inline Regexps * get(const std::vector & patterns, std::optional edit_distance) { - /// C++11 has thread-safe function-local statics on most modern compilers. + /// C++11 has thread-safe function-local static on most modern compilers. static Pool known_regexps; /// Different variables for different pattern parameters. std::vector str_patterns; diff --git a/src/Functions/URL/FirstSignificantSubdomainCustomImpl.h b/src/Functions/URL/FirstSignificantSubdomainCustomImpl.h index 08576fe59ec..8a76d52741b 100644 --- a/src/Functions/URL/FirstSignificantSubdomainCustomImpl.h +++ b/src/Functions/URL/FirstSignificantSubdomainCustomImpl.h @@ -40,6 +40,7 @@ public: String getName() const override { return name; } size_t getNumberOfArguments() const override { return 2; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } bool useDefaultImplementationForConstants() const override { return true; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1}; } diff --git a/src/Functions/URL/port.cpp b/src/Functions/URL/port.cpp index 179a2be4471..8cc5ce711d5 100644 --- a/src/Functions/URL/port.cpp +++ b/src/Functions/URL/port.cpp @@ -28,6 +28,7 @@ struct FunctionPort : public IFunction size_t getNumberOfArguments() const override { return 0; } bool useDefaultImplementationForConstants() const override { return true; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1}; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { diff --git a/src/Functions/abtesting.cpp b/src/Functions/abtesting.cpp index 871357fe450..312fdf6fb48 100644 --- a/src/Functions/abtesting.cpp +++ b/src/Functions/abtesting.cpp @@ -180,6 +180,7 @@ public: bool isDeterministic() const override { return false; } bool isDeterministicInScopeOfQuery() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } size_t getNumberOfArguments() const override { return 5; } diff --git a/src/Functions/addressToLine.cpp b/src/Functions/addressToLine.cpp index aabf388b428..d513a8767dc 100644 --- a/src/Functions/addressToLine.cpp +++ b/src/Functions/addressToLine.cpp @@ -52,6 +52,8 @@ public: return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { if (arguments.size() != 1) diff --git a/src/Functions/addressToSymbol.cpp b/src/Functions/addressToSymbol.cpp index 7ffdc6d4260..1561e0ee506 100644 --- a/src/Functions/addressToSymbol.cpp +++ b/src/Functions/addressToSymbol.cpp @@ -44,6 +44,8 @@ public: return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { if (arguments.size() != 1) diff --git a/src/Functions/appendTrailingCharIfAbsent.cpp b/src/Functions/appendTrailingCharIfAbsent.cpp index 64687b8c166..2824a008928 100644 --- a/src/Functions/appendTrailingCharIfAbsent.cpp +++ b/src/Functions/appendTrailingCharIfAbsent.cpp @@ -34,6 +34,8 @@ public: return name; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + private: size_t getNumberOfArguments() const override diff --git a/src/Functions/array/FunctionArrayMapped.h b/src/Functions/array/FunctionArrayMapped.h index 3609398bc3f..029e33db0cf 100644 --- a/src/Functions/array/FunctionArrayMapped.h +++ b/src/Functions/array/FunctionArrayMapped.h @@ -53,6 +53,7 @@ public: bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } /// Called if at least one function argument is a lambda expression. /// For argument-lambda expressions, it defines the types of arguments of these expressions. diff --git a/src/Functions/array/array.cpp b/src/Functions/array/array.cpp index 1f513defc6f..72380c0a2bf 100644 --- a/src/Functions/array/array.cpp +++ b/src/Functions/array/array.cpp @@ -23,6 +23,7 @@ public: bool useDefaultImplementationForConstants() const override { return true; } bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } size_t getNumberOfArguments() const override { return 0; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override diff --git a/src/Functions/array/arrayConcat.cpp b/src/Functions/array/arrayConcat.cpp index 0a689714eb4..50d069aaf02 100644 --- a/src/Functions/array/arrayConcat.cpp +++ b/src/Functions/array/arrayConcat.cpp @@ -32,6 +32,7 @@ public: bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/array/arrayDistinct.cpp b/src/Functions/array/arrayDistinct.cpp index 916af560c8f..e71a582bbe0 100644 --- a/src/Functions/array/arrayDistinct.cpp +++ b/src/Functions/array/arrayDistinct.cpp @@ -38,6 +38,8 @@ public: bool isVariadic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + size_t getNumberOfArguments() const override { return 1; } bool useDefaultImplementationForConstants() const override { return true; } diff --git a/src/Functions/array/arrayElement.cpp b/src/Functions/array/arrayElement.cpp index d39a865133e..a4cdc601d84 100644 --- a/src/Functions/array/arrayElement.cpp +++ b/src/Functions/array/arrayElement.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -47,6 +48,7 @@ public: String getName() const override; bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } size_t getNumberOfArguments() const override { return 2; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override; @@ -94,32 +96,30 @@ private: using Offsets = ColumnArray::Offsets; - static bool matchKeyToIndex(const IColumn & data, const Offsets & offsets, - const ColumnsWithTypeAndName & arguments, PaddedPODArray & matched_idxs); + static bool matchKeyToIndexNumber( + const IColumn & data, const Offsets & offsets, bool is_key_const, + const IColumn & index, PaddedPODArray & matched_idxs); - static bool matchKeyToIndexConst(const IColumn & data, const Offsets & offsets, + static bool matchKeyToIndexNumberConst( + const IColumn & data, const Offsets & offsets, const Field & index, PaddedPODArray & matched_idxs); - template - static bool matchKeyToIndexNumber(const IColumn & data, const Offsets & offsets, - const ColumnsWithTypeAndName & arguments, PaddedPODArray & matched_idxs); + static bool matchKeyToIndexString( + const IColumn & data, const Offsets & offsets, bool is_key_const, + const IColumn & index, PaddedPODArray & matched_idxs); - template - static bool matchKeyToIndexNumberConst(const IColumn & data, const Offsets & offsets, - const Field & index, PaddedPODArray & matched_idxs); - - static bool matchKeyToIndexString(const IColumn & data, const Offsets & offsets, - const ColumnsWithTypeAndName & arguments, PaddedPODArray & matched_idxs); - - static bool matchKeyToIndexFixedString(const IColumn & data, const Offsets & offsets, - const ColumnsWithTypeAndName & arguments, PaddedPODArray & matched_idxs); - - static bool matchKeyToIndexStringConst(const IColumn & data, const Offsets & offsets, + static bool matchKeyToIndexStringConst( + const IColumn & data, const Offsets & offsets, const Field & index, PaddedPODArray & matched_idxs); template static void executeMatchKeyToIndex(const Offsets & offsets, PaddedPODArray & matched_idxs, const Matcher & matcher); + + template + static void executeMatchConstKeyToIndex( + size_t num_rows, size_t num_values, + PaddedPODArray & matched_idxs, const Matcher & matcher); }; @@ -758,23 +758,11 @@ ColumnPtr FunctionArrayElement::executeTuple(const ColumnsWithTypeAndName & argu namespace { +template struct MatcherString { - const ColumnString & data; - const ColumnString & index; - - bool match(size_t row_data, size_t row_index) const - { - auto data_ref = data.getDataAt(row_data); - auto index_ref = index.getDataAt(row_index); - return memequalSmallAllowOverflow15(index_ref.data, index_ref.size, data_ref.data, data_ref.size); - } -}; - -struct MatcherFixedString -{ - const ColumnFixedString & data; - const ColumnFixedString & index; + const DataColumn & data; + const IndexColumn & index; bool match(size_t row_data, size_t row_index) const { @@ -784,9 +772,10 @@ struct MatcherFixedString } }; +template struct MatcherStringConst { - const ColumnString & data; + const DataColumn & data; const String & index; bool match(size_t row_data, size_t /* row_index */) const @@ -796,23 +785,23 @@ struct MatcherStringConst } }; -template +template struct MatcherNumber { - const PaddedPODArray & data; - const PaddedPODArray & index; + const PaddedPODArray & data; + const PaddedPODArray & index; bool match(size_t row_data, size_t row_index) const { - return data[row_data] == index[row_index]; + return data[row_data] == static_cast(index[row_index]); } }; -template +template struct MatcherNumberConst { - const PaddedPODArray & data; - T index; + const PaddedPODArray & data; + DataType index; bool match(size_t row_data, size_t /* row_index */) const { @@ -847,147 +836,158 @@ void FunctionArrayElement::executeMatchKeyToIndex( } } +template +void FunctionArrayElement::executeMatchConstKeyToIndex( + size_t num_rows, size_t num_values, + PaddedPODArray & matched_idxs, const Matcher & matcher) +{ + for (size_t i = 0; i < num_rows; ++i) + { + bool matched = false; + for (size_t j = 0; j < num_values; ++j) + { + if (matcher.match(j, i)) + { + matched_idxs.push_back(j + 1); + matched = true; + break; + } + } + + if (!matched) + matched_idxs.push_back(0); + } +} + +template +static bool castColumnString(const IColumn * column, F && f) +{ + return castTypeToEither(column, std::forward(f)); +} + bool FunctionArrayElement::matchKeyToIndexStringConst( const IColumn & data, const Offsets & offsets, const Field & index, PaddedPODArray & matched_idxs) { - const auto * data_string = checkAndGetColumn(&data); - if (!data_string) - return false; + return castColumnString(&data, [&](const auto & data_column) + { + using DataColumn = std::decay_t; - if (index.getType() != Field::Types::String) - return false; - - MatcherStringConst matcher{*data_string, get(index)}; - executeMatchKeyToIndex(offsets, matched_idxs, matcher); - return true; + MatcherStringConst matcher{data_column, get(index)}; + executeMatchKeyToIndex(offsets, matched_idxs, matcher); + return true; + }); } bool FunctionArrayElement::matchKeyToIndexString( - const IColumn & data, const Offsets & offsets, - const ColumnsWithTypeAndName & arguments, PaddedPODArray & matched_idxs) + const IColumn & data, const Offsets & offsets, bool is_key_const, + const IColumn & index, PaddedPODArray & matched_idxs) { - const auto * index_string = checkAndGetColumn(arguments[1].column.get()); - if (!index_string) - return false; + return castColumnString(&data, [&](const auto & data_column) + { + return castColumnString(&index, [&](const auto & index_column) + { + using DataColumn = std::decay_t; + using IndexColumn = std::decay_t; - const auto * data_string = checkAndGetColumn(&data); - if (!data_string) - return false; + MatcherString matcher{data_column, index_column}; + if (is_key_const) + executeMatchConstKeyToIndex(index.size(), data.size(), matched_idxs, matcher); + else + executeMatchKeyToIndex(offsets, matched_idxs, matcher); - MatcherString matcher{*data_string, *index_string}; - executeMatchKeyToIndex(offsets, matched_idxs, matcher); - return true; + return true; + }); + }); } -bool FunctionArrayElement::matchKeyToIndexFixedString( - const IColumn & data, const Offsets & offsets, - const ColumnsWithTypeAndName & arguments, PaddedPODArray & matched_idxs) +template +static constexpr bool areConvertibleTypes = + std::is_same_v + || (is_integer_v && is_integer_v + && std::is_convertible_v); + +template +static bool castColumnNumeric(const IColumn * column, F && f) { - const auto * index_string = checkAndGetColumn(arguments[1].column.get()); - if (!index_string) - return false; - - const auto * data_string = checkAndGetColumn(&data); - if (!data_string) - return false; - - MatcherFixedString matcher{*data_string, *index_string}; - executeMatchKeyToIndex(offsets, matched_idxs, matcher); - return true; + return castTypeToEither< + ColumnVector, + ColumnVector, + ColumnVector, + ColumnVector, + ColumnVector, + ColumnVector, + ColumnVector, + ColumnVector, + ColumnVector, + ColumnVector, + ColumnVector, + ColumnVector, + ColumnVector + >(column, std::forward(f)); } -template bool FunctionArrayElement::matchKeyToIndexNumberConst( const IColumn & data, const Offsets & offsets, const Field & index, PaddedPODArray & matched_idxs) { - const auto * data_numeric = checkAndGetColumn>(&data); - if (!data_numeric) - return false; - - std::optional index_as_integer; - Field::dispatch([&](const auto & value) + return castColumnNumeric(&data, [&](const auto & data_column) { - using FieldType = std::decay_t; - if constexpr (std::is_same_v || (is_integer_v && std::is_convertible_v)) - index_as_integer = static_cast(value); - }, index); + using DataType = typename std::decay_t::ValueType; + std::optional index_as_integer; - if (!index_as_integer) - return false; + Field::dispatch([&](const auto & value) + { + using FieldType = std::decay_t; + if constexpr (areConvertibleTypes) + index_as_integer = static_cast(value); + }, index); - MatcherNumberConst matcher{data_numeric->getData(), *index_as_integer}; - executeMatchKeyToIndex(offsets, matched_idxs, matcher); - return true; + if (!index_as_integer) + return false; + + MatcherNumberConst matcher{data_column.getData(), *index_as_integer}; + executeMatchKeyToIndex(offsets, matched_idxs, matcher); + return true; + }); } -template bool FunctionArrayElement::matchKeyToIndexNumber( - const IColumn & data, const Offsets & offsets, - const ColumnsWithTypeAndName & arguments, PaddedPODArray & matched_idxs) + const IColumn & data, const Offsets & offsets, bool is_key_const, + const IColumn & index, PaddedPODArray & matched_idxs) { - const auto * index_numeric = checkAndGetColumn>(arguments[1].column.get()); - if (!index_numeric) - return false; + return castColumnNumeric(&data, [&](const auto & data_column) + { + return castColumnNumeric(&index, [&](const auto & index_column) + { + using DataType = typename std::decay_t::ValueType; + using IndexType = typename std::decay_t::ValueType; - const auto * data_numeric = checkAndGetColumn>(&data); - if (!data_numeric) - return false; + if constexpr (areConvertibleTypes) + { + MatcherNumber matcher{data_column.getData(), index_column.getData()}; + if (is_key_const) + executeMatchConstKeyToIndex(index_column.size(), data_column.size(), matched_idxs, matcher); + else + executeMatchKeyToIndex(offsets, matched_idxs, matcher); - MatcherNumber matcher{data_numeric->getData(), index_numeric->getData()}; - executeMatchKeyToIndex(offsets, matched_idxs, matcher); - return true; -} + return true; + } -bool FunctionArrayElement::matchKeyToIndex( - const IColumn & data, const Offsets & offsets, - const ColumnsWithTypeAndName & arguments, PaddedPODArray & matched_idxs) -{ - return matchKeyToIndexNumber(data, offsets, arguments, matched_idxs) - || matchKeyToIndexNumber(data, offsets, arguments, matched_idxs) - || matchKeyToIndexNumber(data, offsets, arguments, matched_idxs) - || matchKeyToIndexNumber(data, offsets, arguments, matched_idxs) - || matchKeyToIndexNumber(data, offsets, arguments, matched_idxs) - || matchKeyToIndexNumber(data, offsets, arguments, matched_idxs) - || matchKeyToIndexNumber(data, offsets, arguments, matched_idxs) - || matchKeyToIndexNumber(data, offsets, arguments, matched_idxs) - || matchKeyToIndexNumber(data, offsets, arguments, matched_idxs) - || matchKeyToIndexNumber(data, offsets, arguments, matched_idxs) - || matchKeyToIndexNumber(data, offsets, arguments, matched_idxs) - || matchKeyToIndexNumber(data, offsets, arguments, matched_idxs) - || matchKeyToIndexNumber(data, offsets, arguments, matched_idxs) - || matchKeyToIndexNumber(data, offsets, arguments, matched_idxs) - || matchKeyToIndexString(data, offsets, arguments, matched_idxs) - || matchKeyToIndexFixedString(data, offsets, arguments, matched_idxs); -} - -bool FunctionArrayElement::matchKeyToIndexConst( - const IColumn & data, const Offsets & offsets, - const Field & index, PaddedPODArray & matched_idxs) -{ - return matchKeyToIndexNumberConst(data, offsets, index, matched_idxs) - || matchKeyToIndexNumberConst(data, offsets, index, matched_idxs) - || matchKeyToIndexNumberConst(data, offsets, index, matched_idxs) - || matchKeyToIndexNumberConst(data, offsets, index, matched_idxs) - || matchKeyToIndexNumberConst(data, offsets, index, matched_idxs) - || matchKeyToIndexNumberConst(data, offsets, index, matched_idxs) - || matchKeyToIndexNumberConst(data, offsets, index, matched_idxs) - || matchKeyToIndexNumberConst(data, offsets, index, matched_idxs) - || matchKeyToIndexNumberConst(data, offsets, index, matched_idxs) - || matchKeyToIndexNumberConst(data, offsets, index, matched_idxs) - || matchKeyToIndexNumberConst(data, offsets, index, matched_idxs) - || matchKeyToIndexNumberConst(data, offsets, index, matched_idxs) - || matchKeyToIndexNumberConst(data, offsets, index, matched_idxs) - || matchKeyToIndexStringConst(data, offsets, index, matched_idxs); + return false; + }); + }); } ColumnPtr FunctionArrayElement::executeMap( const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count) const { - const ColumnMap * col_map = typeid_cast(arguments[0].column.get()); - if (!col_map) - return nullptr; + const auto * col_map = checkAndGetColumn(arguments[0].column.get()); + const auto * col_const_map = checkAndGetColumnConst(arguments[0].column.get()); + assert(col_map || col_const_map); + + if (col_const_map) + col_map = typeid_cast(&col_const_map->getDataColumn()); const auto & nested_column = col_map->getNestedColumn(); const auto & keys_data = col_map->getNestedData().getColumn(0); @@ -999,29 +999,33 @@ ColumnPtr FunctionArrayElement::executeMap( indices_column->reserve(input_rows_count); auto & indices_data = assert_cast &>(*indices_column).getData(); + bool executed = false; if (!isColumnConst(*arguments[1].column)) { - if (input_rows_count > 0 && !matchKeyToIndex(keys_data, offsets, arguments, indices_data)) - throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, - "Illegal types of arguments: {}, {} for function {}", - arguments[0].type->getName(), arguments[1].type->getName(), getName()); + executed = matchKeyToIndexNumber(keys_data, offsets, !!col_const_map, *arguments[1].column, indices_data) + || matchKeyToIndexString(keys_data, offsets, !!col_const_map, *arguments[1].column, indices_data); } else { Field index = (*arguments[1].column)[0]; - - // Get Matched key's value - if (input_rows_count > 0 && !matchKeyToIndexConst(keys_data, offsets, index, indices_data)) - throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, - "Illegal types of arguments: {}, {} for function {}", - arguments[0].type->getName(), arguments[1].type->getName(), getName()); + executed = matchKeyToIndexNumberConst(keys_data, offsets, index, indices_data) + || matchKeyToIndexStringConst(keys_data, offsets, index, indices_data); } + if (!executed) + throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, + "Illegal types of arguments: {}, {} for function {}", + arguments[0].type->getName(), arguments[1].type->getName(), getName()); + + ColumnPtr values_array = ColumnArray::create(values_data.getPtr(), nested_column.getOffsetsPtr()); + if (col_const_map) + values_array = ColumnConst::create(values_array, input_rows_count); + /// Prepare arguments to call arrayElement for array with values and calculated indices at previous step. ColumnsWithTypeAndName new_arguments = { { - ColumnArray::create(values_data.getPtr(), nested_column.getOffsetsPtr()), + values_array, std::make_shared(result_type), "" }, @@ -1065,13 +1069,14 @@ DataTypePtr FunctionArrayElement::getReturnTypeImpl(const DataTypes & arguments) ColumnPtr FunctionArrayElement::executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count) const { - /// Check nullability. - bool is_array_of_nullable = false; + const auto * col_map = checkAndGetColumn(arguments[0].column.get()); + const auto * col_const_map = checkAndGetColumnConst(arguments[0].column.get()); - const ColumnMap * col_map = checkAndGetColumn(arguments[0].column.get()); - if (col_map) + if (col_map || col_const_map) return executeMap(arguments, result_type, input_rows_count); + /// Check nullability. + bool is_array_of_nullable = false; const ColumnArray * col_array = nullptr; const ColumnArray * col_const_array = nullptr; diff --git a/src/Functions/array/arrayEnumerate.cpp b/src/Functions/array/arrayEnumerate.cpp index 6d59a2c3805..f7b6a7e9547 100644 --- a/src/Functions/array/arrayEnumerate.cpp +++ b/src/Functions/array/arrayEnumerate.cpp @@ -34,6 +34,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/array/arrayEnumerateExtended.h b/src/Functions/array/arrayEnumerateExtended.h index 7e4fe24873a..6dfa8d348db 100644 --- a/src/Functions/array/arrayEnumerateExtended.h +++ b/src/Functions/array/arrayEnumerateExtended.h @@ -37,6 +37,7 @@ public: bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/array/arrayEnumerateRanked.h b/src/Functions/array/arrayEnumerateRanked.h index 2c999415f33..4d03c52460f 100644 --- a/src/Functions/array/arrayEnumerateRanked.h +++ b/src/Functions/array/arrayEnumerateRanked.h @@ -96,6 +96,7 @@ public: bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { diff --git a/src/Functions/array/arrayFlatten.cpp b/src/Functions/array/arrayFlatten.cpp index 3d286aa0bb4..929ad041b9a 100644 --- a/src/Functions/array/arrayFlatten.cpp +++ b/src/Functions/array/arrayFlatten.cpp @@ -24,6 +24,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/array/arrayIndex.h b/src/Functions/array/arrayIndex.h index a390abc4eaf..137f3a2ec78 100644 --- a/src/Functions/array/arrayIndex.h +++ b/src/Functions/array/arrayIndex.h @@ -115,6 +115,13 @@ private: [[maybe_unused]] const NullMap * const null_map_data, [[maybe_unused]] const NullMap * const null_map_item) { + if constexpr (std::is_same_v && std::is_same_v) + { + /// Generic variant is using IColumn::compare function that only allows to compare columns of identical types. + if (typeid(data) != typeid(target)) + throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Columns {} and {} cannot be compared", data.getName(), target.getName()); + } + const size_t size = offsets.size(); result.resize(size); @@ -362,6 +369,7 @@ public: bool useDefaultImplementationForNulls() const override { return false; } bool useDefaultImplementationForLowCardinalityColumns() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } size_t getNumberOfArguments() const override { return 2; } diff --git a/src/Functions/array/arrayIntersect.cpp b/src/Functions/array/arrayIntersect.cpp index 4ed2b212875..17eb2b33bb6 100644 --- a/src/Functions/array/arrayIntersect.cpp +++ b/src/Functions/array/arrayIntersect.cpp @@ -46,6 +46,7 @@ public: bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override; diff --git a/src/Functions/array/arrayJoin.cpp b/src/Functions/array/arrayJoin.cpp index da8c4e6e80b..6d9950d9110 100644 --- a/src/Functions/array/arrayJoin.cpp +++ b/src/Functions/array/arrayJoin.cpp @@ -45,6 +45,8 @@ public: return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { const DataTypeArray * arr = checkAndGetDataType(arguments[0].get()); diff --git a/src/Functions/array/arrayPop.h b/src/Functions/array/arrayPop.h index 270b5e20f85..1679f14bb43 100644 --- a/src/Functions/array/arrayPop.h +++ b/src/Functions/array/arrayPop.h @@ -25,6 +25,7 @@ public: bool isVariadic() const override { return false; } size_t getNumberOfArguments() const override { return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/array/arrayPush.h b/src/Functions/array/arrayPush.h index 3a63e7b631d..18815b7cabf 100644 --- a/src/Functions/array/arrayPush.h +++ b/src/Functions/array/arrayPush.h @@ -29,6 +29,7 @@ public: bool isVariadic() const override { return false; } size_t getNumberOfArguments() const override { return 2; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/array/arrayReduce.cpp b/src/Functions/array/arrayReduce.cpp index e070596e5ee..7ac6d21b3a8 100644 --- a/src/Functions/array/arrayReduce.cpp +++ b/src/Functions/array/arrayReduce.cpp @@ -45,6 +45,8 @@ public: bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + bool useDefaultImplementationForConstants() const override { return true; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {0}; } diff --git a/src/Functions/array/arrayReduceInRanges.cpp b/src/Functions/array/arrayReduceInRanges.cpp index 18140fe504d..67286b8b175 100644 --- a/src/Functions/array/arrayReduceInRanges.cpp +++ b/src/Functions/array/arrayReduceInRanges.cpp @@ -48,6 +48,8 @@ public: bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + bool useDefaultImplementationForConstants() const override { return true; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {0}; } diff --git a/src/Functions/array/arrayResize.cpp b/src/Functions/array/arrayResize.cpp index f8eea06335b..9d2a29b2fb4 100644 --- a/src/Functions/array/arrayResize.cpp +++ b/src/Functions/array/arrayResize.cpp @@ -32,6 +32,8 @@ public: bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { const size_t number_of_arguments = arguments.size(); diff --git a/src/Functions/array/arrayReverse.cpp b/src/Functions/array/arrayReverse.cpp index fb4a559b37f..1a6b1aa6c1f 100644 --- a/src/Functions/array/arrayReverse.cpp +++ b/src/Functions/array/arrayReverse.cpp @@ -31,6 +31,8 @@ public: size_t getNumberOfArguments() const override { return 1; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { const DataTypeArray * array_type = checkAndGetDataType(arguments[0].get()); diff --git a/src/Functions/array/arrayScalarProduct.h b/src/Functions/array/arrayScalarProduct.h index 6a23d6a45d8..87161038d4c 100644 --- a/src/Functions/array/arrayScalarProduct.h +++ b/src/Functions/array/arrayScalarProduct.h @@ -105,6 +105,9 @@ public: String getName() const override { return name; } size_t getNumberOfArguments() const override { return 2; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { // Basic type check diff --git a/src/Functions/array/arraySlice.cpp b/src/Functions/array/arraySlice.cpp index 567135de884..d6b50f55563 100644 --- a/src/Functions/array/arraySlice.cpp +++ b/src/Functions/array/arraySlice.cpp @@ -41,6 +41,8 @@ public: bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { const size_t number_of_arguments = arguments.size(); diff --git a/src/Functions/array/arrayUniq.cpp b/src/Functions/array/arrayUniq.cpp index 62de746f136..8d3393c43c4 100644 --- a/src/Functions/array/arrayUniq.cpp +++ b/src/Functions/array/arrayUniq.cpp @@ -39,6 +39,8 @@ public: size_t getNumberOfArguments() const override { return 0; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (arguments.empty()) diff --git a/src/Functions/array/arrayWithConstant.cpp b/src/Functions/array/arrayWithConstant.cpp index 578e8bf2296..a178147837c 100644 --- a/src/Functions/array/arrayWithConstant.cpp +++ b/src/Functions/array/arrayWithConstant.cpp @@ -35,6 +35,8 @@ public: String getName() const override { return name; } size_t getNumberOfArguments() const override { return 2; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (!isNativeNumber(arguments[0])) diff --git a/src/Functions/array/arrayZip.cpp b/src/Functions/array/arrayZip.cpp index f77b4f6dfe9..6e77d9a5442 100644 --- a/src/Functions/array/arrayZip.cpp +++ b/src/Functions/array/arrayZip.cpp @@ -34,6 +34,8 @@ public: size_t getNumberOfArguments() const override { return 0; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { if (arguments.empty()) diff --git a/src/Functions/array/emptyArray.cpp b/src/Functions/array/emptyArray.cpp index 370c51f3e8d..28e9b5ca2e2 100644 --- a/src/Functions/array/emptyArray.cpp +++ b/src/Functions/array/emptyArray.cpp @@ -37,6 +37,8 @@ private: return std::make_shared(std::make_shared()); } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName &, const DataTypePtr &, size_t input_rows_count) const override { return ColumnArray::create( diff --git a/src/Functions/array/emptyArrayToSingle.cpp b/src/Functions/array/emptyArrayToSingle.cpp index be387620e60..d6501216bd8 100644 --- a/src/Functions/array/emptyArrayToSingle.cpp +++ b/src/Functions/array/emptyArrayToSingle.cpp @@ -34,6 +34,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool useDefaultImplementationForConstants() const override { return true; } bool useDefaultImplementationForLowCardinalityColumns() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/array/hasAllAny.h b/src/Functions/array/hasAllAny.h index 40eba0207ab..44b191b6b23 100644 --- a/src/Functions/array/hasAllAny.h +++ b/src/Functions/array/hasAllAny.h @@ -38,6 +38,7 @@ public: bool isVariadic() const override { return false; } size_t getNumberOfArguments() const override { return 2; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/array/length.cpp b/src/Functions/array/length.cpp index 768590c6313..3e41f9e3a38 100644 --- a/src/Functions/array/length.cpp +++ b/src/Functions/array/length.cpp @@ -51,7 +51,7 @@ struct NameLength static constexpr auto name = "length"; }; -using FunctionLength = FunctionStringOrArrayToT; +using FunctionLength = FunctionStringOrArrayToT; void registerFunctionLength(FunctionFactory & factory) { diff --git a/src/Functions/array/mapOp.cpp b/src/Functions/array/mapOp.cpp index 72d6707c4b2..3bb2cdb9093 100644 --- a/src/Functions/array/mapOp.cpp +++ b/src/Functions/array/mapOp.cpp @@ -56,6 +56,7 @@ private: size_t getNumberOfArguments() const override { return 0; } bool isVariadic() const override { return true; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } void checkTypes( DataTypePtr & key_type, DataTypePtr & promoted_val_type, const DataTypePtr & check_key_type, DataTypePtr & check_val_type) const diff --git a/src/Functions/array/mapPopulateSeries.cpp b/src/Functions/array/mapPopulateSeries.cpp index 51e436e8022..b253a85c95d 100644 --- a/src/Functions/array/mapPopulateSeries.cpp +++ b/src/Functions/array/mapPopulateSeries.cpp @@ -33,6 +33,7 @@ private: size_t getNumberOfArguments() const override { return 0; } bool isVariadic() const override { return true; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } void checkTypes(const DataTypePtr & key_type, const DataTypePtr max_key_type) const { diff --git a/src/Functions/array/range.cpp b/src/Functions/array/range.cpp index 9eefc4f178d..47e28da536a 100644 --- a/src/Functions/array/range.cpp +++ b/src/Functions/array/range.cpp @@ -43,6 +43,7 @@ private: size_t getNumberOfArguments() const override { return 0; } bool isVariadic() const override { return true; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/assumeNotNull.cpp b/src/Functions/assumeNotNull.cpp index 019c637e50c..b180931a83a 100644 --- a/src/Functions/assumeNotNull.cpp +++ b/src/Functions/assumeNotNull.cpp @@ -29,6 +29,8 @@ public: return name; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + size_t getNumberOfArguments() const override { return 1; } bool useDefaultImplementationForNulls() const override { return false; } bool useDefaultImplementationForConstants() const override { return true; } diff --git a/src/Functions/bar.cpp b/src/Functions/bar.cpp index 2e26f7af0bb..0b5e48de067 100644 --- a/src/Functions/bar.cpp +++ b/src/Functions/bar.cpp @@ -42,6 +42,9 @@ public: { return true; } + + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + size_t getNumberOfArguments() const override { return 0; diff --git a/src/Functions/bitHammingDistance.cpp b/src/Functions/bitHammingDistance.cpp index 25b902b8bd5..bbb60a764fe 100644 --- a/src/Functions/bitHammingDistance.cpp +++ b/src/Functions/bitHammingDistance.cpp @@ -80,6 +80,8 @@ public: size_t getNumberOfArguments() const override { return 2; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (!isInteger(arguments[0])) diff --git a/src/Functions/blockNumber.cpp b/src/Functions/blockNumber.cpp index 9a57f8a96b0..e88fc68d01f 100644 --- a/src/Functions/blockNumber.cpp +++ b/src/Functions/blockNumber.cpp @@ -34,6 +34,11 @@ public: return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override + { + return false; + } + size_t getNumberOfArguments() const override { return 0; diff --git a/src/Functions/blockSerializedSize.cpp b/src/Functions/blockSerializedSize.cpp index 30f77bbf627..dd4fd1a4588 100644 --- a/src/Functions/blockSerializedSize.cpp +++ b/src/Functions/blockSerializedSize.cpp @@ -24,6 +24,7 @@ public: bool useDefaultImplementationForNulls() const override { return false; } size_t getNumberOfArguments() const override { return 0; } bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & /*arguments*/) const override { diff --git a/src/Functions/blockSize.cpp b/src/Functions/blockSize.cpp index 294686054f0..a5e87f58d98 100644 --- a/src/Functions/blockSize.cpp +++ b/src/Functions/blockSize.cpp @@ -33,6 +33,11 @@ public: return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override + { + return false; + } + size_t getNumberOfArguments() const override { return 0; diff --git a/src/Functions/buildId.cpp b/src/Functions/buildId.cpp index 5329d4a40b4..047bddeed9b 100644 --- a/src/Functions/buildId.cpp +++ b/src/Functions/buildId.cpp @@ -41,6 +41,10 @@ public: bool isDeterministic() const override { return false; } bool isDeterministicInScopeOfQuery() const override { return true; } bool isSuitableForConstantFolding() const override { return !is_distributed; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override + { + return false; + } DataTypePtr getReturnTypeImpl(const DataTypes & /*arguments*/) const override { diff --git a/src/Functions/byteSize.cpp b/src/Functions/byteSize.cpp index 54a7da59b9c..5a2dd3b2ec1 100644 --- a/src/Functions/byteSize.cpp +++ b/src/Functions/byteSize.cpp @@ -26,6 +26,7 @@ public: bool useDefaultImplementationForNulls() const override { return false; } bool useDefaultImplementationForLowCardinalityColumns() const override { return false; } bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } size_t getNumberOfArguments() const override { return 0; } DataTypePtr getReturnTypeImpl(const DataTypes & /*arguments*/) const override diff --git a/src/Functions/caseWithExpression.cpp b/src/Functions/caseWithExpression.cpp index 24b5855cc5b..37ee89c1f11 100644 --- a/src/Functions/caseWithExpression.cpp +++ b/src/Functions/caseWithExpression.cpp @@ -24,6 +24,7 @@ public: explicit FunctionCaseWithExpression(ContextPtr context_) : context(context_) {} bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } size_t getNumberOfArguments() const override { return 0; } String getName() const override { return name; } diff --git a/src/Functions/coalesce.cpp b/src/Functions/coalesce.cpp index 791b9d993b4..96aa110a489 100644 --- a/src/Functions/coalesce.cpp +++ b/src/Functions/coalesce.cpp @@ -38,6 +38,7 @@ public: bool useDefaultImplementationForNulls() const override { return false; } bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } size_t getNumberOfArguments() const override { return 0; } ColumnNumbers getArgumentsThatDontImplyNullableReturnType(size_t number_of_arguments) const override { diff --git a/src/Functions/concat.cpp b/src/Functions/concat.cpp index 195107cb221..526033183ec 100644 --- a/src/Functions/concat.cpp +++ b/src/Functions/concat.cpp @@ -44,6 +44,8 @@ public: bool isInjective(const ColumnsWithTypeAndName &) const override { return is_injective; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + bool useDefaultImplementationForConstants() const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override diff --git a/src/Functions/connectionId.cpp b/src/Functions/connectionId.cpp index ae04cfd1af6..69c8b9e86ea 100644 --- a/src/Functions/connectionId.cpp +++ b/src/Functions/connectionId.cpp @@ -21,6 +21,8 @@ public: size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes & /*arguments*/) const override { return std::make_shared(); } ColumnPtr executeImpl(const ColumnsWithTypeAndName &, const DataTypePtr & result_type, size_t input_rows_count) const override diff --git a/src/Functions/convertCharset.cpp b/src/Functions/convertCharset.cpp index 7e351af6cce..228df14f9d9 100644 --- a/src/Functions/convertCharset.cpp +++ b/src/Functions/convertCharset.cpp @@ -171,6 +171,8 @@ public: size_t getNumberOfArguments() const override { return 3; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { for (size_t i : collections::range(0, 3)) diff --git a/src/Functions/countDigits.cpp b/src/Functions/countDigits.cpp index 597a2c625b9..673fb291cb7 100644 --- a/src/Functions/countDigits.cpp +++ b/src/Functions/countDigits.cpp @@ -36,6 +36,7 @@ public: String getName() const override { return name; } bool useDefaultImplementationForConstants() const override { return true; } size_t getNumberOfArguments() const override { return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/countMatches.h b/src/Functions/countMatches.h index 6ae69520cb9..6d60ca94c18 100644 --- a/src/Functions/countMatches.h +++ b/src/Functions/countMatches.h @@ -31,6 +31,7 @@ public: String getName() const override { return name; } size_t getNumberOfArguments() const override { return 2; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { diff --git a/src/Functions/currentDatabase.cpp b/src/Functions/currentDatabase.cpp index 16eff20cfd5..c5f559d0838 100644 --- a/src/Functions/currentDatabase.cpp +++ b/src/Functions/currentDatabase.cpp @@ -41,6 +41,8 @@ public: bool isDeterministic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName &, const DataTypePtr &, size_t input_rows_count) const override { return DataTypeString().createColumnConst(input_rows_count, db_name); diff --git a/src/Functions/currentProfiles.cpp b/src/Functions/currentProfiles.cpp index afe54fd6582..c578268160e 100644 --- a/src/Functions/currentProfiles.cpp +++ b/src/Functions/currentProfiles.cpp @@ -29,6 +29,8 @@ namespace static constexpr auto name = (kind == Kind::CURRENT_PROFILES) ? "currentProfiles" : ((kind == Kind::ENABLED_PROFILES) ? "enabledProfiles" : "defaultProfiles"); static FunctionPtr create(const ContextPtr & context) { return std::make_shared(context); } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + String getName() const override { return name; } explicit FunctionCurrentProfiles(const ContextPtr & context) diff --git a/src/Functions/currentRoles.cpp b/src/Functions/currentRoles.cpp index 0a4e23308d8..c2545edd002 100644 --- a/src/Functions/currentRoles.cpp +++ b/src/Functions/currentRoles.cpp @@ -30,6 +30,8 @@ namespace static constexpr auto name = (kind == Kind::CURRENT_ROLES) ? "currentRoles" : ((kind == Kind::ENABLED_ROLES) ? "enabledRoles" : "defaultRoles"); static FunctionPtr create(const ContextPtr & context) { return std::make_shared(context); } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + String getName() const override { return name; } explicit FunctionCurrentRoles(const ContextPtr & context) diff --git a/src/Functions/currentUser.cpp b/src/Functions/currentUser.cpp index 22ad49fb29d..efa6e2cad2a 100644 --- a/src/Functions/currentUser.cpp +++ b/src/Functions/currentUser.cpp @@ -41,6 +41,8 @@ public: bool isDeterministic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName &, const DataTypePtr &, size_t input_rows_count) const override { return DataTypeString().createColumnConst(input_rows_count, user_name); diff --git a/src/Functions/dateDiff.cpp b/src/Functions/dateDiff.cpp index d2d1d7c6e0d..a430b905e34 100644 --- a/src/Functions/dateDiff.cpp +++ b/src/Functions/dateDiff.cpp @@ -55,6 +55,7 @@ public: } bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } size_t getNumberOfArguments() const override { return 0; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override diff --git a/src/Functions/dateName.cpp b/src/Functions/dateName.cpp index 9c34b0ae55c..0eb269b65e6 100644 --- a/src/Functions/dateName.cpp +++ b/src/Functions/dateName.cpp @@ -58,6 +58,8 @@ public: bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {0, 2}; } bool isVariadic() const override { return true; } diff --git a/src/Functions/date_trunc.cpp b/src/Functions/date_trunc.cpp index 1f2bcabf1f9..2455bf41fa7 100644 --- a/src/Functions/date_trunc.cpp +++ b/src/Functions/date_trunc.cpp @@ -32,6 +32,7 @@ public: String getName() const override { return name; } bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } size_t getNumberOfArguments() const override { return 0; } DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override diff --git a/src/Functions/defaultValueOfArgumentType.cpp b/src/Functions/defaultValueOfArgumentType.cpp index c0abe1b63d9..f4031692b4b 100644 --- a/src/Functions/defaultValueOfArgumentType.cpp +++ b/src/Functions/defaultValueOfArgumentType.cpp @@ -23,6 +23,11 @@ public: return name; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override + { + return false; + } + bool useDefaultImplementationForNulls() const override { return false; } bool useDefaultImplementationForLowCardinalityColumns() const override { return false; } diff --git a/src/Functions/defaultValueOfTypeName.cpp b/src/Functions/defaultValueOfTypeName.cpp index 1bf978ab17b..2efbaef46c5 100644 --- a/src/Functions/defaultValueOfTypeName.cpp +++ b/src/Functions/defaultValueOfTypeName.cpp @@ -31,6 +31,11 @@ public: return name; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override + { + return false; + } + bool useDefaultImplementationForNulls() const override { return false; } bool useDefaultImplementationForLowCardinalityColumns() const override { return false; } diff --git a/src/Functions/demange.cpp b/src/Functions/demange.cpp index 755a50dccbb..75849860347 100644 --- a/src/Functions/demange.cpp +++ b/src/Functions/demange.cpp @@ -41,6 +41,11 @@ public: return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override + { + return true; + } + DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { if (arguments.size() != 1) diff --git a/src/Functions/dumpColumnStructure.cpp b/src/Functions/dumpColumnStructure.cpp index 3189e343beb..f1e53cc6759 100644 --- a/src/Functions/dumpColumnStructure.cpp +++ b/src/Functions/dumpColumnStructure.cpp @@ -26,6 +26,8 @@ public: bool useDefaultImplementationForNulls() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + size_t getNumberOfArguments() const override { return 1; diff --git a/src/Functions/empty.cpp b/src/Functions/empty.cpp index 552fce85de0..d53f3585158 100644 --- a/src/Functions/empty.cpp +++ b/src/Functions/empty.cpp @@ -13,7 +13,7 @@ struct NameEmpty { static constexpr auto name = "empty"; }; -using FunctionEmpty = FunctionStringOrArrayToT, NameEmpty, UInt8>; +using FunctionEmpty = FunctionStringOrArrayToT, NameEmpty, UInt8, false>; } diff --git a/src/Functions/endsWith.cpp b/src/Functions/endsWith.cpp index 40ea7902465..5f32fbbe200 100644 --- a/src/Functions/endsWith.cpp +++ b/src/Functions/endsWith.cpp @@ -12,5 +12,6 @@ void registerFunctionEndsWith(FunctionFactory & factory) { factory.registerFunction(); } + } diff --git a/src/Functions/errorCodeToName.cpp b/src/Functions/errorCodeToName.cpp index d8e8e0f0d29..f447621c23c 100644 --- a/src/Functions/errorCodeToName.cpp +++ b/src/Functions/errorCodeToName.cpp @@ -27,6 +27,7 @@ public: String getName() const override { return name; } size_t getNumberOfArguments() const override { return 1; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & types) const override { diff --git a/src/Functions/evalMLMethod.cpp b/src/Functions/evalMLMethod.cpp index a69a6f0f550..876fec39c7b 100644 --- a/src/Functions/evalMLMethod.cpp +++ b/src/Functions/evalMLMethod.cpp @@ -44,6 +44,12 @@ public: { return true; } + + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override + { + return true; + } + size_t getNumberOfArguments() const override { return 0; diff --git a/src/Functions/extractAllGroups.h b/src/Functions/extractAllGroups.h index 62026dcc147..4f9a07a275c 100644 --- a/src/Functions/extractAllGroups.h +++ b/src/Functions/extractAllGroups.h @@ -65,6 +65,8 @@ public: size_t getNumberOfArguments() const override { return 2; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + bool useDefaultImplementationForConstants() const override { return true; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1}; } diff --git a/src/Functions/extractGroups.cpp b/src/Functions/extractGroups.cpp index f1d728ee3f6..5e421051385 100644 --- a/src/Functions/extractGroups.cpp +++ b/src/Functions/extractGroups.cpp @@ -37,6 +37,8 @@ public: size_t getNumberOfArguments() const override { return 2; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + bool useDefaultImplementationForConstants() const override { return false; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1}; } diff --git a/src/Functions/extractTextFromHTML.cpp b/src/Functions/extractTextFromHTML.cpp index 6a7bdbeaba9..2a0ff5fb7e7 100644 --- a/src/Functions/extractTextFromHTML.cpp +++ b/src/Functions/extractTextFromHTML.cpp @@ -300,6 +300,7 @@ public: String getName() const override { return name; } size_t getNumberOfArguments() const override { return 1; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/filesystem.cpp b/src/Functions/filesystem.cpp index d264c972656..bea7ffdf818 100644 --- a/src/Functions/filesystem.cpp +++ b/src/Functions/filesystem.cpp @@ -39,6 +39,11 @@ public: return std::make_shared>(std::filesystem::space(context->getConfigRef().getString("path"))); } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override + { + return false; + } + explicit FilesystemImpl(std::filesystem::space_info spaceinfo_) : spaceinfo(spaceinfo_) { } String getName() const override { return name; } diff --git a/src/Functions/finalizeAggregation.cpp b/src/Functions/finalizeAggregation.cpp index b3dfbc0aa15..237d9fa3ef8 100644 --- a/src/Functions/finalizeAggregation.cpp +++ b/src/Functions/finalizeAggregation.cpp @@ -39,6 +39,8 @@ public: return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + bool useDefaultImplementationForConstants() const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override diff --git a/src/Functions/formatDateTime.cpp b/src/Functions/formatDateTime.cpp index dc075dea7d0..fdd9a27ee45 100644 --- a/src/Functions/formatDateTime.cpp +++ b/src/Functions/formatDateTime.cpp @@ -290,6 +290,8 @@ public: bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1, 2}; } bool isVariadic() const override { return true; } diff --git a/src/Functions/formatReadable.h b/src/Functions/formatReadable.h index 6cf4fadbf05..7c0d6c5c817 100644 --- a/src/Functions/formatReadable.h +++ b/src/Functions/formatReadable.h @@ -35,6 +35,11 @@ public: return name; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override + { + return true; + } + size_t getNumberOfArguments() const override { return 1; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override diff --git a/src/Functions/formatReadableTimeDelta.cpp b/src/Functions/formatReadableTimeDelta.cpp index 69dbaa71041..d781d227c64 100644 --- a/src/Functions/formatReadableTimeDelta.cpp +++ b/src/Functions/formatReadableTimeDelta.cpp @@ -44,6 +44,8 @@ public: bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + size_t getNumberOfArguments() const override { return 0; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override diff --git a/src/Functions/formatRow.cpp b/src/Functions/formatRow.cpp index f45986ea08e..e4389fa45f6 100644 --- a/src/Functions/formatRow.cpp +++ b/src/Functions/formatRow.cpp @@ -45,6 +45,7 @@ public: size_t getNumberOfArguments() const override { return 0; } bool useDefaultImplementationForNulls() const override { return false; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {0}; } ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t input_rows_count) const override diff --git a/src/Functions/formatString.cpp b/src/Functions/formatString.cpp index 71da598060f..fb0abce2518 100644 --- a/src/Functions/formatString.cpp +++ b/src/Functions/formatString.cpp @@ -37,6 +37,8 @@ public: bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + size_t getNumberOfArguments() const override { return 0; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {0}; } diff --git a/src/Functions/fromModifiedJulianDay.cpp b/src/Functions/fromModifiedJulianDay.cpp index bdd8b9b6bd4..913cdbfb21c 100644 --- a/src/Functions/fromModifiedJulianDay.cpp +++ b/src/Functions/fromModifiedJulianDay.cpp @@ -127,6 +127,11 @@ namespace DB return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override + { + return true; + } + bool hasInformationAboutMonotonicity() const override { return true; diff --git a/src/Functions/fuzzBits.cpp b/src/Functions/fuzzBits.cpp index 0884f586082..12065546238 100644 --- a/src/Functions/fuzzBits.cpp +++ b/src/Functions/fuzzBits.cpp @@ -59,6 +59,8 @@ public: bool isVariadic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + size_t getNumberOfArguments() const override { return 2; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1}; } // indexing from 0 diff --git a/src/Functions/generateUUIDv4.cpp b/src/Functions/generateUUIDv4.cpp index 7ca127857df..659c4c2c7c6 100644 --- a/src/Functions/generateUUIDv4.cpp +++ b/src/Functions/generateUUIDv4.cpp @@ -23,6 +23,8 @@ public: size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes &) const override { return std::make_shared(); diff --git a/src/Functions/geoToH3.cpp b/src/Functions/geoToH3.cpp index 1b12e6c9ad3..c8ff01f7862 100644 --- a/src/Functions/geoToH3.cpp +++ b/src/Functions/geoToH3.cpp @@ -40,6 +40,7 @@ public: size_t getNumberOfArguments() const override { return 3; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/geoToS2.cpp b/src/Functions/geoToS2.cpp index c415cfade89..4a9f46d3d71 100644 --- a/src/Functions/geoToS2.cpp +++ b/src/Functions/geoToS2.cpp @@ -49,6 +49,8 @@ public: bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { for (size_t i = 0; i < getNumberOfArguments(); ++i) diff --git a/src/Functions/geohashDecode.cpp b/src/Functions/geohashDecode.cpp index bf774905868..199d1a62f1d 100644 --- a/src/Functions/geohashDecode.cpp +++ b/src/Functions/geohashDecode.cpp @@ -36,6 +36,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/geohashEncode.cpp b/src/Functions/geohashEncode.cpp index 15abe96e3e5..ebfa8167998 100644 --- a/src/Functions/geohashEncode.cpp +++ b/src/Functions/geohashEncode.cpp @@ -39,6 +39,7 @@ public: size_t getNumberOfArguments() const override { return 0; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {2}; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/geohashesInBox.cpp b/src/Functions/geohashesInBox.cpp index c0629ab9655..f6a8526ba9f 100644 --- a/src/Functions/geohashesInBox.cpp +++ b/src/Functions/geohashesInBox.cpp @@ -61,6 +61,8 @@ public: bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + template void execute( const IColumn * lon_min_column, diff --git a/src/Functions/getMacro.cpp b/src/Functions/getMacro.cpp index c869685af42..fb48a06aabc 100644 --- a/src/Functions/getMacro.cpp +++ b/src/Functions/getMacro.cpp @@ -44,6 +44,8 @@ public: bool isDeterministic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + bool isDeterministicInScopeOfQuery() const override { return false; diff --git a/src/Functions/getScalar.cpp b/src/Functions/getScalar.cpp index 13ec97a94fb..b06fb360366 100644 --- a/src/Functions/getScalar.cpp +++ b/src/Functions/getScalar.cpp @@ -42,6 +42,8 @@ public: return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { if (arguments.size() != 1 || !isString(arguments[0].type) || !arguments[0].column || !isColumnConst(*arguments[0].column)) @@ -105,6 +107,8 @@ public: bool isSuitableForConstantFolding() const override { return !is_distributed; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + size_t getNumberOfArguments() const override { return 0; diff --git a/src/Functions/getServerPort.cpp b/src/Functions/getServerPort.cpp new file mode 100644 index 00000000000..8596bcd6a07 --- /dev/null +++ b/src/Functions/getServerPort.cpp @@ -0,0 +1,136 @@ +#include +#include +#include +#include + + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; + extern const int ILLEGAL_COLUMN; + extern const int ILLEGAL_TYPE_OF_ARGUMENT; +} + +namespace +{ + +class ExecutableFunctionGetServerPort : public IExecutableFunction +{ +public: + explicit ExecutableFunctionGetServerPort(UInt16 port_) : port(port_) {} + + String getName() const override { return "getServerPort"; } + + bool useDefaultImplementationForNulls() const override { return false; } + + ColumnPtr executeImpl(const ColumnsWithTypeAndName &, const DataTypePtr &, size_t input_rows_count) const override + { + return DataTypeNumber().createColumnConst(input_rows_count, port); + } + +private: + UInt16 port; +}; + +class FunctionBaseGetServerPort : public IFunctionBase +{ +public: + explicit FunctionBaseGetServerPort(bool is_distributed_, UInt16 port_, DataTypes argument_types_, DataTypePtr return_type_) + : is_distributed(is_distributed_), port(port_), argument_types(std::move(argument_types_)), return_type(std::move(return_type_)) + { + } + + String getName() const override { return "getServerPort"; } + + const DataTypes & getArgumentTypes() const override + { + return argument_types; + } + + const DataTypePtr & getResultType() const override + { + return return_type; + } + + bool isDeterministic() const override { return false; } + bool isDeterministicInScopeOfQuery() const override { return true; } + bool isSuitableForConstantFolding() const override { return !is_distributed; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + + ExecutableFunctionPtr prepare(const ColumnsWithTypeAndName &) const override + { + return std::make_unique(port); + } + +private: + bool is_distributed; + UInt16 port; + DataTypes argument_types; + DataTypePtr return_type; +}; + +class GetServerPortOverloadResolver : public IFunctionOverloadResolver, WithContext +{ +public: + static constexpr auto name = "getServerPort"; + + String getName() const override { return name; } + + static FunctionOverloadResolverPtr create(ContextPtr context_) + { + return std::make_unique(context_); + } + + explicit GetServerPortOverloadResolver(ContextPtr context_) : WithContext(context_) {} + + size_t getNumberOfArguments() const override { return 1; } + ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {0}; } + bool isDeterministic() const override { return false; } + bool isDeterministicInScopeOfQuery() const override { return true; } + + DataTypePtr getReturnTypeImpl(const DataTypes & data_types) const override + { + size_t number_of_arguments = data_types.size(); + if (number_of_arguments != 1) + throw Exception( + ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, + "Number of arguments for function {} doesn't match: passed {}, should be 1", + getName(), + number_of_arguments); + return std::make_shared>(); + } + + FunctionBasePtr buildImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & return_type) const override + { + if (!isString(arguments[0].type)) + throw Exception( + ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, + "The argument of function {} should be a constant string with the name of a setting", + getName()); + const auto * column = arguments[0].column.get(); + if (!column || !checkAndGetColumnConstStringOrFixedString(column)) + throw Exception( + ErrorCodes::ILLEGAL_COLUMN, + "The argument of function {} should be a constant string with the name of a setting", + getName()); + + String port_name{column->getDataAt(0)}; + auto port = getContext()->getServerPort(port_name); + + DataTypes argument_types; + argument_types.emplace_back(arguments.back().type); + return std::make_unique(getContext()->isDistributed(), port, argument_types, return_type); + } +}; + +} + +void registerFunctionGetServerPort(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} diff --git a/src/Functions/getSetting.cpp b/src/Functions/getSetting.cpp index 0206de33125..7e146448dd6 100644 --- a/src/Functions/getSetting.cpp +++ b/src/Functions/getSetting.cpp @@ -29,10 +29,24 @@ public: String getName() const override { return name; } bool isDeterministic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } size_t getNumberOfArguments() const override { return 1; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {0}; } DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override + { + auto value = getValue(arguments); + return applyVisitor(FieldToDataType{}, value); + } + + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count) const override + { + auto value = getValue(arguments); + return result_type->createColumnConst(input_rows_count, convertFieldToType(value, *result_type)); + } + +private: + Field getValue(const ColumnsWithTypeAndName & arguments) const { if (!isString(arguments[0].type)) throw Exception{"The argument of function " + String{name} + " should be a constant string with the name of a setting", @@ -43,20 +57,8 @@ public: ErrorCodes::ILLEGAL_COLUMN}; std::string_view setting_name{column->getDataAt(0)}; - value = getContext()->getSettingsRef().get(setting_name); - - DataTypePtr type = applyVisitor(FieldToDataType{}, value); - value = convertFieldToType(value, *type); - return type; + return getContext()->getSettingsRef().get(setting_name); } - - ColumnPtr executeImpl(const ColumnsWithTypeAndName &, const DataTypePtr & result_type, size_t input_rows_count) const override - { - return result_type->createColumnConst(input_rows_count, value); - } - -private: - mutable Field value; }; } diff --git a/src/Functions/getSizeOfEnumType.cpp b/src/Functions/getSizeOfEnumType.cpp index 504c088a737..17436de02f7 100644 --- a/src/Functions/getSizeOfEnumType.cpp +++ b/src/Functions/getSizeOfEnumType.cpp @@ -37,6 +37,8 @@ public: return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { WhichDataType which(arguments[0]); diff --git a/src/Functions/globalVariable.cpp b/src/Functions/globalVariable.cpp index c141ceb2692..581ddbea371 100644 --- a/src/Functions/globalVariable.cpp +++ b/src/Functions/globalVariable.cpp @@ -45,6 +45,8 @@ public: return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { if (!checkColumnConst(arguments[0].column.get())) diff --git a/src/Functions/greatCircleDistance.cpp b/src/Functions/greatCircleDistance.cpp index bc02033cfc9..d1778a357b1 100644 --- a/src/Functions/greatCircleDistance.cpp +++ b/src/Functions/greatCircleDistance.cpp @@ -246,6 +246,7 @@ private: size_t getNumberOfArguments() const override { return 4; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/h3EdgeAngle.cpp b/src/Functions/h3EdgeAngle.cpp index aab8aeaf3a2..4d9276f3d1f 100644 --- a/src/Functions/h3EdgeAngle.cpp +++ b/src/Functions/h3EdgeAngle.cpp @@ -38,6 +38,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/h3EdgeLengthM.cpp b/src/Functions/h3EdgeLengthM.cpp index 3d745b21bd7..5d6e0b5093c 100644 --- a/src/Functions/h3EdgeLengthM.cpp +++ b/src/Functions/h3EdgeLengthM.cpp @@ -43,6 +43,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/h3GetBaseCell.cpp b/src/Functions/h3GetBaseCell.cpp index 4c424e4a1ab..381e459f32e 100644 --- a/src/Functions/h3GetBaseCell.cpp +++ b/src/Functions/h3GetBaseCell.cpp @@ -35,6 +35,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/h3GetResolution.cpp b/src/Functions/h3GetResolution.cpp index f387cdac2f0..cbcd54b1eb3 100644 --- a/src/Functions/h3GetResolution.cpp +++ b/src/Functions/h3GetResolution.cpp @@ -35,6 +35,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/h3HexAreaM2.cpp b/src/Functions/h3HexAreaM2.cpp index c4c6b5a57b2..c42e5b6f421 100644 --- a/src/Functions/h3HexAreaM2.cpp +++ b/src/Functions/h3HexAreaM2.cpp @@ -38,6 +38,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/h3IndexesAreNeighbors.cpp b/src/Functions/h3IndexesAreNeighbors.cpp index 2c9ceb9cc32..c04668a860f 100644 --- a/src/Functions/h3IndexesAreNeighbors.cpp +++ b/src/Functions/h3IndexesAreNeighbors.cpp @@ -35,6 +35,7 @@ public: size_t getNumberOfArguments() const override { return 2; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/h3IsValid.cpp b/src/Functions/h3IsValid.cpp index 37ec2b99cd9..cce75561349 100644 --- a/src/Functions/h3IsValid.cpp +++ b/src/Functions/h3IsValid.cpp @@ -35,6 +35,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/h3ToChildren.cpp b/src/Functions/h3ToChildren.cpp index d0d586cdf19..c83af0ab38a 100644 --- a/src/Functions/h3ToChildren.cpp +++ b/src/Functions/h3ToChildren.cpp @@ -44,6 +44,7 @@ public: size_t getNumberOfArguments() const override { return 2; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/h3ToParent.cpp b/src/Functions/h3ToParent.cpp index 0ec3df37e2e..fca4dc28372 100644 --- a/src/Functions/h3ToParent.cpp +++ b/src/Functions/h3ToParent.cpp @@ -38,6 +38,7 @@ public: size_t getNumberOfArguments() const override { return 2; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/h3ToString.cpp b/src/Functions/h3ToString.cpp index 372afb97296..f00221e480a 100644 --- a/src/Functions/h3ToString.cpp +++ b/src/Functions/h3ToString.cpp @@ -37,6 +37,8 @@ public: bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { const auto * arg = arguments[0].get(); diff --git a/src/Functions/h3kRing.cpp b/src/Functions/h3kRing.cpp index 583681e315e..3a340d3b37a 100644 --- a/src/Functions/h3kRing.cpp +++ b/src/Functions/h3kRing.cpp @@ -41,6 +41,7 @@ public: size_t getNumberOfArguments() const override { return 2; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/h3toGeo.cpp b/src/Functions/h3toGeo.cpp index 64facd1f010..b50add3e9d4 100644 --- a/src/Functions/h3toGeo.cpp +++ b/src/Functions/h3toGeo.cpp @@ -42,6 +42,8 @@ public: size_t getNumberOfArguments() const override { return 1; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { const auto * arg = arguments[0].get(); diff --git a/src/Functions/hasColumnInTable.cpp b/src/Functions/hasColumnInTable.cpp index 2e7428332cb..1062fbed600 100644 --- a/src/Functions/hasColumnInTable.cpp +++ b/src/Functions/hasColumnInTable.cpp @@ -56,6 +56,8 @@ public: bool isDeterministic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t input_rows_count) const override; }; diff --git a/src/Functions/hasThreadFuzzer.cpp b/src/Functions/hasThreadFuzzer.cpp index e9b48aa70f9..7ee0b3ee687 100644 --- a/src/Functions/hasThreadFuzzer.cpp +++ b/src/Functions/hasThreadFuzzer.cpp @@ -31,6 +31,8 @@ public: return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes & /*arguments*/) const override { return std::make_shared(); diff --git a/src/Functions/hostName.cpp b/src/Functions/hostName.cpp index fd8400d3b9f..2739b37e175 100644 --- a/src/Functions/hostName.cpp +++ b/src/Functions/hostName.cpp @@ -32,6 +32,8 @@ public: bool isDeterministic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + bool isDeterministicInScopeOfQuery() const override { return true; diff --git a/src/Functions/identity.cpp b/src/Functions/identity.cpp index d15d9e1f710..b3d05226bda 100644 --- a/src/Functions/identity.cpp +++ b/src/Functions/identity.cpp @@ -19,6 +19,7 @@ public: String getName() const override { return name; } size_t getNumberOfArguments() const override { return 1; } bool isSuitableForConstantFolding() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/if.cpp b/src/Functions/if.cpp index 8b930a73dfb..ea7e1303d27 100644 --- a/src/Functions/if.cpp +++ b/src/Functions/if.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #include #include #include @@ -15,15 +14,15 @@ #include #include #include +#include #include #include #include #include -#include #include #include -#include #include +#include namespace DB @@ -45,6 +44,74 @@ using namespace GatherUtils; * then, else - numeric types for which there is a general type, or dates, datetimes, or strings, or arrays of these types. */ +template +static inline void fillVectorVector(const ArrayCond & cond, const ArrayA & a, const ArrayB & b, ArrayResult & res) +{ + size_t size = cond.size(); + bool a_is_short = a.size() < size; + bool b_is_short = b.size() < size; + + if (a_is_short && b_is_short) + { + size_t a_index = 0, b_index = 0; + for (size_t i = 0; i < size; ++i) + res[i] = cond[i] ? static_cast(a[a_index++]) : static_cast(b[b_index++]); + } + else if (a_is_short) + { + size_t a_index = 0; + for (size_t i = 0; i < size; ++i) + res[i] = cond[i] ? static_cast(a[a_index++]) : static_cast(b[i]); + } + else if (b_is_short) + { + size_t b_index = 0; + for (size_t i = 0; i < size; ++i) + res[i] = cond[i] ? static_cast(a[i]) : static_cast(b[b_index++]); + } + else + { + for (size_t i = 0; i < size; ++i) + res[i] = cond[i] ? static_cast(a[i]) : static_cast(b[i]); + } +} + +template +static inline void fillVectorConstant(const ArrayCond & cond, const ArrayA & a, B b, ArrayResult & res) +{ + size_t size = cond.size(); + bool a_is_short = a.size() < size; + if (a_is_short) + { + size_t a_index = 0; + for (size_t i = 0; i < size; ++i) + res[i] = cond[i] ? static_cast(a[a_index++]) : static_cast(b); + } + else + { + for (size_t i = 0; i < size; ++i) + res[i] = cond[i] ? static_cast(a[i]) : static_cast(b); + } +} + +template +static inline void fillConstantVector(const ArrayCond & cond, A a, const ArrayB & b, ArrayResult & res) +{ + size_t size = cond.size(); + bool b_is_short = b.size() < size; + if (b_is_short) + { + size_t b_index = 0; + for (size_t i = 0; i < size; ++i) + res[i] = cond[i] ? static_cast(a) : static_cast(b[b_index++]); + } + else + { + for (size_t i = 0; i < size; ++i) + res[i] = cond[i] ? static_cast(a) : static_cast(b[i]); + } +} + template struct NumIfImpl { @@ -52,15 +119,14 @@ struct NumIfImpl using ArrayA = typename ColumnVector::Container; using ArrayB = typename ColumnVector::Container; using ColVecResult = ColumnVector; + using ArrayResult = typename ColVecResult::Container; static ColumnPtr vectorVector(const ArrayCond & cond, const ArrayA & a, const ArrayB & b, UInt32) { size_t size = cond.size(); auto col_res = ColVecResult::create(size); - typename ColVecResult::Container & res = col_res->getData(); - - for (size_t i = 0; i < size; ++i) - res[i] = cond[i] ? static_cast(a[i]) : static_cast(b[i]); + ArrayResult & res = col_res->getData(); + fillVectorVector(cond, a, b, res); return col_res; } @@ -68,10 +134,8 @@ struct NumIfImpl { size_t size = cond.size(); auto col_res = ColVecResult::create(size); - typename ColVecResult::Container & res = col_res->getData(); - - for (size_t i = 0; i < size; ++i) - res[i] = cond[i] ? static_cast(a[i]) : static_cast(b); + ArrayResult & res = col_res->getData(); + fillVectorConstant(cond, a, b, res); return col_res; } @@ -79,10 +143,8 @@ struct NumIfImpl { size_t size = cond.size(); auto col_res = ColVecResult::create(size); - typename ColVecResult::Container & res = col_res->getData(); - - for (size_t i = 0; i < size; ++i) - res[i] = cond[i] ? static_cast(a) : static_cast(b[i]); + ArrayResult & res = col_res->getData(); + fillConstantVector(cond, a, b, res); return col_res; } @@ -90,7 +152,7 @@ struct NumIfImpl { size_t size = cond.size(); auto col_res = ColVecResult::create(size); - typename ColVecResult::Container & res = col_res->getData(); + ArrayResult & res = col_res->getData(); for (size_t i = 0; i < size; ++i) res[i] = cond[i] ? static_cast(a) : static_cast(b); @@ -107,15 +169,14 @@ struct NumIfImpl, Decimal, Decimal> using ArrayB = typename ColumnDecimal>::Container; using ColVecResult = ColumnDecimal; using Block = ColumnsWithTypeAndName; + using ArrayResult = typename ColVecResult::Container; static ColumnPtr vectorVector(const ArrayCond & cond, const ArrayA & a, const ArrayB & b, UInt32 scale) { size_t size = cond.size(); auto col_res = ColVecResult::create(size, scale); - typename ColVecResult::Container & res = col_res->getData(); - - for (size_t i = 0; i < size; ++i) - res[i] = cond[i] ? static_cast(a[i]) : static_cast(b[i]); + ArrayResult & res = col_res->getData(); + fillVectorVector(cond, a, b, res); return col_res; } @@ -123,10 +184,8 @@ struct NumIfImpl, Decimal, Decimal> { size_t size = cond.size(); auto col_res = ColVecResult::create(size, scale); - typename ColVecResult::Container & res = col_res->getData(); - - for (size_t i = 0; i < size; ++i) - res[i] = cond[i] ? static_cast(a[i]) : static_cast(b); + ArrayResult & res = col_res->getData(); + fillVectorConstant(cond, a, b, res); return col_res; } @@ -134,10 +193,8 @@ struct NumIfImpl, Decimal, Decimal> { size_t size = cond.size(); auto col_res = ColVecResult::create(size, scale); - typename ColVecResult::Container & res = col_res->getData(); - - for (size_t i = 0; i < size; ++i) - res[i] = cond[i] ? static_cast(a) : static_cast(b[i]); + ArrayResult & res = col_res->getData(); + fillConstantVector(cond, a, b, res); return col_res; } @@ -145,7 +202,7 @@ struct NumIfImpl, Decimal, Decimal> { size_t size = cond.size(); auto col_res = ColVecResult::create(size, scale); - typename ColVecResult::Container & res = col_res->getData(); + ArrayResult & res = col_res->getData(); for (size_t i = 0; i < size; ++i) res[i] = cond[i] ? static_cast(a) : static_cast(b); @@ -586,6 +643,9 @@ private: bool then_is_const = isColumnConst(*col_then); bool else_is_const = isColumnConst(*col_else); + bool then_is_short = col_then->size() < cond_col->size(); + bool else_is_short = col_else->size() < cond_col->size(); + const auto & cond_array = cond_col->getData(); if (then_is_const && else_is_const) @@ -605,30 +665,38 @@ private: { const IColumn & then_nested_column = assert_cast(*col_then).getDataColumn(); + size_t else_index = 0; for (size_t i = 0; i < input_rows_count; ++i) { if (cond_array[i]) result_column->insertFrom(then_nested_column, 0); else - result_column->insertFrom(*col_else, i); + result_column->insertFrom(*col_else, else_is_short ? else_index++ : i); } } else if (else_is_const) { const IColumn & else_nested_column = assert_cast(*col_else).getDataColumn(); + size_t then_index = 0; for (size_t i = 0; i < input_rows_count; ++i) { if (cond_array[i]) - result_column->insertFrom(*col_then, i); + result_column->insertFrom(*col_then, then_is_short ? then_index++ : i); else result_column->insertFrom(else_nested_column, 0); } } else { + size_t then_index = 0, else_index = 0; for (size_t i = 0; i < input_rows_count; ++i) - result_column->insertFrom(cond_array[i] ? *col_then : *col_else, i); + { + if (cond_array[i]) + result_column->insertFrom(*col_then, then_is_short ? then_index++ : i); + else + result_column->insertFrom(*col_else, else_is_short ? else_index++ : i); + } } return result_column; @@ -702,7 +770,8 @@ private: return nullptr; } - static ColumnPtr materializeColumnIfConst(const ColumnPtr & column) + template + static ColumnPtr materializeColumnIfConst(const AnyColumnPtr & column) { return column->convertToFullColumnIfConst(); } @@ -816,6 +885,9 @@ private: if (then_is_null && else_is_null) return result_type->createColumnConstWithDefaultValue(input_rows_count); + bool then_is_short = arg_then.column->size() < arg_cond.column->size(); + bool else_is_short = arg_else.column->size() < arg_cond.column->size(); + const ColumnUInt8 * cond_col = typeid_cast(arg_cond.column.get()); const ColumnConst * cond_const_col = checkAndGetColumnConst>(arg_cond.column.get()); @@ -824,15 +896,17 @@ private: { if (cond_col) { + auto arg_else_column = arg_else.column; + auto result_column = IColumn::mutate(std::move(arg_else_column)); + if (else_is_short) + result_column->expand(cond_col->getData(), true); if (isColumnNullable(*arg_else.column)) { - auto arg_else_column = arg_else.column; - auto result_column = IColumn::mutate(std::move(arg_else_column)); assert_cast(*result_column).applyNullMap(assert_cast(*arg_cond.column)); return result_column; } else - return ColumnNullable::create(materializeColumnIfConst(arg_else.column), arg_cond.column); + return ColumnNullable::create(materializeColumnIfConst(result_column), arg_cond.column); } else if (cond_const_col) { @@ -852,25 +926,30 @@ private: { if (cond_col) { - size_t size = input_rows_count; - const auto & null_map_data = cond_col->getData(); - - auto negated_null_map = ColumnUInt8::create(); - auto & negated_null_map_data = negated_null_map->getData(); - negated_null_map_data.resize(size); - - for (size_t i = 0; i < size; ++i) - negated_null_map_data[i] = !null_map_data[i]; + auto arg_then_column = arg_then.column; + auto result_column = IColumn::mutate(std::move(arg_then_column)); + if (then_is_short) + result_column->expand(cond_col->getData(), false); if (isColumnNullable(*arg_then.column)) { - auto arg_then_column = arg_then.column; - auto result_column = IColumn::mutate(std::move(arg_then_column)); assert_cast(*result_column).applyNegatedNullMap(assert_cast(*arg_cond.column)); return result_column; } else - return ColumnNullable::create(materializeColumnIfConst(arg_then.column), std::move(negated_null_map)); + { + size_t size = input_rows_count; + const auto & null_map_data = cond_col->getData(); + + auto negated_null_map = ColumnUInt8::create(); + auto & negated_null_map_data = negated_null_map->getData(); + negated_null_map_data.resize(size); + + for (size_t i = 0; i < size; ++i) + negated_null_map_data[i] = !null_map_data[i]; + + return ColumnNullable::create(materializeColumnIfConst(result_column), std::move(negated_null_map)); + } } else if (cond_const_col) { @@ -888,6 +967,28 @@ private: return nullptr; } + static void executeShortCircuitArguments(ColumnsWithTypeAndName & arguments) + { + int last_short_circuit_argument_index = checkShirtCircuitArguments(arguments); + if (last_short_circuit_argument_index == -1) + return; + + /// Check if condition is const or null to not create full mask from it. + if ((isColumnConst(*arguments[0].column) || arguments[0].column->onlyNull()) && !arguments[0].column->empty()) + { + bool value = arguments[0].column->getBool(0); + executeColumnIfNeeded(arguments[1], !value); + executeColumnIfNeeded(arguments[2], value); + return; + } + + IColumn::Filter mask(arguments[0].column->size(), 1); + auto mask_info = extractMask(mask, arguments[0].column); + maskedExecute(arguments[1], mask, mask_info); + inverseMask(mask, mask_info); + maskedExecute(arguments[2], mask, mask_info); + } + public: String getName() const override { @@ -897,6 +998,14 @@ public: size_t getNumberOfArguments() const override { return 3; } bool useDefaultImplementationForNulls() const override { return false; } + bool isShortCircuit(ShortCircuitSettings & settings, size_t /*number_of_arguments*/) const override + { + settings.enable_lazy_execution_for_first_argument = false; + settings.enable_lazy_execution_for_common_descendants_of_arguments = false; + settings.force_enable_lazy_execution = false; + return true; + } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } ColumnNumbers getArgumentsThatDontImplyNullableReturnType(size_t /*number_of_arguments*/) const override { return {0}; } /// Get result types by argument types. If the function does not apply to these arguments, throw an exception. @@ -916,8 +1025,10 @@ public: return getLeastSupertype({arguments[1], arguments[2]}); } - ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count) const override + ColumnPtr executeImpl(const ColumnsWithTypeAndName & args, const DataTypePtr & result_type, size_t input_rows_count) const override { + ColumnsWithTypeAndName arguments = std::move(args); + executeShortCircuitArguments(arguments); ColumnPtr res; if ( (res = executeForConstAndNullableCondition(arguments, result_type, input_rows_count)) || (res = executeForNullThenElse(arguments, result_type, input_rows_count)) diff --git a/src/Functions/ifNotFinite.cpp b/src/Functions/ifNotFinite.cpp index a5e3131117e..49f74c2f5d0 100644 --- a/src/Functions/ifNotFinite.cpp +++ b/src/Functions/ifNotFinite.cpp @@ -32,6 +32,7 @@ public: size_t getNumberOfArguments() const override { return 2; } bool useDefaultImplementationForNulls() const override { return false; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } ColumnNumbers getArgumentsThatDontImplyNullableReturnType(size_t /*number_of_arguments*/) const override { return {0}; } DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override diff --git a/src/Functions/ifNull.cpp b/src/Functions/ifNull.cpp index 82b63f4dbda..31880b81a41 100644 --- a/src/Functions/ifNull.cpp +++ b/src/Functions/ifNull.cpp @@ -36,6 +36,7 @@ public: size_t getNumberOfArguments() const override { return 2; } bool useDefaultImplementationForNulls() const override { return false; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } ColumnNumbers getArgumentsThatDontImplyNullableReturnType(size_t /*number_of_arguments*/) const override { return {0}; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override diff --git a/src/Functions/ignore.cpp b/src/Functions/ignore.cpp index 176bc9afee2..931ef4a00ed 100644 --- a/src/Functions/ignore.cpp +++ b/src/Functions/ignore.cpp @@ -30,6 +30,7 @@ public: bool useDefaultImplementationForNulls() const override { return false; } bool isSuitableForConstantFolding() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } /// We should never return LowCardinality result, cause we declare that result is always constant zero. /// (in getResultIfAlwaysReturnsConstantAndHasArguments) diff --git a/src/Functions/in.cpp b/src/Functions/in.cpp index 7cd9f64004d..87e5886b247 100644 --- a/src/Functions/in.cpp +++ b/src/Functions/in.cpp @@ -88,6 +88,8 @@ public: bool useDefaultImplementationForNulls() const override { return null_is_skipped; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, [[maybe_unused]] size_t input_rows_count) const override { if constexpr (ignore_set) @@ -102,7 +104,7 @@ public: throw Exception("Second argument for function '" + getName() + "' must be Set; found " + column_set_ptr->getName(), ErrorCodes::ILLEGAL_COLUMN); - DB::Block columns_of_key_columns; + ColumnsWithTypeAndName columns_of_key_columns; /// First argument may be a tuple or a single column. const ColumnWithTypeAndName & left_arg = arguments[0]; @@ -125,16 +127,16 @@ public: const DataTypes & tuple_types = type_tuple->getElements(); size_t tuple_size = tuple_columns.size(); for (size_t i = 0; i < tuple_size; ++i) - columns_of_key_columns.insert({ tuple_columns[i], tuple_types[i], "" }); + columns_of_key_columns.emplace_back(tuple_columns[i], tuple_types[i], "_" + toString(i)); } else - columns_of_key_columns.insert(left_arg); + columns_of_key_columns.emplace_back(left_arg); /// Replace single LowCardinality column to it's dictionary if possible. ColumnPtr lc_indexes = nullptr; - if (columns_of_key_columns.columns() == 1) + if (columns_of_key_columns.size() == 1) { - auto & arg = columns_of_key_columns.safeGetByPosition(0); + auto & arg = columns_of_key_columns.at(0); const auto * col = arg.column.get(); if (const auto * const_col = typeid_cast(col)) col = &const_col->getDataColumn(); diff --git a/src/Functions/indexHint.cpp b/src/Functions/indexHint.cpp index f3c856c38ce..bb38a56cf27 100644 --- a/src/Functions/indexHint.cpp +++ b/src/Functions/indexHint.cpp @@ -41,6 +41,8 @@ public: bool isSuitableForConstantFolding() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + String getName() const override { return name; diff --git a/src/Functions/initialQueryID.cpp b/src/Functions/initialQueryID.cpp index 118339a8fb6..d032bde24e3 100644 --- a/src/Functions/initialQueryID.cpp +++ b/src/Functions/initialQueryID.cpp @@ -30,6 +30,8 @@ public: inline bool isDeterministic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName &, const DataTypePtr &, size_t input_rows_count) const override { return DataTypeString().createColumnConst(input_rows_count, initial_query_id); diff --git a/src/Functions/initializeAggregation.cpp b/src/Functions/initializeAggregation.cpp index b097d81e385..2f35ef26b1a 100644 --- a/src/Functions/initializeAggregation.cpp +++ b/src/Functions/initializeAggregation.cpp @@ -37,6 +37,8 @@ public: bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + bool useDefaultImplementationForConstants() const override { return true; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {0}; } diff --git a/src/Functions/isConstant.cpp b/src/Functions/isConstant.cpp index 3069ec79ae1..7ea3e26cb82 100644 --- a/src/Functions/isConstant.cpp +++ b/src/Functions/isConstant.cpp @@ -27,6 +27,8 @@ public: bool useDefaultImplementationForNulls() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + size_t getNumberOfArguments() const override { return 1; diff --git a/src/Functions/isDecimalOverflow.cpp b/src/Functions/isDecimalOverflow.cpp index d409afaf234..2c45a633686 100644 --- a/src/Functions/isDecimalOverflow.cpp +++ b/src/Functions/isDecimalOverflow.cpp @@ -36,6 +36,7 @@ public: String getName() const override { return name; } bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/isIPAddressContainedIn.cpp b/src/Functions/isIPAddressContainedIn.cpp index 0886ef55e7b..54789fadc74 100644 --- a/src/Functions/isIPAddressContainedIn.cpp +++ b/src/Functions/isIPAddressContainedIn.cpp @@ -126,6 +126,7 @@ namespace DB static constexpr auto name = "isIPAddressInRange"; String getName() const override { return name; } static FunctionPtr create(ContextPtr) { return std::make_shared(); } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & /* return_type */, size_t input_rows_count) const override { diff --git a/src/Functions/isNotNull.cpp b/src/Functions/isNotNull.cpp index 81c870a6303..49c5964012a 100644 --- a/src/Functions/isNotNull.cpp +++ b/src/Functions/isNotNull.cpp @@ -32,6 +32,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool useDefaultImplementationForNulls() const override { return false; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } ColumnNumbers getArgumentsThatDontImplyNullableReturnType(size_t /*number_of_arguments*/) const override { return {0}; } DataTypePtr getReturnTypeImpl(const DataTypes &) const override diff --git a/src/Functions/isNull.cpp b/src/Functions/isNull.cpp index de840dab2bf..f9111b2dbbb 100644 --- a/src/Functions/isNull.cpp +++ b/src/Functions/isNull.cpp @@ -31,6 +31,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool useDefaultImplementationForNulls() const override { return false; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } ColumnNumbers getArgumentsThatDontImplyNullableReturnType(size_t /*number_of_arguments*/) const override { return {0}; } DataTypePtr getReturnTypeImpl(const DataTypes &) const override diff --git a/src/Functions/isValidUTF8.cpp b/src/Functions/isValidUTF8.cpp index abdda53990d..0168a36b5b5 100644 --- a/src/Functions/isValidUTF8.cpp +++ b/src/Functions/isValidUTF8.cpp @@ -1,14 +1,7 @@ #include #include #include - -#include - -#ifdef __SSE4_1__ -# include -# include -# include -#endif +#include namespace DB { @@ -71,75 +64,8 @@ SOFTWARE. * +--------------------+------------+-------------+------------+-------------+ */ - static inline UInt8 isValidUTF8Naive(const UInt8 * data, UInt64 len) - { - while (len) - { - int bytes; - const UInt8 byte1 = data[0]; - /* 00..7F */ - if (byte1 <= 0x7F) - { - bytes = 1; - } - /* C2..DF, 80..BF */ - else if (len >= 2 && byte1 >= 0xC2 && byte1 <= 0xDF && static_cast(data[1]) <= static_cast(0xBF)) - { - bytes = 2; - } - else if (len >= 3) - { - const UInt8 byte2 = data[1]; - bool byte2_ok = static_cast(byte2) <= static_cast(0xBF); - bool byte3_ok = static_cast(data[2]) <= static_cast(0xBF); - - if (byte2_ok && byte3_ok && - /* E0, A0..BF, 80..BF */ - ((byte1 == 0xE0 && byte2 >= 0xA0) || - /* E1..EC, 80..BF, 80..BF */ - (byte1 >= 0xE1 && byte1 <= 0xEC) || - /* ED, 80..9F, 80..BF */ - (byte1 == 0xED && byte2 <= 0x9F) || - /* EE..EF, 80..BF, 80..BF */ - (byte1 >= 0xEE && byte1 <= 0xEF))) - { - bytes = 3; - } - else if (len >= 4) - { - bool byte4_ok = static_cast(data[3]) <= static_cast(0xBF); - if (byte2_ok && byte3_ok && byte4_ok && - /* F0, 90..BF, 80..BF, 80..BF */ - ((byte1 == 0xF0 && byte2 >= 0x90) || - /* F1..F3, 80..BF, 80..BF, 80..BF */ - (byte1 >= 0xF1 && byte1 <= 0xF3) || - /* F4, 80..8F, 80..BF, 80..BF */ - (byte1 == 0xF4 && byte2 <= 0x8F))) - { - bytes = 4; - } - else - { - return false; - } - } - else - { - return false; - } - } - else - { - return false; - } - len -= bytes; - data += bytes; - } - return true; - } - #ifndef __SSE4_1__ - static inline UInt8 isValidUTF8(const UInt8 * data, UInt64 len) { return isValidUTF8Naive(data, len); } + static inline UInt8 isValidUTF8(const UInt8 * data, UInt64 len) { return DB::UTF8::isValidUTF8(data, len); } #else static inline UInt8 isValidUTF8(const UInt8 * data, UInt64 len) { diff --git a/src/Functions/isZeroOrNull.cpp b/src/Functions/isZeroOrNull.cpp index a2a06af7569..1c3b6889f16 100644 --- a/src/Functions/isZeroOrNull.cpp +++ b/src/Functions/isZeroOrNull.cpp @@ -39,6 +39,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool useDefaultImplementationForNulls() const override { return false; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } ColumnNumbers getArgumentsThatDontImplyNullableReturnType(size_t /*number_of_arguments*/) const override { return {0}; } DataTypePtr getReturnTypeImpl(const DataTypes & types) const override diff --git a/src/Functions/lemmatize.cpp b/src/Functions/lemmatize.cpp index 35d2bfebe08..6d16b032bb5 100644 --- a/src/Functions/lemmatize.cpp +++ b/src/Functions/lemmatize.cpp @@ -79,6 +79,8 @@ public: size_t getNumberOfArguments() const override { return 2; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (!isString(arguments[0])) diff --git a/src/Functions/logTrace.cpp b/src/Functions/logTrace.cpp index 2ccc4d2ffd2..e60e83746ab 100644 --- a/src/Functions/logTrace.cpp +++ b/src/Functions/logTrace.cpp @@ -27,6 +27,8 @@ namespace size_t getNumberOfArguments() const override { return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (!isString(arguments[0])) diff --git a/src/Functions/lowCardinalityIndices.cpp b/src/Functions/lowCardinalityIndices.cpp index 580e7381955..de96053c1e7 100644 --- a/src/Functions/lowCardinalityIndices.cpp +++ b/src/Functions/lowCardinalityIndices.cpp @@ -30,6 +30,7 @@ public: bool useDefaultImplementationForNulls() const override { return false; } bool useDefaultImplementationForConstants() const override { return true; } bool useDefaultImplementationForLowCardinalityColumns() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/lowCardinalityKeys.cpp b/src/Functions/lowCardinalityKeys.cpp index 46128267871..aa5c87d5b6d 100644 --- a/src/Functions/lowCardinalityKeys.cpp +++ b/src/Functions/lowCardinalityKeys.cpp @@ -28,6 +28,7 @@ public: bool useDefaultImplementationForNulls() const override { return false; } bool useDefaultImplementationForConstants() const override { return true; } bool useDefaultImplementationForLowCardinalityColumns() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/map.cpp b/src/Functions/map.cpp index edd40e05304..c1c639cb6f9 100644 --- a/src/Functions/map.cpp +++ b/src/Functions/map.cpp @@ -59,6 +59,8 @@ public: return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + bool useDefaultImplementationForNulls() const override { return false; } bool useDefaultImplementationForConstants() const override { return true; } @@ -155,6 +157,8 @@ public: size_t getNumberOfArguments() const override { return 2; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { if (arguments.size() != 2) @@ -222,6 +226,8 @@ public: size_t getNumberOfArguments() const override { return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { if (arguments.size() != 1) @@ -269,6 +275,8 @@ public: size_t getNumberOfArguments() const override { return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { if (arguments.size() != 1) diff --git a/src/Functions/materialize.h b/src/Functions/materialize.h index 376fb34a672..aab4e5bdbdf 100644 --- a/src/Functions/materialize.h +++ b/src/Functions/materialize.h @@ -36,6 +36,8 @@ public: bool useDefaultImplementationForLowCardinalityColumns() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + size_t getNumberOfArguments() const override { return 1; diff --git a/src/Functions/multiIf.cpp b/src/Functions/multiIf.cpp index 92f05df472b..1122d4892c6 100644 --- a/src/Functions/multiIf.cpp +++ b/src/Functions/multiIf.cpp @@ -3,9 +3,10 @@ #include #include #include +#include #include -#include #include +#include #include #include @@ -39,6 +40,14 @@ public: String getName() const override { return name; } bool isVariadic() const override { return true; } + bool isShortCircuit(ShortCircuitSettings & settings, size_t number_of_arguments) const override + { + settings.enable_lazy_execution_for_first_argument = false; + settings.enable_lazy_execution_for_common_descendants_of_arguments = (number_of_arguments != 3); + settings.force_enable_lazy_execution = false; + return true; + } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } size_t getNumberOfArguments() const override { return 0; } bool useDefaultImplementationForNulls() const override { return false; } @@ -108,6 +117,8 @@ public: ColumnPtr executeImpl(const ColumnsWithTypeAndName & args, const DataTypePtr & result_type, size_t input_rows_count) const override { + ColumnsWithTypeAndName arguments = std::move(args); + executeShortCircuitArguments(arguments); /** We will gather values from columns in branches to result column, * depending on values of conditions. */ @@ -119,22 +130,27 @@ public: bool condition_always_true = false; bool condition_is_nullable = false; bool source_is_constant = false; + + bool condition_is_short = false; + bool source_is_short = false; + size_t condition_index = 0; + size_t source_index = 0; }; std::vector instructions; - instructions.reserve(args.size() / 2 + 1); + instructions.reserve(arguments.size() / 2 + 1); Columns converted_columns_holder; converted_columns_holder.reserve(instructions.size()); const DataTypePtr & return_type = result_type; - for (size_t i = 0; i < args.size(); i += 2) + for (size_t i = 0; i < arguments.size(); i += 2) { Instruction instruction; size_t source_idx = i + 1; - bool last_else_branch = source_idx == args.size(); + bool last_else_branch = source_idx == arguments.size(); if (last_else_branch) { @@ -144,7 +160,7 @@ public: } else { - const ColumnWithTypeAndName & cond_col = args[i]; + const ColumnWithTypeAndName & cond_col = arguments[i]; /// We skip branches that are always false. /// If we encounter a branch that is always true, we can finish. @@ -170,9 +186,12 @@ public: instruction.condition = cond_col.column.get(); } + + instruction.condition_is_short = cond_col.column->size() < arguments[0].column->size(); } - const ColumnWithTypeAndName & source_col = args[source_idx]; + const ColumnWithTypeAndName & source_col = arguments[source_idx]; + instruction.source_is_short = source_col.column->size() < arguments[0].column->size(); if (source_col.type->equals(*return_type)) { instruction.source = source_col.column.get(); @@ -208,27 +227,29 @@ public: for (size_t i = 0; i < rows; ++i) { - for (const auto & instruction : instructions) + for (auto & instruction : instructions) { bool insert = false; + size_t condition_index = instruction.condition_is_short ? instruction.condition_index++ : i; if (instruction.condition_always_true) insert = true; else if (!instruction.condition_is_nullable) - insert = assert_cast(*instruction.condition).getData()[i]; + insert = assert_cast(*instruction.condition).getData()[condition_index]; else { const ColumnNullable & condition_nullable = assert_cast(*instruction.condition); const ColumnUInt8 & condition_nested = assert_cast(condition_nullable.getNestedColumn()); const NullMap & condition_null_map = condition_nullable.getNullMapData(); - insert = !condition_null_map[i] && condition_nested.getData()[i]; + insert = !condition_null_map[condition_index] && condition_nested.getData()[condition_index]; } if (insert) { + size_t source_index = instruction.source_is_short ? instruction.source_index++ : i; if (!instruction.source_is_constant) - res->insertFrom(*instruction.source, i); + res->insertFrom(*instruction.source, source_index); else res->insertFrom(assert_cast(*instruction.source).getDataColumn(), 0); @@ -239,6 +260,74 @@ public: return res; } + +private: + static void executeShortCircuitArguments(ColumnsWithTypeAndName & arguments) + { + int last_short_circuit_argument_index = checkShirtCircuitArguments(arguments); + if (last_short_circuit_argument_index < 0) + return; + + /// Let's denote x_i' = maskedExecute(x_i, mask). + /// multiIf(x_0, y_0, x_1, y_1, x_2, y_2, ..., x_{n-1}, y_{n-1}, y_n) + /// We will support mask_i = !x_0 & !x_1 & ... & !x_i + /// and condition_i = !x_0 & ... & !x_{i - 1} & x_i + /// Base: + /// mask_0 and condition_0 is 1 everywhere, x_0' = x_0. + /// Iteration: + /// condition_i = extractMask(mask_{i - 1}, x_{i - 1}') + /// y_i' = maskedExecute(y_i, condition) + /// mask_i = extractMask(mask_{i - 1}, !x_{i - 1}') + /// x_i' = maskedExecute(x_i, mask) + /// Also we will treat NULL as 0 if x_i' is Nullable. + + IColumn::Filter mask(arguments[0].column->size(), 1); + MaskInfo mask_info = {.has_ones = true, .has_zeros = false}; + IColumn::Filter condition_mask(arguments[0].column->size()); + MaskInfo condition_mask_info = {.has_ones = true, .has_zeros = false}; + + int i = 1; + while (i <= last_short_circuit_argument_index) + { + auto & cond_column = arguments[i - 1].column; + /// If condition is const or null and value is false, we can skip execution of expression after this condition. + if ((isColumnConst(*cond_column) || cond_column->onlyNull()) && !cond_column->empty() && !cond_column->getBool(0)) + { + condition_mask_info.has_ones = false; + condition_mask_info.has_zeros = true; + } + else + { + copyMask(mask, condition_mask); + condition_mask_info = extractMask(condition_mask, cond_column); + maskedExecute(arguments[i], condition_mask, condition_mask_info); + } + + /// Check if the condition is always true and we don't need to execute the rest arguments. + if (!condition_mask_info.has_zeros) + break; + + ++i; + if (i > last_short_circuit_argument_index) + break; + + /// Extract mask only if it make sense. + if (condition_mask_info.has_ones) + mask_info = extractInvertedMask(mask, cond_column); + + /// mask is a inverted disjunction of previous conditions and if it doesn't have once, we don't need to execute the rest arguments. + if (!mask_info.has_ones) + break; + + maskedExecute(arguments[i], mask, mask_info); + ++i; + } + + /// We could skip some arguments execution, but we cannot leave them as ColumnFunction. + /// So, create an empty column with the execution result type. + for (; i <= last_short_circuit_argument_index; ++i) + executeColumnIfNeeded(arguments[i], true); + } }; } diff --git a/src/Functions/neighbor.cpp b/src/Functions/neighbor.cpp index 785c5817176..a1254446e01 100644 --- a/src/Functions/neighbor.cpp +++ b/src/Functions/neighbor.cpp @@ -46,6 +46,8 @@ public: bool isDeterministicInScopeOfQuery() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + bool useDefaultImplementationForNulls() const override { return false; } bool useDefaultImplementationForConstants() const override { return false; } diff --git a/src/Functions/normalizedQueryHash.cpp b/src/Functions/normalizedQueryHash.cpp index e08680518c1..c1e75e1f788 100644 --- a/src/Functions/normalizedQueryHash.cpp +++ b/src/Functions/normalizedQueryHash.cpp @@ -76,6 +76,8 @@ public: bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t /*input_rows_count*/) const override { const ColumnPtr column = arguments[0].column; diff --git a/src/Functions/notEmpty.cpp b/src/Functions/notEmpty.cpp index 6285e59652c..cc40be88ab1 100644 --- a/src/Functions/notEmpty.cpp +++ b/src/Functions/notEmpty.cpp @@ -13,7 +13,7 @@ struct NameNotEmpty { static constexpr auto name = "notEmpty"; }; -using FunctionNotEmpty = FunctionStringOrArrayToT, NameNotEmpty, UInt8>; +using FunctionNotEmpty = FunctionStringOrArrayToT, NameNotEmpty, UInt8, false>; } diff --git a/src/Functions/now.cpp b/src/Functions/now.cpp index 673484b2ad2..b244d054cfe 100644 --- a/src/Functions/now.cpp +++ b/src/Functions/now.cpp @@ -65,6 +65,7 @@ public: bool isDeterministic() const override { return false; } bool isDeterministicInScopeOfQuery() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } private: time_t time_value; diff --git a/src/Functions/now64.cpp b/src/Functions/now64.cpp index cccfb9de6b6..4a3f4dbfb22 100644 --- a/src/Functions/now64.cpp +++ b/src/Functions/now64.cpp @@ -89,6 +89,7 @@ public: bool isDeterministic() const override { return false; } bool isDeterministicInScopeOfQuery() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } private: Field time_value; diff --git a/src/Functions/nullIf.cpp b/src/Functions/nullIf.cpp index 14f2f72fe61..c54bbc08bcd 100644 --- a/src/Functions/nullIf.cpp +++ b/src/Functions/nullIf.cpp @@ -37,6 +37,7 @@ public: size_t getNumberOfArguments() const override { return 2; } bool useDefaultImplementationForNulls() const override { return false; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/padString.cpp b/src/Functions/padString.cpp index c03733a1198..14ca526d5b3 100644 --- a/src/Functions/padString.cpp +++ b/src/Functions/padString.cpp @@ -152,6 +152,8 @@ namespace bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + bool useDefaultImplementationForConstants() const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override diff --git a/src/Functions/partitionId.cpp b/src/Functions/partitionId.cpp index cf679452da1..eed3dd31bf9 100644 --- a/src/Functions/partitionId.cpp +++ b/src/Functions/partitionId.cpp @@ -35,6 +35,7 @@ public: bool useDefaultImplementationForNulls() const override { return true; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/pointInEllipses.cpp b/src/Functions/pointInEllipses.cpp index ac0f47d2264..fada1a0a306 100644 --- a/src/Functions/pointInEllipses.cpp +++ b/src/Functions/pointInEllipses.cpp @@ -55,6 +55,8 @@ private: bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + size_t getNumberOfArguments() const override { return 0; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override diff --git a/src/Functions/pointInPolygon.cpp b/src/Functions/pointInPolygon.cpp index 3848721c051..ebaba96a96e 100644 --- a/src/Functions/pointInPolygon.cpp +++ b/src/Functions/pointInPolygon.cpp @@ -81,6 +81,8 @@ public: return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (arguments.size() < 2) @@ -186,7 +188,7 @@ public: /// Preprocessing can be computationally heavy but dramatically speeds up matching. using Pool = ObjectPoolMap; - /// C++11 has thread-safe function-local statics. + /// C++11 has thread-safe function-local static. static Pool known_polygons; auto factory = [&polygon]() diff --git a/src/Functions/polygonArea.cpp b/src/Functions/polygonArea.cpp index 9a36b71d5b1..0275fbdb987 100644 --- a/src/Functions/polygonArea.cpp +++ b/src/Functions/polygonArea.cpp @@ -59,6 +59,8 @@ public: return std::make_shared(); } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & /*result_type*/, size_t input_rows_count) const override { auto res_column = ColumnFloat64::create(); diff --git a/src/Functions/polygonConvexHull.cpp b/src/Functions/polygonConvexHull.cpp index 5bce3c5bbdd..526dcf920be 100644 --- a/src/Functions/polygonConvexHull.cpp +++ b/src/Functions/polygonConvexHull.cpp @@ -48,6 +48,8 @@ public: return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + size_t getNumberOfArguments() const override { return 1; diff --git a/src/Functions/polygonPerimeter.cpp b/src/Functions/polygonPerimeter.cpp index 5a6e293630e..cf9973c40c7 100644 --- a/src/Functions/polygonPerimeter.cpp +++ b/src/Functions/polygonPerimeter.cpp @@ -58,6 +58,8 @@ public: return std::make_shared(); } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & /*result_type*/, size_t input_rows_count) const override { auto res_column = ColumnFloat64::create(); diff --git a/src/Functions/polygonsDistance.cpp b/src/Functions/polygonsDistance.cpp index d6c4ff36e4d..5a22f0b9112 100644 --- a/src/Functions/polygonsDistance.cpp +++ b/src/Functions/polygonsDistance.cpp @@ -60,6 +60,8 @@ public: return std::make_shared(); } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & /*result_type*/, size_t input_rows_count) const override { auto res_column = ColumnFloat64::create(); diff --git a/src/Functions/polygonsEquals.cpp b/src/Functions/polygonsEquals.cpp index 9e2902d0528..c959e4fbfd6 100644 --- a/src/Functions/polygonsEquals.cpp +++ b/src/Functions/polygonsEquals.cpp @@ -59,6 +59,8 @@ public: return std::make_shared(); } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & /*result_type*/, size_t input_rows_count) const override { auto res_column = ColumnUInt8::create(); diff --git a/src/Functions/polygonsIntersection.cpp b/src/Functions/polygonsIntersection.cpp index 699488abab1..a5aaee251b9 100644 --- a/src/Functions/polygonsIntersection.cpp +++ b/src/Functions/polygonsIntersection.cpp @@ -60,6 +60,8 @@ public: return DataTypeFactory::instance().get("MultiPolygon"); } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & /*result_type*/, size_t input_rows_count) const override { MultiPolygonSerializer serializer; diff --git a/src/Functions/polygonsSymDifference.cpp b/src/Functions/polygonsSymDifference.cpp index 129e553f060..c5f7e024557 100644 --- a/src/Functions/polygonsSymDifference.cpp +++ b/src/Functions/polygonsSymDifference.cpp @@ -59,6 +59,8 @@ public: return DataTypeFactory::instance().get("MultiPolygon"); } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & /*result_type*/, size_t input_rows_count) const override { MultiPolygonSerializer serializer; diff --git a/src/Functions/polygonsUnion.cpp b/src/Functions/polygonsUnion.cpp index e7281c299d0..1ef450dae24 100644 --- a/src/Functions/polygonsUnion.cpp +++ b/src/Functions/polygonsUnion.cpp @@ -59,6 +59,8 @@ public: return DataTypeFactory::instance().get("MultiPolygon"); } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & /*result_type*/, size_t input_rows_count) const override { MultiPolygonSerializer serializer; diff --git a/src/Functions/polygonsWithin.cpp b/src/Functions/polygonsWithin.cpp index 2fd5b7e2225..649eb7feced 100644 --- a/src/Functions/polygonsWithin.cpp +++ b/src/Functions/polygonsWithin.cpp @@ -61,6 +61,8 @@ public: return std::make_shared(); } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & /*result_type*/, size_t input_rows_count) const override { auto res_column = ColumnUInt8::create(); diff --git a/src/Functions/queryID.cpp b/src/Functions/queryID.cpp index b55d3fa0326..b1945bb1686 100644 --- a/src/Functions/queryID.cpp +++ b/src/Functions/queryID.cpp @@ -30,6 +30,8 @@ public: inline bool isDeterministic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName &, const DataTypePtr &, size_t input_rows_count) const override { return DataTypeString().createColumnConst(input_rows_count, query_id)->convertToFullColumnIfConst(); diff --git a/src/Functions/randConstant.cpp b/src/Functions/randConstant.cpp index 77d8e1f2a33..e273eb4992e 100644 --- a/src/Functions/randConstant.cpp +++ b/src/Functions/randConstant.cpp @@ -52,6 +52,8 @@ public: return return_type; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + ExecutableFunctionPtr prepare(const ColumnsWithTypeAndName &) const override { return std::make_unique>(value); diff --git a/src/Functions/randomFixedString.cpp b/src/Functions/randomFixedString.cpp index 13996eee677..dacdd8df9a9 100644 --- a/src/Functions/randomFixedString.cpp +++ b/src/Functions/randomFixedString.cpp @@ -35,6 +35,8 @@ public: bool isVariadic() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + size_t getNumberOfArguments() const override { return 1; } DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override diff --git a/src/Functions/randomPrintableASCII.cpp b/src/Functions/randomPrintableASCII.cpp index ba8c16aa689..3bfa1fbda6d 100644 --- a/src/Functions/randomPrintableASCII.cpp +++ b/src/Functions/randomPrintableASCII.cpp @@ -35,6 +35,7 @@ public: } bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } size_t getNumberOfArguments() const override { return 0; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override diff --git a/src/Functions/randomString.cpp b/src/Functions/randomString.cpp index 10795626326..118822460e1 100644 --- a/src/Functions/randomString.cpp +++ b/src/Functions/randomString.cpp @@ -33,6 +33,8 @@ public: bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + size_t getNumberOfArguments() const override { return 0; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override diff --git a/src/Functions/randomStringUTF8.cpp b/src/Functions/randomStringUTF8.cpp index 018c591a1fe..c6d05002d87 100644 --- a/src/Functions/randomStringUTF8.cpp +++ b/src/Functions/randomStringUTF8.cpp @@ -48,6 +48,7 @@ public: bool isDeterministic() const override { return false; } bool isDeterministicInScopeOfQuery() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t input_rows_count) const override { diff --git a/src/Functions/readWkt.cpp b/src/Functions/readWkt.cpp index 2ce4becb01c..14e12fb310c 100644 --- a/src/Functions/readWkt.cpp +++ b/src/Functions/readWkt.cpp @@ -35,6 +35,8 @@ public: return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (checkAndGetDataType(arguments[0].get()) == nullptr) diff --git a/src/Functions/regexpQuoteMeta.cpp b/src/Functions/regexpQuoteMeta.cpp index 0f1ec476a3b..e8a2d047103 100644 --- a/src/Functions/regexpQuoteMeta.cpp +++ b/src/Functions/regexpQuoteMeta.cpp @@ -41,6 +41,8 @@ public: return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { if (!WhichDataType(arguments[0].type).isString()) diff --git a/src/Functions/registerFunctions.cpp b/src/Functions/registerFunctions.cpp index 7e8f35bc0c4..9b1a7faebbe 100644 --- a/src/Functions/registerFunctions.cpp +++ b/src/Functions/registerFunctions.cpp @@ -51,6 +51,7 @@ void registerFunctionBitHammingDistance(FunctionFactory & factory); void registerFunctionTupleHammingDistance(FunctionFactory & factory); void registerFunctionsStringHash(FunctionFactory & factory); void registerFunctionValidateNestedArraySizes(FunctionFactory & factory); +void registerFunctionsSnowflake(FunctionFactory & factory); #if !defined(ARCADIA_BUILD) void registerFunctionBayesAB(FunctionFactory &); #endif @@ -115,6 +116,7 @@ void registerFunctions() registerFunctionTupleHammingDistance(factory); registerFunctionsStringHash(factory); registerFunctionValidateNestedArraySizes(factory); + registerFunctionsSnowflake(factory); #if !defined(ARCADIA_BUILD) registerFunctionBayesAB(factory); diff --git a/src/Functions/registerFunctionsMiscellaneous.cpp b/src/Functions/registerFunctionsMiscellaneous.cpp index 12c54aeeefd..04561203c67 100644 --- a/src/Functions/registerFunctionsMiscellaneous.cpp +++ b/src/Functions/registerFunctionsMiscellaneous.cpp @@ -71,6 +71,7 @@ void registerFunctionHasThreadFuzzer(FunctionFactory &); void registerFunctionInitializeAggregation(FunctionFactory &); void registerFunctionErrorCodeToName(FunctionFactory &); void registerFunctionTcpPort(FunctionFactory &); +void registerFunctionGetServerPort(FunctionFactory &); void registerFunctionByteSize(FunctionFactory &); void registerFunctionFile(FunctionFactory & factory); void registerFunctionConnectionId(FunctionFactory & factory); @@ -78,6 +79,7 @@ void registerFunctionPartitionId(FunctionFactory & factory); void registerFunctionIsIPAddressContainedIn(FunctionFactory &); void registerFunctionQueryID(FunctionFactory & factory); void registerFunctionInitialQueryID(FunctionFactory & factory); +void registerFunctionServerUUID(FunctionFactory &); #if USE_ICU void registerFunctionConvertCharset(FunctionFactory &); @@ -149,6 +151,7 @@ void registerFunctionsMiscellaneous(FunctionFactory & factory) registerFunctionInitializeAggregation(factory); registerFunctionErrorCodeToName(factory); registerFunctionTcpPort(factory); + registerFunctionGetServerPort(factory); registerFunctionByteSize(factory); registerFunctionFile(factory); registerFunctionConnectionId(factory); @@ -156,6 +159,7 @@ void registerFunctionsMiscellaneous(FunctionFactory & factory) registerFunctionIsIPAddressContainedIn(factory); registerFunctionQueryID(factory); registerFunctionInitialQueryID(factory); + registerFunctionServerUUID(factory); #if USE_ICU registerFunctionConvertCharset(factory); diff --git a/src/Functions/registerFunctionsSnowflake.cpp b/src/Functions/registerFunctionsSnowflake.cpp new file mode 100644 index 00000000000..7a0569ee16a --- /dev/null +++ b/src/Functions/registerFunctionsSnowflake.cpp @@ -0,0 +1,22 @@ +namespace DB +{ + +class FunctionFactory; + +void registerDateTimeToSnowflake(FunctionFactory &); +void registerSnowflakeToDateTime(FunctionFactory &); + +void registerDateTime64ToSnowflake(FunctionFactory &); +void registerSnowflakeToDateTime64(FunctionFactory &); + + +void registerFunctionsSnowflake(FunctionFactory & factory) +{ + registerDateTimeToSnowflake(factory); + registerSnowflakeToDateTime(factory); + + registerDateTime64ToSnowflake(factory); + registerSnowflakeToDateTime64(factory); +} + +} diff --git a/src/Functions/reinterpretAs.cpp b/src/Functions/reinterpretAs.cpp index 460651ac5c1..0aba61e44cb 100644 --- a/src/Functions/reinterpretAs.cpp +++ b/src/Functions/reinterpretAs.cpp @@ -55,6 +55,8 @@ public: bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1}; } DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override @@ -359,6 +361,8 @@ public: bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + static ColumnsWithTypeAndName addTypeColumnToArguments(const ColumnsWithTypeAndName & arguments) { const auto & argument = arguments[0]; diff --git a/src/Functions/repeat.cpp b/src/Functions/repeat.cpp index 423ed53c53f..6100b523420 100644 --- a/src/Functions/repeat.cpp +++ b/src/Functions/repeat.cpp @@ -179,6 +179,8 @@ public: size_t getNumberOfArguments() const override { return 2; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (!isString(arguments[0])) diff --git a/src/Functions/replicate.h b/src/Functions/replicate.h index 71b39e9e60e..2455fda39c9 100644 --- a/src/Functions/replicate.h +++ b/src/Functions/replicate.h @@ -30,6 +30,8 @@ public: bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + bool useDefaultImplementationForNulls() const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override; diff --git a/src/Functions/reverse.cpp b/src/Functions/reverse.cpp index 2b3692f6f22..0750c21025a 100644 --- a/src/Functions/reverse.cpp +++ b/src/Functions/reverse.cpp @@ -77,6 +77,8 @@ public: return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (!isStringOrFixedString(arguments[0]) diff --git a/src/Functions/rowNumberInAllBlocks.cpp b/src/Functions/rowNumberInAllBlocks.cpp index 9c358aec8f0..b12fe351553 100644 --- a/src/Functions/rowNumberInAllBlocks.cpp +++ b/src/Functions/rowNumberInAllBlocks.cpp @@ -46,6 +46,8 @@ public: return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes & /*arguments*/) const override { return std::make_shared(); diff --git a/src/Functions/rowNumberInBlock.cpp b/src/Functions/rowNumberInBlock.cpp index 48fa472e1dd..89a9124691f 100644 --- a/src/Functions/rowNumberInBlock.cpp +++ b/src/Functions/rowNumberInBlock.cpp @@ -41,6 +41,8 @@ public: return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes & /*arguments*/) const override { return std::make_shared(); diff --git a/src/Functions/runningAccumulate.cpp b/src/Functions/runningAccumulate.cpp index 796c501e86f..50a438c8a27 100644 --- a/src/Functions/runningAccumulate.cpp +++ b/src/Functions/runningAccumulate.cpp @@ -59,6 +59,8 @@ public: return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (arguments.empty() || arguments.size() > 2) diff --git a/src/Functions/runningConcurrency.cpp b/src/Functions/runningConcurrency.cpp index 022e2be5f6c..fca9fb0491e 100644 --- a/src/Functions/runningConcurrency.cpp +++ b/src/Functions/runningConcurrency.cpp @@ -119,6 +119,8 @@ namespace DB return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + private: DataTypes argument_types; DataTypePtr return_type; diff --git a/src/Functions/runningDifference.h b/src/Functions/runningDifference.h index 52796653d32..f3caf245d08 100644 --- a/src/Functions/runningDifference.h +++ b/src/Functions/runningDifference.h @@ -153,6 +153,8 @@ public: return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + bool useDefaultImplementationForNulls() const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override diff --git a/src/Functions/s2CapContains.cpp b/src/Functions/s2CapContains.cpp index ce2abc14fad..b83c90a1af9 100644 --- a/src/Functions/s2CapContains.cpp +++ b/src/Functions/s2CapContains.cpp @@ -56,6 +56,8 @@ public: bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { for (size_t index = 0; index < getNumberOfArguments(); ++index) diff --git a/src/Functions/s2CapUnion.cpp b/src/Functions/s2CapUnion.cpp index 4520f436161..4188e429efc 100644 --- a/src/Functions/s2CapUnion.cpp +++ b/src/Functions/s2CapUnion.cpp @@ -52,6 +52,8 @@ public: bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { for (size_t index = 0; index < getNumberOfArguments(); ++index) diff --git a/src/Functions/s2CellsIntersect.cpp b/src/Functions/s2CellsIntersect.cpp index 3d25fdbe44d..421276bb00d 100644 --- a/src/Functions/s2CellsIntersect.cpp +++ b/src/Functions/s2CellsIntersect.cpp @@ -48,6 +48,8 @@ public: bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { for (size_t i = 0; i < getNumberOfArguments(); ++i) diff --git a/src/Functions/s2GetNeighbors.cpp b/src/Functions/s2GetNeighbors.cpp index 8da0777a4ef..601e09155ad 100644 --- a/src/Functions/s2GetNeighbors.cpp +++ b/src/Functions/s2GetNeighbors.cpp @@ -49,6 +49,8 @@ public: bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { const auto * arg = arguments[0].get(); diff --git a/src/Functions/s2RectAdd.cpp b/src/Functions/s2RectAdd.cpp index ceceb11da05..90578567da2 100644 --- a/src/Functions/s2RectAdd.cpp +++ b/src/Functions/s2RectAdd.cpp @@ -45,6 +45,8 @@ public: bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { for (size_t index = 0; index < getNumberOfArguments(); ++index) diff --git a/src/Functions/s2RectContains.cpp b/src/Functions/s2RectContains.cpp index 2b4ae31a6b2..5f556c3ec14 100644 --- a/src/Functions/s2RectContains.cpp +++ b/src/Functions/s2RectContains.cpp @@ -45,6 +45,8 @@ public: bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { for (size_t i = 0; i < getNumberOfArguments(); ++i) diff --git a/src/Functions/s2RectIntersection.cpp b/src/Functions/s2RectIntersection.cpp index f106167247b..0980c7c50b3 100644 --- a/src/Functions/s2RectIntersection.cpp +++ b/src/Functions/s2RectIntersection.cpp @@ -48,6 +48,8 @@ public: bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { for (size_t i = 0; i < getNumberOfArguments(); ++i) diff --git a/src/Functions/s2RectUnion.cpp b/src/Functions/s2RectUnion.cpp index 387d8b25f29..bff419bdb47 100644 --- a/src/Functions/s2RectUnion.cpp +++ b/src/Functions/s2RectUnion.cpp @@ -46,6 +46,8 @@ public: bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { for (size_t i = 0; i < getNumberOfArguments(); ++i) diff --git a/src/Functions/s2ToGeo.cpp b/src/Functions/s2ToGeo.cpp index 98f71e898bd..59a647345bb 100644 --- a/src/Functions/s2ToGeo.cpp +++ b/src/Functions/s2ToGeo.cpp @@ -50,6 +50,8 @@ public: bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { const auto * arg = arguments[0].get(); diff --git a/src/Functions/serverUUID.cpp b/src/Functions/serverUUID.cpp new file mode 100644 index 00000000000..4b70b1576ac --- /dev/null +++ b/src/Functions/serverUUID.cpp @@ -0,0 +1,60 @@ +#include +#include +#include +#include + + +namespace DB +{ + +namespace +{ + +class FunctionServerUUID : public IFunction + { + public: + static constexpr auto name = "serverUUID"; + + static FunctionPtr create(ContextPtr context) + { + return std::make_shared(context->isDistributed(), ServerUUID::get()); + } + + explicit FunctionServerUUID(bool is_distributed_, UUID server_uuid_) + : is_distributed(is_distributed_), server_uuid(server_uuid_) + { + } + + String getName() const override { return name; } + + size_t getNumberOfArguments() const override { return 0; } + + DataTypePtr getReturnTypeImpl(const DataTypes &) const override { return std::make_shared(); } + + bool isDeterministic() const override { return false; } + + bool isDeterministicInScopeOfQuery() const override { return true; } + + bool isSuitableForConstantFolding() const override { return !is_distributed; } + + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo &) const override { return false; } + + ColumnPtr executeImpl(const ColumnsWithTypeAndName &, const DataTypePtr &, size_t input_rows_count) const override + { + return DataTypeUUID().createColumnConst(input_rows_count, server_uuid); + } + + private: + bool is_distributed; + const UUID server_uuid; + }; + +} + +void registerFunctionServerUUID(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} + diff --git a/src/Functions/sleep.h b/src/Functions/sleep.h index 304d51760de..92b68b8f2c7 100644 --- a/src/Functions/sleep.h +++ b/src/Functions/sleep.h @@ -64,6 +64,8 @@ public: return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { WhichDataType which(arguments[0]); diff --git a/src/Functions/snowflake.cpp b/src/Functions/snowflake.cpp new file mode 100644 index 00000000000..5ac1d229d17 --- /dev/null +++ b/src/Functions/snowflake.cpp @@ -0,0 +1,34 @@ +#include +#include + +namespace DB +{ + +void registerDateTimeToSnowflake(FunctionFactory & factory) +{ + factory.registerFunction("dateTimeToSnowflake", + [](ContextPtr){ return std::make_unique( + std::make_shared("dateTimeToSnowflake")); }); +} + +void registerDateTime64ToSnowflake(FunctionFactory & factory) +{ + factory.registerFunction("dateTime64ToSnowflake", + [](ContextPtr){ return std::make_unique( + std::make_shared("dateTime64ToSnowflake")); }); +} + +void registerSnowflakeToDateTime(FunctionFactory & factory) +{ + factory.registerFunction("snowflakeToDateTime", + [](ContextPtr){ return std::make_unique( + std::make_shared("snowflakeToDateTime")); }); +} +void registerSnowflakeToDateTime64(FunctionFactory & factory) +{ + factory.registerFunction("snowflakeToDateTime64", + [](ContextPtr){ return std::make_unique( + std::make_shared("snowflakeToDateTime64")); }); +} + +} diff --git a/src/Functions/stem.cpp b/src/Functions/stem.cpp index 98dcbccd005..950b1760c23 100644 --- a/src/Functions/stem.cpp +++ b/src/Functions/stem.cpp @@ -11,7 +11,7 @@ #include #include -#include +#include // Y_IGNORE namespace DB @@ -85,6 +85,8 @@ public: size_t getNumberOfArguments() const override { return 2; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (!isString(arguments[0])) diff --git a/src/Functions/stringCutToZero.cpp b/src/Functions/stringCutToZero.cpp index ed8cee0d70c..baebf67c0e3 100644 --- a/src/Functions/stringCutToZero.cpp +++ b/src/Functions/stringCutToZero.cpp @@ -27,6 +27,8 @@ public: size_t getNumberOfArguments() const override { return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (!isStringOrFixedString(arguments[0])) diff --git a/src/Functions/stringToH3.cpp b/src/Functions/stringToH3.cpp index 9b02711db50..1ecdb456632 100644 --- a/src/Functions/stringToH3.cpp +++ b/src/Functions/stringToH3.cpp @@ -40,6 +40,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { @@ -84,7 +85,7 @@ private: { auto h3index = h3index_source.getWhole(); - // covert to std::string and get the c_str to have the delimiting \0 at the end. + // convert to std::string and get the c_str to have the delimiting \0 at the end. auto h3index_str = StringRef(h3index.data, h3index.size).toString(); res_data[row_num] = stringToH3(h3index_str.c_str()); diff --git a/src/Functions/substring.cpp b/src/Functions/substring.cpp index 5ce75035475..ca94071187a 100644 --- a/src/Functions/substring.cpp +++ b/src/Functions/substring.cpp @@ -49,6 +49,8 @@ public: bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + bool useDefaultImplementationForConstants() const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override diff --git a/src/Functions/svg.cpp b/src/Functions/svg.cpp index 39473816c8c..4495e668add 100644 --- a/src/Functions/svg.cpp +++ b/src/Functions/svg.cpp @@ -44,6 +44,8 @@ public: return 2; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (arguments.size() > 2) diff --git a/src/Functions/synonyms.cpp b/src/Functions/synonyms.cpp index 4201fbfa677..5cb9e064c40 100644 --- a/src/Functions/synonyms.cpp +++ b/src/Functions/synonyms.cpp @@ -50,6 +50,8 @@ public: size_t getNumberOfArguments() const override { return 2; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (!isString(arguments[0])) diff --git a/src/Functions/tcpPort.cpp b/src/Functions/tcpPort.cpp index e0905ed4d0c..10b89faa1be 100644 --- a/src/Functions/tcpPort.cpp +++ b/src/Functions/tcpPort.cpp @@ -35,6 +35,8 @@ public: bool isSuitableForConstantFolding() const override { return !is_distributed; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName &, const DataTypePtr &, size_t input_rows_count) const override { return DataTypeUInt16().createColumnConst(input_rows_count, port); diff --git a/src/Functions/tests/CMakeLists.txt b/src/Functions/tests/CMakeLists.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/Functions/throwIf.cpp b/src/Functions/throwIf.cpp index 1b56cc0d188..d499f1f492f 100644 --- a/src/Functions/throwIf.cpp +++ b/src/Functions/throwIf.cpp @@ -37,6 +37,7 @@ public: } bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } size_t getNumberOfArguments() const override { return 0; diff --git a/src/Functions/tid.cpp b/src/Functions/tid.cpp index 404eff862b3..bf0f08e4777 100644 --- a/src/Functions/tid.cpp +++ b/src/Functions/tid.cpp @@ -21,6 +21,8 @@ namespace DataTypePtr getReturnTypeImpl(const DataTypes &) const override { return std::make_shared(); } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName &, const DataTypePtr &, size_t input_rows_count) const override { auto current_tid = getThreadId(); diff --git a/src/Functions/timeSlots.cpp b/src/Functions/timeSlots.cpp index b64d2687b05..34af410befa 100644 --- a/src/Functions/timeSlots.cpp +++ b/src/Functions/timeSlots.cpp @@ -117,6 +117,7 @@ public: } bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } size_t getNumberOfArguments() const override { return 0; } bool useDefaultImplementationForConstants() const override { return true; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {2}; } diff --git a/src/Functions/timezone.cpp b/src/Functions/timezone.cpp index dda30352750..3b2319c22ca 100644 --- a/src/Functions/timezone.cpp +++ b/src/Functions/timezone.cpp @@ -44,6 +44,8 @@ public: bool isDeterministicInScopeOfQuery() const override { return true; } bool isSuitableForConstantFolding() const override { return !is_distributed; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName &, const DataTypePtr &, size_t input_rows_count) const override { return DataTypeString().createColumnConst(input_rows_count, DateLUT::instance().getTimeZone()); diff --git a/src/Functions/timezoneOf.cpp b/src/Functions/timezoneOf.cpp index 3dc72424a4f..f70d35c4602 100644 --- a/src/Functions/timezoneOf.cpp +++ b/src/Functions/timezoneOf.cpp @@ -32,6 +32,8 @@ public: size_t getNumberOfArguments() const override { return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes & types) const override { DataTypePtr type_no_nullable = removeNullable(types[0]); diff --git a/src/Functions/toColumnTypeName.cpp b/src/Functions/toColumnTypeName.cpp index d64fa12604e..95c35243567 100644 --- a/src/Functions/toColumnTypeName.cpp +++ b/src/Functions/toColumnTypeName.cpp @@ -26,6 +26,16 @@ public: bool useDefaultImplementationForNulls() const override { return false; } + bool isShortCircuit(ShortCircuitSettings & settings, size_t /*number_of_arguments*/) const override + { + settings.enable_lazy_execution_for_first_argument = true; + settings.enable_lazy_execution_for_common_descendants_of_arguments = true; + settings.force_enable_lazy_execution = true; + return true; + } + + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + size_t getNumberOfArguments() const override { return 1; diff --git a/src/Functions/toFixedString.h b/src/Functions/toFixedString.h index fe437a24303..129e3e0e8b2 100644 --- a/src/Functions/toFixedString.h +++ b/src/Functions/toFixedString.h @@ -42,6 +42,7 @@ public: size_t getNumberOfArguments() const override { return 2; } bool isInjective(const ColumnsWithTypeAndName &) const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { diff --git a/src/Functions/toJSONString.cpp b/src/Functions/toJSONString.cpp index 8e5e67219af..0ec13e019f7 100644 --- a/src/Functions/toJSONString.cpp +++ b/src/Functions/toJSONString.cpp @@ -26,6 +26,8 @@ namespace bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & /*result_type*/, size_t input_rows_count) const override { diff --git a/src/Functions/toLowCardinality.cpp b/src/Functions/toLowCardinality.cpp index 983e66d1007..b66f2ad90fd 100644 --- a/src/Functions/toLowCardinality.cpp +++ b/src/Functions/toLowCardinality.cpp @@ -23,6 +23,7 @@ public: bool useDefaultImplementationForNulls() const override { return false; } bool useDefaultImplementationForConstants() const override { return true; } bool useDefaultImplementationForLowCardinalityColumns() const override { return false; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/toModifiedJulianDay.cpp b/src/Functions/toModifiedJulianDay.cpp index a44979b52ff..ead2ca826d1 100644 --- a/src/Functions/toModifiedJulianDay.cpp +++ b/src/Functions/toModifiedJulianDay.cpp @@ -138,6 +138,8 @@ namespace DB return return_type; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + ExecutableFunctionPtr prepare(const ColumnsWithTypeAndName &) const override { return std::make_unique>(); diff --git a/src/Functions/toNullable.cpp b/src/Functions/toNullable.cpp index 5e383893476..b7fe831f4ff 100644 --- a/src/Functions/toNullable.cpp +++ b/src/Functions/toNullable.cpp @@ -29,6 +29,7 @@ public: size_t getNumberOfArguments() const override { return 1; } bool useDefaultImplementationForNulls() const override { return false; } bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { diff --git a/src/Functions/toStartOfInterval.cpp b/src/Functions/toStartOfInterval.cpp index ab87836de35..5d8d76975a0 100644 --- a/src/Functions/toStartOfInterval.cpp +++ b/src/Functions/toStartOfInterval.cpp @@ -222,6 +222,8 @@ public: bool isVariadic() const override { return true; } size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { diff --git a/src/Functions/toTimezone.cpp b/src/Functions/toTimezone.cpp index 4bb5ab47659..8205a62614e 100644 --- a/src/Functions/toTimezone.cpp +++ b/src/Functions/toTimezone.cpp @@ -45,6 +45,8 @@ public: String getName() const override { return "toTimezone"; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + const DataTypes & getArgumentTypes() const override { return argument_types; diff --git a/src/Functions/toTypeName.cpp b/src/Functions/toTypeName.cpp index 3c733fb3ea7..41567ac1ee3 100644 --- a/src/Functions/toTypeName.cpp +++ b/src/Functions/toTypeName.cpp @@ -1,5 +1,5 @@ -#include #include +#include #include #include @@ -30,6 +30,16 @@ public: bool useDefaultImplementationForNulls() const override { return false; } + bool isShortCircuit(ShortCircuitSettings & settings, size_t /*number_of_arguments*/) const override + { + settings.enable_lazy_execution_for_first_argument = false; + settings.enable_lazy_execution_for_common_descendants_of_arguments = true; + settings.force_enable_lazy_execution = true; + return true; + } + + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + bool useDefaultImplementationForLowCardinalityColumns() const override { return false; } size_t getNumberOfArguments() const override @@ -53,7 +63,6 @@ public: } ColumnNumbers getArgumentsThatDontImplyNullableReturnType(size_t /*number_of_arguments*/) const override { return {0}; } - }; } diff --git a/src/Functions/today.cpp b/src/Functions/today.cpp index 43be4c4582a..083ead622f7 100644 --- a/src/Functions/today.cpp +++ b/src/Functions/today.cpp @@ -54,6 +54,7 @@ public: bool isDeterministic() const override { return false; } bool isDeterministicInScopeOfQuery() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } private: DayNum day_value; diff --git a/src/Functions/transform.cpp b/src/Functions/transform.cpp index e93d6d089b6..cb9f0dfea74 100644 --- a/src/Functions/transform.cpp +++ b/src/Functions/transform.cpp @@ -66,6 +66,7 @@ public: } bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } size_t getNumberOfArguments() const override { return 0; } bool useDefaultImplementationForConstants() const override { return true; } ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1, 2}; } diff --git a/src/Functions/trap.cpp b/src/Functions/trap.cpp index d499885ae31..96951c10115 100644 --- a/src/Functions/trap.cpp +++ b/src/Functions/trap.cpp @@ -53,6 +53,8 @@ public: return 1; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { if (!isString(arguments[0])) diff --git a/src/Functions/tuple.cpp b/src/Functions/tuple.cpp index dda034ee911..8e8b18e335d 100644 --- a/src/Functions/tuple.cpp +++ b/src/Functions/tuple.cpp @@ -49,6 +49,8 @@ public: return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + bool useDefaultImplementationForNulls() const override { return false; } bool useDefaultImplementationForConstants() const override { return true; } diff --git a/src/Functions/tupleElement.cpp b/src/Functions/tupleElement.cpp index 97e2f70fccf..023dc266b43 100644 --- a/src/Functions/tupleElement.cpp +++ b/src/Functions/tupleElement.cpp @@ -55,6 +55,8 @@ public: return {1}; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { size_t count_arrays = 0; diff --git a/src/Functions/tupleHammingDistance.cpp b/src/Functions/tupleHammingDistance.cpp index 9d660e388cb..a8c6354b6be 100644 --- a/src/Functions/tupleHammingDistance.cpp +++ b/src/Functions/tupleHammingDistance.cpp @@ -34,6 +34,8 @@ public: bool useDefaultImplementationForConstants() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + Columns getTupleElements(const IColumn & column) const { if (const auto * const_column = typeid_cast(&column)) diff --git a/src/Functions/tupleToNameValuePairs.cpp b/src/Functions/tupleToNameValuePairs.cpp index c3e5f28037b..1d51b77bbee 100644 --- a/src/Functions/tupleToNameValuePairs.cpp +++ b/src/Functions/tupleToNameValuePairs.cpp @@ -50,6 +50,12 @@ public: return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override + { + return true; + } + + DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { // get the type of all the fields in the tuple diff --git a/src/Functions/uptime.cpp b/src/Functions/uptime.cpp index f0175031fc4..bb767101fea 100644 --- a/src/Functions/uptime.cpp +++ b/src/Functions/uptime.cpp @@ -41,6 +41,8 @@ public: bool isDeterministicInScopeOfQuery() const override { return true; } bool isSuitableForConstantFolding() const override { return !is_distributed; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName &, const DataTypePtr &, size_t input_rows_count) const override { return DataTypeUInt32().createColumnConst(input_rows_count, static_cast(uptime)); diff --git a/src/Functions/validateNestedArraySizes.cpp b/src/Functions/validateNestedArraySizes.cpp index 1d96f988690..42b0e401fa0 100644 --- a/src/Functions/validateNestedArraySizes.cpp +++ b/src/Functions/validateNestedArraySizes.cpp @@ -28,6 +28,7 @@ public: String getName() const override { return name; } bool isVariadic() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } size_t getNumberOfArguments() const override { return 0; } bool useDefaultImplementationForConstants() const override { return true; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override; diff --git a/src/Functions/version.cpp b/src/Functions/version.cpp index 5a31bd073d4..81e40655eef 100644 --- a/src/Functions/version.cpp +++ b/src/Functions/version.cpp @@ -34,6 +34,7 @@ public: bool isDeterministic() const override { return false; } bool isDeterministicInScopeOfQuery() const override { return true; } bool isSuitableForConstantFolding() const override { return !is_distributed; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } size_t getNumberOfArguments() const override { diff --git a/src/Functions/visibleWidth.cpp b/src/Functions/visibleWidth.cpp index 6e96a4844ce..4e09aeb399a 100644 --- a/src/Functions/visibleWidth.cpp +++ b/src/Functions/visibleWidth.cpp @@ -27,6 +27,8 @@ public: bool useDefaultImplementationForNulls() const override { return false; } ColumnNumbers getArgumentsThatDontImplyNullableReturnType(size_t /*number_of_arguments*/) const override { return {0}; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + /// Get the name of the function. String getName() const override { diff --git a/src/Functions/wkt.cpp b/src/Functions/wkt.cpp index b5567a19e89..8fbb8f59d33 100644 --- a/src/Functions/wkt.cpp +++ b/src/Functions/wkt.cpp @@ -36,6 +36,8 @@ public: return std::make_shared(); } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & /*result_type*/, size_t input_rows_count) const override { auto res_column = ColumnString::create(); diff --git a/src/Functions/ya.make b/src/Functions/ya.make index 2b9b3d94313..5721505b398 100644 --- a/src/Functions/ya.make +++ b/src/Functions/ya.make @@ -39,6 +39,8 @@ PEERDIR( SRCS( CRC.cpp + CastOverloadResolver.cpp + DateOrDateTimeFunctionsConvertion.cpp FunctionChar.cpp FunctionFQDN.cpp FunctionFactory.cpp @@ -312,6 +314,7 @@ SRCS( hasToken.cpp hasTokenCaseInsensitive.cpp hostName.cpp + hyperscanRegexpChecker.cpp hypot.cpp identity.cpp if.cpp @@ -564,6 +567,7 @@ SRCS( tuple.cpp tupleElement.cpp tupleHammingDistance.cpp + tupleToNameValuePairs.cpp upper.cpp upperUTF8.cpp uptime.cpp diff --git a/src/Functions/yesterday.cpp b/src/Functions/yesterday.cpp index 737552e192e..96941c5cf8c 100644 --- a/src/Functions/yesterday.cpp +++ b/src/Functions/yesterday.cpp @@ -52,6 +52,7 @@ public: bool isDeterministic() const override { return false; } bool isDeterministicInScopeOfQuery() const override { return true; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } private: DayNum day_value; diff --git a/src/IO/Bzip2ReadBuffer.cpp b/src/IO/Bzip2ReadBuffer.cpp index e264ce75444..99798bca325 100644 --- a/src/IO/Bzip2ReadBuffer.cpp +++ b/src/IO/Bzip2ReadBuffer.cpp @@ -4,7 +4,7 @@ #if USE_BZIP2 # include -# include +# include // Y_IGNORE namespace DB { diff --git a/src/IO/Bzip2WriteBuffer.cpp b/src/IO/Bzip2WriteBuffer.cpp index 41cb972966c..39c5356b792 100644 --- a/src/IO/Bzip2WriteBuffer.cpp +++ b/src/IO/Bzip2WriteBuffer.cpp @@ -4,7 +4,7 @@ #if USE_BROTLI # include -# include +# include // Y_IGNORE #include diff --git a/src/IO/ConcatReadBuffer.h b/src/IO/ConcatReadBuffer.h index c416b0fd892..943d1fb3252 100644 --- a/src/IO/ConcatReadBuffer.h +++ b/src/IO/ConcatReadBuffer.h @@ -17,6 +17,7 @@ public: protected: ReadBuffers buffers; + bool own_buffers = false; ReadBuffers::iterator current; bool nextImpl() override @@ -61,7 +62,34 @@ public: assert(!buffers.empty()); } - ConcatReadBuffer(ReadBuffer & buf1, ReadBuffer & buf2) : ConcatReadBuffer({&buf1, &buf2}) {} + ConcatReadBuffer(ReadBuffer & buf1, ReadBuffer & buf2) : ConcatReadBuffer(ReadBuffers{&buf1, &buf2}) {} + + ConcatReadBuffer(std::vector> buffers_) : ReadBuffer(nullptr, 0) + { + own_buffers = true; + buffers.reserve(buffers_.size()); + for (auto & buffer : buffers_) + buffers.emplace_back(buffer.release()); + current = buffers.begin(); + } + + ConcatReadBuffer(std::unique_ptr buf1, std::unique_ptr buf2) : ReadBuffer(nullptr, 0) + { + own_buffers = true; + buffers.reserve(2); + buffers.emplace_back(buf1.release()); + buffers.emplace_back(buf2.release()); + current = buffers.begin(); + } + + ~ConcatReadBuffer() override + { + if (own_buffers) + { + for (auto * buffer : buffers) + delete buffer; + } + } }; } diff --git a/src/IO/ReadBufferFromFileDescriptor.cpp b/src/IO/ReadBufferFromFileDescriptor.cpp index fdb538d4a49..e60ec335ca1 100644 --- a/src/IO/ReadBufferFromFileDescriptor.cpp +++ b/src/IO/ReadBufferFromFileDescriptor.cpp @@ -12,6 +12,7 @@ #include #include #include +#include namespace ProfileEvents diff --git a/src/IO/ReadBufferFromPocoSocket.cpp b/src/IO/ReadBufferFromPocoSocket.cpp index 5e8e41d0c3e..50e0fad0265 100644 --- a/src/IO/ReadBufferFromPocoSocket.cpp +++ b/src/IO/ReadBufferFromPocoSocket.cpp @@ -1,7 +1,6 @@ #include #include -#include #include #include #include diff --git a/src/IO/ReadBufferFromS3.cpp b/src/IO/ReadBufferFromS3.cpp index aa241322edf..8f8a1c515ce 100644 --- a/src/IO/ReadBufferFromS3.cpp +++ b/src/IO/ReadBufferFromS3.cpp @@ -43,7 +43,6 @@ ReadBufferFromS3::ReadBufferFromS3( bool ReadBufferFromS3::nextImpl() { - Stopwatch watch; bool next_result = false; if (impl) @@ -62,19 +61,27 @@ bool ReadBufferFromS3::nextImpl() auto sleep_time_with_backoff_milliseconds = std::chrono::milliseconds(100); for (size_t attempt = 0; (attempt < max_single_read_retries) && !next_result; ++attempt) { + Stopwatch watch; try { /// Try to read a next portion of data. next_result = impl->next(); + watch.stop(); + ProfileEvents::increment(ProfileEvents::S3ReadMicroseconds, watch.elapsedMicroseconds()); break; } catch (const Exception & e) { + watch.stop(); + ProfileEvents::increment(ProfileEvents::S3ReadMicroseconds, watch.elapsedMicroseconds()); ProfileEvents::increment(ProfileEvents::S3ReadRequestsErrors, 1); LOG_INFO(log, "Caught exception while reading S3 object. Bucket: {}, Key: {}, Offset: {}, Attempt: {}, Message: {}", bucket, key, getPosition(), attempt, e.message()); + if (attempt + 1 == max_single_read_retries) + throw; + /// Pause before next attempt. std::this_thread::sleep_for(sleep_time_with_backoff_milliseconds); sleep_time_with_backoff_milliseconds *= 2; @@ -86,9 +93,6 @@ bool ReadBufferFromS3::nextImpl() } } - watch.stop(); - ProfileEvents::increment(ProfileEvents::S3ReadMicroseconds, watch.elapsedMicroseconds()); - if (!next_result) return false; diff --git a/src/IO/S3Common.cpp b/src/IO/S3Common.cpp index 74c328661c4..ff06d6777e7 100644 --- a/src/IO/S3Common.cpp +++ b/src/IO/S3Common.cpp @@ -2,9 +2,10 @@ #if USE_AWS_S3 +# include + # include -# include # include # include @@ -617,7 +618,7 @@ namespace S3 storage_name = S3; if (uri.getHost().empty()) - throw Exception(ErrorCodes::BAD_ARGUMENTS, "Host is empty in S3 URI: {}", uri.toString()); + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Host is empty in S3 URI."); String name; String endpoint_authority_from_uri; @@ -626,12 +627,7 @@ namespace S3 { is_virtual_hosted_style = true; endpoint = uri.getScheme() + "://" + name + endpoint_authority_from_uri; - - /// S3 specification requires at least 3 and at most 63 characters in bucket name. - /// https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-s3-bucket-naming-requirements.html - if (bucket.length() < 3 || bucket.length() > 63) - throw Exception(ErrorCodes::BAD_ARGUMENTS, - "Bucket name length is out of bounds in virtual hosted style S3 URI: {} ({})", quoteString(bucket), uri.toString()); + validateBucket(bucket, uri); if (!uri.getPath().empty()) { @@ -642,7 +638,7 @@ namespace S3 boost::to_upper(name); if (name != S3 && name != COS) { - throw Exception(ErrorCodes::BAD_ARGUMENTS, "Object storage system name is unrecognized in virtual hosted style S3 URI: {} ({})", quoteString(name), uri.toString()); + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Object storage system name is unrecognized in virtual hosted style S3 URI: {}", quoteString(name)); } if (name == S3) { @@ -657,14 +653,19 @@ namespace S3 { is_virtual_hosted_style = false; endpoint = uri.getScheme() + "://" + uri.getAuthority(); - - /// S3 specification requires at least 3 and at most 63 characters in bucket name. - /// https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-s3-bucket-naming-requirements.html - if (bucket.length() < 3 || bucket.length() > 63) - throw Exception(ErrorCodes::BAD_ARGUMENTS, "Bucket name length is out of bounds in virtual hosted style S3 URI: {} ({})", quoteString(bucket), uri.toString()); + validateBucket(bucket, uri); } else - throw Exception(ErrorCodes::BAD_ARGUMENTS, "Bucket or key name are invalid in S3 URI: {}", uri.toString()); + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Bucket or key name are invalid in S3 URI."); + } + + void URI::validateBucket(const String & bucket, const Poco::URI & uri) + { + /// S3 specification requires at least 3 and at most 63 characters in bucket name. + /// https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-s3-bucket-naming-requirements.html + if (bucket.length() < 3 || bucket.length() > 63) + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Bucket name length is out of bounds in virtual hosted style S3 URI: {}{}", + quoteString(bucket), !uri.empty() ? " (" + uri.toString() + ")" : ""); } } diff --git a/src/IO/S3Common.h b/src/IO/S3Common.h index 886230e36c6..20ec982138a 100644 --- a/src/IO/S3Common.h +++ b/src/IO/S3Common.h @@ -74,6 +74,8 @@ struct URI bool is_virtual_hosted_style; explicit URI(const Poco::URI & uri_); + + static void validateBucket(const String & bucket, const Poco::URI & uri); }; } diff --git a/src/IO/WriteHelpers.h b/src/IO/WriteHelpers.h index 556adbe2d6f..6a0050b061f 100644 --- a/src/IO/WriteHelpers.h +++ b/src/IO/WriteHelpers.h @@ -901,34 +901,67 @@ inline void writeText(const LocalDateTime & x, WriteBuffer & buf) { writeDateTim inline void writeText(const UUID & x, WriteBuffer & buf) { writeUUIDText(x, buf); } template -String decimalFractional(const T & x, UInt32 scale) +void writeDecimalFractional(const T & x, UInt32 scale, WriteBuffer & ostr, bool trailing_zeros) { + /// If it's big integer, but the number of digits is small, + /// use the implementation for smaller integers for more efficient arithmetic. + if constexpr (std::is_same_v) { if (x <= std::numeric_limits::max()) - return decimalFractional(static_cast(x), scale); + { + writeDecimalFractional(static_cast(x), scale, ostr, trailing_zeros); + return; + } else if (x <= std::numeric_limits::max()) - return decimalFractional(static_cast(x), scale); + { + writeDecimalFractional(static_cast(x), scale, ostr, trailing_zeros); + return; + } else if (x <= std::numeric_limits::max()) - return decimalFractional(static_cast(x), scale); + { + writeDecimalFractional(static_cast(x), scale, ostr, trailing_zeros); + return; + } } else if constexpr (std::is_same_v) { if (x <= std::numeric_limits::max()) - return decimalFractional(static_cast(x), scale); + { + writeDecimalFractional(static_cast(x), scale, ostr, trailing_zeros); + return; + } else if (x <= std::numeric_limits::max()) - return decimalFractional(static_cast(x), scale); + { + writeDecimalFractional(static_cast(x), scale, ostr, trailing_zeros); + return; + } } - String str(scale, '0'); + constexpr size_t max_digits = std::numeric_limits::digits10; + assert(scale <= max_digits); + char buf[max_digits]; + memset(buf, '0', scale); + T value = x; - for (Int32 pos = scale - 1; pos >= 0; --pos, value /= 10) - str[pos] += static_cast(value % 10); - return str; + Int32 last_nonzero_pos = 0; + for (Int32 pos = scale - 1; pos >= 0; --pos) + { + auto remainder = value % 10; + value /= 10; + + if (remainder != 0 && last_nonzero_pos == 0) + last_nonzero_pos = pos; + + buf[pos] += static_cast(remainder); + } + + writeChar('.', ostr); + ostr.write(buf, trailing_zeros ? scale : last_nonzero_pos + 1); } template -void writeText(Decimal x, UInt32 scale, WriteBuffer & ostr) +void writeText(Decimal x, UInt32 scale, WriteBuffer & ostr, bool trailing_zeros) { T part = DecimalUtils::getWholePart(x, scale); @@ -941,10 +974,9 @@ void writeText(Decimal x, UInt32 scale, WriteBuffer & ostr) if (scale) { - writeChar('.', ostr); part = DecimalUtils::getFractionalPart(x, scale); - String fractional = decimalFractional(part, scale); - ostr.write(fractional.data(), scale); + if (part || trailing_zeros) + writeDecimalFractional(part, scale, ostr, trailing_zeros); } } diff --git a/src/IO/ZlibInflatingReadBuffer.cpp b/src/IO/ZlibInflatingReadBuffer.cpp index bea83c74e21..472399dea3d 100644 --- a/src/IO/ZlibInflatingReadBuffer.cpp +++ b/src/IO/ZlibInflatingReadBuffer.cpp @@ -38,7 +38,7 @@ ZlibInflatingReadBuffer::ZlibInflatingReadBuffer( #pragma GCC diagnostic pop if (rc != Z_OK) - throw Exception(std::string("inflateInit2 failed: ") + zError(rc) + "; zlib version: " + ZLIB_VERSION, ErrorCodes::ZLIB_INFLATE_FAILED); + throw Exception(ErrorCodes::ZLIB_INFLATE_FAILED, "inflateInit2 failed: {}; zlib version: {}.", zError(rc), ZLIB_VERSION); } ZlibInflatingReadBuffer::~ZlibInflatingReadBuffer() @@ -48,41 +48,60 @@ ZlibInflatingReadBuffer::~ZlibInflatingReadBuffer() bool ZlibInflatingReadBuffer::nextImpl() { - if (eof) - return false; - - if (!zstr.avail_in) + /// Need do-while loop to prevent situation, when + /// eof was not reached, but working buffer became empty (when nothing was decompressed in current iteration) + /// (this happens with compression algorithms, same idea is implemented in ZstdInflatingReadBuffer) + do { - in->nextIfAtEnd(); - zstr.next_in = reinterpret_cast(in->position()); - zstr.avail_in = in->buffer().end() - in->position(); - } - zstr.next_out = reinterpret_cast(internal_buffer.begin()); - zstr.avail_out = internal_buffer.size(); + /// if we already found eof, we shouldn't do anything + if (eof) + return false; - int rc = inflate(&zstr, Z_NO_FLUSH); - - in->position() = in->buffer().end() - zstr.avail_in; - working_buffer.resize(internal_buffer.size() - zstr.avail_out); - - if (rc == Z_STREAM_END) - { - if (in->eof()) + /// if there is no available bytes in zstr, move ptr to next available data + if (!zstr.avail_in) { - eof = true; - return !working_buffer.empty(); + in->nextIfAtEnd(); + zstr.next_in = reinterpret_cast(in->position()); + zstr.avail_in = in->buffer().end() - in->position(); } - else - { - rc = inflateReset(&zstr); - if (rc != Z_OK) - throw Exception(std::string("inflateReset failed: ") + zError(rc), ErrorCodes::ZLIB_INFLATE_FAILED); - return true; - } - } - if (rc != Z_OK) - throw Exception(std::string("inflate failed: ") + zError(rc), ErrorCodes::ZLIB_INFLATE_FAILED); + /// init output bytes (place, where decompressed data will be) + zstr.next_out = reinterpret_cast(internal_buffer.begin()); + zstr.avail_out = internal_buffer.size(); + int rc = inflate(&zstr, Z_NO_FLUSH); + + /// move in stream on place, where reading stopped + in->position() = in->buffer().end() - zstr.avail_in; + /// change size of working buffer (it's size equal to internal_buffer size without unused uncompressed values) + working_buffer.resize(internal_buffer.size() - zstr.avail_out); + + /// If end was reached, it can be end of file or end of part (for example, chunk) + if (rc == Z_STREAM_END) + { + /// if it is end of file, remember this and return + /// * true if we can work with working buffer (we still have something to read, so next must return true) + /// * false if there is no data in working buffer + if (in->eof()) + { + eof = true; + return !working_buffer.empty(); + } + /// If it is not end of file, we need to reset zstr and return true, because we still have some data to read + else + { + rc = inflateReset(&zstr); + if (rc != Z_OK) + throw Exception(ErrorCodes::ZLIB_INFLATE_FAILED, "inflateReset failed: {}", zError(rc)); + return true; + } + } + /// If it is not end and not OK, something went wrong, throw exception + if (rc != Z_OK) + throw Exception(ErrorCodes::ZLIB_INFLATE_FAILED, "inflateReset failed: {}", zError(rc)); + } + while (working_buffer.empty()); + + /// if code reach this section, working buffer is not empty, so we have some data to process return true; } diff --git a/src/Interpreters/ActionsDAG.cpp b/src/Interpreters/ActionsDAG.cpp index 63b0345b372..fc8f5801ba2 100644 --- a/src/Interpreters/ActionsDAG.cpp +++ b/src/Interpreters/ActionsDAG.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -893,9 +894,9 @@ ActionsDAGPtr ActionsDAG::clone() const } #if USE_EMBEDDED_COMPILER -void ActionsDAG::compileExpressions(size_t min_count_to_compile_expression) +void ActionsDAG::compileExpressions(size_t min_count_to_compile_expression, const std::unordered_set & lazy_executed_nodes) { - compileFunctions(min_count_to_compile_expression); + compileFunctions(min_count_to_compile_expression, lazy_executed_nodes); removeUnusedActions(); } #endif @@ -1069,8 +1070,10 @@ ActionsDAGPtr ActionsDAG::makeConvertingActions( if (ignore_constant_values && res_const) src_node = dst_node = &actions_dag->addColumn(res_elem); else - throw Exception("Cannot find column " + backQuote(res_elem.name) + " in source stream", - ErrorCodes::THERE_IS_NO_COLUMN); + throw Exception(ErrorCodes::THERE_IS_NO_COLUMN, + "Cannot find column `{}` in source stream, there are only columns: [{}]", + res_elem.name, Block(source).dumpNames()); + } else { @@ -1110,8 +1113,8 @@ ActionsDAGPtr ActionsDAG::makeConvertingActions( const auto * right_arg = &actions_dag->addColumn(std::move(column)); const auto * left_arg = dst_node; - FunctionCast::Diagnostic diagnostic = {dst_node->result_name, res_elem.name}; - FunctionOverloadResolverPtr func_builder_cast = CastOverloadResolver::createImpl(false, std::move(diagnostic)); + FunctionCastBase::Diagnostic diagnostic = {dst_node->result_name, res_elem.name}; + FunctionOverloadResolverPtr func_builder_cast = CastInternalOverloadResolver::createImpl(std::move(diagnostic)); NodeRawConstPtrs children = { left_arg, right_arg }; dst_node = &actions_dag->addFunction(func_builder_cast, std::move(children), {}); @@ -1876,7 +1879,7 @@ ActionsDAGPtr ActionsDAG::cloneActionsForFilterPushDown( predicate->children = {left_arg, right_arg}; auto arguments = prepareFunctionArguments(predicate->children); - FunctionOverloadResolverPtr func_builder_cast = CastOverloadResolver::createImpl(false); + FunctionOverloadResolverPtr func_builder_cast = CastInternalOverloadResolver::createImpl(); predicate->function_builder = func_builder_cast; predicate->function_base = predicate->function_builder->build(arguments); diff --git a/src/Interpreters/ActionsDAG.h b/src/Interpreters/ActionsDAG.h index bfb5b177ac7..d10218bc913 100644 --- a/src/Interpreters/ActionsDAG.h +++ b/src/Interpreters/ActionsDAG.h @@ -181,7 +181,7 @@ public: void assertDeterministic() const; /// Throw if not isDeterministic. #if USE_EMBEDDED_COMPILER - void compileExpressions(size_t min_count_to_compile_expression); + void compileExpressions(size_t min_count_to_compile_expression, const std::unordered_set & lazy_executed_nodes = {}); #endif ActionsDAGPtr clone() const; @@ -276,7 +276,7 @@ private: void removeUnusedActions(bool allow_remove_inputs = true); #if USE_EMBEDDED_COMPILER - void compileFunctions(size_t min_count_to_compile_expression); + void compileFunctions(size_t min_count_to_compile_expression, const std::unordered_set & lazy_executed_nodes = {}); #endif static ActionsDAGPtr cloneActionsForConjunction(NodeRawConstPtrs conjunction, const ColumnsWithTypeAndName & all_inputs); diff --git a/src/Interpreters/ActionsVisitor.cpp b/src/Interpreters/ActionsVisitor.cpp index 61e484ff6f1..9a27043160f 100644 --- a/src/Interpreters/ActionsVisitor.cpp +++ b/src/Interpreters/ActionsVisitor.cpp @@ -374,8 +374,8 @@ SetPtr makeExplicitSet( SetPtr set = std::make_shared(size_limits, create_ordered_set, context->getSettingsRef().transform_null_in); - set->setHeader(block.cloneEmpty()); - set->insertFromBlock(block); + set->setHeader(block.cloneEmpty().getColumnsWithTypeAndName()); + set->insertFromBlock(block.getColumnsWithTypeAndName()); set->finishInsert(); prepared_sets[set_key] = set; diff --git a/src/Interpreters/AsynchronousMetrics.cpp b/src/Interpreters/AsynchronousMetrics.cpp index 8efe959a623..fd02aa4abec 100644 --- a/src/Interpreters/AsynchronousMetrics.cpp +++ b/src/Interpreters/AsynchronousMetrics.cpp @@ -88,6 +88,20 @@ AsynchronousMetrics::AsynchronousMetrics( openFileIfExists("/proc/uptime", uptime); openFileIfExists("/proc/net/dev", net_dev); + openSensors(); + openBlockDevices(); + openEDAC(); + openSensorsChips(); +#endif +} + +#if defined(OS_LINUX) +void AsynchronousMetrics::openSensors() +{ + LOG_TRACE(log, "Scanning /sys/class/thermal"); + + thermal.clear(); + for (size_t thermal_device_index = 0;; ++thermal_device_index) { std::unique_ptr file = openFileIfExists(fmt::format("/sys/class/thermal/thermal_zone{}/temp", thermal_device_index)); @@ -101,6 +115,71 @@ AsynchronousMetrics::AsynchronousMetrics( } thermal.emplace_back(std::move(file)); } +} + +void AsynchronousMetrics::openBlockDevices() +{ + LOG_TRACE(log, "Scanning /sys/block"); + + if (!std::filesystem::exists("/sys/block")) + return; + + block_devices_rescan_delay.restart(); + + block_devs.clear(); + + for (const auto & device_dir : std::filesystem::directory_iterator("/sys/block")) + { + String device_name = device_dir.path().filename(); + + /// We are not interested in loopback devices. + if (device_name.starts_with("loop")) + continue; + + std::unique_ptr file = openFileIfExists(device_dir.path() / "stat"); + if (!file) + continue; + + block_devs[device_name] = std::move(file); + } +} + +void AsynchronousMetrics::openEDAC() +{ + LOG_TRACE(log, "Scanning /sys/devices/system/edac"); + + edac.clear(); + + for (size_t edac_index = 0;; ++edac_index) + { + String edac_correctable_file = fmt::format("/sys/devices/system/edac/mc/mc{}/ce_count", edac_index); + String edac_uncorrectable_file = fmt::format("/sys/devices/system/edac/mc/mc{}/ue_count", edac_index); + + bool edac_correctable_file_exists = std::filesystem::exists(edac_correctable_file); + bool edac_uncorrectable_file_exists = std::filesystem::exists(edac_uncorrectable_file); + + if (!edac_correctable_file_exists && !edac_uncorrectable_file_exists) + { + if (edac_index == 0) + continue; + else + break; + } + + edac.emplace_back(); + + if (edac_correctable_file_exists) + edac.back().first = openFileIfExists(edac_correctable_file); + if (edac_uncorrectable_file_exists) + edac.back().second = openFileIfExists(edac_uncorrectable_file); + } +} + +void AsynchronousMetrics::openSensorsChips() +{ + LOG_TRACE(log, "Scanning /sys/class/hwmon"); + + hwmon_devices.clear(); for (size_t hwmon_index = 0;; ++hwmon_index) { @@ -150,61 +229,6 @@ AsynchronousMetrics::AsynchronousMetrics( hwmon_devices[hwmon_name][sensor_name] = std::move(file); } } - - for (size_t edac_index = 0;; ++edac_index) - { - String edac_correctable_file = fmt::format("/sys/devices/system/edac/mc/mc{}/ce_count", edac_index); - String edac_uncorrectable_file = fmt::format("/sys/devices/system/edac/mc/mc{}/ue_count", edac_index); - - bool edac_correctable_file_exists = std::filesystem::exists(edac_correctable_file); - bool edac_uncorrectable_file_exists = std::filesystem::exists(edac_uncorrectable_file); - - if (!edac_correctable_file_exists && !edac_uncorrectable_file_exists) - { - if (edac_index == 0) - continue; - else - break; - } - - edac.emplace_back(); - - if (edac_correctable_file_exists) - edac.back().first = openFileIfExists(edac_correctable_file); - if (edac_uncorrectable_file_exists) - edac.back().second = openFileIfExists(edac_uncorrectable_file); - } - - openBlockDevices(); -#endif -} - -#if defined(OS_LINUX) -void AsynchronousMetrics::openBlockDevices() -{ - LOG_TRACE(log, "Scanning /sys/block"); - - if (!std::filesystem::exists("/sys/block")) - return; - - block_devices_rescan_delay.restart(); - - block_devs.clear(); - - for (const auto & device_dir : std::filesystem::directory_iterator("/sys/block")) - { - String device_name = device_dir.path().filename(); - - /// We are not interested in loopback devices. - if (device_name.starts_with("loop")) - continue; - - std::unique_ptr file = openFileIfExists(device_dir.path() / "stat"); - if (!file) - continue; - - block_devs[device_name] = std::move(file); - } } #endif @@ -967,6 +991,8 @@ void AsynchronousMetrics::update(std::chrono::system_clock::time_point update_ti } catch (...) { + tryLogCurrentException(__PRETTY_FUNCTION__); + /// Try to reopen block devices in case of error /// (i.e. ENOENT means that some disk had been replaced, and it may apperas with a new name) try @@ -977,7 +1003,6 @@ void AsynchronousMetrics::update(std::chrono::system_clock::time_point update_ti { tryLogCurrentException(__PRETTY_FUNCTION__); } - tryLogCurrentException(__PRETTY_FUNCTION__); } if (net_dev) @@ -1066,9 +1091,9 @@ void AsynchronousMetrics::update(std::chrono::system_clock::time_point update_ti } } - for (size_t i = 0, size = thermal.size(); i < size; ++i) + try { - try + for (size_t i = 0, size = thermal.size(); i < size; ++i) { ReadBufferFromFilePRead & in = *thermal[i]; @@ -1077,15 +1102,25 @@ void AsynchronousMetrics::update(std::chrono::system_clock::time_point update_ti readText(temperature, in); new_values[fmt::format("Temperature{}", i)] = temperature * 0.001; } + } + catch (...) + { + tryLogCurrentException(__PRETTY_FUNCTION__); + + /// Files maybe re-created on module load/unload + try + { + openSensors(); + } catch (...) { tryLogCurrentException(__PRETTY_FUNCTION__); } } - for (const auto & [hwmon_name, sensors] : hwmon_devices) + try { - try + for (const auto & [hwmon_name, sensors] : hwmon_devices) { for (const auto & [sensor_name, sensor_file] : sensors) { @@ -1106,19 +1141,32 @@ void AsynchronousMetrics::update(std::chrono::system_clock::time_point update_ti new_values[fmt::format("Temperature_{}_{}", hwmon_name, sensor_name)] = temperature * 0.001; } } + } + catch (...) + { + tryLogCurrentException(__PRETTY_FUNCTION__); + + /// Files can be re-created on: + /// - module load/unload + /// - suspend/resume cycle + /// So file descriptors should be reopened. + try + { + openSensorsChips(); + } catch (...) { tryLogCurrentException(__PRETTY_FUNCTION__); } } - for (size_t i = 0, size = edac.size(); i < size; ++i) + try { - /// NOTE maybe we need to take difference with previous values. - /// But these metrics should be exceptionally rare, so it's ok to keep them accumulated. - - try + for (size_t i = 0, size = edac.size(); i < size; ++i) { + /// NOTE maybe we need to take difference with previous values. + /// But these metrics should be exceptionally rare, so it's ok to keep them accumulated. + if (edac[i].first) { ReadBufferFromFilePRead & in = *edac[i].first; @@ -1137,6 +1185,16 @@ void AsynchronousMetrics::update(std::chrono::system_clock::time_point update_ti new_values[fmt::format("EDAC{}_Uncorrectable", i)] = errors; } } + } + catch (...) + { + tryLogCurrentException(__PRETTY_FUNCTION__); + + /// EDAC files can be re-created on module load/unload + try + { + openEDAC(); + } catch (...) { tryLogCurrentException(__PRETTY_FUNCTION__); diff --git a/src/Interpreters/AsynchronousMetrics.h b/src/Interpreters/AsynchronousMetrics.h index c8677ac3ced..93e77b6bde8 100644 --- a/src/Interpreters/AsynchronousMetrics.h +++ b/src/Interpreters/AsynchronousMetrics.h @@ -183,7 +183,10 @@ private: Stopwatch block_devices_rescan_delay; + void openSensors(); void openBlockDevices(); + void openSensorsChips(); + void openEDAC(); #endif std::unique_ptr thread; diff --git a/src/Interpreters/ClientInfo.h b/src/Interpreters/ClientInfo.h index 7c169e6ebb5..71570778645 100644 --- a/src/Interpreters/ClientInfo.h +++ b/src/Interpreters/ClientInfo.h @@ -28,6 +28,8 @@ public: GRPC = 3, MYSQL = 4, POSTGRESQL = 5, + LOCAL = 6, + TCP_INTERSERVER = 7, }; enum class HTTPMethod : uint8_t diff --git a/src/Interpreters/Context.cpp b/src/Interpreters/Context.cpp index bd15af76db0..d984a350c80 100644 --- a/src/Interpreters/Context.cpp +++ b/src/Interpreters/Context.cpp @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #include #include @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -59,6 +60,7 @@ #include #include #include +#include #include #include #include @@ -100,7 +102,6 @@ namespace CurrentMetrics extern const Metric BackgroundMessageBrokerSchedulePoolTask; } - namespace DB { @@ -115,189 +116,11 @@ namespace ErrorCodes extern const int THERE_IS_NO_QUERY; extern const int NO_ELEMENTS_IN_CONFIG; extern const int TABLE_SIZE_EXCEEDS_MAX_DROP_SIZE_LIMIT; - extern const int SESSION_NOT_FOUND; - extern const int SESSION_IS_LOCKED; extern const int LOGICAL_ERROR; extern const int NOT_IMPLEMENTED; } -class NamedSessions -{ -public: - using Key = NamedSessionKey; - - ~NamedSessions() - { - try - { - { - std::lock_guard lock{mutex}; - quit = true; - } - - cond.notify_one(); - thread.join(); - } - catch (...) - { - tryLogCurrentException(__PRETTY_FUNCTION__); - } - } - - /// Find existing session or create a new. - std::shared_ptr acquireSession( - const String & session_id, - ContextMutablePtr context, - std::chrono::steady_clock::duration timeout, - bool throw_if_not_found) - { - std::unique_lock lock(mutex); - - auto & user_name = context->client_info.current_user; - - if (user_name.empty()) - throw Exception("Empty user name.", ErrorCodes::LOGICAL_ERROR); - - Key key(user_name, session_id); - - auto it = sessions.find(key); - if (it == sessions.end()) - { - if (throw_if_not_found) - throw Exception("Session not found.", ErrorCodes::SESSION_NOT_FOUND); - - /// Create a new session from current context. - it = sessions.insert(std::make_pair(key, std::make_shared(key, context, timeout, *this))).first; - } - else if (it->second->key.first != context->client_info.current_user) - { - throw Exception("Session belongs to a different user", ErrorCodes::SESSION_IS_LOCKED); - } - - /// Use existing session. - const auto & session = it->second; - - if (!session.unique()) - throw Exception("Session is locked by a concurrent client.", ErrorCodes::SESSION_IS_LOCKED); - - session->context->client_info = context->client_info; - - return session; - } - - void releaseSession(NamedSession & session) - { - std::unique_lock lock(mutex); - scheduleCloseSession(session, lock); - } - -private: - class SessionKeyHash - { - public: - size_t operator()(const Key & key) const - { - SipHash hash; - hash.update(key.first); - hash.update(key.second); - return hash.get64(); - } - }; - - /// TODO it's very complicated. Make simple std::map with time_t or boost::multi_index. - using Container = std::unordered_map, SessionKeyHash>; - using CloseTimes = std::deque>; - Container sessions; - CloseTimes close_times; - std::chrono::steady_clock::duration close_interval = std::chrono::seconds(1); - std::chrono::steady_clock::time_point close_cycle_time = std::chrono::steady_clock::now(); - UInt64 close_cycle = 0; - - void scheduleCloseSession(NamedSession & session, std::unique_lock &) - { - /// Push it on a queue of sessions to close, on a position corresponding to the timeout. - /// (timeout is measured from current moment of time) - - const UInt64 close_index = session.timeout / close_interval + 1; - const auto new_close_cycle = close_cycle + close_index; - - if (session.close_cycle != new_close_cycle) - { - session.close_cycle = new_close_cycle; - if (close_times.size() < close_index + 1) - close_times.resize(close_index + 1); - close_times[close_index].emplace_back(session.key); - } - } - - void cleanThread() - { - setThreadName("SessionCleaner"); - std::unique_lock lock{mutex}; - - while (true) - { - auto interval = closeSessions(lock); - - if (cond.wait_for(lock, interval, [this]() -> bool { return quit; })) - break; - } - } - - /// Close sessions, that has been expired. Returns how long to wait for next session to be expired, if no new sessions will be added. - std::chrono::steady_clock::duration closeSessions(std::unique_lock & lock) - { - const auto now = std::chrono::steady_clock::now(); - - /// The time to close the next session did not come - if (now < close_cycle_time) - return close_cycle_time - now; /// Will sleep until it comes. - - const auto current_cycle = close_cycle; - - ++close_cycle; - close_cycle_time = now + close_interval; - - if (close_times.empty()) - return close_interval; - - auto & sessions_to_close = close_times.front(); - - for (const auto & key : sessions_to_close) - { - const auto session = sessions.find(key); - - if (session != sessions.end() && session->second->close_cycle <= current_cycle) - { - if (!session->second.unique()) - { - /// Skip but move it to close on the next cycle. - session->second->timeout = std::chrono::steady_clock::duration{0}; - scheduleCloseSession(*session->second, lock); - } - else - sessions.erase(session); - } - } - - close_times.pop_front(); - return close_interval; - } - - std::mutex mutex; - std::condition_variable cond; - std::atomic quit{false}; - ThreadFromGlobalPool thread{&NamedSessions::cleanThread, this}; -}; - - -void NamedSession::release() -{ - parent.releaseSession(*this); -} - - /** Set of known objects (environment), that could be used in query. * Shared (global) part. Order of members (especially, order of destruction) is very important. */ @@ -323,7 +146,7 @@ struct ContextSharedPart #if USE_NURAFT mutable std::mutex keeper_storage_dispatcher_mutex; - mutable std::shared_ptr keeper_storage_dispatcher; + mutable std::shared_ptr keeper_storage_dispatcher; #endif mutable std::mutex auxiliary_zookeepers_mutex; mutable std::map auxiliary_zookeepers; /// Map for auxiliary ZooKeeper clients. @@ -343,6 +166,8 @@ struct ContextSharedPart String tmp_path; /// Path to the temporary files that occur when processing the request. mutable VolumePtr tmp_volume; /// Volume for the the temporary files that occur when processing the request. + mutable VolumePtr backups_volume; /// Volume for all the backups. + mutable std::optional embedded_dictionaries; /// Metrica's dictionaries. Have lazy initialization. mutable std::optional external_dictionaries_loader; mutable std::optional external_models_loader; @@ -359,7 +184,7 @@ struct ContextSharedPart String default_profile_name; /// Default profile name used for default values. String system_profile_name; /// Profile used by system processes String buffer_profile_name; /// Profile used by Buffer engine for flushing to the underlying - AccessControlManager access_control_manager; + std::unique_ptr access_control_manager; mutable UncompressedCachePtr uncompressed_cache; /// The cache of decompressed blocks. mutable MarkCachePtr mark_cache; /// Cache of marks in compressed files. mutable MMappedFileCachePtr mmap_cache; /// Cache of mmapped files to avoid frequent open/map/unmap/close and to reuse from several threads. @@ -399,7 +224,6 @@ struct ContextSharedPart RemoteHostFilter remote_host_filter; /// Allowed URL from config.xml std::optional trace_collector; /// Thread collecting traces from threads executing queries - std::optional named_sessions; /// Controls named HTTP sessions. /// Clusters for distributed tables /// Initialized on demand (on distributed storages initialization) since Settings should be initialized @@ -407,6 +231,8 @@ struct ContextSharedPart ConfigurationPtr clusters_config; /// Stores updated configs mutable std::mutex clusters_mutex; /// Guards clusters and clusters_config + std::map server_ports; + bool shutdown_called = false; Stopwatch uptime_watch; @@ -419,7 +245,7 @@ struct ContextSharedPart Context::ConfigReloadCallback config_reload_callback; ContextSharedPart() - : macros(std::make_unique()) + : access_control_manager(std::make_unique()), macros(std::make_unique()) { /// TODO: make it singleton (?) static std::atomic num_calls{0}; @@ -453,6 +279,8 @@ struct ContextSharedPart return; shutdown_called = true; + Session::shutdownNamedSessions(); + /** After system_logs have been shut down it is guaranteed that no system table gets created or written to. * Note that part changes at shutdown won't be logged to part log. */ @@ -498,6 +326,7 @@ struct ContextSharedPart distributed_schedule_pool.reset(); message_broker_schedule_pool.reset(); ddl_worker.reset(); + access_control_manager.reset(); /// Stop trace collector if any trace_collector.reset(); @@ -587,7 +416,6 @@ void Context::copyFrom(const ContextPtr & other) Context::~Context() = default; - InterserverIOHandler & Context::getInterserverIOHandler() { return shared->interserver_io_handler; } std::unique_lock Context::getLock() const @@ -604,21 +432,6 @@ const MergeList & Context::getMergeList() const { return shared->merge_list; } ReplicatedFetchList & Context::getReplicatedFetchList() { return shared->replicated_fetch_list; } const ReplicatedFetchList & Context::getReplicatedFetchList() const { return shared->replicated_fetch_list; } - -void Context::enableNamedSessions() -{ - shared->named_sessions.emplace(); -} - -std::shared_ptr -Context::acquireNamedSession(const String & session_id, std::chrono::steady_clock::duration timeout, bool session_check) -{ - if (!shared->named_sessions) - throw Exception("Support for named sessions is not enabled", ErrorCodes::NOT_IMPLEMENTED); - - return shared->named_sessions->acquireSession(session_id, shared_from_this(), timeout, session_check); -} - String Context::resolveDatabase(const String & database_name) const { String res = database_name.empty() ? getCurrentDatabase() : database_name; @@ -710,6 +523,35 @@ VolumePtr Context::setTemporaryStorage(const String & path, const String & polic return shared->tmp_volume; } +void Context::setBackupsVolume(const String & path, const String & policy_name) +{ + std::lock_guard lock(shared->storage_policies_mutex); + if (policy_name.empty()) + { + String path_with_separator = path; + if (!path_with_separator.ends_with('/')) + path_with_separator += '/'; + auto disk = std::make_shared("_backups_default", path_with_separator, 0); + shared->backups_volume = std::make_shared("_backups_default", disk, 0); + } + else + { + StoragePolicyPtr policy = getStoragePolicySelector(lock)->get(policy_name); + if (policy->getVolumes().size() != 1) + throw Exception("Policy " + policy_name + " is used for backups, such policy should have exactly one volume", + ErrorCodes::NO_ELEMENTS_IN_CONFIG); + shared->backups_volume = policy->getVolume(0); + } + + BackupFactory::instance().setBackupsVolume(shared->backups_volume); +} + +VolumePtr Context::getBackupsVolume() const +{ + std::lock_guard lock(shared->storage_policies_mutex); + return shared->backups_volume; +} + void Context::setFlagsPath(const String & path) { auto lock = getLock(); @@ -738,7 +580,7 @@ void Context::setConfig(const ConfigurationPtr & config) { auto lock = getLock(); shared->config = config; - shared->access_control_manager.setExternalAuthenticatorsConfig(*shared->config); + shared->access_control_manager->setExternalAuthenticatorsConfig(*shared->config); } const Poco::Util::AbstractConfiguration & Context::getConfigRef() const @@ -750,31 +592,31 @@ const Poco::Util::AbstractConfiguration & Context::getConfigRef() const AccessControlManager & Context::getAccessControlManager() { - return shared->access_control_manager; + return *shared->access_control_manager; } const AccessControlManager & Context::getAccessControlManager() const { - return shared->access_control_manager; + return *shared->access_control_manager; } void Context::setExternalAuthenticatorsConfig(const Poco::Util::AbstractConfiguration & config) { auto lock = getLock(); - shared->access_control_manager.setExternalAuthenticatorsConfig(config); + shared->access_control_manager->setExternalAuthenticatorsConfig(config); } std::unique_ptr Context::makeGSSAcceptorContext() const { auto lock = getLock(); - return std::make_unique(shared->access_control_manager.getExternalAuthenticators().getKerberosParams()); + return std::make_unique(shared->access_control_manager->getExternalAuthenticators().getKerberosParams()); } void Context::setUsersConfig(const ConfigurationPtr & config) { auto lock = getLock(); shared->users_config = config; - shared->access_control_manager.setUsersConfig(*shared->users_config); + shared->access_control_manager->setUsersConfig(*shared->users_config); } ConfigurationPtr Context::getUsersConfig() @@ -784,48 +626,24 @@ ConfigurationPtr Context::getUsersConfig() } -void Context::setUser(const Credentials & credentials, const Poco::Net::SocketAddress & address) +void Context::setUser(const UUID & user_id_) { auto lock = getLock(); - client_info.current_user = credentials.getUserName(); - client_info.current_address = address; + user_id = user_id_; -#if defined(ARCADIA_BUILD) - /// This is harmful field that is used only in foreign "Arcadia" build. - client_info.current_password.clear(); - if (const auto * basic_credentials = dynamic_cast(&credentials)) - client_info.current_password = basic_credentials->getPassword(); -#endif - - /// Find a user with such name and check the credentials. - auto new_user_id = getAccessControlManager().login(credentials, address.host()); - auto new_access = getAccessControlManager().getContextAccess( - new_user_id, /* current_roles = */ {}, /* use_default_roles = */ true, - settings, current_database, client_info); - - user_id = new_user_id; - access = std::move(new_access); + access = getAccessControlManager().getContextAccess( + user_id_, /* current_roles = */ {}, /* use_default_roles = */ true, settings, current_database, client_info); auto user = access->getUser(); current_roles = std::make_shared>(user->granted_roles.findGranted(user->default_roles)); - if (!user->default_database.empty()) - setCurrentDatabase(user->default_database); - auto default_profile_info = access->getDefaultProfileInfo(); settings_constraints_and_current_profiles = default_profile_info->getConstraintsAndProfileIDs(); applySettingsChanges(default_profile_info->settings); -} -void Context::setUser(const String & name, const String & password, const Poco::Net::SocketAddress & address) -{ - setUser(BasicCredentials(name, password), address); -} - -void Context::setUserWithoutCheckingPassword(const String & name, const Poco::Net::SocketAddress & address) -{ - setUser(AlwaysAllowCredentials(name), address); + if (!user->default_database.empty()) + setCurrentDatabase(user->default_database); } std::shared_ptr Context::getUser() const @@ -833,12 +651,6 @@ std::shared_ptr Context::getUser() const return getAccess()->getUser(); } -void Context::setQuotaKey(String quota_key_) -{ - auto lock = getLock(); - client_info.quota_key = std::move(quota_key_); -} - String Context::getUserName() const { return getAccess()->getUserName(); @@ -851,6 +663,13 @@ std::optional Context::getUserID() const } +void Context::setQuotaKey(String quota_key_) +{ + auto lock = getLock(); + client_info.quota_key = std::move(quota_key_); +} + + void Context::setCurrentRoles(const std::vector & current_roles_) { auto lock = getLock(); @@ -932,10 +751,13 @@ ASTPtr Context::getRowPolicyCondition(const String & database, const String & ta void Context::setInitialRowPolicy() { auto lock = getLock(); - auto initial_user_id = getAccessControlManager().find(client_info.initial_user); initial_row_policy = nullptr; - if (initial_user_id) - initial_row_policy = getAccessControlManager().getEnabledRowPolicies(*initial_user_id, {}); + if (client_info.initial_user == client_info.current_user) + return; + auto initial_user_id = getAccessControlManager().find(client_info.initial_user); + if (!initial_user_id) + return; + initial_row_policy = getAccessControlManager().getEnabledRowPolicies(*initial_user_id, {}); } @@ -1376,6 +1198,9 @@ void Context::setCurrentQueryId(const String & query_id) } client_info.current_query_id = query_id_to_set; + + if (client_info.query_kind == ClientInfo::QueryKind::INITIAL_QUERY) + client_info.initial_query_id = client_info.current_query_id; } void Context::killCurrentQuery() @@ -1824,7 +1649,7 @@ void Context::setSystemZooKeeperLogAfterInitializationIfNeeded() zk.second->setZooKeeperLog(shared->system_logs->zookeeper_log); } -void Context::initializeKeeperStorageDispatcher() const +void Context::initializeKeeperDispatcher() const { #if USE_NURAFT std::lock_guard lock(shared->keeper_storage_dispatcher_mutex); @@ -1835,14 +1660,14 @@ void Context::initializeKeeperStorageDispatcher() const const auto & config = getConfigRef(); if (config.has("keeper_server")) { - shared->keeper_storage_dispatcher = std::make_shared(); + shared->keeper_storage_dispatcher = std::make_shared(); shared->keeper_storage_dispatcher->initialize(config, getApplicationType() == ApplicationType::KEEPER); } #endif } #if USE_NURAFT -std::shared_ptr & Context::getKeeperStorageDispatcher() const +std::shared_ptr & Context::getKeeperDispatcher() const { std::lock_guard lock(shared->keeper_storage_dispatcher_mutex); if (!shared->keeper_storage_dispatcher) @@ -1852,7 +1677,7 @@ std::shared_ptr & Context::getKeeperStorageDispatcher() } #endif -void Context::shutdownKeeperStorageDispatcher() const +void Context::shutdownKeeperDispatcher() const { #if USE_NURAFT std::lock_guard lock(shared->keeper_storage_dispatcher_mutex); @@ -2007,13 +1832,27 @@ std::optional Context::getTCPPortSecure() const return {}; } +void Context::registerServerPort(String port_name, UInt16 port) +{ + shared->server_ports.emplace(std::move(port_name), port); +} + +UInt16 Context::getServerPort(const String & port_name) const +{ + auto it = shared->server_ports.find(port_name); + if (it == shared->server_ports.end()) + throw Exception(ErrorCodes::BAD_GET, "There is no port named {}", port_name); + else + return it->second; +} + std::shared_ptr Context::getCluster(const std::string & cluster_name) const { auto res = getClusters()->getCluster(cluster_name); if (res) return res; - - res = tryGetReplicatedDatabaseCluster(cluster_name); + if (!cluster_name.empty()) + res = tryGetReplicatedDatabaseCluster(cluster_name); if (res) return res; diff --git a/src/Interpreters/Context.h b/src/Interpreters/Context.h index d3a77e0039b..6af2c3c4d62 100644 --- a/src/Interpreters/Context.h +++ b/src/Interpreters/Context.h @@ -14,21 +14,16 @@ #include #include #include -#include #include #if !defined(ARCADIA_BUILD) # include "config_core.h" #endif -#include -#include -#include #include #include #include #include -#include namespace Poco::Net { class IPAddress; } @@ -67,6 +62,7 @@ class ProcessList; class QueryStatus; class Macros; struct Progress; +struct FileProgress; class Clusters; class QueryLog; class QueryThreadLog; @@ -106,7 +102,8 @@ class StoragePolicySelector; using StoragePolicySelectorPtr = std::shared_ptr; struct PartUUIDs; using PartUUIDsPtr = std::shared_ptr; -class KeeperStorageDispatcher; +class KeeperDispatcher; +class Session; class IOutputFormat; using OutputFormatPtr = std::shared_ptr; @@ -287,8 +284,6 @@ public: OpenTelemetryTraceContext query_trace_context; private: - friend class NamedSessions; - using SampleBlockCache = std::unordered_map; mutable SampleBlockCache sample_block_cache; @@ -345,6 +340,9 @@ public: VolumePtr setTemporaryStorage(const String & path, const String & policy_name = ""); + void setBackupsVolume(const String & path, const String & policy_name = ""); + VolumePtr getBackupsVolume() const; + using ConfigurationPtr = Poco::AutoPtr; /// Global application configuration settings. @@ -367,23 +365,17 @@ public: void setUsersConfig(const ConfigurationPtr & config); ConfigurationPtr getUsersConfig(); - /// Sets the current user, checks the credentials and that the specified host is allowed. - /// Must be called before getClientInfo() can be called. - void setUser(const Credentials & credentials, const Poco::Net::SocketAddress & address); - void setUser(const String & name, const String & password, const Poco::Net::SocketAddress & address); - - /// Sets the current user, *does not check the password/credentials and that the specified host is allowed*. - /// Must be called before getClientInfo. - /// - /// (Used only internally in cluster, if the secret matches) - void setUserWithoutCheckingPassword(const String & name, const Poco::Net::SocketAddress & address); - - void setQuotaKey(String quota_key_); + /// Sets the current user assuming that he/she is already authenticated. + /// WARNING: This function doesn't check password! + /// Normally you shouldn't call this function. Use the Session class to do authentication instead. + void setUser(const UUID & user_id_); UserPtr getUser() const; String getUserName() const; std::optional getUserID() const; + void setQuotaKey(String quota_key_); + void setCurrentRoles(const std::vector & current_roles_); void setCurrentRolesDefault(); boost::container::flat_set getCurrentRoles() const; @@ -591,11 +583,10 @@ public: std::optional getTCPPortSecure() const; - /// Allow to use named sessions. The thread will be run to cleanup sessions after timeout has expired. - /// The method must be called at the server startup. - void enableNamedSessions(); + /// Register server ports during server starting up. No lock is held. + void registerServerPort(String port_name, UInt16 port); - std::shared_ptr acquireNamedSession(const String & session_id, std::chrono::steady_clock::duration timeout, bool session_check); + UInt16 getServerPort(const String & port_name) const; /// For methods below you may need to acquire the context lock by yourself. @@ -656,10 +647,10 @@ public: std::shared_ptr getAuxiliaryZooKeeper(const String & name) const; #if USE_NURAFT - std::shared_ptr & getKeeperStorageDispatcher() const; + std::shared_ptr & getKeeperDispatcher() const; #endif - void initializeKeeperStorageDispatcher() const; - void shutdownKeeperStorageDispatcher() const; + void initializeKeeperDispatcher() const; + void shutdownKeeperDispatcher() const; /// Set auxiliary zookeepers configuration at server starting or configuration reloading. void reloadAuxiliaryZooKeepersConfigIfChanged(const ConfigurationPtr & config); @@ -852,32 +843,6 @@ private: StoragePolicySelectorPtr getStoragePolicySelector(std::lock_guard & lock) const; DiskSelectorPtr getDiskSelector(std::lock_guard & /* lock */) const; - - /// If the password is not set, the password will not be checked - void setUserImpl(const String & name, const std::optional & password, const Poco::Net::SocketAddress & address); -}; - - -class NamedSessions; - -/// User name and session identifier. Named sessions are local to users. -using NamedSessionKey = std::pair; - -/// Named sessions. The user could specify session identifier to reuse settings and temporary tables in subsequent requests. -struct NamedSession -{ - NamedSessionKey key; - UInt64 close_cycle = 0; - ContextMutablePtr context; - std::chrono::steady_clock::duration timeout; - NamedSessions & parent; - - NamedSession(NamedSessionKey key_, ContextPtr context_, std::chrono::steady_clock::duration timeout_, NamedSessions & parent_) - : key(key_), context(Context::createCopy(context_)), timeout(timeout_), parent(parent_) - { - } - - void release(); }; } diff --git a/src/Interpreters/ConvertStringsToEnumVisitor.cpp b/src/Interpreters/ConvertStringsToEnumVisitor.cpp index fa2e0b6613a..e483bc9b5b6 100644 --- a/src/Interpreters/ConvertStringsToEnumVisitor.cpp +++ b/src/Interpreters/ConvertStringsToEnumVisitor.cpp @@ -43,11 +43,11 @@ void changeIfArguments(ASTPtr & first, ASTPtr & second) String enum_string = makeStringsEnum(values); auto enum_literal = std::make_shared(enum_string); - auto first_cast = makeASTFunction("CAST"); + auto first_cast = makeASTFunction("_CAST"); first_cast->arguments->children.push_back(first); first_cast->arguments->children.push_back(enum_literal); - auto second_cast = makeASTFunction("CAST"); + auto second_cast = makeASTFunction("_CAST"); second_cast->arguments->children.push_back(second); second_cast->arguments->children.push_back(enum_literal); @@ -65,12 +65,12 @@ void changeTransformArguments(ASTPtr & array_to, ASTPtr & other) String enum_string = makeStringsEnum(values); - auto array_cast = makeASTFunction("CAST"); + auto array_cast = makeASTFunction("_CAST"); array_cast->arguments->children.push_back(array_to); array_cast->arguments->children.push_back(std::make_shared("Array(" + enum_string + ")")); array_to = array_cast; - auto other_cast = makeASTFunction("CAST"); + auto other_cast = makeASTFunction("_CAST"); other_cast->arguments->children.push_back(other); other_cast->arguments->children.push_back(std::make_shared(enum_string)); other = other_cast; @@ -183,4 +183,3 @@ void ConvertStringsToEnumMatcher::visit(ASTFunction & function_node, Data & data } } - diff --git a/src/Interpreters/DDLWorker.cpp b/src/Interpreters/DDLWorker.cpp index c00f62f5133..c2de6ecbaf1 100644 --- a/src/Interpreters/DDLWorker.cpp +++ b/src/Interpreters/DDLWorker.cpp @@ -634,7 +634,7 @@ void DDLWorker::processTask(DDLTaskBase & task, const ZooKeeperPtr & zookeeper) String dummy; if (zookeeper->tryGet(active_node_path, dummy, nullptr, eph_node_disappeared)) { - constexpr int timeout_ms = 30 * 1000; + constexpr int timeout_ms = 60 * 1000; if (!eph_node_disappeared->tryWait(timeout_ms)) throw Exception(ErrorCodes::LOGICAL_ERROR, "Ephemeral node {} still exists, " "probably it's owned by someone else", active_node_path); @@ -1175,7 +1175,6 @@ void DDLWorker::runMainThread() new_stat.numChildren, new_stat.pzxid); context->getZooKeeperLog()->flush(); - abort(); } } } diff --git a/src/Interpreters/ExecuteScalarSubqueriesVisitor.cpp b/src/Interpreters/ExecuteScalarSubqueriesVisitor.cpp index f46cbdd2465..2b858512b98 100644 --- a/src/Interpreters/ExecuteScalarSubqueriesVisitor.cpp +++ b/src/Interpreters/ExecuteScalarSubqueriesVisitor.cpp @@ -80,9 +80,13 @@ void ExecuteScalarSubqueriesMatcher::visit(const ASTSubquery & subquery, ASTPtr Block scalar; if (data.getContext()->hasQueryContext() && data.getContext()->getQueryContext()->hasScalar(scalar_query_hash_str)) + { scalar = data.getContext()->getQueryContext()->getScalar(scalar_query_hash_str); + } else if (data.scalars.count(scalar_query_hash_str)) + { scalar = data.scalars[scalar_query_hash_str]; + } else { auto subquery_context = Context::createCopy(data.getContext()); @@ -149,7 +153,8 @@ void ExecuteScalarSubqueriesMatcher::visit(const ASTSubquery & subquery, ASTPtr throw Exception("Scalar subquery returned more than one row", ErrorCodes::INCORRECT_RESULT_OF_SCALAR_SUBQUERY); Block tmp_block; - while (tmp_block.rows() == 0 && executor.pull(tmp_block)); + while (tmp_block.rows() == 0 && executor.pull(tmp_block)) + ; if (tmp_block.rows() != 0) throw Exception("Scalar subquery returned more than one row", ErrorCodes::INCORRECT_RESULT_OF_SCALAR_SUBQUERY); @@ -173,10 +178,10 @@ void ExecuteScalarSubqueriesMatcher::visit(const ASTSubquery & subquery, ASTPtr } else { - ColumnWithTypeAndName ctn; - ctn.type = std::make_shared(block.getDataTypes()); - ctn.column = ColumnTuple::create(block.getColumns()); - scalar.insert(ctn); + scalar.insert({ + ColumnTuple::create(block.getColumns()), + std::make_shared(block.getDataTypes()), + "tuple"}); } } diff --git a/src/Interpreters/ExpressionActions.cpp b/src/Interpreters/ExpressionActions.cpp index ef5c1f8e48f..f3c51487a05 100644 --- a/src/Interpreters/ExpressionActions.cpp +++ b/src/Interpreters/ExpressionActions.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -16,6 +17,8 @@ #include #include #include +#include + #if defined(MEMORY_SANITIZER) #include @@ -45,17 +48,22 @@ namespace ErrorCodes ExpressionActions::~ExpressionActions() = default; +static std::unordered_set processShortCircuitFunctions(const ActionsDAG & actions_dag, ShortCircuitFunctionEvaluation short_circuit_function_evaluation); + ExpressionActions::ExpressionActions(ActionsDAGPtr actions_dag_, const ExpressionActionsSettings & settings_) : settings(settings_) { actions_dag = actions_dag_->clone(); + /// It's important to determine lazy executed nodes before compiling expressions. + std::unordered_set lazy_executed_nodes = processShortCircuitFunctions(*actions_dag, settings.short_circuit_function_evaluation); + #if USE_EMBEDDED_COMPILER if (settings.can_compile_expressions && settings.compile_expressions == CompileExpressions::yes) - actions_dag->compileExpressions(settings.min_count_to_compile_expression); + actions_dag->compileExpressions(settings.min_count_to_compile_expression, lazy_executed_nodes); #endif - linearizeActions(); + linearizeActions(lazy_executed_nodes); if (settings.max_temporary_columns && num_columns > settings.max_temporary_columns) throw Exception(ErrorCodes::TOO_MANY_TEMPORARY_COLUMNS, @@ -68,7 +76,244 @@ ExpressionActionsPtr ExpressionActions::clone() const return std::make_shared(*this); } -void ExpressionActions::linearizeActions() +namespace +{ + struct ActionsDAGReverseInfo + { + struct NodeInfo + { + std::vector parents; + bool used_in_result = false; + }; + + using ReverseIndex = std::unordered_map; + std::vector nodes_info; + ReverseIndex reverse_index; + }; +} + +static ActionsDAGReverseInfo getActionsDAGReverseInfo(const std::list & nodes, const ActionsDAG::NodeRawConstPtrs & index) +{ + ActionsDAGReverseInfo result_info; + result_info.nodes_info.resize(nodes.size()); + + for (const auto & node : nodes) + { + size_t id = result_info.reverse_index.size(); + result_info.reverse_index[&node] = id; + } + + for (const auto * node : index) + result_info.nodes_info[result_info.reverse_index[node]].used_in_result = true; + + for (const auto & node : nodes) + { + for (const auto & child : node.children) + result_info.nodes_info[result_info.reverse_index[child]].parents.emplace_back(&node); + } + + return result_info; +} + +static DataTypesWithConstInfo getDataTypesWithConstInfoFromNodes(const ActionsDAG::NodeRawConstPtrs & nodes) +{ + DataTypesWithConstInfo types; + types.reserve(nodes.size()); + for (const auto & child : nodes) + { + bool is_const = child->column && isColumnConst(*child->column); + types.push_back({child->result_type, is_const}); + } + return types; +} + +namespace +{ + /// Information about the node that helps to determine if it can be executed lazily. + struct LazyExecutionInfo + { + bool can_be_lazy_executed; + /// For each node we need to know all it's ancestors that are short-circuit functions. + /// Also we need to know which arguments of this short-circuit functions are ancestors for the node + /// (we will store the set of indexes of arguments), because for some short-circuit function we shouldn't + /// enable lazy execution for nodes that are common descendants of different function arguments. + /// Example: if(cond, expr1(..., expr, ...), expr2(..., expr, ...))). + std::unordered_map> short_circuit_ancestors_info; + }; +} + +/// Create lazy execution info for node. +static void setLazyExecutionInfo( + const ActionsDAG::Node * node, + const ActionsDAGReverseInfo & reverse_info, + const std::unordered_map & short_circuit_nodes, + std::unordered_map & lazy_execution_infos) +{ + /// If we already created info about this node, just do nothing. + if (lazy_execution_infos.contains(node)) + return; + + LazyExecutionInfo & lazy_execution_info = lazy_execution_infos[node]; + lazy_execution_info.can_be_lazy_executed = true; + + const ActionsDAGReverseInfo::NodeInfo & node_info = reverse_info.nodes_info[reverse_info.reverse_index.at(node)]; + + /// If node is used in result, we can't enable lazy execution. + if (node_info.used_in_result) + lazy_execution_info.can_be_lazy_executed = false; + + /// To fill lazy execution info for current node we need to create it for all it's parents. + for (const auto & parent : node_info.parents) + { + setLazyExecutionInfo(parent, reverse_info, short_circuit_nodes, lazy_execution_infos); + /// Update current node info according to parent info. + if (short_circuit_nodes.contains(parent)) + { + /// Use set, because one node can be more than one argument. + /// Example: expr1 AND expr2 AND expr1. + std::set indexes; + for (size_t i = 0; i != parent->children.size(); ++i) + { + if (node == parent->children[i]) + indexes.insert(i); + } + + if (!short_circuit_nodes.at(parent).enable_lazy_execution_for_first_argument && node == parent->children[0]) + { + /// We shouldn't add 0 index in node info in this case. + indexes.erase(0); + /// Disable lazy execution for current node only if it's disabled for short-circuit node, + /// because we can have nested short-circuit nodes. + if (!lazy_execution_infos[parent].can_be_lazy_executed) + lazy_execution_info.can_be_lazy_executed = false; + } + + lazy_execution_info.short_circuit_ancestors_info[parent].insert(indexes.begin(), indexes.end()); + } + else + /// If lazy execution is disabled for one of parents, we should disable it for current node. + lazy_execution_info.can_be_lazy_executed &= lazy_execution_infos[parent].can_be_lazy_executed; + + /// Update info about short-circuit ancestors according to parent info. + for (const auto & [short_circuit_node, indexes] : lazy_execution_infos[parent].short_circuit_ancestors_info) + lazy_execution_info.short_circuit_ancestors_info[short_circuit_node].insert(indexes.begin(), indexes.end()); + } + + if (!lazy_execution_info.can_be_lazy_executed) + return; + + /// Check if current node is common descendant of different function arguments of + /// short-circuit function that disables lazy execution on this case. + for (const auto & [short_circuit_node, indexes] : lazy_execution_info.short_circuit_ancestors_info) + { + /// If lazy execution is enabled for this short-circuit node, + /// we shouldn't disable it for current node. + if (lazy_execution_infos[short_circuit_node].can_be_lazy_executed) + continue; + + if (!short_circuit_nodes.at(short_circuit_node).enable_lazy_execution_for_common_descendants_of_arguments && indexes.size() > 1) + { + lazy_execution_info.can_be_lazy_executed = false; + return; + } + } +} + + +/// Enable lazy execution for short-circuit function arguments. +static bool findLazyExecutedNodes( + const ActionsDAG::NodeRawConstPtrs & children, + std::unordered_map & lazy_execution_infos, + bool force_enable_lazy_execution, + std::unordered_set & lazy_executed_nodes_out) +{ + bool has_lazy_node = false; + for (const auto * child : children) + { + /// Skip node that have already been found as lazy executed. + if (lazy_executed_nodes_out.contains(child)) + { + has_lazy_node = true; + continue; + } + + /// Skip nodes that cannot be lazy executed. + if (!lazy_execution_infos[child].can_be_lazy_executed) + continue; + + /// We cannot propagate lazy execution through arrayJoin, because when we execute + /// arrayJoin we need to know the exact offset of it's argument to replicate the other arguments. + /// We cannot determine the exact offset without it's argument execution, because the offset + /// can depend on on it. + /// Example: arrayJoin(range(number)), we use lazy execution for masked function execution, + /// but if we filter column number by mask and then execute function range() and arrayJoin, we will get + /// the offset that is differ from what we would get without filtering. + switch (child->type) + { + case ActionsDAG::ActionType::FUNCTION: + { + /// Propagate lazy execution through function arguments. + bool has_lazy_child = findLazyExecutedNodes(child->children, lazy_execution_infos, force_enable_lazy_execution, lazy_executed_nodes_out); + + /// Use lazy execution when: + /// - It's force enabled. + /// - Function is suitable for lazy execution. + /// - Function has lazy executed arguments. + if (force_enable_lazy_execution || has_lazy_child || child->function_base->isSuitableForShortCircuitArgumentsExecution(getDataTypesWithConstInfoFromNodes(child->children))) + { + has_lazy_node = true; + lazy_executed_nodes_out.insert(child); + } + break; + } + case ActionsDAG::ActionType::ALIAS: + /// Propagate lazy execution through alias. + has_lazy_node |= findLazyExecutedNodes(child->children, lazy_execution_infos, force_enable_lazy_execution, lazy_executed_nodes_out); + break; + default: + break; + } + } + return has_lazy_node; +} + +static std::unordered_set processShortCircuitFunctions(const ActionsDAG & actions_dag, ShortCircuitFunctionEvaluation short_circuit_function_evaluation) +{ + if (short_circuit_function_evaluation == ShortCircuitFunctionEvaluation::DISABLE) + return {}; + + const auto & nodes = actions_dag.getNodes(); + + /// Firstly, find all short-circuit functions and get their settings. + std::unordered_map short_circuit_nodes; + IFunctionBase::ShortCircuitSettings short_circuit_settings; + for (const auto & node : nodes) + { + if (node.type == ActionsDAG::ActionType::FUNCTION && node.function_base->isShortCircuit(short_circuit_settings, node.children.size()) && !node.children.empty()) + short_circuit_nodes[&node] = short_circuit_settings; + } + + auto reverse_info = getActionsDAGReverseInfo(nodes, actions_dag.getIndex()); + + /// For each node we fill LazyExecutionInfo. + std::unordered_map lazy_execution_infos; + for (const auto & node : nodes) + setLazyExecutionInfo(&node, reverse_info, short_circuit_nodes, lazy_execution_infos); + + std::unordered_set lazy_executed_nodes; + for (const auto & [node, settings] : short_circuit_nodes) + { + /// Recursively find nodes that should be lazy executed. + findLazyExecutedNodes( + node->children, + lazy_execution_infos, + settings.force_enable_lazy_execution || short_circuit_function_evaluation == ShortCircuitFunctionEvaluation::FORCE_ENABLE, + lazy_executed_nodes); + } + return lazy_executed_nodes; +} + +void ExpressionActions::linearizeActions(const std::unordered_set & lazy_executed_nodes) { /// This function does the topological sort on DAG and fills all the fields of ExpressionActions. /// Algorithm traverses DAG starting from nodes without children. @@ -77,41 +322,24 @@ void ExpressionActions::linearizeActions() { const Node * node = nullptr; size_t num_created_children = 0; - std::vector parents; - ssize_t position = -1; size_t num_created_parents = 0; - bool used_in_result = false; }; const auto & nodes = getNodes(); const auto & index = actions_dag->getIndex(); const auto & inputs = actions_dag->getInputs(); - std::vector data(nodes.size()); - std::unordered_map reverse_index; - + auto reverse_info = getActionsDAGReverseInfo(nodes, index); + std::vector data; for (const auto & node : nodes) - { - size_t id = reverse_index.size(); - data[id].node = &node; - reverse_index[&node] = id; - } + data.push_back({.node = &node}); /// There are independent queues for arrayJoin and other actions. /// We delay creation of arrayJoin as long as we can, so that they will be executed closer to end. std::queue ready_nodes; std::queue ready_array_joins; - for (const auto * node : index) - data[reverse_index[node]].used_in_result = true; - - for (const auto & node : nodes) - { - for (const auto & child : node.children) - data[reverse_index[child]].parents.emplace_back(&node); - } - for (const auto & node : nodes) { if (node.children.empty()) @@ -128,7 +356,9 @@ void ExpressionActions::linearizeActions() const Node * node = stack.front(); stack.pop(); - auto & cur = data[reverse_index[node]]; + auto cur_index = reverse_info.reverse_index[node]; + auto & cur = data[cur_index]; + auto & cur_info = reverse_info.nodes_info[cur_index]; /// Select position for action result. size_t free_position = num_columns; @@ -146,7 +376,9 @@ void ExpressionActions::linearizeActions() arguments.reserve(cur.node->children.size()); for (const auto * child : cur.node->children) { - auto & arg = data[reverse_index[child]]; + auto arg_index = reverse_info.reverse_index[child]; + auto & arg = data[arg_index]; + auto arg_info = reverse_info.nodes_info[arg_index]; if (arg.position < 0) throw Exception(ErrorCodes::LOGICAL_ERROR, "Argument was not calculated for {}", child->result_name); @@ -155,7 +387,7 @@ void ExpressionActions::linearizeActions() ExpressionActions::Argument argument; argument.pos = arg.position; - argument.needed_later = arg.used_in_result || arg.num_created_parents != arg.parents.size(); + argument.needed_later = arg_info.used_in_result || arg.num_created_parents != arg_info.parents.size(); if (!argument.needed_later) free_positions.push(argument.pos); @@ -167,17 +399,17 @@ void ExpressionActions::linearizeActions() { /// Argument for input is special. It contains the position from required columns. ExpressionActions::Argument argument; - argument.needed_later = !cur.parents.empty(); + argument.needed_later = !cur_info.parents.empty(); arguments.emplace_back(argument); //required_columns.push_back({node->result_name, node->result_type}); } - actions.push_back({node, arguments, free_position}); + actions.push_back({node, arguments, free_position, lazy_executed_nodes.contains(node)}); - for (const auto & parent : cur.parents) + for (const auto & parent : cur_info.parents) { - auto & parent_data = data[reverse_index[parent]]; + auto & parent_data = data[reverse_info.reverse_index[parent]]; ++parent_data.num_created_children; if (parent_data.num_created_children == parent->children.size()) @@ -192,7 +424,7 @@ void ExpressionActions::linearizeActions() for (const auto & node : index) { - auto pos = data[reverse_index[node]].position; + auto pos = data[reverse_info.reverse_index[node]].position; if (pos < 0) throw Exception(ErrorCodes::LOGICAL_ERROR, "Action for {} was not calculated", node->result_name); @@ -205,7 +437,7 @@ void ExpressionActions::linearizeActions() for (const auto * input : inputs) { - const auto & cur = data[reverse_index[input]]; + const auto & cur = data[reverse_info.reverse_index[input]]; auto pos = required_columns.size(); actions[cur.position].arguments.front().pos = pos; required_columns.push_back({input->result_name, input->result_type}); @@ -358,11 +590,16 @@ static void executeAction(const ExpressionActions::Action & action, ExecutionCon arguments[i] = columns[action.arguments[i].pos]; } - ProfileEvents::increment(ProfileEvents::FunctionExecute); - if (action.node->is_function_compiled) - ProfileEvents::increment(ProfileEvents::CompiledFunctionExecute); + if (action.is_lazy_executed) + res_column.column = ColumnFunction::create(num_rows, action.node->function_base, std::move(arguments), true, action.node->is_function_compiled); + else + { + ProfileEvents::increment(ProfileEvents::FunctionExecute); + if (action.node->is_function_compiled) + ProfileEvents::increment(ProfileEvents::CompiledFunctionExecute); - res_column.column = action.node->function->execute(arguments, res_column.type, num_rows, dry_run); + res_column.column = action.node->function->execute(arguments, res_column.type, num_rows, dry_run); + } break; } @@ -800,12 +1037,15 @@ ExpressionActionsChain::JoinStep::JoinStep( : Step({}) , analyzed_join(std::move(analyzed_join_)) , join(std::move(join_)) - , result_columns(std::move(required_columns_)) { - for (const auto & column : result_columns) + for (const auto & column : required_columns_) required_columns.emplace_back(column.name, column.type); - analyzed_join->addJoinedColumnsAndCorrectTypes(result_columns); + NamesAndTypesList result_names_and_types = required_columns; + analyzed_join->addJoinedColumnsAndCorrectTypes(result_names_and_types); + for (const auto & [name, type] : result_names_and_types) + /// `column` is `nullptr` because we don't care on constness here, it may be changed in join + result_columns.emplace_back(nullptr, type, name); } void ExpressionActionsChain::JoinStep::finalize(const NameSet & required_output_) diff --git a/src/Interpreters/ExpressionActions.h b/src/Interpreters/ExpressionActions.h index 4fddd1fd27e..c420885eaa2 100644 --- a/src/Interpreters/ExpressionActions.h +++ b/src/Interpreters/ExpressionActions.h @@ -56,6 +56,10 @@ public: Arguments arguments; size_t result_position; + /// Determine if this action should be executed lazily. If it should and the node type is FUNCTION, then the function + /// won't be executed and will be stored with it's arguments in ColumnFunction with isShortCircuitArgument() = true. + bool is_lazy_executed; + std::string toString() const; JSONBuilder::ItemPtr toTree() const; }; @@ -68,7 +72,6 @@ public: using NameToInputMap = std::unordered_map>; private: - ActionsDAGPtr actions_dag; Actions actions; size_t num_columns = 0; @@ -122,7 +125,7 @@ public: private: void checkLimits(const ColumnsWithTypeAndName & columns) const; - void linearizeActions(); + void linearizeActions(const std::unordered_set & lazy_executed_nodes); }; diff --git a/src/Interpreters/ExpressionActionsSettings.cpp b/src/Interpreters/ExpressionActionsSettings.cpp index 550aa4d339c..8aec7afef4d 100644 --- a/src/Interpreters/ExpressionActionsSettings.cpp +++ b/src/Interpreters/ExpressionActionsSettings.cpp @@ -14,6 +14,7 @@ ExpressionActionsSettings ExpressionActionsSettings::fromSettings(const Settings settings.max_temporary_columns = from.max_temporary_columns; settings.max_temporary_non_const_columns = from.max_temporary_non_const_columns; settings.compile_expressions = compile_expressions; + settings.short_circuit_function_evaluation = from.short_circuit_function_evaluation; return settings; } diff --git a/src/Interpreters/ExpressionActionsSettings.h b/src/Interpreters/ExpressionActionsSettings.h index 26532128805..326de983748 100644 --- a/src/Interpreters/ExpressionActionsSettings.h +++ b/src/Interpreters/ExpressionActionsSettings.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include @@ -25,6 +26,8 @@ struct ExpressionActionsSettings CompileExpressions compile_expressions = CompileExpressions::no; + ShortCircuitFunctionEvaluation short_circuit_function_evaluation = ShortCircuitFunctionEvaluation::DISABLE; + static ExpressionActionsSettings fromSettings(const Settings & from, CompileExpressions compile_expressions = CompileExpressions::no); static ExpressionActionsSettings fromContext(ContextPtr from, CompileExpressions compile_expressions = CompileExpressions::no); }; diff --git a/src/Interpreters/ExpressionAnalyzer.cpp b/src/Interpreters/ExpressionAnalyzer.cpp index 77598e69c00..dbb1addf202 100644 --- a/src/Interpreters/ExpressionAnalyzer.cpp +++ b/src/Interpreters/ExpressionAnalyzer.cpp @@ -162,6 +162,36 @@ ExpressionAnalyzer::ExpressionAnalyzer( analyzeAggregation(); } +static ASTPtr checkPositionalArgument(ASTPtr argument, const ASTSelectQuery * select_query, ASTSelectQuery::Expression expression) +{ + auto columns = select_query->select()->children; + + /// Case when GROUP BY element is position. + /// Do not consider case when GROUP BY element is not a literal, but expression, even if all values are constants. + if (const auto * ast_literal = typeid_cast(argument.get())) + { + auto which = ast_literal->value.getType(); + if (which == Field::Types::UInt64) + { + auto pos = ast_literal->value.get(); + if (pos > 0 && pos <= columns.size()) + { + const auto & column = columns[--pos]; + if (const auto * literal_ast = typeid_cast(column.get())) + { + return std::make_shared(literal_ast->name()); + } + else + { + throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Illegal value for positional argument in {}", + ASTSelectQuery::expressionToString(expression)); + } + } + /// Do not throw if out of bounds, see appendUnusedGroupByColumn. + } + } + return nullptr; +} void ExpressionAnalyzer::analyzeAggregation() { @@ -216,7 +246,7 @@ void ExpressionAnalyzer::analyzeAggregation() if (join) { getRootActionsNoMakeSet(analyzedJoin().leftKeysList(), true, temp_actions, false); - auto sample_columns = temp_actions->getResultColumns(); + auto sample_columns = temp_actions->getNamesAndTypesList(); analyzedJoin().addJoinedColumnsAndCorrectTypes(sample_columns); temp_actions = std::make_shared(sample_columns); } @@ -238,13 +268,22 @@ void ExpressionAnalyzer::analyzeAggregation() { NameSet unique_keys; ASTs & group_asts = select_query->groupBy()->children; + for (ssize_t i = 0; i < ssize_t(group_asts.size()); ++i) { ssize_t size = group_asts.size(); getRootActionsNoMakeSet(group_asts[i], true, temp_actions, false); + if (getContext()->getSettingsRef().enable_positional_arguments) + { + auto new_argument = checkPositionalArgument(group_asts[i], select_query, ASTSelectQuery::Expression::GROUP_BY); + if (new_argument) + group_asts[i] = new_argument; + } + const auto & column_name = group_asts[i]->getColumnName(); const auto * node = temp_actions->tryFindInIndex(column_name); + if (!node) throw Exception("Unknown identifier (in GROUP BY): " + column_name, ErrorCodes::UNKNOWN_IDENTIFIER); @@ -337,7 +376,7 @@ void ExpressionAnalyzer::tryMakeSetForIndexFromSubquery(const ASTPtr & subquery_ PullingAsyncPipelineExecutor executor(io.pipeline); SetPtr set = std::make_shared(settings.size_limits_for_set, true, getContext()->getSettingsRef().transform_null_in); - set->setHeader(executor.getHeader()); + set->setHeader(executor.getHeader().getColumnsWithTypeAndName()); Block block; while (executor.pull(block)) @@ -346,7 +385,7 @@ void ExpressionAnalyzer::tryMakeSetForIndexFromSubquery(const ASTPtr & subquery_ continue; /// If the limits have been exceeded, give up and let the default subquery processing actions take place. - if (!set->insertFromBlock(block)) + if (!set->insertFromBlock(block.getColumnsWithTypeAndName())) return; } @@ -1206,7 +1245,7 @@ void SelectQueryExpressionAnalyzer::appendSelect(ExpressionActionsChain & chain, } ActionsDAGPtr SelectQueryExpressionAnalyzer::appendOrderBy(ExpressionActionsChain & chain, bool only_types, bool optimize_read_in_order, - ManyExpressionActions & order_by_elements_actions) + ManyExpressionActions & order_by_elements_actions) { const auto * select_query = getSelectQuery(); @@ -1223,11 +1262,20 @@ ActionsDAGPtr SelectQueryExpressionAnalyzer::appendOrderBy(ExpressionActionsChai bool with_fill = false; NameSet order_by_keys; + for (auto & child : select_query->orderBy()->children) { - const auto * ast = child->as(); + auto * ast = child->as(); if (!ast || ast->children.empty()) throw Exception("Bad order expression AST", ErrorCodes::UNKNOWN_TYPE_OF_AST_NODE); + + if (getContext()->getSettingsRef().enable_positional_arguments) + { + auto new_argument = checkPositionalArgument(ast->children.at(0), select_query, ASTSelectQuery::Expression::ORDER_BY); + if (new_argument) + ast->children[0] = new_argument; + } + ASTPtr order_expression = ast->children.at(0); step.addRequiredOutput(order_expression->getColumnName()); @@ -1277,8 +1325,16 @@ bool SelectQueryExpressionAnalyzer::appendLimitBy(ExpressionActionsChain & chain aggregated_names.insert(column.name); } - for (const auto & child : select_query->limitBy()->children) + auto & children = select_query->limitBy()->children; + for (auto & child : children) { + if (getContext()->getSettingsRef().enable_positional_arguments) + { + auto new_argument = checkPositionalArgument(child, select_query, ASTSelectQuery::Expression::LIMIT_BY); + if (new_argument) + child = new_argument; + } + auto child_name = child->getColumnName(); if (!aggregated_names.count(child_name)) step.addRequiredOutput(std::move(child_name)); diff --git a/src/Interpreters/ExpressionJIT.cpp b/src/Interpreters/ExpressionJIT.cpp index 497aa56ab13..27089ab8d37 100644 --- a/src/Interpreters/ExpressionJIT.cpp +++ b/src/Interpreters/ExpressionJIT.cpp @@ -166,6 +166,15 @@ public: return dag.compile(builder, values); } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & arguments) const override + { + for (const auto & f : nested_functions) + if (!f->isSuitableForShortCircuitArgumentsExecution(arguments)) + return false; + + return true; + } + String getName() const override { return name; } const DataTypes & getArgumentTypes() const override { return argument_types; } @@ -313,13 +322,23 @@ static bool isCompilableConstant(const ActionsDAG::Node & node) return node.column && isColumnConst(*node.column) && canBeNativeType(*node.result_type); } -static bool isCompilableFunction(const ActionsDAG::Node & node) +static bool isCompilableFunction(const ActionsDAG::Node & node, const std::unordered_set & lazy_executed_nodes) { if (node.type != ActionsDAG::ActionType::FUNCTION) return false; auto & function = *node.function_base; + IFunction::ShortCircuitSettings settings; + if (function.isShortCircuit(settings, node.children.size())) + { + for (const auto & child : node.children) + { + if (lazy_executed_nodes.contains(child)) + return false; + } + } + if (!canBeNativeType(*function.getResultType())) return false; @@ -357,7 +376,7 @@ static CompileDAG getCompilableDAG( const auto * node = frame.node; bool is_compilable_constant = isCompilableConstant(*node); - bool is_compilable_function = isCompilableFunction(*node); + bool is_compilable_function = isCompilableFunction(*node, {}); if (!is_compilable_function || is_compilable_constant) { @@ -420,7 +439,7 @@ static CompileDAG getCompilableDAG( return dag; } -void ActionsDAG::compileFunctions(size_t min_count_to_compile_expression) +void ActionsDAG::compileFunctions(size_t min_count_to_compile_expression, const std::unordered_set & lazy_executed_nodes) { struct Data { @@ -436,7 +455,7 @@ void ActionsDAG::compileFunctions(size_t min_count_to_compile_expression) for (const auto & node : nodes) { - bool node_is_compilable_in_isolation = isCompilableFunction(node) && !isCompilableConstant(node); + bool node_is_compilable_in_isolation = isCompilableFunction(node, lazy_executed_nodes) && !isCompilableConstant(node); node_to_data[&node].is_compilable_in_isolation = node_is_compilable_in_isolation; } diff --git a/src/Interpreters/ExternalDictionariesLoader.cpp b/src/Interpreters/ExternalDictionariesLoader.cpp index 83931649443..cbb0e52b91b 100644 --- a/src/Interpreters/ExternalDictionariesLoader.cpp +++ b/src/Interpreters/ExternalDictionariesLoader.cpp @@ -45,12 +45,20 @@ ExternalLoader::LoadablePtr ExternalDictionariesLoader::create( ExternalDictionariesLoader::DictPtr ExternalDictionariesLoader::getDictionary(const std::string & dictionary_name, ContextPtr local_context) const { std::string resolved_dictionary_name = resolveDictionaryName(dictionary_name, local_context->getCurrentDatabase()); + + if (local_context->hasQueryContext() && local_context->getSettingsRef().log_queries) + local_context->addQueryFactoriesInfo(Context::QueryLogFactories::Dictionary, resolved_dictionary_name); + return std::static_pointer_cast(load(resolved_dictionary_name)); } ExternalDictionariesLoader::DictPtr ExternalDictionariesLoader::tryGetDictionary(const std::string & dictionary_name, ContextPtr local_context) const { std::string resolved_dictionary_name = resolveDictionaryName(dictionary_name, local_context->getCurrentDatabase()); + + if (local_context->hasQueryContext() && local_context->getSettingsRef().log_queries) + local_context->addQueryFactoriesInfo(Context::QueryLogFactories::Dictionary, resolved_dictionary_name); + return std::static_pointer_cast(tryLoad(resolved_dictionary_name)); } diff --git a/src/Interpreters/HashJoin.cpp b/src/Interpreters/HashJoin.cpp index e0aad706966..46f8c9aac79 100644 --- a/src/Interpreters/HashJoin.cpp +++ b/src/Interpreters/HashJoin.cpp @@ -21,7 +21,6 @@ #include -#include #include #include @@ -194,6 +193,13 @@ HashJoin::HashJoin(std::shared_ptr table_join_, const Block & right_s required_right_keys = table_join->getRequiredRightKeys(right_table_keys, required_right_keys_sources); + LOG_DEBUG(log, "Right keys: [{}] (required: [{}]), left keys: [{}]", + fmt::join(key_names_right, ", "), + fmt::join(required_right_keys.getNames(), ", "), + fmt::join(table_join->keyNamesLeft(), ", ")); + + LOG_DEBUG(log, "Columns to add: [{}]", sample_block_with_columns_to_add.dumpStructure()); + std::tie(condition_mask_column_name_left, condition_mask_column_name_right) = table_join->joinConditionColumnNames(); JoinCommon::removeLowCardinalityInplace(right_table_keys); @@ -629,7 +635,7 @@ bool HashJoin::addJoinedBlock(const Block & source_block, bool check_limits) ConstNullMapPtr null_map{}; ColumnPtr null_map_holder = extractNestedColumnsAndNullMap(key_columns, null_map); - /// If RIGHT or FULL save blocks with nulls for NonJoinedBlockInputStream + /// If RIGHT or FULL save blocks with nulls for NotJoinedBlocks UInt8 save_nullmap = 0; if (isRightOrFull(kind) && null_map) { @@ -1468,40 +1474,17 @@ struct AdderNonJoined /// Stream from not joined earlier rows of the right table. -class NonJoinedBlockInputStream : private NotJoined, public IBlockInputStream +class NotJoinedHash final : public NotJoinedBlocks::RightColumnsFiller { public: - NonJoinedBlockInputStream(const HashJoin & parent_, const Block & result_sample_block_, UInt64 max_block_size_) - : NotJoined(*parent_.table_join, - parent_.savedBlockSample(), - parent_.right_sample_block, - result_sample_block_) - , parent(parent_) - , max_block_size(max_block_size_) + NotJoinedHash(const HashJoin & parent_, UInt64 max_block_size_) + : parent(parent_), max_block_size(max_block_size_) {} - String getName() const override { return "NonJoined"; } - Block getHeader() const override { return result_sample_block; } + Block getEmptyBlock() override { return parent.savedBlockSample().cloneEmpty(); } -protected: - Block readImpl() override + size_t fillColumns(MutableColumns & columns_right) override { - if (parent.data->blocks.empty()) - return Block(); - return createBlock(); - } - -private: - const HashJoin & parent; - UInt64 max_block_size; - - std::any position; - std::optional nulls_position; - - Block createBlock() - { - MutableColumns columns_right = saved_block_sample.cloneEmptyColumns(); - size_t rows_added = 0; auto fill_callback = [&](auto, auto strictness, auto & map) @@ -1513,22 +1496,16 @@ private: throw Exception("Logical error: unknown JOIN strictness (must be on of: ANY, ALL, ASOF)", ErrorCodes::LOGICAL_ERROR); fillNullsFromBlocks(columns_right, rows_added); - if (!rows_added) - return {}; - - Block res = result_sample_block.cloneEmpty(); - addLeftColumns(res, rows_added); - addRightColumns(res, columns_right); - copySameKeys(res); - correctLowcardAndNullability(res); - -#ifndef NDEBUG - assertBlocksHaveEqualStructure(res, result_sample_block, getName()); -#endif - - return res; + return rows_added; } +private: + const HashJoin & parent; + UInt64 max_block_size; + + std::any position; + std::optional nulls_position; + template size_t fillColumnsFromMap(const Maps & maps, MutableColumns & columns_keys_and_right) { @@ -1607,15 +1584,18 @@ private: }; -BlockInputStreamPtr HashJoin::createStreamWithNonJoinedRows(const Block & result_sample_block, UInt64 max_block_size) const +std::shared_ptr HashJoin::getNonJoinedBlocks(const Block & result_sample_block, UInt64 max_block_size) const { if (table_join->strictness() == ASTTableJoin::Strictness::Asof || - table_join->strictness() == ASTTableJoin::Strictness::Semi) + table_join->strictness() == ASTTableJoin::Strictness::Semi || + !isRightOrFull(table_join->kind())) + { return {}; + } - if (isRightOrFull(table_join->kind())) - return std::make_shared(*this, result_sample_block, max_block_size); - return {}; + size_t left_columns_count = result_sample_block.columns() - required_right_keys.columns() - sample_block_with_columns_to_add.columns(); + auto non_joined = std::make_unique(*this, max_block_size); + return std::make_shared(std::move(non_joined), result_sample_block, left_columns_count, table_join->leftToRightKeyRemap()); } void HashJoin::reuseJoinedData(const HashJoin & join) diff --git a/src/Interpreters/HashJoin.h b/src/Interpreters/HashJoin.h index 65e3f5dbabe..2e691f189c4 100644 --- a/src/Interpreters/HashJoin.h +++ b/src/Interpreters/HashJoin.h @@ -20,7 +20,6 @@ #include #include -#include #include @@ -164,7 +163,7 @@ public: * Use only after all calls to joinBlock was done. * left_sample_block is passed without account of 'use_nulls' setting (columns will be converted to Nullable inside). */ - BlockInputStreamPtr createStreamWithNonJoinedRows(const Block & result_sample_block, UInt64 max_block_size) const override; + std::shared_ptr getNonJoinedBlocks(const Block & result_sample_block, UInt64 max_block_size) const override; /// Number of keys in all built JOIN maps. size_t getTotalRowCount() const final; @@ -337,7 +336,7 @@ public: bool isUsed(size_t off) const { return used_flags.getUsedSafe(off); } private: - friend class NonJoinedBlockInputStream; + friend class NotJoinedHash; friend class JoinSource; std::shared_ptr table_join; diff --git a/src/Interpreters/IJoin.h b/src/Interpreters/IJoin.h index 8fa85de4951..2215402e1d4 100644 --- a/src/Interpreters/IJoin.h +++ b/src/Interpreters/IJoin.h @@ -5,7 +5,6 @@ #include #include -#include namespace DB { @@ -15,6 +14,7 @@ struct ExtraBlock; using ExtraBlockPtr = std::shared_ptr; class TableJoin; +class NotJoinedBlocks; class IJoin { @@ -43,7 +43,7 @@ public: /// Different query plan is used for such joins. virtual bool isFilled() const { return false; } - virtual BlockInputStreamPtr createStreamWithNonJoinedRows(const Block &, UInt64) const { return {}; } + virtual std::shared_ptr getNonJoinedBlocks(const Block &, UInt64) const = 0; }; using JoinPtr = std::shared_ptr; diff --git a/src/Interpreters/InDepthNodeVisitor.h b/src/Interpreters/InDepthNodeVisitor.h index 3ba25a327c4..90235de34b0 100644 --- a/src/Interpreters/InDepthNodeVisitor.h +++ b/src/Interpreters/InDepthNodeVisitor.h @@ -16,7 +16,7 @@ class InDepthNodeVisitor public: using Data = typename Matcher::Data; - InDepthNodeVisitor(Data & data_, WriteBuffer * ostr_ = nullptr) + explicit InDepthNodeVisitor(Data & data_, WriteBuffer * ostr_ = nullptr) : data(data_), visit_depth(0), ostr(ostr_) diff --git a/src/Interpreters/InterpreterBackupQuery.cpp b/src/Interpreters/InterpreterBackupQuery.cpp new file mode 100644 index 00000000000..11e0b2e40ef --- /dev/null +++ b/src/Interpreters/InterpreterBackupQuery.cpp @@ -0,0 +1,64 @@ +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace DB +{ +namespace +{ + BackupSettings getBackupSettings(const ASTBackupQuery & query) + { + BackupSettings settings; + if (query.settings) + settings.applyChanges(query.settings->as().changes); + return settings; + } + + BackupPtr getBaseBackup(const BackupSettings & settings) + { + const String & base_backup_name = settings.base_backup; + if (base_backup_name.empty()) + return nullptr; + return BackupFactory::instance().openBackup(base_backup_name); + } + + void executeBackup(const ASTBackupQuery & query, const ContextPtr & context) + { + auto settings = getBackupSettings(query); + auto base_backup = getBaseBackup(settings); + + auto backup_entries = makeBackupEntries(query.elements, context); + UInt64 estimated_backup_size = estimateBackupSize(backup_entries, base_backup); + + auto backup = BackupFactory::instance().createBackup(query.backup_name, estimated_backup_size, base_backup); + writeBackupEntries(backup, std::move(backup_entries), context->getSettingsRef().max_backup_threads); + } + + void executeRestore(const ASTBackupQuery & query, ContextMutablePtr context) + { + auto settings = getBackupSettings(query); + auto base_backup = getBaseBackup(settings); + + auto backup = BackupFactory::instance().openBackup(query.backup_name, base_backup); + auto restore_tasks = makeRestoreTasks(query.elements, context, backup); + executeRestoreTasks(std::move(restore_tasks), context->getSettingsRef().max_backup_threads); + } +} + +BlockIO InterpreterBackupQuery::execute() +{ + const auto & query = query_ptr->as(); + if (query.kind == ASTBackupQuery::BACKUP) + executeBackup(query, context); + else if (query.kind == ASTBackupQuery::RESTORE) + executeRestore(query, context); + return {}; +} + +} diff --git a/src/Interpreters/InterpreterBackupQuery.h b/src/Interpreters/InterpreterBackupQuery.h new file mode 100644 index 00000000000..1c4b579acc7 --- /dev/null +++ b/src/Interpreters/InterpreterBackupQuery.h @@ -0,0 +1,20 @@ +#pragma once + +#include +#include + + +namespace DB +{ +class InterpreterBackupQuery : public IInterpreter +{ +public: + InterpreterBackupQuery(const ASTPtr & query_ptr_, ContextMutablePtr context_) : query_ptr(query_ptr_), context(context_) {} + + BlockIO execute() override; + +private: + ASTPtr query_ptr; + ContextMutablePtr context; +}; +} diff --git a/src/Interpreters/InterpreterCreateFunctionQuery.cpp b/src/Interpreters/InterpreterCreateFunctionQuery.cpp new file mode 100644 index 00000000000..01fc60060b3 --- /dev/null +++ b/src/Interpreters/InterpreterCreateFunctionQuery.cpp @@ -0,0 +1,117 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int UNKNOWN_IDENTIFIER; + extern const int CANNOT_CREATE_RECURSIVE_FUNCTION; + extern const int UNSUPPORTED_METHOD; +} + +BlockIO InterpreterCreateFunctionQuery::execute() +{ + auto current_context = getContext(); + current_context->checkAccess(AccessType::CREATE_FUNCTION); + + FunctionNameNormalizer().visit(query_ptr.get()); + auto * create_function_query = query_ptr->as(); + + if (!create_function_query) + throw Exception(ErrorCodes::UNSUPPORTED_METHOD, "Expected CREATE FUNCTION query"); + + auto & function_name = create_function_query->function_name; + validateFunction(create_function_query->function_core, function_name); + + UserDefinedFunctionFactory::instance().registerFunction(function_name, query_ptr); + + if (!is_internal) + { + try + { + UserDefinedObjectsLoader::instance().storeObject(current_context, UserDefinedObjectType::Function, function_name, *query_ptr); + } + catch (Exception & exception) + { + UserDefinedFunctionFactory::instance().unregisterFunction(function_name); + exception.addMessage(fmt::format("while storing user defined function {} on disk", backQuote(function_name))); + throw; + } + } + + return {}; +} + +void InterpreterCreateFunctionQuery::validateFunction(ASTPtr function, const String & name) +{ + const auto * args_tuple = function->as()->arguments->children.at(0)->as(); + std::unordered_set arguments; + for (const auto & argument : args_tuple->arguments->children) + { + const auto & argument_name = argument->as()->name(); + auto [_, inserted] = arguments.insert(argument_name); + if (!inserted) + throw Exception(ErrorCodes::UNSUPPORTED_METHOD, "Identifier {} already used as function parameter", argument_name); + } + + ASTPtr function_body = function->as()->children.at(0)->children.at(1); + std::unordered_set identifiers_in_body = getIdentifiers(function_body); + + for (const auto & identifier : identifiers_in_body) + { + if (!arguments.contains(identifier)) + throw Exception(ErrorCodes::UNKNOWN_IDENTIFIER, "Identifier {} does not exist in arguments", backQuote(identifier)); + } + + validateFunctionRecursiveness(function_body, name); +} + +std::unordered_set InterpreterCreateFunctionQuery::getIdentifiers(ASTPtr node) +{ + std::unordered_set identifiers; + + std::stack ast_nodes_to_process; + ast_nodes_to_process.push(node); + + while (!ast_nodes_to_process.empty()) + { + auto ast_node_to_process = ast_nodes_to_process.top(); + ast_nodes_to_process.pop(); + + for (const auto & child : ast_node_to_process->children) + { + auto identifier_name_opt = tryGetIdentifierName(child); + if (identifier_name_opt) + identifiers.insert(identifier_name_opt.value()); + + ast_nodes_to_process.push(child); + } + } + + return identifiers; +} + +void InterpreterCreateFunctionQuery::validateFunctionRecursiveness(ASTPtr node, const String & function_to_create) +{ + for (const auto & child : node->children) + { + auto function_name_opt = tryGetFunctionName(child); + if (function_name_opt && function_name_opt.value() == function_to_create) + throw Exception(ErrorCodes::CANNOT_CREATE_RECURSIVE_FUNCTION, "You cannot create recursive function"); + + validateFunctionRecursiveness(child, function_to_create); + } +} + +} diff --git a/src/Interpreters/InterpreterCreateFunctionQuery.h b/src/Interpreters/InterpreterCreateFunctionQuery.h new file mode 100644 index 00000000000..b10760c5e9d --- /dev/null +++ b/src/Interpreters/InterpreterCreateFunctionQuery.h @@ -0,0 +1,32 @@ +#pragma once + +#include + + +namespace DB +{ + +class Context; + +class InterpreterCreateFunctionQuery : public IInterpreter, WithContext +{ +public: + InterpreterCreateFunctionQuery(const ASTPtr & query_ptr_, ContextPtr context_, bool is_internal_) + : WithContext(context_) + , query_ptr(query_ptr_) + , is_internal(is_internal_) {} + + BlockIO execute() override; + + void setInternal(bool internal_); + +private: + static void validateFunction(ASTPtr function, const String & name); + static std::unordered_set getIdentifiers(ASTPtr node); + static void validateFunctionRecursiveness(ASTPtr node, const String & function_to_create); + + ASTPtr query_ptr; + bool is_internal; +}; + +} diff --git a/src/Interpreters/InterpreterCreateQuery.cpp b/src/Interpreters/InterpreterCreateQuery.cpp index 4c1a3064c3d..76cb6c783ba 100644 --- a/src/Interpreters/InterpreterCreateQuery.cpp +++ b/src/Interpreters/InterpreterCreateQuery.cpp @@ -223,7 +223,7 @@ BlockIO InterpreterCreateQuery::createDatabase(ASTCreateQuery & create) if (create.storage->engine->name == "MaterializedPostgreSQL" && !getContext()->getSettingsRef().allow_experimental_database_materialized_postgresql && !internal) { throw Exception("MaterializedPostgreSQL is an experimental database engine. " - "Enable allow_experimental_database_postgresql_replica to use it.", ErrorCodes::UNKNOWN_DATABASE_ENGINE); + "Enable allow_experimental_database_materialized_postgresql to use it.", ErrorCodes::UNKNOWN_DATABASE_ENGINE); } DatabasePtr database = DatabaseFactory::get(create, metadata_path / "", getContext()); diff --git a/src/Interpreters/InterpreterDropFunctionQuery.cpp b/src/Interpreters/InterpreterDropFunctionQuery.cpp new file mode 100644 index 00000000000..9f945c11aac --- /dev/null +++ b/src/Interpreters/InterpreterDropFunctionQuery.cpp @@ -0,0 +1,27 @@ +#include +#include +#include +#include +#include +#include +#include + + +namespace DB +{ + +BlockIO InterpreterDropFunctionQuery::execute() +{ + auto current_context = getContext(); + current_context->checkAccess(AccessType::DROP_FUNCTION); + + FunctionNameNormalizer().visit(query_ptr.get()); + auto & drop_function_query = query_ptr->as(); + + UserDefinedFunctionFactory::instance().unregisterFunction(drop_function_query.function_name); + UserDefinedObjectsLoader::instance().removeObject(current_context, UserDefinedObjectType::Function, drop_function_query.function_name); + + return {}; +} + +} diff --git a/src/Interpreters/InterpreterDropFunctionQuery.h b/src/Interpreters/InterpreterDropFunctionQuery.h new file mode 100644 index 00000000000..5842851f5db --- /dev/null +++ b/src/Interpreters/InterpreterDropFunctionQuery.h @@ -0,0 +1,21 @@ +#pragma once + +#include + +namespace DB +{ + +class Context; + +class InterpreterDropFunctionQuery : public IInterpreter, WithMutableContext +{ +public: + InterpreterDropFunctionQuery(const ASTPtr & query_ptr_, ContextMutablePtr context_) : WithMutableContext(context_), query_ptr(query_ptr_) {} + + BlockIO execute() override; + +private: + ASTPtr query_ptr; +}; + +} diff --git a/src/Interpreters/InterpreterFactory.cpp b/src/Interpreters/InterpreterFactory.cpp index 9e6061c2525..54307ae848b 100644 --- a/src/Interpreters/InterpreterFactory.cpp +++ b/src/Interpreters/InterpreterFactory.cpp @@ -1,14 +1,20 @@ #include +#include #include #include -#include -#include #include +#include #include #include +#include +#include #include +#include #include +#include +#include #include +#include #include #include #include @@ -24,15 +30,15 @@ #include #include #include -#include -#include #include -#include #include +#include #include #include +#include #include +#include #include #include #include @@ -41,12 +47,15 @@ #include #include #include +#include #include #include #include +#include #include #include #include +#include #include #include #include @@ -65,7 +74,6 @@ #include #include #include -#include #include #include @@ -109,6 +117,10 @@ std::unique_ptr InterpreterFactory::get(ASTPtr & query, ContextMut ProfileEvents::increment(ProfileEvents::SelectQuery); return std::make_unique(query, context, options); } + else if (query->as()) + { + return std::make_unique(query, context, options); + } else if (query->as()) { ProfileEvents::increment(ProfileEvents::InsertQuery); @@ -264,6 +276,18 @@ std::unique_ptr InterpreterFactory::get(ASTPtr & query, ContextMut { return std::make_unique(query, context); } + else if (query->as()) + { + return std::make_unique(query, context, false /*is_internal*/); + } + else if (query->as()) + { + return std::make_unique(query, context); + } + else if (query->as()) + { + return std::make_unique(query, context); + } else { throw Exception("Unknown type of query: " + query->getID(), ErrorCodes::UNKNOWN_TYPE_OF_QUERY); diff --git a/src/Interpreters/InterpreterGrantQuery.cpp b/src/Interpreters/InterpreterGrantQuery.cpp index 42c440b4c52..506ab8a3387 100644 --- a/src/Interpreters/InterpreterGrantQuery.cpp +++ b/src/Interpreters/InterpreterGrantQuery.cpp @@ -22,69 +22,108 @@ namespace ErrorCodes namespace { - template - void updateFromQueryTemplate( - T & grantee, + /// Extracts access rights elements which are going to be granted or revoked from a query. + void collectAccessRightsElementsToGrantOrRevoke( const ASTGrantQuery & query, - const std::vector & roles_to_grant_or_revoke) + AccessRightsElements & elements_to_grant, + AccessRightsElements & elements_to_revoke) { - if (!query.is_revoke) + elements_to_grant.clear(); + elements_to_revoke.clear(); + + if (query.is_revoke) { - if (query.replace_access) - grantee.access = {}; - if (query.replace_granted_roles) - grantee.granted_roles = {}; + /// REVOKE + elements_to_revoke = query.access_rights_elements; } - - - if (!query.access_rights_elements.empty()) + else if (query.replace_access) { - if (query.is_revoke) - grantee.access.revoke(query.access_rights_elements); - else - grantee.access.grant(query.access_rights_elements); + /// GRANT WITH REPLACE OPTION + elements_to_grant = query.access_rights_elements; + elements_to_revoke.emplace_back(AccessType::ALL); } - - if (!roles_to_grant_or_revoke.empty()) + else { - if (query.is_revoke) - { - if (query.admin_option) - grantee.granted_roles.revokeAdminOption(roles_to_grant_or_revoke); - else - grantee.granted_roles.revoke(roles_to_grant_or_revoke); - } - else - { - if (query.admin_option) - grantee.granted_roles.grantWithAdminOption(roles_to_grant_or_revoke); - else - grantee.granted_roles.grant(roles_to_grant_or_revoke); - } + /// GRANT + elements_to_grant = query.access_rights_elements; } } - void updateFromQueryImpl( - IAccessEntity & grantee, + /// Extracts roles which are going to be granted or revoked from a query. + void collectRolesToGrantOrRevoke( + const AccessControlManager & access_control, const ASTGrantQuery & query, - const std::vector & roles_to_grant_or_revoke) + std::vector & roles_to_grant, + RolesOrUsersSet & roles_to_revoke) { - if (auto * user = typeid_cast(&grantee)) - updateFromQueryTemplate(*user, query, roles_to_grant_or_revoke); - else if (auto * role = typeid_cast(&grantee)) - updateFromQueryTemplate(*role, query, roles_to_grant_or_revoke); + roles_to_grant.clear(); + roles_to_revoke.clear(); + + RolesOrUsersSet roles_to_grant_or_revoke; + if (query.roles) + roles_to_grant_or_revoke = RolesOrUsersSet{*query.roles, access_control}; + + if (query.is_revoke) + { + /// REVOKE + roles_to_revoke = std::move(roles_to_grant_or_revoke); + } + else if (query.replace_granted_roles) + { + /// GRANT WITH REPLACE OPTION + roles_to_grant = roles_to_grant_or_revoke.getMatchingIDs(access_control); + roles_to_revoke = RolesOrUsersSet::AllTag{}; + } + else + { + /// GRANT + roles_to_grant = roles_to_grant_or_revoke.getMatchingIDs(access_control); + } } - void checkGranteeIsAllowed(const ContextAccess & access, const UUID & grantee_id, const IAccessEntity & grantee) + /// Extracts roles which are going to be granted or revoked from a query. + void collectRolesToGrantOrRevoke( + const ASTGrantQuery & query, + std::vector & roles_to_grant, + RolesOrUsersSet & roles_to_revoke) { - auto current_user = access.getUser(); + roles_to_grant.clear(); + roles_to_revoke.clear(); + + RolesOrUsersSet roles_to_grant_or_revoke; + if (query.roles) + roles_to_grant_or_revoke = RolesOrUsersSet{*query.roles}; + + if (query.is_revoke) + { + /// REVOKE + roles_to_revoke = std::move(roles_to_grant_or_revoke); + } + else if (query.replace_granted_roles) + { + /// GRANT WITH REPLACE OPTION + roles_to_grant = roles_to_grant_or_revoke.getMatchingIDs(); + roles_to_revoke = RolesOrUsersSet::AllTag{}; + } + else + { + /// GRANT + roles_to_grant = roles_to_grant_or_revoke.getMatchingIDs(); + } + } + + /// Checks if a grantee is allowed for the current user, throws an exception if not. + void checkGranteeIsAllowed(const ContextAccess & current_user_access, const UUID & grantee_id, const IAccessEntity & grantee) + { + auto current_user = current_user_access.getUser(); if (current_user && !current_user->grantees.match(grantee_id)) throw Exception(grantee.outputTypeAndName() + " is not allowed as grantee", ErrorCodes::ACCESS_DENIED); } - void checkGranteesAreAllowed(const AccessControlManager & access_control, const ContextAccess & access, const std::vector & grantee_ids) + /// Checks if grantees are allowed for the current user, throws an exception if not. + void checkGranteesAreAllowed(const AccessControlManager & access_control, const ContextAccess & current_user_access, const std::vector & grantee_ids) { - auto current_user = access.getUser(); + auto current_user = current_user_access.getUser(); if (!current_user || (current_user->grantees == RolesOrUsersSet::AllTag{})) return; @@ -92,36 +131,26 @@ namespace { auto entity = access_control.tryRead(id); if (auto role = typeid_cast(entity)) - checkGranteeIsAllowed(access, id, *role); + checkGranteeIsAllowed(current_user_access, id, *role); else if (auto user = typeid_cast(entity)) - checkGranteeIsAllowed(access, id, *user); + checkGranteeIsAllowed(current_user_access, id, *user); } } + /// Checks if the current user has enough access rights granted with grant option to grant or revoke specified access rights. void checkGrantOption( const AccessControlManager & access_control, - const ContextAccess & access, - const ASTGrantQuery & query, + const ContextAccess & current_user_access, const std::vector & grantees_from_query, - bool & need_check_grantees_are_allowed) + bool & need_check_grantees_are_allowed, + const AccessRightsElements & elements_to_grant, + AccessRightsElements & elements_to_revoke) { - const auto & elements = query.access_rights_elements; - need_check_grantees_are_allowed = true; - if (elements.empty()) - { - /// No access rights to grant or revoke. - need_check_grantees_are_allowed = false; - return; - } + /// Check access rights which are going to be granted. + /// To execute the command GRANT the current user needs to have the access granted with GRANT OPTION. + current_user_access.checkGrantOption(elements_to_grant); - if (!query.is_revoke) - { - /// To execute the command GRANT the current user needs to have the access granted with GRANT OPTION. - access.checkGrantOption(elements); - return; - } - - if (access.hasGrantOption(elements)) + if (current_user_access.hasGrantOption(elements_to_revoke)) { /// Simple case: the current user has the grant option for all the access rights specified for REVOKE. return; @@ -141,69 +170,62 @@ namespace auto entity = access_control.tryRead(id); if (auto role = typeid_cast(entity)) { - checkGranteeIsAllowed(access, id, *role); + if (need_check_grantees_are_allowed) + checkGranteeIsAllowed(current_user_access, id, *role); all_granted_access.makeUnion(role->access); } else if (auto user = typeid_cast(entity)) { - checkGranteeIsAllowed(access, id, *user); + if (need_check_grantees_are_allowed) + checkGranteeIsAllowed(current_user_access, id, *user); all_granted_access.makeUnion(user->access); } } + need_check_grantees_are_allowed = false; /// already checked - AccessRights required_access; - if (elements[0].is_partial_revoke) - { - AccessRightsElements non_revoke_elements = elements; - std::for_each(non_revoke_elements.begin(), non_revoke_elements.end(), [&](AccessRightsElement & element) { element.is_partial_revoke = false; }); - required_access.grant(non_revoke_elements); - } - else - { - required_access.grant(elements); - } - required_access.makeIntersection(all_granted_access); + if (!elements_to_revoke.empty() && elements_to_revoke[0].is_partial_revoke) + std::for_each(elements_to_revoke.begin(), elements_to_revoke.end(), [&](AccessRightsElement & element) { element.is_partial_revoke = false; }); + AccessRights access_to_revoke; + access_to_revoke.grant(elements_to_revoke); + access_to_revoke.makeIntersection(all_granted_access); - for (auto & required_access_element : required_access.getElements()) + /// Build more accurate list of elements to revoke, now we use an intesection of the initial list of elements to revoke + /// and all the granted access rights to these grantees. + bool grant_option = !elements_to_revoke.empty() && elements_to_revoke[0].grant_option; + elements_to_revoke.clear(); + for (auto & element_to_revoke : access_to_revoke.getElements()) { - if (!required_access_element.is_partial_revoke && (required_access_element.grant_option || !elements[0].grant_option)) - access.checkGrantOption(required_access_element); + if (!element_to_revoke.is_partial_revoke && (element_to_revoke.grant_option || !grant_option)) + elements_to_revoke.emplace_back(std::move(element_to_revoke)); } + + current_user_access.checkGrantOption(elements_to_revoke); } - std::vector getRoleIDsAndCheckAdminOption( + /// Checks if the current user has enough roles granted with admin option to grant or revoke specified roles. + void checkAdminOption( const AccessControlManager & access_control, - const ContextAccess & access, - const ASTGrantQuery & query, - const RolesOrUsersSet & roles_from_query, + const ContextAccess & current_user_access, const std::vector & grantees_from_query, - bool & need_check_grantees_are_allowed) + bool & need_check_grantees_are_allowed, + const std::vector & roles_to_grant, + RolesOrUsersSet & roles_to_revoke, + bool admin_option) { - need_check_grantees_are_allowed = true; - if (roles_from_query.empty()) - { - /// No roles to grant or revoke. - need_check_grantees_are_allowed = false; - return {}; - } + /// Check roles which are going to be granted. + /// To execute the command GRANT the current user needs to have the roles granted with ADMIN OPTION. + current_user_access.checkAdminOption(roles_to_grant); - std::vector matching_ids; - if (!query.is_revoke) + /// Check roles which are going to be revoked. + std::vector roles_to_revoke_ids; + if (!roles_to_revoke.all) { - /// To execute the command GRANT the current user needs to have the roles granted with ADMIN OPTION. - matching_ids = roles_from_query.getMatchingIDs(access_control); - access.checkAdminOption(matching_ids); - return matching_ids; - } - - if (!roles_from_query.all) - { - matching_ids = roles_from_query.getMatchingIDs(); - if (access.hasAdminOption(matching_ids)) + roles_to_revoke_ids = roles_to_revoke.getMatchingIDs(); + if (current_user_access.hasAdminOption(roles_to_revoke_ids)) { /// Simple case: the current user has the admin option for all the roles specified for REVOKE. - return matching_ids; + return; } } @@ -221,51 +243,129 @@ namespace auto entity = access_control.tryRead(id); if (auto role = typeid_cast(entity)) { - checkGranteeIsAllowed(access, id, *role); + if (need_check_grantees_are_allowed) + checkGranteeIsAllowed(current_user_access, id, *role); all_granted_roles.makeUnion(role->granted_roles); } else if (auto user = typeid_cast(entity)) { - checkGranteeIsAllowed(access, id, *user); + if (need_check_grantees_are_allowed) + checkGranteeIsAllowed(current_user_access, id, *user); all_granted_roles.makeUnion(user->granted_roles); } } + need_check_grantees_are_allowed = false; /// already checked - const auto & all_granted_roles_set = query.admin_option ? all_granted_roles.getGrantedWithAdminOption() : all_granted_roles.getGranted(); - if (roles_from_query.all) - boost::range::set_difference(all_granted_roles_set, roles_from_query.except_ids, std::back_inserter(matching_ids)); + const auto & all_granted_roles_set = admin_option ? all_granted_roles.getGrantedWithAdminOption() : all_granted_roles.getGranted(); + if (roles_to_revoke.all) + boost::range::set_difference(all_granted_roles_set, roles_to_revoke.except_ids, std::back_inserter(roles_to_revoke_ids)); else - boost::range::remove_erase_if(matching_ids, [&](const UUID & id) { return !all_granted_roles_set.count(id); }); - access.checkAdminOption(matching_ids); - return matching_ids; + boost::range::remove_erase_if(roles_to_revoke_ids, [&](const UUID & id) { return !all_granted_roles_set.count(id); }); + + roles_to_revoke = roles_to_revoke_ids; + current_user_access.checkAdminOption(roles_to_revoke_ids); } - void checkGrantOptionAndGrantees( - const AccessControlManager & access_control, - const ContextAccess & access, - const ASTGrantQuery & query, - const std::vector & grantees_from_query) + /// Returns access rights which should be checked for executing GRANT/REVOKE on cluster. + /// This function is less accurate than checkGrantOption() because it cannot use any information about + /// access rights the grantees currently have (due to those grantees are located on multiple nodes, + /// we just don't have the full information about them). + AccessRightsElements getRequiredAccessForExecutingOnCluster(const AccessRightsElements & elements_to_grant, const AccessRightsElements & elements_to_revoke) { - bool need_check_grantees_are_allowed = true; - checkGrantOption(access_control, access, query, grantees_from_query, need_check_grantees_are_allowed); - if (need_check_grantees_are_allowed) - checkGranteesAreAllowed(access_control, access, grantees_from_query); + auto required_access = elements_to_grant; + required_access.insert(required_access.end(), elements_to_revoke.begin(), elements_to_revoke.end()); + std::for_each(required_access.begin(), required_access.end(), [&](AccessRightsElement & element) { element.grant_option = true; }); + return required_access; } - std::vector getRoleIDsAndCheckAdminOptionAndGrantees( - const AccessControlManager & access_control, - const ContextAccess & access, - const ASTGrantQuery & query, - const RolesOrUsersSet & roles_from_query, - const std::vector & grantees_from_query) + /// Checks if the current user has enough roles granted with admin option to grant or revoke specified roles on cluster. + /// This function is less accurate than checkAdminOption() because it cannot use any information about + /// granted roles the grantees currently have (due to those grantees are located on multiple nodes, + /// we just don't have the full information about them). + void checkAdminOptionForExecutingOnCluster(const ContextAccess & current_user_access, + const std::vector roles_to_grant, + const RolesOrUsersSet & roles_to_revoke) { - bool need_check_grantees_are_allowed = true; - auto role_ids = getRoleIDsAndCheckAdminOption( - access_control, access, query, roles_from_query, grantees_from_query, need_check_grantees_are_allowed); - if (need_check_grantees_are_allowed) - checkGranteesAreAllowed(access_control, access, grantees_from_query); - return role_ids; + if (roles_to_revoke.all) + { + /// Revoking all the roles on cluster always requires ROLE_ADMIN privilege + /// because when we send the query REVOKE ALL to each shard we don't know at this point + /// which roles exactly this is going to revoke on each shard. + /// However ROLE_ADMIN just allows to revoke every role, that's why we check it here. + current_user_access.checkAccess(AccessType::ROLE_ADMIN); + return; + } + + if (current_user_access.isGranted(AccessType::ROLE_ADMIN)) + return; + + for (const auto & role_id : roles_to_grant) + current_user_access.checkAdminOption(role_id); + + + for (const auto & role_id : roles_to_revoke.getMatchingIDs()) + current_user_access.checkAdminOption(role_id); + } + + template + void updateGrantedAccessRightsAndRolesTemplate( + T & grantee, + const AccessRightsElements & elements_to_grant, + const AccessRightsElements & elements_to_revoke, + const std::vector & roles_to_grant, + const RolesOrUsersSet & roles_to_revoke, + bool admin_option) + { + if (!elements_to_revoke.empty()) + grantee.access.revoke(elements_to_revoke); + + if (!elements_to_grant.empty()) + grantee.access.grant(elements_to_grant); + + if (!roles_to_revoke.empty()) + { + if (admin_option) + grantee.granted_roles.revokeAdminOption(grantee.granted_roles.findGrantedWithAdminOption(roles_to_revoke)); + else + grantee.granted_roles.revoke(grantee.granted_roles.findGranted(roles_to_revoke)); + } + + if (!roles_to_grant.empty()) + { + if (admin_option) + grantee.granted_roles.grantWithAdminOption(roles_to_grant); + else + grantee.granted_roles.grant(roles_to_grant); + } + } + + /// Updates grants of a specified user or role. + void updateGrantedAccessRightsAndRoles( + IAccessEntity & grantee, + const AccessRightsElements & elements_to_grant, + const AccessRightsElements & elements_to_revoke, + const std::vector & roles_to_grant, + const RolesOrUsersSet & roles_to_revoke, + bool admin_option) + { + if (auto * user = typeid_cast(&grantee)) + updateGrantedAccessRightsAndRolesTemplate(*user, elements_to_grant, elements_to_revoke, roles_to_grant, roles_to_revoke, admin_option); + else if (auto * role = typeid_cast(&grantee)) + updateGrantedAccessRightsAndRolesTemplate(*role, elements_to_grant, elements_to_revoke, roles_to_grant, roles_to_revoke, admin_option); + } + + /// Updates grants of a specified user or role. + void updateFromQuery(IAccessEntity & grantee, const ASTGrantQuery & query) + { + AccessRightsElements elements_to_grant, elements_to_revoke; + collectAccessRightsElementsToGrantOrRevoke(query, elements_to_grant, elements_to_revoke); + + std::vector roles_to_grant; + RolesOrUsersSet roles_to_revoke; + collectRolesToGrantOrRevoke(query, roles_to_grant, roles_to_revoke); + + updateGrantedAccessRightsAndRoles(grantee, elements_to_grant, elements_to_revoke, roles_to_grant, roles_to_revoke, query.admin_option); } } @@ -283,37 +383,45 @@ BlockIO InterpreterGrantQuery::execute() throw Exception("A partial revoke should be revoked, not granted", ErrorCodes::LOGICAL_ERROR); auto & access_control = getContext()->getAccessControlManager(); - std::optional roles_set; - if (query.roles) - roles_set = RolesOrUsersSet{*query.roles, access_control}; + auto current_user_access = getContext()->getAccess(); std::vector grantees = RolesOrUsersSet{*query.grantees, access_control, getContext()->getUserID()}.getMatchingIDs(access_control); - /// Check if the current user has corresponding roles granted with admin option. - std::vector roles; - if (roles_set) - roles = getRoleIDsAndCheckAdminOptionAndGrantees(access_control, *getContext()->getAccess(), query, *roles_set, grantees); + /// Collect access rights and roles we're going to grant or revoke. + AccessRightsElements elements_to_grant, elements_to_revoke; + collectAccessRightsElementsToGrantOrRevoke(query, elements_to_grant, elements_to_revoke); + std::vector roles_to_grant; + RolesOrUsersSet roles_to_revoke; + collectRolesToGrantOrRevoke(access_control, query, roles_to_grant, roles_to_revoke); + + /// Executing on cluster. if (!query.cluster.empty()) { - /// To execute the command GRANT the current user needs to have the access granted with GRANT OPTION. - auto required_access = query.access_rights_elements; - std::for_each(required_access.begin(), required_access.end(), [&](AccessRightsElement & element) { element.grant_option = true; }); - checkGranteesAreAllowed(access_control, *getContext()->getAccess(), grantees); + auto required_access = getRequiredAccessForExecutingOnCluster(elements_to_grant, elements_to_revoke); + checkAdminOptionForExecutingOnCluster(*current_user_access, roles_to_grant, roles_to_revoke); + checkGranteesAreAllowed(access_control, *current_user_access, grantees); return executeDDLQueryOnCluster(query_ptr, getContext(), std::move(required_access)); } - query.replaceEmptyDatabase(getContext()->getCurrentDatabase()); + /// Check if the current user has corresponding access rights granted with grant option. + String current_database = getContext()->getCurrentDatabase(); + elements_to_grant.replaceEmptyDatabase(current_database); + elements_to_revoke.replaceEmptyDatabase(current_database); + bool need_check_grantees_are_allowed = true; + checkGrantOption(access_control, *current_user_access, grantees, need_check_grantees_are_allowed, elements_to_grant, elements_to_revoke); - /// Check if the current user has corresponding access rights with grant option. - if (!query.access_rights_elements.empty()) - checkGrantOptionAndGrantees(access_control, *getContext()->getAccess(), query, grantees); + /// Check if the current user has corresponding roles granted with admin option. + checkAdminOption(access_control, *current_user_access, grantees, need_check_grantees_are_allowed, roles_to_grant, roles_to_revoke, query.admin_option); + + if (need_check_grantees_are_allowed) + checkGranteesAreAllowed(access_control, *current_user_access, grantees); /// Update roles and users listed in `grantees`. auto update_func = [&](const AccessEntityPtr & entity) -> AccessEntityPtr { auto clone = entity->clone(); - updateFromQueryImpl(*clone, query, roles); + updateGrantedAccessRightsAndRoles(*clone, elements_to_grant, elements_to_revoke, roles_to_grant, roles_to_revoke, query.admin_option); return clone; }; @@ -325,21 +433,15 @@ BlockIO InterpreterGrantQuery::execute() void InterpreterGrantQuery::updateUserFromQuery(User & user, const ASTGrantQuery & query) { - std::vector roles_to_grant_or_revoke; - if (query.roles) - roles_to_grant_or_revoke = RolesOrUsersSet{*query.roles}.getMatchingIDs(); - updateFromQueryImpl(user, query, roles_to_grant_or_revoke); + updateFromQuery(user, query); } - void InterpreterGrantQuery::updateRoleFromQuery(Role & role, const ASTGrantQuery & query) { - std::vector roles_to_grant_or_revoke; - if (query.roles) - roles_to_grant_or_revoke = RolesOrUsersSet{*query.roles}.getMatchingIDs(); - updateFromQueryImpl(role, query, roles_to_grant_or_revoke); + updateFromQuery(role, query); } + void InterpreterGrantQuery::extendQueryLogElemImpl(QueryLogElement & elem, const ASTPtr & /*ast*/, ContextPtr) const { auto & query = query_ptr->as(); diff --git a/src/Interpreters/InterpreterInsertQuery.cpp b/src/Interpreters/InterpreterInsertQuery.cpp index e5d4d952a0c..6742b93fc71 100644 --- a/src/Interpreters/InterpreterInsertQuery.cpp +++ b/src/Interpreters/InterpreterInsertQuery.cpp @@ -37,6 +37,7 @@ namespace DB namespace ErrorCodes { + extern const int NOT_IMPLEMENTED; extern const int NO_SUCH_COLUMN_IN_TABLE; extern const int ILLEGAL_COLUMN; extern const int DUPLICATE_COLUMN; @@ -155,6 +156,9 @@ BlockIO InterpreterInsertQuery::execute() BlockIO res; StoragePtr table = getTable(query); + if (query.partition_by && !table->supportsPartitionBy()) + throw Exception(ErrorCodes::NOT_IMPLEMENTED, "PARTITION BY clause is not supported by storage"); + auto table_lock = table->lockForShare(getContext()->getInitialQueryId(), settings.lock_acquire_timeout); auto metadata_snapshot = table->getInMemoryMetadataPtr(); @@ -261,7 +265,6 @@ BlockIO InterpreterInsertQuery::execute() { InterpreterWatchQuery interpreter_watch{ query.watch, getContext() }; res = interpreter_watch.execute(); - res.pipeline.init(Pipe(std::make_shared(std::move(res.in)))); } for (size_t i = 0; i < out_streams_size; i++) diff --git a/src/Interpreters/InterpreterSelectIntersectExceptQuery.cpp b/src/Interpreters/InterpreterSelectIntersectExceptQuery.cpp new file mode 100644 index 00000000000..9c8dda56b44 --- /dev/null +++ b/src/Interpreters/InterpreterSelectIntersectExceptQuery.cpp @@ -0,0 +1,148 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int INTERSECT_OR_EXCEPT_RESULT_STRUCTURES_MISMATCH; + extern const int LOGICAL_ERROR; +} + +static Block getCommonHeader(const Blocks & headers) +{ + size_t num_selects = headers.size(); + Block common_header = headers.front(); + size_t num_columns = common_header.columns(); + + for (size_t query_num = 1; query_num < num_selects; ++query_num) + { + if (headers[query_num].columns() != num_columns) + throw Exception(ErrorCodes::INTERSECT_OR_EXCEPT_RESULT_STRUCTURES_MISMATCH, + "Different number of columns in IntersectExceptQuery elements:\n {} \nand\n {}", + common_header.dumpNames(), headers[query_num].dumpNames()); + } + + std::vector columns(num_selects); + for (size_t column_num = 0; column_num < num_columns; ++column_num) + { + for (size_t i = 0; i < num_selects; ++i) + columns[i] = &headers[i].getByPosition(column_num); + + ColumnWithTypeAndName & result_elem = common_header.getByPosition(column_num); + result_elem = getLeastSuperColumn(columns); + } + + return common_header; +} + +InterpreterSelectIntersectExceptQuery::InterpreterSelectIntersectExceptQuery( + const ASTPtr & query_ptr_, + ContextPtr context_, + const SelectQueryOptions & options_) + : IInterpreterUnionOrSelectQuery(query_ptr_->clone(), context_, options_) +{ + ASTSelectIntersectExceptQuery * ast = query_ptr->as(); + final_operator = ast->final_operator; + + const auto & children = ast->children; + size_t num_children = children.size(); + + /// AST must have been changed by the visitor. + if (final_operator == Operator::UNKNOWN || num_children != 2) + throw Exception(ErrorCodes::LOGICAL_ERROR, + "SelectIntersectExceptyQuery has not been normalized (number of children: {})", + num_children); + + nested_interpreters.resize(num_children); + + for (size_t i = 0; i < num_children; ++i) + nested_interpreters[i] = buildCurrentChildInterpreter(children.at(i)); + + Blocks headers(num_children); + for (size_t query_num = 0; query_num < num_children; ++query_num) + headers[query_num] = nested_interpreters[query_num]->getSampleBlock(); + + result_header = getCommonHeader(headers); +} + +std::unique_ptr +InterpreterSelectIntersectExceptQuery::buildCurrentChildInterpreter(const ASTPtr & ast_ptr_) +{ + if (ast_ptr_->as()) + return std::make_unique(ast_ptr_, context, SelectQueryOptions()); + + if (ast_ptr_->as()) + return std::make_unique(ast_ptr_, context, SelectQueryOptions()); + + if (ast_ptr_->as()) + return std::make_unique(ast_ptr_, context, SelectQueryOptions()); + + throw Exception(ErrorCodes::LOGICAL_ERROR, "Unexpected query: {}", ast_ptr_->getID()); +} + +void InterpreterSelectIntersectExceptQuery::buildQueryPlan(QueryPlan & query_plan) +{ + size_t num_plans = nested_interpreters.size(); + std::vector> plans(num_plans); + DataStreams data_streams(num_plans); + + for (size_t i = 0; i < num_plans; ++i) + { + plans[i] = std::make_unique(); + nested_interpreters[i]->buildQueryPlan(*plans[i]); + + if (!blocksHaveEqualStructure(plans[i]->getCurrentDataStream().header, result_header)) + { + auto actions_dag = ActionsDAG::makeConvertingActions( + plans[i]->getCurrentDataStream().header.getColumnsWithTypeAndName(), + result_header.getColumnsWithTypeAndName(), + ActionsDAG::MatchColumnsMode::Position); + auto converting_step = std::make_unique(plans[i]->getCurrentDataStream(), std::move(actions_dag)); + converting_step->setStepDescription("Conversion before UNION"); + plans[i]->addStep(std::move(converting_step)); + } + + data_streams[i] = plans[i]->getCurrentDataStream(); + } + + auto max_threads = context->getSettingsRef().max_threads; + auto step = std::make_unique(std::move(data_streams), final_operator, max_threads); + query_plan.unitePlans(std::move(step), std::move(plans)); +} + +BlockIO InterpreterSelectIntersectExceptQuery::execute() +{ + BlockIO res; + + QueryPlan query_plan; + buildQueryPlan(query_plan); + + auto pipeline = query_plan.buildQueryPipeline( + QueryPlanOptimizationSettings::fromContext(context), + BuildQueryPipelineSettings::fromContext(context)); + + res.pipeline = std::move(*pipeline); + res.pipeline.addInterpreterContext(context); + + return res; +} + +void InterpreterSelectIntersectExceptQuery::ignoreWithTotals() +{ + for (auto & interpreter : nested_interpreters) + interpreter->ignoreWithTotals(); +} + +} diff --git a/src/Interpreters/InterpreterSelectIntersectExceptQuery.h b/src/Interpreters/InterpreterSelectIntersectExceptQuery.h new file mode 100644 index 00000000000..805565e4c51 --- /dev/null +++ b/src/Interpreters/InterpreterSelectIntersectExceptQuery.h @@ -0,0 +1,46 @@ +#pragma once + +#include +#include +#include +#include +#include + + +namespace DB +{ + +class Context; +class InterpreterSelectQuery; +class QueryPlan; + +class InterpreterSelectIntersectExceptQuery : public IInterpreterUnionOrSelectQuery +{ +using Operator = ASTSelectIntersectExceptQuery::Operator; + +public: + InterpreterSelectIntersectExceptQuery( + const ASTPtr & query_ptr_, + ContextPtr context_, + const SelectQueryOptions & options_); + + BlockIO execute() override; + + Block getSampleBlock() { return result_header; } + + void ignoreWithTotals() override; + +private: + static String getName() { return "SelectIntersectExceptQuery"; } + + std::unique_ptr + buildCurrentChildInterpreter(const ASTPtr & ast_ptr_); + + void buildQueryPlan(QueryPlan & query_plan) override; + + std::vector> nested_interpreters; + + Operator final_operator; +}; + +} diff --git a/src/Interpreters/InterpreterSelectQuery.cpp b/src/Interpreters/InterpreterSelectQuery.cpp index edcef191e73..6f64c83f8bf 100644 --- a/src/Interpreters/InterpreterSelectQuery.cpp +++ b/src/Interpreters/InterpreterSelectQuery.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -878,16 +879,39 @@ static bool hasWithTotalsInAnySubqueryInFromClause(const ASTSelectQuery & query) { if (const auto * ast_union = query_table->as()) { - /// NOTE: Child of subquery can be ASTSelectWithUnionQuery or ASTSelectQuery, - /// and after normalization, the height of the AST tree is at most 2 for (const auto & elem : ast_union->list_of_selects->children) { + /// After normalization for union child node the height of the AST tree is at most 2. if (const auto * child_union = elem->as()) { for (const auto & child_elem : child_union->list_of_selects->children) if (hasWithTotalsInAnySubqueryInFromClause(child_elem->as())) return true; } + /// After normalization in case there are intersect or except nodes, the height of + /// the AST tree can have any depth (each intersect/except adds a level), but the + /// number of children in those nodes is always 2. + else if (elem->as()) + { + std::function traverse_recursively = [&](ASTPtr child_ast) -> bool + { + if (const auto * child = child_ast->as ()) + return hasWithTotalsInAnySubqueryInFromClause(child->as()); + + if (const auto * child = child_ast->as()) + for (const auto & subchild : child->list_of_selects->children) + if (traverse_recursively(subchild)) + return true; + + if (const auto * child = child_ast->as()) + for (const auto & subchild : child->children) + if (traverse_recursively(subchild)) + return true; + return false; + }; + if (traverse_recursively(elem)) + return true; + } else { if (hasWithTotalsInAnySubqueryInFromClause(elem->as())) @@ -2056,7 +2080,9 @@ void InterpreterSelectQuery::executeAggregation(QueryPlan & query_plan, const Ac settings.group_by_two_level_threshold, settings.group_by_two_level_threshold_bytes, settings.max_bytes_before_external_group_by, - settings.empty_result_for_aggregation_by_empty_set || (keys.empty() && query_analyzer->hasConstAggregationKeys()), + settings.empty_result_for_aggregation_by_empty_set + || (settings.empty_result_for_aggregation_by_constant_keys_on_empty_set && keys.empty() + && query_analyzer->hasConstAggregationKeys()), context->getTemporaryVolume(), settings.max_threads, settings.min_free_disk_space_for_temporary_data, diff --git a/src/Interpreters/InterpreterSelectWithUnionQuery.cpp b/src/Interpreters/InterpreterSelectWithUnionQuery.cpp index 3cf4a905d38..b7494a6c965 100644 --- a/src/Interpreters/InterpreterSelectWithUnionQuery.cpp +++ b/src/Interpreters/InterpreterSelectWithUnionQuery.cpp @@ -2,8 +2,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -29,10 +31,12 @@ namespace ErrorCodes } InterpreterSelectWithUnionQuery::InterpreterSelectWithUnionQuery( - const ASTPtr & query_ptr_, ContextPtr context_, const SelectQueryOptions & options_, const Names & required_result_column_names) + const ASTPtr & query_ptr_, ContextPtr context_, + const SelectQueryOptions & options_, const Names & required_result_column_names) : IInterpreterUnionOrSelectQuery(query_ptr_, context_, options_) { ASTSelectWithUnionQuery * ast = query_ptr->as(); + bool require_full_header = ast->hasNonDefaultUnionMode(); const Settings & settings = context->getSettingsRef(); if (options.subquery_depth == 0 && (settings.limit > 0 || settings.offset > 0)) @@ -49,7 +53,7 @@ InterpreterSelectWithUnionQuery::InterpreterSelectWithUnionQuery( nested_interpreters.reserve(num_children); std::vector required_result_column_names_for_other_selects(num_children); - if (!required_result_column_names.empty() && num_children > 1) + if (!require_full_header && !required_result_column_names.empty() && num_children > 1) { /// Result header if there are no filtering by 'required_result_column_names'. /// We use it to determine positions of 'required_result_column_names' in SELECT clause. @@ -131,7 +135,7 @@ InterpreterSelectWithUnionQuery::InterpreterSelectWithUnionQuery( = query_num == 0 ? required_result_column_names : required_result_column_names_for_other_selects[query_num]; nested_interpreters.emplace_back( - buildCurrentChildInterpreter(ast->list_of_selects->children.at(query_num), current_required_result_column_names)); + buildCurrentChildInterpreter(ast->list_of_selects->children.at(query_num), require_full_header ? Names() : current_required_result_column_names)); } /// Determine structure of the result. @@ -208,8 +212,10 @@ InterpreterSelectWithUnionQuery::buildCurrentChildInterpreter(const ASTPtr & ast { if (ast_ptr_->as()) return std::make_unique(ast_ptr_, context, options, current_required_result_column_names); - else + else if (ast_ptr_->as()) return std::make_unique(ast_ptr_, context, options, current_required_result_column_names); + else + return std::make_unique(ast_ptr_, context, options); } InterpreterSelectWithUnionQuery::~InterpreterSelectWithUnionQuery() = default; @@ -225,10 +231,14 @@ Block InterpreterSelectWithUnionQuery::getSampleBlock(const ASTPtr & query_ptr_, } if (is_subquery) + { return cache[key] = InterpreterSelectWithUnionQuery(query_ptr_, context_, SelectQueryOptions().subquery().analyze()).getSampleBlock(); + } else + { return cache[key] = InterpreterSelectWithUnionQuery(query_ptr_, context_, SelectQueryOptions().analyze()).getSampleBlock(); + } } diff --git a/src/Interpreters/InterpreterSelectWithUnionQuery.h b/src/Interpreters/InterpreterSelectWithUnionQuery.h index bd18b8e7907..720632e7be5 100644 --- a/src/Interpreters/InterpreterSelectWithUnionQuery.h +++ b/src/Interpreters/InterpreterSelectWithUnionQuery.h @@ -48,7 +48,6 @@ private: std::unique_ptr buildCurrentChildInterpreter(const ASTPtr & ast_ptr_, const Names & current_required_result_column_names); - }; } diff --git a/src/Interpreters/InterpreterWatchQuery.cpp b/src/Interpreters/InterpreterWatchQuery.cpp index edf0f37c00e..ee96045bbc4 100644 --- a/src/Interpreters/InterpreterWatchQuery.cpp +++ b/src/Interpreters/InterpreterWatchQuery.cpp @@ -71,10 +71,9 @@ BlockIO InterpreterWatchQuery::execute() QueryProcessingStage::Enum from_stage = QueryProcessingStage::FetchColumns; /// Watch storage - streams = storage->watch(required_columns, query_info, getContext(), from_stage, max_block_size, max_streams); + auto pipe = storage->watch(required_columns, query_info, getContext(), from_stage, max_block_size, max_streams); /// Constraints on the result, the quota on the result, and also callback for progress. - if (IBlockInputStream * stream = dynamic_cast(streams[0].get())) { StreamLocalLimits limits; limits.mode = LimitsMode::LIMITS_CURRENT; //-V1048 @@ -82,11 +81,11 @@ BlockIO InterpreterWatchQuery::execute() limits.size_limits.max_bytes = settings.max_result_bytes; limits.size_limits.overflow_mode = settings.result_overflow_mode; - stream->setLimits(limits); - stream->setQuota(getContext()->getQuota()); + pipe.setLimits(limits); + pipe.setQuota(getContext()->getQuota()); } - res.in = streams[0]; + res.pipeline.init(std::move(pipe)); return res; } diff --git a/src/Interpreters/JoinSwitcher.h b/src/Interpreters/JoinSwitcher.h index a89ac6d5d98..e750bc5eed0 100644 --- a/src/Interpreters/JoinSwitcher.h +++ b/src/Interpreters/JoinSwitcher.h @@ -56,9 +56,9 @@ public: return join->alwaysReturnsEmptySet(); } - BlockInputStreamPtr createStreamWithNonJoinedRows(const Block & block, UInt64 max_block_size) const override + std::shared_ptr getNonJoinedBlocks(const Block & block, UInt64 max_block_size) const override { - return join->createStreamWithNonJoinedRows(block, max_block_size); + return join->getNonJoinedBlocks(block, max_block_size); } private: @@ -74,38 +74,4 @@ private: void switchJoin(); }; - -/// Creates NonJoinedBlockInputStream on the first read. Allows to swap join algo before it. -class LazyNonJoinedBlockInputStream : public IBlockInputStream -{ -public: - LazyNonJoinedBlockInputStream(const IJoin & join_, const Block & block, UInt64 max_block_size_) - : join(join_) - , result_sample_block(block) - , max_block_size(max_block_size_) - {} - - String getName() const override { return "LazyNonMergeJoined"; } - Block getHeader() const override { return result_sample_block; } - -protected: - Block readImpl() override - { - if (!stream) - { - stream = join.createStreamWithNonJoinedRows(result_sample_block, max_block_size); - if (!stream) - return {}; - } - - return stream->read(); - } - -private: - BlockInputStreamPtr stream; - const IJoin & join; - Block result_sample_block; - UInt64 max_block_size; -}; - } diff --git a/src/Interpreters/Lemmatizers.cpp b/src/Interpreters/Lemmatizers.cpp index 38cd4c33678..78af43285ef 100644 --- a/src/Interpreters/Lemmatizers.cpp +++ b/src/Interpreters/Lemmatizers.cpp @@ -6,8 +6,8 @@ #if USE_NLP #include -#include -#include +#include // Y_IGNORE +#include // Y_IGNORE #include #include diff --git a/src/Interpreters/MergeJoin.cpp b/src/Interpreters/MergeJoin.cpp index a2c63a4693b..0150bbe1d93 100644 --- a/src/Interpreters/MergeJoin.cpp +++ b/src/Interpreters/MergeJoin.cpp @@ -1,7 +1,8 @@ #include #include -#include +#include + #include #include #include @@ -723,15 +724,7 @@ void MergeJoin::joinBlock(Block & block, ExtraBlockPtr & not_processed) if (needConditionJoinColumn()) block.erase(deriveTempName(mask_column_name_left)); - for (const auto & column_name : lowcard_keys) - { - if (!block.has(column_name)) - continue; - if (auto & col = block.getByName(column_name); !col.type->lowCardinality()) - JoinCommon::changeLowCardinalityInplace(col); - } - - JoinCommon::restoreLowCardinalityInplace(block); + JoinCommon::restoreLowCardinalityInplace(block, lowcard_keys); } template @@ -1035,55 +1028,16 @@ void MergeJoin::initRightTableWriter() } /// Stream from not joined earlier rows of the right table. -class NonMergeJoinedBlockInputStream : private NotJoined, public IBlockInputStream +class NotJoinedMerge final : public NotJoinedBlocks::RightColumnsFiller { public: - NonMergeJoinedBlockInputStream(const MergeJoin & parent_, - const Block & result_sample_block_, - const Names & key_names_right_, - UInt64 max_block_size_) - : NotJoined(*parent_.table_join, - parent_.modifyRightBlock(parent_.right_sample_block), - parent_.right_sample_block, - result_sample_block_, - {}, key_names_right_) - , parent(parent_) - , max_block_size(max_block_size_) + NotJoinedMerge(const MergeJoin & parent_, UInt64 max_block_size_) + : parent(parent_), max_block_size(max_block_size_) {} - String getName() const override { return "NonMergeJoined"; } - Block getHeader() const override { return result_sample_block; } + Block getEmptyBlock() override { return parent.modifyRightBlock(parent.right_sample_block).cloneEmpty(); } -protected: - Block readImpl() override - { - if (parent.getRightBlocksCount()) - return createBlock(); - return {}; - } - -private: - const MergeJoin & parent; - size_t max_block_size; - size_t block_number = 0; - - Block createBlock() - { - MutableColumns columns_right = saved_block_sample.cloneEmptyColumns(); - - size_t rows_added = fillColumns(columns_right); - if (!rows_added) - return {}; - - Block res = result_sample_block.cloneEmpty(); - addLeftColumns(res, rows_added); - addRightColumns(res, columns_right); - copySameKeys(res); - correctLowcardAndNullability(res); - return res; - } - - size_t fillColumns(MutableColumns & columns_right) + size_t fillColumns(MutableColumns & columns_right) override { const RowBitmaps & bitmaps = *parent.used_rows_bitmap; size_t rows_added = 0; @@ -1127,14 +1081,23 @@ private: return rows_added; } + +private: + const MergeJoin & parent; + size_t max_block_size; + size_t block_number = 0; }; -BlockInputStreamPtr MergeJoin::createStreamWithNonJoinedRows(const Block & result_sample_block, UInt64 max_block_size) const +std::shared_ptr MergeJoin::getNonJoinedBlocks(const Block & result_sample_block, UInt64 max_block_size) const { if (table_join->strictness() == ASTTableJoin::Strictness::All && (is_right || is_full)) - return std::make_shared(*this, result_sample_block, key_names_right, max_block_size); - return {}; + { + size_t left_columns_count = result_sample_block.columns() - right_columns_to_add.columns(); + auto non_joined = std::make_unique(*this, max_block_size); + return std::make_shared(std::move(non_joined), result_sample_block, left_columns_count, table_join->leftToRightKeyRemap()); + } + return nullptr; } bool MergeJoin::needConditionJoinColumn() const diff --git a/src/Interpreters/MergeJoin.h b/src/Interpreters/MergeJoin.h index 844c730de4f..9e765041846 100644 --- a/src/Interpreters/MergeJoin.h +++ b/src/Interpreters/MergeJoin.h @@ -35,10 +35,10 @@ public: /// Has to be called only after setTotals()/mergeRightBlocks() bool alwaysReturnsEmptySet() const override { return (is_right || is_inner) && min_max_right_blocks.empty(); } - BlockInputStreamPtr createStreamWithNonJoinedRows(const Block & result_sample_block, UInt64 max_block_size) const override; + std::shared_ptr getNonJoinedBlocks(const Block & result_sample_block, UInt64 max_block_size) const override; private: - friend class NonMergeJoinedBlockInputStream; + friend class NotJoinedMerge; struct NotProcessed : public ExtraBlock { @@ -78,6 +78,7 @@ private: SortDescription right_merge_description; Block right_sample_block; Block right_table_keys; + /// Columns from right side of join, both key and additional Block right_columns_to_add; SortedBlocksWriter::Blocks right_blocks; diff --git a/src/Interpreters/MutationsInterpreter.cpp b/src/Interpreters/MutationsInterpreter.cpp index fe0594bb58f..83af913c7ab 100644 --- a/src/Interpreters/MutationsInterpreter.cpp +++ b/src/Interpreters/MutationsInterpreter.cpp @@ -156,7 +156,7 @@ ColumnDependencies getAllColumnDependencies(const StorageMetadataPtr & metadata_ ColumnDependencies dependencies; while (!new_updated_columns.empty()) { - auto new_dependencies = metadata_snapshot->getColumnDependencies(new_updated_columns); + auto new_dependencies = metadata_snapshot->getColumnDependencies(new_updated_columns, true); new_updated_columns.clear(); for (const auto & dependency : new_dependencies) { @@ -303,6 +303,15 @@ static NameSet getKeyColumns(const StoragePtr & storage, const StorageMetadataPt return key_columns; } +static bool materializeTTLRecalculateOnly(const StoragePtr & storage) +{ + auto storage_from_merge_tree_data_part = std::dynamic_pointer_cast(storage); + if (!storage_from_merge_tree_data_part) + return false; + + return storage_from_merge_tree_data_part->materializeTTLRecalculateOnly(); +} + static void validateUpdateColumns( const StoragePtr & storage, const StorageMetadataPtr & metadata_snapshot, const NameSet & updated_columns, @@ -394,8 +403,13 @@ ASTPtr MutationsInterpreter::prepare(bool dry_run) NamesAndTypesList all_columns = columns_desc.getAllPhysical(); NameSet updated_columns; + bool materialize_ttl_recalculate_only = materializeTTLRecalculateOnly(storage); for (const MutationCommand & command : commands) { + if (command.type == MutationCommand::Type::UPDATE + || command.type == MutationCommand::Type::DELETE) + materialize_ttl_recalculate_only = false; + for (const auto & kv : command.column_to_update_expression) { updated_columns.insert(kv.first); @@ -503,10 +517,10 @@ ASTPtr MutationsInterpreter::prepare(bool dry_run) } } - auto updated_column = makeASTFunction("CAST", + auto updated_column = makeASTFunction("_CAST", makeASTFunction("if", condition, - makeASTFunction("CAST", + makeASTFunction("_CAST", update_expr->clone(), type_literal), std::make_shared(column)), @@ -569,7 +583,18 @@ ASTPtr MutationsInterpreter::prepare(bool dry_run) else if (command.type == MutationCommand::MATERIALIZE_TTL) { mutation_kind.set(MutationKind::MUTATE_OTHER); - if (metadata_snapshot->hasRowsTTL()) + if (materialize_ttl_recalculate_only) + { + // just recalculate ttl_infos without remove expired data + auto all_columns_vec = all_columns.getNames(); + auto new_dependencies = metadata_snapshot->getColumnDependencies(NameSet(all_columns_vec.begin(), all_columns_vec.end()), false); + for (const auto & dependency : new_dependencies) + { + if (dependency.kind == ColumnDependency::TTL_EXPRESSION) + dependencies.insert(dependency); + } + } + else if (metadata_snapshot->hasRowsTTL()) { for (const auto & column : all_columns) dependencies.emplace(column.name, ColumnDependency::TTL_TARGET); @@ -594,19 +619,19 @@ ASTPtr MutationsInterpreter::prepare(bool dry_run) } /// Recalc only skip indices and projections of columns which could be updated by TTL. - auto new_dependencies = metadata_snapshot->getColumnDependencies(new_updated_columns); + auto new_dependencies = metadata_snapshot->getColumnDependencies(new_updated_columns, true); for (const auto & dependency : new_dependencies) { if (dependency.kind == ColumnDependency::SKIP_INDEX || dependency.kind == ColumnDependency::PROJECTION) dependencies.insert(dependency); } + } - if (dependencies.empty()) - { - /// Very rare case. It can happen if we have only one MOVE TTL with constant expression. - /// But we still have to read at least one column. - dependencies.emplace(all_columns.front().name, ColumnDependency::TTL_EXPRESSION); - } + if (dependencies.empty()) + { + /// Very rare case. It can happen if we have only one MOVE TTL with constant expression. + /// But we still have to read at least one column. + dependencies.emplace(all_columns.front().name, ColumnDependency::TTL_EXPRESSION); } } else if (command.type == MutationCommand::READ_COLUMN) @@ -920,9 +945,10 @@ BlockInputStreamPtr MutationsInterpreter::execute() return result_stream; } -const Block & MutationsInterpreter::getUpdatedHeader() const +Block MutationsInterpreter::getUpdatedHeader() const { - return *updated_header; + // If it's an index/projection materialization, we don't write any data columns, thus empty header is used + return mutation_kind.mutation_kind == MutationKind::MUTATE_INDEX_PROJECTION ? Block{} : *updated_header; } const ColumnDependencies & MutationsInterpreter::getColumnDependencies() const diff --git a/src/Interpreters/MutationsInterpreter.h b/src/Interpreters/MutationsInterpreter.h index c9a589e6b6d..4f8960ae8f7 100644 --- a/src/Interpreters/MutationsInterpreter.h +++ b/src/Interpreters/MutationsInterpreter.h @@ -53,7 +53,7 @@ public: BlockInputStreamPtr execute(); /// Only changed columns. - const Block & getUpdatedHeader() const; + Block getUpdatedHeader() const; const ColumnDependencies & getColumnDependencies() const; diff --git a/src/Interpreters/NormalizeSelectWithUnionQueryVisitor.cpp b/src/Interpreters/NormalizeSelectWithUnionQueryVisitor.cpp index 798c2f2e376..f2818bce0bf 100644 --- a/src/Interpreters/NormalizeSelectWithUnionQueryVisitor.cpp +++ b/src/Interpreters/NormalizeSelectWithUnionQueryVisitor.cpp @@ -1,5 +1,6 @@ #include #include +#include #include namespace DB @@ -8,13 +9,14 @@ namespace DB namespace ErrorCodes { extern const int EXPECTED_ALL_OR_DISTINCT; + extern const int LOGICAL_ERROR; } -void NormalizeSelectWithUnionQueryMatcher::getSelectsFromUnionListNode(ASTPtr & ast_select, ASTs & selects) +void NormalizeSelectWithUnionQueryMatcher::getSelectsFromUnionListNode(ASTPtr ast_select, ASTs & selects) { - if (auto * inner_union = ast_select->as()) + if (const auto * inner_union = ast_select->as()) { - for (auto & child : inner_union->list_of_selects->children) + for (const auto & child : inner_union->list_of_selects->children) getSelectsFromUnionListNode(child, selects); return; @@ -33,11 +35,28 @@ void NormalizeSelectWithUnionQueryMatcher::visit(ASTSelectWithUnionQuery & ast, { auto & union_modes = ast.list_of_modes; ASTs selects; - auto & select_list = ast.list_of_selects->children; + const auto & select_list = ast.list_of_selects->children; + + if (select_list.empty()) + throw Exception(ErrorCodes::LOGICAL_ERROR, "Got empty list of selects for ASTSelectWithUnionQuery"); + + /// Since nodes are traversed from bottom to top, we can also collect union modes from children up to parents. + ASTSelectWithUnionQuery::UnionModesSet current_set_of_modes; + bool distinct_found = false; int i; for (i = union_modes.size() - 1; i >= 0; --i) { + current_set_of_modes.insert(union_modes[i]); + if (const auto * union_ast = typeid_cast(select_list[i + 1].get())) + { + const auto & current_select_modes = union_ast->set_of_modes; + current_set_of_modes.insert(current_select_modes.begin(), current_select_modes.end()); + } + + if (distinct_found) + continue; + /// Rewrite UNION Mode if (union_modes[i] == ASTSelectWithUnionQuery::Mode::Unspecified) { @@ -79,12 +98,18 @@ void NormalizeSelectWithUnionQueryMatcher::visit(ASTSelectWithUnionQuery & ast, distinct_list->union_mode = ASTSelectWithUnionQuery::Mode::DISTINCT; distinct_list->is_normalized = true; selects.push_back(std::move(distinct_list)); - break; + distinct_found = true; } } + if (const auto * union_ast = typeid_cast(select_list[0].get())) + { + const auto & current_select_modes = union_ast->set_of_modes; + current_set_of_modes.insert(current_select_modes.begin(), current_select_modes.end()); + } + /// No UNION DISTINCT or only one child in select_list - if (i == -1) + if (!distinct_found) { if (auto * inner_union = select_list[0]->as(); inner_union && inner_union->union_mode == ASTSelectWithUnionQuery::Mode::ALL) @@ -102,6 +127,7 @@ void NormalizeSelectWithUnionQueryMatcher::visit(ASTSelectWithUnionQuery & ast, if (selects.size() == 1 && selects[0]->as()) { ast = *(selects[0]->as()); + ast.set_of_modes = std::move(current_set_of_modes); return; } @@ -110,6 +136,7 @@ void NormalizeSelectWithUnionQueryMatcher::visit(ASTSelectWithUnionQuery & ast, ast.is_normalized = true; ast.union_mode = ASTSelectWithUnionQuery::Mode::ALL; + ast.set_of_modes = std::move(current_set_of_modes); ast.list_of_selects->children = std::move(selects); } diff --git a/src/Interpreters/NormalizeSelectWithUnionQueryVisitor.h b/src/Interpreters/NormalizeSelectWithUnionQueryVisitor.h index cec2e4265e2..3e6124dc2ce 100644 --- a/src/Interpreters/NormalizeSelectWithUnionQueryVisitor.h +++ b/src/Interpreters/NormalizeSelectWithUnionQueryVisitor.h @@ -21,7 +21,7 @@ public: const UnionMode & union_default_mode; }; - static void getSelectsFromUnionListNode(ASTPtr & ast_select, ASTs & selects); + static void getSelectsFromUnionListNode(ASTPtr ast_select, ASTs & selects); static void visit(ASTPtr & ast, Data &); static void visit(ASTSelectWithUnionQuery &, Data &); diff --git a/src/Interpreters/OptimizeIfWithConstantConditionVisitor.cpp b/src/Interpreters/OptimizeIfWithConstantConditionVisitor.cpp index a8e2d371e05..a9814ce50f5 100644 --- a/src/Interpreters/OptimizeIfWithConstantConditionVisitor.cpp +++ b/src/Interpreters/OptimizeIfWithConstantConditionVisitor.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -29,7 +30,7 @@ static bool tryExtractConstValueFromCondition(const ASTPtr & condition, bool & v /// cast of numeric constant in condition to UInt8 if (const auto * function = condition->as()) { - if (function->name == "CAST") + if (isFunctionCast(function)) { if (const auto * expr_list = function->arguments->as()) { diff --git a/src/Interpreters/QueryNormalizer.cpp b/src/Interpreters/QueryNormalizer.cpp index ea61ade2b49..7c820622c37 100644 --- a/src/Interpreters/QueryNormalizer.cpp +++ b/src/Interpreters/QueryNormalizer.cpp @@ -256,6 +256,9 @@ void QueryNormalizer::visit(ASTPtr & ast, Data & data) visit(*node_select, ast, data); else if (auto * node_param = ast->as()) throw Exception("Query parameter " + backQuote(node_param->name) + " was not set", ErrorCodes::UNKNOWN_QUERY_PARAMETER); + else if (auto * node_function = ast->as()) + if (node_function->parameters) + visit(node_function->parameters, data); /// If we replace the root of the subtree, we will be called again for the new root, in case the alias is replaced by an alias. if (ast.get() != initial_ast.get()) diff --git a/src/Interpreters/RequiredSourceColumnsVisitor.cpp b/src/Interpreters/RequiredSourceColumnsVisitor.cpp index 2f2a68656bc..21ec94a6917 100644 --- a/src/Interpreters/RequiredSourceColumnsVisitor.cpp +++ b/src/Interpreters/RequiredSourceColumnsVisitor.cpp @@ -123,6 +123,17 @@ void RequiredSourceColumnsMatcher::visit(const ASTSelectQuery & select, const AS data.addColumnAliasIfAny(*node); } + if (const auto & with = select.with()) + { + for (auto & node : with->children) + { + if (const auto * identifier = node->as()) + data.addColumnIdentifier(*identifier); + else + data.addColumnAliasIfAny(*node); + } + } + std::vector out; for (const auto & node : select.children) { diff --git a/src/Interpreters/SelectIntersectExceptQueryVisitor.cpp b/src/Interpreters/SelectIntersectExceptQueryVisitor.cpp new file mode 100644 index 00000000000..e26c4371591 --- /dev/null +++ b/src/Interpreters/SelectIntersectExceptQueryVisitor.cpp @@ -0,0 +1,129 @@ +#include +#include +#include + + +namespace DB +{ +namespace ErrorCodes +{ + extern const int LOGICAL_ERROR; +} + +/* + * Note: there is a difference between intersect and except behaviour. + * `intersect` is supposed to be a part of the last SelectQuery, i.e. the sequence with no parenthesis: + * select 1 union all select 2 except select 1 intersect 2 except select 2 union distinct select 5; + * is interpreted as: + * select 1 union all select 2 except (select 1 intersect 2) except select 2 union distinct select 5; + * Whereas `except` is applied to all left union part like: + * (((select 1 union all select 2) except (select 1 intersect 2)) except select 2) union distinct select 5; +**/ + +void SelectIntersectExceptQueryMatcher::visit(ASTPtr & ast, Data & data) +{ + if (auto * select_union = ast->as()) + visit(*select_union, data); +} + +void SelectIntersectExceptQueryMatcher::visit(ASTSelectWithUnionQuery & ast, Data &) +{ + const auto & union_modes = ast.list_of_modes; + + if (union_modes.empty()) + return; + + auto selects = std::move(ast.list_of_selects->children); + + if (union_modes.size() + 1 != selects.size()) + throw Exception(ErrorCodes::LOGICAL_ERROR, "Incorrect ASTSelectWithUnionQuery (modes: {}, selects: {})", + union_modes.size(), selects.size()); + + std::reverse(selects.begin(), selects.end()); + + ASTs children = {selects.back()}; + selects.pop_back(); + ASTSelectWithUnionQuery::UnionModes modes; + + for (const auto & mode : union_modes) + { + switch (mode) + { + case ASTSelectWithUnionQuery::Mode::EXCEPT: + { + auto left = std::make_shared(); + left->union_mode = ASTSelectWithUnionQuery::Mode::ALL; + + left->list_of_selects = std::make_shared(); + left->children.push_back(left->list_of_selects); + left->list_of_selects->children = std::move(children); + + left->list_of_modes = std::move(modes); + modes = {}; + + auto right = selects.back(); + selects.pop_back(); + + auto except_node = std::make_shared(); + except_node->final_operator = ASTSelectIntersectExceptQuery::Operator::EXCEPT; + except_node->children = {left, right}; + + children = {except_node}; + break; + } + case ASTSelectWithUnionQuery::Mode::INTERSECT: + { + bool from_except = false; + const auto * except_ast = typeid_cast(children.back().get()); + if (except_ast && (except_ast->final_operator == ASTSelectIntersectExceptQuery::Operator::EXCEPT)) + from_except = true; + + ASTPtr left; + if (from_except) + { + left = std::move(children.back()->children[1]); + } + else + { + left = children.back(); + children.pop_back(); + } + + auto right = selects.back(); + selects.pop_back(); + + auto intersect_node = std::make_shared(); + intersect_node->final_operator = ASTSelectIntersectExceptQuery::Operator::INTERSECT; + intersect_node->children = {left, right}; + + if (from_except) + children.back()->children[1] = std::move(intersect_node); + else + children.push_back(std::move(intersect_node)); + + break; + } + default: + { + auto right = selects.back(); + selects.pop_back(); + children.emplace_back(std::move(right)); + modes.push_back(mode); + break; + } + } + } + + if (!selects.empty()) + { + auto right = selects.back(); + selects.pop_back(); + children.emplace_back(std::move(right)); + } + + ast.union_mode = ASTSelectWithUnionQuery::Mode::Unspecified; + ast.list_of_selects->children = std::move(children); + ast.list_of_modes = std::move(modes); +} + +} diff --git a/src/Interpreters/SelectIntersectExceptQueryVisitor.h b/src/Interpreters/SelectIntersectExceptQueryVisitor.h new file mode 100644 index 00000000000..07a6ad606a1 --- /dev/null +++ b/src/Interpreters/SelectIntersectExceptQueryVisitor.h @@ -0,0 +1,31 @@ +#pragma once + +#include + +#include +#include + +#include +#include + + +namespace DB +{ + +class ASTFunction; + +class SelectIntersectExceptQueryMatcher +{ +public: + struct Data {}; + + static bool needChildVisit(const ASTPtr &, const ASTPtr &) { return true; } + + static void visit(ASTPtr & ast, Data &); + static void visit(ASTSelectWithUnionQuery &, Data &); +}; + +/// Visit children first. +using SelectIntersectExceptQueryVisitor + = InDepthNodeVisitor; +} diff --git a/src/Interpreters/Session.cpp b/src/Interpreters/Session.cpp new file mode 100644 index 00000000000..58a0407be00 --- /dev/null +++ b/src/Interpreters/Session.cpp @@ -0,0 +1,431 @@ +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int LOGICAL_ERROR; + extern const int SESSION_NOT_FOUND; + extern const int SESSION_IS_LOCKED; +} + + +class NamedSessionsStorage; + +/// User ID and session identifier. Named sessions are local to users. +using NamedSessionKey = std::pair; + +/// Named sessions. The user could specify session identifier to reuse settings and temporary tables in subsequent requests. +struct NamedSessionData +{ + NamedSessionKey key; + UInt64 close_cycle = 0; + ContextMutablePtr context; + std::chrono::steady_clock::duration timeout; + NamedSessionsStorage & parent; + + NamedSessionData(NamedSessionKey key_, ContextPtr context_, std::chrono::steady_clock::duration timeout_, NamedSessionsStorage & parent_) + : key(std::move(key_)), context(Context::createCopy(context_)), timeout(timeout_), parent(parent_) + {} + + void release(); +}; + +class NamedSessionsStorage +{ +public: + using Key = NamedSessionKey; + + static NamedSessionsStorage & instance() + { + static NamedSessionsStorage the_instance; + return the_instance; + } + + ~NamedSessionsStorage() + { + try + { + shutdown(); + } + catch (...) + { + tryLogCurrentException(__PRETTY_FUNCTION__); + } + } + + void shutdown() + { + { + std::lock_guard lock{mutex}; + sessions.clear(); + if (!thread.joinable()) + return; + quit = true; + } + + cond.notify_one(); + thread.join(); + } + + /// Find existing session or create a new. + std::pair, bool> acquireSession( + const ContextPtr & global_context, + const UUID & user_id, + const String & session_id, + std::chrono::steady_clock::duration timeout, + bool throw_if_not_found) + { + std::unique_lock lock(mutex); + + Key key{user_id, session_id}; + + auto it = sessions.find(key); + if (it == sessions.end()) + { + if (throw_if_not_found) + throw Exception("Session not found.", ErrorCodes::SESSION_NOT_FOUND); + + /// Create a new session from current context. + auto context = Context::createCopy(global_context); + it = sessions.insert(std::make_pair(key, std::make_shared(key, context, timeout, *this))).first; + const auto & session = it->second; + + if (!thread.joinable()) + thread = ThreadFromGlobalPool{&NamedSessionsStorage::cleanThread, this}; + + return {session, true}; + } + else + { + /// Use existing session. + const auto & session = it->second; + + if (!session.unique()) + throw Exception("Session is locked by a concurrent client.", ErrorCodes::SESSION_IS_LOCKED); + return {session, false}; + } + } + + void releaseSession(NamedSessionData & session) + { + std::unique_lock lock(mutex); + scheduleCloseSession(session, lock); + } + +private: + class SessionKeyHash + { + public: + size_t operator()(const Key & key) const + { + SipHash hash; + hash.update(key.first); + hash.update(key.second); + return hash.get64(); + } + }; + + /// TODO it's very complicated. Make simple std::map with time_t or boost::multi_index. + using Container = std::unordered_map, SessionKeyHash>; + using CloseTimes = std::deque>; + Container sessions; + CloseTimes close_times; + std::chrono::steady_clock::duration close_interval = std::chrono::seconds(1); + std::chrono::steady_clock::time_point close_cycle_time = std::chrono::steady_clock::now(); + UInt64 close_cycle = 0; + + void scheduleCloseSession(NamedSessionData & session, std::unique_lock &) + { + /// Push it on a queue of sessions to close, on a position corresponding to the timeout. + /// (timeout is measured from current moment of time) + + const UInt64 close_index = session.timeout / close_interval + 1; + const auto new_close_cycle = close_cycle + close_index; + + if (session.close_cycle != new_close_cycle) + { + session.close_cycle = new_close_cycle; + if (close_times.size() < close_index + 1) + close_times.resize(close_index + 1); + close_times[close_index].emplace_back(session.key); + } + } + + void cleanThread() + { + setThreadName("SessionCleaner"); + std::unique_lock lock{mutex}; + while (!quit) + { + auto interval = closeSessions(lock); + if (cond.wait_for(lock, interval, [this]() -> bool { return quit; })) + break; + } + } + + /// Close sessions, that has been expired. Returns how long to wait for next session to be expired, if no new sessions will be added. + std::chrono::steady_clock::duration closeSessions(std::unique_lock & lock) + { + const auto now = std::chrono::steady_clock::now(); + + /// The time to close the next session did not come + if (now < close_cycle_time) + return close_cycle_time - now; /// Will sleep until it comes. + + const auto current_cycle = close_cycle; + + ++close_cycle; + close_cycle_time = now + close_interval; + + if (close_times.empty()) + return close_interval; + + auto & sessions_to_close = close_times.front(); + + for (const auto & key : sessions_to_close) + { + const auto session = sessions.find(key); + + if (session != sessions.end() && session->second->close_cycle <= current_cycle) + { + if (!session->second.unique()) + { + /// Skip but move it to close on the next cycle. + session->second->timeout = std::chrono::steady_clock::duration{0}; + scheduleCloseSession(*session->second, lock); + } + else + sessions.erase(session); + } + } + + close_times.pop_front(); + return close_interval; + } + + std::mutex mutex; + std::condition_variable cond; + ThreadFromGlobalPool thread; + bool quit = false; +}; + + +void NamedSessionData::release() +{ + parent.releaseSession(*this); +} + +void Session::shutdownNamedSessions() +{ + NamedSessionsStorage::instance().shutdown(); +} + + +Session::Session(const ContextPtr & global_context_, ClientInfo::Interface interface_) + : global_context(global_context_) +{ + prepared_client_info.emplace(); + prepared_client_info->interface = interface_; +} + +Session::Session(Session &&) = default; + +Session::~Session() +{ + /// Early release a NamedSessionData. + if (named_session) + named_session->release(); +} + +Authentication::Type Session::getAuthenticationType(const String & user_name) const +{ + return global_context->getAccessControlManager().read(user_name)->authentication.getType(); +} + +Authentication::Digest Session::getPasswordDoubleSHA1(const String & user_name) const +{ + return global_context->getAccessControlManager().read(user_name)->authentication.getPasswordDoubleSHA1(); +} + +void Session::authenticate(const String & user_name, const String & password, const Poco::Net::SocketAddress & address) +{ + authenticate(BasicCredentials{user_name, password}, address); +} + +void Session::authenticate(const Credentials & credentials_, const Poco::Net::SocketAddress & address_) +{ + if (session_context) + throw Exception("If there is a session context it must be created after authentication", ErrorCodes::LOGICAL_ERROR); + + auto address = address_; + if ((address == Poco::Net::SocketAddress{}) && (prepared_client_info->interface == ClientInfo::Interface::LOCAL)) + address = Poco::Net::SocketAddress{"127.0.0.1", 0}; + + user_id = global_context->getAccessControlManager().login(credentials_, address.host()); + + prepared_client_info->current_user = credentials_.getUserName(); + prepared_client_info->current_address = address; + +#if defined(ARCADIA_BUILD) + /// This is harmful field that is used only in foreign "Arcadia" build. + if (const auto * basic_credentials = dynamic_cast(&credentials_)) + session_client_info->current_password = basic_credentials->getPassword(); +#endif +} + +ClientInfo & Session::getClientInfo() +{ + return session_context ? session_context->getClientInfo() : *prepared_client_info; +} + +const ClientInfo & Session::getClientInfo() const +{ + return session_context ? session_context->getClientInfo() : *prepared_client_info; +} + +ContextMutablePtr Session::makeSessionContext() +{ + if (session_context) + throw Exception("Session context already exists", ErrorCodes::LOGICAL_ERROR); + if (query_context_created) + throw Exception("Session context must be created before any query context", ErrorCodes::LOGICAL_ERROR); + + /// Make a new session context. + ContextMutablePtr new_session_context; + new_session_context = Context::createCopy(global_context); + new_session_context->makeSessionContext(); + + /// Copy prepared client info to the new session context. + auto & res_client_info = new_session_context->getClientInfo(); + res_client_info = std::move(prepared_client_info).value(); + prepared_client_info.reset(); + + /// Set user information for the new context: current profiles, roles, access rights. + if (user_id) + new_session_context->setUser(*user_id); + + /// Session context is ready. + session_context = new_session_context; + user = session_context->getUser(); + + return session_context; +} + +ContextMutablePtr Session::makeSessionContext(const String & session_id_, std::chrono::steady_clock::duration timeout_, bool session_check_) +{ + if (session_context) + throw Exception("Session context already exists", ErrorCodes::LOGICAL_ERROR); + if (query_context_created) + throw Exception("Session context must be created before any query context", ErrorCodes::LOGICAL_ERROR); + + /// Make a new session context OR + /// if the `session_id` and `user_id` were used before then just get a previously created session context. + std::shared_ptr new_named_session; + bool new_named_session_created = false; + std::tie(new_named_session, new_named_session_created) + = NamedSessionsStorage::instance().acquireSession(global_context, user_id.value_or(UUID{}), session_id_, timeout_, session_check_); + + auto new_session_context = new_named_session->context; + new_session_context->makeSessionContext(); + + /// Copy prepared client info to the session context, no matter it's been just created or not. + /// If we continue using a previously created session context found by session ID + /// it's necessary to replace the client info in it anyway, because it contains actual connection information (client address, etc.) + auto & res_client_info = new_session_context->getClientInfo(); + res_client_info = std::move(prepared_client_info).value(); + prepared_client_info.reset(); + + /// Set user information for the new context: current profiles, roles, access rights. + if (user_id && !new_session_context->getUser()) + new_session_context->setUser(*user_id); + + /// Session context is ready. + session_context = new_session_context; + session_id = session_id_; + named_session = new_named_session; + named_session_created = new_named_session_created; + user = session_context->getUser(); + + return session_context; +} + +ContextMutablePtr Session::makeQueryContext(const ClientInfo & query_client_info) const +{ + return makeQueryContextImpl(&query_client_info, nullptr); +} + +ContextMutablePtr Session::makeQueryContext(ClientInfo && query_client_info) const +{ + return makeQueryContextImpl(nullptr, &query_client_info); +} + +ContextMutablePtr Session::makeQueryContextImpl(const ClientInfo * client_info_to_copy, ClientInfo * client_info_to_move) const +{ + /// We can create a query context either from a session context or from a global context. + bool from_session_context = static_cast(session_context); + + /// Create a new query context. + ContextMutablePtr query_context = Context::createCopy(from_session_context ? session_context : global_context); + query_context->makeQueryContext(); + + /// Copy the specified client info to the new query context. + auto & res_client_info = query_context->getClientInfo(); + if (client_info_to_move) + res_client_info = std::move(*client_info_to_move); + else if (client_info_to_copy && (client_info_to_copy != &getClientInfo())) + res_client_info = *client_info_to_copy; + + /// Copy current user's name and address if it was authenticated after query_client_info was initialized. + if (prepared_client_info && !prepared_client_info->current_user.empty()) + { + res_client_info.current_user = prepared_client_info->current_user; + res_client_info.current_address = prepared_client_info->current_address; +#if defined(ARCADIA_BUILD) + res_client_info.current_password = prepared_client_info->current_password; +#endif + } + + /// Set parameters of initial query. + if (res_client_info.query_kind == ClientInfo::QueryKind::NO_QUERY) + res_client_info.query_kind = ClientInfo::QueryKind::INITIAL_QUERY; + + if (res_client_info.query_kind == ClientInfo::QueryKind::INITIAL_QUERY) + { + res_client_info.initial_user = res_client_info.current_user; + res_client_info.initial_address = res_client_info.current_address; + } + + /// Sets that row policies from the initial user should be used too. + query_context->setInitialRowPolicy(); + + /// Set user information for the new context: current profiles, roles, access rights. + if (user_id && !query_context->getUser()) + query_context->setUser(*user_id); + + /// Query context is ready. + query_context_created = true; + user = query_context->getUser(); + + return query_context; +} + +} diff --git a/src/Interpreters/Session.h b/src/Interpreters/Session.h new file mode 100644 index 00000000000..d104e250099 --- /dev/null +++ b/src/Interpreters/Session.h @@ -0,0 +1,87 @@ +#pragma once + +#include +#include +#include +#include + +#include +#include +#include + +namespace Poco::Net { class SocketAddress; } + +namespace DB +{ +class Credentials; +class Authentication; +struct NamedSessionData; +class NamedSessionsStorage; +struct User; +using UserPtr = std::shared_ptr; + +/** Represents user-session from the server perspective, + * basically it is just a smaller subset of Context API, simplifies Context management. + * + * Holds session context, facilitates acquisition of NamedSession and proper creation of query contexts. + */ +class Session +{ +public: + /// Stops using named sessions. The method must be called at the server shutdown. + static void shutdownNamedSessions(); + + Session(const ContextPtr & global_context_, ClientInfo::Interface interface_); + Session(Session &&); + ~Session(); + + Session(const Session &) = delete; + Session& operator=(const Session &) = delete; + + /// Provides information about the authentication type of a specified user. + Authentication::Type getAuthenticationType(const String & user_name) const; + Authentication::Digest getPasswordDoubleSHA1(const String & user_name) const; + + /// Sets the current user, checks the credentials and that the specified address is allowed to connect from. + /// The function throws an exception if there is no such user or password is wrong. + void authenticate(const String & user_name, const String & password, const Poco::Net::SocketAddress & address); + void authenticate(const Credentials & credentials_, const Poco::Net::SocketAddress & address_); + + /// Returns a reference to session ClientInfo. + ClientInfo & getClientInfo(); + const ClientInfo & getClientInfo() const; + + /// Makes a session context, can be used one or zero times. + /// The function also assigns an user to this context. + ContextMutablePtr makeSessionContext(); + ContextMutablePtr makeSessionContext(const String & session_id_, std::chrono::steady_clock::duration timeout_, bool session_check_); + ContextMutablePtr sessionContext() { return session_context; } + ContextPtr sessionContext() const { return session_context; } + + /// Makes a query context, can be used multiple times, with or without makeSession() called earlier. + /// The query context will be created from a copy of a session context if it exists, or from a copy of + /// a global context otherwise. In the latter case the function also assigns an user to this context. + ContextMutablePtr makeQueryContext() const { return makeQueryContext(getClientInfo()); } + ContextMutablePtr makeQueryContext(const ClientInfo & query_client_info) const; + ContextMutablePtr makeQueryContext(ClientInfo && query_client_info) const; + +private: + ContextMutablePtr makeQueryContextImpl(const ClientInfo * client_info_to_copy, ClientInfo * client_info_to_move) const; + + const ContextPtr global_context; + + /// ClientInfo that will be copied to a session context when it's created. + std::optional prepared_client_info; + + mutable UserPtr user; + std::optional user_id; + + ContextMutablePtr session_context; + mutable bool query_context_created = false; + + String session_id; + std::shared_ptr named_session; + bool named_session_created = false; +}; + +} diff --git a/src/Interpreters/Set.cpp b/src/Interpreters/Set.cpp index ff502b499cd..5ab59ba3f07 100644 --- a/src/Interpreters/Set.cpp +++ b/src/Interpreters/Set.cpp @@ -99,14 +99,14 @@ void NO_INLINE Set::insertFromBlockImplCase( } -void Set::setHeader(const Block & header) +void Set::setHeader(const ColumnsWithTypeAndName & header) { std::unique_lock lock(rwlock); if (!data.empty()) return; - keys_size = header.columns(); + keys_size = header.size(); ColumnRawPtrs key_columns; key_columns.reserve(keys_size); data_types.reserve(keys_size); @@ -118,10 +118,10 @@ void Set::setHeader(const Block & header) /// Remember the columns we will work with for (size_t i = 0; i < keys_size; ++i) { - materialized_columns.emplace_back(header.safeGetByPosition(i).column->convertToFullColumnIfConst()); + materialized_columns.emplace_back(header.at(i).column->convertToFullColumnIfConst()); key_columns.emplace_back(materialized_columns.back().get()); - data_types.emplace_back(header.safeGetByPosition(i).type); - set_elements_types.emplace_back(header.safeGetByPosition(i).type); + data_types.emplace_back(header.at(i).type); + set_elements_types.emplace_back(header.at(i).type); /// Convert low cardinality column to full. if (const auto * low_cardinality_type = typeid_cast(data_types.back().get())) @@ -161,7 +161,7 @@ void Set::setHeader(const Block & header) } -bool Set::insertFromBlock(const Block & block) +bool Set::insertFromBlock(const ColumnsWithTypeAndName & columns) { std::unique_lock lock(rwlock); @@ -177,11 +177,11 @@ bool Set::insertFromBlock(const Block & block) /// Remember the columns we will work with for (size_t i = 0; i < keys_size; ++i) { - materialized_columns.emplace_back(block.safeGetByPosition(i).column->convertToFullColumnIfConst()->convertToFullColumnIfLowCardinality()); + materialized_columns.emplace_back(columns.at(i).column->convertToFullColumnIfConst()->convertToFullColumnIfLowCardinality()); key_columns.emplace_back(materialized_columns.back().get()); } - size_t rows = block.rows(); + size_t rows = columns.at(0).column->size(); /// We will insert to the Set only keys, where all components are not NULL. ConstNullMapPtr null_map{}; @@ -192,7 +192,7 @@ bool Set::insertFromBlock(const Block & block) /// Filter to extract distinct values from the block. ColumnUInt8::MutablePtr filter; if (fill_set_elements) - filter = ColumnUInt8::create(block.rows()); + filter = ColumnUInt8::create(rows); switch (data.type) { @@ -224,16 +224,16 @@ bool Set::insertFromBlock(const Block & block) } -ColumnPtr Set::execute(const Block & block, bool negative) const +ColumnPtr Set::execute(const ColumnsWithTypeAndName & columns, bool negative) const { - size_t num_key_columns = block.columns(); + size_t num_key_columns = columns.size(); if (0 == num_key_columns) throw Exception("Logical error: no columns passed to Set::execute method.", ErrorCodes::LOGICAL_ERROR); auto res = ColumnUInt8::create(); ColumnUInt8::Container & vec_res = res->getData(); - vec_res.resize(block.safeGetByPosition(0).column->size()); + vec_res.resize(columns.at(0).column->size()); if (vec_res.empty()) return res; @@ -264,7 +264,7 @@ ColumnPtr Set::execute(const Block & block, bool negative) const { ColumnPtr result; - const auto & column_before_cast = block.safeGetByPosition(i); + const auto & column_before_cast = columns.at(i); ColumnWithTypeAndName column_to_cast = {column_before_cast.column->convertToFullColumnIfConst(), column_before_cast.type, column_before_cast.name}; @@ -428,7 +428,7 @@ MergeTreeSetIndex::MergeTreeSetIndex(const Columns & set_elements, std::vector #include -#include +#include // Y_IGNORE namespace DB { diff --git a/src/Interpreters/TableJoin.cpp b/src/Interpreters/TableJoin.cpp index 20e8f6b18b4..d15cbe42063 100644 --- a/src/Interpreters/TableJoin.cpp +++ b/src/Interpreters/TableJoin.cpp @@ -231,20 +231,7 @@ void TableJoin::addJoinedColumn(const NameAndTypePair & joined_column) void TableJoin::addJoinedColumnsAndCorrectTypes(NamesAndTypesList & names_and_types, bool correct_nullability) const { - ColumnsWithTypeAndName columns; - for (auto & pair : names_and_types) - columns.emplace_back(nullptr, std::move(pair.type), std::move(pair.name)); - names_and_types.clear(); - - addJoinedColumnsAndCorrectTypes(columns, correct_nullability); - - for (auto & col : columns) - names_and_types.emplace_back(std::move(col.name), std::move(col.type)); -} - -void TableJoin::addJoinedColumnsAndCorrectTypes(ColumnsWithTypeAndName & columns, bool correct_nullability) const -{ - for (auto & col : columns) + for (auto & col : names_and_types) { if (hasUsing()) { @@ -252,17 +239,12 @@ void TableJoin::addJoinedColumnsAndCorrectTypes(ColumnsWithTypeAndName & columns col.type = it->second; } if (correct_nullability && leftBecomeNullable(col.type)) - { - /// No need to nullify constants - bool is_column_const = col.column && isColumnConst(*col.column); - if (!is_column_const) - col.type = JoinCommon::convertTypeToNullable(col.type); - } + col.type = JoinCommon::convertTypeToNullable(col.type); } /// Types in columns_added_by_join already converted and set nullable if needed for (const auto & col : columns_added_by_join) - columns.emplace_back(nullptr, col.type, col.name); + names_and_types.emplace_back(col.name, col.type); } bool TableJoin::sameStrictnessAndKind(ASTTableJoin::Strictness strictness_, ASTTableJoin::Kind kind_) const @@ -472,6 +454,24 @@ void TableJoin::addJoinCondition(const ASTPtr & ast, bool is_left) on_filter_condition_asts_right.push_back(ast); } +std::unordered_map TableJoin::leftToRightKeyRemap() const +{ + std::unordered_map left_to_right_key_remap; + if (hasUsing()) + { + const auto & required_right_keys = requiredRightKeys(); + for (size_t i = 0; i < key_names_left.size(); ++i) + { + const String & left_key_name = key_names_left[i]; + const String & right_key_name = key_names_right[i]; + + if (!required_right_keys.contains(right_key_name)) + left_to_right_key_remap[left_key_name] = right_key_name; + } + } + return left_to_right_key_remap; +} + /// Returns all conditions related to one table joined with 'and' function static ASTPtr buildJoinConditionColumn(const ASTs & on_filter_condition_asts) { diff --git a/src/Interpreters/TableJoin.h b/src/Interpreters/TableJoin.h index 4c8c16028f5..5d26a14113c 100644 --- a/src/Interpreters/TableJoin.h +++ b/src/Interpreters/TableJoin.h @@ -191,7 +191,6 @@ public: void addJoinedColumn(const NameAndTypePair & joined_column); void addJoinedColumnsAndCorrectTypes(NamesAndTypesList & names_and_types, bool correct_nullability = true) const; - void addJoinedColumnsAndCorrectTypes(ColumnsWithTypeAndName & columns, bool correct_nullability = true) const; /// Calculates common supertypes for corresponding join key columns. bool inferJoinKeyCommonType(const NamesAndTypesList & left, const NamesAndTypesList & right); @@ -230,6 +229,7 @@ public: Block getRequiredRightKeys(const Block & right_table_keys, std::vector & keys_sources) const; String renamedRightColumnName(const String & name) const; + std::unordered_map leftToRightKeyRemap() const; }; } diff --git a/src/Interpreters/TreeOptimizer.cpp b/src/Interpreters/TreeOptimizer.cpp index c1a265d9a06..518c041d785 100644 --- a/src/Interpreters/TreeOptimizer.cpp +++ b/src/Interpreters/TreeOptimizer.cpp @@ -69,7 +69,9 @@ const std::unordered_set possibly_injective_function_names void appendUnusedGroupByColumn(ASTSelectQuery * select_query, const NameSet & source_columns) { /// You must insert a constant that is not the name of the column in the table. Such a case is rare, but it happens. - UInt64 unused_column = 0; + /// Also start unused_column integer from source_columns.size() + 1, because lower numbers ([1, source_columns.size()]) + /// might be in positional GROUP BY. + UInt64 unused_column = source_columns.size() + 1; String unused_column_name = toString(unused_column); while (source_columns.count(unused_column_name)) @@ -111,6 +113,8 @@ void optimizeGroupBy(ASTSelectQuery * select_query, const NameSet & source_colum group_exprs.pop_back(); }; + const auto & settings = context->getSettingsRef(); + /// iterate over each GROUP BY expression, eliminate injective function calls and literals for (size_t i = 0; i < group_exprs.size();) { @@ -166,7 +170,22 @@ void optimizeGroupBy(ASTSelectQuery * select_query, const NameSet & source_colum } else if (is_literal(group_exprs[i])) { - remove_expr_at_index(i); + bool keep_position = false; + if (settings.enable_positional_arguments) + { + const auto & value = group_exprs[i]->as()->value; + if (value.getType() == Field::Types::UInt64) + { + auto pos = value.get(); + if (pos > 0 && pos <= select_query->children.size()) + keep_position = true; + } + } + + if (keep_position) + ++i; + else + remove_expr_at_index(i); } else { diff --git a/src/Interpreters/TreeRewriter.cpp b/src/Interpreters/TreeRewriter.cpp index 9294cca7bb4..5a9e2bfbd17 100644 --- a/src/Interpreters/TreeRewriter.cpp +++ b/src/Interpreters/TreeRewriter.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include /// getSmallestColumn() #include @@ -976,7 +977,8 @@ TreeRewriterResultPtr TreeRewriter::analyzeSelect( result.required_source_columns_before_expanding_alias_columns = result.required_source_columns.getNames(); /// rewrite filters for select query, must go after getArrayJoinedColumns - if (settings.optimize_respect_aliases && result.metadata_snapshot) + bool is_initiator = getContext()->getClientInfo().distributed_depth == 0; + if (settings.optimize_respect_aliases && result.metadata_snapshot && is_initiator) { /// If query is changed, we need to redo some work to correct name resolution. if (replaceAliasColumnsInQuery(query, result.metadata_snapshot->getColumns(), result.array_join_result_to_source, getContext())) @@ -1044,6 +1046,9 @@ TreeRewriterResultPtr TreeRewriter::analyze( void TreeRewriter::normalize( ASTPtr & query, Aliases & aliases, const NameSet & source_columns_set, bool ignore_alias, const Settings & settings, bool allow_self_aliases) { + UserDefinedFunctionsVisitor::Data data_user_defined_functions_visitor; + UserDefinedFunctionsVisitor(data_user_defined_functions_visitor).visit(query); + CustomizeCountDistinctVisitor::Data data_count_distinct{settings.count_distinct_implementation}; CustomizeCountDistinctVisitor(data_count_distinct).visit(query); diff --git a/src/Interpreters/UserDefinedFunctionFactory.cpp b/src/Interpreters/UserDefinedFunctionFactory.cpp new file mode 100644 index 00000000000..5cafb764f37 --- /dev/null +++ b/src/Interpreters/UserDefinedFunctionFactory.cpp @@ -0,0 +1,83 @@ +#include "UserDefinedFunctionFactory.h" + +#include +#include + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int FUNCTION_ALREADY_EXISTS; + extern const int UNKNOWN_FUNCTION; + extern const int CANNOT_DROP_SYSTEM_FUNCTION; +} + +UserDefinedFunctionFactory & UserDefinedFunctionFactory::instance() +{ + static UserDefinedFunctionFactory result; + return result; +} + +void UserDefinedFunctionFactory::registerFunction(const String & function_name, ASTPtr create_function_query) +{ + if (FunctionFactory::instance().hasNameOrAlias(function_name)) + throw Exception(ErrorCodes::FUNCTION_ALREADY_EXISTS, "The function '{}' already exists", function_name); + + if (AggregateFunctionFactory::instance().hasNameOrAlias(function_name)) + throw Exception(ErrorCodes::FUNCTION_ALREADY_EXISTS, "The aggregate function '{}' already exists", function_name); + + auto [_, inserted] = function_name_to_create_query.emplace(function_name, std::move(create_function_query)); + if (!inserted) + throw Exception(ErrorCodes::FUNCTION_ALREADY_EXISTS, + "The function name '{}' is not unique", + function_name); +} + +void UserDefinedFunctionFactory::unregisterFunction(const String & function_name) +{ + if (FunctionFactory::instance().hasNameOrAlias(function_name) || + AggregateFunctionFactory::instance().hasNameOrAlias(function_name)) + throw Exception(ErrorCodes::CANNOT_DROP_SYSTEM_FUNCTION, "Cannot drop system function '{}'", function_name); + + auto it = function_name_to_create_query.find(function_name); + if (it == function_name_to_create_query.end()) + throw Exception(ErrorCodes::UNKNOWN_FUNCTION, + "The function name '{}' is not registered", + function_name); + + function_name_to_create_query.erase(it); +} + +ASTPtr UserDefinedFunctionFactory::get(const String & function_name) const +{ + auto it = function_name_to_create_query.find(function_name); + if (it == function_name_to_create_query.end()) + throw Exception(ErrorCodes::UNKNOWN_FUNCTION, + "The function name '{}' is not registered", + function_name); + + return it->second; +} + +ASTPtr UserDefinedFunctionFactory::tryGet(const std::string & function_name) const +{ + auto it = function_name_to_create_query.find(function_name); + if (it == function_name_to_create_query.end()) + return nullptr; + + return it->second; +} + +std::vector UserDefinedFunctionFactory::getAllRegisteredNames() const +{ + std::vector registered_names; + registered_names.reserve(function_name_to_create_query.size()); + + for (const auto & [name, _] : function_name_to_create_query) + registered_names.emplace_back(name); + + return registered_names; +} + +} diff --git a/src/Interpreters/UserDefinedFunctionFactory.h b/src/Interpreters/UserDefinedFunctionFactory.h new file mode 100644 index 00000000000..bdef5a19530 --- /dev/null +++ b/src/Interpreters/UserDefinedFunctionFactory.h @@ -0,0 +1,32 @@ +#pragma once + +#include + +#include + +#include + +namespace DB +{ + +class UserDefinedFunctionFactory : public IHints<1, UserDefinedFunctionFactory> +{ +public: + static UserDefinedFunctionFactory & instance(); + + void registerFunction(const String & function_name, ASTPtr create_function_query); + + void unregisterFunction(const String & function_name); + + ASTPtr get(const String & function_name) const; + + ASTPtr tryGet(const String & function_name) const; + + std::vector getAllRegisteredNames() const override; + +private: + + std::unordered_map function_name_to_create_query; +}; + +} diff --git a/src/Interpreters/UserDefinedFunctionsVisitor.cpp b/src/Interpreters/UserDefinedFunctionsVisitor.cpp new file mode 100644 index 00000000000..2a793d17817 --- /dev/null +++ b/src/Interpreters/UserDefinedFunctionsVisitor.cpp @@ -0,0 +1,99 @@ +#include "UserDefinedFunctionsVisitor.h" + +#include +#include + +#include +#include +#include +#include +#include + + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int UNSUPPORTED_METHOD; +} + +void UserDefinedFunctionsMatcher::visit(ASTPtr & ast, Data &) +{ + auto * function = ast->as(); + if (!function) + return; + + auto result = tryToReplaceFunction(*function); + if (result) + ast = result; +} + +bool UserDefinedFunctionsMatcher::needChildVisit(const ASTPtr &, const ASTPtr &) +{ + return true; +} + +ASTPtr UserDefinedFunctionsMatcher::tryToReplaceFunction(const ASTFunction & function) +{ + auto user_defined_function = UserDefinedFunctionFactory::instance().tryGet(function.name); + if (!user_defined_function) + return nullptr; + + const auto & function_arguments_list = function.children.at(0)->as(); + auto & function_arguments = function_arguments_list->children; + + const auto & create_function_query = user_defined_function->as(); + auto & function_core_expression = create_function_query->function_core->children.at(0); + + const auto & identifiers_expression_list = function_core_expression->children.at(0)->children.at(0)->as(); + const auto & identifiers_raw = identifiers_expression_list->children; + + if (function_arguments.size() != identifiers_raw.size()) + throw Exception(ErrorCodes::UNSUPPORTED_METHOD, + "Function {} expects {} arguments actual arguments {}", + create_function_query->function_name, + identifiers_raw.size(), + function_arguments.size()); + + std::unordered_map identifier_name_to_function_argument; + + for (size_t parameter_index = 0; parameter_index < identifiers_raw.size(); ++parameter_index) + { + const auto & identifier = identifiers_raw[parameter_index]->as(); + const auto & function_argument = function_arguments[parameter_index]; + const auto & identifier_name = identifier->name(); + + identifier_name_to_function_argument.emplace(identifier_name, function_argument); + } + + auto function_body_to_update = function_core_expression->children.at(1)->clone(); + + std::stack ast_nodes_to_update; + ast_nodes_to_update.push(function_body_to_update); + + while (!ast_nodes_to_update.empty()) + { + auto ast_node_to_update = ast_nodes_to_update.top(); + ast_nodes_to_update.pop(); + + for (auto & child : ast_node_to_update->children) + { + auto identifier_name_opt = tryGetIdentifierName(child); + if (identifier_name_opt) + { + auto function_argument_it = identifier_name_to_function_argument.find(*identifier_name_opt); + assert(function_argument_it != identifier_name_to_function_argument.end()); + + child = function_argument_it->second->clone(); + continue; + } + + ast_nodes_to_update.push(child); + } + } + + return function_body_to_update; +} + +} diff --git a/src/Interpreters/UserDefinedFunctionsVisitor.h b/src/Interpreters/UserDefinedFunctionsVisitor.h new file mode 100644 index 00000000000..c24e0327ddc --- /dev/null +++ b/src/Interpreters/UserDefinedFunctionsVisitor.h @@ -0,0 +1,44 @@ +#pragma once + +#include +#include + +namespace DB +{ + +class ASTFunction; + +/** Visits ASTFunction nodes and if it is used defined function replace it with function body. + * Example: + * + * CREATE FUNCTION test_function AS a -> a + 1; + * + * Before applying visitor: + * SELECT test_function(number) FROM system.numbers LIMIT 10; + * + * After applying visitor: + * SELECT number + 1 FROM system.numbers LIMIT 10; + */ +class UserDefinedFunctionsMatcher +{ +public: + using Visitor = InDepthNodeVisitor; + + struct Data + { + }; + + static void visit(ASTPtr & ast, Data & data); + static bool needChildVisit(const ASTPtr & node, const ASTPtr & child); + +private: + static void visit(ASTFunction & func, const Data & data); + + static ASTPtr tryToReplaceFunction(const ASTFunction & function); + +}; + +/// Visits AST nodes and collect their aliases in one map (with links to source nodes). +using UserDefinedFunctionsVisitor = UserDefinedFunctionsMatcher::Visitor; + +} diff --git a/src/Interpreters/UserDefinedObjectsLoader.cpp b/src/Interpreters/UserDefinedObjectsLoader.cpp new file mode 100644 index 00000000000..5237de594f4 --- /dev/null +++ b/src/Interpreters/UserDefinedObjectsLoader.cpp @@ -0,0 +1,164 @@ +#include "UserDefinedObjectsLoader.h" + +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include + + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int OBJECT_ALREADY_STORED_ON_DISK; + extern const int OBJECT_WAS_NOT_STORED_ON_DISK; +} + +UserDefinedObjectsLoader & UserDefinedObjectsLoader::instance() +{ + static UserDefinedObjectsLoader ret; + return ret; +} + +UserDefinedObjectsLoader::UserDefinedObjectsLoader() + : log(&Poco::Logger::get("UserDefinedObjectsLoader")) +{} + +void UserDefinedObjectsLoader::loadUserDefinedObject(ContextPtr context, UserDefinedObjectType object_type, const std::string_view & name, const String & path) +{ + auto name_ref = StringRef(name.data(), name.size()); + LOG_DEBUG(log, "Loading user defined object {} from file {}", backQuote(name_ref), path); + + /// There is .sql file with user defined object creation statement. + ReadBufferFromFile in(path); + + String object_create_query; + readStringUntilEOF(object_create_query, in); + + try + { + switch (object_type) + { + case UserDefinedObjectType::Function: + { + ParserCreateFunctionQuery parser; + ASTPtr ast = parseQuery( + parser, + object_create_query.data(), + object_create_query.data() + object_create_query.size(), + "in file " + path, + 0, + context->getSettingsRef().max_parser_depth); + + InterpreterCreateFunctionQuery interpreter(ast, context, true /*is internal*/); + interpreter.execute(); + } + } + } + catch (Exception & e) + { + e.addMessage(fmt::format("while loading user defined objects {} from path {}", backQuote(name_ref), path)); + throw; + } +} + +void UserDefinedObjectsLoader::loadObjects(ContextPtr context) +{ + LOG_DEBUG(log, "loading user defined objects"); + + String dir_path = context->getPath() + "user_defined/"; + Poco::DirectoryIterator dir_end; + for (Poco::DirectoryIterator it(dir_path); it != dir_end; ++it) + { + if (it->isLink()) + continue; + + const auto & file_name = it.name(); + + /// For '.svn', '.gitignore' directory and similar. + if (file_name.at(0) == '.') + continue; + + if (!it->isDirectory() && endsWith(file_name, ".sql")) + { + std::string_view object_name = file_name; + object_name.remove_suffix(strlen(".sql")); + object_name.remove_prefix(strlen("function_")); + loadUserDefinedObject(context, UserDefinedObjectType::Function, object_name, dir_path + it.name()); + } + } +} + +void UserDefinedObjectsLoader::storeObject(ContextPtr context, UserDefinedObjectType object_type, const String & object_name, const IAST & ast) +{ + String dir_path = context->getPath() + "user_defined/"; + String file_path; + + switch (object_type) + { + case UserDefinedObjectType::Function: + { + file_path = dir_path + "function_" + escapeForFileName(object_name) + ".sql"; + } + } + + if (std::filesystem::exists(file_path)) + throw Exception(ErrorCodes::OBJECT_ALREADY_STORED_ON_DISK, "User defined object {} already stored on disk", backQuote(file_path)); + + LOG_DEBUG(log, "Storing object {} to file {}", backQuote(object_name), file_path); + + WriteBufferFromOwnString create_statement_buf; + formatAST(ast, create_statement_buf, false); + writeChar('\n', create_statement_buf); + + String create_statement = create_statement_buf.str(); + WriteBufferFromFile out(file_path, create_statement.size(), O_WRONLY | O_CREAT | O_EXCL); + writeString(create_statement, out); + out.next(); + if (context->getSettingsRef().fsync_metadata) + out.sync(); + out.close(); + + LOG_DEBUG(log, "Stored object {}", backQuote(object_name)); +} + +void UserDefinedObjectsLoader::removeObject(ContextPtr context, UserDefinedObjectType object_type, const String & object_name) +{ + String dir_path = context->getPath() + "user_defined/"; + LOG_DEBUG(log, "Removing file for user defined object {} from {}", backQuote(object_name), dir_path); + + std::filesystem::path file_path; + + switch (object_type) + { + case UserDefinedObjectType::Function: + { + file_path = dir_path + "function_" + escapeForFileName(object_name) + ".sql"; + } + } + + if (!std::filesystem::exists(file_path)) + throw Exception(ErrorCodes::OBJECT_WAS_NOT_STORED_ON_DISK, "User defined object {} was not stored on disk", backQuote(file_path.string())); + + std::filesystem::remove(file_path); +} + +} diff --git a/src/Interpreters/UserDefinedObjectsLoader.h b/src/Interpreters/UserDefinedObjectsLoader.h new file mode 100644 index 00000000000..f0054fac450 --- /dev/null +++ b/src/Interpreters/UserDefinedObjectsLoader.h @@ -0,0 +1,33 @@ +#pragma once + +#include +#include + +#include + + +namespace DB +{ + +enum class UserDefinedObjectType +{ + Function +}; + +class UserDefinedObjectsLoader : private boost::noncopyable +{ +public: + static UserDefinedObjectsLoader & instance(); + UserDefinedObjectsLoader(); + + void loadObjects(ContextPtr context); + void storeObject(ContextPtr context, UserDefinedObjectType object_type, const String & object_name, const IAST & ast); + void removeObject(ContextPtr context, UserDefinedObjectType object_type, const String & object_name); + +private: + + void loadUserDefinedObject(ContextPtr context, UserDefinedObjectType object_type, const std::string_view & object_name, const String & file_path); + Poco::Logger * log; +}; + +} diff --git a/src/Interpreters/addTypeConversionToAST.cpp b/src/Interpreters/addTypeConversionToAST.cpp index ba67ec762a9..2f766880253 100644 --- a/src/Interpreters/addTypeConversionToAST.cpp +++ b/src/Interpreters/addTypeConversionToAST.cpp @@ -20,7 +20,7 @@ namespace ErrorCodes ASTPtr addTypeConversionToAST(ASTPtr && ast, const String & type_name) { - auto func = makeASTFunction("CAST", ast, std::make_shared(type_name)); + auto func = makeASTFunction("_CAST", ast, std::make_shared(type_name)); if (ASTWithAlias * ast_with_alias = dynamic_cast(ast.get())) { diff --git a/src/Interpreters/castColumn.cpp b/src/Interpreters/castColumn.cpp index 181cca1e017..fd71e02ee7e 100644 --- a/src/Interpreters/castColumn.cpp +++ b/src/Interpreters/castColumn.cpp @@ -1,6 +1,7 @@ #include #include +#include namespace DB { @@ -21,7 +22,7 @@ static ColumnPtr castColumn(const ColumnWithTypeAndName & arg, const DataTypePtr } }; - FunctionOverloadResolverPtr func_builder_cast = CastOverloadResolver::createImpl(false); + FunctionOverloadResolverPtr func_builder_cast = CastInternalOverloadResolver::createImpl(); auto func_cast = func_builder_cast->build(arguments); diff --git a/src/Interpreters/evaluateConstantExpression.cpp b/src/Interpreters/evaluateConstantExpression.cpp index e46f644e836..c05118b7c6a 100644 --- a/src/Interpreters/evaluateConstantExpression.cpp +++ b/src/Interpreters/evaluateConstantExpression.cpp @@ -18,6 +18,7 @@ #include #include #include +#include namespace DB { @@ -121,6 +122,7 @@ std::tuple evaluateDatabaseNameForMergeEngine(const ASTPtr & node, return std::tuple{false, ast}; } + namespace { using Conjunction = ColumnsWithTypeAndName; @@ -213,7 +215,7 @@ namespace Disjunction result; - auto add_dnf = [&](const auto &dnf) + auto add_dnf = [&](const auto & dnf) { if (dnf.size() > limit) { @@ -338,6 +340,7 @@ std::optional evaluateExpressionOverConstantCondition(const ASTPtr & nod if (const auto * fn = node->as()) { + std::unordered_map always_false_map; const auto dnf = analyzeFunction(fn, target_expr, limit); if (dnf.empty() || !limit) @@ -368,7 +371,41 @@ std::optional evaluateExpressionOverConstantCondition(const ASTPtr & nod for (const auto & conjunct : dnf) { - Block block(conjunct); + Block block; + + for (const auto & elem : conjunct) + { + if (!block.has(elem.name)) + { + block.insert(elem); + } + else + { + /// Conjunction of condition on column equality to distinct values can never be satisfied. + + const ColumnWithTypeAndName & prev = block.getByName(elem.name); + + if (isColumnConst(*prev.column) && isColumnConst(*elem.column)) + { + Field prev_value = assert_cast(*prev.column).getField(); + Field curr_value = assert_cast(*elem.column).getField(); + + if (!always_false_map.count(elem.name)) + { + always_false_map[elem.name] = prev_value != curr_value; + } + else + { + auto & always_false = always_false_map[elem.name]; + /// If at least one of conjunct is not always false, we should preserve this. + if (always_false) + { + always_false = prev_value != curr_value; + } + } + } + } + } // Block should contain all required columns from `target_expr` if (!has_required_columns(block)) @@ -393,6 +430,11 @@ std::optional evaluateExpressionOverConstantCondition(const ASTPtr & nod return {}; } } + + bool any_always_false = std::any_of(always_false_map.begin(), always_false_map.end(), [](const auto & v) { return v.second; }); + if (any_always_false) + return Blocks{}; + } else if (const auto * literal = node->as()) { diff --git a/src/Interpreters/executeQuery.cpp b/src/Interpreters/executeQuery.cpp index 3ebc2eb142c..23fb35deee3 100644 --- a/src/Interpreters/executeQuery.cpp +++ b/src/Interpreters/executeQuery.cpp @@ -46,6 +46,7 @@ #include #include #include +#include #include #include @@ -490,9 +491,16 @@ static std::tuple executeQueryImpl( ApplyWithGlobalVisitor().visit(ast); } - /// Normalize SelectWithUnionQuery - NormalizeSelectWithUnionQueryVisitor::Data data{context->getSettingsRef().union_default_mode}; - NormalizeSelectWithUnionQueryVisitor{data}.visit(ast); + { + SelectIntersectExceptQueryVisitor::Data data; + SelectIntersectExceptQueryVisitor{data}.visit(ast); + } + + { + /// Normalize SelectWithUnionQuery + NormalizeSelectWithUnionQueryVisitor::Data data{context->getSettingsRef().union_default_mode}; + NormalizeSelectWithUnionQueryVisitor{data}.visit(ast); + } /// Check the limits. checkASTSizeLimits(*ast, settings); diff --git a/src/Interpreters/inplaceBlockConversions.cpp b/src/Interpreters/inplaceBlockConversions.cpp index 26cf6912bc7..e40e0635a85 100644 --- a/src/Interpreters/inplaceBlockConversions.cpp +++ b/src/Interpreters/inplaceBlockConversions.cpp @@ -52,7 +52,7 @@ void addDefaultRequiredExpressionsRecursively( RequiredSourceColumnsVisitor(columns_context).visit(column_default_expr); NameSet required_columns_names = columns_context.requiredColumns(); - auto expr = makeASTFunction("CAST", column_default_expr, std::make_shared(columns.get(required_column_name).type->getName())); + auto expr = makeASTFunction("_CAST", column_default_expr, std::make_shared(columns.get(required_column_name).type->getName())); if (is_column_in_query && convert_null_to_default) expr = makeASTFunction("ifNull", std::make_shared(required_column_name), std::move(expr)); @@ -101,7 +101,7 @@ ASTPtr convertRequiredExpressions(Block & block, const NamesAndTypesList & requi continue; auto cast_func = makeASTFunction( - "CAST", std::make_shared(required_column.name), std::make_shared(required_column.type->getName())); + "_CAST", std::make_shared(required_column.name), std::make_shared(required_column.type->getName())); conversion_expr_list->children.emplace_back(setAlias(cast_func, required_column.name)); diff --git a/src/Interpreters/join_common.cpp b/src/Interpreters/join_common.cpp index e9f3e4f3fdd..9890a130c33 100644 --- a/src/Interpreters/join_common.cpp +++ b/src/Interpreters/join_common.cpp @@ -314,8 +314,16 @@ void removeLowCardinalityInplace(Block & block, const Names & names, bool change } } -void restoreLowCardinalityInplace(Block & block) +void restoreLowCardinalityInplace(Block & block, const Names & lowcard_keys) { + for (const auto & column_name : lowcard_keys) + { + if (!block.has(column_name)) + continue; + if (auto & col = block.getByName(column_name); !col.type->lowCardinality()) + JoinCommon::changeLowCardinalityInplace(col); + } + for (size_t i = 0; i < block.columns(); ++i) { auto & col = block.getByPosition(i); @@ -484,49 +492,23 @@ void splitAdditionalColumns(const Names & key_names, const Block & sample_block, } - -NotJoined::NotJoined(const TableJoin & table_join, const Block & saved_block_sample_, const Block & right_sample_block, - const Block & result_sample_block_, const Names & key_names_left_, const Names & key_names_right_) - : saved_block_sample(saved_block_sample_) +NotJoinedBlocks::NotJoinedBlocks(std::unique_ptr filler_, + const Block & result_sample_block_, + size_t left_columns_count, + const LeftToRightKeyRemap & left_to_right_key_remap) + : filler(std::move(filler_)) + , saved_block_sample(filler->getEmptyBlock()) , result_sample_block(materializeBlock(result_sample_block_)) - , key_names_left(key_names_left_.empty() ? table_join.keyNamesLeft() : key_names_left_) - , key_names_right(key_names_right_.empty() ? table_join.keyNamesRight() : key_names_right_) { - std::vector tmp; - Block right_table_keys; - Block sample_block_with_columns_to_add; - - JoinCommon::splitAdditionalColumns(key_names_right, right_sample_block, right_table_keys, - sample_block_with_columns_to_add); - Block required_right_keys = table_join.getRequiredRightKeys(right_table_keys, tmp); - - std::unordered_map left_to_right_key_remap; - - if (table_join.hasUsing()) - { - for (size_t i = 0; i < key_names_left.size(); ++i) - { - const String & left_key_name = key_names_left[i]; - const String & right_key_name = key_names_right[i]; - - size_t left_key_pos = result_sample_block.getPositionByName(left_key_name); - size_t right_key_pos = saved_block_sample.getPositionByName(right_key_name); - - if (!required_right_keys.has(right_key_name)) - left_to_right_key_remap[left_key_pos] = right_key_pos; - } - } - - /// result_sample_block: left_sample_block + left expressions, right not key columns, required right keys - size_t left_columns_count = result_sample_block.columns() - - sample_block_with_columns_to_add.columns() - required_right_keys.columns(); for (size_t left_pos = 0; left_pos < left_columns_count; ++left_pos) { - /// We need right 'x' for 'RIGHT JOIN ... USING(x)'. - if (left_to_right_key_remap.count(left_pos)) + /// We need right 'x' for 'RIGHT JOIN ... USING(x)' + auto left_name = result_sample_block.getByPosition(left_pos).name; + const auto & right_key = left_to_right_key_remap.find(left_name); + if (right_key != left_to_right_key_remap.end()) { - size_t right_key_pos = left_to_right_key_remap[left_pos]; + size_t right_key_pos = saved_block_sample.getPositionByName(right_key->second); setRightIndex(right_key_pos, left_pos); } else @@ -556,9 +538,9 @@ NotJoined::NotJoined(const TableJoin & table_join, const Block & saved_block_sam ErrorCodes::LOGICAL_ERROR); } -void NotJoined::setRightIndex(size_t right_pos, size_t result_position) +void NotJoinedBlocks::setRightIndex(size_t right_pos, size_t result_position) { - if (!column_indices_right.count(right_pos)) + if (!column_indices_right.contains(right_pos)) { column_indices_right[right_pos] = result_position; extractColumnChanges(right_pos, result_position); @@ -567,7 +549,7 @@ void NotJoined::setRightIndex(size_t right_pos, size_t result_position) same_result_keys[result_position] = column_indices_right[right_pos]; } -void NotJoined::extractColumnChanges(size_t right_pos, size_t result_pos) +void NotJoinedBlocks::extractColumnChanges(size_t right_pos, size_t result_pos) { auto src_props = getLowcardAndNullability(saved_block_sample.getByPosition(right_pos).column); auto dst_props = getLowcardAndNullability(result_sample_block.getByPosition(result_pos).column); @@ -579,7 +561,7 @@ void NotJoined::extractColumnChanges(size_t right_pos, size_t result_pos) right_lowcard_changes.push_back({result_pos, dst_props.is_lowcard}); } -void NotJoined::correctLowcardAndNullability(Block & block) +void NotJoinedBlocks::correctLowcardAndNullability(Block & block) { for (auto & [pos, added] : right_nullability_changes) { @@ -607,7 +589,7 @@ void NotJoined::correctLowcardAndNullability(Block & block) } } -void NotJoined::addLeftColumns(Block & block, size_t rows_added) const +void NotJoinedBlocks::addLeftColumns(Block & block, size_t rows_added) const { for (size_t pos : column_indices_left) { @@ -619,7 +601,7 @@ void NotJoined::addLeftColumns(Block & block, size_t rows_added) const } } -void NotJoined::addRightColumns(Block & block, MutableColumns & columns_right) const +void NotJoinedBlocks::addRightColumns(Block & block, MutableColumns & columns_right) const { for (const auto & pr : column_indices_right) { @@ -629,7 +611,7 @@ void NotJoined::addRightColumns(Block & block, MutableColumns & columns_right) c } } -void NotJoined::copySameKeys(Block & block) const +void NotJoinedBlocks::copySameKeys(Block & block) const { for (const auto & pr : same_result_keys) { @@ -639,4 +621,26 @@ void NotJoined::copySameKeys(Block & block) const } } +Block NotJoinedBlocks::read() +{ + Block result_block = result_sample_block.cloneEmpty(); + { + Block right_block = filler->getEmptyBlock(); + MutableColumns columns_right = right_block.cloneEmptyColumns(); + size_t rows_added = filler->fillColumns(columns_right); + if (rows_added == 0) + return {}; + + addLeftColumns(result_block, rows_added); + addRightColumns(result_block, columns_right); + } + copySameKeys(result_block); + correctLowcardAndNullability(result_block); + +#ifndef NDEBUG + assertBlocksHaveEqualStructure(result_block, result_sample_block, "NotJoinedBlocks"); +#endif + return result_block; +} + } diff --git a/src/Interpreters/join_common.h b/src/Interpreters/join_common.h index 1f037899155..ec2e1d3bd50 100644 --- a/src/Interpreters/join_common.h +++ b/src/Interpreters/join_common.h @@ -30,7 +30,7 @@ ColumnRawPtrs materializeColumnsInplace(Block & block, const Names & names); ColumnRawPtrs getRawPointers(const Columns & columns); void removeLowCardinalityInplace(Block & block); void removeLowCardinalityInplace(Block & block, const Names & names, bool change_type = true); -void restoreLowCardinalityInplace(Block & block); +void restoreLowCardinalityInplace(Block & block, const Names & lowcard_keys); ColumnRawPtrs extractKeysForJoin(const Block & block_keys, const Names & key_names_right); @@ -64,40 +64,58 @@ void changeLowCardinalityInplace(ColumnWithTypeAndName & column); } /// Creates result from right table data in RIGHT and FULL JOIN when keys are not present in left table. -class NotJoined +class NotJoinedBlocks final { public: - NotJoined(const TableJoin & table_join, const Block & saved_block_sample_, const Block & right_sample_block, - const Block & result_sample_block_, const Names & key_names_left_ = {}, const Names & key_names_right_ = {}); + using LeftToRightKeyRemap = std::unordered_map; + /// Returns non joined columns from right part of join + class RightColumnsFiller + { + public: + /// Create empty block for right part + virtual Block getEmptyBlock() = 0; + /// Fill columns from right part of join with not joined rows + virtual size_t fillColumns(MutableColumns & columns_right) = 0; + + virtual ~RightColumnsFiller() = default; + }; + + NotJoinedBlocks(std::unique_ptr filler_, + const Block & result_sample_block_, + size_t left_columns_count, + const LeftToRightKeyRemap & left_to_right_key_remap); + + Block read(); + +private: + void extractColumnChanges(size_t right_pos, size_t result_pos); void correctLowcardAndNullability(Block & block); void addLeftColumns(Block & block, size_t rows_added) const; void addRightColumns(Block & block, MutableColumns & columns_right) const; void copySameKeys(Block & block) const; -protected: + std::unique_ptr filler; + + /// Right block saved in Join Block saved_block_sample; + + /// Output of join Block result_sample_block; - Names key_names_left; - Names key_names_right; - - ~NotJoined() = default; - -private: /// Indices of columns in result_sample_block that should be generated std::vector column_indices_left; /// Indices of columns that come from the right-side table: right_pos -> result_pos std::unordered_map column_indices_right; - /// + std::unordered_map same_result_keys; - /// Which right columns (saved in parent) need nullability change before placing them in result block + + /// Which right columns (saved in parent) need Nullability/LowCardinality change + /// before placing them in result block std::vector> right_nullability_changes; - /// Which right columns (saved in parent) need LowCardinality change before placing them in result block std::vector> right_lowcard_changes; void setRightIndex(size_t right_pos, size_t result_position); - void extractColumnChanges(size_t right_pos, size_t result_pos); }; } diff --git a/src/Interpreters/ya.make b/src/Interpreters/ya.make index c0816bb671c..119e3cc5322 100644 --- a/src/Interpreters/ya.make +++ b/src/Interpreters/ya.make @@ -71,6 +71,7 @@ SRCS( InternalTextLogsQueue.cpp InterpreterAlterQuery.cpp InterpreterCheckQuery.cpp + InterpreterCreateFunctionQuery.cpp InterpreterCreateQuery.cpp InterpreterCreateQuotaQuery.cpp InterpreterCreateRoleQuery.cpp @@ -79,6 +80,7 @@ SRCS( InterpreterCreateUserQuery.cpp InterpreterDescribeQuery.cpp InterpreterDropAccessEntityQuery.cpp + InterpreterDropFunctionQuery.cpp InterpreterDropQuery.cpp InterpreterExistsQuery.cpp InterpreterExplainQuery.cpp @@ -89,6 +91,7 @@ SRCS( InterpreterKillQueryQuery.cpp InterpreterOptimizeQuery.cpp InterpreterRenameQuery.cpp + InterpreterSelectIntersectExceptQuery.cpp InterpreterSelectQuery.cpp InterpreterSelectWithUnionQuery.cpp InterpreterSetQuery.cpp @@ -142,6 +145,7 @@ SRCS( RewriteFunctionToSubcolumnVisitor.cpp RewriteSumIfFunctionVisitor.cpp RowRefs.cpp + SelectIntersectExceptQueryVisitor.cpp Set.cpp SetVariants.cpp SortedBlocksWriter.cpp @@ -157,6 +161,9 @@ SRCS( TranslateQualifiedNamesVisitor.cpp TreeOptimizer.cpp TreeRewriter.cpp + UserDefinedFunctionFactory.cpp + UserDefinedFunctionsVisitor.cpp + UserDefinedObjectsLoader.cpp WindowDescription.cpp ZooKeeperLog.cpp addMissingDefaults.cpp diff --git a/src/Parsers/ASTBackupQuery.cpp b/src/Parsers/ASTBackupQuery.cpp new file mode 100644 index 00000000000..e3a6287c72a --- /dev/null +++ b/src/Parsers/ASTBackupQuery.cpp @@ -0,0 +1,130 @@ +#include +#include +#include + + +namespace DB +{ +namespace +{ + using Kind = ASTBackupQuery::Kind; + using Element = ASTBackupQuery::Element; + using ElementType = ASTBackupQuery::ElementType; + + void formatName(const DatabaseAndTableName & name, ElementType type, const IAST::FormatSettings & format) + { + switch (type) + { + case ElementType::TABLE: [[fallthrough]]; + case ElementType::DICTIONARY: + { + format.ostr << " "; + if (!name.first.empty()) + format.ostr << backQuoteIfNeed(name.first) << "."; + format.ostr << backQuoteIfNeed(name.second); + break; + } + case ElementType::DATABASE: + { + format.ostr << " " << backQuoteIfNeed(name.first); + break; + } + case ElementType::TEMPORARY_TABLE: + { + format.ostr << " " << backQuoteIfNeed(name.second); + break; + } + default: + break; + } + } + + void formatPartitions(const ASTs & partitions, const IAST::FormatSettings & format) + { + if (partitions.empty()) + return; + format.ostr << (format.hilite ? IAST::hilite_keyword : "") << " " << ((partitions.size() == 1) ? "PARTITION" : "PARTITIONS") << " " + << (format.hilite ? IAST::hilite_none : ""); + bool need_comma = false; + for (const auto & partition : partitions) + { + if (std::exchange(need_comma, true)) + format.ostr << ","; + format.ostr << " "; + partition->format(format); + } + } + + void formatElement(const Element & element, Kind kind, const IAST::FormatSettings & format) + { + format.ostr << (format.hilite ? IAST::hilite_keyword : "") << " "; + switch (element.type) + { + case ElementType::TABLE: format.ostr << "TABLE"; break; + case ElementType::DICTIONARY: format.ostr << "DICTIONARY"; break; + case ElementType::DATABASE: format.ostr << "DATABASE"; break; + case ElementType::ALL_DATABASES: format.ostr << "ALL DATABASES"; break; + case ElementType::TEMPORARY_TABLE: format.ostr << "TEMPORARY TABLE"; break; + case ElementType::ALL_TEMPORARY_TABLES: format.ostr << "ALL TEMPORARY TABLES"; break; + case ElementType::EVERYTHING: format.ostr << "EVERYTHING"; break; + } + format.ostr << (format.hilite ? IAST::hilite_none : ""); + + formatName(element.name, element.type, format); + + bool under_another_name = !element.new_name.first.empty() || !element.new_name.second.empty(); + if (under_another_name) + { + format.ostr << (format.hilite ? IAST::hilite_keyword : "") << " " << ((kind == Kind::BACKUP) ? "AS" : "INTO") + << (format.hilite ? IAST::hilite_none : ""); + formatName(element.new_name, element.type, format); + } + + formatPartitions(element.partitions, format); + } + + void formatElements(const std::vector & elements, Kind kind, const IAST::FormatSettings & format) + { + bool need_comma = false; + for (const auto & element : elements) + { + if (std::exchange(need_comma, true)) + format.ostr << ","; + formatElement(element, kind, format); + } + } + + void formatSettings(const IAST & settings, const IAST::FormatSettings & format) + { + format.ostr << (format.hilite ? IAST::hilite_keyword : "") << " SETTINGS " << (format.hilite ? IAST::hilite_none : ""); + settings.format(format); + } +} + +String ASTBackupQuery::getID(char) const +{ + return (kind == Kind::BACKUP) ? "BackupQuery" : "RestoreQuery"; +} + + +ASTPtr ASTBackupQuery::clone() const +{ + return std::make_shared(*this); +} + + +void ASTBackupQuery::formatImpl(const FormatSettings & format, FormatState &, FormatStateStacked) const +{ + format.ostr << (format.hilite ? hilite_keyword : "") << ((kind == Kind::BACKUP) ? "BACKUP" : "RESTORE") + << (format.hilite ? hilite_none : ""); + + formatElements(elements, kind, format); + + if (settings) + formatSettings(*settings, format); + + format.ostr << (format.hilite ? hilite_keyword : "") << ((kind == Kind::BACKUP) ? " TO" : " FROM") << (format.hilite ? hilite_none : ""); + format.ostr << " " << quoteString(backup_name); +} + +} diff --git a/src/Parsers/ASTBackupQuery.h b/src/Parsers/ASTBackupQuery.h new file mode 100644 index 00000000000..8bcef0c804d --- /dev/null +++ b/src/Parsers/ASTBackupQuery.h @@ -0,0 +1,87 @@ +#pragma once + +#include + + +namespace DB +{ +using Strings = std::vector; +using DatabaseAndTableName = std::pair; + + +/** BACKUP { TABLE [db.]table_name [AS [db.]table_name_in_backup] [PARTITION[S] partition_expr [,...]] | + * DICTIONARY [db.]dictionary_name [AS [db.]dictionary_name_in_backup] | + * DATABASE database_name [AS database_name_in_backup] | + * ALL DATABASES | + * TEMPORARY TABLE table_name [AS table_name_in_backup] + * ALL TEMPORARY TABLES | + * EVERYTHING } [,...] + * TO 'backup_name' + * SETTINGS base_backup='base_backup_name' + * + * RESTORE { TABLE [db.]table_name_in_backup [INTO [db.]table_name] [PARTITION[S] partition_expr [,...]] | + * DICTIONARY [db.]dictionary_name_in_backup [INTO [db.]dictionary_name] | + * DATABASE database_name_in_backup [INTO database_name] | + * ALL DATABASES | + * TEMPORARY TABLE table_name_in_backup [INTO table_name] | + * ALL TEMPORARY TABLES | + * EVERYTHING } [,...] + * FROM 'backup_name' + * + * Notes: + * RESTORE doesn't drop any data, it either creates a table or appends an existing table with restored data. + * This behaviour can cause data duplication. + * If appending isn't possible because the existing table has incompatible format then RESTORE will throw an exception. + * + * The "UNDER NAME" clause is useful to backup or restore under another name. + * For the BACKUP command this clause allows to set the name which an object will have inside the backup. + * And for the RESTORE command this clause allows to set the name which an object will have after RESTORE has finished. + * + * "ALL DATABASES" means all databases except the system database and the internal database containing temporary tables. + * "EVERYTHING" works exactly as "ALL DATABASES, ALL TEMPORARY TABLES" + * + * The "WITH BASE" clause allows to set a base backup. Only differences made after the base backup will be + * included in a newly created backup, so this option allows to make an incremental backup. + */ +class ASTBackupQuery : public IAST +{ +public: + enum Kind + { + BACKUP, + RESTORE, + }; + Kind kind = Kind::BACKUP; + + enum ElementType + { + TABLE, + DICTIONARY, + DATABASE, + ALL_DATABASES, + TEMPORARY_TABLE, + ALL_TEMPORARY_TABLES, + EVERYTHING, + }; + + struct Element + { + ElementType type; + DatabaseAndTableName name; + DatabaseAndTableName new_name; + ASTs partitions; + std::set except_list; + }; + + using Elements = std::vector; + Elements elements; + + String backup_name; + + ASTPtr settings; + + String getID(char) const override; + ASTPtr clone() const override; + void formatImpl(const FormatSettings & format, FormatState &, FormatStateStacked) const override; +}; +} diff --git a/src/Parsers/ASTColumnsTransformers.cpp b/src/Parsers/ASTColumnsTransformers.cpp index 359efbd03aa..451ecf0d4dd 100644 --- a/src/Parsers/ASTColumnsTransformers.cpp +++ b/src/Parsers/ASTColumnsTransformers.cpp @@ -7,6 +7,7 @@ #include #include #include +#include namespace DB @@ -40,10 +41,18 @@ void ASTColumnsApplyTransformer::formatImpl(const FormatSettings & settings, For if (!column_name_prefix.empty()) settings.ostr << "("; - settings.ostr << func_name; - if (parameters) - parameters->formatImpl(settings, state, frame); + if (lambda) + { + lambda->formatImpl(settings, state, frame); + } + else + { + settings.ostr << func_name; + + if (parameters) + parameters->formatImpl(settings, state, frame); + } if (!column_name_prefix.empty()) settings.ostr << ", '" << column_name_prefix << "')"; @@ -64,9 +73,33 @@ void ASTColumnsApplyTransformer::transform(ASTs & nodes) const else name = column->getColumnName(); } - auto function = makeASTFunction(func_name, column); - function->parameters = parameters; - column = function; + if (lambda) + { + auto body = lambda->as().arguments->children.at(1)->clone(); + std::stack stack; + stack.push(body); + while (!stack.empty()) + { + auto ast = stack.top(); + stack.pop(); + for (auto & child : ast->children) + { + if (auto arg_name = tryGetIdentifierName(child); arg_name && arg_name == lambda_arg) + { + child = column->clone(); + continue; + } + stack.push(child); + } + } + column = body; + } + else + { + auto function = makeASTFunction(func_name, column); + function->parameters = parameters; + column = function; + } if (!column_name_prefix.empty()) column->setAlias(column_name_prefix + name); } diff --git a/src/Parsers/ASTColumnsTransformers.h b/src/Parsers/ASTColumnsTransformers.h index 49d29222f02..1064beb44bd 100644 --- a/src/Parsers/ASTColumnsTransformers.h +++ b/src/Parsers/ASTColumnsTransformers.h @@ -25,13 +25,22 @@ public: auto res = std::make_shared(*this); if (parameters) res->parameters = parameters->clone(); + if (lambda) + res->lambda = lambda->clone(); return res; } void transform(ASTs & nodes) const override; + + // Case 1 APPLY (quantile(0.9)) String func_name; - String column_name_prefix; ASTPtr parameters; + // Case 2 APPLY (x -> quantile(0.9)(x)) + ASTPtr lambda; + String lambda_arg; + + String column_name_prefix; + protected: void formatImpl(const FormatSettings & settings, FormatState &, FormatStateStacked) const override; }; diff --git a/src/Parsers/ASTCreateFunctionQuery.cpp b/src/Parsers/ASTCreateFunctionQuery.cpp new file mode 100644 index 00000000000..0b3991ddc44 --- /dev/null +++ b/src/Parsers/ASTCreateFunctionQuery.cpp @@ -0,0 +1,21 @@ +#include +#include +#include + +namespace DB +{ + +ASTPtr ASTCreateFunctionQuery::clone() const +{ + return std::make_shared(*this); +} + +void ASTCreateFunctionQuery::formatImpl(const IAST::FormatSettings & settings, IAST::FormatState & state, IAST::FormatStateStacked frame) const +{ + settings.ostr << (settings.hilite ? hilite_keyword : "") << "CREATE FUNCTION " << (settings.hilite ? hilite_none : ""); + settings.ostr << (settings.hilite ? hilite_identifier : "") << backQuoteIfNeed(function_name) << (settings.hilite ? hilite_none : ""); + settings.ostr << (settings.hilite ? hilite_keyword : "") << " AS " << (settings.hilite ? hilite_none : ""); + function_core->formatImpl(settings, state, frame); +} + +} diff --git a/src/Parsers/ASTCreateFunctionQuery.h b/src/Parsers/ASTCreateFunctionQuery.h new file mode 100644 index 00000000000..3adddad8fbd --- /dev/null +++ b/src/Parsers/ASTCreateFunctionQuery.h @@ -0,0 +1,22 @@ +#pragma once + +#include +#include + +namespace DB +{ + +class ASTCreateFunctionQuery : public IAST +{ +public: + String function_name; + ASTPtr function_core; + + String getID(char) const override { return "CreateFunctionQuery"; } + + ASTPtr clone() const override; + + void formatImpl(const FormatSettings & s, FormatState & state, FormatStateStacked frame) const override; +}; + +} diff --git a/src/Parsers/ASTDatabaseOrNone.cpp b/src/Parsers/ASTDatabaseOrNone.cpp index f93322ef00c..0a0c800ff36 100644 --- a/src/Parsers/ASTDatabaseOrNone.cpp +++ b/src/Parsers/ASTDatabaseOrNone.cpp @@ -1,4 +1,5 @@ #include +#include #include namespace DB @@ -10,7 +11,7 @@ void ASTDatabaseOrNone::formatImpl(const FormatSettings & settings, FormatState settings.ostr << (settings.hilite ? IAST::hilite_keyword : "") << "NONE" << (settings.hilite ? IAST::hilite_none : ""); return; } - settings.ostr << database_name; + settings.ostr << backQuoteIfNeed(database_name); } } diff --git a/src/Parsers/ASTDropFunctionQuery.cpp b/src/Parsers/ASTDropFunctionQuery.cpp new file mode 100644 index 00000000000..5800a7ba9cb --- /dev/null +++ b/src/Parsers/ASTDropFunctionQuery.cpp @@ -0,0 +1,19 @@ +#include +#include +#include + +namespace DB +{ + +ASTPtr ASTDropFunctionQuery::clone() const +{ + return std::make_shared(*this); +} + +void ASTDropFunctionQuery::formatImpl(const IAST::FormatSettings & settings, IAST::FormatState &, IAST::FormatStateStacked) const +{ + settings.ostr << (settings.hilite ? hilite_keyword : "") << "DROP FUNCTION " << (settings.hilite ? hilite_none : ""); + settings.ostr << (settings.hilite ? hilite_identifier : "") << backQuoteIfNeed(function_name) << (settings.hilite ? hilite_none : ""); +} + +} diff --git a/src/Parsers/ASTDropFunctionQuery.h b/src/Parsers/ASTDropFunctionQuery.h new file mode 100644 index 00000000000..e32bf93a64d --- /dev/null +++ b/src/Parsers/ASTDropFunctionQuery.h @@ -0,0 +1,20 @@ +#pragma once + +#include "IAST.h" + +namespace DB +{ + +class ASTDropFunctionQuery : public IAST +{ +public: + String function_name; + + String getID(char) const override { return "DropFunctionQuery"; } + + ASTPtr clone() const override; + + void formatImpl(const FormatSettings & s, FormatState & state, FormatStateStacked frame) const override; +}; + +} diff --git a/src/Parsers/ASTFunction.cpp b/src/Parsers/ASTFunction.cpp index 1ff27c61836..6a3e9d19484 100644 --- a/src/Parsers/ASTFunction.cpp +++ b/src/Parsers/ASTFunction.cpp @@ -13,6 +13,7 @@ #include #include #include +#include namespace DB @@ -21,6 +22,7 @@ namespace DB namespace ErrorCodes { extern const int UNEXPECTED_EXPRESSION; + extern const int UNEXPECTED_AST_STRUCTURE; } void ASTFunction::appendColumnNameImpl(WriteBuffer & ostr) const @@ -557,4 +559,33 @@ void ASTFunction::formatImplWithoutAlias(const FormatSettings & settings, Format } } +String getFunctionName(const IAST * ast) +{ + String res; + if (tryGetFunctionNameInto(ast, res)) + return res; + throw Exception(ast ? queryToString(*ast) + " is not an function" : "AST node is nullptr", ErrorCodes::UNEXPECTED_AST_STRUCTURE); +} + +std::optional tryGetFunctionName(const IAST * ast) +{ + String res; + if (tryGetFunctionNameInto(ast, res)) + return res; + return {}; +} + +bool tryGetFunctionNameInto(const IAST * ast, String & name) +{ + if (ast) + { + if (const auto * node = ast->as()) + { + name = node->name; + return true; + } + } + return false; +} + } diff --git a/src/Parsers/ASTFunction.h b/src/Parsers/ASTFunction.h index 685aaaadd26..ec49ee180ba 100644 --- a/src/Parsers/ASTFunction.h +++ b/src/Parsers/ASTFunction.h @@ -71,4 +71,14 @@ std::shared_ptr makeASTFunction(const String & name, Args &&... arg return function; } +/// ASTFunction Helpers: hide casts and semantic. + +String getFunctionName(const IAST * ast); +std::optional tryGetFunctionName(const IAST * ast); +bool tryGetFunctionNameInto(const IAST * ast, String & name); + +inline String getFunctionName(const ASTPtr & ast) { return getFunctionName(ast.get()); } +inline std::optional tryGetFunctionName(const ASTPtr & ast) { return tryGetFunctionName(ast.get()); } +inline bool tryGetFunctionNameInto(const ASTPtr & ast, String & name) { return tryGetFunctionNameInto(ast.get(), name); } + } diff --git a/src/Parsers/ASTFunctionHelpers.h b/src/Parsers/ASTFunctionHelpers.h new file mode 100644 index 00000000000..76da2dd1501 --- /dev/null +++ b/src/Parsers/ASTFunctionHelpers.h @@ -0,0 +1,16 @@ +#pragma once + +#include + + +namespace DB +{ + +static bool isFunctionCast(const ASTFunction * function) +{ + if (function) + return function->name == "CAST" || function->name == "_CAST"; + return false; +} + +} diff --git a/src/Parsers/ASTInsertQuery.cpp b/src/Parsers/ASTInsertQuery.cpp index 8bfd3ccf1f2..745585ae175 100644 --- a/src/Parsers/ASTInsertQuery.cpp +++ b/src/Parsers/ASTInsertQuery.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -24,6 +25,11 @@ void ASTInsertQuery::formatImpl(const FormatSettings & settings, FormatState & s { settings.ostr << (settings.hilite ? hilite_keyword : "") << "FUNCTION "; table_function->formatImpl(settings, state, frame); + if (partition_by) + { + settings.ostr << " PARTITION BY "; + partition_by->formatImpl(settings, state, frame); + } } else settings.ostr << (settings.hilite ? hilite_none : "") @@ -48,11 +54,15 @@ void ASTInsertQuery::formatImpl(const FormatSettings & settings, FormatState & s } else { + if (infile) + { + settings.ostr << (settings.hilite ? hilite_keyword : "") << " FROM INFILE " << (settings.hilite ? hilite_none : "") << infile->as().value.safeGet(); + } if (!format.empty()) { settings.ostr << (settings.hilite ? hilite_keyword : "") << " FORMAT " << (settings.hilite ? hilite_none : "") << format; } - else + else if (!infile) { settings.ostr << (settings.hilite ? hilite_keyword : "") << " VALUES" << (settings.hilite ? hilite_none : ""); } diff --git a/src/Parsers/ASTInsertQuery.h b/src/Parsers/ASTInsertQuery.h index a454f46c3f1..6eab3e7acac 100644 --- a/src/Parsers/ASTInsertQuery.h +++ b/src/Parsers/ASTInsertQuery.h @@ -2,6 +2,7 @@ #include #include +#include "Parsers/IAST_fwd.h" namespace DB { @@ -16,8 +17,10 @@ public: ASTPtr columns; String format; ASTPtr select; + ASTPtr infile; ASTPtr watch; ASTPtr table_function; + ASTPtr partition_by; ASTPtr settings_ast; /// Data to insert @@ -42,6 +45,7 @@ public: if (select) { res->select = select->clone(); res->children.push_back(res->select); } if (watch) { res->watch = watch->clone(); res->children.push_back(res->watch); } if (table_function) { res->table_function = table_function->clone(); res->children.push_back(res->table_function); } + if (partition_by) { res->partition_by = partition_by->clone(); res->children.push_back(res->partition_by); } if (settings_ast) { res->settings_ast = settings_ast->clone(); res->children.push_back(res->settings_ast); } return res; diff --git a/src/Parsers/ASTSelectIntersectExceptQuery.cpp b/src/Parsers/ASTSelectIntersectExceptQuery.cpp new file mode 100644 index 00000000000..3b9cb0a2c16 --- /dev/null +++ b/src/Parsers/ASTSelectIntersectExceptQuery.cpp @@ -0,0 +1,41 @@ +#include +#include +#include + + +namespace DB +{ + +ASTPtr ASTSelectIntersectExceptQuery::clone() const +{ + auto res = std::make_shared(*this); + + res->children.clear(); + for (const auto & child : children) + res->children.push_back(child->clone()); + + res->final_operator = final_operator; + + cloneOutputOptions(*res); + return res; +} + +void ASTSelectIntersectExceptQuery::formatQueryImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const +{ + std::string indent_str = settings.one_line ? "" : std::string(4 * frame.indent, ' '); + + for (ASTs::const_iterator it = children.begin(); it != children.end(); ++it) + { + if (it != children.begin()) + { + settings.ostr << settings.nl_or_ws << indent_str << (settings.hilite ? hilite_keyword : "") + << (final_operator == Operator::INTERSECT ? "INTERSECT" : "EXCEPT") + << (settings.hilite ? hilite_none : "") + << settings.nl_or_ws; + } + + (*it)->formatImpl(settings, state, frame); + } +} + +} diff --git a/src/Parsers/ASTSelectIntersectExceptQuery.h b/src/Parsers/ASTSelectIntersectExceptQuery.h new file mode 100644 index 00000000000..97a8296ce2c --- /dev/null +++ b/src/Parsers/ASTSelectIntersectExceptQuery.h @@ -0,0 +1,31 @@ +#pragma once + +#include + + +namespace DB +{ + +class ASTSelectIntersectExceptQuery : public ASTQueryWithOutput +{ +public: + String getID(char) const override { return "SelectIntersectExceptQuery"; } + + ASTPtr clone() const override; + + void formatQueryImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const override; + + const char * getQueryKindString() const override { return "SelectIntersectExcept"; } + + enum class Operator + { + UNKNOWN, + INTERSECT, + EXCEPT + }; + + /// Final operator after applying visitor. + Operator final_operator = Operator::UNKNOWN; +}; + +} diff --git a/src/Parsers/ASTSelectQuery.h b/src/Parsers/ASTSelectQuery.h index 12817199d13..2babc2f75c8 100644 --- a/src/Parsers/ASTSelectQuery.h +++ b/src/Parsers/ASTSelectQuery.h @@ -35,6 +35,44 @@ public: SETTINGS }; + static String expressionToString(Expression expr) + { + switch (expr) + { + case Expression::WITH: + return "WITH"; + case Expression::SELECT: + return "SELECT"; + case Expression::TABLES: + return "TABLES"; + case Expression::PREWHERE: + return "PREWHERE"; + case Expression::WHERE: + return "WHERE"; + case Expression::GROUP_BY: + return "GROUP BY"; + case Expression::HAVING: + return "HAVING"; + case Expression::WINDOW: + return "WINDOW"; + case Expression::ORDER_BY: + return "ORDER BY"; + case Expression::LIMIT_BY_OFFSET: + return "LIMIT BY OFFSET"; + case Expression::LIMIT_BY_LENGTH: + return "LIMIT BY LENGTH"; + case Expression::LIMIT_BY: + return "LIMIT BY"; + case Expression::LIMIT_OFFSET: + return "LIMIT OFFSET"; + case Expression::LIMIT_LENGTH: + return "LIMIT LENGTH"; + case Expression::SETTINGS: + return "SETTINGS"; + } + return ""; + } + /** Get the text that identifies this element. */ String getID(char) const override { return "SelectQuery"; } diff --git a/src/Parsers/ASTSelectWithUnionQuery.cpp b/src/Parsers/ASTSelectWithUnionQuery.cpp index fa7359574f8..a0b213f528f 100644 --- a/src/Parsers/ASTSelectWithUnionQuery.cpp +++ b/src/Parsers/ASTSelectWithUnionQuery.cpp @@ -20,6 +20,7 @@ ASTPtr ASTSelectWithUnionQuery::clone() const res->union_mode = union_mode; res->list_of_modes = list_of_modes; + res->set_of_modes = set_of_modes; cloneOutputOptions(*res); return res; @@ -32,18 +33,21 @@ void ASTSelectWithUnionQuery::formatQueryImpl(const FormatSettings & settings, F auto mode_to_str = [&](auto mode) { - if (mode == Mode::Unspecified) - return ""; - else if (mode == Mode::ALL) - return " ALL"; - else - return " DISTINCT"; + if (mode == Mode::ALL) + return "UNION ALL"; + else if (mode == Mode::DISTINCT) + return "UNION DISTINCT"; + else if (mode == Mode::INTERSECT) + return "INTERSECT"; + else if (mode == Mode::EXCEPT) + return "EXCEPT"; + return ""; }; for (ASTs::const_iterator it = list_of_selects->children.begin(); it != list_of_selects->children.end(); ++it) { if (it != list_of_selects->children.begin()) - settings.ostr << settings.nl_or_ws << indent_str << (settings.hilite ? hilite_keyword : "") << "UNION" + settings.ostr << settings.nl_or_ws << indent_str << (settings.hilite ? hilite_keyword : "") << mode_to_str((is_normalized) ? union_mode : list_of_modes[it - list_of_selects->children.begin() - 1]) << (settings.hilite ? hilite_none : ""); @@ -71,4 +75,10 @@ void ASTSelectWithUnionQuery::formatQueryImpl(const FormatSettings & settings, F } } + +bool ASTSelectWithUnionQuery::hasNonDefaultUnionMode() const +{ + return set_of_modes.contains(Mode::DISTINCT) || set_of_modes.contains(Mode::INTERSECT) || set_of_modes.contains(Mode::EXCEPT); +} + } diff --git a/src/Parsers/ASTSelectWithUnionQuery.h b/src/Parsers/ASTSelectWithUnionQuery.h index 0465bdac3a6..66143bfef97 100644 --- a/src/Parsers/ASTSelectWithUnionQuery.h +++ b/src/Parsers/ASTSelectWithUnionQuery.h @@ -14,6 +14,7 @@ public: String getID(char) const override { return "SelectWithUnionQuery"; } ASTPtr clone() const override; + void formatQueryImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const override; const char * getQueryKindString() const override { return "Select"; } @@ -22,10 +23,13 @@ public: { Unspecified, ALL, - DISTINCT + DISTINCT, + EXCEPT, + INTERSECT }; using UnionModes = std::vector; + using UnionModesSet = std::unordered_set; Mode union_mode; @@ -34,6 +38,11 @@ public: bool is_normalized = false; ASTPtr list_of_selects; + + UnionModesSet set_of_modes; + + /// Consider any mode other than ALL as non-default. + bool hasNonDefaultUnionMode() const; }; } diff --git a/src/Parsers/CMakeLists.txt b/src/Parsers/CMakeLists.txt index 5aaa5c32f92..a20dd3567a9 100644 --- a/src/Parsers/CMakeLists.txt +++ b/src/Parsers/CMakeLists.txt @@ -12,3 +12,7 @@ endif () if(ENABLE_EXAMPLES) add_subdirectory(examples) endif() + +if (ENABLE_FUZZING) + add_subdirectory(fuzzers) +endif() diff --git a/src/Parsers/ExpressionElementParsers.cpp b/src/Parsers/ExpressionElementParsers.cpp index ca563ddea41..ed15d5f2a86 100644 --- a/src/Parsers/ExpressionElementParsers.cpp +++ b/src/Parsers/ExpressionElementParsers.cpp @@ -3,10 +3,10 @@ #include -#include #include -#include +#include #include +#include #include #include @@ -268,7 +268,6 @@ bool ParserCompoundIdentifier::parseImpl(Pos & pos, ASTPtr & node, Expected & ex return true; } - bool ParserFunction::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) { ParserIdentifier id_parser; @@ -276,6 +275,7 @@ bool ParserFunction::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) ParserKeyword all("ALL"); ParserExpressionList contents(false, is_table_function); ParserSelectWithUnionQuery select; + ParserKeyword filter("FILTER"); ParserKeyword over("OVER"); bool has_all = false; @@ -440,16 +440,27 @@ bool ParserFunction::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) function_node->children.push_back(function_node->parameters); } - if (over.ignore(pos, expected)) + if (filter.ignore(pos, expected)) { - function_node->is_window_function = true; - // We are slightly breaking the parser interface by parsing the window // definition into an existing ASTFunction. Normally it would take a // reference to ASTPtr and assign it the new node. We only have a pointer // of a different type, hence this workaround with a temporary pointer. ASTPtr function_node_as_iast = function_node; + ParserFilterClause filter_parser; + if (!filter_parser.parse(pos, function_node_as_iast, expected)) + { + return false; + } + } + + if (over.ignore(pos, expected)) + { + function_node->is_window_function = true; + + ASTPtr function_node_as_iast = function_node; + ParserWindowReference window_reference; if (!window_reference.parse(pos, function_node_as_iast, expected)) { @@ -504,6 +515,40 @@ bool ParserTableFunctionView::parseImpl(Pos & pos, ASTPtr & node, Expected & exp return true; } +bool ParserFilterClause::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) +{ + assert(node); + ASTFunction & function = dynamic_cast(*node); + + ParserToken parser_opening_bracket(TokenType::OpeningRoundBracket); + if (!parser_opening_bracket.ignore(pos, expected)) + { + return false; + } + + ParserKeyword parser_where("WHERE"); + if (!parser_where.ignore(pos, expected)) + { + return false; + } + ParserExpressionList parser_condition(false); + ASTPtr condition; + if (!parser_condition.parse(pos, condition, expected) || condition->children.size() != 1) + { + return false; + } + + ParserToken parser_closing_bracket(TokenType::ClosingRoundBracket); + if (!parser_closing_bracket.ignore(pos, expected)) + { + return false; + } + + function.name += "If"; + function.arguments->children.push_back(condition->children[0]); + return true; +} + bool ParserWindowReference::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) { assert(node); @@ -850,15 +895,24 @@ static bool isOneOf(TokenType token) return ((token == tokens) || ...); } - bool ParserCastOperator::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) { - /// Parse numbers (including decimals), strings and arrays of them. + /// Parse numbers (including decimals), strings, arrays and tuples of them. const char * data_begin = pos->begin; const char * data_end = pos->end; bool is_string_literal = pos->type == TokenType::StringLiteral; - if (pos->type == TokenType::Number || is_string_literal) + + if (pos->type == TokenType::Minus) + { + ++pos; + if (pos->type != TokenType::Number) + return false; + + data_end = pos->end; + ++pos; + } + else if (pos->type == TokenType::Number || is_string_literal) { ++pos; } @@ -876,7 +930,7 @@ bool ParserCastOperator::parseImpl(Pos & pos, ASTPtr & node, Expected & expected } else if (pos->type == TokenType::ClosingSquareBracket) { - if (isOneOf(last_token)) + if (isOneOf(last_token)) return false; if (stack.empty() || stack.back() != TokenType::OpeningSquareBracket) return false; @@ -884,7 +938,7 @@ bool ParserCastOperator::parseImpl(Pos & pos, ASTPtr & node, Expected & expected } else if (pos->type == TokenType::ClosingRoundBracket) { - if (isOneOf(last_token)) + if (isOneOf(last_token)) return false; if (stack.empty() || stack.back() != TokenType::OpeningRoundBracket) return false; @@ -892,10 +946,15 @@ bool ParserCastOperator::parseImpl(Pos & pos, ASTPtr & node, Expected & expected } else if (pos->type == TokenType::Comma) { - if (isOneOf(last_token)) + if (isOneOf(last_token)) return false; } - else if (isOneOf(pos->type)) + else if (pos->type == TokenType::Number) + { + if (!isOneOf(last_token)) + return false; + } + else if (isOneOf(pos->type)) { if (!isOneOf(last_token)) return false; @@ -915,6 +974,8 @@ bool ParserCastOperator::parseImpl(Pos & pos, ASTPtr & node, Expected & expected if (!stack.empty()) return false; } + else + return false; ASTPtr type_ast; if (ParserToken(TokenType::DoubleColon).ignore(pos, expected) @@ -1713,6 +1774,8 @@ const char * ParserAlias::restricted_keywords[] = "WHERE", "WINDOW", "WITH", + "INTERSECT", + "EXCEPT", nullptr }; @@ -1809,20 +1872,47 @@ bool ParserColumnsTransformers::parseImpl(Pos & pos, ASTPtr & node, Expected & e with_open_round_bracket = true; } + ASTPtr lambda; + String lambda_arg; ASTPtr func_name; - if (!ParserIdentifier().parse(pos, func_name, expected)) - return false; - ASTPtr expr_list_args; - if (pos->type == TokenType::OpeningRoundBracket) + auto opos = pos; + if (ParserLambdaExpression().parse(pos, lambda, expected)) { - ++pos; - if (!ParserExpressionList(false).parse(pos, expr_list_args, expected)) + if (const auto * func = lambda->as(); func && func->name == "lambda") + { + const auto * lambda_args_tuple = func->arguments->children.at(0)->as(); + const ASTs & lambda_arg_asts = lambda_args_tuple->arguments->children; + if (lambda_arg_asts.size() != 1) + throw Exception(ErrorCodes::BAD_ARGUMENTS, "APPLY column transformer can only accept lambda with one argument"); + + if (auto opt_arg_name = tryGetIdentifierName(lambda_arg_asts[0]); opt_arg_name) + lambda_arg = *opt_arg_name; + else + throw Exception(ErrorCodes::BAD_ARGUMENTS, "lambda argument declarations must be identifiers"); + } + else + { + lambda = nullptr; + pos = opos; + } + } + + if (!lambda) + { + if (!ParserIdentifier().parse(pos, func_name, expected)) return false; - if (pos->type != TokenType::ClosingRoundBracket) - return false; - ++pos; + if (pos->type == TokenType::OpeningRoundBracket) + { + ++pos; + if (!ParserExpressionList(false).parse(pos, expr_list_args, expected)) + return false; + + if (pos->type != TokenType::ClosingRoundBracket) + return false; + ++pos; + } } String column_name_prefix; @@ -1846,8 +1936,16 @@ bool ParserColumnsTransformers::parseImpl(Pos & pos, ASTPtr & node, Expected & e } auto res = std::make_shared(); - res->func_name = getIdentifierName(func_name); - res->parameters = expr_list_args; + if (lambda) + { + res->lambda = lambda; + res->lambda_arg = lambda_arg; + } + else + { + res->func_name = getIdentifierName(func_name); + res->parameters = expr_list_args; + } res->column_name_prefix = column_name_prefix; node = std::move(res); return true; diff --git a/src/Parsers/ExpressionElementParsers.h b/src/Parsers/ExpressionElementParsers.h index c4ddb056a4d..7d1cfc196d6 100644 --- a/src/Parsers/ExpressionElementParsers.h +++ b/src/Parsers/ExpressionElementParsers.h @@ -171,6 +171,13 @@ protected: bool parseImpl(Pos & pos, ASTPtr & node, Expected & expected) override; }; +// Allows to make queries like SELECT SUM() FILTER(WHERE ) FROM ... +class ParserFilterClause : public IParserBase +{ + const char * getName() const override { return "filter"; } + bool parseImpl(Pos & pos, ASTPtr & node, Expected & expected) override; +}; + // Window reference (the thing that goes after OVER) for window function. // Can be either window name or window definition. class ParserWindowReference : public IParserBase diff --git a/src/Parsers/ExpressionListParsers.cpp b/src/Parsers/ExpressionListParsers.cpp index 5047ce39d47..3aa5c82884b 100644 --- a/src/Parsers/ExpressionListParsers.cpp +++ b/src/Parsers/ExpressionListParsers.cpp @@ -1,17 +1,21 @@ #include +#include #include #include #include +#include +#include +#include #include #include +#include #include namespace DB { - const char * ParserMultiplicativeExpression::operators[] = { "*", "multiply", @@ -108,12 +112,18 @@ bool ParserList::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) bool ParserUnionList::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) { + ParserUnionQueryElement elem_parser; + ParserKeyword s_union_parser("UNION"); + ParserKeyword s_all_parser("ALL"); + ParserKeyword s_distinct_parser("DISTINCT"); + ParserKeyword s_except_parser("EXCEPT"); + ParserKeyword s_intersect_parser("INTERSECT"); ASTs elements; auto parse_element = [&] { ASTPtr element; - if (!elem_parser->parse(pos, element, expected)) + if (!elem_parser.parse(pos, element, expected)) return false; elements.push_back(element); @@ -123,21 +133,33 @@ bool ParserUnionList::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) /// Parse UNION type auto parse_separator = [&] { - if (s_union_parser->ignore(pos, expected)) + if (s_union_parser.ignore(pos, expected)) { // SELECT ... UNION ALL SELECT ... - if (s_all_parser->check(pos, expected)) + if (s_all_parser.check(pos, expected)) { union_modes.push_back(ASTSelectWithUnionQuery::Mode::ALL); } // SELECT ... UNION DISTINCT SELECT ... - else if (s_distinct_parser->check(pos, expected)) + else if (s_distinct_parser.check(pos, expected)) { union_modes.push_back(ASTSelectWithUnionQuery::Mode::DISTINCT); } // SELECT ... UNION SELECT ... else + { union_modes.push_back(ASTSelectWithUnionQuery::Mode::Unspecified); + } + return true; + } + else if (s_except_parser.check(pos, expected)) + { + union_modes.push_back(ASTSelectWithUnionQuery::Mode::EXCEPT); + return true; + } + else if (s_intersect_parser.check(pos, expected)) + { + union_modes.push_back(ASTSelectWithUnionQuery::Mode::INTERSECT); return true; } return false; @@ -169,6 +191,91 @@ static bool parseOperator(IParser::Pos & pos, const char * op, Expected & expect } } +enum class SubqueryFunctionType +{ + NONE, + ANY, + ALL +}; + +static bool modifyAST(ASTPtr ast, SubqueryFunctionType type) +{ + /* Rewrite in AST: + * = ANY --> 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' [') */ @@ -546,10 +664,12 @@ bool ParserUnaryExpression::parseImpl(Pos & pos, ASTPtr & node, Expected & expec if (pos->type == TokenType::Minus) { - ParserLiteral lit_p; Pos begin = pos; + if (ParserCastOperator().parse(pos, node, expected)) + return true; - if (lit_p.parse(pos, node, expected)) + pos = begin; + if (ParserLiteral().parse(pos, node, expected)) return true; pos = begin; @@ -855,4 +975,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/ParserBackupQuery.cpp b/src/Parsers/ParserBackupQuery.cpp new file mode 100644 index 00000000000..f9a54f053af --- /dev/null +++ b/src/Parsers/ParserBackupQuery.cpp @@ -0,0 +1,204 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace DB +{ + +namespace +{ + using Kind = ASTBackupQuery::Kind; + using Element = ASTBackupQuery::Element; + using ElementType = ASTBackupQuery::ElementType; + + bool parseName(IParser::Pos & pos, Expected & expected, ElementType type, DatabaseAndTableName & name) + { + switch (type) + { + case ElementType::TABLE: [[fallthrough]]; + case ElementType::DICTIONARY: + { + return parseDatabaseAndTableName(pos, expected, name.first, name.second); + } + + case ElementType::DATABASE: + { + ASTPtr ast; + if (!ParserIdentifier{}.parse(pos, ast, expected)) + return false; + name.first = getIdentifierName(ast); + name.second.clear(); + return true; + } + + case ElementType::TEMPORARY_TABLE: + { + ASTPtr ast; + if (!ParserIdentifier{}.parse(pos, ast, expected)) + return false; + name.second = getIdentifierName(ast); + name.first.clear(); + return true; + } + + default: + return true; + } + } + + bool parsePartitions(IParser::Pos & pos, Expected & expected, ASTs & partitions) + { + if (!ParserKeyword{"PARTITION"}.ignore(pos, expected) && !ParserKeyword{"PARTITIONS"}.ignore(pos, expected)) + return false; + + ASTs result; + auto parse_list_element = [&] + { + ASTPtr ast; + if (!ParserPartition{}.parse(pos, ast, expected)) + return false; + result.emplace_back(ast); + return true; + }; + if (!ParserList::parseUtil(pos, expected, parse_list_element, false)) + return false; + + partitions = std::move(result); + return true; + } + + bool parseElement(IParser::Pos & pos, Expected & expected, Element & entry) + { + return IParserBase::wrapParseImpl(pos, [&] + { + ElementType type; + if (ParserKeyword{"TABLE"}.ignore(pos, expected)) + type = ElementType::TABLE; + else if (ParserKeyword{"DICTIONARY"}.ignore(pos, expected)) + type = ElementType::DICTIONARY; + else if (ParserKeyword{"DATABASE"}.ignore(pos, expected)) + type = ElementType::DATABASE; + else if (ParserKeyword{"ALL DATABASES"}.ignore(pos, expected)) + type = ElementType::ALL_DATABASES; + else if (ParserKeyword{"TEMPORARY TABLE"}.ignore(pos, expected)) + type = ElementType::TEMPORARY_TABLE; + else if (ParserKeyword{"ALL TEMPORARY TABLES"}.ignore(pos, expected)) + type = ElementType::ALL_TEMPORARY_TABLES; + else if (ParserKeyword{"EVERYTHING"}.ignore(pos, expected)) + type = ElementType::EVERYTHING; + else + return false; + + DatabaseAndTableName name; + if (!parseName(pos, expected, type, name)) + return false; + + ASTs partitions; + if (type == ElementType::TABLE) + parsePartitions(pos, expected, partitions); + + DatabaseAndTableName new_name; + if (ParserKeyword{"AS"}.ignore(pos, expected) || ParserKeyword{"INTO"}.ignore(pos, expected)) + { + if (!parseName(pos, expected, type, new_name)) + return false; + } + + if ((type == ElementType::TABLE) && partitions.empty()) + parsePartitions(pos, expected, partitions); + + entry.type = type; + entry.name = std::move(name); + entry.new_name = std::move(new_name); + entry.partitions = std::move(partitions); + return true; + }); + } + + bool parseElements(IParser::Pos & pos, Expected & expected, std::vector & elements) + { + return IParserBase::wrapParseImpl(pos, [&] + { + std::vector result; + + auto parse_element = [&] + { + Element element; + if (parseElement(pos, expected, element)) + { + result.emplace_back(std::move(element)); + return true; + } + return false; + }; + + if (!ParserList::parseUtil(pos, expected, parse_element, false)) + return false; + + elements = std::move(result); + return true; + }); + } + + bool parseSettings(IParser::Pos & pos, Expected & expected, ASTPtr & settings) + { + return IParserBase::wrapParseImpl(pos, [&] + { + if (!ParserKeyword{"SETTINGS"}.ignore(pos, expected)) + return false; + + ASTPtr result; + if (!ParserSetQuery{true}.parse(pos, result, expected)) + return false; + + settings = std::move(result); + return true; + }); + } +} + + +bool ParserBackupQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) +{ + Kind kind; + if (ParserKeyword{"BACKUP"}.ignore(pos, expected)) + kind = Kind::BACKUP; + else if (ParserKeyword{"RESTORE"}.ignore(pos, expected)) + kind = Kind::RESTORE; + else + return false; + + std::vector elements; + if (!parseElements(pos, expected, elements)) + return false; + + if (!ParserKeyword{(kind == Kind::BACKUP) ? "TO" : "FROM"}.ignore(pos, expected)) + return false; + ASTPtr ast; + if (!ParserStringLiteral{}.parse(pos, ast, expected)) + return false; + String backup_name = ast->as().value.safeGet(); + + ASTPtr settings; + parseSettings(pos, expected, settings); + + auto query = std::make_shared(); + node = query; + + query->kind = kind; + query->elements = std::move(elements); + query->backup_name = std::move(backup_name); + query->settings = std::move(settings); + + return true; +} + +} diff --git a/src/Parsers/ParserBackupQuery.h b/src/Parsers/ParserBackupQuery.h new file mode 100644 index 00000000000..45a551cfd00 --- /dev/null +++ b/src/Parsers/ParserBackupQuery.h @@ -0,0 +1,34 @@ +#pragma once + +#include + + +namespace DB +{ +/** Parses queries like + * BACKUP { TABLE [db.]table_name [AS [db.]table_name_in_backup] [PARTITION[S] partition_expr [,...]] | + * DICTIONARY [db.]dictionary_name [AS [db.]dictionary_name_in_backup] | + * DATABASE database_name [AS database_name_in_backup] | + * ALL DATABASES | + * TEMPORARY TABLE table_name [AS table_name_in_backup] + * ALL TEMPORARY TABLES | + * EVERYTHING } [,...] + * TO 'backup_name' + * [SETTINGS base_backup = 'base_backup_name'] + * + * RESTORE { TABLE [db.]table_name_in_backup [INTO [db.]table_name] [PARTITION[S] partition_expr [,...]] | + * DICTIONARY [db.]dictionary_name_in_backup [INTO [db.]dictionary_name] | + * DATABASE database_name_in_backup [INTO database_name] | + * ALL DATABASES | + * TEMPORARY TABLE table_name_in_backup [INTO table_name] | + * ALL TEMPORARY TABLES | + * EVERYTHING } [,...] + * FROM 'backup_name' + */ +class ParserBackupQuery : public IParserBase +{ +protected: + const char * getName() const override { return "BACKUP or RESTORE query"; } + bool parseImpl(Pos & pos, ASTPtr & node, Expected & expected) override; +}; +} diff --git a/src/Parsers/ParserCreateFunctionQuery.cpp b/src/Parsers/ParserCreateFunctionQuery.cpp new file mode 100644 index 00000000000..fbfd02415e7 --- /dev/null +++ b/src/Parsers/ParserCreateFunctionQuery.cpp @@ -0,0 +1,47 @@ +#include +#include +#include +#include +#include +#include +#include + +namespace DB +{ + +bool ParserCreateFunctionQuery::parseImpl(IParser::Pos & pos, ASTPtr & node, Expected & expected) +{ + ParserKeyword s_create("CREATE"); + ParserKeyword s_function("FUNCTION"); + ParserIdentifier function_name_p; + ParserKeyword s_as("AS"); + ParserLambdaExpression lambda_p; + + ASTPtr function_name; + ASTPtr function_core; + + if (!s_create.ignore(pos, expected)) + return false; + + if (!s_function.ignore(pos, expected)) + return false; + + if (!function_name_p.parse(pos, function_name, expected)) + return false; + + if (!s_as.ignore(pos, expected)) + return false; + + if (!lambda_p.parse(pos, function_core, expected)) + return false; + + auto create_function_query = std::make_shared(); + node = create_function_query; + + create_function_query->function_name = function_name->as().name(); + create_function_query->function_core = function_core; + + return true; +} + +} diff --git a/src/Parsers/ParserCreateFunctionQuery.h b/src/Parsers/ParserCreateFunctionQuery.h new file mode 100644 index 00000000000..aac643b995d --- /dev/null +++ b/src/Parsers/ParserCreateFunctionQuery.h @@ -0,0 +1,16 @@ +#pragma once + +#include "IParserBase.h" + +namespace DB +{ + +/// CREATE FUNCTION test AS x -> x || '1' +class ParserCreateFunctionQuery : public IParserBase +{ +protected: + const char * getName() const override { return "CREATE FUNCTION query"; } + bool parseImpl(Pos & pos, ASTPtr & node, Expected & expected) override; +}; + +} diff --git a/src/Parsers/ParserDropFunctionQuery.cpp b/src/Parsers/ParserDropFunctionQuery.cpp new file mode 100644 index 00000000000..04d26109836 --- /dev/null +++ b/src/Parsers/ParserDropFunctionQuery.cpp @@ -0,0 +1,35 @@ +#include +#include +#include +#include +#include + +namespace DB +{ + +bool ParserDropFunctionQuery::parseImpl(IParser::Pos & pos, ASTPtr & node, Expected & expected) +{ + ParserKeyword s_drop("DROP"); + ParserKeyword s_function("FUNCTION"); + ParserIdentifier function_name_p; + + ASTPtr function_name; + + if (!s_drop.ignore(pos, expected)) + return false; + + if (!s_function.ignore(pos, expected)) + return false; + + if (!function_name_p.parse(pos, function_name, expected)) + return false; + + auto drop_function_query = std::make_shared(); + node = drop_function_query; + + drop_function_query->function_name = function_name->as().name(); + + return true; +} + +} diff --git a/src/Parsers/ParserDropFunctionQuery.h b/src/Parsers/ParserDropFunctionQuery.h new file mode 100644 index 00000000000..03602c7ae96 --- /dev/null +++ b/src/Parsers/ParserDropFunctionQuery.h @@ -0,0 +1,14 @@ +#pragma once + +#include "IParserBase.h" + +namespace DB +{ +/// DROP FUNCTION function1 +class ParserDropFunctionQuery : public IParserBase +{ +protected: + const char * getName() const override { return "DROP FUNCTION query"; } + bool parseImpl(Pos & pos, ASTPtr & node, Expected & expected) override; +}; +} diff --git a/src/Parsers/ParserInsertQuery.cpp b/src/Parsers/ParserInsertQuery.cpp index 1f987edf13f..19457f027bf 100644 --- a/src/Parsers/ParserInsertQuery.cpp +++ b/src/Parsers/ParserInsertQuery.cpp @@ -11,6 +11,7 @@ #include #include #include +#include "Parsers/IAST_fwd.h" namespace DB @@ -25,6 +26,7 @@ namespace ErrorCodes bool ParserInsertQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) { ParserKeyword s_insert_into("INSERT INTO"); + ParserKeyword s_from_infile("FROM INFILE"); ParserKeyword s_table("TABLE"); ParserKeyword s_function("FUNCTION"); ParserToken s_dot(TokenType::Dot); @@ -33,21 +35,27 @@ bool ParserInsertQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) ParserKeyword s_settings("SETTINGS"); ParserKeyword s_select("SELECT"); ParserKeyword s_watch("WATCH"); + ParserKeyword s_partition_by("PARTITION BY"); ParserKeyword s_with("WITH"); ParserToken s_lparen(TokenType::OpeningRoundBracket); ParserToken s_rparen(TokenType::ClosingRoundBracket); ParserIdentifier name_p; ParserList columns_p(std::make_unique(), std::make_unique(TokenType::Comma), false); ParserFunction table_function_p{false}; + ParserStringLiteral infile_name_p; + ParserExpressionWithOptionalAlias exp_elem_p(false); ASTPtr database; ASTPtr table; + ASTPtr infile; ASTPtr columns; ASTPtr format; ASTPtr select; ASTPtr watch; ASTPtr table_function; ASTPtr settings_ast; + ASTPtr partition_by_expr; + /// Insertion data const char * data = nullptr; @@ -60,6 +68,12 @@ bool ParserInsertQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) { if (!table_function_p.parse(pos, table_function, expected)) return false; + + if (s_partition_by.ignore(pos, expected)) + { + if (!exp_elem_p.parse(pos, partition_by_expr, expected)) + return false; + } } else { @@ -86,8 +100,14 @@ bool ParserInsertQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) Pos before_values = pos; - /// VALUES or FORMAT or SELECT - if (s_values.ignore(pos, expected)) + if (s_from_infile.ignore(pos, expected)) + { + if (!infile_name_p.parse(pos, infile, expected)) + return false; + } + + /// VALUES or FROM INFILE or FORMAT or SELECT + if (!infile && s_values.ignore(pos, expected)) { data = pos->begin; } @@ -136,7 +156,7 @@ bool ParserInsertQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) } - if (format) + if (format && !infile) { Pos last_token = pos; --last_token; @@ -167,9 +187,13 @@ bool ParserInsertQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) auto query = std::make_shared(); node = query; + if (infile) + query->infile = infile; + if (table_function) { query->table_function = table_function; + query->partition_by = partition_by_expr; } else { diff --git a/src/Parsers/ParserQuery.cpp b/src/Parsers/ParserQuery.cpp index 4550bdc8a75..345013b6475 100644 --- a/src/Parsers/ParserQuery.cpp +++ b/src/Parsers/ParserQuery.cpp @@ -1,4 +1,6 @@ #include +#include +#include #include #include #include @@ -6,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -36,10 +39,13 @@ bool ParserQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) ParserCreateQuotaQuery create_quota_p; ParserCreateRowPolicyQuery create_row_policy_p; ParserCreateSettingsProfileQuery create_settings_profile_p; + ParserCreateFunctionQuery create_function_p; + ParserDropFunctionQuery drop_function_p; ParserDropAccessEntityQuery drop_access_entity_p; ParserGrantQuery grant_p; ParserSetRoleQuery set_role_p; ParserExternalDDLQuery external_ddl_p; + ParserBackupQuery backup_p; bool res = query_with_output_p.parse(pos, node, expected) || insert_p.parse(pos, node, expected) @@ -52,9 +58,12 @@ bool ParserQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) || create_quota_p.parse(pos, node, expected) || create_row_policy_p.parse(pos, node, expected) || create_settings_profile_p.parse(pos, node, expected) + || create_function_p.parse(pos, node, expected) + || drop_function_p.parse(pos, node, expected) || drop_access_entity_p.parse(pos, node, expected) || grant_p.parse(pos, node, expected) - || external_ddl_p.parse(pos, node, expected); + || external_ddl_p.parse(pos, node, expected) + || backup_p.parse(pos, node, expected); return res; } 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/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/examples/CMakeLists.txt b/src/Parsers/examples/CMakeLists.txt index 3ff40b3cc3b..3e1d6ae559f 100644 --- a/src/Parsers/examples/CMakeLists.txt +++ b/src/Parsers/examples/CMakeLists.txt @@ -8,14 +8,3 @@ target_link_libraries(select_parser PRIVATE clickhouse_parsers) add_executable(create_parser create_parser.cpp ${SRCS}) target_link_libraries(create_parser PRIVATE clickhouse_parsers) - -if (ENABLE_FUZZING) - add_executable(lexer_fuzzer lexer_fuzzer.cpp ${SRCS}) - target_link_libraries(lexer_fuzzer PRIVATE clickhouse_parsers ${LIB_FUZZING_ENGINE}) - - add_executable(select_parser_fuzzer select_parser_fuzzer.cpp ${SRCS}) - target_link_libraries(select_parser_fuzzer PRIVATE clickhouse_parsers ${LIB_FUZZING_ENGINE}) - - add_executable(create_parser_fuzzer create_parser_fuzzer.cpp ${SRCS}) - target_link_libraries(create_parser_fuzzer PRIVATE clickhouse_parsers ${LIB_FUZZING_ENGINE}) -endif () diff --git a/src/Parsers/fuzzers/CMakeLists.txt b/src/Parsers/fuzzers/CMakeLists.txt new file mode 100644 index 00000000000..0dd541e663f --- /dev/null +++ b/src/Parsers/fuzzers/CMakeLists.txt @@ -0,0 +1,8 @@ +add_executable(lexer_fuzzer lexer_fuzzer.cpp ${SRCS}) +target_link_libraries(lexer_fuzzer PRIVATE clickhouse_parsers ${LIB_FUZZING_ENGINE}) + +add_executable(select_parser_fuzzer select_parser_fuzzer.cpp ${SRCS}) +target_link_libraries(select_parser_fuzzer PRIVATE clickhouse_parsers ${LIB_FUZZING_ENGINE}) + +add_executable(create_parser_fuzzer create_parser_fuzzer.cpp ${SRCS}) +target_link_libraries(create_parser_fuzzer PRIVATE clickhouse_parsers ${LIB_FUZZING_ENGINE}) diff --git a/src/Parsers/examples/create_parser_fuzzer.cpp b/src/Parsers/fuzzers/create_parser_fuzzer.cpp similarity index 82% rename from src/Parsers/examples/create_parser_fuzzer.cpp rename to src/Parsers/fuzzers/create_parser_fuzzer.cpp index 169f7b765b7..b0adec7d634 100644 --- a/src/Parsers/examples/create_parser_fuzzer.cpp +++ b/src/Parsers/fuzzers/create_parser_fuzzer.cpp @@ -15,7 +15,10 @@ try DB::ParserCreateQuery parser; DB::ASTPtr ast = parseQuery(parser, input.data(), input.data() + input.size(), "", 0, 0); - DB::formatAST(*ast, std::cerr); + DB::WriteBufferFromOwnString wb; + DB::formatAST(*ast, wb); + + std::cerr << wb.str() << std::endl; return 0; } diff --git a/src/Parsers/examples/lexer_fuzzer.cpp b/src/Parsers/fuzzers/lexer_fuzzer.cpp similarity index 100% rename from src/Parsers/examples/lexer_fuzzer.cpp rename to src/Parsers/fuzzers/lexer_fuzzer.cpp diff --git a/src/Parsers/examples/select_parser_fuzzer.cpp b/src/Parsers/fuzzers/select_parser_fuzzer.cpp similarity index 82% rename from src/Parsers/examples/select_parser_fuzzer.cpp rename to src/Parsers/fuzzers/select_parser_fuzzer.cpp index 4848b285c07..bdba552dfa7 100644 --- a/src/Parsers/examples/select_parser_fuzzer.cpp +++ b/src/Parsers/fuzzers/select_parser_fuzzer.cpp @@ -14,7 +14,10 @@ try DB::ParserQueryWithOutput parser(input.data() + input.size()); DB::ASTPtr ast = parseQuery(parser, input.data(), input.data() + input.size(), "", 0, 0); - DB::formatAST(*ast, std::cerr); + DB::WriteBufferFromOwnString wb; + DB::formatAST(*ast, wb); + + std::cerr << wb.str() << std::endl; return 0; } diff --git a/src/Parsers/getInsertQuery.cpp b/src/Parsers/getInsertQuery.cpp new file mode 100644 index 00000000000..6f52056dfe2 --- /dev/null +++ b/src/Parsers/getInsertQuery.cpp @@ -0,0 +1,28 @@ +#include + +#include +#include +#include +#include + + +namespace DB +{ +std::string getInsertQuery(const std::string & db_name, const std::string & table_name, const ColumnsWithTypeAndName & columns, IdentifierQuotingStyle quoting) +{ + ASTInsertQuery query; + query.table_id.database_name = db_name; + query.table_id.table_name = table_name; + query.columns = std::make_shared(','); + query.children.push_back(query.columns); + for (const auto & column : columns) + query.columns->children.emplace_back(std::make_shared(column.name)); + + WriteBufferFromOwnString buf; + IAST::FormatSettings settings(buf, true); + settings.always_quote_identifiers = true; + settings.identifier_quoting_style = quoting; + query.IAST::format(settings); + return buf.str(); +} +} diff --git a/src/Parsers/getInsertQuery.h b/src/Parsers/getInsertQuery.h new file mode 100644 index 00000000000..0bcb5e3660b --- /dev/null +++ b/src/Parsers/getInsertQuery.h @@ -0,0 +1,8 @@ +#pragma once +#include +#include + +namespace DB +{ +std::string getInsertQuery(const std::string & db_name, const std::string & table_name, const ColumnsWithTypeAndName & columns, IdentifierQuotingStyle quoting); +} diff --git a/src/Parsers/ya.make b/src/Parsers/ya.make index 3b8a9a19bce..e169b812dff 100644 --- a/src/Parsers/ya.make +++ b/src/Parsers/ya.make @@ -15,6 +15,7 @@ SRCS( ASTColumnsMatcher.cpp ASTColumnsTransformers.cpp ASTConstraintDeclaration.cpp + ASTCreateFunctionQuery.cpp ASTCreateQuery.cpp ASTCreateQuotaQuery.cpp ASTCreateRoleQuery.cpp @@ -25,6 +26,7 @@ SRCS( ASTDictionary.cpp ASTDictionaryAttributeDeclaration.cpp ASTDropAccessEntityQuery.cpp + ASTDropFunctionQuery.cpp ASTDropQuery.cpp ASTExpressionList.cpp ASTFunction.cpp @@ -89,6 +91,7 @@ SRCS( ParserAlterQuery.cpp ParserCase.cpp ParserCheckQuery.cpp + ParserCreateFunctionQuery.cpp ParserCreateQuery.cpp ParserCreateQuotaQuery.cpp ParserCreateRoleQuery.cpp @@ -101,6 +104,7 @@ SRCS( ParserDictionary.cpp ParserDictionaryAttributeDeclaration.cpp ParserDropAccessEntityQuery.cpp + ParserDropFunctionQuery.cpp ParserDropQuery.cpp ParserExplainQuery.cpp ParserExternalDDLQuery.cpp 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 6fdcc544a18..4c6f4624ad4 100644 --- a/src/Processors/Formats/Impl/MySQLOutputFormat.cpp +++ b/src/Processors/Formats/Impl/MySQLOutputFormat.cpp @@ -64,7 +64,6 @@ void MySQLOutputFormat::initialize() } } - void MySQLOutputFormat::consume(Chunk chunk) { initialize(); 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/ReadFromMergeTree.cpp b/src/Processors/QueryPlan/ReadFromMergeTree.cpp index 4276160f514..dc3e863b841 100644 --- a/src/Processors/QueryPlan/ReadFromMergeTree.cpp +++ b/src/Processors/QueryPlan/ReadFromMergeTree.cpp @@ -40,18 +40,6 @@ namespace ErrorCodes extern const int LOGICAL_ERROR; } -struct ReadFromMergeTree::AnalysisResult -{ - RangesInDataParts parts_with_ranges; - MergeTreeDataSelectSamplingData sampling; - 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) { const auto & settings = context->getSettingsRef(); @@ -84,7 +72,8 @@ ReadFromMergeTree::ReadFromMergeTree( size_t num_streams_, bool sample_factor_column_queried_, std::shared_ptr max_block_numbers_to_read_, - Poco::Logger * log_) + Poco::Logger * log_, + MergeTreeDataSelectAnalysisResultPtr analyzed_result_ptr_) : ISourceStep(DataStream{.header = MergeTreeBaseSelectProcessor::transformHeader( metadata_snapshot_->getSampleBlockForColumns(real_column_names_, data_.getVirtuals(), data_.getStorageID()), getPrewhereInfo(query_info_), @@ -108,6 +97,7 @@ ReadFromMergeTree::ReadFromMergeTree( , sample_factor_column_queried(sample_factor_column_queried_) , max_block_numbers_to_read(std::move(max_block_numbers_to_read_)) , log(log_) + , analyzed_result_ptr(analyzed_result_ptr_) { if (sample_factor_column_queried) { @@ -779,7 +769,34 @@ Pipe ReadFromMergeTree::spreadMarkRangesAmongStreamsFinal( return Pipe::unitePipes(std::move(partition_pipes)); } -ReadFromMergeTree::AnalysisResult ReadFromMergeTree::selectRangesToRead(MergeTreeData::DataPartsVector parts) const +MergeTreeDataSelectAnalysisResultPtr ReadFromMergeTree::selectRangesToRead(MergeTreeData::DataPartsVector parts) const +{ + return selectRangesToRead( + std::move(parts), + metadata_snapshot_base, + metadata_snapshot, + query_info, + context, + requested_num_streams, + max_block_numbers_to_read, + data, + real_column_names, + sample_factor_column_queried, + log); +} + +MergeTreeDataSelectAnalysisResultPtr ReadFromMergeTree::selectRangesToRead( + MergeTreeData::DataPartsVector parts, + const StorageMetadataPtr & metadata_snapshot_base, + const StorageMetadataPtr & metadata_snapshot, + const SelectQueryInfo & query_info, + ContextPtr context, + unsigned num_streams, + std::shared_ptr max_block_numbers_to_read, + const MergeTreeData & data, + const Names & real_column_names, + bool sample_factor_column_queried, + Poco::Logger * log) { AnalysisResult result; const auto & settings = context->getSettingsRef(); @@ -788,7 +805,7 @@ ReadFromMergeTree::AnalysisResult ReadFromMergeTree::selectRangesToRead(MergeTre auto part_values = MergeTreeDataSelectExecutor::filterPartsByVirtualColumns(data, parts, query_info.query, context); if (part_values && part_values->empty()) - return result; + return std::make_shared(MergeTreeDataSelectAnalysisResult{.result = std::move(result)}); result.column_names_to_read = real_column_names; @@ -808,44 +825,66 @@ ReadFromMergeTree::AnalysisResult ReadFromMergeTree::selectRangesToRead(MergeTre if (settings.force_primary_key && key_condition.alwaysUnknownOrTrue()) { - throw Exception( - ErrorCodes::INDEX_NOT_USED, - "Primary key ({}) is not used and setting 'force_primary_key' is set.", - fmt::join(primary_key_columns, ", ")); + return std::make_shared(MergeTreeDataSelectAnalysisResult{ + .result = std::make_exception_ptr(Exception( + ErrorCodes::INDEX_NOT_USED, + "Primary key ({}) is not used and setting 'force_primary_key' is set.", + fmt::join(primary_key_columns, ", ")))}); } LOG_DEBUG(log, "Key condition: {}", key_condition.toString()); const auto & select = query_info.query->as(); - MergeTreeDataSelectExecutor::filterPartsByPartition( - parts, part_values, metadata_snapshot_base, data, query_info, context, - max_block_numbers_to_read.get(), log, result.index_stats); - - result.sampling = MergeTreeDataSelectExecutor::getSampling( - select, metadata_snapshot->getColumns().getAllPhysical(), parts, key_condition, - data, metadata_snapshot, context, sample_factor_column_queried, log); - - if (result.sampling.read_nothing) - return result; - size_t total_marks_pk = 0; - for (const auto & part : parts) - total_marks_pk += part->index_granularity.getMarksCountWithoutFinal(); + size_t parts_before_pk = 0; + try + { + MergeTreeDataSelectExecutor::filterPartsByPartition( + parts, + part_values, + metadata_snapshot_base, + data, + query_info, + context, + max_block_numbers_to_read.get(), + log, + result.index_stats); - size_t parts_before_pk = parts.size(); + result.sampling = MergeTreeDataSelectExecutor::getSampling( + select, + metadata_snapshot->getColumns().getAllPhysical(), + parts, + key_condition, + data, + metadata_snapshot, + context, + sample_factor_column_queried, + log); - result.parts_with_ranges = MergeTreeDataSelectExecutor::filterPartsByPrimaryKeyAndSkipIndexes( - std::move(parts), - metadata_snapshot, - query_info, - context, - key_condition, - reader_settings, - log, - requested_num_streams, - result.index_stats, - true /* use_skip_indexes */, - true /* check_limits */); + if (result.sampling.read_nothing) + return std::make_shared(MergeTreeDataSelectAnalysisResult{.result = std::move(result)}); + + for (const auto & part : parts) + total_marks_pk += part->index_granularity.getMarksCountWithoutFinal(); + parts_before_pk = parts.size(); + + auto reader_settings = getMergeTreeReaderSettings(context); + result.parts_with_ranges = MergeTreeDataSelectExecutor::filterPartsByPrimaryKeyAndSkipIndexes( + std::move(parts), + metadata_snapshot, + query_info, + context, + key_condition, + reader_settings, + log, + num_streams, + result.index_stats, + true /* use_skip_indexes */); + } + catch (...) + { + return std::make_shared(MergeTreeDataSelectAnalysisResult{.result = std::current_exception()}); + } size_t sum_marks_pk = total_marks_pk; for (const auto & stat : result.index_stats) @@ -862,23 +901,15 @@ ReadFromMergeTree::AnalysisResult ReadFromMergeTree::selectRangesToRead(MergeTre 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", - parts_before_pk, - total_parts, - result.parts_with_ranges.size(), - sum_marks_pk, - total_marks_pk, - sum_marks, - sum_ranges); - ProfileEvents::increment(ProfileEvents::SelectedParts, result.parts_with_ranges.size()); - ProfileEvents::increment(ProfileEvents::SelectedRanges, sum_ranges); - ProfileEvents::increment(ProfileEvents::SelectedMarks, sum_marks); + result.total_parts = total_parts; + result.parts_before_pk = parts_before_pk; + result.selected_parts = result.parts_with_ranges.size(); + result.selected_ranges = sum_ranges; + result.selected_marks = sum_marks; + result.selected_marks_pk = sum_marks_pk; + result.total_marks_pk = total_marks_pk; + result.selected_rows = sum_rows; const auto & input_order_info = query_info.input_order_info ? query_info.input_order_info @@ -888,12 +919,36 @@ ReadFromMergeTree::AnalysisResult ReadFromMergeTree::selectRangesToRead(MergeTre result.read_type = (input_order_info->direction > 0) ? ReadType::InOrder : ReadType::InReverseOrder; - return result; + return std::make_shared(MergeTreeDataSelectAnalysisResult{.result = std::move(result)}); +} + +ReadFromMergeTree::AnalysisResult ReadFromMergeTree::getAnalysisResult() const +{ + auto result_ptr = analyzed_result_ptr ? analyzed_result_ptr : selectRangesToRead(prepared_parts); + if (std::holds_alternative(result_ptr->result)) + std::rethrow_exception(std::move(std::get(result_ptr->result))); + + return std::get(result_ptr->result); } void ReadFromMergeTree::initializePipeline(QueryPipeline & pipeline, const BuildQueryPipelineSettings &) { - auto result = selectRangesToRead(prepared_parts); + auto result = getAnalysisResult(); + LOG_DEBUG( + log, + "Selected {}/{} parts by partition key, {} parts by primary key, {}/{} marks by primary key, {} marks to read from {} ranges", + result.parts_before_pk, + result.total_parts, + result.selected_parts, + result.selected_marks_pk, + result.total_marks_pk, + result.selected_marks, + result.selected_ranges); + + ProfileEvents::increment(ProfileEvents::SelectedParts, result.selected_parts); + ProfileEvents::increment(ProfileEvents::SelectedRanges, result.selected_ranges); + ProfileEvents::increment(ProfileEvents::SelectedMarks, result.selected_marks); + auto query_id_holder = MergeTreeDataSelectExecutor::checkLimits(data, result.parts_with_ranges, context); if (result.parts_with_ranges.empty()) @@ -1084,7 +1139,7 @@ static const char * readTypeToString(ReadFromMergeTree::ReadType type) void ReadFromMergeTree::describeActions(FormatSettings & format_settings) const { - auto result = selectRangesToRead(prepared_parts); + auto result = getAnalysisResult(); std::string prefix(format_settings.offset, format_settings.indent_char); format_settings.out << prefix << "ReadType: " << readTypeToString(result.read_type) << '\n'; @@ -1097,7 +1152,7 @@ void ReadFromMergeTree::describeActions(FormatSettings & format_settings) const void ReadFromMergeTree::describeActions(JSONBuilder::JSONMap & map) const { - auto result = selectRangesToRead(prepared_parts); + auto result = getAnalysisResult(); map.add("Read Type", readTypeToString(result.read_type)); if (!result.index_stats.empty()) { @@ -1108,7 +1163,7 @@ void ReadFromMergeTree::describeActions(JSONBuilder::JSONMap & map) const void ReadFromMergeTree::describeIndexes(FormatSettings & format_settings) const { - auto result = selectRangesToRead(prepared_parts); + auto result = getAnalysisResult(); auto index_stats = std::move(result.index_stats); std::string prefix(format_settings.offset, format_settings.indent_char); @@ -1160,7 +1215,7 @@ void ReadFromMergeTree::describeIndexes(FormatSettings & format_settings) const void ReadFromMergeTree::describeIndexes(JSONBuilder::JSONMap & map) const { - auto result = selectRangesToRead(prepared_parts); + auto result = getAnalysisResult(); auto index_stats = std::move(result.index_stats); if (!index_stats.empty()) @@ -1215,4 +1270,20 @@ void ReadFromMergeTree::describeIndexes(JSONBuilder::JSONMap & map) const } } +bool MergeTreeDataSelectAnalysisResult::error() const +{ + return std::holds_alternative(result); +} + +size_t MergeTreeDataSelectAnalysisResult::marks() const +{ + if (std::holds_alternative(result)) + std::rethrow_exception(std::move(std::get(result))); + + const auto & index_stats = std::get(result).index_stats; + if (index_stats.empty()) + return 0; + return index_stats.back().num_granules_after; +} + } diff --git a/src/Processors/QueryPlan/ReadFromMergeTree.h b/src/Processors/QueryPlan/ReadFromMergeTree.h index e83746c3ff0..fc06314ee0c 100644 --- a/src/Processors/QueryPlan/ReadFromMergeTree.h +++ b/src/Processors/QueryPlan/ReadFromMergeTree.h @@ -9,6 +9,18 @@ using PartitionIdToMaxBlock = std::unordered_map; class Pipe; +struct MergeTreeDataSelectSamplingData +{ + bool use_sampling = false; + bool read_nothing = false; + Float64 used_sample_factor = 1.0; + std::shared_ptr filter_function; + ActionsDAGPtr filter_expression; +}; + +struct MergeTreeDataSelectAnalysisResult; +using MergeTreeDataSelectAnalysisResultPtr = std::shared_ptr; + /// This step is created to read from MergeTree* table. /// For now, it takes a list of parts and creates source from it. class ReadFromMergeTree final : public ISourceStep @@ -54,6 +66,23 @@ public: InReverseOrder, }; + struct AnalysisResult + { + RangesInDataParts parts_with_ranges; + MergeTreeDataSelectSamplingData sampling; + IndexStats index_stats; + Names column_names_to_read; + ReadFromMergeTree::ReadType read_type = ReadFromMergeTree::ReadType::Default; + UInt64 total_parts = 0; + UInt64 parts_before_pk = 0; + UInt64 selected_parts = 0; + UInt64 selected_ranges = 0; + UInt64 selected_marks = 0; + UInt64 selected_marks_pk = 0; + UInt64 total_marks_pk = 0; + UInt64 selected_rows = 0; + }; + ReadFromMergeTree( MergeTreeData::DataPartsVector parts_, Names real_column_names_, @@ -67,7 +96,8 @@ public: size_t num_streams_, bool sample_factor_column_queried_, std::shared_ptr max_block_numbers_to_read_, - Poco::Logger * log_ + Poco::Logger * log_, + MergeTreeDataSelectAnalysisResultPtr analyzed_result_ptr_ ); String getName() const override { return "ReadFromMergeTree"; } @@ -84,6 +114,20 @@ public: UInt64 getSelectedParts() const { return selected_parts; } UInt64 getSelectedRows() const { return selected_rows; } UInt64 getSelectedMarks() const { return selected_marks; } + + static MergeTreeDataSelectAnalysisResultPtr selectRangesToRead( + MergeTreeData::DataPartsVector parts, + const StorageMetadataPtr & metadata_snapshot_base, + const StorageMetadataPtr & metadata_snapshot, + const SelectQueryInfo & query_info, + ContextPtr context, + unsigned num_streams, + std::shared_ptr max_block_numbers_to_read, + const MergeTreeData & data, + const Names & real_column_names, + bool sample_factor_column_queried, + Poco::Logger * log); + private: const MergeTreeReaderSettings reader_settings; @@ -137,8 +181,17 @@ private: const Names & column_names, ActionsDAGPtr & out_projection); - struct AnalysisResult; - AnalysisResult selectRangesToRead(MergeTreeData::DataPartsVector parts) const; + MergeTreeDataSelectAnalysisResultPtr selectRangesToRead(MergeTreeData::DataPartsVector parts) const; + ReadFromMergeTree::AnalysisResult getAnalysisResult() const; + MergeTreeDataSelectAnalysisResultPtr analyzed_result_ptr; +}; + +struct MergeTreeDataSelectAnalysisResult +{ + std::variant result; + + bool error() const; + size_t marks() const; }; } diff --git a/src/Processors/Sinks/SinkToStorage.h b/src/Processors/Sinks/SinkToStorage.h index c57adef568f..3e0ac470be7 100644 --- a/src/Processors/Sinks/SinkToStorage.h +++ b/src/Processors/Sinks/SinkToStorage.h @@ -5,7 +5,7 @@ namespace DB { -/// Sink which is returned from Storage::read. +/// Sink which is returned from Storage::write. /// The same as ISink, but also can hold table lock. class SinkToStorage : public ISink { diff --git a/src/Processors/Transforms/CreatingSetsTransform.cpp b/src/Processors/Transforms/CreatingSetsTransform.cpp index 6f69765ee23..d9b383030d3 100644 --- a/src/Processors/Transforms/CreatingSetsTransform.cpp +++ b/src/Processors/Transforms/CreatingSetsTransform.cpp @@ -84,7 +84,7 @@ void CreatingSetsTransform::init() is_initialized = true; if (subquery.set) - subquery.set->setHeader(getInputPort().getHeader()); + subquery.set->setHeader(getInputPort().getHeader().getColumnsWithTypeAndName()); watch.restart(); startSubquery(); @@ -97,7 +97,7 @@ void CreatingSetsTransform::consume(Chunk chunk) if (!done_with_set) { - if (!subquery.set->insertFromBlock(block)) + if (!subquery.set->insertFromBlock(block.getColumnsWithTypeAndName())) done_with_set = true; } 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 e402fd788bc..95a12e2291d 100644 --- a/src/Processors/Transforms/JoiningTransform.cpp +++ b/src/Processors/Transforms/JoiningTransform.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #include @@ -114,7 +113,7 @@ void JoiningTransform::work() } else { - if (!non_joined_stream) + if (!non_joined_blocks) { if (!finish_counter || !finish_counter->isLast()) { @@ -122,15 +121,15 @@ void JoiningTransform::work() return; } - non_joined_stream = join->createStreamWithNonJoinedRows(outputs.front().getHeader(), max_block_size); - if (!non_joined_stream) + non_joined_blocks = join->getNonJoinedBlocks(outputs.front().getHeader(), max_block_size); + if (!non_joined_blocks) { process_non_joined = false; return; } } - auto block = non_joined_stream->read(); + Block block = non_joined_blocks->read(); if (!block) { process_non_joined = false; diff --git a/src/Processors/Transforms/JoiningTransform.h b/src/Processors/Transforms/JoiningTransform.h index 98038946f3b..96c4032dabc 100644 --- a/src/Processors/Transforms/JoiningTransform.h +++ b/src/Processors/Transforms/JoiningTransform.h @@ -8,8 +8,7 @@ namespace DB class IJoin; using JoinPtr = std::shared_ptr; -class IBlockInputStream; -using BlockInputStreamPtr = std::shared_ptr; +class NotJoinedBlocks; /// Join rows to chunk form left table. /// This transform usually has two input ports and one output. @@ -76,7 +75,7 @@ private: ExtraBlockPtr not_processed; FinishCounterPtr finish_counter; - BlockInputStreamPtr non_joined_stream; + std::shared_ptr non_joined_blocks; size_t max_block_size; Block readExecute(Chunk & chunk); 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/WindowTransform.cpp b/src/Processors/Transforms/WindowTransform.cpp index 1b8406682ea..132bdb7b327 100644 --- a/src/Processors/Transforms/WindowTransform.cpp +++ b/src/Processors/Transforms/WindowTransform.cpp @@ -1764,21 +1764,21 @@ void registerWindowFunctions(AggregateFunctionFactory & factory) { return std::make_shared(name, argument_types, parameters); - }, properties}); + }, properties}, AggregateFunctionFactory::CaseInsensitive); 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}); + }, properties}, AggregateFunctionFactory::CaseInsensitive); 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}); + }, properties}, AggregateFunctionFactory::CaseInsensitive); factory.registerFunction("lagInFrame", {[](const std::string & name, const DataTypes & argument_types, const Array & parameters, const Settings *) @@ -1799,7 +1799,7 @@ void registerWindowFunctions(AggregateFunctionFactory & factory) { return std::make_shared( name, argument_types, parameters); - }, properties}); + }, properties}, AggregateFunctionFactory::CaseInsensitive); } } diff --git a/src/Processors/Transforms/getSourceFromFromASTInsertQuery.cpp b/src/Processors/Transforms/getSourceFromFromASTInsertQuery.cpp index 8d8a4761657..9e64bd954fa 100644 --- a/src/Processors/Transforms/getSourceFromFromASTInsertQuery.cpp +++ b/src/Processors/Transforms/getSourceFromFromASTInsertQuery.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -11,6 +12,8 @@ #include #include #include +#include "IO/CompressionMethod.h" +#include "Parsers/ASTLiteral.h" namespace DB @@ -20,6 +23,7 @@ namespace ErrorCodes { extern const int LOGICAL_ERROR; extern const int INVALID_USAGE_OF_INPUT; + extern const int UNKNOWN_TYPE_OF_QUERY; } @@ -35,6 +39,9 @@ Pipe getSourceFromFromASTInsertQuery( if (!ast_insert_query) throw Exception("Logical error: query requires data to insert, but it is not INSERT query", ErrorCodes::LOGICAL_ERROR); + if (ast_insert_query->infile && context->getApplicationType() == Context::ApplicationType::SERVER) + throw Exception("Query has infile and was send directly to server", ErrorCodes::UNKNOWN_TYPE_OF_QUERY); + String format = ast_insert_query->format; if (format.empty()) { @@ -48,20 +55,33 @@ Pipe getSourceFromFromASTInsertQuery( 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; - if (ast_insert_query->data) - buffers.push_back(input_buffer_ast_part.get()); + std::unique_ptr input_buffer; - if (input_buffer_tail_part) - buffers.push_back(input_buffer_tail_part); + if (ast_insert_query->infile) + { + /// Data can be from infile + const auto & in_file_node = ast_insert_query->infile->as(); + const auto in_file = in_file_node.value.safeGet(); - /** NOTE Must not read from 'input_buffer_tail_part' before read all between 'ast_insert_query.data' and 'ast_insert_query.end'. - * - because 'query.data' could refer to memory piece, used as buffer for 'input_buffer_tail_part'. - */ + input_buffer = wrapReadBufferWithCompressionMethod(std::make_unique(in_file), chooseCompressionMethod(in_file, "")); + } + else + { + ConcatReadBuffer::ReadBuffers buffers; + if (ast_insert_query->data) + buffers.push_back(input_buffer_ast_part.get()); - auto input_buffer_contacenated = std::make_unique(buffers); + if (input_buffer_tail_part) + buffers.push_back(input_buffer_tail_part); - auto source = FormatFactory::instance().getInput(format, *input_buffer_contacenated, header, context, context->getSettings().max_insert_block_size); + /** NOTE Must not read from 'input_buffer_tail_part' before read all between 'ast_insert_query.data' and 'ast_insert_query.end'. + * - because 'query.data' could refer to memory piece, used as buffer for 'input_buffer_tail_part'. + */ + + input_buffer = std::make_unique(buffers); + } + + auto source = FormatFactory::instance().getInput(format, *input_buffer, 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) @@ -79,7 +99,7 @@ Pipe getSourceFromFromASTInsertQuery( } source->addBuffer(std::move(input_buffer_ast_part)); - source->addBuffer(std::move(input_buffer_contacenated)); + source->addBuffer(std::move(input_buffer)); return pipe; } diff --git a/src/Processors/ya.make b/src/Processors/ya.make index 543a08caca5..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 @@ -165,6 +176,7 @@ SRCS( Transforms/ReverseTransform.cpp Transforms/RollupTransform.cpp Transforms/SortingTransform.cpp + Transforms/SquashingChunksTransform.cpp Transforms/TotalsHavingTransform.cpp Transforms/WindowTransform.cpp Transforms/getSourceFromFromASTInsertQuery.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 b90b0c33f17..f0c6e208323 100644 --- a/src/Server/GRPCServer.cpp +++ b/src/Server/GRPCServer.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -54,7 +55,6 @@ namespace ErrorCodes extern const int NETWORK_ERROR; extern const int NO_DATA_TO_INSERT; extern const int SUPPORT_IS_DISABLED; - extern const int UNKNOWN_DATABASE; } namespace @@ -560,7 +560,7 @@ namespace IServer & iserver; Poco::Logger * log = nullptr; - std::shared_ptr session; + std::optional session; ContextMutablePtr query_context; std::optional query_scope; String query_text; @@ -689,34 +689,20 @@ namespace password = ""; } - /// Create context. - query_context = Context::createCopy(iserver.context()); - /// Authentication. - query_context->setUser(user, password, user_address); - query_context->setCurrentQueryId(query_info.query_id()); - if (!quota_key.empty()) - query_context->setQuotaKey(quota_key); + session.emplace(iserver.context(), ClientInfo::Interface::GRPC); + session->authenticate(user, password, user_address); + session->getClientInfo().quota_key = quota_key; /// The user could specify session identifier and session timeout. /// It allows to modify settings, create temporary tables and reuse them in subsequent requests. if (!query_info.session_id().empty()) { - session = query_context->acquireNamedSession( + session->makeSessionContext( query_info.session_id(), getSessionTimeout(query_info, iserver.config()), query_info.session_check()); - query_context = Context::createCopy(session->context); - query_context->setSessionContext(session->context); } - query_scope.emplace(query_context); - - /// Set client info. - ClientInfo & client_info = query_context->getClientInfo(); - client_info.query_kind = ClientInfo::QueryKind::INITIAL_QUERY; - client_info.interface = ClientInfo::Interface::GRPC; - client_info.initial_user = client_info.current_user; - client_info.initial_query_id = client_info.current_query_id; - client_info.initial_address = client_info.current_address; + query_context = session->makeQueryContext(); /// Prepare settings. SettingsChanges settings_changes; @@ -726,11 +712,14 @@ namespace } query_context->checkSettingsConstraints(settings_changes); query_context->applySettingsChanges(settings_changes); - const Settings & settings = query_context->getSettingsRef(); + + query_context->setCurrentQueryId(query_info.query_id()); + query_scope.emplace(query_context); /// Prepare for sending exceptions and logs. - send_exception_with_stacktrace = query_context->getSettingsRef().calculate_text_stack_trace; - const auto client_logs_level = query_context->getSettingsRef().send_logs_level; + const Settings & settings = query_context->getSettingsRef(); + send_exception_with_stacktrace = settings.calculate_text_stack_trace; + const auto client_logs_level = settings.send_logs_level; if (client_logs_level != LogsLevel::none) { logs_queue = std::make_shared(); @@ -741,14 +730,10 @@ namespace /// Set the current database if specified. if (!query_info.database().empty()) - { - if (!DatabaseCatalog::instance().isDatabaseExist(query_info.database())) - throw Exception("Database " + query_info.database() + " doesn't exist", ErrorCodes::UNKNOWN_DATABASE); query_context->setCurrentDatabase(query_info.database()); - } /// The interactive delay will be used to show progress. - interactive_delay = query_context->getSettingsRef().interactive_delay; + interactive_delay = settings.interactive_delay; query_context->setProgressCallback([this](const Progress & value) { return progress.incrementPiecewiseAtomically(value); }); /// Parse the query. @@ -1254,8 +1239,6 @@ namespace io = {}; query_scope.reset(); query_context.reset(); - if (session) - session->release(); session.reset(); } diff --git a/src/Server/HTTPHandler.cpp b/src/Server/HTTPHandler.cpp index 8e0bed4b4c2..0492b58dc88 100644 --- a/src/Server/HTTPHandler.cpp +++ b/src/Server/HTTPHandler.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -261,6 +262,7 @@ void HTTPHandler::pushDelayedResults(Output & used_output) HTTPHandler::HTTPHandler(IServer & server_, const std::string & name) : server(server_) , log(&Poco::Logger::get(name)) + , default_settings(server.context()->getSettingsRef()) { server_display_name = server.config().getString("display_name", getFQDNOrHostName()); } @@ -268,14 +270,10 @@ HTTPHandler::HTTPHandler(IServer & server_, const std::string & name) /// We need d-tor to be present in this translation unit to make it play well with some /// forward decls in the header. Other than that, the default d-tor would be OK. -HTTPHandler::~HTTPHandler() -{ - (void)this; -} +HTTPHandler::~HTTPHandler() = default; bool HTTPHandler::authenticateUser( - ContextMutablePtr context, HTTPServerRequest & request, HTMLForm & params, HTTPServerResponse & response) @@ -352,7 +350,7 @@ bool HTTPHandler::authenticateUser( else { if (!request_credentials) - request_credentials = request_context->makeGSSAcceptorContext(); + request_credentials = server.context()->makeGSSAcceptorContext(); auto * gss_acceptor_context = dynamic_cast(request_credentials.get()); if (!gss_acceptor_context) @@ -378,10 +376,7 @@ bool HTTPHandler::authenticateUser( } /// Set client info. It will be used for quota accounting parameters in 'setUser' method. - - ClientInfo & client_info = context->getClientInfo(); - client_info.query_kind = ClientInfo::QueryKind::INITIAL_QUERY; - client_info.interface = ClientInfo::Interface::HTTP; + ClientInfo & client_info = session->getClientInfo(); ClientInfo::HTTPMethod http_method = ClientInfo::HTTPMethod::UNKNOWN; if (request.getMethod() == HTTPServerRequest::HTTP_GET) @@ -393,10 +388,11 @@ bool HTTPHandler::authenticateUser( client_info.http_user_agent = request.get("User-Agent", ""); client_info.http_referer = request.get("Referer", ""); client_info.forwarded_for = request.get("X-Forwarded-For", ""); + client_info.quota_key = quota_key; try { - context->setUser(*request_credentials, request.clientAddress()); + session->authenticate(*request_credentials, request.clientAddress()); } catch (const Authentication::Require & required_credentials) { @@ -413,7 +409,7 @@ bool HTTPHandler::authenticateUser( } catch (const Authentication::Require & required_credentials) { - request_credentials = request_context->makeGSSAcceptorContext(); + request_credentials = server.context()->makeGSSAcceptorContext(); if (required_credentials.getRealm().empty()) response.set("WWW-Authenticate", "Negotiate"); @@ -426,20 +422,11 @@ bool HTTPHandler::authenticateUser( } request_credentials.reset(); - - if (!quota_key.empty()) - context->setQuotaKey(quota_key); - - /// Query sent through HTTP interface is initial. - client_info.initial_user = client_info.current_user; - client_info.initial_address = client_info.current_address; - return true; } void HTTPHandler::processQuery( - ContextMutablePtr context, HTTPServerRequest & request, HTMLForm & params, HTTPServerResponse & response, @@ -450,13 +437,11 @@ void HTTPHandler::processQuery( LOG_TRACE(log, "Request URI: {}", request.getURI()); - if (!authenticateUser(context, request, params, response)) + if (!authenticateUser(request, params, response)) return; // '401 Unauthorized' response with 'Negotiate' has been sent at this point. /// The user could specify session identifier and session timeout. /// It allows to modify settings, create temporary tables and reuse them in subsequent requests. - - std::shared_ptr session; String session_id; std::chrono::steady_clock::duration session_timeout; bool session_is_set = params.has("session_id"); @@ -467,43 +452,30 @@ void HTTPHandler::processQuery( session_id = params.get("session_id"); session_timeout = parseSessionTimeout(config, params); std::string session_check = params.get("session_check", ""); - - session = context->acquireNamedSession(session_id, session_timeout, session_check == "1"); - - context->copyFrom(session->context); /// FIXME: maybe move this part to HandleRequest(), copyFrom() is used only here. - context->setSessionContext(session->context); + session->makeSessionContext(session_id, session_timeout, session_check == "1"); } - SCOPE_EXIT({ - if (session) - session->release(); - }); - // Parse the OpenTelemetry traceparent header. // Disable in Arcadia -- it interferes with the // test_clickhouse.TestTracing.test_tracing_via_http_proxy[traceparent] test. + ClientInfo client_info = session->getClientInfo(); #if !defined(ARCADIA_BUILD) if (request.has("traceparent")) { std::string opentelemetry_traceparent = request.get("traceparent"); std::string error; - if (!context->getClientInfo().client_trace_context.parseTraceparentHeader( + if (!client_info.client_trace_context.parseTraceparentHeader( opentelemetry_traceparent, error)) { throw Exception(ErrorCodes::BAD_REQUEST_PARAMETER, "Failed to parse OpenTelemetry traceparent header '{}': {}", opentelemetry_traceparent, error); } - - context->getClientInfo().client_trace_context.tracestate = request.get("tracestate", ""); + client_info.client_trace_context.tracestate = request.get("tracestate", ""); } #endif - // Set the query id supplied by the user, if any, and also update the OpenTelemetry fields. - context->setCurrentQueryId(params.get("query_id", request.get("X-ClickHouse-Query-Id", ""))); - - ClientInfo & client_info = context->getClientInfo(); - client_info.initial_query_id = client_info.current_query_id; + auto context = session->makeQueryContext(std::move(client_info)); /// The client can pass a HTTP header indicating supported compression method (gzip or deflate). String http_response_compression_methods = request.get("Accept-Encoding", ""); @@ -568,7 +540,7 @@ void HTTPHandler::processQuery( if (buffer_until_eof) { - const std::string tmp_path(context->getTemporaryVolume()->getDisk()->getPath()); + const std::string tmp_path(server.context()->getTemporaryVolume()->getDisk()->getPath()); const std::string tmp_path_template(tmp_path + "http_buffers/"); auto create_tmp_disk_buffer = [tmp_path_template] (const WriteBufferPtr &) @@ -714,6 +686,9 @@ void HTTPHandler::processQuery( context->checkSettingsConstraints(settings_changes); context->applySettingsChanges(settings_changes); + // Set the query id supplied by the user, if any, and also update the OpenTelemetry fields. + context->setCurrentQueryId(params.get("query_id", request.get("X-ClickHouse-Query-Id", ""))); + const auto & query = getQuery(request, params, context); std::unique_ptr in_param = std::make_unique(query); in = has_external_data ? std::move(in_param) : std::make_unique(*in_param, *in_post_maybe_compressed); @@ -864,23 +839,10 @@ void HTTPHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse setThreadName("HTTPHandler"); ThreadStatus thread_status; - SCOPE_EXIT({ - // If there is no request_credentials instance waiting for the next round, then the request is processed, - // so no need to preserve request_context either. - // Needs to be performed with respect to the other destructors in the scope though. - if (!request_credentials) - request_context.reset(); - }); - - if (!request_context) - { - // Context should be initialized before anything, for correct memory accounting. - request_context = Context::createCopy(server.context()); - request_credentials.reset(); - } - - /// Cannot be set here, since query_id is unknown. + session = std::make_unique(server.context(), ClientInfo::Interface::HTTP); + SCOPE_EXIT({ session.reset(); }); std::optional query_scope; + Output used_output; /// In case of exception, send stack trace to client. @@ -894,7 +856,7 @@ void HTTPHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse if (request.getVersion() == HTTPServerRequest::HTTP_1_1) response.setChunkedTransferEncoding(true); - HTMLForm params(request_context->getSettingsRef(), request); + HTMLForm params(default_settings, request); with_stacktrace = params.getParsed("stacktrace", false); /// FIXME: maybe this check is already unnecessary. @@ -906,7 +868,7 @@ void HTTPHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse ErrorCodes::HTTP_LENGTH_REQUIRED); } - processQuery(request_context, request, params, response, used_output, query_scope); + processQuery(request, params, response, used_output, query_scope); LOG_DEBUG(log, (request_credentials ? "Authentication in progress..." : "Done processing query")); } catch (...) @@ -944,7 +906,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; } @@ -970,8 +934,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/HTTPHandler.h b/src/Server/HTTPHandler.h index 2149a7ca55c..98f573f8cef 100644 --- a/src/Server/HTTPHandler.h +++ b/src/Server/HTTPHandler.h @@ -18,8 +18,10 @@ namespace Poco { class Logger; } namespace DB { +class Session; class Credentials; class IServer; +struct Settings; class WriteBufferFromHTTPServerResponse; using CompiledRegexPtr = std::shared_ptr; @@ -71,25 +73,30 @@ private: CurrentMetrics::Increment metric_increment{CurrentMetrics::HTTPConnection}; - // The request_context and the request_credentials instances may outlive a single request/response loop. + /// Reference to the immutable settings in the global context. + /// Those settings are used only to extract a http request's parameters. + /// See settings http_max_fields, http_max_field_name_size, http_max_field_value_size in HTMLForm. + const Settings & default_settings; + + // session is reset at the end of each request/response. + std::unique_ptr session; + + // The request_credential instance may outlive a single request/response loop. // This happens only when the authentication mechanism requires more than a single request/response exchange (e.g., SPNEGO). - ContextMutablePtr request_context; std::unique_ptr request_credentials; // Returns true when the user successfully authenticated, - // the request_context instance will be configured accordingly, and the request_credentials instance will be dropped. + // the session instance will be configured accordingly, and the request_credentials instance will be dropped. // Returns false when the user is not authenticated yet, and the 'Negotiate' response is sent, - // the request_context and request_credentials instances are preserved. + // the session and request_credentials instances are preserved. // Throws an exception if authentication failed. bool authenticateUser( - ContextMutablePtr context, HTTPServerRequest & request, HTMLForm & params, HTTPServerResponse & response); /// Also initializes 'used_output'. void processQuery( - ContextMutablePtr context, HTTPServerRequest & request, HTMLForm & params, HTTPServerResponse & response, diff --git a/src/Server/KeeperTCPHandler.cpp b/src/Server/KeeperTCPHandler.cpp index df40a78749b..7ead4d0d419 100644 --- a/src/Server/KeeperTCPHandler.cpp +++ b/src/Server/KeeperTCPHandler.cpp @@ -194,7 +194,7 @@ KeeperTCPHandler::KeeperTCPHandler(IServer & server_, const Poco::Net::StreamSoc , server(server_) , log(&Poco::Logger::get("NuKeeperTCPHandler")) , global_context(Context::createCopy(server.context())) - , keeper_dispatcher(global_context->getKeeperStorageDispatcher()) + , keeper_dispatcher(global_context->getKeeperDispatcher()) , 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_)) diff --git a/src/Server/KeeperTCPHandler.h b/src/Server/KeeperTCPHandler.h index 76371ed1a0c..7abfb72c846 100644 --- a/src/Server/KeeperTCPHandler.h +++ b/src/Server/KeeperTCPHandler.h @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include #include @@ -38,7 +38,7 @@ private: IServer & server; Poco::Logger * log; ContextPtr global_context; - std::shared_ptr keeper_dispatcher; + std::shared_ptr keeper_dispatcher; Poco::Timespan operation_timeout; Poco::Timespan session_timeout; int64_t session_id{-1}; diff --git a/src/Server/MySQLHandler.cpp b/src/Server/MySQLHandler.cpp index 375f248d939..93f4bff46c2 100644 --- a/src/Server/MySQLHandler.cpp +++ b/src/Server/MySQLHandler.cpp @@ -1,16 +1,14 @@ #include "MySQLHandler.h" #include -#include -#include #include #include -#include #include #include #include #include #include +#include #include #include #include @@ -20,18 +18,15 @@ #include #include #include -#include #include -#include -#include #include +#include #if !defined(ARCADIA_BUILD) # include #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; } @@ -74,7 +70,6 @@ MySQLHandler::MySQLHandler(IServer & server_, const Poco::Net::StreamSocket & so , server(server_) , log(&Poco::Logger::get("MySQLHandler")) , connection_id(connection_id_) - , connection_context(Context::createCopy(server.context())) , auth_plugin(new MySQLProtocol::Authentication::Native41()) { server_capabilities = CLIENT_PROTOCOL_41 | CLIENT_SECURE_CONNECTION | CLIENT_PLUGIN_AUTH | CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA | CLIENT_CONNECT_WITH_DB | CLIENT_DEPRECATE_EOF; @@ -91,11 +86,11 @@ void MySQLHandler::run() { setThreadName("MySQLHandler"); ThreadStatus thread_status; - connection_context->makeSessionContext(); - 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; + + session = std::make_unique(server.context(), ClientInfo::Interface::MYSQL); + SCOPE_EXIT({ session.reset(); }); + + session->getClientInfo().connection_id = connection_id; in = std::make_shared(socket()); out = std::make_shared(socket()); @@ -129,14 +124,12 @@ void MySQLHandler::run() authenticate(handshake_response.username, handshake_response.auth_plugin_name, handshake_response.auth_response); - connection_context->getClientInfo().initial_user = handshake_response.username; - try { + session->makeSessionContext(); + session->sessionContext()->setDefaultFormat("MySQLWire"); if (!handshake_response.database.empty()) - connection_context->setCurrentDatabase(handshake_response.database); - connection_context->setCurrentQueryId(Poco::format("mysql:%lu", connection_id)); - + session->sessionContext()->setCurrentDatabase(handshake_response.database); } catch (const Exception & exc) { @@ -253,15 +246,13 @@ void MySQLHandler::authenticate(const String & user_name, const String & auth_pl try { // For compatibility with JavaScript MySQL client, Native41 authentication plugin is used when possible (if password is specified using double SHA1). Otherwise SHA256 plugin is used. - auto user = connection_context->getAccessControlManager().read(user_name); - const DB::Authentication::Type user_auth_type = user->authentication.getType(); - if (user_auth_type == DB::Authentication::SHA256_PASSWORD) + if (session->getAuthenticationType(user_name) == DB::Authentication::SHA256_PASSWORD) { authPluginSSL(); } std::optional auth_response = auth_plugin_name == auth_plugin->getName() ? std::make_optional(initial_auth_response) : std::nullopt; - auth_plugin->authenticate(user_name, auth_response, connection_context, packet_endpoint, secure_connection, socket().peerAddress()); + auth_plugin->authenticate(user_name, *session, auth_response, packet_endpoint, secure_connection, socket().peerAddress()); } catch (const Exception & exc) { @@ -277,7 +268,7 @@ void MySQLHandler::comInitDB(ReadBuffer & payload) String database; readStringUntilEOF(database, payload); LOG_DEBUG(log, "Setting current database to {}", database); - connection_context->setCurrentDatabase(database); + session->sessionContext()->setCurrentDatabase(database); packet_endpoint->sendPacket(OKPacket(0, client_capabilities, 0, 0, 1), true); } @@ -285,8 +276,9 @@ void MySQLHandler::comFieldList(ReadBuffer & payload) { ComFieldList packet; packet.readPayloadWithUnpacked(payload); - String database = connection_context->getCurrentDatabase(); - StoragePtr table_ptr = DatabaseCatalog::instance().getTable({database, packet.table}, connection_context); + const auto session_context = session->sessionContext(); + String database = session_context->getCurrentDatabase(); + StoragePtr table_ptr = DatabaseCatalog::instance().getTable({database, packet.table}, session_context); auto metadata_snapshot = table_ptr->getInMemoryMetadataPtr(); for (const NameAndTypePair & column : metadata_snapshot->getColumns().getAll()) { @@ -333,7 +325,9 @@ void MySQLHandler::comQuery(ReadBuffer & payload) ReadBufferFromString replacement(replacement_query); - auto query_context = Context::createCopy(connection_context); + auto query_context = session->makeQueryContext(); + query_context->setCurrentQueryId(Poco::format("mysql:%lu", connection_id)); + CurrentThread::QueryScope query_scope{query_context}; std::atomic affected_rows {0}; auto prev = query_context->getProgressCallback(); @@ -345,15 +339,15 @@ void MySQLHandler::comQuery(ReadBuffer & payload) affected_rows += progress.written_rows; }); - CurrentThread::QueryScope query_scope{query_context}; - 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 &, const String &) + 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; }; diff --git a/src/Server/MySQLHandler.h b/src/Server/MySQLHandler.h index 96467797105..5258862cf23 100644 --- a/src/Server/MySQLHandler.h +++ b/src/Server/MySQLHandler.h @@ -17,6 +17,8 @@ # include #endif +#include + namespace CurrentMetrics { extern const Metric MySQLConnection; @@ -61,7 +63,7 @@ protected: uint8_t sequence_id = 0; MySQLProtocol::PacketEndpointPtr packet_endpoint; - ContextMutablePtr connection_context; + std::unique_ptr session; using ReplacementFn = std::function; using Replacements = std::unordered_map; diff --git a/src/Server/PostgreSQLHandler.cpp b/src/Server/PostgreSQLHandler.cpp index 1e98ed2e134..0716d828520 100644 --- a/src/Server/PostgreSQLHandler.cpp +++ b/src/Server/PostgreSQLHandler.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include "PostgreSQLHandler.h" #include @@ -33,7 +34,6 @@ PostgreSQLHandler::PostgreSQLHandler( std::vector> & auth_methods_) : Poco::Net::TCPServerConnection(socket_) , server(server_) - , connection_context(Context::createCopy(server.context())) , ssl_enabled(ssl_enabled_) , connection_id(connection_id_) , authentication_manager(auth_methods_) @@ -52,10 +52,9 @@ void PostgreSQLHandler::run() { setThreadName("PostgresHandler"); ThreadStatus thread_status; - connection_context->makeSessionContext(); - connection_context->getClientInfo().interface = ClientInfo::Interface::POSTGRESQL; - connection_context->setDefaultFormat("PostgreSQLWire"); - connection_context->getClientInfo().query_kind = ClientInfo::QueryKind::INITIAL_QUERY; + + session = std::make_unique(server.context(), ClientInfo::Interface::POSTGRESQL); + SCOPE_EXIT({ session.reset(); }); try { @@ -123,18 +122,15 @@ bool PostgreSQLHandler::startup() } std::unique_ptr start_up_msg = receiveStartupMessage(payload_size); - authentication_manager.authenticate(start_up_msg->user, connection_context, *message_transport, socket().peerAddress()); - - std::random_device rd; - std::mt19937 gen(rd()); - std::uniform_int_distribution dis(0, INT32_MAX); - secret_key = dis(gen); + const auto & user_name = start_up_msg->user; + authentication_manager.authenticate(user_name, *session, *message_transport, socket().peerAddress()); try { + session->makeSessionContext(); + session->sessionContext()->setDefaultFormat("PostgreSQLWire"); if (!start_up_msg->database.empty()) - connection_context->setCurrentDatabase(start_up_msg->database); - connection_context->setCurrentQueryId(Poco::format("postgres:%d:%d", connection_id, secret_key)); + session->sessionContext()->setCurrentDatabase(start_up_msg->database); } catch (const Exception & exc) { @@ -214,16 +210,15 @@ void PostgreSQLHandler::sendParameterStatusData(PostgreSQLProtocol::Messaging::S void PostgreSQLHandler::cancelRequest() { - connection_context->setCurrentQueryId(""); - connection_context->setDefaultFormat("Null"); - std::unique_ptr msg = message_transport->receiveWithPayloadSize(8); String query = Poco::format("KILL QUERY WHERE query_id = 'postgres:%d:%d'", msg->process_id, msg->secret_key); ReadBufferFromString replacement(query); - executeQuery(replacement, *out, true, connection_context, {}); + auto query_context = session->makeQueryContext(); + query_context->setCurrentQueryId(""); + executeQuery(replacement, *out, true, query_context, {}); } inline std::unique_ptr PostgreSQLHandler::receiveStartupMessage(int payload_size) @@ -269,18 +264,25 @@ void PostgreSQLHandler::processQuery() return; } - const auto & settings = connection_context->getSettingsRef(); + const auto & settings = session->sessionContext()->getSettingsRef(); std::vector queries; auto parse_res = splitMultipartQuery(query->query, queries, settings.max_query_size, settings.max_parser_depth); if (!parse_res.second) throw Exception("Cannot parse and execute the following part of query: " + String(parse_res.first), ErrorCodes::SYNTAX_ERROR); + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution dis(0, INT32_MAX); + for (const auto & spl_query : queries) { - /// FIXME why do we execute all queries in a single connection context? - CurrentThread::QueryScope query_scope{connection_context}; + secret_key = dis(gen); + auto query_context = session->makeQueryContext(); + query_context->setCurrentQueryId(Poco::format("postgres:%d:%d", connection_id, secret_key)); + + CurrentThread::QueryScope query_scope{query_context}; ReadBufferFromString read_buf(spl_query); - executeQuery(read_buf, *out, false, connection_context, {}); + executeQuery(read_buf, *out, false, query_context, {}); PostgreSQLProtocol::Messaging::CommandComplete::Command command = PostgreSQLProtocol::Messaging::CommandComplete::classifyQuery(spl_query); diff --git a/src/Server/PostgreSQLHandler.h b/src/Server/PostgreSQLHandler.h index 9aaad1d7aa7..36dd62d3dec 100644 --- a/src/Server/PostgreSQLHandler.h +++ b/src/Server/PostgreSQLHandler.h @@ -18,6 +18,8 @@ namespace CurrentMetrics namespace DB { +class Session; + /** PostgreSQL wire protocol implementation. * For more info see https://www.postgresql.org/docs/current/protocol.html */ @@ -37,7 +39,7 @@ private: Poco::Logger * log = &Poco::Logger::get("PostgreSQLHandler"); IServer & server; - ContextMutablePtr connection_context; + std::unique_ptr session; bool ssl_enabled = false; Int32 connection_id = 0; Int32 secret_key = 0; diff --git a/src/Server/TCPHandler.cpp b/src/Server/TCPHandler.cpp index 0339b144f09..2d710449da6 100644 --- a/src/Server/TCPHandler.cpp +++ b/src/Server/TCPHandler.cpp @@ -24,10 +24,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include #include @@ -47,33 +49,11 @@ 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; extern const int ATTEMPT_TO_READ_AFTER_EOF; extern const int CLIENT_HAS_CONNECTED_TO_WRONG_PORT; - extern const int UNKNOWN_DATABASE; extern const int UNKNOWN_EXCEPTION; extern const int UNKNOWN_PACKET_FROM_CLIENT; extern const int POCO_EXCEPTION; @@ -88,11 +68,10 @@ TCPHandler::TCPHandler(IServer & server_, const Poco::Net::StreamSocket & socket , server(server_) , parse_proxy_protocol(parse_proxy_protocol_) , log(&Poco::Logger::get("TCPHandler")) - , connection_context(Context::createCopy(server.context())) - , query_context(Context::createCopy(server.context())) , server_display_name(std::move(server_display_name_)) { } + TCPHandler::~TCPHandler() { try @@ -112,16 +91,11 @@ void TCPHandler::runImpl() setThreadName("TCPHandler"); ThreadStatus thread_status; - connection_context = Context::createCopy(server.context()); - connection_context->makeSessionContext(); + session = std::make_unique(server.context(), ClientInfo::Interface::TCP); + extractConnectionSettingsFromContext(server.context()); - /// These timeouts can be changed after receiving query. - - auto global_receive_timeout = connection_context->getSettingsRef().receive_timeout; - auto global_send_timeout = connection_context->getSettingsRef().send_timeout; - - socket().setReceiveTimeout(global_receive_timeout); - socket().setSendTimeout(global_send_timeout); + socket().setReceiveTimeout(receive_timeout); + socket().setSendTimeout(send_timeout); socket().setNoDelay(true); in = std::make_shared(socket()); @@ -159,34 +133,27 @@ void TCPHandler::runImpl() try { /// We try to send error information to the client. - sendException(e, connection_context->getSettingsRef().calculate_text_stack_trace); + sendException(e, send_exception_with_stack_trace); } catch (...) {} throw; } - /// When connecting, the default database can be specified. - if (!default_database.empty()) - { - if (!DatabaseCatalog::instance().isDatabaseExist(default_database)) - { - Exception e("Database " + backQuote(default_database) + " doesn't exist", ErrorCodes::UNKNOWN_DATABASE); - LOG_ERROR(log, getExceptionMessage(e, true)); - sendException(e, connection_context->getSettingsRef().calculate_text_stack_trace); - return; - } - - connection_context->setCurrentDatabase(default_database); - } - - Settings connection_settings = connection_context->getSettings(); - UInt64 idle_connection_timeout = connection_settings.idle_connection_timeout; - UInt64 poll_interval = connection_settings.poll_interval; - sendHello(); - connection_context->setProgressCallback([this] (const Progress & value) { return this->updateProgress(value); }); + if (!is_interserver_mode) /// In interserver mode queries are executed without a session context. + { + session->makeSessionContext(); + + /// If session created, then settings in session context has been updated. + /// So it's better to update the connection settings for flexibility. + extractConnectionSettingsFromContext(session->sessionContext()); + + /// When connecting, the default database could be specified. + if (!default_database.empty()) + session->sessionContext()->setCurrentDatabase(default_database); + } while (true) { @@ -208,9 +175,6 @@ void TCPHandler::runImpl() if (server.isCancelled() || in->eof()) break; - /// Set context of request. - query_context = Context::createCopy(connection_context); - Stopwatch watch; state.reset(); @@ -223,8 +187,6 @@ void TCPHandler::runImpl() std::optional exception; bool network_error = false; - bool send_exception_with_stack_trace = true; - try { /// If a user passed query-local timeouts, reset socket to initial state at the end of the query @@ -237,23 +199,22 @@ void TCPHandler::runImpl() if (!receivePacket()) continue; - /** If Query received, then settings in query_context has been updated - * So, update some other connection settings, for flexibility. - */ - { - const Settings & settings = query_context->getSettingsRef(); - idle_connection_timeout = settings.idle_connection_timeout; - poll_interval = settings.poll_interval; - } - /** If part_uuids got received in previous packet, trying to read again. */ - if (state.empty() && state.part_uuids && !receivePacket()) + if (state.empty() && state.part_uuids_to_ignore && !receivePacket()) continue; query_scope.emplace(query_context); - send_exception_with_stack_trace = query_context->getSettingsRef().calculate_text_stack_trace; + /// If query received, then settings in query_context has been updated. + /// So it's better to update the connection settings for flexibility. + extractConnectionSettingsFromContext(query_context); + + /// Sync timeouts on client and server during current query to avoid dangling queries on server + /// NOTE: We use send_timeout for the receive timeout and vice versa (change arguments ordering in TimeoutSetter), + /// because send_timeout is client-side setting which has opposite meaning on the server side. + /// NOTE: these settings are applied only for current connection (not for distributed tables' connections) + state.timeout_setter = std::make_unique(socket(), receive_timeout, send_timeout); /// Should we send internal logs to client? const auto client_logs_level = query_context->getSettingsRef().send_logs_level; @@ -266,20 +227,18 @@ void TCPHandler::runImpl() CurrentThread::setFatalErrorCallback([this]{ sendLogs(); }); } - query_context->setExternalTablesInitializer([&connection_settings, this] (ContextPtr context) + query_context->setExternalTablesInitializer([this] (ContextPtr context) { if (context != query_context) throw Exception("Unexpected context in external tables initializer", ErrorCodes::LOGICAL_ERROR); /// Get blocks of temporary tables - readData(connection_settings); + readData(); /// Reset the input stream, as we received an empty block while receiving external table data. /// So, the stream has been marked as cancelled and we can't read from it anymore. state.block_in.reset(); state.maybe_compressed_in.reset(); /// For more accurate accounting by MemoryTracker. - - state.temporary_tables_read = true; }); /// Send structure of columns to client for function input() @@ -303,15 +262,12 @@ void TCPHandler::runImpl() sendData(state.input_header); }); - query_context->setInputBlocksReaderCallback([&connection_settings, this] (ContextPtr context) -> Block + query_context->setInputBlocksReaderCallback([this] (ContextPtr context) -> Block { if (context != query_context) throw Exception("Unexpected context in InputBlocksReader", ErrorCodes::LOGICAL_ERROR); - size_t poll_interval_ms; - int receive_timeout; - std::tie(poll_interval_ms, receive_timeout) = getReadTimeouts(connection_settings); - if (!readDataNext(poll_interval_ms, receive_timeout)) + if (!readDataNext()) { state.block_in.reset(); state.maybe_compressed_in.reset(); @@ -334,15 +290,13 @@ void TCPHandler::runImpl() /// Processing Query state.io = executeQuery(state.query, query_context, false, state.stage, may_have_embedded_data); - unknown_packet_in_send_data = query_context->getSettingsRef().unknown_packet_in_send_data; - after_check_cancelled.restart(); after_send_progress.restart(); if (state.io.out) { state.need_receive_data_for_insert = true; - processInsertQuery(connection_settings); + processInsertQuery(); } else if (state.need_receive_data_for_input) // It implies pipeline execution { @@ -458,16 +412,17 @@ void TCPHandler::runImpl() try { - if (exception && !state.temporary_tables_read) - query_context->initializeExternalTablesIfSet(); + /// A query packet is always followed by one or more data packets. + /// If some of those data packets are left, try to skip them. + if (exception && !state.empty() && !state.read_all_data) + skipData(); } catch (...) { network_error = true; - LOG_WARNING(log, "Can't read external tables after query failure."); + LOG_WARNING(log, "Can't skip data packets after query failure."); } - try { /// QueryState should be cleared before QueryScope, since otherwise @@ -498,75 +453,94 @@ void TCPHandler::runImpl() } -bool TCPHandler::readDataNext(size_t poll_interval, time_t receive_timeout) +void TCPHandler::extractConnectionSettingsFromContext(const ContextPtr & context) +{ + const auto & settings = context->getSettingsRef(); + send_exception_with_stack_trace = settings.calculate_text_stack_trace; + send_timeout = settings.send_timeout; + receive_timeout = settings.receive_timeout; + poll_interval = settings.poll_interval; + idle_connection_timeout = settings.idle_connection_timeout; + interactive_delay = settings.interactive_delay; + sleep_in_send_tables_status = settings.sleep_in_send_tables_status_ms; + unknown_packet_in_send_data = settings.unknown_packet_in_send_data; + sleep_in_receive_cancel = settings.sleep_in_receive_cancel_ms; +} + + +bool TCPHandler::readDataNext() { Stopwatch watch(CLOCK_MONOTONIC_COARSE); + /// Poll interval should not be greater than receive_timeout + constexpr UInt64 min_timeout_ms = 5000; // 5 ms + UInt64 timeout_ms = std::max(min_timeout_ms, std::min(poll_interval * 1000000, static_cast(receive_timeout.totalMicroseconds()))); + bool read_ok = false; + /// We are waiting for a packet from the client. Thus, every `POLL_INTERVAL` seconds check whether we need to shut down. while (true) { - if (static_cast(*in).poll(poll_interval)) + if (static_cast(*in).poll(timeout_ms)) + { + /// If client disconnected. + if (in->eof()) + { + LOG_INFO(log, "Client has dropped the connection, cancel the query."); + state.is_connection_closed = true; + break; + } + + /// We accept and process data. + read_ok = receivePacket(); break; + } /// Do we need to shut down? if (server.isCancelled()) - return false; + break; /** Have we waited for data for too long? * If we periodically poll, the receive_timeout of the socket itself does not work. * Therefore, an additional check is added. */ Float64 elapsed = watch.elapsedSeconds(); - if (elapsed > static_cast(receive_timeout)) + if (elapsed > static_cast(receive_timeout.totalSeconds())) { throw Exception(ErrorCodes::SOCKET_TIMEOUT, "Timeout exceeded while receiving data from client. Waited for {} seconds, timeout is {} seconds.", - static_cast(elapsed), receive_timeout); + static_cast(elapsed), receive_timeout.totalSeconds()); } } - /// If client disconnected. - if (in->eof()) - { - LOG_INFO(log, "Client has dropped the connection, cancel the query."); - state.is_connection_closed = true; - return false; - } + if (read_ok) + sendLogs(); + else + state.read_all_data = true; - /// We accept and process data. And if they are over, then we leave. - if (!receivePacket()) - return false; - - sendLogs(); - return true; + return read_ok; } -std::tuple TCPHandler::getReadTimeouts(const Settings & connection_settings) +void TCPHandler::readData() { - const auto receive_timeout = query_context->getSettingsRef().receive_timeout.value; - - /// Poll interval should not be greater than receive_timeout - const size_t default_poll_interval = connection_settings.poll_interval * 1000000; - size_t current_poll_interval = static_cast(receive_timeout.totalMicroseconds()); - constexpr size_t min_poll_interval = 5000; // 5 ms - size_t poll_interval = std::max(min_poll_interval, std::min(default_poll_interval, current_poll_interval)); - - return std::make_tuple(poll_interval, receive_timeout.totalSeconds()); -} - - -void TCPHandler::readData(const Settings & connection_settings) -{ - auto [poll_interval, receive_timeout] = getReadTimeouts(connection_settings); sendLogs(); - while (readDataNext(poll_interval, receive_timeout)) + while (readDataNext()) ; } -void TCPHandler::processInsertQuery(const Settings & connection_settings) +void TCPHandler::skipData() +{ + state.skipping_data = true; + SCOPE_EXIT({ state.skipping_data = false; }); + + while (readDataNext()) + ; +} + + +void TCPHandler::processInsertQuery() { /** Made above the rest of the lines, so that in case of `writePrefix` function throws an exception, * client receive exception before sending data. @@ -592,7 +566,7 @@ void TCPHandler::processInsertQuery(const Settings & connection_settings) try { - readData(connection_settings); + readData(); } catch (...) { @@ -631,7 +605,7 @@ void TCPHandler::processOrdinaryQuery() break; } - if (after_send_progress.elapsed() / 1000 >= query_context->getSettingsRef().interactive_delay) + if (after_send_progress.elapsed() / 1000 >= interactive_delay) { /// Some time passed. after_send_progress.restart(); @@ -640,7 +614,7 @@ void TCPHandler::processOrdinaryQuery() sendLogs(); - if (async_in.poll(query_context->getSettingsRef().interactive_delay / 1000)) + if (async_in.poll(interactive_delay / 1000)) { const auto block = async_in.read(); if (!block) @@ -695,7 +669,7 @@ void TCPHandler::processOrdinaryQueryWithProcessors() CurrentMetrics::Increment query_thread_metric_increment{CurrentMetrics::QueryThread}; Block block; - while (executor.pull(block, query_context->getSettingsRef().interactive_delay / 1000)) + while (executor.pull(block, interactive_delay / 1000)) { std::lock_guard lock(task_callback_mutex); @@ -706,7 +680,7 @@ void TCPHandler::processOrdinaryQueryWithProcessors() break; } - if (after_send_progress.elapsed() / 1000 >= query_context->getSettingsRef().interactive_delay) + if (after_send_progress.elapsed() / 1000 >= interactive_delay) { /// Some time passed and there is a progress. after_send_progress.restart(); @@ -753,11 +727,13 @@ void TCPHandler::processTablesStatusRequest() TablesStatusRequest request; request.read(*in, client_tcp_protocol_version); + ContextPtr context_to_resolve_table_names = session->sessionContext() ? session->sessionContext() : server.context(); + TablesStatusResponse response; for (const QualifiedTableName & table_name: request.tables) { - auto resolved_id = connection_context->tryResolveStorageID({table_name.database, table_name.table}); - StoragePtr table = DatabaseCatalog::instance().tryGetTable(resolved_id, connection_context); + auto resolved_id = context_to_resolve_table_names->tryResolveStorageID({table_name.database, table_name.table}); + StoragePtr table = DatabaseCatalog::instance().tryGetTable(resolved_id, context_to_resolve_table_names); if (!table) continue; @@ -777,11 +753,10 @@ void TCPHandler::processTablesStatusRequest() writeVarUInt(Protocol::Server::TablesStatusResponse, *out); /// For testing hedged requests - const Settings & settings = query_context->getSettingsRef(); - if (settings.sleep_in_send_tables_status_ms.totalMilliseconds()) + if (sleep_in_send_tables_status.totalMilliseconds()) { out->next(); - std::chrono::milliseconds ms(settings.sleep_in_send_tables_status_ms.totalMilliseconds()); + std::chrono::milliseconds ms(sleep_in_send_tables_status.totalMilliseconds()); std::this_thread::sleep_for(ms); } @@ -924,11 +899,34 @@ bool TCPHandler::receiveProxyHeader() } LOG_TRACE(log, "Forwarded client address from PROXY header: {}", forwarded_address); - connection_context->getClientInfo().forwarded_for = forwarded_address; + session->getClientInfo().forwarded_for = forwarded_address; return true; } +namespace +{ + +std::string formatHTTPErrorResponseWhenUserIsConnectedToWrongPort(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; +} + +} + + void TCPHandler::receiveHello() { /// Receive `hello` packet. @@ -944,9 +942,7 @@ void TCPHandler::receiveHello() */ if (packet_type == 'G' || packet_type == 'P') { - writeString(formatHTTPErrorResponse(server.config()), - *out); - + writeString(formatHTTPErrorResponseWhenUserIsConnectedToWrongPort(server.config()), *out); throw Exception("Client has connected to wrong port", ErrorCodes::CLIENT_HAS_CONNECTED_TO_WRONG_PORT); } else @@ -973,14 +969,22 @@ void TCPHandler::receiveHello() (!user.empty() ? ", user: " + user : "") ); - if (user != USER_INTERSERVER_MARKER) - { - connection_context->setUser(user, password, socket().peerAddress()); - } - else + auto & client_info = session->getClientInfo(); + client_info.client_name = client_name; + client_info.client_version_major = client_version_major; + client_info.client_version_minor = client_version_minor; + client_info.client_version_patch = client_version_patch; + client_info.client_tcp_protocol_version = client_tcp_protocol_version; + + is_interserver_mode = (user == USER_INTERSERVER_MARKER); + if (is_interserver_mode) { + client_info.interface = ClientInfo::Interface::TCP_INTERSERVER; receiveClusterNameAndSalt(); + return; } + + session->authenticate(user, password, socket().peerAddress()); } @@ -1027,8 +1031,11 @@ bool TCPHandler::receivePacket() { case Protocol::Client::IgnoredPartUUIDs: /// Part uuids packet if any comes before query. + if (!state.empty() || state.part_uuids_to_ignore) + receiveUnexpectedIgnoredPartUUIDs(); receiveIgnoredPartUUIDs(); return true; + case Protocol::Client::Query: if (!state.empty()) receiveUnexpectedQuery(); @@ -1037,8 +1044,10 @@ bool TCPHandler::receivePacket() case Protocol::Client::Data: case Protocol::Client::Scalar: + if (state.skipping_data) + return receiveUnexpectedData(false); if (state.empty()) - receiveUnexpectedData(); + receiveUnexpectedData(true); return receiveData(packet_type == Protocol::Client::Scalar); case Protocol::Client::Ping: @@ -1049,10 +1058,9 @@ bool TCPHandler::receivePacket() case Protocol::Client::Cancel: { /// For testing connection collector. - const Settings & settings = query_context->getSettingsRef(); - if (settings.sleep_in_receive_cancel_ms.totalMilliseconds()) + if (sleep_in_receive_cancel.totalMilliseconds()) { - std::chrono::milliseconds ms(settings.sleep_in_receive_cancel_ms.totalMilliseconds()); + std::chrono::milliseconds ms(sleep_in_receive_cancel.totalMilliseconds()); std::this_thread::sleep_for(ms); } @@ -1074,14 +1082,18 @@ bool TCPHandler::receivePacket() } } + void TCPHandler::receiveIgnoredPartUUIDs() { - state.part_uuids = true; - std::vector uuids; - readVectorBinary(uuids, *in); + readVectorBinary(state.part_uuids_to_ignore.emplace(), *in); +} - if (!uuids.empty()) - query_context->getIgnoredPartUUIDs()->add(uuids); + +void TCPHandler::receiveUnexpectedIgnoredPartUUIDs() +{ + std::vector skip_part_uuids; + readVectorBinary(skip_part_uuids, *in); + throw NetException("Unexpected packet IgnoredPartUUIDs received from client", ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT); } @@ -1095,10 +1107,9 @@ String TCPHandler::receiveReadTaskResponseAssumeLocked() { state.is_cancelled = true; /// For testing connection collector. - const Settings & settings = query_context->getSettingsRef(); - if (settings.sleep_in_receive_cancel_ms.totalMilliseconds()) + if (sleep_in_receive_cancel.totalMilliseconds()) { - std::chrono::milliseconds ms(settings.sleep_in_receive_cancel_ms.totalMilliseconds()); + std::chrono::milliseconds ms(sleep_in_receive_cancel.totalMilliseconds()); std::this_thread::sleep_for(ms); } return {}; @@ -1129,14 +1140,14 @@ void TCPHandler::receiveClusterNameAndSalt() if (salt.empty()) throw NetException("Empty salt is not allowed", ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT); - cluster_secret = query_context->getCluster(cluster)->getSecret(); + cluster_secret = server.context()->getCluster(cluster)->getSecret(); } catch (const Exception & e) { try { /// We try to send error information to the client. - sendException(e, connection_context->getSettingsRef().calculate_text_stack_trace); + sendException(e, send_exception_with_stack_trace); } catch (...) {} @@ -1152,25 +1163,11 @@ void TCPHandler::receiveQuery() state.is_empty = false; readStringBinary(state.query_id, *in); - /// Client info - ClientInfo & client_info = query_context->getClientInfo(); + /// Read client info. + ClientInfo client_info = session->getClientInfo(); if (client_tcp_protocol_version >= DBMS_MIN_REVISION_WITH_CLIENT_INFO) client_info.read(*in, client_tcp_protocol_version); - /// For better support of old clients, that does not send ClientInfo. - if (client_info.query_kind == ClientInfo::QueryKind::NO_QUERY) - { - client_info.query_kind = ClientInfo::QueryKind::INITIAL_QUERY; - client_info.client_name = client_name; - client_info.client_version_major = client_version_major; - client_info.client_version_minor = client_version_minor; - client_info.client_version_patch = client_version_patch; - client_info.client_tcp_protocol_version = client_tcp_protocol_version; - } - - /// Set fields, that are known apriori. - client_info.interface = ClientInfo::Interface::TCP; - /// Per query settings are also passed via TCP. /// We need to check them before applying due to they can violate the settings constraints. auto settings_format = (client_tcp_protocol_version >= DBMS_MIN_REVISION_WITH_SETTINGS_SERIALIZED_AS_STRINGS) @@ -1191,12 +1188,11 @@ void TCPHandler::receiveQuery() readVarUInt(compression, *in); state.compression = static_cast(compression); + last_block_in.compression = state.compression; readStringBinary(state.query, *in); - /// It is OK to check only when query != INITIAL_QUERY, - /// since only in that case the actions will be done. - if (!cluster.empty() && client_info.query_kind != ClientInfo::QueryKind::INITIAL_QUERY) + if (is_interserver_mode) { #if USE_SSL std::string data(salt); @@ -1218,26 +1214,33 @@ void TCPHandler::receiveQuery() /// i.e. when the INSERT is done with the global context (w/o user). if (!client_info.initial_user.empty()) { - query_context->setUserWithoutCheckingPassword(client_info.initial_user, client_info.initial_address); - LOG_DEBUG(log, "User (initial): {}", query_context->getUserName()); + LOG_DEBUG(log, "User (initial): {}", client_info.initial_user); + session->authenticate(AlwaysAllowCredentials{client_info.initial_user}, client_info.initial_address); } - /// No need to update connection_context, since it does not requires user (it will not be used for query execution) #else throw Exception( "Inter-server secret support is disabled, because ClickHouse was built without SSL library", ErrorCodes::SUPPORT_IS_DISABLED); #endif } - else - { - query_context->setInitialRowPolicy(); - } + + query_context = session->makeQueryContext(std::move(client_info)); + + /// Sets the default database if it wasn't set earlier for the session context. + if (!default_database.empty() && !session->sessionContext()) + query_context->setCurrentDatabase(default_database); + + if (state.part_uuids_to_ignore) + query_context->getIgnoredPartUUIDs()->add(*state.part_uuids_to_ignore); + + query_context->setProgressCallback([this] (const Progress & value) { return this->updateProgress(value); }); /// /// Settings /// auto settings_changes = passed_settings.changes(); - if (client_info.query_kind == ClientInfo::QueryKind::INITIAL_QUERY) + auto query_kind = query_context->getClientInfo().query_kind; + if (query_kind == ClientInfo::QueryKind::INITIAL_QUERY) { /// Throw an exception if the passed settings violate the constraints. query_context->checkSettingsConstraints(settings_changes); @@ -1249,40 +1252,24 @@ void TCPHandler::receiveQuery() } query_context->applySettingsChanges(settings_changes); + /// Use the received query id, or generate a random default. It is convenient + /// to also generate the default OpenTelemetry trace id at the same time, and + /// set the trace parent. + /// Notes: + /// 1) ClientInfo might contain upstream trace id, so we decide whether to use + /// the default ids after we have received the ClientInfo. + /// 2) There is the opentelemetry_start_trace_probability setting that + /// controls when we start a new trace. It can be changed via Native protocol, + /// so we have to apply the changes first. + query_context->setCurrentQueryId(state.query_id); + /// Disable function name normalization when it's a secondary query, because queries are either /// already normalized on initiator node, or not normalized and should remain unnormalized for /// compatibility. - if (client_info.query_kind == ClientInfo::QueryKind::SECONDARY_QUERY) + if (query_kind == ClientInfo::QueryKind::SECONDARY_QUERY) { - query_context->setSetting("normalize_function_names", Field(0)); + query_context->setSetting("normalize_function_names", false); } - - // Use the received query id, or generate a random default. It is convenient - // to also generate the default OpenTelemetry trace id at the same time, and - // set the trace parent. - // Why is this done here and not earlier: - // 1) ClientInfo might contain upstream trace id, so we decide whether to use - // the default ids after we have received the ClientInfo. - // 2) There is the opentelemetry_start_trace_probability setting that - // controls when we start a new trace. It can be changed via Native protocol, - // so we have to apply the changes first. - query_context->setCurrentQueryId(state.query_id); - - // Set parameters of initial query. - if (client_info.query_kind == ClientInfo::QueryKind::INITIAL_QUERY) - { - /// 'Current' fields was set at receiveHello. - client_info.initial_user = client_info.current_user; - client_info.initial_query_id = client_info.current_query_id; - client_info.initial_address = client_info.current_address; - } - - /// Sync timeouts on client and server during current query to avoid dangling queries on server - /// NOTE: We use settings.send_timeout for the receive timeout and vice versa (change arguments ordering in TimeoutSetter), - /// because settings.send_timeout is client-side setting which has opposite meaning on the server side. - /// NOTE: these settings are applied only for current connection (not for distributed tables' connections) - const Settings & settings = query_context->getSettingsRef(); - state.timeout_setter = std::make_unique(socket(), settings.receive_timeout, settings.send_timeout); } void TCPHandler::receiveUnexpectedQuery() @@ -1307,7 +1294,10 @@ void TCPHandler::receiveUnexpectedQuery() readStringBinary(skip_hash, *in, 32); readVarUInt(skip_uint_64, *in); + readVarUInt(skip_uint_64, *in); + last_block_in.compression = static_cast(skip_uint_64); + readStringBinary(skip_string, *in); throw NetException("Unexpected packet Query received from client", ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT); @@ -1324,73 +1314,77 @@ bool TCPHandler::receiveData(bool scalar) /// Read one block from the network and write it down Block block = state.block_in->read(); - if (block) + if (!block) { - if (scalar) - { - /// Scalar value - query_context->addScalar(temporary_id.table_name, block); - } - else if (!state.need_receive_data_for_insert && !state.need_receive_data_for_input) - { - /// Data for external tables + state.read_all_data = true; + return false; + } - auto resolved = query_context->tryResolveStorageID(temporary_id, Context::ResolveExternal); - StoragePtr storage; - /// If such a table does not exist, create it. - if (resolved) - { - storage = DatabaseCatalog::instance().getTable(resolved, query_context); - } - else - { - NamesAndTypesList columns = block.getNamesAndTypesList(); - auto temporary_table = TemporaryTableHolder(query_context, ColumnsDescription{columns}, {}); - storage = temporary_table.getTable(); - query_context->addExternalTable(temporary_id.table_name, std::move(temporary_table)); - } - auto metadata_snapshot = storage->getInMemoryMetadataPtr(); - /// The data will be written directly to the table. - auto temporary_table_out = std::make_shared(storage->write(ASTPtr(), metadata_snapshot, query_context)); - temporary_table_out->write(block); - temporary_table_out->writeSuffix(); + if (scalar) + { + /// Scalar value + query_context->addScalar(temporary_id.table_name, block); + } + else if (!state.need_receive_data_for_insert && !state.need_receive_data_for_input) + { + /// Data for external tables - } - else if (state.need_receive_data_for_input) + auto resolved = query_context->tryResolveStorageID(temporary_id, Context::ResolveExternal); + StoragePtr storage; + /// If such a table does not exist, create it. + if (resolved) { - /// 'input' table function. - state.block_for_input = block; + storage = DatabaseCatalog::instance().getTable(resolved, query_context); } else { - /// INSERT query. - state.io.out->write(block); + NamesAndTypesList columns = block.getNamesAndTypesList(); + auto temporary_table = TemporaryTableHolder(query_context, ColumnsDescription{columns}, {}); + storage = temporary_table.getTable(); + query_context->addExternalTable(temporary_id.table_name, std::move(temporary_table)); } - return true; + auto metadata_snapshot = storage->getInMemoryMetadataPtr(); + /// The data will be written directly to the table. + auto temporary_table_out = std::make_shared(storage->write(ASTPtr(), metadata_snapshot, query_context)); + temporary_table_out->write(block); + temporary_table_out->writeSuffix(); + + } + else if (state.need_receive_data_for_input) + { + /// 'input' table function. + state.block_for_input = block; } else - return false; + { + /// INSERT query. + state.io.out->write(block); + } + return true; } -void TCPHandler::receiveUnexpectedData() + +bool TCPHandler::receiveUnexpectedData(bool throw_exception) { String skip_external_table_name; readStringBinary(skip_external_table_name, *in); std::shared_ptr maybe_compressed_in; - if (last_block_in.compression == Protocol::Compression::Enable) maybe_compressed_in = std::make_shared(*in, /* allow_different_codecs */ true); else maybe_compressed_in = in; - auto skip_block_in = std::make_shared( - *maybe_compressed_in, - last_block_in.header, - client_tcp_protocol_version); + auto skip_block_in = std::make_shared(*maybe_compressed_in, client_tcp_protocol_version); + bool read_ok = skip_block_in->read(); - skip_block_in->read(); - throw NetException("Unexpected packet Data received from client", ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT); + if (!read_ok) + state.read_all_data = true; + + if (throw_exception) + throw NetException("Unexpected packet Data received from client", ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT); + + return read_ok; } void TCPHandler::initBlockInput() @@ -1411,9 +1405,6 @@ void TCPHandler::initBlockInput() else if (state.need_receive_data_for_input) header = state.input_header; - last_block_in.header = header; - last_block_in.compression = state.compression; - state.block_in = std::make_shared( *state.maybe_compressed_in, header, @@ -1426,10 +1417,9 @@ void TCPHandler::initBlockOutput(const Block & block) { if (!state.block_out) { + const Settings & query_settings = query_context->getSettingsRef(); if (!state.maybe_compressed_out) { - const Settings & query_settings = query_context->getSettingsRef(); - std::string method = Poco::toUpper(query_settings.network_compression_method.toString()); std::optional level; if (method == "ZSTD") @@ -1450,7 +1440,7 @@ void TCPHandler::initBlockOutput(const Block & block) *state.maybe_compressed_out, client_tcp_protocol_version, block.cloneEmpty(), - !connection_context->getSettingsRef().low_cardinality_allow_in_native_format); + !query_settings.low_cardinality_allow_in_native_format); } } @@ -1459,11 +1449,12 @@ void TCPHandler::initLogsBlockOutput(const Block & block) if (!state.logs_block_out) { /// Use uncompressed stream since log blocks usually contain only one row + const Settings & query_settings = query_context->getSettingsRef(); state.logs_block_out = std::make_shared( *out, client_tcp_protocol_version, block.cloneEmpty(), - !connection_context->getSettingsRef().low_cardinality_allow_in_native_format); + !query_settings.low_cardinality_allow_in_native_format); } } @@ -1473,7 +1464,7 @@ bool TCPHandler::isQueryCancelled() if (state.is_cancelled || state.sent_all_data) return true; - if (after_check_cancelled.elapsed() / 1000 < query_context->getSettingsRef().interactive_delay) + if (after_check_cancelled.elapsed() / 1000 < interactive_delay) return false; after_check_cancelled.restart(); @@ -1501,10 +1492,9 @@ bool TCPHandler::isQueryCancelled() state.is_cancelled = true; /// For testing connection collector. { - const Settings & settings = query_context->getSettingsRef(); - if (settings.sleep_in_receive_cancel_ms.totalMilliseconds()) + if (sleep_in_receive_cancel.totalMilliseconds()) { - std::chrono::milliseconds ms(settings.sleep_in_receive_cancel_ms.totalMilliseconds()); + std::chrono::milliseconds ms(sleep_in_receive_cancel.totalMilliseconds()); std::this_thread::sleep_for(ms); } } @@ -1542,11 +1532,10 @@ void TCPHandler::sendData(const Block & block) writeStringBinary("", *out); /// For testing hedged requests - const Settings & settings = query_context->getSettingsRef(); - if (block.rows() > 0 && settings.sleep_in_send_data_ms.totalMilliseconds()) + if (block.rows() > 0 && query_context->getSettingsRef().sleep_in_send_data_ms.totalMilliseconds()) { out->next(); - std::chrono::milliseconds ms(settings.sleep_in_send_data_ms.totalMilliseconds()); + std::chrono::milliseconds ms(query_context->getSettingsRef().sleep_in_send_data_ms.totalMilliseconds()); std::this_thread::sleep_for(ms); } diff --git a/src/Server/TCPHandler.h b/src/Server/TCPHandler.h index 086c1f7d5e5..7f75d0ac04b 100644 --- a/src/Server/TCPHandler.h +++ b/src/Server/TCPHandler.h @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include "IServer.h" @@ -26,7 +26,10 @@ namespace Poco { class Logger; } namespace DB { +class Session; +struct Settings; class ColumnsDescription; +struct BlockStreamProfileInfo; /// State of query processing. struct QueryState @@ -65,11 +68,11 @@ struct QueryState bool sent_all_data = false; /// Request requires data from the client (INSERT, but not INSERT SELECT). bool need_receive_data_for_insert = false; - /// Temporary tables read - bool temporary_tables_read = false; + /// Data was read. + bool read_all_data = false; /// A state got uuids to exclude from a query - bool part_uuids = false; + std::optional> part_uuids_to_ignore; /// Request requires data from client for function input() bool need_receive_data_for_input = false; @@ -78,6 +81,9 @@ struct QueryState /// sample block from StorageInput Block input_header; + /// If true, the data packets will be skipped instead of reading. Used to recover after errors. + bool skipping_data = false; + /// To output progress, the difference after the previous sending of progress. Progress progress; @@ -99,7 +105,6 @@ struct QueryState struct LastBlockInputParameters { Protocol::Compression compression = Protocol::Compression::Disable; - Block header; }; class TCPHandler : public Poco::Net::TCPServerConnection @@ -132,10 +137,19 @@ private: UInt64 client_version_patch = 0; UInt64 client_tcp_protocol_version = 0; - ContextMutablePtr connection_context; - ContextMutablePtr query_context; + /// Connection settings, which are extracted from a context. + bool send_exception_with_stack_trace = true; + Poco::Timespan send_timeout = DBMS_DEFAULT_SEND_TIMEOUT_SEC; + Poco::Timespan receive_timeout = DBMS_DEFAULT_RECEIVE_TIMEOUT_SEC; + UInt64 poll_interval = DBMS_DEFAULT_POLL_INTERVAL; + UInt64 idle_connection_timeout = 3600; + UInt64 interactive_delay = 100000; + Poco::Timespan sleep_in_send_tables_status; + UInt64 unknown_packet_in_send_data = 0; + Poco::Timespan sleep_in_receive_cancel; - size_t unknown_packet_in_send_data = 0; + std::unique_ptr session; + ContextMutablePtr query_context; /// Streams for reading/writing from/to client connection socket. std::shared_ptr in; @@ -148,6 +162,7 @@ private: String default_database; /// For inter-server secret (remote_server.*.secret) + bool is_interserver_mode = false; String salt; String cluster; String cluster_secret; @@ -167,6 +182,8 @@ private: void runImpl(); + void extractConnectionSettingsFromContext(const ContextPtr & context); + bool receiveProxyHeader(); void receiveHello(); bool receivePacket(); @@ -174,18 +191,19 @@ private: void receiveIgnoredPartUUIDs(); String receiveReadTaskResponseAssumeLocked(); bool receiveData(bool scalar); - bool readDataNext(size_t poll_interval, time_t receive_timeout); - void readData(const Settings & connection_settings); + bool readDataNext(); + void readData(); + void skipData(); void receiveClusterNameAndSalt(); - std::tuple getReadTimeouts(const Settings & connection_settings); - [[noreturn]] void receiveUnexpectedData(); + bool receiveUnexpectedData(bool throw_exception = true); [[noreturn]] void receiveUnexpectedQuery(); + [[noreturn]] void receiveUnexpectedIgnoredPartUUIDs(); [[noreturn]] void receiveUnexpectedHello(); [[noreturn]] void receiveUnexpectedTablesStatusRequest(); /// Process INSERT query - void processInsertQuery(const Settings & connection_settings); + void processInsertQuery(); /// Process a request that does not require the receiving of data blocks from the client void processOrdinaryQuery(); diff --git a/src/Storages/AlterCommands.cpp b/src/Storages/AlterCommands.cpp index 1bb8e6bb9b0..7388f44fee1 100644 --- a/src/Storages/AlterCommands.cpp +++ b/src/Storages/AlterCommands.cpp @@ -679,6 +679,9 @@ bool isMetadataOnlyConversion(const IDataType * from, const IDataType * to) while (true) { + if (from->equals(*to)) + return true; + auto it_range = ALLOWED_CONVERSIONS.equal_range(typeid(*from)); for (auto it = it_range.first; it != it_range.second; ++it) { @@ -697,9 +700,9 @@ bool isMetadataOnlyConversion(const IDataType * from, const IDataType * to) const auto * nullable_from = typeid_cast(from); const auto * nullable_to = typeid_cast(to); - if (nullable_from && nullable_to) + if (nullable_to) { - from = nullable_from->getNestedType().get(); + from = nullable_from ? nullable_from->getNestedType().get() : from; to = nullable_to->getNestedType().get(); continue; } diff --git a/src/Storages/CMakeLists.txt b/src/Storages/CMakeLists.txt index ff22e9fa9e1..6d4f18d34b1 100644 --- a/src/Storages/CMakeLists.txt +++ b/src/Storages/CMakeLists.txt @@ -1,6 +1,10 @@ add_subdirectory(MergeTree) add_subdirectory(System) -if(ENABLE_EXAMPLES) +if (ENABLE_EXAMPLES) add_subdirectory(examples) endif() + +if (ENABLE_FUZZING) + add_subdirectory(fuzzers) +endif() diff --git a/src/Storages/IStorage.cpp b/src/Storages/IStorage.cpp index 0e9f82a9802..cd48786b6c1 100644 --- a/src/Storages/IStorage.cpp +++ b/src/Storages/IStorage.cpp @@ -201,6 +201,16 @@ NameDependencies IStorage::getDependentViewsByColumn(ContextPtr context) const return name_deps; } +BackupEntries IStorage::backup(const ASTs &, ContextPtr) const +{ + throw Exception("Table engine " + getName() + " doesn't support backups", ErrorCodes::NOT_IMPLEMENTED); +} + +RestoreDataTasks IStorage::restoreFromBackup(const BackupPtr &, const String &, const ASTs &, ContextMutablePtr) +{ + throw Exception("Table engine " + getName() + " doesn't support restoring", ErrorCodes::NOT_IMPLEMENTED); +} + std::string PrewhereInfo::dump() const { WriteBufferFromOwnString ss; diff --git a/src/Storages/IStorage.h b/src/Storages/IStorage.h index 2180f92df98..0432fee85f9 100644 --- a/src/Storages/IStorage.h +++ b/src/Storages/IStorage.h @@ -65,6 +65,13 @@ class EnabledQuota; struct SelectQueryInfo; using NameDependencies = std::unordered_map>; +using DatabaseAndTableName = std::pair; + +class IBackup; +using BackupPtr = std::shared_ptr; +class IBackupEntry; +using BackupEntries = std::vector>>; +using RestoreDataTasks = std::vector>; struct ColumnSize { @@ -120,6 +127,9 @@ public: /// Returns true if the storage supports queries with the FINAL section. virtual bool supportsFinal() const { return false; } + /// Returns true if the storage supports insert queries with the PARTITION BY section. + virtual bool supportsPartitionBy() const { return false; } + /// Returns true if the storage supports queries with the PREWHERE section. virtual bool supportsPrewhere() const { return false; } @@ -188,6 +198,12 @@ public: NameDependencies getDependentViewsByColumn(ContextPtr context) const; + /// Prepares entries to backup data of the storage. + virtual BackupEntries backup(const ASTs & partitions, ContextPtr context) const; + + /// Extract data from the backup and put it to the storage. + virtual RestoreDataTasks restoreFromBackup(const BackupPtr & backup, const String & data_path_in_backup, const ASTs & partitions, ContextMutablePtr context); + protected: /// Returns whether the column is virtual - by default all columns are real. /// Initially reserved virtual column name may be shadowed by real column. @@ -264,7 +280,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*/, diff --git a/src/Storages/Kafka/KafkaBlockInputStream.cpp b/src/Storages/Kafka/KafkaBlockInputStream.cpp index 5d9b19b1972..95fa1459e76 100644 --- a/src/Storages/Kafka/KafkaBlockInputStream.cpp +++ b/src/Storages/Kafka/KafkaBlockInputStream.cpp @@ -252,7 +252,11 @@ Block KafkaBlockInputStream::readImpl() } else { - LOG_WARNING(log, "Parsing of message (topic: {}, partition: {}, offset: {}) return no rows.", buffer->currentTopic(), buffer->currentPartition(), buffer->currentOffset()); + // We came here in case of tombstone (or sometimes zero-length) messages, and it is not something abnormal + // TODO: it seems like in case of put_error_to_stream=true we may need to process those differently + // currently we just skip them with note in logs. + buffer->storeLastReadMessageOffset(); + LOG_DEBUG(log, "Parsing of message (topic: {}, partition: {}, offset: {}) return no rows.", buffer->currentTopic(), buffer->currentPartition(), buffer->currentOffset()); } if (!buffer->hasMorePolledMessages() diff --git a/src/Storages/Kafka/ReadBufferFromKafkaConsumer.cpp b/src/Storages/Kafka/ReadBufferFromKafkaConsumer.cpp index bd25607a5f3..86037276166 100644 --- a/src/Storages/Kafka/ReadBufferFromKafkaConsumer.cpp +++ b/src/Storages/Kafka/ReadBufferFromKafkaConsumer.cpp @@ -466,13 +466,19 @@ bool ReadBufferFromKafkaConsumer::nextImpl() if (!allowed || !hasMorePolledMessages()) return false; - // XXX: very fishy place with const casting. - auto * new_position = reinterpret_cast(const_cast(current->get_payload().get_data())); - BufferBase::set(new_position, current->get_payload().get_size(), 0); - allowed = false; + const auto * message_data = current->get_payload().get_data(); + size_t message_size = current->get_payload().get_size(); + allowed = false; ++current; + /// If message is empty, return end of stream. + if (message_data == nullptr) + return false; + + /// const_cast is needed, because ReadBuffer works with non-const char *. + auto * new_position = reinterpret_cast(const_cast(message_data)); + BufferBase::set(new_position, message_size, 0); return true; } diff --git a/src/Storages/Kafka/WriteBufferToKafkaProducer.cpp b/src/Storages/Kafka/WriteBufferToKafkaProducer.cpp index dbb18b56769..34ab48e501d 100644 --- a/src/Storages/Kafka/WriteBufferToKafkaProducer.cpp +++ b/src/Storages/Kafka/WriteBufferToKafkaProducer.cpp @@ -48,7 +48,7 @@ WriteBufferToKafkaProducer::WriteBufferToKafkaProducer( WriteBufferToKafkaProducer::~WriteBufferToKafkaProducer() { - assert(rows == 0 && chunks.empty()); + assert(rows == 0); } void WriteBufferToKafkaProducer::countRow(const Columns & columns, size_t current_row) 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 5f5ce8a4a37..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 @@ -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/IMergeTreeReader.cpp b/src/Storages/MergeTree/IMergeTreeReader.cpp index 4efd3d669eb..d659259e1a9 100644 --- a/src/Storages/MergeTree/IMergeTreeReader.cpp +++ b/src/Storages/MergeTree/IMergeTreeReader.cpp @@ -48,9 +48,8 @@ IMergeTreeReader::IMergeTreeReader( part_columns = Nested::collect(part_columns); } - columns_from_part.set_empty_key(StringRef()); for (const auto & column_from_part : part_columns) - columns_from_part.emplace(column_from_part.name, &column_from_part.type); + columns_from_part[column_from_part.name] = &column_from_part.type; } IMergeTreeReader::~IMergeTreeReader() = default; @@ -213,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); @@ -227,7 +226,7 @@ NameAndTypePair IMergeTreeReader::getColumnFromPart(const NameAndTypePair & requ if (it == columns_from_part.end()) return required_column; - const auto & type = *it->second; + const DataTypePtr & type = *it->getMapped(); if (required_column.isSubcolumn()) { auto subcolumn_name = required_column.getSubcolumnName(); @@ -236,10 +235,10 @@ NameAndTypePair IMergeTreeReader::getColumnFromPart(const NameAndTypePair & requ if (!subcolumn_type) return required_column; - return {String(it->first), subcolumn_name, type, subcolumn_type}; + return {String(it->getKey()), subcolumn_name, type, subcolumn_type}; } - return {String(it->first), type}; + 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 ab412e48822..696cc2f105b 100644 --- a/src/Storages/MergeTree/IMergeTreeReader.h +++ b/src/Storages/MergeTree/IMergeTreeReader.h @@ -1,9 +1,9 @@ #pragma once #include +#include #include #include -#include namespace DB { @@ -95,11 +95,8 @@ private: /// Actual data type of columns in part -#if !defined(ARCADIA_BUILD) - google::dense_hash_map columns_from_part; -#else - google::sparsehash::dense_hash_map columns_from_part; -#endif + using ColumnsFromPart = HashMapWithSavedHash; + ColumnsFromPart columns_from_part; }; } diff --git a/src/Storages/MergeTree/KeyCondition.cpp b/src/Storages/MergeTree/KeyCondition.cpp index 235cadfba11..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 @@ -1055,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); @@ -1367,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. diff --git a/src/Storages/MergeTree/MergeTreeData.cpp b/src/Storages/MergeTree/MergeTreeData.cpp index 4730bf9f47c..764f5d7adf7 100644 --- a/src/Storages/MergeTree/MergeTreeData.cpp +++ b/src/Storages/MergeTree/MergeTreeData.cpp @@ -1,3 +1,8 @@ +#include + +#include +#include +#include #include #include #include @@ -9,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -32,7 +38,6 @@ #include #include #include -#include #include #include #include @@ -51,10 +56,12 @@ #include #include #include +#include #include #include +#include #include #include @@ -2395,7 +2402,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 || part->info.getDataVersion() != drop_range.getDataVersion())) + if (is_drop_part && (part->info.min_block != drop_range.min_block || part->info.max_block != drop_range.max_block || part->info.getMutationVersion() != drop_range.getMutationVersion())) { /// Why we check only min and max blocks here without checking merge /// level? It's a tricky situation which can happen on a stale @@ -2412,7 +2419,7 @@ MergeTreeData::DataPartsVector MergeTreeData::removePartsInRangeFromWorkingSet(c /// So here we just check that all_1_3_1 covers blocks from drop /// all_2_2_2. /// - 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(); + 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.getMutationVersion() >= drop_range.getMutationVersion(); 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); @@ -2836,7 +2843,7 @@ MergeTreeData::DataPartPtr MergeTreeData::getActiveContainingPart(const String & return getActiveContainingPart(part_info); } -MergeTreeData::DataPartsVector MergeTreeData::getDataPartsVectorInPartition(MergeTreeData::DataPartState state, const String & partition_id) +MergeTreeData::DataPartsVector MergeTreeData::getDataPartsVectorInPartition(MergeTreeData::DataPartState state, const String & partition_id) const { DataPartStateAndPartitionID state_with_partition{state, partition_id}; @@ -2846,6 +2853,22 @@ MergeTreeData::DataPartsVector MergeTreeData::getDataPartsVectorInPartition(Merg data_parts_by_state_and_info.upper_bound(state_with_partition)); } +MergeTreeData::DataPartsVector MergeTreeData::getDataPartsVectorInPartitions(MergeTreeData::DataPartState state, const std::unordered_set & partition_ids) const +{ + auto lock = lockParts(); + DataPartsVector res; + for (const auto & partition_id : partition_ids) + { + DataPartStateAndPartitionID state_with_partition{state, partition_id}; + insertAtEnd( + res, + DataPartsVector( + data_parts_by_state_and_info.lower_bound(state_with_partition), + data_parts_by_state_and_info.upper_bound(state_with_partition))); + } + return res; +} + MergeTreeData::DataPartPtr MergeTreeData::getPartIfExists(const MergeTreePartInfo & part_info, const MergeTreeData::DataPartStates & valid_states) { auto lock = lockParts(); @@ -3207,6 +3230,121 @@ Pipe MergeTreeData::alterPartition( return {}; } + +BackupEntries MergeTreeData::backup(const ASTs & partitions, ContextPtr local_context) const +{ + DataPartsVector data_parts; + if (partitions.empty()) + data_parts = getDataPartsVector(); + else + data_parts = getDataPartsVectorInPartitions(MergeTreeDataPartState::Committed, getPartitionIDsFromQuery(partitions, local_context)); + return backupDataParts(data_parts); +} + + +BackupEntries MergeTreeData::backupDataParts(const DataPartsVector & data_parts) +{ + BackupEntries backup_entries; + std::map> temp_dirs; + + for (const auto & part : data_parts) + { + auto disk = part->volume->getDisk(); + + auto temp_dir_it = temp_dirs.find(disk); + if (temp_dir_it == temp_dirs.end()) + temp_dir_it = temp_dirs.emplace(disk, std::make_shared(disk, "tmp_backup_")).first; + auto temp_dir_owner = temp_dir_it->second; + fs::path temp_dir = temp_dir_owner->getPath(); + + fs::path part_dir = part->getFullRelativePath(); + fs::path temp_part_dir = temp_dir / part->relative_path; + disk->createDirectories(temp_part_dir); + + for (const auto & [filepath, checksum] : part->checksums.files) + { + String relative_filepath = fs::path(part->relative_path) / filepath; + String hardlink_filepath = temp_part_dir / filepath; + disk->createHardLink(part_dir / filepath, hardlink_filepath); + UInt128 file_hash{checksum.file_hash.first, checksum.file_hash.second}; + backup_entries.emplace_back( + relative_filepath, + std::make_unique(disk, hardlink_filepath, checksum.file_size, file_hash, temp_dir_owner)); + } + + for (const auto & filepath : part->getFileNamesWithoutChecksums()) + { + String relative_filepath = fs::path(part->relative_path) / filepath; + backup_entries.emplace_back(relative_filepath, std::make_unique(disk, part_dir / filepath)); + } + } + + return backup_entries; +} + + +RestoreDataTasks MergeTreeData::restoreDataPartsFromBackup(const BackupPtr & backup, const String & data_path_in_backup, + const std::unordered_set & partition_ids, + SimpleIncrement * increment) +{ + RestoreDataTasks restore_tasks; + + Strings part_names = backup->list(data_path_in_backup); + for (const String & part_name : part_names) + { + MergeTreePartInfo part_info; + if (!MergeTreePartInfo::tryParsePartName(part_name, &part_info, format_version)) + continue; + + if (!partition_ids.empty() && !partition_ids.contains(part_info.partition_id)) + continue; + + UInt64 total_size_of_part = 0; + Strings filenames = backup->list(data_path_in_backup + part_name + "/", ""); + for (const String & filename : filenames) + total_size_of_part += backup->getSize(data_path_in_backup + part_name + "/" + filename); + + std::shared_ptr reservation = getStoragePolicy()->reserveAndCheck(total_size_of_part); + + auto restore_task = [this, + backup, + data_path_in_backup, + part_name, + part_info = std::move(part_info), + filenames = std::move(filenames), + reservation, + increment]() + { + auto disk = reservation->getDisk(); + + auto temp_part_dir_owner = std::make_shared(disk, relative_data_path + "restoring_" + part_name + "_"); + String temp_part_dir = temp_part_dir_owner->getPath(); + disk->createDirectories(temp_part_dir); + + assert(temp_part_dir.starts_with(relative_data_path)); + String relative_temp_part_dir = temp_part_dir.substr(relative_data_path.size()); + + for (const String & filename : filenames) + { + auto backup_entry = backup->read(data_path_in_backup + part_name + "/" + filename); + auto read_buffer = backup_entry->getReadBuffer(); + auto write_buffer = disk->writeFile(temp_part_dir + "/" + filename); + copyData(*read_buffer, *write_buffer); + } + + auto single_disk_volume = std::make_shared(disk->getName(), disk, 0); + auto part = createPart(part_name, part_info, single_disk_volume, relative_temp_part_dir); + part->loadColumnsChecksumsIndexes(false, true); + renameTempPartAndAdd(part, increment); + }; + + restore_tasks.emplace_back(std::move(restore_task)); + } + + return restore_tasks; +} + + String MergeTreeData::getPartitionIDFromQuery(const ASTPtr & ast, ContextPtr local_context) const { const auto & partition_ast = ast->as(); @@ -3239,6 +3377,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); @@ -3287,6 +3440,15 @@ String MergeTreeData::getPartitionIDFromQuery(const ASTPtr & ast, ContextPtr loc return partition_id; } +std::unordered_set MergeTreeData::getPartitionIDsFromQuery(const ASTs & asts, ContextPtr local_context) const +{ + std::unordered_set partition_ids; + for (const auto & ast : asts) + partition_ids.emplace(getPartitionIDFromQuery(ast, local_context)); + return partition_ids; +} + + MergeTreeData::DataPartsVector MergeTreeData::getDataPartsVector( const DataPartStates & affordable_states, DataPartStateVector * out_states, bool require_projection_parts) const { @@ -3927,7 +4089,7 @@ static void selectBestProjection( if (projection_parts.empty()) return; - auto sum_marks = reader.estimateNumMarksToRead( + auto projection_result_ptr = reader.estimateNumMarksToRead( projection_parts, candidate.required_columns, metadata_snapshot, @@ -3937,6 +4099,10 @@ static void selectBestProjection( settings.max_threads, max_added_blocks); + if (projection_result_ptr->error()) + return; + + auto sum_marks = projection_result_ptr->marks(); if (normal_parts.empty()) { // All parts are projection parts which allows us to use in_order_optimization. @@ -3945,7 +4111,7 @@ static void selectBestProjection( } else { - sum_marks += reader.estimateNumMarksToRead( + auto normal_result_ptr = reader.estimateNumMarksToRead( normal_parts, required_columns, metadata_snapshot, @@ -3954,7 +4120,14 @@ static void selectBestProjection( query_context, settings.max_threads, max_added_blocks); + + if (normal_result_ptr->error()) + return; + + sum_marks += normal_result_ptr->marks(); + candidate.merge_tree_normal_select_result_ptr = normal_result_ptr; } + candidate.merge_tree_projection_select_result_ptr = projection_result_ptr; // We choose the projection with least sum_marks to read. if (sum_marks < min_sum_marks) @@ -4175,10 +4348,25 @@ bool MergeTreeData::getQueryProcessingStageWithAggregateProjection( auto parts = getDataPartsVector(); MergeTreeDataSelectExecutor reader(*this); + query_info.merge_tree_select_result_ptr = reader.estimateNumMarksToRead( + parts, + analysis_result.required_columns, + metadata_snapshot, + metadata_snapshot, + query_info, + query_context, + settings.max_threads, + max_added_blocks); + + size_t min_sum_marks = std::numeric_limits::max(); + if (!query_info.merge_tree_select_result_ptr->error()) + { + // Add 1 to base sum_marks so that we prefer projections even when they have equal number of marks to read. + // NOTE: It is not clear if we need it. E.g. projections do not support skip index for now. + min_sum_marks = query_info.merge_tree_select_result_ptr->marks() + 1; + } ProjectionCandidate * selected_candidate = nullptr; - size_t min_sum_marks = std::numeric_limits::max(); - bool has_ordinary_projection = false; /// Favor aggregate projections for (auto & candidate : candidates) { @@ -4197,44 +4385,25 @@ bool MergeTreeData::getQueryProcessingStageWithAggregateProjection( selected_candidate, min_sum_marks); } - else - has_ordinary_projection = true; } - /// Select the best normal projection if no aggregate projection is available - if (!selected_candidate && has_ordinary_projection) + /// Select the best normal projection. + for (auto & candidate : candidates) { - min_sum_marks = reader.estimateNumMarksToRead( - parts, - analysis_result.required_columns, - metadata_snapshot, - metadata_snapshot, - query_info, - query_context, - settings.max_threads, - max_added_blocks); - - // Add 1 to base sum_marks so that we prefer projections even when they have equal number of marks to read. - // NOTE: It is not clear if we need it. E.g. projections do not support skip index for now. - min_sum_marks += 1; - - for (auto & candidate : candidates) + if (candidate.desc->type == ProjectionDescription::Type::Normal) { - if (candidate.desc->type == ProjectionDescription::Type::Normal) - { - selectBestProjection( - reader, - metadata_snapshot, - query_info, - analysis_result.required_columns, - candidate, - query_context, - max_added_blocks, - settings, - parts, - selected_candidate, - min_sum_marks); - } + selectBestProjection( + reader, + metadata_snapshot, + query_info, + analysis_result.required_columns, + candidate, + query_context, + max_added_blocks, + settings, + parts, + selected_candidate, + min_sum_marks); } } @@ -4248,7 +4417,6 @@ bool MergeTreeData::getQueryProcessingStageWithAggregateProjection( } query_info.projection = std::move(*selected_candidate); - return true; } return false; diff --git a/src/Storages/MergeTree/MergeTreeData.h b/src/Storages/MergeTree/MergeTreeData.h index 02d1f5e264e..05d1b45a557 100644 --- a/src/Storages/MergeTree/MergeTreeData.h +++ b/src/Storages/MergeTree/MergeTreeData.h @@ -436,7 +436,8 @@ public: void swapActivePart(MergeTreeData::DataPartPtr part_copy); /// Returns all parts in specified partition - DataPartsVector getDataPartsVectorInPartition(DataPartState state, const String & partition_id); + DataPartsVector getDataPartsVectorInPartition(DataPartState state, const String & partition_id) const; + DataPartsVector getDataPartsVectorInPartitions(DataPartState state, const std::unordered_set & partition_ids) const; /// Returns the part with the given name and state or nullptr if no such part. DataPartPtr getPartIfExists(const String & part_name, const DataPartStates & valid_states); @@ -606,6 +607,17 @@ public: ContextPtr context, TableLockHolder & table_lock_holder); + /// Prepares entries to backup data of the storage. + BackupEntries backup(const ASTs & partitions, ContextPtr context) const override; + static BackupEntries backupDataParts(const DataPartsVector & data_parts); + + /// Extract data from the backup and put it to the storage. + RestoreDataTasks restoreDataPartsFromBackup( + const BackupPtr & backup, + const String & data_path_in_backup, + const std::unordered_set & partition_ids, + SimpleIncrement * increment); + /// Moves partition to specified Disk void movePartitionToDisk(const ASTPtr & partition, const String & name, bool moving_part, ContextPtr context); @@ -636,6 +648,7 @@ public: /// For ATTACH/DETACH/DROP PARTITION. String getPartitionIDFromQuery(const ASTPtr & ast, ContextPtr context) const; + std::unordered_set getPartitionIDsFromQuery(const ASTs & asts, ContextPtr context) const; /// Extracts MergeTreeData of other *MergeTree* storage /// and checks that their structure suitable for ALTER TABLE ATTACH PARTITION FROM diff --git a/src/Storages/MergeTree/MergeTreeDataMergerMutator.cpp b/src/Storages/MergeTree/MergeTreeDataMergerMutator.cpp index baea7e72b21..c2a0e5f0650 100644 --- a/src/Storages/MergeTree/MergeTreeDataMergerMutator.cpp +++ b/src/Storages/MergeTree/MergeTreeDataMergerMutator.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -493,7 +494,6 @@ static void extractMergingAndGatheringColumns( const NamesAndTypesList & storage_columns, const ExpressionActionsPtr & sorting_key_expr, const IndicesDescription & indexes, - const ProjectionsDescription & projections, const MergeTreeData::MergingParams & merging_params, NamesAndTypesList & gathering_columns, Names & gathering_column_names, NamesAndTypesList & merging_columns, Names & merging_column_names) @@ -507,13 +507,6 @@ static void extractMergingAndGatheringColumns( std::inserter(key_columns, key_columns.end())); } - for (const auto & projection : projections) - { - Names projection_columns_vec = projection.required_columns; - std::copy(projection_columns_vec.cbegin(), projection_columns_vec.cend(), - std::inserter(key_columns, key_columns.end())); - } - /// Force sign column for Collapsing mode if (merging_params.mode == MergeTreeData::MergingParams::Collapsing) key_columns.emplace(merging_params.sign_column); @@ -727,7 +720,6 @@ MergeTreeData::MutableDataPartPtr MergeTreeDataMergerMutator::mergePartsToTempor storage_columns, metadata_snapshot->getSortingKey().expression, metadata_snapshot->getSecondaryIndices(), - metadata_snapshot->getProjections(), merging_params, gathering_columns, gathering_column_names, @@ -1211,8 +1203,8 @@ MergeTreeData::MutableDataPartPtr MergeTreeDataMergerMutator::mutatePartToTempor context_for_reading->setSetting("max_streams_to_max_threads_ratio", 1); context_for_reading->setSetting("max_threads", 1); /// Allow mutations to work when force_index_by_date or force_primary_key is on. - context_for_reading->setSetting("force_index_by_date", Field(0)); - context_for_reading->setSetting("force_primary_key", Field(0)); + context_for_reading->setSetting("force_index_by_date", false); + context_for_reading->setSetting("force_primary_key", false); MutationCommands commands_for_part; for (const auto & command : commands) @@ -1288,10 +1280,10 @@ MergeTreeData::MutableDataPartPtr MergeTreeDataMergerMutator::mutatePartToTempor auto mrk_extension = source_part->index_granularity_info.is_adaptive ? getAdaptiveMrkExtension(new_data_part->getType()) : getNonAdaptiveMrkExtension(); bool need_sync = needSyncPart(source_part->rows_count, source_part->getBytesOnDisk(), *data_settings); - bool need_remove_expired_values = false; + auto execute_ttl_type = ExecuteTTLType::NONE; - if (in && shouldExecuteTTL(metadata_snapshot, interpreter->getColumnDependencies(), commands_for_part)) - need_remove_expired_values = true; + if (in) + execute_ttl_type = shouldExecuteTTL(metadata_snapshot, interpreter->getColumnDependencies()); /// All columns from part are changed and may be some more that were missing before in part /// TODO We can materialize compact part without copying data @@ -1319,7 +1311,7 @@ MergeTreeData::MutableDataPartPtr MergeTreeDataMergerMutator::mutatePartToTempor time_of_mutation, compression_codec, merge_entry, - need_remove_expired_values, + execute_ttl_type, need_sync, space_reservation, holder, @@ -1332,11 +1324,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); @@ -1345,7 +1334,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); @@ -1359,7 +1348,7 @@ MergeTreeData::MutableDataPartPtr MergeTreeDataMergerMutator::mutatePartToTempor return data.cloneAndLoadDataPartOnSameDisk(source_part, "tmp_clone_", future_part.part_info, metadata_snapshot); } - if (need_remove_expired_values) + if (execute_ttl_type != ExecuteTTLType::NONE) files_to_skip.insert("ttl.txt"); disk->createDirectories(new_part_tmp_path); @@ -1413,14 +1402,13 @@ 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, compression_codec, merge_entry, - need_remove_expired_values, + execute_ttl_type, need_sync, space_reservation, holder, @@ -1441,7 +1429,7 @@ MergeTreeData::MutableDataPartPtr MergeTreeDataMergerMutator::mutatePartToTempor } } - finalizeMutatedPart(source_part, new_data_part, need_remove_expired_values, compression_codec); + finalizeMutatedPart(source_part, new_data_part, execute_ttl_type, compression_codec); } return new_data_part; @@ -1988,21 +1976,22 @@ std::set MergeTreeDataMergerMutator::getProjectionsToRec return projections_to_recalc; } -bool MergeTreeDataMergerMutator::shouldExecuteTTL( - const StorageMetadataPtr & metadata_snapshot, const ColumnDependencies & dependencies, const MutationCommands & commands) +ExecuteTTLType MergeTreeDataMergerMutator::shouldExecuteTTL(const StorageMetadataPtr & metadata_snapshot, const ColumnDependencies & dependencies) { if (!metadata_snapshot->hasAnyTTL()) - return false; + return ExecuteTTLType::NONE; - for (const auto & command : commands) - if (command.type == MutationCommand::MATERIALIZE_TTL) - return true; + bool has_ttl_expression = false; for (const auto & dependency : dependencies) - if (dependency.kind == ColumnDependency::TTL_EXPRESSION || dependency.kind == ColumnDependency::TTL_TARGET) - return true; + { + if (dependency.kind == ColumnDependency::TTL_EXPRESSION) + has_ttl_expression = true; - return false; + if (dependency.kind == ColumnDependency::TTL_TARGET) + return ExecuteTTLType::NORMAL; + } + return has_ttl_expression ? ExecuteTTLType::RECALCULATE : ExecuteTTLType::NONE; } // 1. get projection pipeline and a sink to write parts @@ -2176,7 +2165,7 @@ void MergeTreeDataMergerMutator::mutateAllPartColumns( time_t time_of_mutation, const CompressionCodecPtr & compression_codec, MergeListEntry & merge_entry, - bool need_remove_expired_values, + ExecuteTTLType execute_ttl_type, bool need_sync, const ReservationPtr & space_reservation, TableLockHolder & holder, @@ -2189,9 +2178,12 @@ void MergeTreeDataMergerMutator::mutateAllPartColumns( mutating_stream = std::make_shared( std::make_shared(mutating_stream, data.getPrimaryKeyAndSkipIndicesExpression(metadata_snapshot))); - if (need_remove_expired_values) + if (execute_ttl_type == ExecuteTTLType::NORMAL) mutating_stream = std::make_shared(mutating_stream, data, metadata_snapshot, new_data_part, time_of_mutation, true); + if (execute_ttl_type == ExecuteTTLType::RECALCULATE) + mutating_stream = std::make_shared(mutating_stream, data, metadata_snapshot, new_data_part, time_of_mutation, true); + IMergeTreeDataPart::MinMaxIndex minmax_idx; MergedBlockOutputStream out{ @@ -2233,7 +2225,7 @@ void MergeTreeDataMergerMutator::mutateSomePartColumns( time_t time_of_mutation, const CompressionCodecPtr & compression_codec, MergeListEntry & merge_entry, - bool need_remove_expired_values, + ExecuteTTLType execute_ttl_type, bool need_sync, const ReservationPtr & space_reservation, TableLockHolder & holder, @@ -2242,9 +2234,12 @@ void MergeTreeDataMergerMutator::mutateSomePartColumns( if (mutating_stream == nullptr) throw Exception("Cannot mutate part columns with uninitialized mutations stream. It's a bug", ErrorCodes::LOGICAL_ERROR); - if (need_remove_expired_values) + if (execute_ttl_type == ExecuteTTLType::NORMAL) mutating_stream = std::make_shared(mutating_stream, data, metadata_snapshot, new_data_part, time_of_mutation, true); + if (execute_ttl_type == ExecuteTTLType::RECALCULATE) + mutating_stream = std::make_shared(mutating_stream, data, metadata_snapshot, new_data_part, time_of_mutation, true); + IMergedBlockOutputStream::WrittenOffsetColumns unused_written_offsets; MergedColumnOnlyOutputStream out( new_data_part, @@ -2283,7 +2278,7 @@ void MergeTreeDataMergerMutator::mutateSomePartColumns( void MergeTreeDataMergerMutator::finalizeMutatedPart( const MergeTreeDataPartPtr & source_part, MergeTreeData::MutableDataPartPtr new_data_part, - bool need_remove_expired_values, + ExecuteTTLType execute_ttl_type, const CompressionCodecPtr & codec) { auto disk = new_data_part->volume->getDisk(); @@ -2297,7 +2292,7 @@ void MergeTreeDataMergerMutator::finalizeMutatedPart( new_data_part->checksums.files[IMergeTreeDataPart::UUID_FILE_NAME].file_hash = out_hashing.getHash(); } - if (need_remove_expired_values) + if (execute_ttl_type != ExecuteTTLType::NONE) { /// Write a file with ttl infos in json format. auto out_ttl = disk->writeFile(fs::path(new_data_part->getFullRelativePath()) / "ttl.txt", 4096); diff --git a/src/Storages/MergeTree/MergeTreeDataMergerMutator.h b/src/Storages/MergeTree/MergeTreeDataMergerMutator.h index ca7376d8f3e..3a0041e4a37 100644 --- a/src/Storages/MergeTree/MergeTreeDataMergerMutator.h +++ b/src/Storages/MergeTree/MergeTreeDataMergerMutator.h @@ -23,6 +23,13 @@ enum class SelectPartsDecision NOTHING_TO_MERGE = 2, }; +enum class ExecuteTTLType +{ + NONE = 0, + NORMAL = 1, + RECALCULATE= 2, +}; + /// Auxiliary struct holding metainformation for the future merged or mutated part. struct FutureMergedMutatedPart { @@ -200,8 +207,7 @@ private: const ProjectionsDescription & all_projections, const MutationCommands & commands_for_removes); - static bool shouldExecuteTTL( - const StorageMetadataPtr & metadata_snapshot, const ColumnDependencies & dependencies, const MutationCommands & commands); + static ExecuteTTLType shouldExecuteTTL(const StorageMetadataPtr & metadata_snapshot, const ColumnDependencies & dependencies); /// Return set of indices which should be recalculated during mutation also /// wraps input stream into additional expression stream @@ -242,7 +248,7 @@ private: time_t time_of_mutation, const CompressionCodecPtr & compression_codec, MergeListEntry & merge_entry, - bool need_remove_expired_values, + ExecuteTTLType execute_ttl_type, bool need_sync, const ReservationPtr & space_reservation, TableLockHolder & holder, @@ -260,7 +266,7 @@ private: time_t time_of_mutation, const CompressionCodecPtr & compression_codec, MergeListEntry & merge_entry, - bool need_remove_expired_values, + ExecuteTTLType execute_ttl_type, bool need_sync, const ReservationPtr & space_reservation, TableLockHolder & holder, @@ -271,7 +277,7 @@ private: static void finalizeMutatedPart( const MergeTreeDataPartPtr & source_part, MergeTreeData::MutableDataPartPtr new_data_part, - bool need_remove_expired_values, + ExecuteTTLType execute_ttl_type, const CompressionCodecPtr & codec); public : diff --git a/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp b/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp index f60acca12a7..f5c1890154a 100644 --- a/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp +++ b/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp @@ -133,11 +133,10 @@ QueryPlanPtr MergeTreeDataSelectExecutor::read( std::shared_ptr max_block_numbers_to_read) const { const auto & settings = context->getSettingsRef(); - auto parts = data.getDataPartsVector(); if (!query_info.projection) { auto plan = readFromParts( - parts, + query_info.merge_tree_select_result_ptr ? MergeTreeData::DataPartsVector{} : data.getDataPartsVector(), column_names_to_return, metadata_snapshot, metadata_snapshot, @@ -145,7 +144,8 @@ QueryPlanPtr MergeTreeDataSelectExecutor::read( context, max_block_size, num_streams, - max_block_numbers_to_read); + max_block_numbers_to_read, + query_info.merge_tree_select_result_ptr); if (plan->isInitialized() && settings.allow_experimental_projection_optimization && settings.force_optimize_projection && !metadata_snapshot->projections.empty()) @@ -162,27 +162,15 @@ QueryPlanPtr MergeTreeDataSelectExecutor::read( ProjectionDescription::typeToString(query_info.projection->desc->type), query_info.projection->desc->name); - MergeTreeData::DataPartsVector projection_parts; - MergeTreeData::DataPartsVector normal_parts; - for (const auto & part : parts) - { - const auto & projections = part->getProjectionParts(); - auto it = projections.find(query_info.projection->desc->name); - if (it != projections.end()) - projection_parts.push_back(it->second); - else - normal_parts.push_back(part); - } - Pipes pipes; Pipe projection_pipe; Pipe ordinary_pipe; - if (!projection_parts.empty()) + if (query_info.projection->merge_tree_projection_select_result_ptr) { LOG_DEBUG(log, "projection required columns: {}", fmt::join(query_info.projection->required_columns, ", ")); auto plan = readFromParts( - projection_parts, + {}, query_info.projection->required_columns, metadata_snapshot, query_info.projection->desc->metadata, @@ -190,7 +178,8 @@ QueryPlanPtr MergeTreeDataSelectExecutor::read( context, max_block_size, num_streams, - max_block_numbers_to_read); + max_block_numbers_to_read, + query_info.projection->merge_tree_projection_select_result_ptr); if (plan) { @@ -222,9 +211,10 @@ QueryPlanPtr MergeTreeDataSelectExecutor::read( } } - if (!normal_parts.empty()) + if (query_info.projection->merge_tree_normal_select_result_ptr) { - auto storage_from_base_parts_of_projection = StorageFromMergeTreeDataPart::create(std::move(normal_parts)); + auto storage_from_base_parts_of_projection + = StorageFromMergeTreeDataPart::create(data, query_info.projection->merge_tree_normal_select_result_ptr); auto interpreter = InterpreterSelectQuery( query_info.query, context, @@ -361,10 +351,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; @@ -762,8 +753,7 @@ RangesInDataParts MergeTreeDataSelectExecutor::filterPartsByPrimaryKeyAndSkipInd Poco::Logger * log, size_t num_streams, ReadFromMergeTree::IndexStats & index_stats, - bool use_skip_indexes, - bool check_limits) + bool use_skip_indexes) { RangesInDataParts parts_with_ranges(parts.size()); const Settings & settings = context->getSettingsRef(); @@ -891,7 +881,7 @@ RangesInDataParts MergeTreeDataSelectExecutor::filterPartsByPrimaryKeyAndSkipInd if (!ranges.ranges.empty()) { - if (check_limits && (limits.max_rows || leaf_limits.max_rows)) + if (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(); @@ -1081,7 +1071,7 @@ static void selectColumnNames( } } -size_t MergeTreeDataSelectExecutor::estimateNumMarksToRead( +MergeTreeDataSelectAnalysisResultPtr MergeTreeDataSelectExecutor::estimateNumMarksToRead( MergeTreeData::DataPartsVector parts, const Names & column_names_to_return, const StorageMetadataPtr & metadata_snapshot_base, @@ -1093,7 +1083,8 @@ size_t MergeTreeDataSelectExecutor::estimateNumMarksToRead( { size_t total_parts = parts.size(); if (total_parts == 0) - return 0; + return std::make_shared( + MergeTreeDataSelectAnalysisResult{.result = ReadFromMergeTree::AnalysisResult()}); Names real_column_names; Names virt_column_names; @@ -1103,63 +1094,18 @@ size_t MergeTreeDataSelectExecutor::estimateNumMarksToRead( selectColumnNames(column_names_to_return, data, real_column_names, virt_column_names, sample_factor_column_queried); - auto part_values = filterPartsByVirtualColumns(data, parts, query_info.query, context); - if (part_values && part_values->empty()) - return 0; - - /// If there are only virtual columns in the query, you must request at least one non-virtual one. - if (real_column_names.empty()) - { - NamesAndTypesList available_real_columns = metadata_snapshot->getColumns().getAllPhysical(); - real_column_names.push_back(ExpressionActions::getSmallestColumn(available_real_columns)); - } - - metadata_snapshot->check(real_column_names, data.getVirtuals(), data.getStorageID()); - - const auto & primary_key = metadata_snapshot->getPrimaryKey(); - Names primary_key_columns = primary_key.column_names; - KeyCondition key_condition(query_info, context, primary_key_columns, primary_key.expression); - - if (key_condition.alwaysUnknownOrTrue()) - { - size_t total_marks = 0; - for (const auto & part : parts) - total_marks += part->index_granularity.getMarksCountWithoutFinal(); - - return total_marks; - } - - const auto & select = query_info.query->as(); - ReadFromMergeTree::IndexStats index_stats; - - filterPartsByPartition( - parts, part_values, metadata_snapshot_base, data, query_info, - context, max_block_numbers_to_read.get(), log, index_stats); - - auto sampling = MergeTreeDataSelectExecutor::getSampling( - select, metadata_snapshot->getColumns().getAllPhysical(), parts, key_condition, - data, metadata_snapshot, context, sample_factor_column_queried, log); - - if (sampling.read_nothing) - return 0; - - /// Do not init. It is not used (cause skip index is ignored) - MergeTreeReaderSettings reader_settings; - - auto parts_with_ranges = filterPartsByPrimaryKeyAndSkipIndexes( + return ReadFromMergeTree::selectRangesToRead( std::move(parts), + metadata_snapshot_base, metadata_snapshot, query_info, context, - key_condition, - reader_settings, - log, num_streams, - index_stats, - true /* use_skip_indexes */, - false /* check_limits */); - - return index_stats.back().num_granules_after; + max_block_numbers_to_read, + data, + real_column_names, + sample_factor_column_queried, + log); } QueryPlanPtr MergeTreeDataSelectExecutor::readFromParts( @@ -1171,10 +1117,16 @@ QueryPlanPtr MergeTreeDataSelectExecutor::readFromParts( ContextPtr context, const UInt64 max_block_size, const unsigned num_streams, - std::shared_ptr max_block_numbers_to_read) const + std::shared_ptr max_block_numbers_to_read, + MergeTreeDataSelectAnalysisResultPtr merge_tree_select_result_ptr) const { - size_t total_parts = parts.size(); - if (total_parts == 0) + /// If merge_tree_select_result_ptr != nullptr, we use analyzed result so parts will always be empty. + if (merge_tree_select_result_ptr) + { + if (merge_tree_select_result_ptr->marks() == 0) + return std::make_unique(); + } + else if (parts.empty()) return std::make_unique(); Names real_column_names; @@ -1186,7 +1138,7 @@ QueryPlanPtr MergeTreeDataSelectExecutor::readFromParts( selectColumnNames(column_names_to_return, data, real_column_names, virt_column_names, sample_factor_column_queried); auto read_from_merge_tree = std::make_unique( - parts, + std::move(parts), real_column_names, virt_column_names, data, @@ -1198,7 +1150,8 @@ QueryPlanPtr MergeTreeDataSelectExecutor::readFromParts( num_streams, sample_factor_column_queried, max_block_numbers_to_read, - log + log, + merge_tree_select_result_ptr ); QueryPlanPtr plan = std::make_unique(); diff --git a/src/Storages/MergeTree/MergeTreeDataSelectExecutor.h b/src/Storages/MergeTree/MergeTreeDataSelectExecutor.h index de5ca1f0138..92c4382dc90 100644 --- a/src/Storages/MergeTree/MergeTreeDataSelectExecutor.h +++ b/src/Storages/MergeTree/MergeTreeDataSelectExecutor.h @@ -13,15 +13,6 @@ namespace DB class KeyCondition; -struct MergeTreeDataSelectSamplingData -{ - bool use_sampling = false; - bool read_nothing = false; - Float64 used_sample_factor = 1.0; - std::shared_ptr filter_function; - ActionsDAGPtr filter_expression; -}; - using PartitionIdToMaxBlock = std::unordered_map; /** Executes SELECT queries on data from the merge tree. @@ -55,12 +46,13 @@ public: ContextPtr context, UInt64 max_block_size, unsigned num_streams, - std::shared_ptr max_block_numbers_to_read = nullptr) const; + std::shared_ptr max_block_numbers_to_read = nullptr, + MergeTreeDataSelectAnalysisResultPtr merge_tree_select_result_ptr = nullptr) const; /// Get an estimation for the number of marks we are going to read. /// Reads nothing. Secondary indexes are not used. /// This method is used to select best projection for table. - size_t estimateNumMarksToRead( + MergeTreeDataSelectAnalysisResultPtr estimateNumMarksToRead( MergeTreeData::DataPartsVector parts, const Names & column_names, const StorageMetadataPtr & metadata_snapshot_base, @@ -185,8 +177,7 @@ public: Poco::Logger * log, size_t num_streams, ReadFromMergeTree::IndexStats & index_stats, - bool use_skip_indexes, - bool check_limits); + bool use_skip_indexes); /// Create expression for sampling. /// Also, calculate _sample_factor if needed. diff --git a/src/Storages/MergeTree/MergeTreeIndexConditionBloomFilter.cpp b/src/Storages/MergeTree/MergeTreeIndexConditionBloomFilter.cpp index 6b5a2c6ee17..7ca6f9ff1bd 100644 --- a/src/Storages/MergeTree/MergeTreeIndexConditionBloomFilter.cpp +++ b/src/Storages/MergeTree/MergeTreeIndexConditionBloomFilter.cpp @@ -51,7 +51,18 @@ ColumnWithTypeAndName getPreparedSetInfo(const SetPtr & prepared_set) return {ColumnTuple::create(set_elements), std::make_shared(prepared_set->getElementsTypes()), "dummy"}; } -bool maybeTrueOnBloomFilter(const IColumn * hash_column, const BloomFilterPtr & bloom_filter, size_t hash_functions) +bool hashMatchesFilter(const BloomFilterPtr& bloom_filter, UInt64 hash, size_t hash_functions) +{ + return std::all_of(BloomFilterHash::bf_hash_seed, + BloomFilterHash::bf_hash_seed + hash_functions, + [&](const auto &hash_seed) + { + return bloom_filter->findHashWithSeed(hash, + hash_seed); + }); +} + +bool maybeTrueOnBloomFilter(const IColumn * hash_column, const BloomFilterPtr & bloom_filter, size_t hash_functions, bool match_all) { const auto * const_column = typeid_cast(hash_column); const auto * non_const_column = typeid_cast(hash_column); @@ -61,26 +72,34 @@ bool maybeTrueOnBloomFilter(const IColumn * hash_column, const BloomFilterPtr & if (const_column) { - for (size_t index = 0; index < hash_functions; ++index) - if (!bloom_filter->findHashWithSeed(const_column->getValue(), BloomFilterHash::bf_hash_seed[index])) - return false; - return true; + return hashMatchesFilter(bloom_filter, + const_column->getValue(), + hash_functions); + } + + const ColumnUInt64::Container & hashes = non_const_column->getData(); + + if (match_all) + { + return std::all_of(hashes.begin(), + hashes.end(), + [&](const auto& hash_row) + { + return hashMatchesFilter(bloom_filter, + hash_row, + hash_functions); + }); } else { - bool missing_rows = true; - const ColumnUInt64::Container & data = non_const_column->getData(); - - for (size_t index = 0, size = data.size(); missing_rows && index < size; ++index) - { - bool match_row = true; - for (size_t hash_index = 0; match_row && hash_index < hash_functions; ++hash_index) - match_row = bloom_filter->findHashWithSeed(data[index], BloomFilterHash::bf_hash_seed[hash_index]); - - missing_rows = !match_row; - } - - return !missing_rows; + return std::any_of(hashes.begin(), + hashes.end(), + [&](const auto& hash_row) + { + return hashMatchesFilter(bloom_filter, + hash_row, + hash_functions); + }); } } @@ -109,6 +128,7 @@ bool MergeTreeIndexConditionBloomFilter::alwaysUnknownOrTrue() const || element.function == RPNElement::FUNCTION_NOT_EQUALS || element.function == RPNElement::FUNCTION_HAS || element.function == RPNElement::FUNCTION_HAS_ANY + || element.function == RPNElement::FUNCTION_HAS_ALL || element.function == RPNElement::FUNCTION_IN || element.function == RPNElement::FUNCTION_NOT_IN || element.function == RPNElement::ALWAYS_FALSE) @@ -156,16 +176,23 @@ bool MergeTreeIndexConditionBloomFilter::mayBeTrueOnGranule(const MergeTreeIndex || element.function == RPNElement::FUNCTION_EQUALS || element.function == RPNElement::FUNCTION_NOT_EQUALS || element.function == RPNElement::FUNCTION_HAS - || element.function == RPNElement::FUNCTION_HAS_ANY) + || element.function == RPNElement::FUNCTION_HAS_ANY + || element.function == RPNElement::FUNCTION_HAS_ALL) { bool match_rows = true; + bool match_all = element.function == RPNElement::FUNCTION_HAS_ALL; const auto & predicate = element.predicate; for (size_t index = 0; match_rows && index < predicate.size(); ++index) { const auto & query_index_hash = predicate[index]; const auto & filter = filters[query_index_hash.first]; const ColumnPtr & hash_column = query_index_hash.second; - match_rows = maybeTrueOnBloomFilter(&*hash_column, filter, hash_functions); + + + match_rows = maybeTrueOnBloomFilter(&*hash_column, + filter, + hash_functions, + match_all); } rpn_stack.emplace_back(match_rows, true); @@ -255,7 +282,12 @@ bool MergeTreeIndexConditionBloomFilter::traverseFunction(const ASTPtr & node, B maybe_useful = true; } } - else if (function->name == "equals" || function->name == "notEquals" || function->name == "has" || function->name == "indexOf" || function->name == "hasAny") + else if (function->name == "equals" || + function->name == "notEquals" || + function->name == "has" || + function->name == "indexOf" || + function->name == "hasAny" || + function->name == "hasAll") { Field const_value; DataTypePtr const_type; @@ -412,7 +444,7 @@ bool MergeTreeIndexConditionBloomFilter::traverseASTEquals( out.predicate.emplace_back(std::make_pair(position, BloomFilterHash::hashWithField(actual_type.get(), converted_field))); } } - else if (function_name == "hasAny") + else if (function_name == "hasAny" || function_name == "hasAll") { if (!array_type) throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "First argument for function {} must be an array.", function_name); @@ -437,7 +469,9 @@ bool MergeTreeIndexConditionBloomFilter::traverseASTEquals( column = std::move(mutable_column); } - out.function = RPNElement::FUNCTION_HAS_ANY; + out.function = function_name == "hasAny" ? + RPNElement::FUNCTION_HAS_ANY : + RPNElement::FUNCTION_HAS_ALL; out.predicate.emplace_back(std::make_pair(position, BloomFilterHash::hashWithColumn(actual_type, column, 0, column->size()))); } else diff --git a/src/Storages/MergeTree/MergeTreeIndexConditionBloomFilter.h b/src/Storages/MergeTree/MergeTreeIndexConditionBloomFilter.h index fa48b966a92..f2bbd047ca1 100644 --- a/src/Storages/MergeTree/MergeTreeIndexConditionBloomFilter.h +++ b/src/Storages/MergeTree/MergeTreeIndexConditionBloomFilter.h @@ -25,6 +25,7 @@ public: FUNCTION_NOT_EQUALS, FUNCTION_HAS, FUNCTION_HAS_ANY, + FUNCTION_HAS_ALL, FUNCTION_IN, FUNCTION_NOT_IN, FUNCTION_UNKNOWN, /// Can take any value. diff --git a/src/Storages/MergeTree/MergeTreePartInfo.h b/src/Storages/MergeTree/MergeTreePartInfo.h index be856c1f157..181fef7990c 100644 --- a/src/Storages/MergeTree/MergeTreePartInfo.h +++ b/src/Storages/MergeTree/MergeTreePartInfo.h @@ -65,6 +65,12 @@ struct MergeTreePartInfo && mutation >= rhs.mutation; } + /// Return part mutation version, if part wasn't mutated return zero + Int64 getMutationVersion() const + { + return mutation ? mutation : 0; + } + /// True if parts do not intersect in any way. bool isDisjoint(const MergeTreePartInfo & rhs) const { diff --git a/src/Storages/MergeTree/MergeTreeSettings.h b/src/Storages/MergeTree/MergeTreeSettings.h index 531091bb7f9..890cfca8d71 100644 --- a/src/Storages/MergeTree/MergeTreeSettings.h +++ b/src/Storages/MergeTree/MergeTreeSettings.h @@ -77,7 +77,7 @@ struct Settings; 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, 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(Bool, always_fetch_merged_part, false, "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) \ M(UInt64, max_files_to_modify_in_alter_columns, 75, "Not apply ALTER if number of files for modification(deletion, addition) more than this.", 0) \ M(UInt64, max_files_to_remove_in_alter_columns, 50, "Not apply ALTER, if number of files for deletion more than this.", 0) \ @@ -92,7 +92,7 @@ struct Settings; M(Seconds, replicated_fetches_http_receive_timeout, 0, "HTTP receive timeout for fetch part requests. Inherited from default profile `http_receive_timeout` if not set explicitly.", 0) \ M(Bool, replicated_can_become_leader, true, "If true, Replicated tables replicas on this node will try to acquire leadership.", 0) \ M(Seconds, zookeeper_session_expiration_check_period, 60, "ZooKeeper session expiration check period, in seconds.", 0) \ - M(Bool, detach_old_local_parts_when_cloning_replica, 1, "Do not remove old local parts when repairing lost replica.", 0) \ + M(Bool, detach_old_local_parts_when_cloning_replica, true, "Do not remove old local parts when repairing lost replica.", 0) \ M(UInt64, max_replicated_fetches_network_bandwidth, 0, "The maximum speed of data exchange over the network in bytes per second for replicated fetches. Zero means unlimited.", 0) \ M(UInt64, max_replicated_sends_network_bandwidth, 0, "The maximum speed of data exchange over the network in bytes per second for replicated sends. Zero means unlimited.", 0) \ \ @@ -117,8 +117,9 @@ struct Settings; M(Int64, merge_with_ttl_timeout, 3600 * 4, "Minimal time in seconds, when merge with delete TTL can be repeated.", 0) \ M(Int64, merge_with_recompression_ttl_timeout, 3600 * 4, "Minimal time in seconds, when merge with recompression TTL can be repeated.", 0) \ M(Bool, ttl_only_drop_parts, false, "Only drop altogether the expired parts and not partially prune them.", 0) \ - M(Bool, write_final_mark, 1, "Write final mark after end of column (0 - disabled, do nothing if index_granularity_bytes=0)", 0) \ - M(Bool, enable_mixed_granularity_parts, 1, "Enable parts with adaptive and non adaptive granularity", 0) \ + M(Bool, materialize_ttl_recalculate_only, false, "Only recalculate ttl info when MATERIALIZE TTL", 0) \ + M(Bool, write_final_mark, true, "Write final mark after end of column (0 - disabled, do nothing if index_granularity_bytes=0)", 0) \ + M(Bool, enable_mixed_granularity_parts, true, "Enable parts with adaptive and non adaptive granularity", 0) \ M(MaxThreads, max_part_loading_threads, 0, "The number of threads to load data parts at startup.", 0) \ M(MaxThreads, max_part_removal_threads, 0, "The number of threads for concurrent removal of inactive data parts. One is usually enough, but in 'Google Compute Environment SSD Persistent Disks' file removal (unlink) operation is extraordinarily slow and you probably have to increase this number (recommended is up to 16).", 0) \ 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) \ diff --git a/src/Storages/MergeTree/MergeTreeWhereOptimizer.cpp b/src/Storages/MergeTree/MergeTreeWhereOptimizer.cpp index 2da20073427..806c861cf00 100644 --- a/src/Storages/MergeTree/MergeTreeWhereOptimizer.cpp +++ b/src/Storages/MergeTree/MergeTreeWhereOptimizer.cpp @@ -47,8 +47,12 @@ MergeTreeWhereOptimizer::MergeTreeWhereOptimizer( if (!primary_key.column_names.empty()) first_primary_key_column = primary_key.column_names[0]; - for (const auto & [_, size] : column_sizes) - total_size_of_queried_columns += size; + for (const auto & name : queried_columns) + { + auto it = column_sizes.find(name); + if (it != column_sizes.end()) + total_size_of_queried_columns += it->second; + } determineArrayJoinedNames(query_info.query->as()); optimize(query_info.query->as()); diff --git a/src/Storages/MergeTree/ReplicatedMergeTreePartCheckThread.cpp b/src/Storages/MergeTree/ReplicatedMergeTreePartCheckThread.cpp index 35a011a4a58..797d0570fbc 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreePartCheckThread.cpp +++ b/src/Storages/MergeTree/ReplicatedMergeTreePartCheckThread.cpp @@ -145,6 +145,7 @@ ReplicatedMergeTreePartCheckThread::MissingPartSearchResult ReplicatedMergeTreeP if (found_part_with_the_same_min_block && found_part_with_the_same_max_block) { + /// FIXME It may never appear LOG_WARNING(log, "Found parts with the same min block and with the same max block as the missing part {}. Hoping that it will eventually appear as a result of a merge.", part_name); return MissingPartSearchResult::FoundAndDontNeedFetch; } diff --git a/src/Storages/MergeTree/ReplicatedMergeTreeQueue.cpp b/src/Storages/MergeTree/ReplicatedMergeTreeQueue.cpp index ea5f7cfc36a..c71a79d2009 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreeQueue.cpp +++ b/src/Storages/MergeTree/ReplicatedMergeTreeQueue.cpp @@ -23,6 +23,7 @@ namespace ErrorCodes extern const int LOGICAL_ERROR; extern const int UNEXPECTED_NODE_IN_ZOOKEEPER; extern const int ABORTED; + extern const int READONLY; } @@ -472,9 +473,15 @@ bool ReplicatedMergeTreeQueue::removeFailedQuorumPart(const MergeTreePartInfo & return virtual_parts.remove(part_info); } -int32_t ReplicatedMergeTreeQueue::pullLogsToQueue(zkutil::ZooKeeperPtr zookeeper, Coordination::WatchCallback watch_callback) +int32_t ReplicatedMergeTreeQueue::pullLogsToQueue(zkutil::ZooKeeperPtr zookeeper, Coordination::WatchCallback watch_callback, PullLogsReason reason) { std::lock_guard lock(pull_logs_to_queue_mutex); + if (storage.is_readonly && reason == SYNC) + { + throw Exception(ErrorCodes::READONLY, "Cannot SYNC REPLICA, because replica is readonly"); + /// TODO throw logical error for other reasons (except LOAD) + } + if (pull_log_blocker.isCancelled()) throw Exception("Log pulling is cancelled", ErrorCodes::ABORTED); @@ -714,13 +721,22 @@ void ReplicatedMergeTreeQueue::updateMutations(zkutil::ZooKeeperPtr zookeeper, C std::vector> futures; for (const String & entry : entries_to_load) - futures.emplace_back(zookeeper->asyncGet(fs::path(zookeeper_path) / "mutations" / entry)); + futures.emplace_back(zookeeper->asyncTryGet(fs::path(zookeeper_path) / "mutations" / entry)); std::vector new_mutations; for (size_t i = 0; i < entries_to_load.size(); ++i) { + auto maybe_response = futures[i].get(); + if (maybe_response.error != Coordination::Error::ZOK) + { + assert(maybe_response.error == Coordination::Error::ZNONODE); + /// It's ok if it happened on server startup or table creation and replica loads all mutation entries. + /// It's also ok if mutation was killed. + LOG_WARNING(log, "Cannot get mutation node {} ({}), probably it was concurrently removed", entries_to_load[i], maybe_response.error); + continue; + } new_mutations.push_back(std::make_shared( - ReplicatedMergeTreeMutationEntry::parse(futures[i].get().data, entries_to_load[i]))); + ReplicatedMergeTreeMutationEntry::parse(maybe_response.data, entries_to_load[i]))); } bool some_mutations_are_probably_done = false; @@ -1012,8 +1028,24 @@ 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)) @@ -1488,6 +1520,9 @@ MutationCommands ReplicatedMergeTreeQueue::getMutationCommands( /// to allow recovering from a mutation that cannot be executed. This way you can delete the mutation entry /// from /mutations in ZK and the replicas will simply skip the mutation. + /// NOTE: However, it's quite dangerous to skip MUTATE_PART. Replicas may diverge if one of them have executed part mutation, + /// and then mutation was killed before execution of MUTATE_PART on remaining replicas. + if (part->info.getDataVersion() > desired_mutation_version) { LOG_WARNING(log, "Data version of part {} is already greater than desired mutation version {}", part->name, desired_mutation_version); @@ -1815,7 +1850,7 @@ ReplicatedMergeTreeMergePredicate::ReplicatedMergeTreeMergePredicate( } } - merges_version = queue_.pullLogsToQueue(zookeeper); + merges_version = queue_.pullLogsToQueue(zookeeper, {}, ReplicatedMergeTreeQueue::MERGE_PREDICATE); { /// We avoid returning here a version to be used in a lightweight transaction. diff --git a/src/Storages/MergeTree/ReplicatedMergeTreeQueue.h b/src/Storages/MergeTree/ReplicatedMergeTreeQueue.h index e49d80fc832..57e1e658665 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreeQueue.h +++ b/src/Storages/MergeTree/ReplicatedMergeTreeQueue.h @@ -294,13 +294,22 @@ public: bool removeFailedQuorumPart(const MergeTreePartInfo & part_info); + enum PullLogsReason + { + LOAD, + UPDATE, + MERGE_PREDICATE, + SYNC, + OTHER, + }; + /** Copy the new entries from the shared log to the queue of this replica. Set the log_pointer to the appropriate value. * If watch_callback is not empty, will call it when new entries appear in the log. * If there were new entries, notifies storage.queue_task_handle. * Additionally loads mutations (so that the set of mutations is always more recent than the queue). * Return the version of "logs" node (that is updated for every merge/mutation/... added to the log) */ - int32_t pullLogsToQueue(zkutil::ZooKeeperPtr zookeeper, Coordination::WatchCallback watch_callback = {}); + int32_t pullLogsToQueue(zkutil::ZooKeeperPtr zookeeper, Coordination::WatchCallback watch_callback = {}, PullLogsReason reason = OTHER); /// Load new mutation entries. If something new is loaded, schedule storage.merge_selecting_task. /// If watch_callback is not empty, will call it when new mutations appear in ZK. diff --git a/src/Storages/MergeTree/ReplicatedMergeTreeQuorumAddedParts.h b/src/Storages/MergeTree/ReplicatedMergeTreeQuorumAddedParts.h index b624f829644..a0b0d026693 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreeQuorumAddedParts.h +++ b/src/Storages/MergeTree/ReplicatedMergeTreeQuorumAddedParts.h @@ -65,7 +65,7 @@ struct ReplicatedMergeTreeQuorumAddedParts added_parts = readV1(in); } - /// Read added bloks when node in ZooKeeper supports only one partition. + /// Read added blocks when node in ZooKeeper supports only one partition. PartitionIdToPartName readV1(ReadBuffer & in) { PartitionIdToPartName parts_in_quorum; diff --git a/src/Storages/MergeTree/ReplicatedMergeTreeRestartingThread.cpp b/src/Storages/MergeTree/ReplicatedMergeTreeRestartingThread.cpp index 25f25480549..5c19f4166fa 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreeRestartingThread.cpp +++ b/src/Storages/MergeTree/ReplicatedMergeTreeRestartingThread.cpp @@ -25,6 +25,8 @@ namespace DB namespace ErrorCodes { extern const int REPLICA_IS_ALREADY_ACTIVE; + extern const int REPLICA_STATUS_CHANGED; + } namespace @@ -55,6 +57,7 @@ void ReplicatedMergeTreeRestartingThread::run() if (need_stop) return; + bool reschedule_now = false; try { if (first_time || readonly_mode_was_set || storage.getZooKeeper()->expired()) @@ -131,15 +134,29 @@ void ReplicatedMergeTreeRestartingThread::run() first_time = false; } } - catch (...) + catch (const Exception & e) { /// We couldn't activate table let's set it into readonly mode setReadonly(); + partialShutdown(); + storage.startup_event.set(); + tryLogCurrentException(log, __PRETTY_FUNCTION__); + + if (e.code() == ErrorCodes::REPLICA_STATUS_CHANGED) + reschedule_now = true; + } + catch (...) + { + setReadonly(); + partialShutdown(); storage.startup_event.set(); tryLogCurrentException(log, __PRETTY_FUNCTION__); } - task->scheduleAfter(check_period_ms); + if (reschedule_now) + task->schedule(); + else + task->scheduleAfter(check_period_ms); } @@ -155,11 +172,21 @@ bool ReplicatedMergeTreeRestartingThread::tryStartup() storage.cloneReplicaIfNeeded(zookeeper); - storage.queue.load(zookeeper); + try + { + storage.queue.load(zookeeper); + + /// pullLogsToQueue() after we mark replica 'is_active' (and after we repair if it was lost); + /// because cleanup_thread doesn't delete log_pointer of active replicas. + storage.queue.pullLogsToQueue(zookeeper, {}, ReplicatedMergeTreeQueue::LOAD); + } + catch (...) + { + std::unique_lock lock(storage.last_queue_update_exception_lock); + storage.last_queue_update_exception = getCurrentExceptionMessage(false); + throw; + } - /// pullLogsToQueue() after we mark replica 'is_active' (and after we repair if it was lost); - /// because cleanup_thread doesn't delete log_pointer of active replicas. - storage.queue.pullLogsToQueue(zookeeper); storage.queue.removeCurrentPartsFromMutations(); storage.last_queue_update_finish_time.store(time(nullptr)); diff --git a/src/Storages/MergeTree/StorageFromMergeTreeDataPart.h b/src/Storages/MergeTree/StorageFromMergeTreeDataPart.h index 15beb94404b..997e6e8bb74 100644 --- a/src/Storages/MergeTree/StorageFromMergeTreeDataPart.h +++ b/src/Storages/MergeTree/StorageFromMergeTreeDataPart.h @@ -31,8 +31,7 @@ public: size_t max_block_size, unsigned num_streams) override { - // NOTE: It's used to read normal parts only - QueryPlan query_plan = std::move(*MergeTreeDataSelectExecutor(parts.front()->storage) + QueryPlan query_plan = std::move(*MergeTreeDataSelectExecutor(storage) .readFromParts( parts, column_names, @@ -41,7 +40,9 @@ public: query_info, context, max_block_size, - num_streams)); + num_streams, + nullptr, + analysis_result_ptr)); return query_plan.convertToPipe( QueryPlanOptimizationSettings::fromContext(context), BuildQueryPipelineSettings::fromContext(context)); @@ -54,54 +55,58 @@ public: bool mayBenefitFromIndexForIn( const ASTPtr & left_in_operand, ContextPtr query_context, const StorageMetadataPtr & metadata_snapshot) const override { - return parts.front()->storage.mayBenefitFromIndexForIn(left_in_operand, query_context, metadata_snapshot); + return storage.mayBenefitFromIndexForIn(left_in_operand, query_context, metadata_snapshot); } NamesAndTypesList getVirtuals() const override { - return parts.front()->storage.getVirtuals(); + return storage.getVirtuals(); } String getPartitionId() const { - return parts.front()->info.partition_id; + return partition_id; } String getPartitionIDFromQuery(const ASTPtr & ast, ContextPtr context) const { - return parts.front()->storage.getPartitionIDFromQuery(ast, context); + return storage.getPartitionIDFromQuery(ast, context); + } + + bool materializeTTLRecalculateOnly() const + { + return parts.front()->storage.getSettings()->materialize_ttl_recalculate_only; } protected: + /// Used in part mutation. StorageFromMergeTreeDataPart(const MergeTreeData::DataPartPtr & part_) : IStorage(getIDFromPart(part_)) , parts({part_}) + , storage(part_->storage) + , partition_id(part_->info.partition_id) { - setInMemoryMetadata(part_->storage.getInMemoryMetadata()); + setInMemoryMetadata(storage.getInMemoryMetadata()); } - StorageFromMergeTreeDataPart(MergeTreeData::DataPartsVector && parts_) - : IStorage(getIDFromParts(parts_)) - , parts(std::move(parts_)) + /// Used in queries with projection. + StorageFromMergeTreeDataPart(const MergeTreeData & storage_, MergeTreeDataSelectAnalysisResultPtr analysis_result_ptr_) + : IStorage(storage_.getStorageID()), storage(storage_), analysis_result_ptr(analysis_result_ptr_) { - setInMemoryMetadata(parts.front()->storage.getInMemoryMetadata()); + setInMemoryMetadata(storage.getInMemoryMetadata()); } private: MergeTreeData::DataPartsVector parts; + const MergeTreeData & storage; + String partition_id; + MergeTreeDataSelectAnalysisResultPtr analysis_result_ptr; static StorageID getIDFromPart(const MergeTreeData::DataPartPtr & part_) { auto table_id = part_->storage.getStorageID(); return StorageID(table_id.database_name, table_id.table_name + " (part " + part_->name + ")"); } - - static StorageID getIDFromParts(const MergeTreeData::DataPartsVector & parts_) - { - assert(!parts_.empty()); - auto table_id = parts_.front()->storage.getStorageID(); - return StorageID(table_id.database_name, table_id.table_name + " (parts)"); - } }; } diff --git a/src/Storages/PostgreSQL/MaterializedPostgreSQLSettings.h b/src/Storages/PostgreSQL/MaterializedPostgreSQLSettings.h index 3bc32a21876..1d986b223e9 100644 --- a/src/Storages/PostgreSQL/MaterializedPostgreSQLSettings.h +++ b/src/Storages/PostgreSQL/MaterializedPostgreSQLSettings.h @@ -16,7 +16,7 @@ namespace DB #define LIST_OF_MATERIALIZED_POSTGRESQL_SETTINGS(M) \ M(UInt64, materialized_postgresql_max_block_size, 65536, "Number of row collected before flushing data into table.", 0) \ M(String, materialized_postgresql_tables_list, "", "List of tables for MaterializedPostgreSQL database engine", 0) \ - M(Bool, materialized_postgresql_allow_automatic_update, 0, "Allow to reload table in the background, when schema changes are detected", 0) \ + M(Bool, materialized_postgresql_allow_automatic_update, false, "Allow to reload table in the background, when schema changes are detected", 0) \ DECLARE_SETTINGS_TRAITS(MaterializedPostgreSQLSettingsTraits, LIST_OF_MATERIALIZED_POSTGRESQL_SETTINGS) diff --git a/src/Storages/PostgreSQL/PostgreSQLReplicationHandler.cpp b/src/Storages/PostgreSQL/PostgreSQLReplicationHandler.cpp index b812c6d2923..3477397adb7 100644 --- a/src/Storages/PostgreSQL/PostgreSQLReplicationHandler.cpp +++ b/src/Storages/PostgreSQL/PostgreSQLReplicationHandler.cpp @@ -1,6 +1,6 @@ #include "PostgreSQLReplicationHandler.h" -#include +#include #include #include #include diff --git a/src/Storages/RabbitMQ/StorageRabbitMQ.cpp b/src/Storages/RabbitMQ/StorageRabbitMQ.cpp index 44622f106f4..419071ba642 100644 --- a/src/Storages/RabbitMQ/StorageRabbitMQ.cpp +++ b/src/Storages/RabbitMQ/StorageRabbitMQ.cpp @@ -196,7 +196,7 @@ String StorageRabbitMQ::getTableBasedName(String name, const StorageID & table_i std::shared_ptr StorageRabbitMQ::addSettings(ContextPtr local_context) const { auto modified_context = Context::createCopy(local_context); - modified_context->setSetting("input_format_skip_unknown_fields", Field{true}); + modified_context->setSetting("input_format_skip_unknown_fields", true); modified_context->setSetting("input_format_allow_errors_ratio", 0.); modified_context->setSetting("input_format_allow_errors_num", rabbitmq_settings->rabbitmq_skip_broken_messages.value); diff --git a/src/Storages/RabbitMQ/WriteBufferToRabbitMQProducer.cpp b/src/Storages/RabbitMQ/WriteBufferToRabbitMQProducer.cpp index b9af60eb66f..be7f1fe508a 100644 --- a/src/Storages/RabbitMQ/WriteBufferToRabbitMQProducer.cpp +++ b/src/Storages/RabbitMQ/WriteBufferToRabbitMQProducer.cpp @@ -101,7 +101,7 @@ WriteBufferToRabbitMQProducer::~WriteBufferToRabbitMQProducer() std::this_thread::sleep_for(std::chrono::milliseconds(CONNECT_SLEEP)); } - assert(rows == 0 && chunks.empty()); + assert(rows == 0); } diff --git a/src/Storages/ReadInOrderOptimizer.cpp b/src/Storages/ReadInOrderOptimizer.cpp index 912d284bfc0..bae24f97b28 100644 --- a/src/Storages/ReadInOrderOptimizer.cpp +++ b/src/Storages/ReadInOrderOptimizer.cpp @@ -6,8 +6,6 @@ #include #include #include -#include -#include namespace DB { diff --git a/src/Storages/SelectQueryInfo.h b/src/Storages/SelectQueryInfo.h index 3b3c0fa1258..a4536e1ff58 100644 --- a/src/Storages/SelectQueryInfo.h +++ b/src/Storages/SelectQueryInfo.h @@ -39,6 +39,9 @@ using ReadInOrderOptimizerPtr = std::shared_ptr; class Cluster; using ClusterPtr = std::shared_ptr; +struct MergeTreeDataSelectAnalysisResult; +using MergeTreeDataSelectAnalysisResultPtr = std::shared_ptr; + struct PrewhereInfo { /// Actions which are executed in order to alias columns are used for prewhere actions. @@ -118,6 +121,8 @@ struct ProjectionCandidate ReadInOrderOptimizerPtr order_optimizer; InputOrderInfoPtr input_order_info; ManyExpressionActions group_by_elements_actions; + MergeTreeDataSelectAnalysisResultPtr merge_tree_projection_select_result_ptr; + MergeTreeDataSelectAnalysisResultPtr merge_tree_normal_select_result_ptr; }; /** Query along with some additional data, @@ -158,6 +163,7 @@ struct SelectQueryInfo std::optional projection; bool ignore_projections = false; bool is_projection_query = false; + MergeTreeDataSelectAnalysisResultPtr merge_tree_select_result_ptr; }; } diff --git a/src/Storages/StorageDistributed.cpp b/src/Storages/StorageDistributed.cpp index fcd0e255e5c..df7d568deb9 100644 --- a/src/Storages/StorageDistributed.cpp +++ b/src/Storages/StorageDistributed.cpp @@ -327,11 +327,13 @@ StorageDistributed::StorageDistributed( const String & relative_data_path_, const DistributedSettings & distributed_settings_, bool attach_, - ClusterPtr owned_cluster_) + ClusterPtr owned_cluster_, + ASTPtr remote_table_function_ptr_) : IStorage(id_) , WithContext(context_->getGlobalContext()) , remote_database(remote_database_) , remote_table(remote_table_) + , remote_table_function_ptr(remote_table_function_ptr_) , log(&Poco::Logger::get("StorageDistributed (" + id_.table_name + ")")) , owned_cluster(std::move(owned_cluster_)) , cluster_name(getContext()->getMacros()->expand(cluster_name_)) @@ -363,10 +365,13 @@ StorageDistributed::StorageDistributed( } /// Sanity check. Skip check if the table is already created to allow the server to start. - if (!attach_ && !cluster_name.empty()) + if (!attach_) { - size_t num_local_shards = getContext()->getCluster(cluster_name)->getLocalShardCount(); - if (num_local_shards && remote_database == id_.database_name && remote_table == id_.table_name) + if (remote_database.empty() && !remote_table_function_ptr && !getCluster()->maybeCrossReplication()) + LOG_WARNING(log, "Name of remote database is empty. Default database will be used implicitly."); + + size_t num_local_shards = getCluster()->getLocalShardCount(); + if (num_local_shards && (remote_database.empty() || remote_database == id_.database_name) && remote_table == id_.table_name) throw Exception("Distributed table " + id_.table_name + " looks at itself", ErrorCodes::INFINITE_LOOP); } } @@ -399,9 +404,9 @@ StorageDistributed::StorageDistributed( relative_data_path_, distributed_settings_, attach, - std::move(owned_cluster_)) + std::move(owned_cluster_), + remote_table_function_ptr_) { - remote_table_function_ptr = std::move(remote_table_function_ptr_); } QueryProcessingStage::Enum StorageDistributed::getQueryProcessingStage( @@ -810,9 +815,6 @@ void StorageDistributed::alter(const AlterCommands & params, ContextPtr local_co void StorageDistributed::startup() { - if (remote_database.empty() && !remote_table_function_ptr && !getCluster()->maybeCrossReplication()) - LOG_WARNING(log, "Name of remote database is empty. Default database will be used implicitly."); - if (!storage_policy) return; diff --git a/src/Storages/StorageDistributed.h b/src/Storages/StorageDistributed.h index f8b16dec7be..b003f8c6486 100644 --- a/src/Storages/StorageDistributed.h +++ b/src/Storages/StorageDistributed.h @@ -136,7 +136,8 @@ private: const String & relative_data_path_, const DistributedSettings & distributed_settings_, bool attach_, - ClusterPtr owned_cluster_ = {}); + ClusterPtr owned_cluster_ = {}, + ASTPtr remote_table_function_ptr_ = {}); StorageDistributed( const StorageID & id_, @@ -174,8 +175,9 @@ private: /// - optimize_skip_unused_shards /// - force_optimize_skip_unused_shards ClusterPtr getOptimizedCluster(ContextPtr, const StorageMetadataPtr & metadata_snapshot, const ASTPtr & query_ptr) const; - ClusterPtr - skipUnusedShards(ClusterPtr cluster, const ASTPtr & query_ptr, const StorageMetadataPtr & metadata_snapshot, ContextPtr context) const; + + ClusterPtr skipUnusedShards( + ClusterPtr cluster, const ASTPtr & query_ptr, const StorageMetadataPtr & metadata_snapshot, ContextPtr context) const; /// This method returns optimal query processing stage. /// 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/StorageFile.cpp b/src/Storages/StorageFile.cpp index cc8e397b668..8501a941ac9 100644 --- a/src/Storages/StorageFile.cpp +++ b/src/Storages/StorageFile.cpp @@ -49,6 +49,7 @@ namespace ErrorCodes { extern const int BAD_ARGUMENTS; extern const int NOT_IMPLEMENTED; + extern const int CANNOT_FSTAT; extern const int CANNOT_TRUNCATE_FILE; extern const int DATABASE_ACCESS_DENIED; extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; @@ -164,6 +165,12 @@ bool StorageFile::isColumnOriented() const StorageFile::StorageFile(int table_fd_, CommonArguments args) : StorageFile(args) { + struct stat buf; + int res = fstat(table_fd_, &buf); + if (-1 == res) + throwFromErrno("Cannot execute fstat", res, ErrorCodes::CANNOT_FSTAT); + total_bytes_to_read = buf.st_size; + if (args.getContext()->getApplicationType() == Context::ApplicationType::SERVER) throw Exception("Using file descriptor as source of storage isn't allowed for server daemons", ErrorCodes::DATABASE_ACCESS_DENIED); if (args.format_name == "Distributed") @@ -208,6 +215,8 @@ StorageFile::StorageFile(const std::string & relative_table_dir_path, CommonArgu String table_dir_path = fs::path(base_path) / relative_table_dir_path / ""; fs::create_directories(table_dir_path); paths = {getTablePath(table_dir_path, format_name)}; + if (fs::exists(paths[0])) + total_bytes_to_read = fs::file_size(paths[0]); } StorageFile::StorageFile(CommonArguments args) diff --git a/src/Storages/StorageInMemoryMetadata.cpp b/src/Storages/StorageInMemoryMetadata.cpp index dad83f64c70..cbd27afe106 100644 --- a/src/Storages/StorageInMemoryMetadata.cpp +++ b/src/Storages/StorageInMemoryMetadata.cpp @@ -1,10 +1,11 @@ #include -#include -#include +#include +#include #include #include #include +#include #include #include #include @@ -214,7 +215,7 @@ bool StorageInMemoryMetadata::hasAnyGroupByTTL() const return !table_ttl.group_by_ttl.empty(); } -ColumnDependencies StorageInMemoryMetadata::getColumnDependencies(const NameSet & updated_columns) const +ColumnDependencies StorageInMemoryMetadata::getColumnDependencies(const NameSet & updated_columns, bool include_ttl_target) const { if (updated_columns.empty()) return {}; @@ -250,7 +251,7 @@ ColumnDependencies StorageInMemoryMetadata::getColumnDependencies(const NameSet if (hasRowsTTL()) { auto rows_expression = getRowsTTL().expression; - if (add_dependent_columns(rows_expression, required_ttl_columns)) + if (add_dependent_columns(rows_expression, required_ttl_columns) && include_ttl_target) { /// Filter all columns, if rows TTL expression have to be recalculated. for (const auto & column : getColumns().getAllPhysical()) @@ -263,13 +264,15 @@ ColumnDependencies StorageInMemoryMetadata::getColumnDependencies(const NameSet for (const auto & [name, entry] : getColumnTTLs()) { - if (add_dependent_columns(entry.expression, required_ttl_columns)) + if (add_dependent_columns(entry.expression, required_ttl_columns) && include_ttl_target) updated_ttl_columns.insert(name); } for (const auto & entry : getMoveTTLs()) add_dependent_columns(entry.expression, required_ttl_columns); + //TODO what about rows_where_ttl and group_by_ttl ?? + for (const auto & column : indices_columns) res.emplace(column, ColumnDependency::SKIP_INDEX); for (const auto & column : projections_columns) @@ -320,18 +323,12 @@ Block StorageInMemoryMetadata::getSampleBlockForColumns( { Block res; -#if !defined(ARCADIA_BUILD) - google::dense_hash_map virtuals_map; -#else - google::sparsehash::dense_hash_map virtuals_map; -#endif - - virtuals_map.set_empty_key(StringRef()); + HashMapWithSavedHash virtuals_map; /// Virtual columns must be appended after ordinary, because user can /// override them. for (const auto & column : virtuals) - virtuals_map.emplace(column.name, &column.type); + virtuals_map[column.name] = &column.type; for (const auto & name : column_names) { @@ -340,9 +337,9 @@ Block StorageInMemoryMetadata::getSampleBlockForColumns( { res.insert({column->type->createColumn(), column->type, column->name}); } - else if (auto it = virtuals_map.find(name); it != virtuals_map.end()) + else if (auto * it = virtuals_map.find(name); it != virtuals_map.end()) { - const auto & type = *it->second; + const auto & type = *it->getMapped(); res.insert({type->createColumn(), type, name}); } else @@ -475,13 +472,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) { @@ -498,7 +490,6 @@ 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()}); @@ -506,11 +497,21 @@ namespace return res; } - UniqueStrings initUniqueStrings() + /* + * This function checks compatibility of enums. It returns true if: + * 1. Both types are enums. + * 2. The first type can represent all possible values of the second one. + * 3. Both types require the same amount of memory. + */ + bool isCompatibleEnumTypes(const IDataType * lhs, const IDataType * rhs) { - UniqueStrings strings; - strings.set_empty_key(StringRef()); - return strings; + if (IDataTypeEnum const * enum_type = dynamic_cast(lhs)) + { + if (!enum_type->contains(*rhs)) + return false; + return enum_type->getMaximumSizeOfValueInMemory() == rhs->getMaximumSizeOfValueInMemory(); + } + return false; } } @@ -524,11 +525,12 @@ void StorageInMemoryMetadata::check(const Names & column_names, const NamesAndTy } const auto virtuals_map = getColumnsMap(virtuals); - auto unique_names = initUniqueStrings(); + UniqueStrings unique_names; for (const auto & name : column_names) { - bool has_column = getColumns().hasColumnOrSubcolumn(ColumnsDescription::AllPhysical, name) || virtuals_map.count(name); + bool has_column = getColumns().hasColumnOrSubcolumn(ColumnsDescription::AllPhysical, name) + || virtuals_map.find(name) != nullptr; if (!has_column) { @@ -550,23 +552,32 @@ 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)) + const auto * available_type = it->getMapped(); + if (!column.type->equals(*available_type) && !isCompatibleEnumTypes(available_type, column.type.get())) 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, + available_type->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); } } @@ -582,26 +593,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) && !isCompatibleEnumTypes(available_column_type, provided_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, + available_column_type->getName(), + provided_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); } } @@ -622,17 +645,22 @@ 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)) + const auto * available_type = it->getMapped(); + if (!column.type->equals(*available_type) && !isCompatibleEnumTypes(available_type, column.type.get())) 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, + available_type->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 d0d60f608d7..9accdb9b3b6 100644 --- a/src/Storages/StorageInMemoryMetadata.h +++ b/src/Storages/StorageInMemoryMetadata.h @@ -143,7 +143,7 @@ struct StorageInMemoryMetadata /// Returns columns, which will be needed to calculate dependencies (skip /// indices, TTL expressions) if we update @updated_columns set of columns. - ColumnDependencies getColumnDependencies(const NameSet & updated_columns) const; + ColumnDependencies getColumnDependencies(const NameSet & updated_columns, bool include_ttl_target) const; /// Block with ordinary + materialized columns. Block getSampleBlock() const; diff --git a/src/Storages/StorageMerge.cpp b/src/Storages/StorageMerge.cpp index 243294351f3..4e50b78ea8e 100644 --- a/src/Storages/StorageMerge.cpp +++ b/src/Storages/StorageMerge.cpp @@ -209,7 +209,7 @@ Pipe StorageMerge::read( * since there is no certainty that it works when one of table is MergeTree and other is not. */ auto modified_context = Context::createCopy(local_context); - modified_context->setSetting("optimize_move_to_prewhere", Field{false}); + modified_context->setSetting("optimize_move_to_prewhere", false); /// What will be result structure depending on query processed stage in source tables? Block header = getHeaderForProcessingStage(*this, column_names, metadata_snapshot, query_info, local_context, processed_stage); @@ -435,11 +435,17 @@ Pipe StorageMerge::createSources( if (!pipe.empty()) { if (concat_streams && pipe.numOutputPorts() > 1) + { // It's possible to have many tables read from merge, resize(1) might open too many files at the same time. // Using concat instead. pipe.addTransform(std::make_shared(pipe.getHeader(), pipe.numOutputPorts())); + } - if (has_database_virtual_column) + /// Add virtual columns if we don't already have them. + + Block pipe_header = pipe.getHeader(); + + if (has_database_virtual_column && !pipe_header.has("_database")) { ColumnWithTypeAndName column; column.name = "_database"; @@ -457,7 +463,7 @@ Pipe StorageMerge::createSources( }); } - if (has_table_virtual_column) + if (has_table_virtual_column && !pipe_header.has("_table")) { ColumnWithTypeAndName column; column.name = "_table"; diff --git a/src/Storages/StorageMergeTree.cpp b/src/Storages/StorageMergeTree.cpp index 32c2c76dd10..880a729cb2c 100644 --- a/src/Storages/StorageMergeTree.cpp +++ b/src/Storages/StorageMergeTree.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -1623,6 +1624,12 @@ CheckResults StorageMergeTree::checkData(const ASTPtr & query, ContextPtr local_ } +RestoreDataTasks StorageMergeTree::restoreFromBackup(const BackupPtr & backup, const String & data_path_in_backup, const ASTs & partitions, ContextMutablePtr local_context) +{ + return restoreDataPartsFromBackup(backup, data_path_in_backup, getPartitionIDsFromQuery(partitions, local_context), &increment); +} + + MutationCommands StorageMergeTree::getFirstAlterMutationCommandsForPart(const DataPartPtr & part) const { std::lock_guard lock(currently_processing_in_background_mutex); diff --git a/src/Storages/StorageMergeTree.h b/src/Storages/StorageMergeTree.h index 681475f7a49..e2dbc217135 100644 --- a/src/Storages/StorageMergeTree.h +++ b/src/Storages/StorageMergeTree.h @@ -94,6 +94,8 @@ public: CheckResults checkData(const ASTPtr & query, ContextPtr context) override; + RestoreDataTasks restoreFromBackup(const BackupPtr & backup, const String & data_path_in_backup, const ASTs & partitions, ContextMutablePtr context) override; + bool scheduleDataProcessingJob(IBackgroundJobExecutor & executor) override; MergeTreeDeduplicationLog * getDeduplicationLog() { return deduplication_log.get(); } diff --git a/src/Storages/StorageMongoDB.cpp b/src/Storages/StorageMongoDB.cpp index a973efd7277..3bdef7fd295 100644 --- a/src/Storages/StorageMongoDB.cpp +++ b/src/Storages/StorageMongoDB.cpp @@ -15,7 +15,7 @@ #include #include #include -#include +#include namespace DB { diff --git a/src/Storages/StorageMySQL.cpp b/src/Storages/StorageMySQL.cpp index 431fda530f4..ee5bd1eb03d 100644 --- a/src/Storages/StorageMySQL.cpp +++ b/src/Storages/StorageMySQL.cpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include #include #include @@ -271,7 +271,9 @@ void registerStorageMySQL(StorageFactory & factory) username, password, MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_START_CONNECTIONS, mysql_settings.connection_pool_size, - mysql_settings.connection_max_tries); + mysql_settings.connection_max_tries, + args.getContext()->getSettingsRef().external_storage_connect_timeout, + args.getContext()->getSettingsRef().external_storage_rw_timeout); bool replace_query = false; std::string on_duplicate_clause; diff --git a/src/Storages/StoragePostgreSQL.cpp b/src/Storages/StoragePostgreSQL.cpp index b71f2415fd8..3617e964734 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 @@ -29,6 +29,8 @@ #include #include #include +#include +#include namespace DB @@ -47,12 +49,12 @@ StoragePostgreSQL::StoragePostgreSQL( const ColumnsDescription & columns_, const ConstraintsDescription & constraints_, const String & comment, - ContextPtr context_, - const String & remote_table_schema_) + const String & remote_table_schema_, + const String & on_conflict_) : IStorage(table_id_) , remote_table_name(remote_table_name_) , remote_table_schema(remote_table_schema_) - , global_context(context_) + , on_conflict(on_conflict_) , pool(std::move(pool_)) { StorageInMemoryMetadata storage_metadata; @@ -96,17 +98,22 @@ Pipe StoragePostgreSQL::read( class PostgreSQLSink : public SinkToStorage { + +using Row = std::vector>; + public: explicit PostgreSQLSink( const StorageMetadataPtr & metadata_snapshot_, postgres::ConnectionHolderPtr connection_holder_, const String & remote_table_name_, - const String & remote_table_schema_) + const String & remote_table_schema_, + const String & on_conflict_) : 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_) + , on_conflict(on_conflict_) { } @@ -115,11 +122,21 @@ public: 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}) - : pqxx::table_path({remote_table_schema, remote_table_name}), - block.getNames()); + { + if (on_conflict.empty()) + { + inserter = std::make_unique(connection_holder->get(), + remote_table_schema.empty() ? pqxx::table_path({remote_table_name}) + : pqxx::table_path({remote_table_schema, remote_table_name}), block.getNames()); + } + else + { + inserter = std::make_unique(connection_holder->get(), remote_table_name, + remote_table_schema, block.getColumnsWithTypeAndName(), on_conflict); + } + } const auto columns = block.getColumns(); const size_t num_rows = block.rows(), num_cols = block.columns(); @@ -153,7 +170,7 @@ public: } } - inserter->stream.write_values(row); + inserter->insert(row); } } @@ -270,37 +287,92 @@ public: } private: - struct StreamTo + struct Inserter { + pqxx::connection & connection; pqxx::work tx; + + explicit Inserter(pqxx::connection & connection_) + : connection(connection_) + , tx(connection) {} + + virtual ~Inserter() = default; + + virtual void insert(const Row & row) = 0; + virtual void complete() = 0; + }; + + struct StreamTo : Inserter + { Names columns; pqxx::stream_to stream; - StreamTo(pqxx::connection & connection, pqxx::table_path table_, Names columns_) - : tx(connection) + StreamTo(pqxx::connection & connection_, pqxx::table_path table_, Names columns_) + : Inserter(connection_) , columns(std::move(columns_)) , stream(pqxx::stream_to::raw_table(tx, connection.quote_table(table_), connection.quote_columns(columns))) { } - void complete() + void complete() override { stream.complete(); tx.commit(); } + + void insert(const Row & row) override + { + stream.write_values(row); + } + }; + + struct PreparedInsert : Inserter + { + PreparedInsert(pqxx::connection & connection_, const String & table, const String & schema, + const ColumnsWithTypeAndName & columns, const String & on_conflict_) + : Inserter(connection_) + { + WriteBufferFromOwnString buf; + buf << getInsertQuery(schema, table, columns, IdentifierQuotingStyle::DoubleQuotes); + buf << " ("; + for (size_t i = 1; i <= columns.size(); ++i) + { + if (i > 1) + buf << ", "; + buf << "$" << i; + } + buf << ") "; + buf << on_conflict_; + connection.prepare("insert", buf.str()); + } + + void complete() override + { + connection.unprepare("insert"); + tx.commit(); + } + + void insert(const Row & row) override + { + pqxx::params params; + params.reserve(row.size()); + params.append_multi(row); + tx.exec_prepared("insert", params); + } }; StorageMetadataPtr metadata_snapshot; postgres::ConnectionHolderPtr connection_holder; - const String remote_table_name, remote_table_schema; - std::unique_ptr inserter; + const String remote_db_name, remote_table_name, remote_table_schema, on_conflict; + + std::unique_ptr inserter; }; 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, on_conflict); } @@ -310,9 +382,9 @@ void registerStoragePostgreSQL(StorageFactory & factory) { ASTs & engine_args = args.engine_args; - if (engine_args.size() < 5 || engine_args.size() > 6) - throw Exception("Storage PostgreSQL requires from 5 to 6 parameters: " - "PostgreSQL('host:port', 'database', 'table', 'username', 'password' [, 'schema']", + if (engine_args.size() < 5 || engine_args.size() > 7) + throw Exception("Storage PostgreSQL requires from 5 to 7 parameters: " + "PostgreSQL('host:port', 'database', 'table', 'username', 'password' [, 'schema', 'ON CONFLICT ...']", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); for (auto & engine_arg : engine_args) @@ -328,9 +400,11 @@ void registerStoragePostgreSQL(StorageFactory & factory) const String & username = engine_args[3]->as().value.safeGet(); const String & password = engine_args[4]->as().value.safeGet(); - String remote_table_schema; - if (engine_args.size() == 6) + String remote_table_schema, on_conflict; + if (engine_args.size() >= 6) remote_table_schema = engine_args[5]->as().value.safeGet(); + if (engine_args.size() >= 7) + on_conflict = engine_args[6]->as().value.safeGet(); auto pool = std::make_shared( remote_database, @@ -347,8 +421,8 @@ void registerStoragePostgreSQL(StorageFactory & factory) args.columns, args.constraints, args.comment, - args.getContext(), - remote_table_schema); + remote_table_schema, + on_conflict); }, { .source_access_type = AccessType::POSTGRES, diff --git a/src/Storages/StoragePostgreSQL.h b/src/Storages/StoragePostgreSQL.h index 064fa481f9d..a12b52e6e48 100644 --- a/src/Storages/StoragePostgreSQL.h +++ b/src/Storages/StoragePostgreSQL.h @@ -27,8 +27,8 @@ public: const ColumnsDescription & columns_, const ConstraintsDescription & constraints_, const String & comment, - ContextPtr context_, - const std::string & remote_table_schema_ = ""); + const String & remote_table_schema_ = "", + const String & on_conflict = ""); String getName() const override { return "PostgreSQL"; } @@ -48,7 +48,7 @@ private: String remote_table_name; String remote_table_schema; - ContextPtr global_context; + String on_conflict; postgres::PoolWithFailoverPtr pool; }; diff --git a/src/Storages/StorageProxy.h b/src/Storages/StorageProxy.h index 521a2b8d642..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, diff --git a/src/Storages/StorageReplicatedMergeTree.cpp b/src/Storages/StorageReplicatedMergeTree.cpp index 150a71a09e5..f76f0881438 100644 --- a/src/Storages/StorageReplicatedMergeTree.cpp +++ b/src/Storages/StorageReplicatedMergeTree.cpp @@ -141,6 +141,7 @@ namespace ErrorCodes extern const int DUPLICATE_DATA_PART; extern const int BAD_ARGUMENTS; extern const int CONCURRENT_ACCESS_NOT_SUPPORTED; + extern const int CHECKSUM_DOESNT_MATCH; } namespace ActionLocks @@ -1314,32 +1315,35 @@ void StorageReplicatedMergeTree::checkPartChecksumsAndAddCommitOps(const zkutil: } ReplicatedMergeTreePartHeader replica_part_header; - if (!part_zk_str.empty()) - replica_part_header = ReplicatedMergeTreePartHeader::fromString(part_zk_str); - else + if (part_zk_str.empty()) { - Coordination::Stat columns_stat_before, columns_stat_after; String columns_str; String checksums_str; - /// Let's check that the node's version with the columns did not change while we were reading the checksums. - /// This ensures that the columns and the checksum refer to the same - if (!zookeeper->tryGet(fs::path(current_part_path) / "columns", columns_str, &columns_stat_before) || - !zookeeper->tryGet(fs::path(current_part_path) / "checksums", checksums_str) || - !zookeeper->exists(fs::path(current_part_path) / "columns", &columns_stat_after) || - columns_stat_before.version != columns_stat_after.version) + if (zookeeper->tryGet(fs::path(current_part_path) / "columns", columns_str) && + zookeeper->tryGet(fs::path(current_part_path) / "checksums", checksums_str)) { - LOG_INFO(log, "Not checking checksums of part {} with replica {} because part changed while we were reading its checksums", part_name, replica); + replica_part_header = ReplicatedMergeTreePartHeader::fromColumnsAndChecksumsZNodes(columns_str, checksums_str); + } + else + { + if (zookeeper->exists(current_part_path)) + throw Exception(ErrorCodes::LOGICAL_ERROR, "Part {} has empty header and does not have columns and checksums. " + "Looks like a bug.", current_part_path); + LOG_INFO(log, "Not checking checksums of part {} with replica {} because part was removed from ZooKeeper", part_name, replica); continue; } - - replica_part_header = ReplicatedMergeTreePartHeader::fromColumnsAndChecksumsZNodes( - columns_str, checksums_str); + } + else + { + replica_part_header = ReplicatedMergeTreePartHeader::fromString(part_zk_str); } if (replica_part_header.getColumnsHash() != local_part_header.getColumnsHash()) { - LOG_INFO(log, "Not checking checksums of part {} with replica {} because columns are different", part_name, replica); - continue; + /// Either it's a bug or ZooKeeper contains broken data. + /// TODO Fix KILL MUTATION and replace CHECKSUM_DOESNT_MATCH with LOGICAL_ERROR + /// (some replicas may skip killed mutation even if it was executed on other replicas) + throw Exception(ErrorCodes::CHECKSUM_DOESNT_MATCH, "Part {} from {} has different columns hash", part_name, replica); } replica_part_header.getChecksums().checkEqual(local_part_header.getChecksums(), true); @@ -2137,6 +2141,8 @@ bool StorageReplicatedMergeTree::executeFetch(LogEntry & entry) if (!parts_for_merge.empty() && replica.empty()) { LOG_INFO(log, "No active replica has part {}. Will fetch merged part instead.", entry.new_part_name); + /// We should enqueue it for check, because merged part may never appear if source part is lost + enqueuePartForCheck(entry.new_part_name); return false; } @@ -3073,6 +3079,12 @@ void StorageReplicatedMergeTree::cloneReplicaIfNeeded(zkutil::ZooKeeperPtr zooke zookeeper->set(fs::path(replica_path) / "is_lost", "0"); } +String StorageReplicatedMergeTree::getLastQueueUpdateException() const +{ + std::unique_lock lock(last_queue_update_exception_lock); + return last_queue_update_exception; +} + void StorageReplicatedMergeTree::queueUpdatingTask() { @@ -3083,7 +3095,7 @@ void StorageReplicatedMergeTree::queueUpdatingTask() } try { - queue.pullLogsToQueue(getZooKeeper(), queue_updating_task->getWatchCallback()); + queue.pullLogsToQueue(getZooKeeper(), queue_updating_task->getWatchCallback(), ReplicatedMergeTreeQueue::UPDATE); last_queue_update_finish_time.store(time(nullptr)); queue_update_in_progress = false; } @@ -3091,6 +3103,9 @@ void StorageReplicatedMergeTree::queueUpdatingTask() { tryLogCurrentException(log, __PRETTY_FUNCTION__); + std::unique_lock lock(last_queue_update_exception_lock); + last_queue_update_exception = getCurrentExceptionMessage(false); + if (e.code == Coordination::Error::ZSESSIONEXPIRED) { restarting_thread.wakeup(); @@ -3102,6 +3117,10 @@ void StorageReplicatedMergeTree::queueUpdatingTask() catch (...) { tryLogCurrentException(log, __PRETTY_FUNCTION__); + + std::unique_lock lock(last_queue_update_exception_lock); + last_queue_update_exception = getCurrentExceptionMessage(false); + queue_updating_task->scheduleAfter(QUEUE_UPDATE_ERROR_SLEEP_MS); } } @@ -4321,9 +4340,6 @@ void StorageReplicatedMergeTree::startup() /// Wait while restarting_thread initializes LeaderElection (and so on) or makes first attempt to do it startup_event.wait(); - /// If we don't separate create/start steps, race condition will happen - /// between the assignment of queue_task_handle and queueTask that use the queue_task_handle. - background_executor.start(); startBackgroundMovesIfNeeded(); part_moves_between_shards_orchestrator.start(); @@ -5460,9 +5476,9 @@ bool StorageReplicatedMergeTree::waitForTableReplicaToProcessLogEntry( const auto & stop_waiting = [&]() { - bool stop_waiting_itself = waiting_itself && (partial_shutdown_called || is_dropped); + bool stop_waiting_itself = waiting_itself && partial_shutdown_called; bool stop_waiting_non_active = !wait_for_non_active && !getZooKeeper()->exists(fs::path(table_zookeeper_path) / "replicas" / replica / "is_active"); - return stop_waiting_itself || stop_waiting_non_active; + return is_dropped || stop_waiting_itself || stop_waiting_non_active; }; /// Don't recheck ZooKeeper too often @@ -5562,6 +5578,7 @@ void StorageReplicatedMergeTree::getStatus(Status & res, bool with_zk_fields) res.log_pointer = 0; res.total_replicas = 0; res.active_replicas = 0; + res.last_queue_update_exception = getLastQueueUpdateException(); if (with_zk_fields && !res.is_session_expired) { @@ -6058,7 +6075,7 @@ CancellationCode StorageReplicatedMergeTree::killMutation(const String & mutatio zkutil::ZooKeeperPtr zookeeper = getZooKeeper(); - LOG_TRACE(log, "Killing mutation {}", mutation_id); + LOG_INFO(log, "Killing mutation {}", mutation_id); auto mutation_entry = queue.removeMutation(zookeeper, mutation_id); if (!mutation_entry) @@ -6367,6 +6384,7 @@ void StorageReplicatedMergeTree::replacePartitionFrom( MergeTreeData & src_data = checkStructureAndGetMergeTreeData(source_table, source_metadata_snapshot, metadata_snapshot); String partition_id = getPartitionIDFromQuery(partition, query_context); + /// NOTE: Some covered parts may be missing in src_all_parts if corresponding log entries are not executed yet. DataPartsVector src_all_parts = src_data.getDataPartsVectorInPartition(MergeTreeDataPartState::Committed, partition_id); DataPartsVector src_parts; MutableDataPartsVector dst_parts; @@ -6494,8 +6512,7 @@ void StorageReplicatedMergeTree::replacePartitionFrom( delimiting_block_lock->getUnlockOps(ops); /// Check and update version to avoid race with DROP_RANGE - ops.emplace_back(zkutil::makeCheckRequest(alter_partition_version_path, alter_partition_version_stat.version)); - ops.emplace_back(zkutil::makeSetRequest(alter_partition_version_path, "", -1)); + ops.emplace_back(zkutil::makeSetRequest(alter_partition_version_path, "", alter_partition_version_stat.version)); /// Just update version, because merges assignment relies on it ops.emplace_back(zkutil::makeSetRequest(fs::path(zookeeper_path) / "log", "", -1)); ops.emplace_back(zkutil::makeCreateRequest(fs::path(zookeeper_path) / "log/log-", entry.toString(), zkutil::CreateMode::PersistentSequential)); @@ -6577,7 +6594,39 @@ void StorageReplicatedMergeTree::movePartitionToTable(const StoragePtr & dest_ta auto src_data_id = src_data.getStorageID(); String partition_id = getPartitionIDFromQuery(partition, query_context); - DataPartsVector src_all_parts = src_data.getDataPartsVectorInPartition(MergeTreeDataPartState::Committed, partition_id); + /// A range for log entry to remove parts from the source table (myself). + auto zookeeper = getZooKeeper(); + String alter_partition_version_path = zookeeper_path + "/alter_partition_version"; + Coordination::Stat alter_partition_version_stat; + zookeeper->get(alter_partition_version_path, &alter_partition_version_stat); + + MergeTreePartInfo drop_range; + std::optional delimiting_block_lock; + getFakePartCoveringAllPartsInPartition(partition_id, drop_range, delimiting_block_lock, true); + String drop_range_fake_part_name = getPartNamePossiblyFake(format_version, drop_range); + + DataPartPtr covering_part; + DataPartsVector src_all_parts; + { + /// NOTE: Some covered parts may be missing in src_all_parts if corresponding log entries are not executed yet. + auto parts_lock = src_data.lockParts(); + src_all_parts = src_data.getActivePartsToReplace(drop_range, drop_range_fake_part_name, covering_part, parts_lock); + } + + if (covering_part) + throw Exception(ErrorCodes::LOGICAL_ERROR, "Got part {} covering drop range {}, it's a bug", + covering_part->name, drop_range_fake_part_name); + + /// After allocating block number for drop_range we must ensure that it does not intersect block numbers + /// allocated by concurrent REPLACE query. + /// We could check it in multi-request atomically with creation of DROP_RANGE entry in source table log, + /// but it's better to check it here and fail as early as possible (before we have done something to destination table). + Coordination::Error version_check_code = zookeeper->trySet(alter_partition_version_path, "", alter_partition_version_stat.version); + if (version_check_code != Coordination::Error::ZOK) + throw Exception(ErrorCodes::CANNOT_ASSIGN_ALTER, "Cannot DROP PARTITION in {} after copying partition to {}, " + "because another ALTER PARTITION query was concurrently executed", + getStorageID().getFullTableName(), dest_table_storage->getStorageID().getFullTableName()); + DataPartsVector src_parts; MutableDataPartsVector dst_parts; Strings block_id_paths; @@ -6587,21 +6636,11 @@ void StorageReplicatedMergeTree::movePartitionToTable(const StoragePtr & dest_ta LOG_DEBUG(log, "Cloning {} parts", src_all_parts.size()); static const String TMP_PREFIX = "tmp_move_from_"; - auto zookeeper = getZooKeeper(); - - /// A range for log entry to remove parts from the source table (myself). - - MergeTreePartInfo drop_range; - std::optional delimiting_block_lock; - getFakePartCoveringAllPartsInPartition(partition_id, drop_range, delimiting_block_lock, true); - String drop_range_fake_part_name = getPartNamePossiblyFake(format_version, drop_range); /// Clone parts into destination table. - - String alter_partition_version_path = dest_table_storage->zookeeper_path + "/alter_partition_version"; - Coordination::Stat alter_partition_version_stat; - zookeeper->get(alter_partition_version_path, &alter_partition_version_stat); - + String dest_alter_partition_version_path = dest_table_storage->zookeeper_path + "/alter_partition_version"; + Coordination::Stat dest_alter_partition_version_stat; + zookeeper->get(dest_alter_partition_version_path, &dest_alter_partition_version_stat); for (const auto & src_part : src_all_parts) { if (!dest_table_storage->canReplacePartition(src_part)) @@ -6682,8 +6721,7 @@ void StorageReplicatedMergeTree::movePartitionToTable(const StoragePtr & dest_ta } /// Check and update version to avoid race with DROP_RANGE - ops.emplace_back(zkutil::makeCheckRequest(alter_partition_version_path, alter_partition_version_stat.version)); - ops.emplace_back(zkutil::makeSetRequest(alter_partition_version_path, "", -1)); + ops.emplace_back(zkutil::makeSetRequest(dest_alter_partition_version_path, "", dest_alter_partition_version_stat.version)); /// Just update version, because merges assignment relies on it ops.emplace_back(zkutil::makeSetRequest(fs::path(dest_table_storage->zookeeper_path) / "log", "", -1)); ops.emplace_back(zkutil::makeCreateRequest(fs::path(dest_table_storage->zookeeper_path) / "log/log-", @@ -6737,26 +6775,14 @@ void StorageReplicatedMergeTree::movePartitionToTable(const StoragePtr & dest_ta } /// Create DROP_RANGE for the source table - alter_partition_version_path = zookeeper_path + "/alter_partition_version"; - zookeeper->get(alter_partition_version_path, &alter_partition_version_stat); - Coordination::Requests ops_src; ops_src.emplace_back(zkutil::makeCreateRequest( fs::path(zookeeper_path) / "log/log-", entry_delete.toString(), zkutil::CreateMode::PersistentSequential)); - /// Check and update version to avoid race with REPLACE_RANGE - ops_src.emplace_back(zkutil::makeCheckRequest(alter_partition_version_path, alter_partition_version_stat.version)); - ops_src.emplace_back(zkutil::makeSetRequest(alter_partition_version_path, "", -1)); /// Just update version, because merges assignment relies on it ops_src.emplace_back(zkutil::makeSetRequest(fs::path(zookeeper_path) / "log", "", -1)); delimiting_block_lock->getUnlockOps(ops_src); - Coordination::Error code = zookeeper->tryMulti(ops_src, op_results); - if (code == Coordination::Error::ZBADVERSION) - throw Exception(ErrorCodes::CANNOT_ASSIGN_ALTER, "Cannot DROP PARTITION in {} after copying partition to {}, " - "because another ALTER PARTITION query was concurrently executed", - getStorageID().getFullTableName(), dest_table_storage->getStorageID().getFullTableName()); - else - zkutil::KeeperMultiException::check(code, ops_src, op_results); + op_results = zookeeper->multi(ops_src); log_znode_path = dynamic_cast(*op_results.front()).path_created; entry_delete.znode_name = log_znode_path.substr(log_znode_path.find_last_of('/') + 1); @@ -6964,7 +6990,7 @@ bool StorageReplicatedMergeTree::waitForShrinkingQueueSize(size_t queue_size, UI Stopwatch watch; /// Let's fetch new log entries firstly - queue.pullLogsToQueue(getZooKeeper()); + queue.pullLogsToQueue(getZooKeeper(), {}, ReplicatedMergeTreeQueue::SYNC); /// This is significant, because the execution of this task could be delayed at BackgroundPool. /// And we force it to be executed. @@ -7128,8 +7154,7 @@ bool StorageReplicatedMergeTree::dropAllPartsInPartition( /// Check and update version to avoid race with REPLACE_RANGE. /// Otherwise new parts covered by drop_range_info may appear after execution of current DROP_RANGE entry /// as a result of execution of concurrently created REPLACE_RANGE entry. - ops.emplace_back(zkutil::makeCheckRequest(alter_partition_version_path, alter_partition_version_stat.version)); - ops.emplace_back(zkutil::makeSetRequest(alter_partition_version_path, "", -1)); + ops.emplace_back(zkutil::makeSetRequest(alter_partition_version_path, "", alter_partition_version_stat.version)); /// Just update version, because merges assignment relies on it ops.emplace_back(zkutil::makeSetRequest(fs::path(zookeeper_path) / "log", "", -1)); diff --git a/src/Storages/StorageReplicatedMergeTree.h b/src/Storages/StorageReplicatedMergeTree.h index 3d2727d7bb9..2fd10f88895 100644 --- a/src/Storages/StorageReplicatedMergeTree.h +++ b/src/Storages/StorageReplicatedMergeTree.h @@ -174,6 +174,7 @@ public: UInt64 absolute_delay; UInt8 total_replicas; UInt8 active_replicas; + String last_queue_update_exception; /// If the error has happened fetching the info from ZooKeeper, this field will be set. String zookeeper_exception; std::unordered_map replica_is_active; @@ -331,6 +332,10 @@ private: std::atomic last_queue_update_start_time{0}; std::atomic last_queue_update_finish_time{0}; + mutable std::mutex last_queue_update_exception_lock; + String last_queue_update_exception; + String getLastQueueUpdateException() const; + DataPartsExchange::Fetcher fetcher; /// When activated, replica is initialized and startup() method could exit diff --git a/src/Storages/StorageS3.cpp b/src/Storages/StorageS3.cpp index fc3ce3a10ed..0e84b7a26e7 100644 --- a/src/Storages/StorageS3.cpp +++ b/src/Storages/StorageS3.cpp @@ -2,15 +2,26 @@ #if USE_AWS_S3 +#include +#include + +#include + #include + +#include +#include +#include +#include + +#include +#include +#include + #include #include #include -#include -#include -#include - #include #include #include @@ -46,13 +57,21 @@ namespace fs = std::filesystem; +#include + + +static const String PARTITION_ID_WILDCARD = "{_partition_id}"; + namespace DB { + namespace ErrorCodes { + extern const int CANNOT_PARSE_TEXT; + extern const int BAD_ARGUMENTS; extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; - extern const int UNEXPECTED_EXPRESSION; extern const int S3_ERROR; + extern const int UNEXPECTED_EXPRESSION; } class StorageS3Source::DisclosedGlobIterator::Impl { @@ -299,11 +318,6 @@ public: writer->write(getPort().getHeader().cloneWithColumns(chunk.detachColumns())); } - // void flush() override - // { - // writer->flush(); - // } - void onFinish() override { try @@ -328,6 +342,185 @@ private: }; +class PartitionedStorageS3Sink : public SinkToStorage +{ +public: + PartitionedStorageS3Sink( + const ASTPtr & partition_by, + const String & format_, + const Block & sample_block_, + ContextPtr context_, + const CompressionMethod compression_method_, + const std::shared_ptr & client_, + const String & bucket_, + const String & key_, + size_t min_upload_part_size_, + size_t max_single_part_upload_size_) + : SinkToStorage(sample_block_) + , format(format_) + , sample_block(sample_block_) + , context(context_) + , compression_method(compression_method_) + , client(client_) + , bucket(bucket_) + , key(key_) + , min_upload_part_size(min_upload_part_size_) + , max_single_part_upload_size(max_single_part_upload_size_) + + { + std::vector arguments(1, partition_by); + ASTPtr partition_by_string = makeASTFunction(FunctionToString::name, std::move(arguments)); + + auto syntax_result = TreeRewriter(context).analyze(partition_by_string, sample_block.getNamesAndTypesList()); + partition_by_expr = ExpressionAnalyzer(partition_by_string, syntax_result, context).getActions(false); + partition_by_column_name = partition_by_string->getColumnName(); + } + + String getName() const override { return "PartitionedStorageS3Sink"; } + + void consume(Chunk chunk) override + { + const auto & columns = chunk.getColumns(); + + Block block_with_partition_by_expr = sample_block.cloneWithoutColumns(); + block_with_partition_by_expr.setColumns(columns); + partition_by_expr->execute(block_with_partition_by_expr); + + const auto * column = block_with_partition_by_expr.getByName(partition_by_column_name).column.get(); + + std::unordered_map sub_chunks_indices; + IColumn::Selector selector; + for (size_t row = 0; row < chunk.getNumRows(); ++row) + { + auto value = column->getDataAt(row); + auto [it, inserted] = sub_chunks_indices.emplace(value, sub_chunks_indices.size()); + selector.push_back(it->second); + } + + Chunks sub_chunks; + sub_chunks.reserve(sub_chunks_indices.size()); + for (size_t column_index = 0; column_index < columns.size(); ++column_index) + { + MutableColumns column_sub_chunks = columns[column_index]->scatter(sub_chunks_indices.size(), selector); + if (column_index == 0) /// Set sizes for sub-chunks. + { + for (const auto & column_sub_chunk : column_sub_chunks) + { + sub_chunks.emplace_back(Columns(), column_sub_chunk->size()); + } + } + for (size_t sub_chunk_index = 0; sub_chunk_index < column_sub_chunks.size(); ++sub_chunk_index) + { + sub_chunks[sub_chunk_index].addColumn(std::move(column_sub_chunks[sub_chunk_index])); + } + } + + for (const auto & [partition_id, sub_chunk_index] : sub_chunks_indices) + { + getSinkForPartition(partition_id)->consume(std::move(sub_chunks[sub_chunk_index])); + } + } + + void onFinish() override + { + for (auto & [partition_id, sink] : sinks) + { + sink->onFinish(); + } + } + +private: + using SinkPtr = std::shared_ptr; + + const String format; + const Block sample_block; + ContextPtr context; + const CompressionMethod compression_method; + std::shared_ptr client; + const String bucket; + const String key; + size_t min_upload_part_size; + size_t max_single_part_upload_size; + + ExpressionActionsPtr partition_by_expr; + String partition_by_column_name; + + std::unordered_map sinks; + + static String replaceWildcards(const String & haystack, const String & partition_id) + { + return boost::replace_all_copy(haystack, PARTITION_ID_WILDCARD, partition_id); + } + + SinkPtr getSinkForPartition(const String & partition_id) + { + auto it = sinks.find(partition_id); + if (it == sinks.end()) + { + auto partition_bucket = replaceWildcards(bucket, partition_id); + validateBucket(partition_bucket); + + auto partition_key = replaceWildcards(key, partition_id); + validateKey(partition_key); + + std::tie(it, std::ignore) = sinks.emplace(partition_id, std::make_shared( + format, + sample_block, + context, + compression_method, + client, + partition_bucket, + partition_key, + min_upload_part_size, + max_single_part_upload_size + )); + } + + return it->second; + } + + static void validateBucket(const String & str) + { + S3::URI::validateBucket(str, {}); + + if (!DB::UTF8::isValidUTF8(reinterpret_cast(str.data()), str.size())) + throw Exception(ErrorCodes::CANNOT_PARSE_TEXT, "Incorrect non-UTF8 sequence in bucket name"); + + validatePartitionKey(str, false); + } + + static void validateKey(const String & str) + { + /// See: + /// - https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html + /// - https://cloud.ibm.com/apidocs/cos/cos-compatibility#putobject + + if (str.empty() || str.size() > 1024) + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Incorrect key length (not empty, max 1023 characters), got: {}", str.size()); + + if (!DB::UTF8::isValidUTF8(reinterpret_cast(str.data()), str.size())) + throw Exception(ErrorCodes::CANNOT_PARSE_TEXT, "Incorrect non-UTF8 sequence in key"); + + validatePartitionKey(str, true); + } + + static void validatePartitionKey(const StringRef & str, bool allow_slash) + { + for (const char * i = str.data; i != str.data + str.size; ++i) + { + if (static_cast(*i) < 0x20 || *i == '{' || *i == '}' || *i == '*' || *i == '?' || (!allow_slash && *i == '/')) + { + /// Need to convert to UInt32 because UInt8 can't be passed to format due to "mixing character types is disallowed". + UInt32 invalid_char_byte = static_cast(static_cast(*i)); + throw DB::Exception( + ErrorCodes::CANNOT_PARSE_TEXT, "Illegal character '\\x{:02x}' in partition id starting with '{}'", + invalid_char_byte, StringRef(str.data, i - str.data)); + } + } + } +}; + + StorageS3::StorageS3( const S3::URI & uri_, const String & access_key_id_, @@ -427,19 +620,44 @@ Pipe StorageS3::read( return pipe; } -SinkToStoragePtr 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( - format_name, - metadata_snapshot->getSampleBlock(), - local_context, - chooseCompressionMethod(client_auth.uri.key, compression_method), - client_auth.client, - client_auth.uri.bucket, - client_auth.uri.key, - min_upload_part_size, - max_single_part_upload_size); + + auto sample_block = metadata_snapshot->getSampleBlock(); + auto chosen_compression_method = chooseCompressionMethod(client_auth.uri.key, compression_method); + bool has_wildcards = client_auth.uri.bucket.find(PARTITION_ID_WILDCARD) != String::npos || client_auth.uri.key.find(PARTITION_ID_WILDCARD) != String::npos; + auto insert_query = std::dynamic_pointer_cast(query); + + bool is_partitioned_implementation = insert_query && insert_query->partition_by && has_wildcards; + + if (is_partitioned_implementation) + { + return std::make_shared( + insert_query->partition_by, + format_name, + sample_block, + local_context, + chosen_compression_method, + client_auth.client, + client_auth.uri.bucket, + client_auth.uri.key, + min_upload_part_size, + max_single_part_upload_size); + } + else + { + return std::make_shared( + format_name, + sample_block, + local_context, + chosen_compression_method, + client_auth.client, + client_auth.uri.bucket, + client_auth.uri.key, + min_upload_part_size, + max_single_part_upload_size); + } } @@ -583,6 +801,11 @@ NamesAndTypesList StorageS3::getVirtuals() const }; } +bool StorageS3::supportsPartitionBy() const +{ + return true; +} + } #endif diff --git a/src/Storages/StorageS3.h b/src/Storages/StorageS3.h index a0089578947..df4112cbfdd 100644 --- a/src/Storages/StorageS3.h +++ b/src/Storages/StorageS3.h @@ -136,6 +136,8 @@ public: NamesAndTypesList getVirtuals() const override; + bool supportsPartitionBy() const override; + private: friend class StorageS3Cluster; diff --git a/src/Storages/StorageSQLite.cpp b/src/Storages/StorageSQLite.cpp index ba66083fea5..758284e8d50 100644 --- a/src/Storages/StorageSQLite.cpp +++ b/src/Storages/StorageSQLite.cpp @@ -2,7 +2,7 @@ #if USE_SQLITE #include -#include +#include #include #include #include @@ -78,8 +78,7 @@ Pipe StorageSQLite::read( sample_block.insert({column_data.type, column_data.name}); } - return Pipe(std::make_shared( - std::make_shared(sqlite_db, query, sample_block, max_block_size))); + return Pipe(std::make_shared(sqlite_db, query, sample_block, max_block_size)); } diff --git a/src/Storages/StorageSet.cpp b/src/Storages/StorageSet.cpp index 67fd89f5098..c16b60af45f 100644 --- a/src/Storages/StorageSet.cpp +++ b/src/Storages/StorageSet.cpp @@ -146,13 +146,13 @@ StorageSet::StorageSet( Block header = getInMemoryMetadataPtr()->getSampleBlock(); header = header.sortColumns(); - set->setHeader(header); + set->setHeader(header.getColumnsWithTypeAndName()); restore(); } -void StorageSet::insertBlock(const Block & block) { set->insertFromBlock(block); } +void StorageSet::insertBlock(const Block & block) { set->insertFromBlock(block.getColumnsWithTypeAndName()); } void StorageSet::finishInsert() { set->finishInsert(); } size_t StorageSet::getSize() const { return set->getTotalRowCount(); } @@ -170,7 +170,7 @@ void StorageSet::truncate(const ASTPtr &, const StorageMetadataPtr & metadata_sn increment = 0; set = std::make_shared(SizeLimits(), false, true); - set->setHeader(header); + set->setHeader(header.getColumnsWithTypeAndName()); } diff --git a/src/Storages/System/StorageSystemFunctions.cpp b/src/Storages/System/StorageSystemFunctions.cpp index 973bf493cd1..f19cffee37c 100644 --- a/src/Storages/System/StorageSystemFunctions.cpp +++ b/src/Storages/System/StorageSystemFunctions.cpp @@ -1,26 +1,38 @@ #include #include #include +#include #include #include #include +#include #include - namespace DB { namespace { template - void fillRow(MutableColumns & res_columns, const String & name, UInt64 is_aggregate, const Factory & f) + void fillRow(MutableColumns & res_columns, const String & name, UInt64 is_aggregate, const String & create_query, const Factory & f) { res_columns[0]->insert(name); res_columns[1]->insert(is_aggregate); - res_columns[2]->insert(f.isCaseInsensitive(name)); - if (f.isAlias(name)) - res_columns[3]->insert(f.aliasTo(name)); - else + + if constexpr (std::is_same_v) + { + res_columns[2]->insert(false); res_columns[3]->insertDefault(); + } + else + { + res_columns[2]->insert(f.isCaseInsensitive(name)); + if (f.isAlias(name)) + res_columns[3]->insert(f.aliasTo(name)); + else + res_columns[3]->insertDefault(); + } + + res_columns[4]->insert(create_query); } } @@ -31,6 +43,7 @@ NamesAndTypesList StorageSystemFunctions::getNamesAndTypes() {"is_aggregate", std::make_shared()}, {"case_insensitive", std::make_shared()}, {"alias_to", std::make_shared()}, + {"create_query", std::make_shared()} }; } @@ -40,14 +53,22 @@ void StorageSystemFunctions::fillData(MutableColumns & res_columns, ContextPtr, const auto & function_names = functions_factory.getAllRegisteredNames(); for (const auto & function_name : function_names) { - fillRow(res_columns, function_name, UInt64(0), functions_factory); + fillRow(res_columns, function_name, UInt64(0), "", functions_factory); } const auto & aggregate_functions_factory = AggregateFunctionFactory::instance(); const auto & aggregate_function_names = aggregate_functions_factory.getAllRegisteredNames(); for (const auto & function_name : aggregate_function_names) { - fillRow(res_columns, function_name, UInt64(1), aggregate_functions_factory); + fillRow(res_columns, function_name, UInt64(1), "", aggregate_functions_factory); + } + + const auto & user_defined_functions_factory = UserDefinedFunctionFactory::instance(); + const auto & user_defined_functions_names = user_defined_functions_factory.getAllRegisteredNames(); + for (const auto & function_name : user_defined_functions_names) + { + auto create_query = queryToString(user_defined_functions_factory.get(function_name)); + fillRow(res_columns, function_name, UInt64(0), create_query, user_defined_functions_factory); } } } diff --git a/src/Storages/System/StorageSystemReplicas.cpp b/src/Storages/System/StorageSystemReplicas.cpp index 5c22d3c2fae..467226c3b7a 100644 --- a/src/Storages/System/StorageSystemReplicas.cpp +++ b/src/Storages/System/StorageSystemReplicas.cpp @@ -51,6 +51,7 @@ StorageSystemReplicas::StorageSystemReplicas(const StorageID & table_id_) { "absolute_delay", std::make_shared() }, { "total_replicas", std::make_shared() }, { "active_replicas", std::make_shared() }, + { "last_queue_update_exception", std::make_shared() }, { "zookeeper_exception", std::make_shared() }, { "replica_is_active", std::make_shared(std::make_shared(), std::make_shared()) } })); @@ -186,6 +187,7 @@ Pipe StorageSystemReplicas::read( res_columns[col_num++]->insert(status.absolute_delay); res_columns[col_num++]->insert(status.total_replicas); res_columns[col_num++]->insert(status.active_replicas); + res_columns[col_num++]->insert(status.last_queue_update_exception); res_columns[col_num++]->insert(status.zookeeper_exception); Map replica_is_active_values; diff --git a/src/Storages/System/StorageSystemZooKeeper.cpp b/src/Storages/System/StorageSystemZooKeeper.cpp index d19aef47616..cba10548852 100644 --- a/src/Storages/System/StorageSystemZooKeeper.cpp +++ b/src/Storages/System/StorageSystemZooKeeper.cpp @@ -97,12 +97,12 @@ static bool extractPathImpl(const IAST & elem, Paths & res, ContextPtr context) auto stream = interpreter_subquery->execute().getInputStream(); SizeLimits limites(context->getSettingsRef().max_rows_in_set, context->getSettingsRef().max_bytes_in_set, OverflowMode::THROW); Set set(limites, true, context->getSettingsRef().transform_null_in); - set.setHeader(stream->getHeader()); + set.setHeader(stream->getHeader().getColumnsWithTypeAndName()); stream->readPrefix(); while (Block block = stream->read()) { - set.insertFromBlock(block); + set.insertFromBlock(block.getColumnsWithTypeAndName()); } set.finishInsert(); stream->readSuffix(); diff --git a/src/Storages/examples/CMakeLists.txt b/src/Storages/examples/CMakeLists.txt index 59d44829363..103972a106f 100644 --- a/src/Storages/examples/CMakeLists.txt +++ b/src/Storages/examples/CMakeLists.txt @@ -22,11 +22,3 @@ target_link_libraries (transform_part_zk_nodes dbms string_utils ) - -if (ENABLE_FUZZING) - add_executable (mergetree_checksum_fuzzer mergetree_checksum_fuzzer.cpp) - target_link_libraries (mergetree_checksum_fuzzer PRIVATE dbms ${LIB_FUZZING_ENGINE}) - - add_executable (columns_description_fuzzer columns_description_fuzzer.cpp) - target_link_libraries (columns_description_fuzzer PRIVATE dbms ${LIB_FUZZING_ENGINE}) -endif () diff --git a/src/Storages/fuzzers/CMakeLists.txt b/src/Storages/fuzzers/CMakeLists.txt new file mode 100644 index 00000000000..d41e96868ad --- /dev/null +++ b/src/Storages/fuzzers/CMakeLists.txt @@ -0,0 +1,7 @@ + +add_executable (mergetree_checksum_fuzzer mergetree_checksum_fuzzer.cpp) +# Look at comment around fuzz_compression target declaration +target_link_libraries (mergetree_checksum_fuzzer PRIVATE dbms ${LIB_FUZZING_ENGINE}) + +add_executable (columns_description_fuzzer columns_description_fuzzer.cpp) +target_link_libraries (columns_description_fuzzer PRIVATE dbms ${LIB_FUZZING_ENGINE}) diff --git a/src/Storages/examples/columns_description_fuzzer.cpp b/src/Storages/fuzzers/columns_description_fuzzer.cpp similarity index 100% rename from src/Storages/examples/columns_description_fuzzer.cpp rename to src/Storages/fuzzers/columns_description_fuzzer.cpp diff --git a/src/Storages/examples/mergetree_checksum_fuzzer.cpp b/src/Storages/fuzzers/mergetree_checksum_fuzzer.cpp similarity index 100% rename from src/Storages/examples/mergetree_checksum_fuzzer.cpp rename to src/Storages/fuzzers/mergetree_checksum_fuzzer.cpp diff --git a/src/Storages/tests/gtest_storage_log.cpp b/src/Storages/tests/gtest_storage_log.cpp index 16902eafc98..b3ceef7e697 100644 --- a/src/Storages/tests/gtest_storage_log.cpp +++ b/src/Storages/tests/gtest_storage_log.cpp @@ -128,6 +128,7 @@ std::string readData(DB::StoragePtr & table, const DB::ContextPtr context) { ColumnWithTypeAndName col; col.type = std::make_shared(); + col.name = "a"; sample.insert(std::move(col)); } 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..568cc6171fd 100644 --- a/src/TableFunctions/TableFunctionPostgreSQL.cpp +++ b/src/TableFunctions/TableFunctionPostgreSQL.cpp @@ -37,8 +37,8 @@ StoragePtr TableFunctionPostgreSQL::executeImpl(const ASTPtr & /*ast_function*/, columns, ConstraintsDescription{}, String{}, - context, - remote_table_schema); + remote_table_schema, + on_conflict); result->startup(); return result; @@ -68,9 +68,9 @@ void TableFunctionPostgreSQL::parseArguments(const ASTPtr & ast_function, Contex ASTs & args = func_args.arguments->children; - if (args.size() < 5 || args.size() > 6) - throw Exception("Table function 'PostgreSQL' requires from 5 to 6 parameters: " - "PostgreSQL('host:port', 'database', 'table', 'user', 'password', [, 'schema']).", + if (args.size() < 5 || args.size() > 7) + throw Exception("Table function 'PostgreSQL' requires from 5 to 7 parameters: " + "PostgreSQL('host:port', 'database', 'table', 'user', 'password', [, 'schema', 'ON CONFLICT ...']).", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); for (auto & arg : args) @@ -83,8 +83,10 @@ void TableFunctionPostgreSQL::parseArguments(const ASTPtr & ast_function, Contex remote_table_name = args[2]->as().value.safeGet(); - if (args.size() == 6) + if (args.size() >= 6) remote_table_schema = args[5]->as().value.safeGet(); + if (args.size() >= 7) + on_conflict = args[6]->as().value.safeGet(); connection_pool = std::make_shared( args[1]->as().value.safeGet(), diff --git a/src/TableFunctions/TableFunctionPostgreSQL.h b/src/TableFunctions/TableFunctionPostgreSQL.h index c31d02fa955..e3810a0e391 100644 --- a/src/TableFunctions/TableFunctionPostgreSQL.h +++ b/src/TableFunctions/TableFunctionPostgreSQL.h @@ -28,7 +28,7 @@ private: void parseArguments(const ASTPtr & ast_function, ContextPtr context) override; String connection_str; - String remote_table_name, remote_table_schema; + String remote_table_name, remote_table_schema, on_conflict; postgres::PoolWithFailoverPtr connection_pool; }; diff --git a/tests/clickhouse-test b/tests/clickhouse-test index c627810a550..f3a41ba6a25 100755 --- a/tests/clickhouse-test +++ b/tests/clickhouse-test @@ -44,15 +44,17 @@ DISTRIBUTED_DDL_TIMEOUT_MSG = "is executing longer than distributed_ddl_task_tim MESSAGES_TO_RETRY = [ "DB::Exception: ZooKeeper session has been expired", - "DB::Exception: Connection loss", "Coordination::Exception: Session expired", "Coordination::Exception: Connection loss", "Coordination::Exception: Operation timeout", + "DB::Exception: Session expired", + "DB::Exception: Connection loss", "DB::Exception: Operation timeout", "Operation timed out", "ConnectionPoolWithFailover: Connection failed at try", "DB::Exception: New table appeared in database being dropped or detached. Try again", "is already started to be removing by another replica right now", + "DB::Exception: Cannot enqueue query", "Shutdown is called for table", # It happens in SYSTEM SYNC REPLICA query if session with ZooKeeper is being reinitialized. DISTRIBUTED_DDL_TIMEOUT_MSG # FIXME ] @@ -632,6 +634,7 @@ def run_tests_array(all_tests_with_params): open(stdout_file).read().split('\n')[:100]) status += '\n' + status += "\nstdout:\n{}\n".format(stdout) status += 'Database: ' + testcase_args.testcase_database elif stderr: @@ -641,6 +644,7 @@ def run_tests_array(all_tests_with_params): status += print_test_time(total_time) status += " - having stderror:\n{}\n".format( '\n'.join(stderr.split('\n')[:100])) + status += "\nstdout:\n{}\n".format(stdout) status += 'Database: ' + testcase_args.testcase_database elif 'Exception' in stdout: failures += 1 diff --git a/tests/config/config.d/database_replicated.xml b/tests/config/config.d/database_replicated.xml index 9a3b4d68ea6..e51d90dd4d4 100644 --- a/tests/config/config.d/database_replicated.xml +++ b/tests/config/config.d/database_replicated.xml @@ -22,9 +22,9 @@ 10000 30000 1000 - 2000 - 4000 - trace + 4000 + 5000 + information false 1000000000000000 diff --git a/tests/config/config.d/merge_tree.xml b/tests/config/config.d/merge_tree.xml new file mode 100644 index 00000000000..35af1fa65eb --- /dev/null +++ b/tests/config/config.d/merge_tree.xml @@ -0,0 +1,5 @@ + + + 8 + + diff --git a/tests/config/install.sh b/tests/config/install.sh index 571dff34018..e46ac62606b 100755 --- a/tests/config/install.sh +++ b/tests/config/install.sh @@ -31,6 +31,7 @@ ln -sf $SRC_PATH/config.d/max_concurrent_queries.xml $DEST_SERVER_PATH/config.d/ ln -sf $SRC_PATH/config.d/test_cluster_with_incorrect_pw.xml $DEST_SERVER_PATH/config.d/ ln -sf $SRC_PATH/config.d/keeper_port.xml $DEST_SERVER_PATH/config.d/ ln -sf $SRC_PATH/config.d/logging_no_rotate.xml $DEST_SERVER_PATH/config.d/ +ln -sf $SRC_PATH/config.d/merge_tree.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/ diff --git a/tests/integration/README.md b/tests/integration/README.md index 8c353658705..ed96eafdef8 100644 --- a/tests/integration/README.md +++ b/tests/integration/README.md @@ -38,7 +38,7 @@ sudo -H pip install \ pytest \ pytest-timeout \ redis \ - tzlocal \ + tzlocal==2.1 \ urllib3 \ requests-kerberos \ dict2xml \ diff --git a/tests/integration/ci-runner.py b/tests/integration/ci-runner.py index ecd4cb8d4e7..bf7549a83c4 100755 --- a/tests/integration/ci-runner.py +++ b/tests/integration/ci-runner.py @@ -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)) @@ -264,7 +264,7 @@ class ClickhouseIntegrationTestsRunner: out_file = "all_tests.txt" out_file_full = "all_tests_full.txt" cmd = "cd {repo_path}/tests/integration && " \ - "./runner --tmpfs {image_cmd} ' --setup-plan' " \ + "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) @@ -376,6 +376,24 @@ class ClickhouseIntegrationTestsRunner: 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": [], @@ -419,7 +437,7 @@ class ClickhouseIntegrationTestsRunner: 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 {} {} '-rfEp --run-id={} --color=no --durations=0 {}' | tee {}".format( + 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" @@ -507,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"])) @@ -583,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)) diff --git a/tests/integration/helpers/cluster.py b/tests/integration/helpers/cluster.py index 6fe01b5df03..9db4c85e36d 100644 --- a/tests/integration/helpers/cluster.py +++ b/tests/integration/helpers/cluster.py @@ -474,6 +474,11 @@ class ClickHouseCluster: cmd += " client" return cmd + def copy_file_from_container_to_container(self, src_node, src_path, dst_node, dst_path): + fname = os.path.basename(src_path) + run_and_check([f"docker cp {src_node.docker_id}:{src_path} {self.instances_dir}"], shell=True) + run_and_check([f"docker cp {self.instances_dir}/{fname} {dst_node.docker_id}:{dst_path}"], shell=True) + def setup_zookeeper_secure_cmd(self, instance, env_variables, docker_compose_yml_dir): logging.debug('Setup ZooKeeper Secure') zookeeper_docker_compose_path = p.join(docker_compose_yml_dir, 'docker_compose_zookeeper_secure.yml') @@ -1836,6 +1841,10 @@ class ClickHouseInstance: build_opts = self.query("SELECT value FROM system.build_options WHERE name = 'CXX_FLAGS'") return "-fsanitize={}".format(sanitizer_name) in build_opts + def is_debug_build(self): + build_opts = self.query("SELECT value FROM system.build_options WHERE name = 'CXX_FLAGS'") + return 'NDEBUG' not in build_opts + def is_built_with_thread_sanitizer(self): return self.is_built_with_sanitizer('thread') @@ -2024,6 +2033,37 @@ class ClickHouseInstance: return None return None + def restart_with_original_version(self, stop_start_wait_sec=300, callback_onstop=None, signal=15): + if not self.stay_alive: + raise Exception("Cannot restart not stay alive container") + self.exec_in_container(["bash", "-c", "pkill -{} clickhouse".format(signal)], user='root') + retries = int(stop_start_wait_sec / 0.5) + local_counter = 0 + # wait stop + while local_counter < retries: + if not self.get_process_pid("clickhouse server"): + break + time.sleep(0.5) + local_counter += 1 + + # force kill if server hangs + if self.get_process_pid("clickhouse server"): + # server can die before kill, so don't throw exception, it's expected + self.exec_in_container(["bash", "-c", "pkill -{} clickhouse".format(9)], nothrow=True, user='root') + + if callback_onstop: + callback_onstop(self) + self.exec_in_container( + ["bash", "-c", "cp /usr/share/clickhouse_original /usr/bin/clickhouse && chmod 777 /usr/bin/clickhouse"], + user='root') + self.exec_in_container(["bash", "-c", + "cp /usr/share/clickhouse-odbc-bridge_fresh /usr/bin/clickhouse-odbc-bridge && chmod 777 /usr/bin/clickhouse"], + user='root') + self.exec_in_container(["bash", "-c", "{} --daemon".format(self.clickhouse_start_command)], user=str(os.getuid())) + + # wait start + assert_eq_with_retry(self, "select 1", "1", retry_count=retries) + def restart_with_latest_version(self, stop_start_wait_sec=300, callback_onstop=None, signal=15): if not self.stay_alive: raise Exception("Cannot restart not stay alive container") @@ -2044,6 +2084,9 @@ class ClickHouseInstance: if callback_onstop: callback_onstop(self) + self.exec_in_container( + ["bash", "-c", "cp /usr/bin/clickhouse /usr/share/clickhouse_original"], + user='root') self.exec_in_container( ["bash", "-c", "cp /usr/share/clickhouse_fresh /usr/bin/clickhouse && chmod 777 /usr/bin/clickhouse"], user='root') diff --git a/tests/integration/test_access_for_functions/__init__.py b/tests/integration/test_access_for_functions/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/integration/test_access_for_functions/test.py b/tests/integration/test_access_for_functions/test.py new file mode 100644 index 00000000000..ebd0f6bd907 --- /dev/null +++ b/tests/integration/test_access_for_functions/test.py @@ -0,0 +1,39 @@ +import pytest +from helpers.cluster import ClickHouseCluster + +cluster = ClickHouseCluster(__file__) +instance = cluster.add_instance('instance') + + +@pytest.fixture(scope="module", autouse=True) +def started_cluster(): + try: + cluster.start() + yield cluster + + finally: + cluster.shutdown() + +def test_access_rights_for_funtion(): + create_function_query = "CREATE FUNCTION MySum AS (a, b) -> a + b" + + instance.query("CREATE USER A") + instance.query("CREATE USER B") + assert "it's necessary to have grant CREATE FUNCTION ON *.*" in instance.query_and_get_error(create_function_query, user = 'A') + + instance.query("GRANT CREATE FUNCTION on *.* TO A") + + instance.query(create_function_query, user = 'A') + assert instance.query("SELECT MySum(1, 2)") == "3\n" + + assert "it's necessary to have grant DROP FUNCTION ON *.*" in instance.query_and_get_error("DROP FUNCTION MySum", user = 'B') + + instance.query("GRANT DROP FUNCTION ON *.* TO B") + instance.query("DROP FUNCTION MySum", user = 'B') + assert "Unknown function MySum" in instance.query_and_get_error("SELECT MySum(1, 2)") + + instance.query("REVOKE CREATE FUNCTION ON *.* FROM A") + assert "it's necessary to have grant CREATE FUNCTION ON *.*" in instance.query_and_get_error(create_function_query, user = 'A') + + instance.query("DROP USER IF EXISTS A") + instance.query("DROP USER IF EXISTS B") diff --git a/tests/integration/test_alter_update_cast_keep_nullable/__init__.py b/tests/integration/test_alter_update_cast_keep_nullable/__init__.py new file mode 100644 index 00000000000..e69de29bb2d 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/integration/test_backup_restore_new/__init__.py b/tests/integration/test_backup_restore_new/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/integration/test_backup_restore_new/test.py b/tests/integration/test_backup_restore_new/test.py new file mode 100644 index 00000000000..472ecaf608b --- /dev/null +++ b/tests/integration/test_backup_restore_new/test.py @@ -0,0 +1,120 @@ +import pytest +import re +from helpers.cluster import ClickHouseCluster + +cluster = ClickHouseCluster(__file__) +instance = cluster.add_instance('instance') + + +def create_and_fill_table(): + instance.query("CREATE DATABASE test") + instance.query("CREATE TABLE test.table(x UInt32, y String) ENGINE=MergeTree ORDER BY y PARTITION BY x%10") + instance.query("INSERT INTO test.table SELECT number, toString(number) FROM numbers(100)") + + +@pytest.fixture(scope="module", autouse=True) +def start_cluster(): + try: + cluster.start() + yield cluster + finally: + cluster.shutdown() + + +@pytest.fixture(autouse=True) +def cleanup_after_test(): + try: + yield + finally: + instance.query("DROP DATABASE IF EXISTS test") + + +backup_id_counter = 0 +def new_backup_name(): + global backup_id_counter + backup_id_counter += 1 + return f"test-backup-{backup_id_counter}" + + +def test_restore_table(): + backup_name = new_backup_name() + create_and_fill_table() + + assert instance.query("SELECT count(), sum(x) FROM test.table") == "100\t4950\n" + instance.query(f"BACKUP TABLE test.table TO '{backup_name}'") + + instance.query("DROP TABLE test.table") + assert instance.query("EXISTS test.table") == "0\n" + + instance.query(f"RESTORE TABLE test.table FROM '{backup_name}'") + assert instance.query("SELECT count(), sum(x) FROM test.table") == "100\t4950\n" + + +def test_restore_table_into_existing_table(): + backup_name = new_backup_name() + create_and_fill_table() + + assert instance.query("SELECT count(), sum(x) FROM test.table") == "100\t4950\n" + instance.query(f"BACKUP TABLE test.table TO '{backup_name}'") + + instance.query(f"RESTORE TABLE test.table INTO test.table FROM '{backup_name}'") + assert instance.query("SELECT count(), sum(x) FROM test.table") == "200\t9900\n" + + instance.query(f"RESTORE TABLE test.table INTO test.table FROM '{backup_name}'") + assert instance.query("SELECT count(), sum(x) FROM test.table") == "300\t14850\n" + + +def test_restore_table_under_another_name(): + backup_name = new_backup_name() + create_and_fill_table() + + assert instance.query("SELECT count(), sum(x) FROM test.table") == "100\t4950\n" + instance.query(f"BACKUP TABLE test.table TO '{backup_name}'") + + assert instance.query("EXISTS test.table2") == "0\n" + + instance.query(f"RESTORE TABLE test.table INTO test.table2 FROM '{backup_name}'") + assert instance.query("SELECT count(), sum(x) FROM test.table2") == "100\t4950\n" + + +def test_backup_table_under_another_name(): + backup_name = new_backup_name() + create_and_fill_table() + + assert instance.query("SELECT count(), sum(x) FROM test.table") == "100\t4950\n" + instance.query(f"BACKUP TABLE test.table AS test.table2 TO '{backup_name}'") + + assert instance.query("EXISTS test.table2") == "0\n" + + instance.query(f"RESTORE TABLE test.table2 FROM '{backup_name}'") + assert instance.query("SELECT count(), sum(x) FROM test.table2") == "100\t4950\n" + + +def test_incremental_backup(): + backup_name = new_backup_name() + incremental_backup_name = new_backup_name() + create_and_fill_table() + + assert instance.query("SELECT count(), sum(x) FROM test.table") == "100\t4950\n" + instance.query(f"BACKUP TABLE test.table TO '{backup_name}'") + + instance.query("INSERT INTO test.table VALUES (65, 'a'), (66, 'b')") + + assert instance.query("SELECT count(), sum(x) FROM test.table") == "102\t5081\n" + instance.query(f"BACKUP TABLE test.table TO '{incremental_backup_name}' SETTINGS base_backup = '{backup_name}'") + + instance.query(f"RESTORE TABLE test.table AS test.table2 FROM '{incremental_backup_name}'") + assert instance.query("SELECT count(), sum(x) FROM test.table2") == "102\t5081\n" + + +def test_backup_not_found_or_already_exists(): + backup_name = new_backup_name() + + expected_error = "Backup .* not found" + assert re.search(expected_error, instance.query_and_get_error(f"RESTORE TABLE test.table AS test.table2 FROM '{backup_name}'")) + + create_and_fill_table() + instance.query(f"BACKUP TABLE test.table TO '{backup_name}'") + + expected_error = "Backup .* already exists" + assert re.search(expected_error, instance.query_and_get_error(f"BACKUP TABLE test.table TO '{backup_name}'")) diff --git a/tests/integration/test_backward_compatibility/test_aggregate_function_state_avg.py b/tests/integration/test_backward_compatibility/test_aggregate_function_state_avg.py index 5ed97e7a9a5..feaf96c439d 100644 --- a/tests/integration/test_backward_compatibility/test_aggregate_function_state_avg.py +++ b/tests/integration/test_backward_compatibility/test_aggregate_function_state_avg.py @@ -53,3 +53,9 @@ def test_backward_compatability(start_cluster): node1.restart_with_latest_version() assert (node1.query("SELECT avgMerge(x) FROM state") == '2.5\n') + + node1.query("drop table tab") + node1.query("drop table state") + node2.query("drop table tab") + node3.query("drop table tab") + node4.query("drop table tab") \ No newline at end of file diff --git a/tests/integration/test_backward_compatibility/test_data_skipping_indices.py b/tests/integration/test_backward_compatibility/test_data_skipping_indices.py index 45b85897798..db6a3eb7a08 100644 --- a/tests/integration/test_backward_compatibility/test_data_skipping_indices.py +++ b/tests/integration/test_backward_compatibility/test_data_skipping_indices.py @@ -5,7 +5,7 @@ import pytest from helpers.cluster import ClickHouseCluster -cluster = ClickHouseCluster(__file__) +cluster = ClickHouseCluster(__file__, name="skipping_indices") node = cluster.add_instance('node', image='yandex/clickhouse-server', tag='21.6', stay_alive=True, with_installed_binary=True) @@ -41,4 +41,4 @@ def test_index(start_cluster): 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; - """) + """) \ No newline at end of file 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 7c20b3c2476..abebaaea8b8 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 @@ -30,3 +30,7 @@ def test_detach_part_wrong_partition_id(start_cluster): num_detached = node_21_6.query("select count() from system.detached_parts") assert num_detached == '1\n' + + node_21_6.restart_with_original_version() + + node_21_6.query("drop table tab SYNC") 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 index b3f5c68cf68..9a7c7f73eb5 100644 --- a/tests/integration/test_backward_compatibility/test_select_aggregate_alias_column.py +++ b/tests/integration/test_backward_compatibility/test_select_aggregate_alias_column.py @@ -27,3 +27,6 @@ def test_select_aggregate_alias_column(start_cluster): 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)") + + node1.query("drop table tab") + node2.query("drop table tab") \ No newline at end of file diff --git a/tests/integration/test_backward_compatibility/test_short_strings_aggregation.py b/tests/integration/test_backward_compatibility/test_short_strings_aggregation.py index 463fadc36e8..54dd53c344e 100644 --- a/tests/integration/test_backward_compatibility/test_short_strings_aggregation.py +++ b/tests/integration/test_backward_compatibility/test_short_strings_aggregation.py @@ -29,3 +29,5 @@ def test_backward_compatability(start_cluster): "select s, count() from remote('node{1,2}', default, tab) group by s order by toUInt64(s) limit 50") print(res) assert res == ''.join('{}\t2\n'.format(i) for i in range(50)) + node1.query("drop table tab") + node2.query("drop table tab") 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
- --> - id + key UInt32 @@ -65,10 +65,10 @@ id - UInt32 + - id + key UInt32 diff --git a/tests/integration/test_dictionaries_postgresql/test.py b/tests/integration/test_dictionaries_postgresql/test.py index 6eb4a04ed2c..58a503bd571 100644 --- a/tests/integration/test_dictionaries_postgresql/test.py +++ b/tests/integration/test_dictionaries_postgresql/test.py @@ -13,11 +13,11 @@ node1 = cluster.add_instance('node1', postgres_dict_table_template = """ CREATE TABLE IF NOT EXISTS {} ( - id Integer NOT NULL, value Integer NOT NULL, PRIMARY KEY (id)) + id Integer NOT NULL, key Integer NOT NULL, value Integer NOT NULL, PRIMARY KEY (id)) """ click_dict_table_template = """ CREATE TABLE IF NOT EXISTS `test`.`dict_table_{}` ( - `id` UInt64, `value` UInt32 + `key` UInt32, `value` UInt32 ) ENGINE = Dictionary({}) """ @@ -43,7 +43,7 @@ def create_and_fill_postgres_table(cursor, table_name, port, host): create_postgres_table(cursor, table_name) # Fill postgres table using clickhouse postgres table function and check table_func = '''postgresql('{}:{}', 'clickhouse', '{}', 'postgres', 'mysecretpassword')'''.format(host, port, table_name) - node1.query('''INSERT INTO TABLE FUNCTION {} SELECT number, number from numbers(10000) + node1.query('''INSERT INTO TABLE FUNCTION {} SELECT number, number, number from numbers(10000) '''.format(table_func, table_name)) result = node1.query("SELECT count() FROM {}".format(table_func)) assert result.rstrip() == '10000' @@ -82,7 +82,7 @@ def test_load_dictionaries(started_cluster): node1.query("SYSTEM RELOAD DICTIONARY {}".format(dict_name)) assert node1.query("SELECT count() FROM `test`.`dict_table_{}`".format(table_name)).rstrip() == '10000' - assert node1.query("SELECT dictGetUInt32('{}', 'id', toUInt64(0))".format(dict_name)) == '0\n' + assert node1.query("SELECT dictGetUInt32('{}', 'key', toUInt64(0))".format(dict_name)) == '0\n' assert node1.query("SELECT dictGetUInt32('{}', 'value', toUInt64(9999))".format(dict_name)) == '9999\n' cursor.execute("DROP TABLE IF EXISTS {}".format(table_name)) @@ -252,11 +252,11 @@ def test_dictionary_with_replicas(started_cluster): create_postgres_table(cursor1, 'test1') create_postgres_table(cursor2, 'test1') - cursor1.execute('INSERT INTO test1 select i, i from generate_series(0, 99) as t(i);'); - cursor2.execute('INSERT INTO test1 select i, i from generate_series(100, 199) as t(i);'); + cursor1.execute('INSERT INTO test1 select i, i, i from generate_series(0, 99) as t(i);') + cursor2.execute('INSERT INTO test1 select i, i, i from generate_series(100, 199) as t(i);') create_dict('test1', 1) - result = node1.query("SELECT * FROM `test`.`dict_table_test1` ORDER BY id") + result = node1.query("SELECT * FROM `test`.`dict_table_test1` ORDER BY key") # priority 0 - non running port assert node1.contains_in_log('PostgreSQLConnectionPool: Connection error*') diff --git a/tests/integration/test_distributed_respect_user_timeouts/test.py b/tests/integration/test_distributed_respect_user_timeouts/test.py index d8eb92d96b5..03c85a82c90 100644 --- a/tests/integration/test_distributed_respect_user_timeouts/test.py +++ b/tests/integration/test_distributed_respect_user_timeouts/test.py @@ -3,6 +3,7 @@ import os.path import timeit import pytest +import logging from helpers.cluster import ClickHouseCluster from helpers.network import PartitionManager from helpers.test_tools import TSV @@ -11,6 +12,8 @@ cluster = ClickHouseCluster(__file__) NODES = {'node' + str(i): None for i in (1, 2)} +IS_DEBUG = False + CREATE_TABLES_SQL = ''' CREATE DATABASE test; @@ -104,6 +107,11 @@ def started_cluster(request): try: cluster.start() + if cluster.instances["node1"].is_debug_build(): + global IS_DEBUG + IS_DEBUG = True + logging.warning("Debug build is too slow to show difference in timings. We disable checks.") + for node_id, node in list(NODES.items()): node.query(CREATE_TABLES_SQL) node.query(INSERT_SQL_TEMPLATE.format(node_id=node_id)) @@ -133,8 +141,9 @@ def _check_timeout_and_exception(node, user, query_base, query): # And it should timeout no faster than: measured_timeout = timeit.default_timer() - start - assert expected_timeout - measured_timeout <= TIMEOUT_MEASUREMENT_EPS - assert measured_timeout - expected_timeout <= TIMEOUT_DIFF_UPPER_BOUND[user][query_base] + if not IS_DEBUG: + assert expected_timeout - measured_timeout <= TIMEOUT_MEASUREMENT_EPS + assert measured_timeout - expected_timeout <= TIMEOUT_DIFF_UPPER_BOUND[user][query_base] # And exception should reflect connection attempts: _check_exception(exception, repeats) diff --git a/tests/integration/test_grant_and_revoke/test.py b/tests/integration/test_grant_and_revoke/test.py index a63d6f136af..79fe4bf9f41 100644 --- a/tests/integration/test_grant_and_revoke/test.py +++ b/tests/integration/test_grant_and_revoke/test.py @@ -282,3 +282,36 @@ def test_current_database(): instance.query("CREATE TABLE default.table(x UInt32, y UInt32) ENGINE = MergeTree ORDER BY tuple()") assert "Not enough privileges" in instance.query_and_get_error("SELECT * FROM table", user='A') + + +def test_grant_with_replace_option(): + instance.query("CREATE USER A") + instance.query('GRANT SELECT ON test.table TO A') + assert instance.query("SHOW GRANTS FOR A") == TSV(["GRANT SELECT ON test.table TO A"]) + + instance.query('GRANT INSERT ON test.table TO A WITH REPLACE OPTION') + assert instance.query("SHOW GRANTS FOR A") == TSV(["GRANT INSERT ON test.table TO A"]) + + instance.query('GRANT NONE ON *.* TO A WITH REPLACE OPTION') + assert instance.query("SHOW GRANTS FOR A") == TSV([]) + + instance.query('CREATE USER B') + instance.query('GRANT SELECT ON test.table TO B') + assert instance.query("SHOW GRANTS FOR A") == TSV([]) + assert instance.query("SHOW GRANTS FOR B") == TSV(["GRANT SELECT ON test.table TO B"]) + + expected_error = "it's necessary to have grant INSERT ON test.table WITH GRANT OPTION" + assert expected_error in instance.query_and_get_error("GRANT INSERT ON test.table TO B WITH REPLACE OPTION", user='A') + assert instance.query("SHOW GRANTS FOR A") == TSV([]) + assert instance.query("SHOW GRANTS FOR B") == TSV(["GRANT SELECT ON test.table TO B"]) + + instance.query("GRANT INSERT ON test.table TO A WITH GRANT OPTION") + expected_error = "it's necessary to have grant SELECT ON test.table WITH GRANT OPTION" + assert expected_error in instance.query_and_get_error("GRANT INSERT ON test.table TO B WITH REPLACE OPTION", user='A') + assert instance.query("SHOW GRANTS FOR A") == TSV(["GRANT INSERT ON test.table TO A WITH GRANT OPTION"]) + assert instance.query("SHOW GRANTS FOR B") == TSV(["GRANT SELECT ON test.table TO B"]) + + instance.query("GRANT SELECT ON test.table TO A WITH GRANT OPTION") + instance.query("GRANT INSERT ON test.table TO B WITH REPLACE OPTION", user='A') + assert instance.query("SHOW GRANTS FOR A") == TSV(["GRANT SELECT, INSERT ON test.table TO A WITH GRANT OPTION"]) + assert instance.query("SHOW GRANTS FOR B") == TSV(["GRANT INSERT ON test.table TO B"]) diff --git a/tests/integration/test_keeper_back_to_back/test.py b/tests/integration/test_keeper_back_to_back/test.py index 41c270e05e8..64f2f42d71e 100644 --- a/tests/integration/test_keeper_back_to_back/test.py +++ b/tests/integration/test_keeper_back_to_back/test.py @@ -90,6 +90,46 @@ def test_sequential_nodes(started_cluster): genuine_childs = list(sorted(genuine_zk.get_children("/test_sequential_nodes"))) fake_childs = list(sorted(fake_zk.get_children("/test_sequential_nodes"))) assert genuine_childs == fake_childs + + genuine_zk.create("/test_sequential_nodes_1") + fake_zk.create("/test_sequential_nodes_1") + + genuine_zk.create("/test_sequential_nodes_1/a", sequence=True) + fake_zk.create("/test_sequential_nodes_1/a", sequence=True) + + genuine_zk.create("/test_sequential_nodes_1/a0000000002") + fake_zk.create("/test_sequential_nodes_1/a0000000002") + + genuine_throw = False + fake_throw = False + try: + genuine_zk.create("/test_sequential_nodes_1/a", sequence=True) + except Exception as ex: + genuine_throw = True + + try: + fake_zk.create("/test_sequential_nodes_1/a", sequence=True) + except Exception as ex: + fake_throw = True + + assert genuine_throw == True + assert fake_throw == True + + genuine_childs_1 = list(sorted(genuine_zk.get_children("/test_sequential_nodes_1"))) + fake_childs_1 = list(sorted(fake_zk.get_children("/test_sequential_nodes_1"))) + assert genuine_childs_1 == fake_childs_1 + + genuine_zk.create("/test_sequential_nodes_2") + fake_zk.create("/test_sequential_nodes_2") + + genuine_zk.create("/test_sequential_nodes_2/node") + fake_zk.create("/test_sequential_nodes_2/node") + genuine_zk.create("/test_sequential_nodes_2/node", sequence=True) + fake_zk.create("/test_sequential_nodes_2/node", sequence=True) + + genuine_childs_2 = list(sorted(genuine_zk.get_children("/test_sequential_nodes_2"))) + fake_childs_2 = list(sorted(fake_zk.get_children("/test_sequential_nodes_2"))) + assert genuine_childs_2 == fake_childs_2 finally: for zk in [genuine_zk, fake_zk]: stop_zk(zk) diff --git a/tests/integration/test_keeper_snapshot_small_distance/__init__.py b/tests/integration/test_keeper_snapshot_small_distance/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/integration/test_keeper_snapshot_small_distance/configs/keeper_config1.xml b/tests/integration/test_keeper_snapshot_small_distance/configs/keeper_config1.xml new file mode 100644 index 00000000000..b3c010fed24 --- /dev/null +++ b/tests/integration/test_keeper_snapshot_small_distance/configs/keeper_config1.xml @@ -0,0 +1,37 @@ + + + 9181 + 1 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + + 75 + 5 + 5000 + 10000 + trace + + + + + 1 + node1 + 44444 + 3 + + + 2 + node2 + 44444 + 2 + + + 3 + node3 + 44444 + 1 + + + + diff --git a/tests/integration/test_keeper_snapshot_small_distance/configs/keeper_config2.xml b/tests/integration/test_keeper_snapshot_small_distance/configs/keeper_config2.xml new file mode 100644 index 00000000000..f2de2c96f06 --- /dev/null +++ b/tests/integration/test_keeper_snapshot_small_distance/configs/keeper_config2.xml @@ -0,0 +1,37 @@ + + + 9181 + 2 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + + 75 + 5 + 5000 + 10000 + trace + + + + + 1 + node1 + 44444 + 3 + + + 2 + node2 + 44444 + 2 + + + 3 + node3 + 44444 + 1 + + + + diff --git a/tests/integration/test_keeper_snapshot_small_distance/configs/keeper_config3.xml b/tests/integration/test_keeper_snapshot_small_distance/configs/keeper_config3.xml new file mode 100644 index 00000000000..609c9045259 --- /dev/null +++ b/tests/integration/test_keeper_snapshot_small_distance/configs/keeper_config3.xml @@ -0,0 +1,37 @@ + + + 9181 + 3 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + + 75 + 5 + 5000 + 10000 + trace + + + + + 1 + node1 + 44444 + 3 + + + 2 + node2 + 44444 + 2 + + + 3 + node3 + 44444 + 1 + + + + diff --git a/tests/integration/test_keeper_snapshot_small_distance/configs/logs_conf.xml b/tests/integration/test_keeper_snapshot_small_distance/configs/logs_conf.xml new file mode 100644 index 00000000000..318a6bca95d --- /dev/null +++ b/tests/integration/test_keeper_snapshot_small_distance/configs/logs_conf.xml @@ -0,0 +1,12 @@ + + 3 + + trace + /var/log/clickhouse-server/log.log + /var/log/clickhouse-server/log.err.log + 1000M + 10 + /var/log/clickhouse-server/stderr.log + /var/log/clickhouse-server/stdout.log + + diff --git a/tests/integration/test_keeper_snapshot_small_distance/test.py b/tests/integration/test_keeper_snapshot_small_distance/test.py new file mode 100644 index 00000000000..4acd76806b4 --- /dev/null +++ b/tests/integration/test_keeper_snapshot_small_distance/test.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python3 +##!/usr/bin/env python3 +import pytest +from helpers.cluster import ClickHouseCluster +from multiprocessing.dummy import Pool +from kazoo.client import KazooClient, KazooState +import random +import string +import os +import time + +cluster = ClickHouseCluster(__file__) +node1 = cluster.add_instance('node1', main_configs=['configs/keeper_config1.xml'], stay_alive=True) +node2 = cluster.add_instance('node2', main_configs=['configs/keeper_config2.xml'], stay_alive=True) +node3 = cluster.add_instance('node3', main_configs=['configs/keeper_config3.xml'], stay_alive=True) + +def start_zookeeper(node): + node1.exec_in_container(['bash', '-c', '/opt/zookeeper/bin/zkServer.sh start']) + +def stop_zookeeper(node): + node.exec_in_container(['bash', '-c', '/opt/zookeeper/bin/zkServer.sh stop']) + +def clear_zookeeper(node): + node.exec_in_container(['bash', '-c', 'rm -fr /zookeeper/*']) + +def restart_and_clear_zookeeper(node): + stop_zookeeper(node) + clear_zookeeper(node) + start_zookeeper(node) + +def clear_clickhouse_data(node): + node.exec_in_container(['bash', '-c', 'rm -fr /var/lib/clickhouse/coordination/logs/* /var/lib/clickhouse/coordination/snapshots/*']) + +def convert_zookeeper_data(node): + cmd = '/usr/bin/clickhouse keeper-converter --zookeeper-logs-dir /zookeeper/version-2/ --zookeeper-snapshots-dir /zookeeper/version-2/ --output-dir /var/lib/clickhouse/coordination/snapshots' + node.exec_in_container(['bash', '-c', cmd]) + return os.path.join('/var/lib/clickhouse/coordination/snapshots', node.exec_in_container(['bash', '-c', 'ls /var/lib/clickhouse/coordination/snapshots']).strip()) + +def stop_clickhouse(node): + node.stop_clickhouse() + +def start_clickhouse(node): + node.start_clickhouse() + +def copy_zookeeper_data(make_zk_snapshots, node): + stop_zookeeper(node) + + if make_zk_snapshots: # force zookeeper to create snapshot + start_zookeeper(node) + stop_zookeeper(node) + + stop_clickhouse(node) + clear_clickhouse_data(node) + convert_zookeeper_data(node) + start_zookeeper(node) + start_clickhouse(node) + + +@pytest.fixture(scope="module") +def started_cluster(): + try: + cluster.start() + + yield cluster + + finally: + cluster.shutdown() + +def get_fake_zk(node, timeout=30.0): + _fake_zk_instance = KazooClient(hosts=cluster.get_instance_ip(node.name) + ":9181", timeout=timeout) + _fake_zk_instance.start() + return _fake_zk_instance + +def get_genuine_zk(node, timeout=30.0): + _genuine_zk_instance = KazooClient(hosts=cluster.get_instance_ip(node.name) + ":2181", timeout=timeout) + _genuine_zk_instance.start() + return _genuine_zk_instance + + +def test_snapshot_and_load(started_cluster): + restart_and_clear_zookeeper(node1) + genuine_connection = get_genuine_zk(node1) + for node in [node1, node2, node3]: + print("Stop and clear", node.name, "with dockerid", node.docker_id) + stop_clickhouse(node) + clear_clickhouse_data(node) + + for i in range(1000): + genuine_connection.create("/test" + str(i), b"data") + + print("Data loaded to zookeeper") + + stop_zookeeper(node1) + start_zookeeper(node1) + stop_zookeeper(node1) + + print("Data copied to node1") + resulted_path = convert_zookeeper_data(node1) + print("Resulted path", resulted_path) + for node in [node2, node3]: + print("Copy snapshot from", node1.name, "to", node.name) + cluster.copy_file_from_container_to_container(node1, resulted_path, node, '/var/lib/clickhouse/coordination/snapshots') + + print("Starting clickhouses") + + p = Pool(3) + result = p.map_async(start_clickhouse, [node1, node2, node3]) + result.wait() + + print("Loading additional data") + fake_zks = [get_fake_zk(node) for node in [node1, node2, node3]] + for i in range(1000): + fake_zk = random.choice(fake_zks) + try: + fake_zk.create("/test" + str(i + 1000), b"data") + except Exception as ex: + print("Got exception:" + str(ex)) + + print("Final") + fake_zks[0].create("/test10000", b"data") diff --git a/tests/integration/test_library_bridge/test.py b/tests/integration/test_library_bridge/test.py index 97b2ccfbdbe..12a967ebaa4 100644 --- a/tests/integration/test_library_bridge/test.py +++ b/tests/integration/test_library_bridge/test.py @@ -44,6 +44,11 @@ def ch_cluster(): '/usr/bin/g++ -shared -o /etc/clickhouse-server/config.d/dictionaries_lib/dict_lib.so -fPIC /etc/clickhouse-server/config.d/dictionaries_lib/dict_lib.cpp'], user='root') + instance.exec_in_container( + ['bash', '-c', + '/usr/bin/g++ -shared -o /dict_lib_copy.so -fPIC /etc/clickhouse-server/config.d/dictionaries_lib/dict_lib.cpp'], user='root') + instance.exec_in_container(['bash', '-c', 'ln -s /dict_lib_copy.so /etc/clickhouse-server/config.d/dictionaries_lib/dict_lib_symlink.so']) + yield cluster finally: @@ -59,6 +64,7 @@ def test_load_all(ch_cluster): if instance.is_built_with_memory_sanitizer(): pytest.skip("Memory Sanitizer cannot work with third-party shared libraries") + instance.query('DROP DICTIONARY IF EXISTS lib_dict') instance.query(''' CREATE DICTIONARY lib_dict (key UInt64, value1 UInt64, value2 UInt64, value3 UInt64) PRIMARY KEY key @@ -128,6 +134,7 @@ def test_load_keys(ch_cluster): if instance.is_built_with_memory_sanitizer(): pytest.skip("Memory Sanitizer cannot work with third-party shared libraries") + instance.query('DROP DICTIONARY IF EXISTS lib_dict_ckc') instance.query(''' CREATE DICTIONARY lib_dict_ckc (key UInt64, value1 UInt64, value2 UInt64, value3 UInt64) PRIMARY KEY key @@ -148,6 +155,7 @@ def test_load_all_many_rows(ch_cluster): pytest.skip("Memory Sanitizer cannot work with third-party shared libraries") num_rows = [1000, 10000, 100000, 1000000] + instance.query('DROP DICTIONARY IF EXISTS lib_dict') for num in num_rows: instance.query(''' CREATE DICTIONARY lib_dict (key UInt64, value1 UInt64, value2 UInt64, value3 UInt64) @@ -267,6 +275,42 @@ def test_bridge_dies_with_parent(ch_cluster): instance.query('DROP DICTIONARY lib_dict_c') +def test_path_validation(ch_cluster): + if instance.is_built_with_memory_sanitizer(): + pytest.skip("Memory Sanitizer cannot work with third-party shared libraries") + + instance.query('DROP DICTIONARY IF EXISTS lib_dict_c') + instance.query(''' + CREATE DICTIONARY lib_dict_c (key UInt64, value1 UInt64, value2 UInt64, value3 UInt64) + PRIMARY KEY key SOURCE(library(PATH '/etc/clickhouse-server/config.d/dictionaries_lib/dict_lib_symlink.so')) + LAYOUT(CACHE( + SIZE_IN_CELLS 10000000 + BLOCK_SIZE 4096 + FILE_SIZE 16777216 + READ_BUFFER_SIZE 1048576 + MAX_STORED_KEYS 1048576)) + LIFETIME(2) ; + ''') + + result = instance.query('''select dictGet(lib_dict_c, 'value1', toUInt64(1));''') + assert(result.strip() == '101') + + instance.query('DROP DICTIONARY IF EXISTS lib_dict_c') + instance.query(''' + CREATE DICTIONARY lib_dict_c (key UInt64, value1 UInt64, value2 UInt64, value3 UInt64) + PRIMARY KEY key SOURCE(library(PATH '/etc/clickhouse-server/config.d/dictionaries_lib/../../../../dict_lib_copy.so')) + LAYOUT(CACHE( + SIZE_IN_CELLS 10000000 + BLOCK_SIZE 4096 + FILE_SIZE 16777216 + READ_BUFFER_SIZE 1048576 + MAX_STORED_KEYS 1048576)) + LIFETIME(2) ; + ''') + result = instance.query_and_get_error('''select dictGet(lib_dict_c, 'value1', toUInt64(1));''') + assert('DB::Exception: File path /etc/clickhouse-server/config.d/dictionaries_lib/../../../../dict_lib_copy.so is not inside /etc/clickhouse-server/config.d/dictionaries_lib' in result) + + if __name__ == '__main__': cluster.start() input("Cluster created, press any key to destroy...") diff --git a/tests/integration/test_merge_tree_s3/configs/config.d/storage_conf.xml b/tests/integration/test_merge_tree_s3/configs/config.d/storage_conf.xml index 2d9778af32a..fdb5fb69e98 100644 --- a/tests/integration/test_merge_tree_s3/configs/config.d/storage_conf.xml +++ b/tests/integration/test_merge_tree_s3/configs/config.d/storage_conf.xml @@ -8,6 +8,13 @@ minio123 33554432 + + s3 + http://resolver:8081/root/data/ + minio + minio123 + 10 + local / @@ -24,6 +31,13 @@ + + +
+ unstable_s3 +
+
+
diff --git a/tests/integration/test_merge_tree_s3/s3_mocks/unstable_proxy.py b/tests/integration/test_merge_tree_s3/s3_mocks/unstable_proxy.py new file mode 100644 index 00000000000..1f8fcc4bbfd --- /dev/null +++ b/tests/integration/test_merge_tree_s3/s3_mocks/unstable_proxy.py @@ -0,0 +1,64 @@ +import http.client +import http.server +import random +import socketserver +import sys +import urllib.parse + + +UPSTREAM_HOST = "minio1:9001" +random.seed("Unstable proxy/1.0") + + +def request(command, url, headers={}, data=None): + """ Mini-requests. """ + class Dummy: + pass + + parts = urllib.parse.urlparse(url) + c = http.client.HTTPConnection(parts.hostname, parts.port) + c.request(command, urllib.parse.urlunparse(parts._replace(scheme='', netloc='')), headers=headers, body=data) + r = c.getresponse() + result = Dummy() + result.status_code = r.status + result.headers = r.headers + result.content = r.read() + return result + + +class RequestHandler(http.server.BaseHTTPRequestHandler): + def do_GET(self): + if self.path == "/": + self.send_response(200) + self.send_header("Content-Type", "text/plain") + self.end_headers() + self.wfile.write(b"OK") + else: + self.do_HEAD() + + def do_PUT(self): + self.do_HEAD() + + def do_POST(self): + self.do_HEAD() + + def do_HEAD(self): + content_length = self.headers.get("Content-Length") + data = self.rfile.read(int(content_length)) if content_length else None + r = request(self.command, f"http://{UPSTREAM_HOST}{self.path}", headers=self.headers, data=data) + self.send_response(r.status_code) + for k, v in r.headers.items(): + self.send_header(k, v) + self.end_headers() + if random.random() < 0.25 and len(r.content) > 1024*1024: + r.content = r.content[:len(r.content)//2] + self.wfile.write(r.content) + self.wfile.close() + + +class ThreadedHTTPServer(socketserver.ThreadingMixIn, http.server.HTTPServer): + """Handle requests in a separate thread.""" + + +httpd = ThreadedHTTPServer(("0.0.0.0", int(sys.argv[1])), RequestHandler) +httpd.serve_forever() diff --git a/tests/integration/test_merge_tree_s3/test.py b/tests/integration/test_merge_tree_s3/test.py index 41f59e0cbb4..be97b538ea3 100644 --- a/tests/integration/test_merge_tree_s3/test.py +++ b/tests/integration/test_merge_tree_s3/test.py @@ -54,6 +54,7 @@ def cluster(): logging.info("Starting cluster...") cluster.start() logging.info("Cluster started") + run_s3_mocks(cluster) yield cluster finally: @@ -77,11 +78,17 @@ def generate_values(date_str, count, sign=1): return ",".join(["('{}',{},'{}')".format(x, y, z) for x, y, z in data]) -def create_table(cluster, table_name, additional_settings=None): +def create_table(cluster, table_name, **additional_settings): node = cluster.instances["node"] + settings = { + "storage_policy": "s3", + "old_parts_lifetime": 0, + "index_granularity": 512 + } + settings.update(additional_settings) - create_table_statement = """ - CREATE TABLE {} ( + create_table_statement = f""" + CREATE TABLE {table_name} ( dt Date, id Int64, data String, @@ -89,19 +96,40 @@ def create_table(cluster, table_name, additional_settings=None): ) ENGINE=MergeTree() PARTITION BY dt ORDER BY (dt, id) - SETTINGS - storage_policy='s3', - old_parts_lifetime=0, - index_granularity=512 - """.format(table_name) - - if additional_settings: - create_table_statement += "," - create_table_statement += additional_settings + SETTINGS {",".join((k+"="+repr(v) for k, v in settings.items()))}""" node.query(create_table_statement) +def run_s3_mocks(cluster): + logging.info("Starting s3 mocks") + mocks = ( + ("unstable_proxy.py", "resolver", "8081"), + ) + for mock_filename, container, port in mocks: + container_id = cluster.get_container_id(container) + current_dir = os.path.dirname(__file__) + cluster.copy_file_to_container(container_id, os.path.join(current_dir, "s3_mocks", mock_filename), mock_filename) + cluster.exec_in_container(container_id, ["python", mock_filename, port], detach=True) + + # Wait for S3 mocks to start + for mock_filename, container, port in mocks: + num_attempts = 100 + for attempt in range(num_attempts): + ping_response = cluster.exec_in_container(cluster.get_container_id(container), + ["curl", "-s", f"http://localhost:{port}/"], nothrow=True) + if ping_response != "OK": + if attempt == num_attempts - 1: + assert ping_response == "OK", f'Expected "OK", but got "{ping_response}"' + else: + time.sleep(1) + else: + logging.debug(f"mock {mock_filename} ({port}) answered {ping_response} on attempt {attempt}") + break + + logging.info("S3 mocks started") + + def wait_for_delete_s3_objects(cluster, expected, timeout=30): minio = cluster.minio_client while timeout > 0: @@ -136,7 +164,7 @@ def drop_table(cluster): ] ) def test_simple_insert_select(cluster, min_rows_for_wide_part, files_per_part): - create_table(cluster, "s3_test", additional_settings="min_rows_for_wide_part={}".format(min_rows_for_wide_part)) + create_table(cluster, "s3_test", min_rows_for_wide_part=min_rows_for_wide_part) node = cluster.instances["node"] minio = cluster.minio_client @@ -158,13 +186,12 @@ def test_simple_insert_select(cluster, min_rows_for_wide_part, files_per_part): "merge_vertical", [False, True] ) def test_insert_same_partition_and_merge(cluster, merge_vertical): - settings = None + settings = {} if merge_vertical: - settings = """ - vertical_merge_algorithm_min_rows_to_activate=0, - vertical_merge_algorithm_min_columns_to_activate=0 - """ - create_table(cluster, "s3_test", additional_settings=settings) + settings['vertical_merge_algorithm_min_rows_to_activate'] = 0 + settings['vertical_merge_algorithm_min_columns_to_activate'] = 0 + + create_table(cluster, "s3_test", **settings) node = cluster.instances["node"] minio = cluster.minio_client @@ -459,3 +486,13 @@ def test_s3_disk_restart_during_load(cluster): for thread in threads: thread.join() + + +def test_s3_disk_reads_on_unstable_connection(cluster): + create_table(cluster, "s3_test", storage_policy='unstable_s3') + node = cluster.instances["node"] + node.query("INSERT INTO s3_test SELECT today(), *, toString(*) FROM system.numbers LIMIT 9000000") + for i in range(30): + print(f"Read sequence {i}") + assert node.query("SELECT sum(id) FROM s3_test").splitlines() == ["40499995500000"] + diff --git a/tests/integration/test_multiple_disks/test.py b/tests/integration/test_multiple_disks/test.py index 69ce3da17ac..db541edde9c 100644 --- a/tests/integration/test_multiple_disks/test.py +++ b/tests/integration/test_multiple_disks/test.py @@ -1265,8 +1265,14 @@ def test_kill_while_insert(start_cluster): disks = get_used_disks_for_table(node1, name) assert set(disks) == {"jbod1"} + def ignore_exceptions(f, *args): + try: + f(*args) + except: + """(っಠ‿ಠ)っ""" + start_time = time.time() - long_select = threading.Thread(target=node1.query, args=("SELECT sleep(3) FROM {name}".format(name=name),)) + long_select = threading.Thread(target=ignore_exceptions, args=(node1.query, "SELECT sleep(3) FROM {name}".format(name=name))) long_select.start() time.sleep(0.5) diff --git a/tests/integration/test_mysql_database_engine/configs/users.xml b/tests/integration/test_mysql_database_engine/configs/users.xml new file mode 100644 index 00000000000..12c6d97d4eb --- /dev/null +++ b/tests/integration/test_mysql_database_engine/configs/users.xml @@ -0,0 +1,9 @@ + + + + + 3 + 3 + + + diff --git a/tests/integration/test_mysql_database_engine/test.py b/tests/integration/test_mysql_database_engine/test.py old mode 100644 new mode 100755 index 8f305fa8463..4a826213594 --- a/tests/integration/test_mysql_database_engine/test.py +++ b/tests/integration/test_mysql_database_engine/test.py @@ -8,7 +8,7 @@ from helpers.client import QueryRuntimeException from helpers.cluster import ClickHouseCluster cluster = ClickHouseCluster(__file__) -clickhouse_node = cluster.add_instance('node1', main_configs=['configs/remote_servers.xml'], with_mysql=True) +clickhouse_node = cluster.add_instance('node1', main_configs=['configs/remote_servers.xml'], user_configs=['configs/users.xml'], with_mysql=True) @pytest.fixture(scope="module") @@ -232,7 +232,7 @@ uint16_values = [0, 1, 65535] int8_values = [0, 1, -1, 127, -128] uint8_values = [0, 1, 255] # string_values = ["'ClickHouse'", 'NULL'] -string_values = ["'ClickHouse'"] +string_values = ["'ClickHouse'"] decimal_values = [0, 0.123, 0.4, 5.67, 8.91011, 123456789.123, -0.123, -0.4, -5.67, -8.91011, -123456789.123] @@ -319,7 +319,8 @@ def test_mysql_types(started_cluster, case_name, mysql_type, expected_ch_type, m ) clickhouse_query_settings = dict( - mysql_datatypes_support_level=setting_mysql_datatypes_support_level + mysql_datatypes_support_level=setting_mysql_datatypes_support_level, + output_format_decimal_trailing_zeros=1 ) def execute_query(node, query, **kwargs): @@ -403,3 +404,26 @@ def test_mysql_types(started_cluster, case_name, mysql_type, expected_ch_type, m execute_query(clickhouse_node, "SELECT value FROM mysql('mysql57:3306', '${mysql_db}', '${table_name}', 'root', 'clickhouse')", settings=clickhouse_query_settings) + + +def test_clickhouse_mysql_no_connection(started_cluster): + with contextlib.closing(MySQLNodeInstance('root', 'clickhouse', started_cluster.mysql_ip, started_cluster.mysql_port)) as mysql_node: + mysql_node.query("CREATE DATABASE test_database DEFAULT CHARACTER SET 'utf8'") + mysql_node.query('CREATE TABLE `test_database`.`test_table` ( `i``d` int(11) NOT NULL, PRIMARY KEY (`i``d`)) ENGINE=InnoDB;') + + clickhouse_node.query("CREATE DATABASE test_database ENGINE = MySQL('mysql57:3306', test_database, 'root', 'clickhouse')") + clickhouse_node.query("INSERT INTO `test_database`.`test_table`(`i``d`) select number from numbers(10000)") + assert clickhouse_node.query("SELECT count() FROM `test_database`.`test_table`").rstrip() == '10000' + + started_cluster.pause_container('mysql57'); + result = clickhouse_node.query_and_get_error("SELECT count() FROM `test_database`.`test_table`") + assert('Exception: Connections to all replicas failed' in result) + + started_cluster.unpause_container('mysql57'); + result = clickhouse_node.query("SELECT count() FROM `test_database`.`test_table`") + assert(result.strip() == '10000') + + started_cluster.pause_container('mysql57'); + clickhouse_node.query("DROP DATABASE test_database") + assert 'test_database' not in clickhouse_node.query('SHOW DATABASES') + started_cluster.unpause_container('mysql57'); diff --git a/tests/integration/test_odbc_interaction/configs/dictionaries/postgres_odbc_hashed_dictionary.xml b/tests/integration/test_odbc_interaction/configs/dictionaries/postgres_odbc_hashed_dictionary.xml index 6aad3ad9917..a65360b0e26 100644 --- a/tests/integration/test_odbc_interaction/configs/dictionaries/postgres_odbc_hashed_dictionary.xml +++ b/tests/integration/test_odbc_interaction/configs/dictionaries/postgres_odbc_hashed_dictionary.xml @@ -18,7 +18,7 @@ - column1 + id diff --git a/tests/integration/test_odbc_interaction/configs/dictionaries/sqlite3_odbc_cached_dictionary.xml b/tests/integration/test_odbc_interaction/configs/dictionaries/sqlite3_odbc_cached_dictionary.xml index 45f3966ee8a..3a505b79304 100644 --- a/tests/integration/test_odbc_interaction/configs/dictionaries/sqlite3_odbc_cached_dictionary.xml +++ b/tests/integration/test_odbc_interaction/configs/dictionaries/sqlite3_odbc_cached_dictionary.xml @@ -20,7 +20,7 @@ - X + id diff --git a/tests/integration/test_odbc_interaction/configs/dictionaries/sqlite3_odbc_hashed_dictionary.xml b/tests/integration/test_odbc_interaction/configs/dictionaries/sqlite3_odbc_hashed_dictionary.xml index 18a14b896bd..5b53818cf13 100644 --- a/tests/integration/test_odbc_interaction/configs/dictionaries/sqlite3_odbc_hashed_dictionary.xml +++ b/tests/integration/test_odbc_interaction/configs/dictionaries/sqlite3_odbc_hashed_dictionary.xml @@ -20,7 +20,7 @@ - X + id diff --git a/tests/integration/test_odbc_interaction/test.py b/tests/integration/test_odbc_interaction/test.py index 39a283448f5..4d2f70ad08c 100644 --- a/tests/integration/test_odbc_interaction/test.py +++ b/tests/integration/test_odbc_interaction/test.py @@ -99,19 +99,19 @@ def started_cluster(): logging.debug(f"sqlite data received: {sqlite_db}") node1.exec_in_container( - ["sqlite3", sqlite_db, "CREATE TABLE t1(x INTEGER PRIMARY KEY ASC, y, z);"], + ["sqlite3", sqlite_db, "CREATE TABLE t1(id INTEGER PRIMARY KEY ASC, x INTEGER, y, z);"], privileged=True, user='root') node1.exec_in_container( - ["sqlite3", sqlite_db, "CREATE TABLE t2(X INTEGER PRIMARY KEY ASC, Y, Z);"], + ["sqlite3", sqlite_db, "CREATE TABLE t2(id INTEGER PRIMARY KEY ASC, X INTEGER, Y, Z);"], privileged=True, user='root') node1.exec_in_container( - ["sqlite3", sqlite_db, "CREATE TABLE t3(X INTEGER PRIMARY KEY ASC, Y, Z);"], + ["sqlite3", sqlite_db, "CREATE TABLE t3(id INTEGER PRIMARY KEY ASC, X INTEGER, Y, Z);"], privileged=True, user='root') node1.exec_in_container( - ["sqlite3", sqlite_db, "CREATE TABLE t4(X INTEGER PRIMARY KEY ASC, Y, Z);"], + ["sqlite3", sqlite_db, "CREATE TABLE t4(id INTEGER PRIMARY KEY ASC, X INTEGER, Y, Z);"], privileged=True, user='root') node1.exec_in_container( - ["sqlite3", sqlite_db, "CREATE TABLE tf1(x INTEGER PRIMARY KEY ASC, y, z);"], + ["sqlite3", sqlite_db, "CREATE TABLE tf1(id INTEGER PRIMARY KEY ASC, x INTEGER, y, z);"], privileged=True, user='root') logging.debug("sqlite tables created") mysql_conn = get_mysql_conn() @@ -128,7 +128,7 @@ def started_cluster(): cursor = postgres_conn.cursor() cursor.execute( - "create table if not exists clickhouse.test_table (column1 int primary key, column2 varchar(40) not null)") + "create table if not exists clickhouse.test_table (id int primary key, column1 int not null, column2 varchar(40) not null)") yield cluster @@ -210,9 +210,9 @@ def test_sqlite_simple_select_function_works(started_cluster): sqlite_setup = node1.odbc_drivers["SQLite3"] sqlite_db = sqlite_setup["Database"] - node1.exec_in_container(["sqlite3", sqlite_db, "INSERT INTO t1 values(1, 2, 3);"], + node1.exec_in_container(["sqlite3", sqlite_db, "INSERT INTO t1 values(1, 1, 2, 3);"], privileged=True, user='root') - assert node1.query("select * from odbc('DSN={}', '{}')".format(sqlite_setup["DSN"], 't1')) == "1\t2\t3\n" + assert node1.query("select * from odbc('DSN={}', '{}')".format(sqlite_setup["DSN"], 't1')) == "1\t1\t2\t3\n" assert node1.query("select y from odbc('DSN={}', '{}')".format(sqlite_setup["DSN"], 't1')) == "2\n" assert node1.query("select z from odbc('DSN={}', '{}')".format(sqlite_setup["DSN"], 't1')) == "3\n" @@ -228,10 +228,10 @@ def test_sqlite_table_function(started_cluster): sqlite_setup = node1.odbc_drivers["SQLite3"] sqlite_db = sqlite_setup["Database"] - node1.exec_in_container(["sqlite3", sqlite_db, "INSERT INTO tf1 values(1, 2, 3);"], + node1.exec_in_container(["sqlite3", sqlite_db, "INSERT INTO tf1 values(1, 1, 2, 3);"], privileged=True, user='root') node1.query("create table odbc_tf as odbc('DSN={}', '{}')".format(sqlite_setup["DSN"], 'tf1')) - assert node1.query("select * from odbc_tf") == "1\t2\t3\n" + assert node1.query("select * from odbc_tf") == "1\t1\t2\t3\n" assert node1.query("select y from odbc_tf") == "2\n" assert node1.query("select z from odbc_tf") == "3\n" @@ -246,7 +246,7 @@ def test_sqlite_simple_select_storage_works(started_cluster): sqlite_setup = node1.odbc_drivers["SQLite3"] sqlite_db = sqlite_setup["Database"] - node1.exec_in_container(["sqlite3", sqlite_db, "INSERT INTO t4 values(1, 2, 3);"], + node1.exec_in_container(["sqlite3", sqlite_db, "INSERT INTO t4 values(1, 1, 2, 3);"], privileged=True, user='root') node1.query("create table SqliteODBC (x Int32, y String, z String) engine = ODBC('DSN={}', '', 't4')".format( sqlite_setup["DSN"])) @@ -264,7 +264,7 @@ def test_sqlite_odbc_hashed_dictionary(started_cluster): skip_test_msan(node1) sqlite_db = node1.odbc_drivers["SQLite3"]["Database"] - node1.exec_in_container(["sqlite3", sqlite_db, "INSERT INTO t2 values(1, 2, 3);"], + node1.exec_in_container(["sqlite3", sqlite_db, "INSERT INTO t2 values(1, 1, 2, 3);"], privileged=True, user='root') node1.query("SYSTEM RELOAD DICTIONARY sqlite3_odbc_hashed") @@ -282,7 +282,7 @@ def test_sqlite_odbc_hashed_dictionary(started_cluster): logging.debug("Waiting dictionary to update for the second time") time.sleep(0.1) - node1.exec_in_container(["sqlite3", sqlite_db, "INSERT INTO t2 values(200, 2, 7);"], + node1.exec_in_container(["sqlite3", sqlite_db, "INSERT INTO t2 values(200, 200, 2, 7);"], privileged=True, user='root') # No reload because of invalidate query @@ -299,7 +299,7 @@ def test_sqlite_odbc_hashed_dictionary(started_cluster): assert_eq_with_retry(node1, "select dictGetUInt8('sqlite3_odbc_hashed', 'Z', toUInt64(1))", "3") assert_eq_with_retry(node1, "select dictGetUInt8('sqlite3_odbc_hashed', 'Z', toUInt64(200))", "1") # still default - node1.exec_in_container(["sqlite3", sqlite_db, "REPLACE INTO t2 values(1, 2, 5);"], + node1.exec_in_container(["sqlite3", sqlite_db, "REPLACE INTO t2 values(1, 1, 2, 5);"], privileged=True, user='root') assert_eq_with_retry(node1, "select dictGetUInt8('sqlite3_odbc_hashed', 'Z', toUInt64(1))", "5") @@ -310,7 +310,7 @@ def test_sqlite_odbc_cached_dictionary(started_cluster): skip_test_msan(node1) sqlite_db = node1.odbc_drivers["SQLite3"]["Database"] - node1.exec_in_container(["sqlite3", sqlite_db, "INSERT INTO t3 values(1, 2, 3);"], + node1.exec_in_container(["sqlite3", sqlite_db, "INSERT INTO t3 values(1, 1, 2, 3);"], privileged=True, user='root') assert node1.query("select dictGetUInt8('sqlite3_odbc_cached', 'Z', toUInt64(1))") == "3\n" @@ -319,12 +319,12 @@ def test_sqlite_odbc_cached_dictionary(started_cluster): node1.exec_in_container(["chmod", "a+rw", "/tmp"], privileged=True, user='root') node1.exec_in_container(["chmod", "a+rw", sqlite_db], privileged=True, user='root') - node1.query("insert into table function odbc('DSN={};ReadOnly=0', '', 't3') values (200, 2, 7)".format( + node1.query("insert into table function odbc('DSN={};ReadOnly=0', '', 't3') values (200, 200, 2, 7)".format( node1.odbc_drivers["SQLite3"]["DSN"])) assert node1.query("select dictGetUInt8('sqlite3_odbc_cached', 'Z', toUInt64(200))") == "7\n" # new value - node1.exec_in_container(["sqlite3", sqlite_db, "REPLACE INTO t3 values(1, 2, 12);"], + node1.exec_in_container(["sqlite3", sqlite_db, "REPLACE INTO t3 values(1, 1, 2, 12);"], privileged=True, user='root') assert_eq_with_retry(node1, "select dictGetUInt8('sqlite3_odbc_cached', 'Z', toUInt64(1))", "12") @@ -336,7 +336,7 @@ def test_postgres_odbc_hashed_dictionary_with_schema(started_cluster): conn = get_postgres_conn(started_cluster) cursor = conn.cursor() cursor.execute("truncate table clickhouse.test_table") - cursor.execute("insert into clickhouse.test_table values(1, 'hello'),(2, 'world')") + cursor.execute("insert into clickhouse.test_table values(1, 1, 'hello'),(2, 2, 'world')") node1.query("SYSTEM RELOAD DICTIONARY postgres_odbc_hashed") assert_eq_with_retry(node1, "select dictGetString('postgres_odbc_hashed', 'column2', toUInt64(1))", "hello") assert_eq_with_retry(node1, "select dictGetString('postgres_odbc_hashed', 'column2', toUInt64(2))", "world") @@ -348,7 +348,7 @@ def test_postgres_odbc_hashed_dictionary_no_tty_pipe_overflow(started_cluster): conn = get_postgres_conn(started_cluster) cursor = conn.cursor() cursor.execute("truncate table clickhouse.test_table") - cursor.execute("insert into clickhouse.test_table values(3, 'xxx')") + cursor.execute("insert into clickhouse.test_table values(3, 3, 'xxx')") for i in range(100): try: node1.query("system reload dictionary postgres_odbc_hashed", timeout=15) @@ -369,13 +369,13 @@ def test_postgres_insert(started_cluster): # reconstruction of connection string. node1.query( - "create table pg_insert (column1 UInt8, column2 String) engine=ODBC('DSN=postgresql_odbc;Servername=postgre-sql.local', 'clickhouse', 'test_table')") - node1.query("insert into pg_insert values (1, 'hello'), (2, 'world')") - assert node1.query("select * from pg_insert") == '1\thello\n2\tworld\n' - node1.query("insert into table function odbc('DSN=postgresql_odbc', 'clickhouse', 'test_table') format CSV 3,test") + "create table pg_insert (id UInt64, column1 UInt8, column2 String) engine=ODBC('DSN=postgresql_odbc;Servername=postgre-sql.local', 'clickhouse', 'test_table')") + node1.query("insert into pg_insert values (1, 1, 'hello'), (2, 2, 'world')") + assert node1.query("select * from pg_insert") == '1\t1\thello\n2\t2\tworld\n' + node1.query("insert into table function odbc('DSN=postgresql_odbc', 'clickhouse', 'test_table') format CSV 3,3,test") node1.query( "insert into table function odbc('DSN=postgresql_odbc;Servername=postgre-sql.local', 'clickhouse', 'test_table')" \ - " select number, 's' || toString(number) from numbers (4, 7)") + " select number, number, 's' || toString(number) from numbers (4, 7)") assert node1.query("select sum(column1), count(column1) from pg_insert") == "55\t10\n" assert node1.query( "select sum(n), count(n) from (select (*,).1 as n from (select * from odbc('DSN=postgresql_odbc', 'clickhouse', 'test_table')))") == "55\t10\n" @@ -426,19 +426,19 @@ def test_odbc_postgres_date_data_type(started_cluster): conn = get_postgres_conn(started_cluster); cursor = conn.cursor() - cursor.execute("CREATE TABLE IF NOT EXISTS clickhouse.test_date (column1 integer, column2 date)") + cursor.execute("CREATE TABLE IF NOT EXISTS clickhouse.test_date (id integer, column1 integer, column2 date)") - cursor.execute("INSERT INTO clickhouse.test_date VALUES (1, '2020-12-01')") - cursor.execute("INSERT INTO clickhouse.test_date VALUES (2, '2020-12-02')") - cursor.execute("INSERT INTO clickhouse.test_date VALUES (3, '2020-12-03')") + cursor.execute("INSERT INTO clickhouse.test_date VALUES (1, 1, '2020-12-01')") + cursor.execute("INSERT INTO clickhouse.test_date VALUES (2, 2, '2020-12-02')") + cursor.execute("INSERT INTO clickhouse.test_date VALUES (3, 3, '2020-12-03')") conn.commit() node1.query( ''' - CREATE TABLE test_date (column1 UInt64, column2 Date) + CREATE TABLE test_date (id UInt64, column1 UInt64, column2 Date) ENGINE=ODBC('DSN=postgresql_odbc; Servername=postgre-sql.local', 'clickhouse', 'test_date')''') - expected = '1\t2020-12-01\n2\t2020-12-02\n3\t2020-12-03\n' + expected = '1\t1\t2020-12-01\n2\t2\t2020-12-02\n3\t3\t2020-12-03\n' result = node1.query('SELECT * FROM test_date'); assert(result == expected) cursor.execute("DROP TABLE IF EXISTS clickhouse.test_date") diff --git a/tests/integration/test_part_log_table/configs/config_without_standard_part_log.xml b/tests/integration/test_part_log_table/configs/config_without_standard_part_log.xml new file mode 100644 index 00000000000..6c718dad1ee --- /dev/null +++ b/tests/integration/test_part_log_table/configs/config_without_standard_part_log.xml @@ -0,0 +1,3 @@ + + + diff --git a/tests/integration/test_part_log_table/test.py b/tests/integration/test_part_log_table/test.py index 63adde432b5..050e8c831c7 100644 --- a/tests/integration/test_part_log_table/test.py +++ b/tests/integration/test_part_log_table/test.py @@ -3,7 +3,7 @@ import pytest from helpers.cluster import ClickHouseCluster cluster = ClickHouseCluster(__file__) -node1 = cluster.add_instance("node1") +node1 = cluster.add_instance("node1", main_configs=["configs/config_without_standard_part_log.xml"]) node2 = cluster.add_instance("node2", main_configs=["configs/config_with_standard_part_log.xml"]) node3 = cluster.add_instance("node3", main_configs=["configs/config_with_non_standard_part_log.xml"]) diff --git a/tests/integration/test_postgresql_replica_database_engine/test.py b/tests/integration/test_postgresql_replica_database_engine/test.py index 3763b503b60..40324089b1b 100644 --- a/tests/integration/test_postgresql_replica_database_engine/test.py +++ b/tests/integration/test_postgresql_replica_database_engine/test.py @@ -258,7 +258,7 @@ def test_different_data_types(started_cluster): check_tables_are_synchronized('test_data_types', 'id'); result = instance.query('SELECT * FROM test_database.test_data_types ORDER BY id LIMIT 1;') - assert(result == '0\t-32768\t-2147483648\t-9223372036854775808\t1.12345\t1.123456789\t2147483647\t9223372036854775807\t2000-05-12 12:12:12.012345\t2000-05-12\t0.20000\t0.20000\n') + assert(result == '0\t-32768\t-2147483648\t-9223372036854775808\t1.12345\t1.123456789\t2147483647\t9223372036854775807\t2000-05-12 12:12:12.012345\t2000-05-12\t0.2\t0.2\n') for i in range(10): col = random.choice(['a', 'b', 'c']) diff --git a/tests/integration/test_read_temporary_tables_on_failure/test.py b/tests/integration/test_read_temporary_tables_on_failure/test.py index e62c7c9eaec..ae59fb31641 100644 --- a/tests/integration/test_read_temporary_tables_on_failure/test.py +++ b/tests/integration/test_read_temporary_tables_on_failure/test.py @@ -24,3 +24,4 @@ def test_different_versions(start_cluster): node.query("SELECT 1", settings={'max_concurrent_queries_for_user': 1}) assert node.contains_in_log('Too many simultaneous queries for user') assert not node.contains_in_log('Unknown packet') + assert not node.contains_in_log('Unexpected packet') diff --git a/tests/integration/test_replicated_database/test.py b/tests/integration/test_replicated_database/test.py index 4bcad7de16f..450caafb9ba 100644 --- a/tests/integration/test_replicated_database/test.py +++ b/tests/integration/test_replicated_database/test.py @@ -305,3 +305,12 @@ def test_startup_without_zk(started_cluster): main_node.query("EXCHANGE TABLES startup.rmt AND startup.m") assert main_node.query("SELECT (*,).1 FROM startup.m") == "42\n" + + +def test_server_uuid(started_cluster): + uuid1 = main_node.query("select serverUUID()") + uuid2 = dummy_node.query("select serverUUID()") + assert uuid1 != uuid2 + main_node.restart_clickhouse() + uuid1_after_restart = main_node.query("select serverUUID()") + assert uuid1 == uuid1_after_restart diff --git a/tests/integration/test_replicated_merge_tree_hdfs_zero_copy/test.py b/tests/integration/test_replicated_merge_tree_hdfs_zero_copy/test.py index f426c3619a4..f557a69569a 100644 --- a/tests/integration/test_replicated_merge_tree_hdfs_zero_copy/test.py +++ b/tests/integration/test_replicated_merge_tree_hdfs_zero_copy/test.py @@ -37,6 +37,9 @@ def cluster(): with_hdfs=True) logging.info("Starting cluster...") cluster.start() + if cluster.instances["node1"].is_debug_build(): + # https://github.com/ClickHouse/ClickHouse/issues/27814 + pytest.skip("libhdfs3 calls rand function which does not pass harmful check in debug build") logging.info("Cluster started") fs = HdfsClient(hosts=cluster.hdfs_ip) diff --git a/tests/integration/test_replicated_users/__init__.py b/tests/integration/test_replicated_users/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/integration/test_replicated_users/configs/config.xml b/tests/integration/test_replicated_users/configs/config.xml new file mode 100644 index 00000000000..1a9b8f9134c --- /dev/null +++ b/tests/integration/test_replicated_users/configs/config.xml @@ -0,0 +1,22 @@ + + + + + true + + node1 + 9000 + + + node2 + 9000 + + + + + + + /clickhouse/access + + + diff --git a/tests/integration/test_replicated_users/test.py b/tests/integration/test_replicated_users/test.py new file mode 100644 index 00000000000..75bc93921be --- /dev/null +++ b/tests/integration/test_replicated_users/test.py @@ -0,0 +1,73 @@ +import pytest + +from dataclasses import dataclass +from helpers.cluster import ClickHouseCluster + +cluster = ClickHouseCluster(__file__) + +node1 = cluster.add_instance('node1', main_configs=['configs/config.xml'], with_zookeeper=True, stay_alive=True) +node2 = cluster.add_instance('node2', main_configs=['configs/config.xml'], with_zookeeper=True, stay_alive=True) + +all_nodes = [node1, node2] + +@pytest.fixture(scope="module") +def started_cluster(): + try: + cluster.start() + yield cluster + finally: + cluster.shutdown() + + +@dataclass(frozen=True) +class Entity: + keyword: str + name: str + options: str = "" + + +entities = [ + Entity(keyword="USER", name="theuser"), + Entity(keyword="ROLE", name="therole"), + Entity(keyword="ROW POLICY", name="thepolicy", options=" ON default.t1"), + Entity(keyword="QUOTA", name="thequota"), + Entity(keyword="SETTINGS PROFILE", name="theprofile") +] + +def get_entity_id(entity): + return entity.keyword + + +@pytest.mark.parametrize("entity", entities, ids=get_entity_id) +def test_create_replicated(started_cluster, entity): + node1.query(f"CREATE {entity.keyword} {entity.name} {entity.options}") + assert f"cannot insert because {entity.keyword.lower()} `{entity.name}{entity.options}` already exists in replicated" in \ + node2.query_and_get_error(f"CREATE {entity.keyword} {entity.name} {entity.options}") + node1.query(f"DROP {entity.keyword} {entity.name} {entity.options}") + + +@pytest.mark.parametrize("entity", entities, ids=get_entity_id) +def test_create_and_delete_replicated(started_cluster, entity): + node1.query(f"CREATE {entity.keyword} {entity.name} {entity.options}") + node2.query(f"DROP {entity.keyword} {entity.name} {entity.options}") + + +@pytest.mark.parametrize("entity", entities, ids=get_entity_id) +def test_create_replicated_on_cluster(started_cluster, entity): + assert f"cannot insert because {entity.keyword.lower()} `{entity.name}{entity.options}` already exists in replicated" in \ + node1.query_and_get_error(f"CREATE {entity.keyword} {entity.name} ON CLUSTER default {entity.options}") + node1.query(f"DROP {entity.keyword} {entity.name} {entity.options}") + + +@pytest.mark.parametrize("entity", entities, ids=get_entity_id) +def test_create_replicated_if_not_exists_on_cluster(started_cluster, entity): + node1.query(f"CREATE {entity.keyword} IF NOT EXISTS {entity.name} ON CLUSTER default {entity.options}") + node1.query(f"DROP {entity.keyword} {entity.name} {entity.options}") + + +@pytest.mark.parametrize("entity", entities, ids=get_entity_id) +def test_rename_replicated(started_cluster, entity): + node1.query(f"CREATE {entity.keyword} {entity.name} {entity.options}") + node2.query(f"ALTER {entity.keyword} {entity.name} {entity.options} RENAME TO {entity.name}2") + node1.query(f"DROP {entity.keyword} {entity.name}2 {entity.options}") + diff --git a/tests/integration/test_storage_kafka/test.py b/tests/integration/test_storage_kafka/test.py index bd3a88403f9..8a6bf10b3c5 100644 --- a/tests/integration/test_storage_kafka/test.py +++ b/tests/integration/test_storage_kafka/test.py @@ -180,28 +180,6 @@ def avro_confluent_message(schema_registry_client, value): }) return serializer.encode_record_with_schema('test_subject', schema, value) -# Fixtures - -@pytest.fixture(scope="module") -def kafka_cluster(): - try: - global kafka_id - cluster.start() - kafka_id = instance.cluster.kafka_docker_id - print(("kafka_id is {}".format(kafka_id))) - yield cluster - - finally: - cluster.shutdown() - -@pytest.fixture(autouse=True) -def kafka_setup_teardown(): - instance.query('DROP DATABASE IF EXISTS test; CREATE DATABASE test;') - wait_kafka_is_available() # ensure kafka is alive - kafka_producer_send_heartbeat_msg() # ensure python kafka client is ok - # print("kafka is available - running test") - yield # run test - # Tests def test_kafka_settings_old_syntax(kafka_cluster): @@ -283,6 +261,11 @@ def test_kafka_json_as_string(kafka_cluster): kafka_produce(kafka_cluster, 'kafka_json_as_string', ['{"t": 123, "e": {"x": "woof"} }', '', '{"t": 124, "e": {"x": "test"} }', '{"F1":"V1","F2":{"F21":"V21","F22":{},"F23":"V23","F24":"2019-12-24T16:28:04"},"F3":"V3"}']) + # 'tombstone' record (null value) = marker of deleted record + producer = KafkaProducer(bootstrap_servers="localhost:{}".format(cluster.kafka_port), value_serializer=producer_serializer, key_serializer=producer_serializer) + producer.send(topic='kafka_json_as_string', key='xxx') + producer.flush() + instance.query(''' CREATE TABLE test.kafka (field String) ENGINE = Kafka @@ -694,6 +677,8 @@ def describe_consumer_group(kafka_cluster, name): def kafka_cluster(): try: cluster.start() + kafka_id = instance.cluster.kafka_docker_id + print(("kafka_id is {}".format(kafka_id))) yield cluster finally: cluster.shutdown() @@ -1124,6 +1109,7 @@ def test_kafka_protobuf_no_delimiter(kafka_cluster): def test_kafka_materialized_view(kafka_cluster): + instance.query(''' DROP TABLE IF EXISTS test.view; DROP TABLE IF EXISTS test.consumer; @@ -2753,7 +2739,7 @@ def test_kafka_formats_with_broken_message(kafka_cluster): # broken message "(0,'BAD','AM',0.5,1)", ], - 'expected':r'''{"raw_message":"(0,'BAD','AM',0.5,1)","error":"Cannot parse string 'BAD' as UInt16: syntax error at begin of string. Note: there are toUInt16OrZero and toUInt16OrNull functions, which returns zero\/NULL instead of throwing exception.: while executing 'FUNCTION CAST(assumeNotNull(_dummy_0) :: 2, 'UInt16' :: 1) -> CAST(assumeNotNull(_dummy_0), 'UInt16') UInt16 : 4'"}''', + 'expected':r'''{"raw_message":"(0,'BAD','AM',0.5,1)","error":"Cannot parse string 'BAD' as UInt16: syntax error at begin of string. Note: there are toUInt16OrZero and toUInt16OrNull functions, which returns zero\/NULL instead of throwing exception.: while executing 'FUNCTION _CAST(assumeNotNull(_dummy_0) :: 2, 'UInt16' :: 1) -> _CAST(assumeNotNull(_dummy_0), 'UInt16') UInt16 : 4'"}''', 'supports_empty_value': True, 'printable':True, }, diff --git a/tests/integration/test_storage_kerberized_kafka/test.py b/tests/integration/test_storage_kerberized_kafka/test.py index 126c52bb1d9..f5fba594022 100644 --- a/tests/integration/test_storage_kerberized_kafka/test.py +++ b/tests/integration/test_storage_kerberized_kafka/test.py @@ -55,6 +55,9 @@ def kafka_produce(kafka_cluster, topic, messages, timestamp=None): def kafka_cluster(): try: cluster.start() + if instance.is_debug_build(): + # https://github.com/ClickHouse/ClickHouse/issues/27651 + pytest.skip("librdkafka calls system function for kinit which does not pass harmful check in debug build") yield cluster finally: cluster.shutdown() diff --git a/tests/integration/test_storage_postgresql/test.py b/tests/integration/test_storage_postgresql/test.py index 28a76631c0f..bb0e284eac9 100644 --- a/tests/integration/test_storage_postgresql/test.py +++ b/tests/integration/test_storage_postgresql/test.py @@ -291,7 +291,7 @@ def test_postgres_distributed(started_cluster): node2.query('DROP TABLE test_shards') node2.query('DROP TABLE test_replicas') - + def test_datetime_with_timezone(started_cluster): cursor = started_cluster.postgres_conn.cursor() cursor.execute("DROP TABLE IF EXISTS test_timezone") @@ -328,6 +328,32 @@ def test_postgres_ndim(started_cluster): cursor.execute("DROP TABLE arr1, arr2") +def test_postgres_on_conflict(started_cluster): + cursor = started_cluster.postgres_conn.cursor() + table = 'test_conflict' + cursor.execute(f'DROP TABLE IF EXISTS {table}') + cursor.execute(f'CREATE TABLE {table} (a integer PRIMARY KEY, b text, c integer)') + + node1.query(''' + CREATE TABLE test_conflict (a UInt32, b String, c Int32) + ENGINE PostgreSQL('postgres1:5432', 'postgres', 'test_conflict', 'postgres', 'mysecretpassword', '', 'ON CONFLICT DO NOTHING'); + ''') + node1.query(f''' INSERT INTO {table} SELECT number, concat('name_', toString(number)), 3 from numbers(100)''') + node1.query(f''' INSERT INTO {table} SELECT number, concat('name_', toString(number)), 4 from numbers(100)''') + + check1 = f"SELECT count() FROM {table}" + assert (node1.query(check1)).rstrip() == '100' + + table_func = f'''postgresql('{started_cluster.postgres_ip}:{started_cluster.postgres_port}', 'postgres', '{table}', 'postgres', 'mysecretpassword', '', 'ON CONFLICT DO NOTHING')''' + node1.query(f'''INSERT INTO TABLE FUNCTION {table_func} SELECT number, concat('name_', toString(number)), 3 from numbers(100)''') + node1.query(f'''INSERT INTO TABLE FUNCTION {table_func} SELECT number, concat('name_', toString(number)), 3 from numbers(100)''') + + check1 = f"SELECT count() FROM {table}" + assert (node1.query(check1)).rstrip() == '100' + + cursor.execute(f'DROP TABLE {table} ') + + 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 5908def8297..87f9fec57b5 100644 --- a/tests/integration/test_storage_s3/test.py +++ b/tests/integration/test_storage_s3/test.py @@ -146,6 +146,59 @@ def test_put(started_cluster, maybe_auth, positive, compression): assert values_csv == get_s3_file_content(started_cluster, bucket, filename) +def test_partition_by(started_cluster): + bucket = started_cluster.minio_bucket + instance = started_cluster.instances["dummy"] # type: ClickHouseInstance + table_format = "column1 UInt32, column2 UInt32, column3 UInt32" + partition_by = "column3" + values = "(1, 2, 3), (3, 2, 1), (78, 43, 45)" + filename = "test_{_partition_id}.csv" + put_query = f"""INSERT INTO TABLE FUNCTION + s3('http://{started_cluster.minio_host}:{started_cluster.minio_port}/{bucket}/{filename}', 'CSV', '{table_format}') + PARTITION BY {partition_by} VALUES {values}""" + + run_query(instance, put_query) + + assert "1,2,3\n" == get_s3_file_content(started_cluster, bucket, "test_3.csv") + assert "3,2,1\n" == get_s3_file_content(started_cluster, bucket, "test_1.csv") + assert "78,43,45\n" == get_s3_file_content(started_cluster, bucket, "test_45.csv") + + +def test_partition_by_string_column(started_cluster): + bucket = started_cluster.minio_bucket + instance = started_cluster.instances["dummy"] # type: ClickHouseInstance + table_format = "col_num UInt32, col_str String" + partition_by = "col_str" + values = "(1, 'foo/bar'), (3, 'йцук'), (78, '你好')" + filename = "test_{_partition_id}.csv" + put_query = f"""INSERT INTO TABLE FUNCTION + s3('http://{started_cluster.minio_host}:{started_cluster.minio_port}/{bucket}/{filename}', 'CSV', '{table_format}') + PARTITION BY {partition_by} VALUES {values}""" + + run_query(instance, put_query) + + assert '1,"foo/bar"\n' == get_s3_file_content(started_cluster, bucket, "test_foo/bar.csv") + assert '3,"йцук"\n' == get_s3_file_content(started_cluster, bucket, "test_йцук.csv") + assert '78,"你好"\n' == get_s3_file_content(started_cluster, bucket, "test_你好.csv") + + +def test_partition_by_const_column(started_cluster): + bucket = started_cluster.minio_bucket + instance = started_cluster.instances["dummy"] # type: ClickHouseInstance + table_format = "column1 UInt32, column2 UInt32, column3 UInt32" + values = "(1, 2, 3), (3, 2, 1), (78, 43, 45)" + partition_by = "'88'" + values_csv = "1,2,3\n3,2,1\n78,43,45\n" + filename = "test_{_partition_id}.csv" + put_query = f"""INSERT INTO TABLE FUNCTION + s3('http://{started_cluster.minio_host}:{started_cluster.minio_port}/{bucket}/{filename}', 'CSV', '{table_format}') + PARTITION BY {partition_by} VALUES {values}""" + + run_query(instance, put_query) + + assert values_csv == get_s3_file_content(started_cluster, bucket, "test_88.csv") + + @pytest.mark.parametrize("special", [ "space", "plus" 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_user_defined_object_persistence/__init__.py b/tests/integration/test_user_defined_object_persistence/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/integration/test_user_defined_object_persistence/test.py b/tests/integration/test_user_defined_object_persistence/test.py new file mode 100644 index 00000000000..6993bc13615 --- /dev/null +++ b/tests/integration/test_user_defined_object_persistence/test.py @@ -0,0 +1,39 @@ +import pytest +from helpers.cluster import ClickHouseCluster + +cluster = ClickHouseCluster(__file__) +instance = cluster.add_instance('instance', stay_alive=True) + + +@pytest.fixture(scope="module", autouse=True) +def started_cluster(): + try: + cluster.start() + yield cluster + + finally: + cluster.shutdown() + + +def test_persistence(): + create_function_query1 = "CREATE FUNCTION MySum1 AS (a, b) -> a + b" + create_function_query2 = "CREATE FUNCTION MySum2 AS (a, b) -> MySum1(a, b) + b" + + instance.query(create_function_query1) + instance.query(create_function_query2) + + assert instance.query("SELECT MySum1(1,2)") == "3\n" + assert instance.query("SELECT MySum2(1,2)") == "5\n" + + instance.restart_clickhouse() + + assert instance.query("SELECT MySum1(1,2)") == "3\n" + assert instance.query("SELECT MySum2(1,2)") == "5\n" + + instance.query("DROP FUNCTION MySum2") + instance.query("DROP FUNCTION MySum1") + + instance.restart_clickhouse() + + assert "Unknown function MySum1" in instance.query_and_get_error("SELECT MySum1(1, 2)") + assert "Unknown function MySum2" in instance.query_and_get_error("SELECT MySum2(1, 2)") diff --git a/tests/integration/test_zookeeper_config/test_secure.py b/tests/integration/test_zookeeper_config/test_secure.py index f57b8d8a80a..c0b2216d677 100644 --- a/tests/integration/test_zookeeper_config/test_secure.py +++ b/tests/integration/test_zookeeper_config/test_secure.py @@ -1,5 +1,3 @@ - - import threading import os from tempfile import NamedTemporaryFile @@ -35,18 +33,21 @@ def started_cluster(): # NOTE this test have to be ported to Keeper def test_secure_connection(started_cluster): - assert node1.query("SELECT count() FROM system.zookeeper WHERE path = '/'") == '2\n' - assert node2.query("SELECT count() FROM system.zookeeper WHERE path = '/'") == '2\n' + # no asserts, connection works + node1.query("SELECT count() FROM system.zookeeper WHERE path = '/'") + node2.query("SELECT count() FROM system.zookeeper WHERE path = '/'") - kThreadsNumber = 16 - kIterations = 100 - threads = [] - for _ in range(kThreadsNumber): - threads.append(threading.Thread(target=(lambda: - [node1.query("SELECT count() FROM system.zookeeper WHERE path = '/'") for _ in range(kIterations)]))) + threads_number = 16 + iterations = 100 + threads = [] - for thread in threads: - thread.start() + # just checking for race conditions + for _ in range(threads_number): + threads.append(threading.Thread(target=(lambda: + [node1.query("SELECT count() FROM system.zookeeper WHERE path = '/'") for _ in range(iterations)]))) - for thread in threads: - thread.join() + for thread in threads: + thread.start() + + for thread in threads: + thread.join() diff --git a/tests/jepsen.clickhouse-keeper/src/jepsen/clickhouse_keeper/db.clj b/tests/jepsen.clickhouse-keeper/src/jepsen/clickhouse_keeper/db.clj index 30c2c0eaf4f..745d88e97f7 100644 --- a/tests/jepsen.clickhouse-keeper/src/jepsen/clickhouse_keeper/db.clj +++ b/tests/jepsen.clickhouse-keeper/src/jepsen/clickhouse_keeper/db.clj @@ -68,6 +68,7 @@ (do (c/exec :mkdir :-p common-prefix) (c/exec :mkdir :-p data-dir) + (c/exec :mkdir :-p coordination-data-dir) (c/exec :mkdir :-p logs-dir) (c/exec :mkdir :-p configs-dir) (c/exec :mkdir :-p sub-configs-dir) 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/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/queries/0_stateless/00027_argMinMax.reference b/tests/queries/0_stateless/00027_argMinMax.reference index 101e8c16044..c92140c0f33 100644 --- a/tests/queries/0_stateless/00027_argMinMax.reference +++ b/tests/queries/0_stateless/00027_argMinMax.reference @@ -1,5 +1,5 @@ 0 9 0 9 1970-01-01 1970-01-10 -0.00 9.00 +0 9 4 1 diff --git a/tests/queries/0_stateless/00443_preferred_block_size_bytes.sh b/tests/queries/0_stateless/00443_preferred_block_size_bytes.sh index 724630057d9..399a4677a44 100755 --- a/tests/queries/0_stateless/00443_preferred_block_size_bytes.sh +++ b/tests/queries/0_stateless/00443_preferred_block_size_bytes.sh @@ -42,10 +42,10 @@ popd > /dev/null #SCRIPTDIR=`dirname "$SCRIPTPATH"` SCRIPTDIR=$SCRIPTPATH -cat "$SCRIPTDIR"/00282_merging.sql | $CLICKHOUSE_CLIENT --preferred_block_size_bytes=10 -n > "${CLICKHOUSE_TMP}"/preferred_block_size_bytes.stdout 2>&1 +cat "$SCRIPTDIR"/00282_merging.sql | $CLICKHOUSE_CLIENT --preferred_block_size_bytes=10 -n > "${CLICKHOUSE_TMP}"/preferred_block_size_bytes.stdout cmp "$SCRIPTDIR"/00282_merging.reference "${CLICKHOUSE_TMP}"/preferred_block_size_bytes.stdout && echo PASSED || echo FAILED -cat "$SCRIPTDIR"/00282_merging.sql | $CLICKHOUSE_CLIENT --preferred_block_size_bytes=20 -n > "${CLICKHOUSE_TMP}"/preferred_block_size_bytes.stdout 2>&1 +cat "$SCRIPTDIR"/00282_merging.sql | $CLICKHOUSE_CLIENT --preferred_block_size_bytes=20 -n > "${CLICKHOUSE_TMP}"/preferred_block_size_bytes.stdout cmp "$SCRIPTDIR"/00282_merging.reference "${CLICKHOUSE_TMP}"/preferred_block_size_bytes.stdout && echo PASSED || echo FAILED rm "${CLICKHOUSE_TMP}"/preferred_block_size_bytes.stdout diff --git a/tests/queries/0_stateless/00502_sum_map.reference b/tests/queries/0_stateless/00502_sum_map.reference index c38fb2ec7d6..efd5a5534d4 100644 --- a/tests/queries/0_stateless/00502_sum_map.reference +++ b/tests/queries/0_stateless/00502_sum_map.reference @@ -22,5 +22,5 @@ ([1.01],[1]) (['a','b'],[1,2]) (['a','ab','abc'],[3,2,1]) -([1,2,3,4,5,6,7,8],[1.00000,2.00000,6.00000,8.00000,10.00000,12.00000,7.00000,8.00000]) -([1,2,3,4,5,6,7,8],[1.00000,2.00000,6.00000,8.00000,10.00000,12.00000,7.00000,8.00000]) +([1,2,3,4,5,6,7,8],[1,2,6,8,10,12,7,8]) +([1,2,3,4,5,6,7,8],[1,2,6,8,10,12,7,8]) diff --git a/tests/queries/0_stateless/00545_weird_aggregate_functions.sql b/tests/queries/0_stateless/00545_weird_aggregate_functions.sql index 1f662850d05..c728dfcc534 100644 --- a/tests/queries/0_stateless/00545_weird_aggregate_functions.sql +++ b/tests/queries/0_stateless/00545_weird_aggregate_functions.sql @@ -1 +1 @@ -SELECT sumForEachMergeArray(y) FROM (SELECT sumForEachStateForEachIfArrayIfMerge(x) AS y FROM (SELECT sumForEachStateForEachIfArrayIfState([[[1, 2, 3], [4, 5, 6], [7, 8, 9]]], [1], 1) AS x)); +SELECT sumForEachMergeArray(y) FROM (SELECT sumForEachStateForEachIfArrayMerge(x) AS y FROM (SELECT sumForEachStateForEachIfArrayState([[[1, 2, 3], [4, 5, 6], [7, 8, 9]]], [1]) AS x)); diff --git a/tests/queries/0_stateless/00597_push_down_predicate_long.reference b/tests/queries/0_stateless/00597_push_down_predicate_long.reference index 3eaa1139c5d..f6f1320c2f8 100644 --- a/tests/queries/0_stateless/00597_push_down_predicate_long.reference +++ b/tests/queries/0_stateless/00597_push_down_predicate_long.reference @@ -114,7 +114,7 @@ FROM ( SELECT 1 AS id, - identity(CAST(1, \'Nullable(UInt8)\')) AS subquery + identity(_CAST(1, \'Nullable(UInt8)\')) AS subquery WHERE subquery = 1 ) WHERE subquery = 1 diff --git a/tests/queries/0_stateless/00632_aggregation_window_funnel.reference b/tests/queries/0_stateless/00632_aggregation_window_funnel.reference index 2c68f277bfa..d586e5a4b67 100644 --- a/tests/queries/0_stateless/00632_aggregation_window_funnel.reference +++ b/tests/queries/0_stateless/00632_aggregation_window_funnel.reference @@ -37,6 +37,7 @@ [5, 2] [6, 1] [7, 1] +[1] [1, 2] [2, 2] [3, 0] diff --git a/tests/queries/0_stateless/00632_aggregation_window_funnel.sql b/tests/queries/0_stateless/00632_aggregation_window_funnel.sql index aa0dc804238..e548aa4d81d 100644 --- a/tests/queries/0_stateless/00632_aggregation_window_funnel.sql +++ b/tests/queries/0_stateless/00632_aggregation_window_funnel.sql @@ -43,7 +43,7 @@ drop table if exists funnel_test_strict; create table funnel_test_strict (timestamp UInt32, event UInt32) engine=Memory; insert into funnel_test_strict values (00,1000),(10,1001),(20,1002),(30,1003),(40,1004),(50,1005),(51,1005),(60,1006),(70,1007),(80,1008); -select 6 = windowFunnel(10000, 'strict')(timestamp, event = 1000, event = 1001, event = 1002, event = 1003, event = 1004, event = 1005, event = 1006) from funnel_test_strict; +select 6 = windowFunnel(10000, 'strict_deduplication')(timestamp, event = 1000, event = 1001, event = 1002, event = 1003, event = 1004, event = 1005, event = 1006) from funnel_test_strict; select 7 = windowFunnel(10000)(timestamp, event = 1000, event = 1001, event = 1002, event = 1003, event = 1004, event = 1005, event = 1006) from funnel_test_strict; @@ -62,11 +62,18 @@ insert into funnel_test_strict_order values (1, 5, 'a') (2, 5, 'a') (3, 5, 'b') insert into funnel_test_strict_order values (1, 6, 'c') (2, 6, 'c') (3, 6, 'b') (4, 6, 'b') (5, 6, 'a') (6, 6, 'a'); select user, windowFunnel(86400)(dt, event='a', event='b', event='c') as s from funnel_test_strict_order group by user order by user format JSONCompactEachRow; select user, windowFunnel(86400, 'strict_order')(dt, event='a', event='b', event='c') as s from funnel_test_strict_order group by user order by user format JSONCompactEachRow; -select user, windowFunnel(86400, 'strict', 'strict_order')(dt, event='a', event='b', event='c') as s from funnel_test_strict_order group by user order by user format JSONCompactEachRow; +select user, windowFunnel(86400, 'strict_deduplication', 'strict_order')(dt, event='a', event='b', event='c') as s from funnel_test_strict_order group by user order by user format JSONCompactEachRow; insert into funnel_test_strict_order values (1, 7, 'a') (2, 7, 'c') (3, 7, 'b'); select user, windowFunnel(10, 'strict_order')(dt, event = 'a', event = 'b', event = 'c') as s from funnel_test_strict_order where user = 7 group by user format JSONCompactEachRow; drop table funnel_test_strict_order; +--https://github.com/ClickHouse/ClickHouse/issues/27469 +drop table if exists strict_BiteTheDDDD; +create table strict_BiteTheDDDD (ts UInt64, event String) engine = Log(); +insert into strict_BiteTheDDDD values (1,'a') (2,'b') (3,'c') (4,'b') (5,'d'); +select 3 = windowFunnel(86400, 'strict_deduplication')(ts, event='a', event='b', event='c', event='d') from strict_BiteTheDDDD format JSONCompactEachRow; +drop table strict_BiteTheDDDD; + drop table if exists funnel_test_non_null; create table funnel_test_non_null (`dt` DateTime, `u` int, `a` Nullable(String), `b` Nullable(String)) engine = MergeTree() partition by dt order by u; insert into funnel_test_non_null values (1, 1, 'a1', 'b1') (2, 1, 'a2', 'b2'); diff --git a/tests/queries/0_stateless/00700_decimal_aggregates.reference b/tests/queries/0_stateless/00700_decimal_aggregates.reference index 251445675a2..159091d867e 100644 --- a/tests/queries/0_stateless/00700_decimal_aggregates.reference +++ b/tests/queries/0_stateless/00700_decimal_aggregates.reference @@ -1,72 +1,72 @@ 101 101 101 -[-50.0000,50.0000] [-16.66666666,16.66666666] [-10.00000000,10.00000000] -0.0000 0.00000000 0.00000000 0.0000 0.00000000 0.00000000 -1275.0000 424.99999983 255.00000000 1275.0000 424.99999983 255.00000000 --1275.0000 -424.99999983 -255.00000000 -1275.0000 -424.99999983 -255.00000000 -101.0000 101.00000000 101.00000000 101.0000 101.00000000 101.00000000 --101.0000 -101.00000000 -101.00000000 -101.0000 -101.00000000 -101.00000000 +[-50,50] [-16.66666666,16.66666666] [-10,10] +0 0 0 0 0 0 +1275 424.99999983 255 1275 424.99999983 255 +-1275 -424.99999983 -255 -1275 -424.99999983 -255 +101 101 101 101 101 101 +-101 -101 -101 -101 -101 -101 (101,101,101) (101,101,101) (101,101,101) (101,101,101) (102,100,101) 5 5 5 10 10 10 --50.0000 -50.0000 -16.66666666 -16.66666666 -10.00000000 -10.00000000 -1.0000 1.0000 0.33333333 0.33333333 0.20000000 0.20000000 -50.0000 50.0000 16.66666666 16.66666666 10.00000000 10.00000000 --1.0000 -1.0000 -0.33333333 -0.33333333 -0.20000000 -0.20000000 -0.0000 0.00000000 0.00000000 Decimal(38, 8) --25.5000 -8.49999999 -5.10000000 Decimal(38, 8) -0.0000 0.00000000 0.00000000 -10.0000 3.33333333 2.00000000 -20.0000 6.66666666 4.00000000 -30.0000 10.00000000 6.00000000 -40.0000 13.33333333 8.00000000 -50.0000 16.66666666 10.00000000 -[-50.0000,-40.0000,-30.0000,-20.0000,-10.0000,0.0000,10.0000,20.0000,30.0000,40.0000,50.0000] -[-16.66666666,-13.33333333,-10.00000000,-6.66666666,-3.33333333,0.00000000,3.33333333,6.66666666,10.00000000,13.33333333,16.66666666] -[-10.00000000,-8.00000000,-6.00000000,-4.00000000,-2.00000000,0.00000000,2.00000000,4.00000000,6.00000000,8.00000000,10.00000000] -0.0000 0.00000000 0.00000000 Decimal(38, 8) --25.0000 -8.33333333 -5.00000000 Decimal(38, 8) -0.0000 0.00000000 0.00000000 -10.0000 3.33333333 2.00000000 -20.0000 6.66666666 4.00000000 -30.0000 10.00000000 6.00000000 -40.0000 13.33333333 8.00000000 -50.0000 16.66666666 10.00000000 -[-50.0000,-40.0000,-30.0000,-20.0000,-10.0000,0.0000,10.0000,20.0000,30.0000,40.0000,50.0000] -[-16.66666666,-13.33333333,-10.00000000,-6.66666666,-3.33333333,0.00000000,3.33333333,6.66666666,10.00000000,13.33333333,16.66666666] -[-10.00000000,-8.00000000,-6.00000000,-4.00000000,-2.00000000,0.00000000,2.00000000,4.00000000,6.00000000,8.00000000,10.00000000] -0.0000 0.00000000 0.00000000 Decimal(38, 8) --26.0000 -8.66666666 -5.20000000 Decimal(38, 8) -0.0000 0.00000000 0.00000000 -10.0000 3.33333333 2.00000000 -20.0000 6.66666666 4.00000000 -30.0000 10.00000000 6.00000000 -40.0000 13.33333333 8.00000000 -50.0000 16.66666666 10.00000000 -[-50.0000,-40.0000,-30.0000,-20.0000,-10.0000,0.0000,10.0000,20.0000,30.0000,40.0000,50.0000] -[-16.66666666,-13.33333333,-10.00000000,-6.66666666,-3.33333333,0.00000000,3.33333333,6.66666666,10.00000000,13.33333333,16.66666666] -[-10.00000000,-8.00000000,-6.00000000,-4.00000000,-2.00000000,0.00000000,2.00000000,4.00000000,6.00000000,8.00000000,10.00000000] -0.0000 0.00000000 0.00000000 Decimal(38, 8) --25.0000 -8.33333333 -5.00000000 Decimal(38, 8) -0.0000 0.00000000 0.00000000 -10.0000 3.33333333 2.00000000 -20.0000 6.66666666 4.00000000 -30.0000 10.00000000 6.00000000 -40.0000 13.33333333 8.00000000 -50.0000 16.66666666 10.00000000 -[-50.0000,-40.0000,-30.0000,-20.0000,-10.0000,0.0000,10.0000,20.0000,30.0000,40.0000,50.0000] -[-16.66666666,-13.33333333,-10.00000000,-6.66666666,-3.33333333,0.00000000,3.33333333,6.66666666,10.00000000,13.33333333,16.66666666] -[-10.00000000,-8.00000000,-6.00000000,-4.00000000,-2.00000000,0.00000000,2.00000000,4.00000000,6.00000000,8.00000000,10.00000000] -0.0000 0.00000000 0.00000000 Decimal(38, 8) --26.0000 -8.66666666 -5.20000000 Decimal(38, 8) -0.0000 0.00000000 0.00000000 -10.0000 3.33333333 2.00000000 -20.0000 6.66666666 4.00000000 -30.0000 10.00000000 6.00000000 -40.0000 13.33333333 8.00000000 -50.0000 16.66666666 10.00000000 -[-50.0000,-40.0000,-30.0000,-20.0000,-10.0000,0.0000,10.0000,20.0000,30.0000,40.0000,50.0000] -[-16.66666666,-13.33333333,-10.00000000,-6.66666666,-3.33333333,0.00000000,3.33333333,6.66666666,10.00000000,13.33333333,16.66666666] -[-10.00000000,-8.00000000,-6.00000000,-4.00000000,-2.00000000,0.00000000,2.00000000,4.00000000,6.00000000,8.00000000,10.00000000] +-50 -50 -16.66666666 -16.66666666 -10 -10 +1 1 0.33333333 0.33333333 0.2 0.2 +50 50 16.66666666 16.66666666 10 10 +-1 -1 -0.33333333 -0.33333333 -0.2 -0.2 +0 0 0 Decimal(38, 8) +-25.5 -8.49999999 -5.1 Decimal(38, 8) +0 0 0 +10 3.33333333 2 +20 6.66666666 4 +30 10 6 +40 13.33333333 8 +50 16.66666666 10 +[-50,-40,-30,-20,-10,0,10,20,30,40,50] +[-16.66666666,-13.33333333,-10,-6.66666666,-3.33333333,0,3.33333333,6.66666666,10,13.33333333,16.66666666] +[-10,-8,-6,-4,-2,0,2,4,6,8,10] +0 0 0 Decimal(38, 8) +-25 -8.33333333 -5 Decimal(38, 8) +0 0 0 +10 3.33333333 2 +20 6.66666666 4 +30 10 6 +40 13.33333333 8 +50 16.66666666 10 +[-50,-40,-30,-20,-10,0,10,20,30,40,50] +[-16.66666666,-13.33333333,-10,-6.66666666,-3.33333333,0,3.33333333,6.66666666,10,13.33333333,16.66666666] +[-10,-8,-6,-4,-2,0,2,4,6,8,10] +0 0 0 Decimal(38, 8) +-26 -8.66666666 -5.2 Decimal(38, 8) +0 0 0 +10 3.33333333 2 +20 6.66666666 4 +30 10 6 +40 13.33333333 8 +50 16.66666666 10 +[-50,-40,-30,-20,-10,0,10,20,30,40,50] +[-16.66666666,-13.33333333,-10,-6.66666666,-3.33333333,0,3.33333333,6.66666666,10,13.33333333,16.66666666] +[-10,-8,-6,-4,-2,0,2,4,6,8,10] +0 0 0 Decimal(38, 8) +-25 -8.33333333 -5 Decimal(38, 8) +0 0 0 +10 3.33333333 2 +20 6.66666666 4 +30 10 6 +40 13.33333333 8 +50 16.66666666 10 +[-50,-40,-30,-20,-10,0,10,20,30,40,50] +[-16.66666666,-13.33333333,-10,-6.66666666,-3.33333333,0,3.33333333,6.66666666,10,13.33333333,16.66666666] +[-10,-8,-6,-4,-2,0,2,4,6,8,10] +0 0 0 Decimal(38, 8) +-26 -8.66666666 -5.2 Decimal(38, 8) +0 0 0 +10 3.33333333 2 +20 6.66666666 4 +30 10 6 +40 13.33333333 8 +50 16.66666666 10 +[-50,-40,-30,-20,-10,0,10,20,30,40,50] +[-16.66666666,-13.33333333,-10,-6.66666666,-3.33333333,0,3.33333333,6.66666666,10,13.33333333,16.66666666] +[-10,-8,-6,-4,-2,0,2,4,6,8,10] 850 94.44444438684269 34 Float64 Float64 Float64 850 94.4444443868427 34.00000000000001 858.5 95.38888883071111 34.34 Float64 Float64 Float64 diff --git a/tests/queries/0_stateless/00700_decimal_arithm.reference b/tests/queries/0_stateless/00700_decimal_arithm.reference index 9de0d4cbf9a..a41ef5b0557 100644 --- a/tests/queries/0_stateless/00700_decimal_arithm.reference +++ b/tests/queries/0_stateless/00700_decimal_arithm.reference @@ -1,37 +1,37 @@ 84 0 1764 1 1 1 84 0 1764 1 1 1 84 0 1764 1 1 1 -84.840 0.000 1799.456400 1.000 1.000 1.000 -84.840000000 0.000000000 -84.840000000000000000 0.000000000000000000 98.044565395307682683126962841158942720 1.000000000000000000 1.000000000000000000 1.000000000000000000 -84.840000000000000000 0.000000000000000000 -84.84 0.00 1799.4564 1.00 1.00 1.00 +84.84 0 1799.4564 1 1 1 +84.84 0 +84.84 0 98.04456539530768268312696284115894272 1 1 1 +84.84 0 +84.84 0 1799.4564 1 1 1 63 21 -42 882 -882 2 0 2 0 63 21 -42 882 -882 2 0 2 0 63 21 -42 882 -882 2 0 2 0 -1.00305798474369219219752355409390731264 -0.16305798474369219219752355409390731264 1.49059173023461586584365185794205286400 -1.38847100762815390390123822295304634368 1.38847100762815390390123822295304634368 0.02000000000000000000000000000000000000 0.00500000000000000000000000000000000000 -63.420 21.420 -41.580 890.820 -890.820 2.020 0.505 2.020 0.505 -63.420000000 21.420000000 -41.580000000 890.820000000 -890.820000000 2.020000000 0.505000000 2.020000000 0.505000000 -63.420000000000000000 21.420000000000000000 -41.580000000000000000 890.820000000000000000 -890.820000000000000000 2.020000000000000000 0.505000000000000000 2.020000000000000000 0.505000000000000000 -63.42 21.42 -41.58 890.82 -890.82 2.02 0.50 2.02 0.50 +1.00305798474369219219752355409390731264 -0.16305798474369219219752355409390731264 1.490591730234615865843651857942052864 -1.38847100762815390390123822295304634368 1.38847100762815390390123822295304634368 0.02 0.005 +63.42 21.42 -41.58 890.82 -890.82 2.02 0.505 2.02 0.505 +63.42 21.42 -41.58 890.82 -890.82 2.02 0.505 2.02 0.505 +63.42 21.42 -41.58 890.82 -890.82 2.02 0.505 2.02 0.505 +63.42 21.42 -41.58 890.82 -890.82 2.02 0.5 2.02 0.5 63 -21 42 882 -882 0 2 0 2 63 -21 42 882 -882 0 2 0 2 63 -21 42 882 -882 0 2 0 2 -1.00305798474369219219752355409390731264 0.16305798474369219219752355409390731264 -1.49059173023461586584365185794205286400 -1.38847100762815390390123822295304634368 1.38847100762815390390123822295304634368 -0.00000000000000000000000000000000000001 0.00000000000000000000000000000000000001 -63.420 -21.420 41.580 890.820 -890.820 0.495 1.980 0.495 1.980 -63.420000000 -21.420000000 41.580000000 890.820000000 -890.820000000 -63.420000000000000000 -21.420000000000000000 41.580000000000000000 890.820000000000000000 -890.820000000000000000 0.495049504950495049 1.980198019801980198 0.495049504950495049 1.980198019801980198 +1.00305798474369219219752355409390731264 0.16305798474369219219752355409390731264 -1.490591730234615865843651857942052864 -1.38847100762815390390123822295304634368 1.38847100762815390390123822295304634368 -0.00000000000000000000000000000000000001 0.00000000000000000000000000000000000001 +63.42 -21.42 41.58 890.82 -890.82 0.495 1.98 0.495 1.98 +63.42 -21.42 41.58 890.82 -890.82 +63.42 -21.42 41.58 890.82 -890.82 0.495049504950495049 1.980198019801980198 0.495049504950495049 1.980198019801980198 63.42 -21.42 41.58 890.82 -890.82 0.49 1.98 0.49 1.98 --42 42 42 42 0.420000000 0.420000000000000000 0.42000000000000000000000000000000000000 42.420 42.420000000 42.42 -0 0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.000 0.000000000 0.00 -42 -42 -42 -42 -0.420000000 -0.420000000000000000 -0.42000000000000000000000000000000000000 -42.420 -42.420000000 -42.42 -42 42 42 0.420000000 0.420000000000000000 0.42000000000000000000000000000000000000 42.420 42.420000000 42.42 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.000 0.000000000 0.00 -42 42 42 0.420000000 0.420000000000000000 0.42000000000000000000000000000000000000 42.420 42.420000000 42.42 +-42 42 42 42 0.42 0.42 0.42 42.42 42.42 42.42 +0 0 0 0 0 0 0 0 0 0 +42 -42 -42 -42 -0.42 -0.42 -0.42 -42.42 -42.42 -42.42 +42 42 42 0.42 0.42 0.42 42.42 42.42 42.42 +0 0 0 0 0 0 0 0 0 +42 42 42 0.42 0.42 0.42 42.42 42.42 42.42 1 1 1 1 1 0 1 0 1 0 1 0 -0.0000 \N \N -0.00000000 \N \N -0.000000000000000000 \N \N +0 \N \N +0 \N \N +0 \N \N diff --git a/tests/queries/0_stateless/00700_decimal_array_functions.reference b/tests/queries/0_stateless/00700_decimal_array_functions.reference index 969a8dd2f18..ae872b7a347 100644 --- a/tests/queries/0_stateless/00700_decimal_array_functions.reference +++ b/tests/queries/0_stateless/00700_decimal_array_functions.reference @@ -1,20 +1,20 @@ -[0.0000,1.0000] Array(Decimal(9, 4)) -[0.00000000,1.00000000] Array(Decimal(18, 8)) -[0.00000000,1.00000000] Array(Decimal(38, 8)) +[0,1] Array(Decimal(9, 4)) +[0,1] Array(Decimal(18, 8)) +[0,1] Array(Decimal(38, 8)) - -1.0000 Decimal(38, 4) -1.00000000 Decimal(38, 8) -1.00000000 Decimal(38, 8) +1 Decimal(38, 4) +1 Decimal(38, 8) +1 Decimal(38, 8) - -[1.0000,2.0000] Array(Decimal(38, 4)) -[1.00000000,2.00000000] Array(Decimal(38, 8)) -[1.00000000,2.00000000] Array(Decimal(38, 8)) +[1,2] Array(Decimal(38, 4)) +[1,2] Array(Decimal(38, 8)) +[1,2] Array(Decimal(38, 8)) - -[1.0000,2.0000] Array(Decimal(38, 4)) -[1.00000000,2.00000000] Array(Decimal(38, 8)) -[1.00000000,2.00000000] Array(Decimal(38, 8)) +[1,2] Array(Decimal(38, 4)) +[1,2] Array(Decimal(38, 8)) +[1,2] Array(Decimal(38, 8)) - -[1.0000] Array(Decimal(9, 4)) -[1.00000000] Array(Decimal(18, 8)) -[1.00000000] Array(Decimal(38, 8)) +[1] Array(Decimal(9, 4)) +[1] Array(Decimal(18, 8)) +[1] Array(Decimal(38, 8)) - diff --git a/tests/queries/0_stateless/00700_decimal_bounds.reference b/tests/queries/0_stateless/00700_decimal_bounds.reference index 3f25fccc942..86688ea0546 100644 --- a/tests/queries/0_stateless/00700_decimal_bounds.reference +++ b/tests/queries/0_stateless/00700_decimal_bounds.reference @@ -1,43 +1,43 @@ --999999999 -999999999999999999 0 -0.999999999 0.000000000000000000 0.00000000000000000000000000000000000000 -9999.99999 0.000000000 0.000000000000000000 0 --900000000 -900000000000000000 -90000000000000000000000000000000000000 -0.000000009 -0.000000000000000009 -0.00000000000000000000000000000000000009 0.00000 0.000000000 0.000000000000000000 0 --1 -1 -1 -0.000000001 0.000000000000000000 0.00000000000000000000000000000000000000 -0.00001 -0.000000001 0.000000000000000000 -1 -0 0 -99999999999999999999999999999999999999 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 -0.999999999999999999 0.00000000000000000000000000000000000000 0.00000 -999999999.999999999 0.000000000000000000 0 -0 0 0 0.000000000 -0.000000000000000001 -0.00000000000000000000000000000000000001 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 -0.99999999999999999999999999999999999999 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 -99999999999999999999.999999999999999999 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 -0.000000000000000001 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000001 0 -0 0 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 99999999999999999999.999999999999999999 0 -0 0 0 0.000000000 0.000000000000000000 0.99999999999999999999999999999999999999 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.000000000000000001 0.00000000000000000000000000000000000001 0.00000 0.000000000 0.000000000000000000 0 -0 0 0 0.000000000 0.999999999999999999 0.00000000000000000000000000000000000000 0.00000 999999999.999999999 0.000000000000000000 0 -0 0 99999999999999999999999999999999999999 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.00000 0.000000000 0.000000000000000000 0 -1 1 1 0.000000001 0.000000000000000000 0.00000000000000000000000000000000000000 0.00001 0.000000001 0.000000000000000000 1 -42 42 0 0.000000000 0.000000000000000000 0.00000000000000000000000000000000000000 0.99999 0.000000000 0.000000000000000000 0 -900000000 900000000000000000 90000000000000000000000000000000000000 0.000000009 0.000000000000000009 0.00000000000000000000000000000000000009 0.00000 0.000000000 0.000000000000000000 0 -999999999 999999999999999999 0 0.999999999 0.000000000000000000 0.00000000000000000000000000000000000000 9999.99999 0.000000000 0.000000000000000000 0 +-999999999 -999999999999999999 0 -0.999999999 0 0 -9999.99999 0 0 0 +-900000000 -900000000000000000 -90000000000000000000000000000000000000 -0.000000009 -0.000000000000000009 -0.00000000000000000000000000000000000009 0 0 0 0 +-1 -1 -1 -0.000000001 0 0 -0.00001 -0.000000001 0 -1 +0 0 -99999999999999999999999999999999999999 0 0 0 0 0 0 0 +0 0 0 0 -0.999999999999999999 0 0 -999999999.999999999 0 0 +0 0 0 0 -0.000000000000000001 -0.00000000000000000000000000000000000001 0 0 0 0 +0 0 0 0 0 -0.99999999999999999999999999999999999999 0 0 0 0 +0 0 0 0 0 0 0 0 -99999999999999999999.999999999999999999 0 +0 0 0 0 0 0 0 0 -0.000000000000000001 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 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 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 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 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.000000000000000001 0 +0 0 0 0 0 0 0 0 99999999999999999999.999999999999999999 0 +0 0 0 0 0 0.99999999999999999999999999999999999999 0 0 0 0 +0 0 0 0 0.000000000000000001 0.00000000000000000000000000000000000001 0 0 0 0 +0 0 0 0 0.999999999999999999 0 0 999999999.999999999 0 0 +0 0 99999999999999999999999999999999999999 0 0 0 0 0 0 0 +1 1 1 0.000000001 0 0 0.00001 0.000000001 0 1 +42 42 0 0 0 0 0.99999 0 0 0 +900000000 900000000000000000 90000000000000000000000000000000000000 0.000000009 0.000000000000000009 0.00000000000000000000000000000000000009 0 0 0 0 +999999999 999999999999999999 0 0.999999999 0 0 9999.99999 0 0 0 diff --git a/tests/queries/0_stateless/00700_decimal_casts.reference b/tests/queries/0_stateless/00700_decimal_casts.reference index 99d8b949398..9f469f2907e 100644 --- a/tests/queries/0_stateless/00700_decimal_casts.reference +++ b/tests/queries/0_stateless/00700_decimal_casts.reference @@ -1,30 +1,30 @@ -1.1 1.10 1.10000000 +1.1 1.1 1.1 1 -1 1.1 1.10 1.10000000 +1 1.1 1.1 1.1 0.1 0 -0.1 0 0.1 0 -0.1 0 0.1 0 -0.1 0 -0.0000000001 0.000000000 --0.0000000001 0.000000000 -0.0000000000000000001 0.000000000000000000 --0.0000000000000000001 0.000000000000000000 -0.000000000000000000000000000000000000001 0.00000000000000000000000000000000000000 --0.000000000000000000000000000000000000001 0.00000000000000000000000000000000000000 +0.0000000001 0 +-0.0000000001 0 +0.0000000000000000001 0 +-0.0000000000000000001 0 +0.000000000000000000000000000000000000001 0 +-0.000000000000000000000000000000000000001 0 1e-1 0 -1e-1 0 1e-1 0 -1e-1 0 1e-1 0 -1e-1 0 -1e-10 0.000000000 --1e-10 0.000000000 -1e-19 0.000000000000000000 --1e-19 0.000000000000000000 -1e-39 0.00000000000000000000000000000000000000 --1e-39 0.00000000000000000000000000000000000000 +1e-10 0 +-1e-10 0 +1e-19 0 +-1e-19 0 +1e-39 0 +-1e-39 0 9999999 9999999 -9999999 9999999 -9999999 999999.9 999999.9 -999999.9 999999.9 -999999.9 99999.99 99999.99 -99999.99 99999.99 -99999.99 @@ -33,8 +33,8 @@ 99.99999 99.99999 -99.99999 99.99999 -99.99999 9.999999 9.999999 -9.999999 9.999999 -9.999999 0.9999999 0.9999999 -0.9999999 0.9999999 -0.9999999 -10 10.00000000 -10.00000000 10.00000000 -10.00000000 -1 1.000000000 -1.000000000 1.000000000 -1.000000000 +10 10 -10 10 -10 +1 1 -1 1 -1 999999999 999999999 -999999999 999999999 -999999999 99999999.9 99999999.9 -99999999.9 99999999.9 -99999999.9 9999999.99 9999999.99 -9999999.99 9999999.99 -9999999.99 @@ -45,111 +45,111 @@ 99.9999999 99.9999999 -99.9999999 99.9999999 -99.9999999 9.99999999 9.99999998 -9.99999998 9.99999998 -9.99999998 0.999999999 0.999999999 -0.999999999 0.999999999 -0.999999999 -1000000000 1000000000.000000000 -1000000000.000000000 -100000000 100000000.0000000000 -100000000.0000000000 -10000000 10000000.00000000000 -10000000.00000000000 -1000000 1000000.000000000000 -1000000.000000000000 -100000 100000.0000000000000 -100000.0000000000000 -10000 10000.00000000000000 -10000.00000000000000 -1000 1000.000000000000000 -1000.000000000000000 -100 100.0000000000000000 -100.0000000000000000 -10 10.00000000000000000 -10.00000000000000000 -1 1.000000000000000000 -1.000000000000000000 +1000000000 1000000000 -1000000000 +100000000 100000000 -100000000 +10000000 10000000 -10000000 +1000000 1000000 -1000000 +100000 100000 -100000 +10000 10000 -10000 +1000 1000 -1000 +100 100 -100 +10 10 -10 +1 1 -1 1000000000000000000 1000000000000000000 -1000000000000000000 -100000000000000000 100000000000000000.0 -100000000000000000.0 -10000000000000000 10000000000000000.00 -10000000000000000.00 -1000000000000000 1000000000000000.000 -1000000000000000.000 -100000000000000 100000000000000.0000 -100000000000000.0000 -10000000000000 10000000000000.00000 -10000000000000.00000 -1000000000000 1000000000000.000000 -1000000000000.000000 -100000000000 100000000000.0000000 -100000000000.0000000 -10000000000 10000000000.00000000 -10000000000.00000000 -1000000000 1000000000.000000000 -1000000000.000000000 -1000000000 1000000000.000000000 -1000000000.000000000 -100000000 100000000.0000000000 -100000000.0000000000 -10000000 10000000.00000000000 -10000000.00000000000 -1000000 1000000.000000000000 -1000000.000000000000 -100000 100000.0000000000000 -100000.0000000000000 -10000 10000.00000000000000 -10000.00000000000000 -1000 1000.000000000000000 -1000.000000000000000 -100 100.0000000000000000 -100.0000000000000000 -10 10.00000000000000000 -10.00000000000000000 -1 1.000000000000000000 -1.000000000000000000 -0.0000 0.00 0.00000000 -1.0000 0.11 0.11000000 -2.0000 0.22 0.22000000 -3.0000 0.33 0.33000000 -4.0000 0.44 0.44000000 -5.0000 0.55 0.55000000 -6.0000 0.66 0.66000000 -7.0000 0.77 0.77000000 -8.0000 0.88 0.88000000 -9.0000 1.00 1.00000000 -0.0000 0.00000000 0.00 -1.0000 0.11110000 0.11 -2.0000 0.22220000 0.22 -3.0000 0.33330000 0.33 -4.0000 0.44440000 0.44 -5.0000 0.55550000 0.55 -6.0000 0.66660000 0.66 -7.0000 0.77770000 0.77 -8.0000 0.88880000 0.88 -9.0000 1.00000000 1.00 -0.00000000 0.0000 0.00 -1.00000000 0.1111 0.11 -2.00000000 0.2222 0.22 -3.00000000 0.3333 0.33 -4.00000000 0.4444 0.44 -5.00000000 0.5555 0.55 -6.00000000 0.6666 0.66 -7.00000000 0.7777 0.77 -8.00000000 0.8888 0.88 -9.00000000 1.0000 1.00 -0.0000 0.00 0.00000000 -1.0000 0.11 0.11000000 -2.0000 0.22 0.22000000 -3.0000 0.33 0.33000000 -4.0000 0.44 0.44000000 -5.0000 0.55 0.55000000 -6.0000 0.66 0.66000000 -7.0000 0.77 0.77000000 -8.0000 0.88 0.88000000 -9.0000 1.00 1.00000000 -0.0000 0.00000000 0.00 -1.0000 0.11110000 0.11 -2.0000 0.22220000 0.22 -3.0000 0.33330000 0.33 -4.0000 0.44440000 0.44 -5.0000 0.55550000 0.55 -6.0000 0.66660000 0.66 -7.0000 0.77770000 0.77 -8.0000 0.88880000 0.88 -9.0000 1.00000000 1.00 -0.00000000 0.0000 0.00 -1.00000000 0.1111 0.11 -2.00000000 0.2222 0.22 -3.00000000 0.3333 0.33 -4.00000000 0.4444 0.44 -5.00000000 0.5555 0.55 -6.00000000 0.6666 0.66 -7.00000000 0.7777 0.77 -8.00000000 0.8888 0.88 -9.00000000 1.0000 1.00 +100000000000000000 100000000000000000 -100000000000000000 +10000000000000000 10000000000000000 -10000000000000000 +1000000000000000 1000000000000000 -1000000000000000 +100000000000000 100000000000000 -100000000000000 +10000000000000 10000000000000 -10000000000000 +1000000000000 1000000000000 -1000000000000 +100000000000 100000000000 -100000000000 +10000000000 10000000000 -10000000000 +1000000000 1000000000 -1000000000 +1000000000 1000000000 -1000000000 +100000000 100000000 -100000000 +10000000 10000000 -10000000 +1000000 1000000 -1000000 +100000 100000 -100000 +10000 10000 -10000 +1000 1000 -1000 +100 100 -100 +10 10 -10 +1 1 -1 +0 0 0 +1 0.11 0.11 +2 0.22 0.22 +3 0.33 0.33 +4 0.44 0.44 +5 0.55 0.55 +6 0.66 0.66 +7 0.77 0.77 +8 0.88 0.88 +9 1 1 +0 0 0 +1 0.1111 0.11 +2 0.2222 0.22 +3 0.3333 0.33 +4 0.4444 0.44 +5 0.5555 0.55 +6 0.6666 0.66 +7 0.7777 0.77 +8 0.8888 0.88 +9 1 1 +0 0 0 +1 0.1111 0.11 +2 0.2222 0.22 +3 0.3333 0.33 +4 0.4444 0.44 +5 0.5555 0.55 +6 0.6666 0.66 +7 0.7777 0.77 +8 0.8888 0.88 +9 1 1 +0 0 0 +1 0.11 0.11 +2 0.22 0.22 +3 0.33 0.33 +4 0.44 0.44 +5 0.55 0.55 +6 0.66 0.66 +7 0.77 0.77 +8 0.88 0.88 +9 1 1 +0 0 0 +1 0.1111 0.11 +2 0.2222 0.22 +3 0.3333 0.33 +4 0.4444 0.44 +5 0.5555 0.55 +6 0.6666 0.66 +7 0.7777 0.77 +8 0.8888 0.88 +9 1 1 +0 0 0 +1 0.1111 0.11 +2 0.2222 0.22 +3 0.3333 0.33 +4 0.4444 0.44 +5 0.5555 0.55 +6 0.6666 0.66 +7 0.7777 0.77 +8 0.8888 0.88 +9 1 1 99 99 -99 99 -99 9999 9999 -9999 9999 -9999 999999999 999999999 -999999999 999999999 -999999999 999999999 999999999 -999999999 999999999 -999999999 -999999999 999999999.000000000 -999999999.000000000 999999999.00000000000000000000000000000 -999999999.00000000000000000000000000000 -999999999 999999999.000000000 -999999999.000000000 999999999.00000000000000000000000000000 -999999999.00000000000000000000000000000 +999999999 999999999 -999999999 999999999 -999999999 +999999999 999999999 -999999999 999999999 -999999999 +999999999999999999 999999999999999999 -999999999999999999 999999999999999999 999999999999999999 -999999999999999999 999999999999999999 999999999999999999 -999999999999999999 -999999999999999999 999999999999999999.00000000000000000000 -999999999999999999.00000000000000000000 99 99 99 9999 9999 9999 999999999 999999999 999999999 999999999 999999999 999999999 42.42 42.42 42.42 42.42 -42.42 42.4200000 42.4200000000000000 42.420000000000000000000000000000000000 +42.42 42.42 42.42 42.42 123456789 123456789123456789 12345678901234567890123456789012345678 0.123456789 0.123456789123456789 diff --git a/tests/queries/0_stateless/00700_decimal_casts_2.reference b/tests/queries/0_stateless/00700_decimal_casts_2.reference index 393baae6c47..ed951e82036 100644 --- a/tests/queries/0_stateless/00700_decimal_casts_2.reference +++ b/tests/queries/0_stateless/00700_decimal_casts_2.reference @@ -1,36 +1,36 @@ -1234567890.0000000000000000000000000000 1234567890.00000000000000000000000000000 1234567890.00000000000000000000000000000 +1234567890 1234567890 1234567890 -126561577.683753853853498429727072845824 -1234567890.00000000 1234567890.000000000 1234567890.000000000 -12345678.0 12345678.00 12345678.00 -9223372036854775807.000000 9223372036854775807 -9223372036854775807 +1234567890 1234567890 1234567890 +12345678 12345678 12345678 +9223372036854775807 9223372036854775807 -9223372036854775807 9223372036854775800 9223372036854775800 -9223372036854775800 -92233720368547758.00 92233720368547758 -92233720368547758 -2147483647.0000000000 2147483647 -2147483647 -2147483647.00 2147483647 -2147483647 +92233720368547758 92233720368547758 -92233720368547758 +2147483647 2147483647 -2147483647 +2147483647 2147483647 -2147483647 92233720368547757.99 92233720368547757 -92233720368547757 2147483640.99 2147483640 -2147483640 --0.90000000 0 --0.90000000 0 --0.90000000 0 --0.8000 0 --0.8000 0 --0.8000 0 --0.70 0 --0.70 0 --0.70 0 --0.600000 0 --0.600000 0 --0.600000 0 +-0.9 0 +-0.9 0 +-0.9 0 +-0.8 0 +-0.8 0 +-0.8 0 +-0.7 0 +-0.7 0 +-0.7 0 +-0.6 0 +-0.6 0 +-0.6 0 +18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 -18446744073709551615.00000000 18446744073709551615 4294967295 4294967295 -4294967295.0000000000 4294967295 4294967295 4294967295 -4294967295.0000 4294967295 +4294967295 4294967295 +4294967295 4294967295 +65535 65535 +65535 65535 65535 65535 -65535.0000000000 65535 65535 65535 -65535.0000 65535 2147483647 2147483647 -2147483647 -2147483647 2147483647 2147483647 diff --git a/tests/queries/0_stateless/00700_decimal_compare.reference b/tests/queries/0_stateless/00700_decimal_compare.reference index 2325847045f..6b2787642b7 100644 --- a/tests/queries/0_stateless/00700_decimal_compare.reference +++ b/tests/queries/0_stateless/00700_decimal_compare.reference @@ -2,27 +2,27 @@ 1 -42 -42 1 0 0 0 1 1 42 42 1 0 0 0 1 1 --42 -42.42000 0 0 1 1 0 1 -42 42.42000 0 1 0 1 1 0 +-42 -42.42 0 0 1 1 0 1 +42 42.42 0 1 0 1 1 0 1 1 1 0 0 0 -42 0 0 0 0 42 1 1 1 1 -42 0 0 0 0 42 1 1 1 1 -0.420000000 0.420000000000000000 0.42000000000000000000000000000000000000 -42.42 42.420000000 42.420000000000000000 42.42 --42.42 -42.420000000 -42.420000000000000000 -42.42 +0.42 0.42 0.42 +42.42 42.42 42.42 42.42 +-42.42 -42.42 -42.42 -42.42 42 42 42 42 42 42 42 42 42 42 42 42 --42 -42.42000 -42 -42.00000 -42 42.00000 42 42.42000 --42 -42 -42.42000 -0 0 0.00000 -0 0 0.00000 -42 42 42.42000 +-42 -42.42 -42 -42 +42 42 42 42.42 +-42 -42 -42.42 +0 0 0 +0 0 0 +42 42 42.42 1 0 1 0 1 0 @@ -35,5 +35,5 @@ 0 1 0 1 0 1 --42 -42 -42 -0.420000000 -0.420000000000000000 -0.42000000000000000000000000000000000000 -42.42000 -42.420000000 -42.420000000000000000 -42.42 -42 42 42 0.420000000 0.420000000000000000 0.42000000000000000000000000000000000000 42.42000 42.420000000 42.420000000000000000 42.42 +-42 -42 -42 -0.42 -0.42 -0.42 -42.42 -42.42 -42.42 -42.42 +42 42 42 0.42 0.42 0.42 42.42 42.42 42.42 42.42 diff --git a/tests/queries/0_stateless/00700_decimal_complex_types.reference b/tests/queries/0_stateless/00700_decimal_complex_types.reference index 9c7c6fefefd..b5ae11ad5d3 100644 --- a/tests/queries/0_stateless/00700_decimal_complex_types.reference +++ b/tests/queries/0_stateless/00700_decimal_complex_types.reference @@ -3,31 +3,31 @@ Array(Decimal(9, 2)) Array(Decimal(18, 2)) Array(Decimal(38, 2)) Decimal(9, 3) Decimal(18, 3) Decimal(38, 3) Decimal(9, 2) Decimal(18, 2) Decimal(38, 2) Tuple(Decimal(9, 1), Decimal(18, 1), Decimal(38, 1)) Decimal(9, 1) Decimal(18, 1) Decimal(38, 1) -0.100 -0.200 -0.300 -0.400 -0.500 -0.600 -0.700 -0.800 -0.900 +0.1 +0.2 +0.3 +0.4 +0.5 +0.6 +0.7 +0.8 +0.9 (9.1,9.2,9.3) 9.1 9.2 9.3 -[0.100,0.200,0.300] [0.100,0.200] [0.200,0.300] [0.100] [0.200] -[0.400,0.500,0.600] [0.400,0.500] [0.500,0.600] [0.400] [0.500] -[0.700,0.800,0.900] [0.700,0.800] [0.800,0.900] [0.700] [0.800] -[1.10,1.20] [1.10] [1.20] [1.10] [1.20] -[2.10,2.20] [2.10] [2.20] [2.10] [2.20] -[3.10,3.20] [3.10] [3.20] [3.10] [3.20] -[0.100,0.200,0.300,0.000] [0.000,0.100,0.200,0.300] -[0.400,0.500,0.600,0.000] [0.000,0.400,0.500,0.600] -[0.700,0.800,0.900,0.000] [0.000,0.700,0.800,0.900] -[0.100,0.200,0.300,0.000] Array(Decimal(9, 3)) -[0.400,0.500,0.600,0.000] Array(Decimal(18, 3)) -[0.700,0.800,0.900,0.000] Array(Decimal(38, 3)) -[0.0000,0.1000,0.2000,0.3000] Array(Decimal(9, 4)) -[0.0000,0.4000,0.5000,0.6000] Array(Decimal(18, 4)) -[0.0000,0.7000,0.8000,0.9000] Array(Decimal(38, 4)) +[0.1,0.2,0.3] [0.1,0.2] [0.2,0.3] [0.1] [0.2] +[0.4,0.5,0.6] [0.4,0.5] [0.5,0.6] [0.4] [0.5] +[0.7,0.8,0.9] [0.7,0.8] [0.8,0.9] [0.7] [0.8] +[1.1,1.2] [1.1] [1.2] [1.1] [1.2] +[2.1,2.2] [2.1] [2.2] [2.1] [2.2] +[3.1,3.2] [3.1] [3.2] [3.1] [3.2] +[0.1,0.2,0.3,0] [0,0.1,0.2,0.3] +[0.4,0.5,0.6,0] [0,0.4,0.5,0.6] +[0.7,0.8,0.9,0] [0,0.7,0.8,0.9] +[0.1,0.2,0.3,0] Array(Decimal(9, 3)) +[0.4,0.5,0.6,0] Array(Decimal(18, 3)) +[0.7,0.8,0.9,0] Array(Decimal(38, 3)) +[0,0.1,0.2,0.3] Array(Decimal(9, 4)) +[0,0.4,0.5,0.6] Array(Decimal(18, 4)) +[0,0.7,0.8,0.9] Array(Decimal(38, 4)) 3 3 3 2 2 2 0 0 0 @@ -66,24 +66,24 @@ Tuple(Decimal(9, 1), Decimal(18, 1), Decimal(38, 1)) Decimal(9, 1) Decimal(18, 1 1 1 1 -[0.100,0.200,0.300,0.400,0.500,0.600] Array(Decimal(18, 3)) -[0.100,0.200,0.300,0.700,0.800,0.900] Array(Decimal(38, 3)) -[0.400,0.500,0.600,0.700,0.800,0.900] Array(Decimal(38, 3)) -[0.100,0.200,0.300,1.100,1.200] Array(Decimal(9, 3)) -[0.400,0.500,0.600,2.100,2.200] Array(Decimal(18, 3)) -[0.700,0.800,0.900,3.100,3.200] Array(Decimal(38, 3)) -[0.100,0.200,0.300,2.100,2.200] Array(Decimal(18, 3)) -[0.100,0.200,0.300,3.100,3.200] Array(Decimal(38, 3)) -[0.400,0.500,0.600,1.100,1.200] Array(Decimal(18, 3)) -[0.400,0.500,0.600,3.100,3.200] Array(Decimal(38, 3)) -[0.700,0.800,0.900,1.100,1.200] Array(Decimal(38, 3)) -[0.700,0.800,0.900,2.100,2.200] Array(Decimal(38, 3)) +[0.1,0.2,0.3,0.4,0.5,0.6] Array(Decimal(18, 3)) +[0.1,0.2,0.3,0.7,0.8,0.9] Array(Decimal(38, 3)) +[0.4,0.5,0.6,0.7,0.8,0.9] Array(Decimal(38, 3)) +[0.1,0.2,0.3,1.1,1.2] Array(Decimal(9, 3)) +[0.4,0.5,0.6,2.1,2.2] Array(Decimal(18, 3)) +[0.7,0.8,0.9,3.1,3.2] Array(Decimal(38, 3)) +[0.1,0.2,0.3,2.1,2.2] Array(Decimal(18, 3)) +[0.1,0.2,0.3,3.1,3.2] Array(Decimal(38, 3)) +[0.4,0.5,0.6,1.1,1.2] Array(Decimal(18, 3)) +[0.4,0.5,0.6,3.1,3.2] Array(Decimal(38, 3)) +[0.7,0.8,0.9,1.1,1.2] Array(Decimal(38, 3)) +[0.7,0.8,0.9,2.1,2.2] Array(Decimal(38, 3)) 12345.6789 2 2 2 -12345.6789 2 2 2 123456789.123456784 2 2 2 -123456789.123456784 2 2 2 0.123456789123456784 2 2 2 --0.123456789112345680 2 2 2 +-0.12345678911234568 2 2 2 Decimal(9, 5) Decimal(9, 5) Decimal(9, 4) @@ -114,21 +114,21 @@ Decimal(38, 4) Decimal(38, 4) Decimal(9, 0) Decimal(18, 0) -32.20000 -32.10000 -64.20000 -32.10000 -128.20000 -32.10000 -32.20000 -64.10000 -64.20000 -64.10000 -128.20000 -64.10000 -32.20000 -128.10000 -64.20000 -128.10000 -128.20000 -128.10000 +32.2 +32.1 +64.2 +32.1 +128.2 +32.1 +32.2 +64.1 +64.2 +64.1 +128.2 +64.1 +32.2 +128.1 +64.2 +128.1 +128.2 +128.1 diff --git a/tests/queries/0_stateless/00700_decimal_defaults.reference b/tests/queries/0_stateless/00700_decimal_defaults.reference index f3f1fba83e7..04de9ac4c3d 100644 --- a/tests/queries/0_stateless/00700_decimal_defaults.reference +++ b/tests/queries/0_stateless/00700_decimal_defaults.reference @@ -4,11 +4,11 @@ c Decimal(38, 4) DEFAULT b / 3 d Decimal(9, 4) MATERIALIZED a + toDecimal32(\'0.2\', 1) e Decimal(18, 4) ALIAS b * 2 f Decimal(38, 4) ALIAS c * 6 -0.0000 0.0000 0.0000 -1.0000 0.5000 0.1666 -2.0000 1.0000 0.3333 -3.0000 1.5000 0.5000 -0.0000 0.0000 0.0000 0.2000 0.0000 0.0000 -1.0000 0.5000 0.1666 1.2000 1.0000 0.9996 -2.0000 1.0000 0.3333 2.2000 2.0000 1.9998 -3.0000 1.5000 0.5000 3.2000 3.0000 3.0000 +0 0 0 +1 0.5 0.1666 +2 1 0.3333 +3 1.5 0.5 +0 0 0 0.2 0 0 +1 0.5 0.1666 1.2 1 0.9996 +2 1 0.3333 2.2 2 1.9998 +3 1.5 0.5 3.2 3 3 diff --git a/tests/queries/0_stateless/00700_decimal_empty_aggregates.reference b/tests/queries/0_stateless/00700_decimal_empty_aggregates.reference index b079e91fddc..2c29b72f50c 100644 --- a/tests/queries/0_stateless/00700_decimal_empty_aggregates.reference +++ b/tests/queries/0_stateless/00700_decimal_empty_aggregates.reference @@ -1,50 +1,50 @@ 0 0 0 -[0.0000,0.0000] [0.0000000,0.0000000] [0.00000000,0.00000000] -0.0000 0.0000000 0.00000000 0.0000 0.0000000 0.00000000 -0.0000 0.0000000 0.00000000 0.0000 0.0000000 0.00000000 -0.0000 0.0000000 0.00000000 0.0000 0.0000000 0.00000000 -0.0000 0.0000000 0.00000000 0.0000 0.0000000 0.00000000 -0.0000 0.0000000 0.00000000 0.0000 0.0000000 0.00000000 +[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 0 0 0 0 0 -0.0000 0.0000 0.0000000 0.0000000 0.00000000 0.00000000 -0.0000 0.0000 0.0000000 0.0000000 0.00000000 0.00000000 -0.0000 0.0000 0.0000000 0.0000000 0.00000000 0.00000000 -0.0000 0.0000 0.0000000 0.0000000 0.00000000 0.00000000 -0.0000 0.0000000 0.00000000 Decimal(6, 4) Decimal(16, 7) Decimal(20, 8) -0.0000 0.0000000 0.00000000 Decimal(6, 4) Decimal(16, 7) Decimal(20, 8) -0.0000 0.0000000 0.00000000 -0.0000 0.0000000 0.00000000 -0.0000 0.0000000 0.00000000 -0.0000 0.0000000 0.00000000 -0.0000 0.0000000 0.00000000 -0.0000 0.0000000 0.00000000 -[0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000] -[0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000] -[0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000] -0.0000 0.0000000 0.00000000 Decimal(20, 8) -0.0000 0.0000000 0.00000000 Decimal(20, 8) -0.0000 0.0000000 0.00000000 -0.0000 0.0000000 0.00000000 -0.0000 0.0000000 0.00000000 -0.0000 0.0000000 0.00000000 -0.0000 0.0000000 0.00000000 -0.0000 0.0000000 0.00000000 -[0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000] -[0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000] -[0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000] -0.0000 0.0000000 0.00000000 Decimal(20, 8) -0.0000 0.0000000 0.00000000 Decimal(20, 8) -0.0000 0.0000000 0.00000000 -0.0000 0.0000000 0.00000000 -0.0000 0.0000000 0.00000000 -0.0000 0.0000000 0.00000000 -0.0000 0.0000000 0.00000000 -0.0000 0.0000000 0.00000000 -[0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000] -[0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000] -[0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000] +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 Decimal(6, 4) Decimal(16, 7) Decimal(20, 8) +0 0 0 Decimal(6, 4) Decimal(16, 7) Decimal(20, 8) +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 0 0 Decimal(20, 8) +0 0 0 Decimal(20, 8) +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 0 0 Decimal(20, 8) +0 0 0 Decimal(20, 8) +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] inf inf inf Float64 Float64 Float64 nan nan nan nan nan nan Float64 Float64 Float64 diff --git a/tests/queries/0_stateless/00700_decimal_formats.reference b/tests/queries/0_stateless/00700_decimal_formats.reference index 0bea4ba27be..ff3961780a2 100644 --- a/tests/queries/0_stateless/00700_decimal_formats.reference +++ b/tests/queries/0_stateless/00700_decimal_formats.reference @@ -1,42 +1,42 @@ {"a":0.055,"b":-0.000000005,"c":0.000000000000000005} -{"a":0.100,"b":-0.100000000,"c":0.100000000000000000} -{"a":0.200,"b":-0.200000000,"c":0.200000000000000000} -{"a":0.300,"b":-0.300000000,"c":0.300000000000000000} -{"a":0.420,"b":-0.420000000,"c":0.420000000000000000} -{"a":1.000,"b":-1.000000000,"c":1.000000000000000000} -{"a":1.100,"b":-1.100000000,"c":1.100000000000000000} -{"a":2.000,"b":-2.000000000,"c":2.000000000000000000} -{"a":2.200,"b":-2.200000000,"c":2.200000000000000000} -{"a":3.000,"b":-3.000000000,"c":3.000000000000000000} -{"a":3.300,"b":-3.300000000,"c":3.300000000000000000} -{"a":42.000,"b":-42.000000000,"c":42.000000000000000000} -{"a":42.420,"b":-42.420000000,"c":42.420000000000000000} -{"a":440000.000,"b":-400000000.000000000,"c":40000000000000000000.000000000000000000} +{"a":0.1,"b":-0.1,"c":0.1} +{"a":0.2,"b":-0.2,"c":0.2} +{"a":0.3,"b":-0.3,"c":0.3} +{"a":0.42,"b":-0.42,"c":0.42} +{"a":1,"b":-1,"c":1} +{"a":1.1,"b":-1.1,"c":1.1} +{"a":2,"b":-2,"c":2} +{"a":2.2,"b":-2.2,"c":2.2} +{"a":3,"b":-3,"c":3} +{"a":3.3,"b":-3.3,"c":3.3} +{"a":42,"b":-42,"c":42} +{"a":42.42,"b":-42.42,"c":42.42} +{"a":440000,"b":-400000000,"c":40000000000000000000} 0.055,-0.000000005,0.000000000000000005 -0.100,-0.100000000,0.100000000000000000 -0.200,-0.200000000,0.200000000000000000 -0.300,-0.300000000,0.300000000000000000 -0.420,-0.420000000,0.420000000000000000 -1.000,-1.000000000,1.000000000000000000 -1.100,-1.100000000,1.100000000000000000 -2.000,-2.000000000,2.000000000000000000 -2.200,-2.200000000,2.200000000000000000 -3.000,-3.000000000,3.000000000000000000 -3.300,-3.300000000,3.300000000000000000 -42.000,-42.000000000,42.000000000000000000 -42.420,-42.420000000,42.420000000000000000 -440000.000,-400000000.000000000,40000000000000000000.000000000000000000 +0.1,-0.1,0.1 +0.2,-0.2,0.2 +0.3,-0.3,0.3 +0.42,-0.42,0.42 +1,-1,1 +1.1,-1.1,1.1 +2,-2,2 +2.2,-2.2,2.2 +3,-3,3 +3.3,-3.3,3.3 +42,-42,42 +42.42,-42.42,42.42 +440000,-400000000,40000000000000000000 0.055 -0.000000005 0.000000000000000005 -0.100 -0.100000000 0.100000000000000000 -0.200 -0.200000000 0.200000000000000000 -0.300 -0.300000000 0.300000000000000000 -0.420 -0.420000000 0.420000000000000000 -1.000 -1.000000000 1.000000000000000000 -1.100 -1.100000000 1.100000000000000000 -2.000 -2.000000000 2.000000000000000000 -2.200 -2.200000000 2.200000000000000000 -3.000 -3.000000000 3.000000000000000000 -3.300 -3.300000000 3.300000000000000000 -42.000 -42.000000000 42.000000000000000000 -42.420 -42.420000000 42.420000000000000000 -440000.000 -400000000.000000000 40000000000000000000.000000000000000000 +0.1 -0.1 0.1 +0.2 -0.2 0.2 +0.3 -0.3 0.3 +0.42 -0.42 0.42 +1 -1 1 +1.1 -1.1 1.1 +2 -2 2 +2.2 -2.2 2.2 +3 -3 3 +3.3 -3.3 3.3 +42 -42 42 +42.42 -42.42 42.42 +440000 -400000000 40000000000000000000 diff --git a/tests/queries/0_stateless/00700_decimal_gathers.reference b/tests/queries/0_stateless/00700_decimal_gathers.reference index bbfd7388e12..273642d15a8 100644 --- a/tests/queries/0_stateless/00700_decimal_gathers.reference +++ b/tests/queries/0_stateless/00700_decimal_gathers.reference @@ -1,13 +1,13 @@ -[2.000] -[2.0000000000] -[2.000000000000000000] -[1.000] -[1.0000000000] -[1.000000000000000000] -- -[2.000] -[1] -[2.000000000000000000] -[1.000] [2] -[1.000000000000000000] +[2] +[2] +[1] +[1] +[1] +- +[2] +[1] +[2] +[1] +[2] +[1] diff --git a/tests/queries/0_stateless/00700_decimal_in_keys.reference b/tests/queries/0_stateless/00700_decimal_in_keys.reference index ec11144a206..4b3486b5ce7 100644 --- a/tests/queries/0_stateless/00700_decimal_in_keys.reference +++ b/tests/queries/0_stateless/00700_decimal_in_keys.reference @@ -5,25 +5,25 @@ 1 1 5 -9.00000000 29.00000000 29.00000000 -8.00000000 28.00000000 28.00000000 -7.00000000 27.00000000 27.00000000 -6.00000000 26.00000000 26.00000000 -9.00000000 19.00000000 19.00000000 -8.00000000 18.00000000 18.00000000 -7.00000000 17.00000000 17.00000000 -6.00000000 16.00000000 16.00000000 -9.00000000 9.00000000 9.00000000 -8.00000000 8.00000000 8.00000000 -7.00000000 7.00000000 7.00000000 -6.00000000 6.00000000 6.00000000 -1.00000000 1.00000000 1.00000000 -3.00000000 3.00000000 3.00000000 -1.00000000 11.00000000 11.00000000 -3.00000000 13.00000000 13.00000000 -1.00000000 21.00000000 21.00000000 -3.00000000 23.00000000 23.00000000 -1.00000000 31.00000000 31.00000000 -3.00000000 33.00000000 33.00000000 -1.00000000 41.00000000 41.00000000 -3.00000000 43.00000000 43.00000000 +9 29 29 +8 28 28 +7 27 27 +6 26 26 +9 19 19 +8 18 18 +7 17 17 +6 16 16 +9 9 9 +8 8 8 +7 7 7 +6 6 6 +1 1 1 +3 3 3 +1 11 11 +3 13 13 +1 21 21 +3 23 23 +1 31 31 +3 33 33 +1 41 41 +3 43 43 diff --git a/tests/queries/0_stateless/00700_decimal_math.reference b/tests/queries/0_stateless/00700_decimal_math.reference index f58e08dc1fb..eb556ac49b8 100644 --- a/tests/queries/0_stateless/00700_decimal_math.reference +++ b/tests/queries/0_stateless/00700_decimal_math.reference @@ -1,30 +1,30 @@ -42.4200 3.7476 42.419154 -42.4200 5.4066 42.417862 -42.4200 1.6275 42.413098 -42.4200 6.513 42.419169 -42.4200 3.4875 42.417263671875 -1.00000 0.8427007929497149 0.15729920705028513 -42.4200 115.60113124678627 1.6029995567009473e50 -0.00 0 1 0 +42.42 3.7476 42.419154 +42.42 5.4066 42.417862 +42.42 1.6275 42.413098 +42.42 6.513 42.419169 +42.42 3.4875 42.417263671875 +1 0.8427007929497149 0.15729920705028513 +42.42 115.60113124678627 1.6029995567009473e50 +0 0 1 0 3.14159265 0 -1 -0 -1.00 1.5707963267948966 0 0.7853981633974483 -42.4200 3.7476 42.419154 -42.4200 5.4066 42.417862 -42.4200 1.6275 42.413098 -42.4200 6.513 42.419169 -42.4200 3.4875 42.417263671875 -1.00000 0.8427007929497149 0.15729920705028513 -42.4200 115.60113124678627 1.6029995567009473e50 -0.00 0 1 0 +1 1.5707963267948966 0 0.7853981633974483 +42.42 3.7476 42.419154 +42.42 5.4066 42.417862 +42.42 1.6275 42.413098 +42.42 6.513 42.419169 +42.42 3.4875 42.417263671875 +1 0.8427007929497149 0.15729920705028513 +42.42 115.60113124678627 1.6029995567009473e50 +0 0 1 0 3.14159265358979328 0 -1 -0 -1.00 1.5707963267948966 0 0.7853981633974483 -42.4200 3.7476 42.419154 -42.4200 5.4066 42.417862 -42.4200 1.6275 42.413098 -42.4200 6.513 42.419169 -42.4200 3.4875 42.417263671875 -1.00000 0.8427007929497149 0.15729920705028513 -42.4200 115.60113124678627 1.6029995567009473e50 -0.00 0 1 0 +1 1.5707963267948966 0 0.7853981633974483 +42.42 3.7476 42.419154 +42.42 5.4066 42.417862 +42.42 1.6275 42.413098 +42.42 6.513 42.419169 +42.42 3.4875 42.417263671875 +1 0.8427007929497149 0.15729920705028513 +42.42 115.60113124678627 1.6029995567009473e50 +0 0 1 0 3.14159265358979 0 -1 -0 -1.00 1.5707963267948966 0 0.7853981633974483 +1 1.5707963267948966 0 0.7853981633974483 diff --git a/tests/queries/0_stateless/00700_decimal_null.reference b/tests/queries/0_stateless/00700_decimal_null.reference index 250a437a883..e9ddf011260 100644 --- a/tests/queries/0_stateless/00700_decimal_null.reference +++ b/tests/queries/0_stateless/00700_decimal_null.reference @@ -17,11 +17,11 @@ \N 1 1 -1.10 1.10000 1.10000 1.1000 1.10000000 1.10000000 -2.20 2.20000 2.20000 2.2000 \N \N -3.30 3.30000 3.30000 \N 3.30000000 \N -4.40 4.40000 4.40000 \N \N 4.40000000 -5.50 5.50000 5.50000 \N \N \N +1.1 1.1 1.1 1.1 1.1 1.1 +2.2 2.2 2.2 2.2 \N \N +3.3 3.3 3.3 \N 3.3 \N +4.4 4.4 4.4 \N \N 4.4 +5.5 5.5 5.5 \N \N \N 0 1 0 1 0 1 diff --git a/tests/queries/0_stateless/00700_decimal_round.reference b/tests/queries/0_stateless/00700_decimal_round.reference index 230b6863411..d0f03c07849 100644 --- a/tests/queries/0_stateless/00700_decimal_round.reference +++ b/tests/queries/0_stateless/00700_decimal_round.reference @@ -1,75 +1,75 @@ -12345.6789 12346.0000 12345.7000 12345.6800 12345.6790 12345.6789 12345.6789 -12345.6789 12346.0000 12345.7000 12345.6800 12345.6790 12345.6789 12345.6789 -12345.6789 12346.0000 12345.7000 12345.6800 12345.6790 12345.6789 12345.6789 -12345.6789 12345.0000 12345.6000 12345.6700 12345.6780 12345.6789 12345.6789 -12345.6789 12345.0000 12345.6000 12345.6700 12345.6780 12345.6789 12345.6789 --12345.6789 -12346.0000 -12345.7000 -12345.6800 -12345.6790 -12345.6789 -12345.6789 --12345.6789 -12346.0000 -12345.7000 -12345.6800 -12345.6790 -12345.6789 -12345.6789 --12345.6789 -12345.0000 -12345.6000 -12345.6700 -12345.6780 -12345.6789 -12345.6789 --12345.6789 -12346.0000 -12345.7000 -12345.6800 -12345.6790 -12345.6789 -12345.6789 --12345.6789 -12345.0000 -12345.6000 -12345.6700 -12345.6780 -12345.6789 -12345.6789 -12345.6789 12350.0000 12300.0000 12000.0000 10000.0000 0.0000 -12345.6789 12350.0000 12300.0000 12000.0000 10000.0000 0.0000 -12345.6789 12350.0000 12400.0000 13000.0000 20000.0000 100000.0000 -12345.6789 12340.0000 12300.0000 12000.0000 10000.0000 0.0000 -12345.6789 12340.0000 12300.0000 12000.0000 10000.0000 0.0000 --12345.6789 -12350.0000 -12300.0000 -12000.0000 -10000.0000 0.0000 --12345.6789 -12350.0000 -12300.0000 -12000.0000 -10000.0000 0.0000 --12345.6789 -12340.0000 -12300.0000 -12000.0000 -10000.0000 0.0000 --12345.6789 -12350.0000 -12400.0000 -13000.0000 -20000.0000 -100000.0000 --12345.6789 -12340.0000 -12300.0000 -12000.0000 -10000.0000 0.0000 -12345.6789 12346.0000 12345.7000 12345.6800 12345.6790 12345.6789 12345.6789 -12345.6789 12346.0000 12345.7000 12345.6800 12345.6790 12345.6789 12345.6789 -12345.6789 12346.0000 12345.7000 12345.6800 12345.6790 12345.6789 12345.6789 -12345.6789 12345.0000 12345.6000 12345.6700 12345.6780 12345.6789 12345.6789 -12345.6789 12345.0000 12345.6000 12345.6700 12345.6780 12345.6789 12345.6789 --12345.6789 -12346.0000 -12345.7000 -12345.6800 -12345.6790 -12345.6789 -12345.6789 --12345.6789 -12346.0000 -12345.7000 -12345.6800 -12345.6790 -12345.6789 -12345.6789 --12345.6789 -12345.0000 -12345.6000 -12345.6700 -12345.6780 -12345.6789 -12345.6789 --12345.6789 -12346.0000 -12345.7000 -12345.6800 -12345.6790 -12345.6789 -12345.6789 --12345.6789 -12345.0000 -12345.6000 -12345.6700 -12345.6780 -12345.6789 -12345.6789 -12345.6789 12350.0000 12300.0000 12000.0000 10000.0000 0.0000 -12345.6789 12350.0000 12300.0000 12000.0000 10000.0000 0.0000 -12345.6789 12350.0000 12400.0000 13000.0000 20000.0000 100000.0000 -12345.6789 12340.0000 12300.0000 12000.0000 10000.0000 0.0000 -12345.6789 12340.0000 12300.0000 12000.0000 10000.0000 0.0000 --12345.6789 -12350.0000 -12300.0000 -12000.0000 -10000.0000 0.0000 --12345.6789 -12350.0000 -12300.0000 -12000.0000 -10000.0000 0.0000 --12345.6789 -12340.0000 -12300.0000 -12000.0000 -10000.0000 0.0000 --12345.6789 -12350.0000 -12400.0000 -13000.0000 -20000.0000 -100000.0000 --12345.6789 -12340.0000 -12300.0000 -12000.0000 -10000.0000 0.0000 -12345.6789 12346.0000 12345.7000 12345.6800 12345.6790 12345.6789 12345.6789 -12345.6789 12346.0000 12345.7000 12345.6800 12345.6790 12345.6789 12345.6789 -12345.6789 12346.0000 12345.7000 12345.6800 12345.6790 12345.6789 12345.6789 -12345.6789 12345.0000 12345.6000 12345.6700 12345.6780 12345.6789 12345.6789 -12345.6789 12345.0000 12345.6000 12345.6700 12345.6780 12345.6789 12345.6789 --12345.6789 -12346.0000 -12345.7000 -12345.6800 -12345.6790 -12345.6789 -12345.6789 --12345.6789 -12346.0000 -12345.7000 -12345.6800 -12345.6790 -12345.6789 -12345.6789 --12345.6789 -12345.0000 -12345.6000 -12345.6700 -12345.6780 -12345.6789 -12345.6789 --12345.6789 -12346.0000 -12345.7000 -12345.6800 -12345.6790 -12345.6789 -12345.6789 --12345.6789 -12345.0000 -12345.6000 -12345.6700 -12345.6780 -12345.6789 -12345.6789 -12345.6789 12350.0000 12300.0000 12000.0000 10000.0000 0.0000 -12345.6789 12350.0000 12300.0000 12000.0000 10000.0000 0.0000 -12345.6789 12350.0000 12400.0000 13000.0000 20000.0000 100000.0000 -12345.6789 12340.0000 12300.0000 12000.0000 10000.0000 0.0000 -12345.6789 12340.0000 12300.0000 12000.0000 10000.0000 0.0000 --12345.6789 -12350.0000 -12300.0000 -12000.0000 -10000.0000 0.0000 --12345.6789 -12350.0000 -12300.0000 -12000.0000 -10000.0000 0.0000 --12345.6789 -12340.0000 -12300.0000 -12000.0000 -10000.0000 0.0000 --12345.6789 -12350.0000 -12400.0000 -13000.0000 -20000.0000 -100000.0000 --12345.6789 -12340.0000 -12300.0000 -12000.0000 -10000.0000 0.0000 -123456789.123456789 -123456789.123456789 123456789.000000000 -123456789.000000000 123456789.123460000 -123456789.123460000 123500000.000000000 -123500000.000000000 -123456789.123456789 -123456789.123456789 123456789.000000000 -123456789.000000000 123456789.123460000 -123456789.123460000 123500000.000000000 -123500000.000000000 -123456789.123456789 -123456789.123456789 123456790.000000000 -123456789.000000000 123456789.123460000 -123456789.123450000 123500000.000000000 -123400000.000000000 -123456789.123456789 -123456789.123456789 123456789.000000000 -123456790.000000000 123456789.123450000 -123456789.123460000 123400000.000000000 -123500000.000000000 -123456789.123456789 -123456789.123456789 123456789.000000000 -123456789.000000000 123456789.123450000 -123456789.123450000 123400000.000000000 -123400000.000000000 -12345678901234567890123456789.123456789 -12345678901234567890123456789.123456789 12345678901234567890123456789.000000000 -12345678901234567890123456789.000000000 12345678901234567890123456789.123000000 -12345678901234567890123456789.123000000 -12345678901234567890123456789.123456789 -12345678901234567890123456789.123456789 12345678901234567890123456789.000000000 -12345678901234567890123456789.000000000 12345678901234567890123456789.123000000 -12345678901234567890123456789.123000000 -12345678901234567890123456789.123456789 -12345678901234567890123456789.123456789 12345678901234567890123456790.000000000 -12345678901234567890123456789.000000000 12345678901234567890123456789.124000000 -12345678901234567890123456789.123000000 -12345678901234567890123456789.123456789 -12345678901234567890123456789.123456789 12345678901234567890123456789.000000000 -12345678901234567890123456790.000000000 12345678901234567890123456789.123000000 -12345678901234567890123456789.124000000 -12345678901234567890123456789.123456789 -12345678901234567890123456789.123456789 12345678901234567890123456789.000000000 -12345678901234567890123456789.000000000 12345678901234567890123456789.123000000 -12345678901234567890123456789.123000000 -12345678901234567890123456789.123456789 -12345678901234567890123456789.123456789 12345678901234567890123456789.000000000 -12345678901234567890123456789.000000000 12345678901234567890123457000.000000000 -12345678901234567890123457000.000000000 -12345678901234567890123456789.123456789 -12345678901234567890123456789.123456789 12345678901234567890123456789.000000000 -12345678901234567890123456789.000000000 12345678901234567890123457000.000000000 -12345678901234567890123457000.000000000 -12345678901234567890123456789.123456789 -12345678901234567890123456789.123456789 12345678901234567890123456790.000000000 -12345678901234567890123456789.000000000 12345678901234567890123457000.000000000 -12345678901234567890123456000.000000000 -12345678901234567890123456789.123456789 -12345678901234567890123456789.123456789 12345678901234567890123456789.000000000 -12345678901234567890123456790.000000000 12345678901234567890123456000.000000000 -12345678901234567890123457000.000000000 -12345678901234567890123456789.123456789 -12345678901234567890123456789.123456789 12345678901234567890123456789.000000000 -12345678901234567890123456789.000000000 12345678901234567890123456000.000000000 -12345678901234567890123456000.000000000 +12345.6789 12346 12345.7 12345.68 12345.679 12345.6789 12345.6789 +12345.6789 12346 12345.7 12345.68 12345.679 12345.6789 12345.6789 +12345.6789 12346 12345.7 12345.68 12345.679 12345.6789 12345.6789 +12345.6789 12345 12345.6 12345.67 12345.678 12345.6789 12345.6789 +12345.6789 12345 12345.6 12345.67 12345.678 12345.6789 12345.6789 +-12345.6789 -12346 -12345.7 -12345.68 -12345.679 -12345.6789 -12345.6789 +-12345.6789 -12346 -12345.7 -12345.68 -12345.679 -12345.6789 -12345.6789 +-12345.6789 -12345 -12345.6 -12345.67 -12345.678 -12345.6789 -12345.6789 +-12345.6789 -12346 -12345.7 -12345.68 -12345.679 -12345.6789 -12345.6789 +-12345.6789 -12345 -12345.6 -12345.67 -12345.678 -12345.6789 -12345.6789 +12345.6789 12350 12300 12000 10000 0 +12345.6789 12350 12300 12000 10000 0 +12345.6789 12350 12400 13000 20000 100000 +12345.6789 12340 12300 12000 10000 0 +12345.6789 12340 12300 12000 10000 0 +-12345.6789 -12350 -12300 -12000 -10000 0 +-12345.6789 -12350 -12300 -12000 -10000 0 +-12345.6789 -12340 -12300 -12000 -10000 0 +-12345.6789 -12350 -12400 -13000 -20000 -100000 +-12345.6789 -12340 -12300 -12000 -10000 0 +12345.6789 12346 12345.7 12345.68 12345.679 12345.6789 12345.6789 +12345.6789 12346 12345.7 12345.68 12345.679 12345.6789 12345.6789 +12345.6789 12346 12345.7 12345.68 12345.679 12345.6789 12345.6789 +12345.6789 12345 12345.6 12345.67 12345.678 12345.6789 12345.6789 +12345.6789 12345 12345.6 12345.67 12345.678 12345.6789 12345.6789 +-12345.6789 -12346 -12345.7 -12345.68 -12345.679 -12345.6789 -12345.6789 +-12345.6789 -12346 -12345.7 -12345.68 -12345.679 -12345.6789 -12345.6789 +-12345.6789 -12345 -12345.6 -12345.67 -12345.678 -12345.6789 -12345.6789 +-12345.6789 -12346 -12345.7 -12345.68 -12345.679 -12345.6789 -12345.6789 +-12345.6789 -12345 -12345.6 -12345.67 -12345.678 -12345.6789 -12345.6789 +12345.6789 12350 12300 12000 10000 0 +12345.6789 12350 12300 12000 10000 0 +12345.6789 12350 12400 13000 20000 100000 +12345.6789 12340 12300 12000 10000 0 +12345.6789 12340 12300 12000 10000 0 +-12345.6789 -12350 -12300 -12000 -10000 0 +-12345.6789 -12350 -12300 -12000 -10000 0 +-12345.6789 -12340 -12300 -12000 -10000 0 +-12345.6789 -12350 -12400 -13000 -20000 -100000 +-12345.6789 -12340 -12300 -12000 -10000 0 +12345.6789 12346 12345.7 12345.68 12345.679 12345.6789 12345.6789 +12345.6789 12346 12345.7 12345.68 12345.679 12345.6789 12345.6789 +12345.6789 12346 12345.7 12345.68 12345.679 12345.6789 12345.6789 +12345.6789 12345 12345.6 12345.67 12345.678 12345.6789 12345.6789 +12345.6789 12345 12345.6 12345.67 12345.678 12345.6789 12345.6789 +-12345.6789 -12346 -12345.7 -12345.68 -12345.679 -12345.6789 -12345.6789 +-12345.6789 -12346 -12345.7 -12345.68 -12345.679 -12345.6789 -12345.6789 +-12345.6789 -12345 -12345.6 -12345.67 -12345.678 -12345.6789 -12345.6789 +-12345.6789 -12346 -12345.7 -12345.68 -12345.679 -12345.6789 -12345.6789 +-12345.6789 -12345 -12345.6 -12345.67 -12345.678 -12345.6789 -12345.6789 +12345.6789 12350 12300 12000 10000 0 +12345.6789 12350 12300 12000 10000 0 +12345.6789 12350 12400 13000 20000 100000 +12345.6789 12340 12300 12000 10000 0 +12345.6789 12340 12300 12000 10000 0 +-12345.6789 -12350 -12300 -12000 -10000 0 +-12345.6789 -12350 -12300 -12000 -10000 0 +-12345.6789 -12340 -12300 -12000 -10000 0 +-12345.6789 -12350 -12400 -13000 -20000 -100000 +-12345.6789 -12340 -12300 -12000 -10000 0 +123456789.123456789 -123456789.123456789 123456789 -123456789 123456789.12346 -123456789.12346 123500000 -123500000 +123456789.123456789 -123456789.123456789 123456789 -123456789 123456789.12346 -123456789.12346 123500000 -123500000 +123456789.123456789 -123456789.123456789 123456790 -123456789 123456789.12346 -123456789.12345 123500000 -123400000 +123456789.123456789 -123456789.123456789 123456789 -123456790 123456789.12345 -123456789.12346 123400000 -123500000 +123456789.123456789 -123456789.123456789 123456789 -123456789 123456789.12345 -123456789.12345 123400000 -123400000 +12345678901234567890123456789.123456789 -12345678901234567890123456789.123456789 12345678901234567890123456789 -12345678901234567890123456789 12345678901234567890123456789.123 -12345678901234567890123456789.123 +12345678901234567890123456789.123456789 -12345678901234567890123456789.123456789 12345678901234567890123456789 -12345678901234567890123456789 12345678901234567890123456789.123 -12345678901234567890123456789.123 +12345678901234567890123456789.123456789 -12345678901234567890123456789.123456789 12345678901234567890123456790 -12345678901234567890123456789 12345678901234567890123456789.124 -12345678901234567890123456789.123 +12345678901234567890123456789.123456789 -12345678901234567890123456789.123456789 12345678901234567890123456789 -12345678901234567890123456790 12345678901234567890123456789.123 -12345678901234567890123456789.124 +12345678901234567890123456789.123456789 -12345678901234567890123456789.123456789 12345678901234567890123456789 -12345678901234567890123456789 12345678901234567890123456789.123 -12345678901234567890123456789.123 +12345678901234567890123456789.123456789 -12345678901234567890123456789.123456789 12345678901234567890123456789 -12345678901234567890123456789 12345678901234567890123457000 -12345678901234567890123457000 +12345678901234567890123456789.123456789 -12345678901234567890123456789.123456789 12345678901234567890123456789 -12345678901234567890123456789 12345678901234567890123457000 -12345678901234567890123457000 +12345678901234567890123456789.123456789 -12345678901234567890123456789.123456789 12345678901234567890123456790 -12345678901234567890123456789 12345678901234567890123457000 -12345678901234567890123456000 +12345678901234567890123456789.123456789 -12345678901234567890123456789.123456789 12345678901234567890123456789 -12345678901234567890123456790 12345678901234567890123456000 -12345678901234567890123457000 +12345678901234567890123456789.123456789 -12345678901234567890123456789.123456789 12345678901234567890123456789 -12345678901234567890123456789 12345678901234567890123456000 -12345678901234567890123456000 diff --git a/tests/queries/0_stateless/00700_to_decimal_or_something.reference b/tests/queries/0_stateless/00700_to_decimal_or_something.reference index 7a6ff87d096..89ded7bd6d4 100644 --- a/tests/queries/0_stateless/00700_to_decimal_or_something.reference +++ b/tests/queries/0_stateless/00700_to_decimal_or_something.reference @@ -1,8 +1,8 @@ -1.1 1.10 1.10000000 +1.1 1.1 1.1 0 0 0.42 -0 0.420 -0 0.4200 +0 0.42 +0 0.42 999999999 0 -999999999 0 999999999999999999 0 @@ -12,11 +12,11 @@ -99999999999999999999999999999999999999 0 ---- -1.1 1.10 1.10000000 +1.1 1.1 1.1 \N \N -0.42 -\N -0.420 -\N -0.4200 +\N -0.42 +\N -0.42 999999999 \N -999999999 \N 999999999999999999 \N diff --git a/tests/queries/0_stateless/00732_decimal_summing_merge_tree.reference b/tests/queries/0_stateless/00732_decimal_summing_merge_tree.reference index 1644f50993c..551ef8f59c5 100644 --- a/tests/queries/0_stateless/00732_decimal_summing_merge_tree.reference +++ b/tests/queries/0_stateless/00732_decimal_summing_merge_tree.reference @@ -1,2 +1,2 @@ -2001-01-01 2.0000 0.00000000 -2.0000000000 -2001-01-01 0.0000 1.00000000 0.0000000000 +2001-01-01 2 0 -2 +2001-01-01 0 1 0 diff --git a/tests/queries/0_stateless/00737_decimal_group_by.reference b/tests/queries/0_stateless/00737_decimal_group_by.reference index 2f838f4bcdd..3e7ca2bf83b 100644 --- a/tests/queries/0_stateless/00737_decimal_group_by.reference +++ b/tests/queries/0_stateless/00737_decimal_group_by.reference @@ -1,11 +1,11 @@ -1.10 -2.1000 -3.100000000000 -1.20 -2.2000 -3.200000000000 -1.30 -2.3000 -3.300000000000 -1 1.000000000000000000 10.000000000000000000 -1 1.000000000000000000 10.000000000000000000 +1.1 +2.1 +3.1 +1.2 +2.2 +3.2 +1.3 +2.3 +3.3 +1 1 10 +1 1 10 diff --git a/tests/queries/0_stateless/00753_quantile_format.reference b/tests/queries/0_stateless/00753_quantile_format.reference index d3503745e4b..cd662caf5c7 100644 --- a/tests/queries/0_stateless/00753_quantile_format.reference +++ b/tests/queries/0_stateless/00753_quantile_format.reference @@ -16,3 +16,5 @@ ['2016-06-15 23:00:16'] 2016-04-02 17:23:12 ['2016-04-02 17:23:12'] +2016-04-02 17:23:12 +['2016-04-02 17:23:12'] diff --git a/tests/queries/0_stateless/00753_quantile_format.sql b/tests/queries/0_stateless/00753_quantile_format.sql index f72ecc8a49f..8caa3f31368 100644 --- a/tests/queries/0_stateless/00753_quantile_format.sql +++ b/tests/queries/0_stateless/00753_quantile_format.sql @@ -30,4 +30,7 @@ SELECT quantilesTDigestWeighted(0.2)(d, 1) FROM datetime; SELECT quantileBFloat16(0.2)(d) FROM datetime; SELECT quantilesBFloat16(0.2)(d) FROM datetime; +SELECT quantileBFloat16Weighted(0.2)(d, 1) FROM datetime; +SELECT quantilesBFloat16Weighted(0.2)(d, 1) FROM datetime; + DROP TABLE datetime; diff --git a/tests/queries/0_stateless/00804_test_custom_compression_codecs.reference b/tests/queries/0_stateless/00804_test_custom_compression_codecs.reference index 6470739db21..7bd91e5a69b 100644 --- a/tests/queries/0_stateless/00804_test_custom_compression_codecs.reference +++ b/tests/queries/0_stateless/00804_test_custom_compression_codecs.reference @@ -11,7 +11,7 @@ 9175437371954010821 CREATE TABLE default.compression_codec_multiple_more_types\n(\n `id` Decimal(38, 13) CODEC(ZSTD(1), LZ4, ZSTD(1), ZSTD(1), Delta(2), Delta(4), Delta(1), LZ4HC(0)),\n `data` FixedString(12) CODEC(ZSTD(1), ZSTD(1), NONE, NONE, NONE, LZ4HC(0)),\n `ddd.age` Array(UInt8) CODEC(LZ4, LZ4HC(0), NONE, NONE, NONE, ZSTD(1), Delta(8)),\n `ddd.Name` Array(String) CODEC(LZ4, LZ4HC(0), NONE, NONE, NONE, ZSTD(1), Delta(8))\n)\nENGINE = MergeTree\nORDER BY tuple()\nSETTINGS index_granularity = 8192 1.5555555555555 hello world! [77] ['John'] -7.1000000000000 xxxxxxxxxxxx [127] ['Henry'] +7.1 xxxxxxxxxxxx [127] ['Henry'] ! 222 !ZSTD diff --git a/tests/queries/0_stateless/00805_round_down.reference b/tests/queries/0_stateless/00805_round_down.reference index 0ed04c7757f..dafbf4255fc 100644 --- a/tests/queries/0_stateless/00805_round_down.reference +++ b/tests/queries/0_stateless/00805_round_down.reference @@ -51,33 +51,33 @@ 7 6.25 8 7.5 9 8.75 -0.00000 4.00000 -0.01000 4.00000 -0.02000 4.00000 -0.03000 4.00000 -0.04000 4.00000 -0.05000 4.00000 -0.06000 4.00000 -0.07000 4.00000 -0.08000 4.00000 -0.09000 4.00000 -0.00000 0.04000 -0.01000 0.04000 -0.02000 0.04000 -0.03000 0.04000 -0.04000 0.04000 -0.05000 0.05000 -0.06000 0.06000 -0.07000 0.06000 -0.08000 0.06000 -0.09000 0.06000 -0.00000 0.04000 -0.01000 0.04000 -0.02000 0.04000 -0.03000 0.04000 -0.04000 0.04000 -0.05000 0.05000 -0.06000 0.06000 -0.07000 0.06000 -0.08000 0.06000 -0.09000 0.06000 +0 4 +0.01 4 +0.02 4 +0.03 4 +0.04 4 +0.05 4 +0.06 4 +0.07 4 +0.08 4 +0.09 4 +0 0.04 +0.01 0.04 +0.02 0.04 +0.03 0.04 +0.04 0.04 +0.05 0.05 +0.06 0.06 +0.07 0.06 +0.08 0.06 +0.09 0.06 +0 0.04 +0.01 0.04 +0.02 0.04 +0.03 0.04 +0.04 0.04 +0.05 0.05 +0.06 0.06 +0.07 0.06 +0.08 0.06 +0.09 0.06 diff --git a/tests/queries/0_stateless/00818_alias_bug_4110.reference b/tests/queries/0_stateless/00818_alias_bug_4110.reference index e6013d269c2..210fc67db66 100644 --- a/tests/queries/0_stateless/00818_alias_bug_4110.reference +++ b/tests/queries/0_stateless/00818_alias_bug_4110.reference @@ -4,7 +4,6 @@ 11 12 12 11 10 10 -10 11 11 12 11 10 12 11 12 diff --git a/tests/queries/0_stateless/00818_alias_bug_4110.sql b/tests/queries/0_stateless/00818_alias_bug_4110.sql index 7b2fd5d3864..df7e70cb275 100644 --- a/tests/queries/0_stateless/00818_alias_bug_4110.sql +++ b/tests/queries/0_stateless/00818_alias_bug_4110.sql @@ -5,7 +5,7 @@ select s.a + 1 as b, s.a + 2 as a from (select 10 as a) s; select s.a + 2 as b, s.a + 1 as a from (select 10 as a) s; select a, a as a from (select 10 as a); -select s.a, a, a + 1 as a from (select 10 as a) as s; +select s.a, a, a + 1 as a from (select 10 as a) as s; -- { serverError 352 } select s.a + 2 as b, b - 1 as a from (select 10 as a) s; select s.a as a, s.a + 2 as b from (select 10 as a) s; select s.a + 1 as a, s.a + 2 as b from (select 10 as a) s; diff --git a/tests/queries/0_stateless/00825_protobuf_format_persons.reference b/tests/queries/0_stateless/00825_protobuf_format_persons.reference index 711980b3592..897fd9476e9 100644 --- a/tests/queries/0_stateless/00825_protobuf_format_persons.reference +++ b/tests/queries/0_stateless/00825_protobuf_format_persons.reference @@ -1,6 +1,6 @@ -a7522158-3d41-4b77-ad69-6c598ee55c49 Ivan Petrov male 1980-12-29 png +74951234567\0 1 2019-01-05 18:45:00 38 capricorn ['Yesterday','Flowers'] [255,0,0] Moscow [55.753215,37.622504] 3.14 214.10 0.1 5.8 17060000000 ['meter','centimeter','kilometer'] [1,0.01,1000] 500 [501,502] +a7522158-3d41-4b77-ad69-6c598ee55c49 Ivan Petrov male 1980-12-29 png +74951234567\0 1 2019-01-05 18:45:00 38 capricorn ['Yesterday','Flowers'] [255,0,0] Moscow [55.753215,37.622504] 3.14 214.1 0.1 5.8 17060000000 ['meter','centimeter','kilometer'] [1,0.01,1000] 500 [501,502] c694ad8a-f714-4ea3-907d-fd54fb25d9b5 Natalia Sokolova female 1992-03-08 jpg \N 0 \N 26 pisces [] [100,200,50] Plymouth [50.403724,-4.142123] 3.14159 \N 0.007 5.4 -20000000000000 [] [] \N [] -a7da1aa6-f425-4789-8947-b034786ed374 Vasily Sidorov male 1995-07-28 bmp +442012345678 1 2018-12-30 00:00:00 23 leo ['Sunny'] [250,244,10] Murmansk [68.970682,33.074981] 3.14159265358979 100000000000.00 800 -3.2 154400000 ['pound'] [16] 503 [] +a7da1aa6-f425-4789-8947-b034786ed374 Vasily Sidorov male 1995-07-28 bmp +442012345678 1 2018-12-30 00:00:00 23 leo ['Sunny'] [250,244,10] Murmansk [68.970682,33.074981] 3.14159265358979 100000000000 800 -3.2 154400000 ['pound'] [16] 503 [] Schema 00825_protobuf_format_persons:Person @@ -150,9 +150,9 @@ nestiness { Binary representation is as expected Roundtrip: -a7522158-3d41-4b77-ad69-6c598ee55c49 Ivan Petrov male 1980-12-29 png +74951234567\0 1 2019-01-05 18:45:00 38 capricorn ['Yesterday','Flowers'] [255,0,0] Moscow [55.753216,37.622504] 3.14 214.10 0.1 5.8 17060000000 ['meter','centimeter','kilometer'] [1,0.01,1000] 500 [501,502] +a7522158-3d41-4b77-ad69-6c598ee55c49 Ivan Petrov male 1980-12-29 png +74951234567\0 1 2019-01-05 18:45:00 38 capricorn ['Yesterday','Flowers'] [255,0,0] Moscow [55.753216,37.622504] 3.14 214.1 0.1 5.8 17060000000 ['meter','centimeter','kilometer'] [1,0.01,1000] 500 [501,502] c694ad8a-f714-4ea3-907d-fd54fb25d9b5 Natalia Sokolova female 1992-03-08 jpg \N 0 \N 26 pisces [] [100,200,50] Plymouth [50.403724,-4.142123] 3.14159 \N 0.007 5.4 -20000000000000 [] [] \N [] -a7da1aa6-f425-4789-8947-b034786ed374 Vasily Sidorov male 1995-07-28 bmp +442012345678 1 2018-12-30 00:00:00 23 leo ['Sunny'] [250,244,10] Murmansk [68.970680,33.074982] 3.14159265358979 100000000000.00 800 -3.2 154400000 ['pound'] [16] 503 [] +a7da1aa6-f425-4789-8947-b034786ed374 Vasily Sidorov male 1995-07-28 bmp +442012345678 1 2018-12-30 00:00:00 23 leo ['Sunny'] [250,244,10] Murmansk [68.97068,33.074982] 3.14159265358979 100000000000 800 -3.2 154400000 ['pound'] [16] 503 [] Schema 00825_protobuf_format_persons:AltPerson @@ -264,14 +264,14 @@ nestiness_a_b_c_d: 503 Binary representation is as expected Roundtrip: -a7522158-3d41-4b77-ad69-6c598ee55c49 Ivan Petrov male 1980-12-29 \N 74951234567\0\0 1 2019-01-05 18:45:00 38 capricorn [] [255,0,0] [55.000000,37.000000] 3.140000104904175 214.00 0.1 5.0 17060000000 ['meter','centimeter','kilometer'] [1,0.01,1000] 500 [501,502] -c694ad8a-f714-4ea3-907d-fd54fb25d9b5 Natalia Sokolova female 1992-03-08 \N \N 0 \N 26 pisces [] [100,200,50] [50.000000,-4.000000] 3.141590118408203 \N 0.007 5.0 -20000000000000 [] [] \N [] -a7da1aa6-f425-4789-8947-b034786ed374 Vasily Sidorov male 1995-07-28 \N 442012345678\0 1 2018-12-30 00:00:00 23 leo [] [250,244,10] [68.000000,33.000000] 3.1415927410125732 100000000000.00 800 -3.0 154400000 ['pound'] [16] 503 [] +a7522158-3d41-4b77-ad69-6c598ee55c49 Ivan Petrov male 1980-12-29 \N 74951234567\0\0 1 2019-01-05 18:45:00 38 capricorn [] [255,0,0] [55,37] 3.140000104904175 214 0.1 5 17060000000 ['meter','centimeter','kilometer'] [1,0.01,1000] 500 [501,502] +c694ad8a-f714-4ea3-907d-fd54fb25d9b5 Natalia Sokolova female 1992-03-08 \N \N 0 \N 26 pisces [] [100,200,50] [50,-4] 3.141590118408203 \N 0.007 5 -20000000000000 [] [] \N [] +a7da1aa6-f425-4789-8947-b034786ed374 Vasily Sidorov male 1995-07-28 \N 442012345678\0 1 2018-12-30 00:00:00 23 leo [] [250,244,10] [68,33] 3.1415927410125732 100000000000 800 -3 154400000 ['pound'] [16] 503 [] Schema 00825_protobuf_format_persons:StrPerson Binary representation: -00000000 a7 02 0a 24 61 37 35 32 32 31 35 38 2d 33 64 34 |...$a7522158-3d4| +00000000 a6 02 0a 24 61 37 35 32 32 31 35 38 2d 33 64 34 |...$a7522158-3d4| 00000010 31 2d 34 62 37 37 2d 61 64 36 39 2d 36 63 35 39 |1-4b77-ad69-6c59| 00000020 38 65 65 35 35 63 34 39 12 04 49 76 61 6e 1a 06 |8ee55c49..Ivan..| 00000030 50 65 74 72 6f 76 22 04 6d 61 6c 65 2a 0a 31 39 |Petrov".male*.19| @@ -283,42 +283,42 @@ Binary representation: 00000090 72 73 6a 03 32 35 35 6a 01 30 6a 01 30 72 06 4d |rsj.255j.0j.0r.M| 000000a0 6f 73 63 6f 77 7a 09 35 35 2e 37 35 33 32 31 35 |oscowz.55.753215| 000000b0 7a 09 33 37 2e 36 32 32 35 30 34 82 01 04 33 2e |z.37.622504...3.| -000000c0 31 34 8a 01 06 32 31 34 2e 31 30 92 01 03 30 2e |14...214.10...0.| -000000d0 31 9a 01 03 35 2e 38 a2 01 0b 31 37 30 36 30 30 |1...5.8...170600| -000000e0 30 30 30 30 30 aa 01 2d 0a 05 6d 65 74 65 72 0a |00000..-..meter.| -000000f0 0a 63 65 6e 74 69 6d 65 74 65 72 0a 09 6b 69 6c |.centimeter..kil| -00000100 6f 6d 65 74 65 72 12 01 31 12 04 30 2e 30 31 12 |ometer..1..0.01.| -00000110 04 31 30 30 30 b2 01 11 0a 0f 0a 03 35 30 30 12 |.1000.......500.| -00000120 03 35 30 31 12 03 35 30 32 b4 01 0a 24 63 36 39 |.501..502...$c69| -00000130 34 61 64 38 61 2d 66 37 31 34 2d 34 65 61 33 2d |4ad8a-f714-4ea3-| -00000140 39 30 37 64 2d 66 64 35 34 66 62 32 35 64 39 62 |907d-fd54fb25d9b| -00000150 35 12 07 4e 61 74 61 6c 69 61 1a 08 53 6f 6b 6f |5..Natalia..Soko| -00000160 6c 6f 76 61 22 06 66 65 6d 61 6c 65 2a 0a 31 39 |lova".female*.19| -00000170 39 32 2d 30 33 2d 30 38 42 01 30 52 02 32 36 5a |92-03-08B.0R.26Z| -00000180 06 70 69 73 63 65 73 6a 03 31 30 30 6a 03 32 30 |.piscesj.100j.20| -00000190 30 6a 02 35 30 72 08 50 6c 79 6d 6f 75 74 68 7a |0j.50r.Plymouthz| -000001a0 09 35 30 2e 34 30 33 37 32 34 7a 09 2d 34 2e 31 |.50.403724z.-4.1| -000001b0 34 32 31 32 33 82 01 07 33 2e 31 34 31 35 39 92 |42123...3.14159.| -000001c0 01 05 30 2e 30 30 37 9a 01 03 35 2e 34 a2 01 0f |..0.007...5.4...| -000001d0 2d 32 30 30 30 30 30 30 30 30 30 30 30 30 30 84 |-20000000000000.| -000001e0 02 0a 24 61 37 64 61 31 61 61 36 2d 66 34 32 35 |..$a7da1aa6-f425| -000001f0 2d 34 37 38 39 2d 38 39 34 37 2d 62 30 33 34 37 |-4789-8947-b0347| -00000200 38 36 65 64 33 37 34 12 06 56 61 73 69 6c 79 1a |86ed374..Vasily.| -00000210 07 53 69 64 6f 72 6f 76 22 04 6d 61 6c 65 2a 0a |.Sidorov".male*.| -00000220 31 39 39 35 2d 30 37 2d 32 38 3a 0d 2b 34 34 32 |1995-07-28:.+442| -00000230 30 31 32 33 34 35 36 37 38 42 01 31 4a 13 32 30 |012345678B.1J.20| -00000240 31 38 2d 31 32 2d 33 30 20 30 30 3a 30 30 3a 30 |18-12-30 00:00:0| -00000250 30 52 02 32 33 5a 03 6c 65 6f 62 05 53 75 6e 6e |0R.23Z.leob.Sunn| -00000260 79 6a 03 32 35 30 6a 03 32 34 34 6a 02 31 30 72 |yj.250j.244j.10r| -00000270 08 4d 75 72 6d 61 6e 73 6b 7a 09 36 38 2e 39 37 |.Murmanskz.68.97| -00000280 30 36 38 32 7a 09 33 33 2e 30 37 34 39 38 31 82 |0682z.33.074981.| -00000290 01 10 33 2e 31 34 31 35 39 32 36 35 33 35 38 39 |..3.141592653589| -000002a0 37 39 8a 01 0f 31 30 30 30 30 30 30 30 30 30 30 |79...10000000000| -000002b0 30 2e 30 30 92 01 03 38 30 30 9a 01 04 2d 33 2e |0.00...800...-3.| -000002c0 32 a2 01 09 31 35 34 34 30 30 30 30 30 aa 01 0b |2...154400000...| -000002d0 0a 05 70 6f 75 6e 64 12 02 31 36 b2 01 07 0a 05 |..pound..16.....| -000002e0 0a 03 35 30 33 |..503| -000002e5 +000000c0 31 34 8a 01 05 32 31 34 2e 31 92 01 03 30 2e 31 |14...214.1...0.1| +000000d0 9a 01 03 35 2e 38 a2 01 0b 31 37 30 36 30 30 30 |...5.8...1706000| +000000e0 30 30 30 30 aa 01 2d 0a 05 6d 65 74 65 72 0a 0a |0000..-..meter..| +000000f0 63 65 6e 74 69 6d 65 74 65 72 0a 09 6b 69 6c 6f |centimeter..kilo| +00000100 6d 65 74 65 72 12 01 31 12 04 30 2e 30 31 12 04 |meter..1..0.01..| +00000110 31 30 30 30 b2 01 11 0a 0f 0a 03 35 30 30 12 03 |1000.......500..| +00000120 35 30 31 12 03 35 30 32 b4 01 0a 24 63 36 39 34 |501..502...$c694| +00000130 61 64 38 61 2d 66 37 31 34 2d 34 65 61 33 2d 39 |ad8a-f714-4ea3-9| +00000140 30 37 64 2d 66 64 35 34 66 62 32 35 64 39 62 35 |07d-fd54fb25d9b5| +00000150 12 07 4e 61 74 61 6c 69 61 1a 08 53 6f 6b 6f 6c |..Natalia..Sokol| +00000160 6f 76 61 22 06 66 65 6d 61 6c 65 2a 0a 31 39 39 |ova".female*.199| +00000170 32 2d 30 33 2d 30 38 42 01 30 52 02 32 36 5a 06 |2-03-08B.0R.26Z.| +00000180 70 69 73 63 65 73 6a 03 31 30 30 6a 03 32 30 30 |piscesj.100j.200| +00000190 6a 02 35 30 72 08 50 6c 79 6d 6f 75 74 68 7a 09 |j.50r.Plymouthz.| +000001a0 35 30 2e 34 30 33 37 32 34 7a 09 2d 34 2e 31 34 |50.403724z.-4.14| +000001b0 32 31 32 33 82 01 07 33 2e 31 34 31 35 39 92 01 |2123...3.14159..| +000001c0 05 30 2e 30 30 37 9a 01 03 35 2e 34 a2 01 0f 2d |.0.007...5.4...-| +000001d0 32 30 30 30 30 30 30 30 30 30 30 30 30 30 81 02 |20000000000000..| +000001e0 0a 24 61 37 64 61 31 61 61 36 2d 66 34 32 35 2d |.$a7da1aa6-f425-| +000001f0 34 37 38 39 2d 38 39 34 37 2d 62 30 33 34 37 38 |4789-8947-b03478| +00000200 36 65 64 33 37 34 12 06 56 61 73 69 6c 79 1a 07 |6ed374..Vasily..| +00000210 53 69 64 6f 72 6f 76 22 04 6d 61 6c 65 2a 0a 31 |Sidorov".male*.1| +00000220 39 39 35 2d 30 37 2d 32 38 3a 0d 2b 34 34 32 30 |995-07-28:.+4420| +00000230 31 32 33 34 35 36 37 38 42 01 31 4a 13 32 30 31 |12345678B.1J.201| +00000240 38 2d 31 32 2d 33 30 20 30 30 3a 30 30 3a 30 30 |8-12-30 00:00:00| +00000250 52 02 32 33 5a 03 6c 65 6f 62 05 53 75 6e 6e 79 |R.23Z.leob.Sunny| +00000260 6a 03 32 35 30 6a 03 32 34 34 6a 02 31 30 72 08 |j.250j.244j.10r.| +00000270 4d 75 72 6d 61 6e 73 6b 7a 09 36 38 2e 39 37 30 |Murmanskz.68.970| +00000280 36 38 32 7a 09 33 33 2e 30 37 34 39 38 31 82 01 |682z.33.074981..| +00000290 10 33 2e 31 34 31 35 39 32 36 35 33 35 38 39 37 |.3.1415926535897| +000002a0 39 8a 01 0c 31 30 30 30 30 30 30 30 30 30 30 30 |9...100000000000| +000002b0 92 01 03 38 30 30 9a 01 04 2d 33 2e 32 a2 01 09 |...800...-3.2...| +000002c0 31 35 34 34 30 30 30 30 30 aa 01 0b 0a 05 70 6f |154400000.....po| +000002d0 75 6e 64 12 02 31 36 b2 01 07 0a 05 0a 03 35 30 |und..16.......50| +000002e0 33 |3| +000002e1 MESSAGE #1 AT 0x00000002 uuid: "a7522158-3d41-4b77-ad69-6c598ee55c49" @@ -340,7 +340,7 @@ hometown: "Moscow" location: "55.753215" location: "37.622504" pi: "3.14" -lotteryWin: "214.10" +lotteryWin: "214.1" someRatio: "0.1" temperature: "5.8" randomBigNumber: "17060000000" @@ -359,7 +359,7 @@ nestiness_a { e: "502" } } -MESSAGE #2 AT 0x0000012B +MESSAGE #2 AT 0x0000012A uuid: "c694ad8a-f714-4ea3-907d-fd54fb25d9b5" name: "Natalia" surname: "Sokolova" @@ -378,7 +378,7 @@ pi: "3.14159" someRatio: "0.007" temperature: "5.4" randomBigNumber: "-20000000000000" -MESSAGE #3 AT 0x000001E1 +MESSAGE #3 AT 0x000001E0 uuid: "a7da1aa6-f425-4789-8947-b034786ed374" name: "Vasily" surname: "Sidorov" @@ -397,7 +397,7 @@ hometown: "Murmansk" location: "68.970682" location: "33.074981" pi: "3.14159265358979" -lotteryWin: "100000000000.00" +lotteryWin: "100000000000" someRatio: "800" temperature: "-3.2" randomBigNumber: "154400000" @@ -414,9 +414,9 @@ nestiness_a { Binary representation is as expected Roundtrip: -a7522158-3d41-4b77-ad69-6c598ee55c49 Ivan Petrov male 1980-12-29 \N +74951234567\0 1 2019-01-05 18:45:00 38 capricorn ['Yesterday','Flowers'] [255,0,0] Moscow [55.753215,37.622504] 3.14 214.10 0.1 5.8 17060000000 ['meter','centimeter','kilometer'] [1,0.01,1000] 500 [501,502] +a7522158-3d41-4b77-ad69-6c598ee55c49 Ivan Petrov male 1980-12-29 \N +74951234567\0 1 2019-01-05 18:45:00 38 capricorn ['Yesterday','Flowers'] [255,0,0] Moscow [55.753215,37.622504] 3.14 214.1 0.1 5.8 17060000000 ['meter','centimeter','kilometer'] [1,0.01,1000] 500 [501,502] c694ad8a-f714-4ea3-907d-fd54fb25d9b5 Natalia Sokolova female 1992-03-08 \N \N 0 \N 26 pisces [] [100,200,50] Plymouth [50.403724,-4.142123] 3.14159 \N 0.007 5.4 -20000000000000 [] [] \N [] -a7da1aa6-f425-4789-8947-b034786ed374 Vasily Sidorov male 1995-07-28 \N +442012345678 1 2018-12-30 00:00:00 23 leo ['Sunny'] [250,244,10] Murmansk [68.970682,33.074981] 3.14159265358979 100000000000.00 800 -3.2 154400000 ['pound'] [16] 503 [] +a7da1aa6-f425-4789-8947-b034786ed374 Vasily Sidorov male 1995-07-28 \N +442012345678 1 2018-12-30 00:00:00 23 leo ['Sunny'] [250,244,10] Murmansk [68.970682,33.074981] 3.14159265358979 100000000000 800 -3.2 154400000 ['pound'] [16] 503 [] Schema 00825_protobuf_format_syntax2:Syntax2Person @@ -564,6 +564,6 @@ Nestiness { Binary representation is as expected Roundtrip: -a7522158-3d41-4b77-ad69-6c598ee55c49 Ivan Petrov male 1980-12-29 png +74951234567\0 1 2019-01-05 18:45:00 38 capricorn ['Yesterday','Flowers'] [255,0,0] Moscow [55.753216,37.622504] 3.14 214.10 0.1 5.8 17060000000 ['meter','centimeter','kilometer'] [1,0.01,1000] 500 [501,502] +a7522158-3d41-4b77-ad69-6c598ee55c49 Ivan Petrov male 1980-12-29 png +74951234567\0 1 2019-01-05 18:45:00 38 capricorn ['Yesterday','Flowers'] [255,0,0] Moscow [55.753216,37.622504] 3.14 214.1 0.1 5.8 17060000000 ['meter','centimeter','kilometer'] [1,0.01,1000] 500 [501,502] c694ad8a-f714-4ea3-907d-fd54fb25d9b5 Natalia Sokolova female 1992-03-08 jpg \N 0 \N 26 pisces [] [100,200,50] Plymouth [50.403724,-4.142123] 3.14159 \N 0.007 5.4 -20000000000000 [] [] \N [] -a7da1aa6-f425-4789-8947-b034786ed374 Vasily Sidorov male 1995-07-28 bmp +442012345678 1 2018-12-30 00:00:00 23 leo ['Sunny'] [250,244,10] Murmansk [68.970680,33.074982] 3.14159265358979 100000000000.00 800 -3.2 154400000 ['pound'] [16] 503 [] +a7da1aa6-f425-4789-8947-b034786ed374 Vasily Sidorov male 1995-07-28 bmp +442012345678 1 2018-12-30 00:00:00 23 leo ['Sunny'] [250,244,10] Murmansk [68.97068,33.074982] 3.14159265358979 100000000000 800 -3.2 154400000 ['pound'] [16] 503 [] diff --git a/tests/queries/0_stateless/00837_minmax_index.reference b/tests/queries/0_stateless/00837_minmax_index.reference index 0f5a8eb904e..8bde896b02a 100644 --- a/tests/queries/0_stateless/00837_minmax_index.reference +++ b/tests/queries/0_stateless/00837_minmax_index.reference @@ -1,6 +1,6 @@ -0 5 4.7 6.50 cba b 2014-01-04 -1 5 4.7 6.50 cba b 2014-03-11 -11 5 4.7 6.50 cba b 2014-06-11 -12 5 4.7 6.50 cba b 2015-01-01 +0 5 4.7 6.5 cba b 2014-01-04 +1 5 4.7 6.5 cba b 2014-03-11 +11 5 4.7 6.5 cba b 2014-06-11 +12 5 4.7 6.5 cba b 2015-01-01 "rows_read": 4, "rows_read": 2, diff --git a/tests/queries/0_stateless/00837_minmax_index_replicated_zookeeper_long.reference b/tests/queries/0_stateless/00837_minmax_index_replicated_zookeeper_long.reference index f5df12ad297..efae13c2a40 100644 --- a/tests/queries/0_stateless/00837_minmax_index_replicated_zookeeper_long.reference +++ b/tests/queries/0_stateless/00837_minmax_index_replicated_zookeeper_long.reference @@ -1,8 +1,8 @@ -0 5 4.7 6.50 cba b 2014-01-04 -1 5 4.7 6.50 cba b 2014-03-11 -12 5 4.7 6.50 cba b 2014-06-11 -13 5 4.7 6.50 cba b 2015-01-01 -0 5 4.7 6.50 cba b 2014-01-04 -1 5 4.7 6.50 cba b 2014-03-11 -12 5 4.7 6.50 cba b 2014-06-11 -13 5 4.7 6.50 cba b 2015-01-01 +0 5 4.7 6.5 cba b 2014-01-04 +1 5 4.7 6.5 cba b 2014-03-11 +12 5 4.7 6.5 cba b 2014-06-11 +13 5 4.7 6.5 cba b 2015-01-01 +0 5 4.7 6.5 cba b 2014-01-04 +1 5 4.7 6.5 cba b 2014-03-11 +12 5 4.7 6.5 cba b 2014-06-11 +13 5 4.7 6.5 cba b 2015-01-01 diff --git a/tests/queries/0_stateless/00838_unique_index.reference b/tests/queries/0_stateless/00838_unique_index.reference index df890188102..7183a3b7370 100644 --- a/tests/queries/0_stateless/00838_unique_index.reference +++ b/tests/queries/0_stateless/00838_unique_index.reference @@ -1,24 +1,24 @@ -0 5 4.7 6.50 cba b 2014-01-04 -1 5 4.7 6.50 cba b 2014-03-11 -12 5 4.7 6.50 cba b 2014-06-11 -13 5 4.7 6.50 cba b 2015-01-01 +0 5 4.7 6.5 cba b 2014-01-04 +1 5 4.7 6.5 cba b 2014-03-11 +12 5 4.7 6.5 cba b 2014-06-11 +13 5 4.7 6.5 cba b 2015-01-01 "rows_read": 4, -2 2 4.5 2.50 abc a 2014-01-01 -6 2 4.5 2.50 abc a 2014-02-11 +2 2 4.5 2.5 abc a 2014-01-01 +6 2 4.5 2.5 abc a 2014-02-11 7 5 6.9 1.57 bac c 2014-04-11 -8 2 4.5 2.50 abc a 2014-05-11 +8 2 4.5 2.5 abc a 2014-05-11 9 5 6.9 1.57 bac c 2014-07-11 5 5 6.9 1.57 bac c 2014-11-11 -4 2 4.5 2.50 abc a 2016-01-01 +4 2 4.5 2.5 abc a 2016-01-01 3 5 6.9 1.57 bac c 2017-01-01 "rows_read": 8, "rows_read": 2, -2 2 4.5 2.50 abc a 2014-01-01 -6 2 4.5 2.50 abc a 2014-02-11 +2 2 4.5 2.5 abc a 2014-01-01 +6 2 4.5 2.5 abc a 2014-02-11 7 5 6.9 1.57 bac c 2014-04-11 -8 2 4.5 2.50 abc a 2014-05-11 +8 2 4.5 2.5 abc a 2014-05-11 9 5 6.9 1.57 bac c 2014-07-11 5 5 6.9 1.57 bac c 2014-11-11 -4 2 4.5 2.50 abc a 2016-01-01 +4 2 4.5 2.5 abc a 2016-01-01 3 5 6.9 1.57 bac c 2017-01-01 "rows_read": 8, diff --git a/tests/queries/0_stateless/00861_decimal_quoted_csv.reference b/tests/queries/0_stateless/00861_decimal_quoted_csv.reference index 6a219226835..3ff285acef8 100644 --- a/tests/queries/0_stateless/00861_decimal_quoted_csv.reference +++ b/tests/queries/0_stateless/00861_decimal_quoted_csv.reference @@ -1,5 +1,5 @@ -1 1.00 1.00 1.00 -2 -1.00 -1.00 -1.00 -3 1.00 1.00 1.00 -4 -0.10 -0.10 -0.10 +1 1 1 1 +2 -1 -1 -1 +3 1 1 1 +4 -0.1 -0.1 -0.1 5 0.01 0.01 0.01 diff --git a/tests/queries/0_stateless/00862_decimal_in.reference b/tests/queries/0_stateless/00862_decimal_in.reference index 2e4eb5e6dc7..0cd93f69c38 100644 --- a/tests/queries/0_stateless/00862_decimal_in.reference +++ b/tests/queries/0_stateless/00862_decimal_in.reference @@ -1,18 +1,18 @@ -128.00 128.00 -128.00 128.00 -128.00 128.00 -128.00 128.00 -128.00 128.00 -128.00 128.00 -32.00 32.00 -32.00 32.00 -32.00 32.00 -32.00 32.00 -32.00 32.00 -32.00 32.00 -64.00 64.00 -64.00 64.00 -64.00 64.00 -64.00 64.00 -64.00 64.00 -64.00 64.00 +128 128 +128 128 +128 128 +128 128 +128 128 +128 128 +32 32 +32 32 +32 32 +32 32 +32 32 +32 32 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 diff --git a/tests/queries/0_stateless/00900_long_parquet.reference b/tests/queries/0_stateless/00900_long_parquet.reference index d0cb71338af..9ee4fc11a55 100644 --- a/tests/queries/0_stateless/00900_long_parquet.reference +++ b/tests/queries/0_stateless/00900_long_parquet.reference @@ -60,17 +60,17 @@ dest from null: -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 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 \N \N \N \N \N \N \N \N \N \N \N \N \N \N -1 [1,-2,3] [1,2,3] [100,-200,300] [100,200,300] [10000000,-20000000,30000000] [10000000,2000000,3000000] [100000000000000,-200000000000,3000000000000] [100000000000000,20000000000000,3000000000000] ['Some string','Some string','Some string'] ['0000','1111','2222'] [42.42,424.2,0.4242] [424242.424242,4242042420.242424,42] ['2000-01-01','2001-01-01','2002-01-01'] ['2000-01-01 00:00:00','2001-01-01 00:00:00','2002-01-01 00:00:00'] [0.20,10.00,4.00] [4.00,10000.10,10000.10] [1000000000.00,90.00,101001.01] -1 [1,-2,3] [1,2,3] [100,-200,300] [100,200,300] [10000000,-20000000,30000000] [10000000,2000000,3000000] [100000000000000,-200000000000,3000000000000] [100000000000000,20000000000000,3000000000000] ['Some string','Some string','Some string'] ['0000','1111','2222'] [42.42,424.2,0.4242] [424242.424242,4242042420.242424,42] ['2000-01-01','2001-01-01','2002-01-01'] ['2000-01-01 00:00:00','2001-01-01 00:00:00','2002-01-01 00:00:00'] [0.20,10.00,4.00] [4.00,10000.10,10000.10] [1000000000.00,90.00,101001.01] +1 [1,-2,3] [1,2,3] [100,-200,300] [100,200,300] [10000000,-20000000,30000000] [10000000,2000000,3000000] [100000000000000,-200000000000,3000000000000] [100000000000000,20000000000000,3000000000000] ['Some string','Some string','Some string'] ['0000','1111','2222'] [42.42,424.2,0.4242] [424242.424242,4242042420.242424,42] ['2000-01-01','2001-01-01','2002-01-01'] ['2000-01-01 00:00:00','2001-01-01 00:00:00','2002-01-01 00:00:00'] [0.2,10,4] [4,10000.1,10000.1] [1000000000,90,101001.01] +1 [1,-2,3] [1,2,3] [100,-200,300] [100,200,300] [10000000,-20000000,30000000] [10000000,2000000,3000000] [100000000000000,-200000000000,3000000000000] [100000000000000,20000000000000,3000000000000] ['Some string','Some string','Some string'] ['0000','1111','2222'] [42.42,424.2,0.4242] [424242.424242,4242042420.242424,42] ['2000-01-01','2001-01-01','2002-01-01'] ['2000-01-01 00:00:00','2001-01-01 00:00:00','2002-01-01 00:00:00'] [0.2,10,4] [4,10000.1,10000.1] [1000000000,90,101001.01] 2 [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] 2 [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] -1 [1,NULL,2] [NULL,'Some string',NULL] [0.00,NULL,42.42] -1 [1,NULL,2] [NULL,'Some string',NULL] [0.00,NULL,42.42] +1 [1,NULL,2] [NULL,'Some string',NULL] [0,NULL,42.42] +1 [1,NULL,2] [NULL,'Some string',NULL] [0,NULL,42.42] 2 [NULL] [NULL] [NULL] 2 [NULL] [NULL] [NULL] 3 [] [] [] 3 [] [] [] [[[1,2,3],[1,2,3]],[[1,2,3]],[[],[1,2,3]]] [[['Some string','Some string'],[]],[['Some string']],[[]]] [[NULL,1,2],[NULL],[1,2],[]] [['Some string',NULL,'Some string'],[NULL],[]] [[[1,2,3],[1,2,3]],[[1,2,3]],[[],[1,2,3]]] [[['Some string','Some string'],[]],[['Some string']],[[]]] [[NULL,1,2],[NULL],[1,2],[]] [['Some string',NULL,'Some string'],[NULL],[]] -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/00900_long_parquet_load.reference b/tests/queries/0_stateless/00900_long_parquet_load.reference index f03f56c7125..0fc050891f6 100644 --- a/tests/queries/0_stateless/00900_long_parquet_load.reference +++ b/tests/queries/0_stateless/00900_long_parquet_load.reference @@ -3,8 +3,8 @@ 1 0 1 1 1 10 1.1 10.1 01/01/09 1 1230768060 === Try load data from alltypes_list.parquet [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] -[1,-2,3] [1,2,3] [100,-200,300] [100,200,300] [10000000,-20000000,30000000] [10000000,2000000,3000000] [100000000000000,-200000000000,3000000000000] [100000000000000,20000000000000,3000000000000] ['Some string','Some string','Some string'] ['0000','1111','2222'] [42.42,424.2,0.4242] [424242.424242,4242042420.242424,42] ['2000-01-01','2001-01-01','2002-01-01'] ['2000-01-01 00:00:00','2001-01-01 00:00:00','2002-01-01 00:00:00'] [0.20,10.00,4.00] [4.00,10000.10,10000.10] [1000000000.00,90.00,101001.01] -[1,-2,3] [1,2,3] [100,-200,300] [100,200,300] [10000000,-20000000,30000000] [10000000,2000000,3000000] [100000000000000,-200000000000,3000000000000] [100000000000000,20000000000000,3000000000000] ['Some string','Some string','Some string'] ['0000','1111','2222'] [42.42,424.2,0.4242] [424242.424242,4242042420.242424,42] ['2000-01-01','2001-01-01','2002-01-01'] ['2000-01-01 00:00:00','2001-01-01 00:00:00','2002-01-01 00:00:00'] [0.20,10.00,4.00] [4.00,10000.10,10000.10] [1000000000.00,90.00,101001.01] +[1,-2,3] [1,2,3] [100,-200,300] [100,200,300] [10000000,-20000000,30000000] [10000000,2000000,3000000] [100000000000000,-200000000000,3000000000000] [100000000000000,20000000000000,3000000000000] ['Some string','Some string','Some string'] ['0000','1111','2222'] [42.42,424.2,0.4242] [424242.424242,4242042420.242424,42] ['2000-01-01','2001-01-01','2002-01-01'] ['2000-01-01 00:00:00','2001-01-01 00:00:00','2002-01-01 00:00:00'] [0.2,10,4] [4,10000.1,10000.1] [1000000000,90,101001.01] +[1,-2,3] [1,2,3] [100,-200,300] [100,200,300] [10000000,-20000000,30000000] [10000000,2000000,3000000] [100000000000000,-200000000000,3000000000000] [100000000000000,20000000000000,3000000000000] ['Some string','Some string','Some string'] ['0000','1111','2222'] [42.42,424.2,0.4242] [424242.424242,4242042420.242424,42] ['2000-01-01','2001-01-01','2002-01-01'] ['2000-01-01 00:00:00','2001-01-01 00:00:00','2002-01-01 00:00:00'] [0.2,10,4] [4,10000.1,10000.1] [1000000000,90,101001.01] === Try load data from alltypes_plain.parquet 4 1 0 0 0 0 0 0 03/01/09 0 1235865600 5 0 1 1 1 10 1.1 10.1 03/01/09 1 1235865660 @@ -64,30 +64,30 @@ idx10 ['This','is','a','test'] \n === Try load data from byte_array_decimal.parquet -1.00 -2.00 -3.00 -4.00 -5.00 -6.00 -7.00 -8.00 -9.00 -10.00 -11.00 -12.00 -13.00 -14.00 -15.00 -16.00 -17.00 -18.00 -19.00 -20.00 -21.00 -22.00 -23.00 -24.00 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 === Try load data from datapage_v2.snappy.parquet Code: 33. DB::ParsingEx---tion: Error while reading Parquet data: IOError: Not yet implemented: Unsupported encoding.: While executing ParquetBlockInputFormat: data for INSERT was parsed from stdin. (CANNOT_READ_ALL_DATA) @@ -137,135 +137,135 @@ Code: 33. DB::ParsingEx---tion: Error while reading Parquet data: IOError: Not y 1552 1552 === Try load data from fixed_length_decimal.parquet -1.00 -2.00 -3.00 -4.00 -5.00 -6.00 -7.00 -8.00 -9.00 -10.00 -11.00 -12.00 -13.00 -14.00 -15.00 -16.00 -17.00 -18.00 -19.00 -20.00 -21.00 -22.00 -23.00 -24.00 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 === Try load data from fixed_length_decimal_1.parquet -1.00 -2.00 -3.00 -4.00 -5.00 -6.00 -7.00 -8.00 -9.00 -10.00 -11.00 -12.00 -13.00 -14.00 -15.00 -16.00 -17.00 -18.00 -19.00 -20.00 -21.00 -22.00 -23.00 -24.00 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 === Try load data from fixed_length_decimal_legacy.parquet -1.00 -2.00 -3.00 -4.00 -5.00 -6.00 -7.00 -8.00 -9.00 -10.00 -11.00 -12.00 -13.00 -14.00 -15.00 -16.00 -17.00 -18.00 -19.00 -20.00 -21.00 -22.00 -23.00 -24.00 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 === Try load data from hadoop_lz4_compressed.parquet 1593604800 abc 42 1593604800 def 7.7 1593604801 abc 42.125 1593604801 def 7.7 === Try load data from int32_decimal.parquet -1.00 -2.00 -3.00 -4.00 -5.00 -6.00 -7.00 -8.00 -9.00 -10.00 -11.00 -12.00 -13.00 -14.00 -15.00 -16.00 -17.00 -18.00 -19.00 -20.00 -21.00 -22.00 -23.00 -24.00 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 === Try load data from int64_decimal.parquet -1.00 -2.00 -3.00 -4.00 -5.00 -6.00 -7.00 -8.00 -9.00 -10.00 -11.00 -12.00 -13.00 -14.00 -15.00 -16.00 -17.00 -18.00 -19.00 -20.00 -21.00 -22.00 -23.00 -24.00 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 === Try load data from list_columns.parquet [1,2,3] ['abc','efg','hij'] [NULL,1] [] @@ -325,7 +325,7 @@ Code: 33. DB::ParsingEx---tion: Error while reading Parquet data: IOError: Not y 6 [] [] {} [] (NULL,[],([]),{}) 7 [] [[],[5,6]] {'k1':NULL,'k3':NULL} [] (7,[2,3,NULL],([[],[(NULL,NULL)],[]]),{}) === Try load data from nullable_list.parquet -[1,NULL,2] [NULL,'Some string',NULL] [0.00,NULL,42.42] +[1,NULL,2] [NULL,'Some string',NULL] [0,NULL,42.42] [NULL] [NULL] [NULL] [] [] [] === Try load data from nulls.snappy.parquet diff --git a/tests/queries/0_stateless/00900_orc_arrays_load.reference b/tests/queries/0_stateless/00900_orc_arrays_load.reference index 9b20ef98164..f894669fa0c 100644 --- a/tests/queries/0_stateless/00900_orc_arrays_load.reference +++ b/tests/queries/0_stateless/00900_orc_arrays_load.reference @@ -1,4 +1,4 @@ -[1,-2,3] [1,2,3] [100,-200,300] [100,200,300] [10000000,-20000000,30000000] [10000000,2000000,3000000] [100000000000000,-200000000000,3000000000000] [100000000000000,20000000000000,3000000000000] ['Some string','Some string','Some string'] ['0000','1111','2222'] [42.42,424.2,0.4242] [424242.424242,4242042420.242424,42] ['2000-01-01','2001-01-01','2002-01-01'] ['2000-01-01 00:00:00','2001-01-01 00:00:00','2002-01-01 00:00:00'] [0.20,10.00,4.00] [4.00,10000.10,10000.10] [1000000000.00,90.00,101001.01] +[1,-2,3] [1,2,3] [100,-200,300] [100,200,300] [10000000,-20000000,30000000] [10000000,2000000,3000000] [100000000000000,-200000000000,3000000000000] [100000000000000,20000000000000,3000000000000] ['Some string','Some string','Some string'] ['0000','1111','2222'] [42.42,424.2,0.4242] [424242.424242,4242042420.242424,42] ['2000-01-01','2001-01-01','2002-01-01'] ['2000-01-01 00:00:00','2001-01-01 00:00:00','2002-01-01 00:00:00'] [0.2,10,4] [4,10000.1,10000.1] [1000000000,90,101001.01] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] -[1,-2,3] [1,2,3] [100,-200,300] [100,200,300] [10000000,-20000000,30000000] [10000000,2000000,3000000] [100000000000000,-200000000000,3000000000000] [100000000000000,20000000000000,3000000000000] ['Some string','Some string','Some string'] ['0000','1111','2222'] [42.42,424.2,0.4242] [424242.424242,4242042420.242424,42] ['2000-01-01','2001-01-01','2002-01-01'] ['2000-01-01 00:00:00','2001-01-01 00:00:00','2002-01-01 00:00:00'] [0.20,10.00,4.00] [4.00,10000.10,10000.10] [1000000000.00,90.00,101001.01] +[1,-2,3] [1,2,3] [100,-200,300] [100,200,300] [10000000,-20000000,30000000] [10000000,2000000,3000000] [100000000000000,-200000000000,3000000000000] [100000000000000,20000000000000,3000000000000] ['Some string','Some string','Some string'] ['0000','1111','2222'] [42.42,424.2,0.4242] [424242.424242,4242042420.242424,42] ['2000-01-01','2001-01-01','2002-01-01'] ['2000-01-01 00:00:00','2001-01-01 00:00:00','2002-01-01 00:00:00'] [0.2,10,4] [4,10000.1,10000.1] [1000000000,90,101001.01] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] diff --git a/tests/queries/0_stateless/00900_orc_nullable_arrays_load.reference b/tests/queries/0_stateless/00900_orc_nullable_arrays_load.reference index 62e95652040..44b19f616d0 100644 --- a/tests/queries/0_stateless/00900_orc_nullable_arrays_load.reference +++ b/tests/queries/0_stateless/00900_orc_nullable_arrays_load.reference @@ -1,6 +1,6 @@ -[1,NULL,2] [NULL,'Some string',NULL] [0.00,NULL,42.42] +[1,NULL,2] [NULL,'Some string',NULL] [0,NULL,42.42] [NULL] [NULL] [NULL] [] [] [] -[1,NULL,2] [NULL,'Some string',NULL] [0.00,NULL,42.42] +[1,NULL,2] [NULL,'Some string',NULL] [0,NULL,42.42] [NULL] [NULL] [NULL] [] [] [] diff --git a/tests/queries/0_stateless/00910_decimal_group_array_crash_3783.reference b/tests/queries/0_stateless/00910_decimal_group_array_crash_3783.reference index 232d9aa7974..47e910f691d 100644 --- a/tests/queries/0_stateless/00910_decimal_group_array_crash_3783.reference +++ b/tests/queries/0_stateless/00910_decimal_group_array_crash_3783.reference @@ -1,9 +1,9 @@ -[1.00] -[1.00000] -[1.0000000000] -[499500.00] -[499500.00000] -[499500.0000000000] +[1] +[1] +[1] +[499500] +[499500] +[499500] 1545081300 [('ed87e57c-9331-462a-80b4-9f0c005e88c8',0.44)] -4341757 5657967 2018-11-01 16:47:46 txt 321.380000000000 315.080000000000 0.000000000000 2018-11-02 00:00:00 -4360430 5681495 2018-11-02 09:00:07 txt 274.350000000000 268.970000000000 0.000000000000 2018-11-02 00:00:00 +4341757 5657967 2018-11-01 16:47:46 txt 321.38 315.08 0 2018-11-02 00:00:00 +4360430 5681495 2018-11-02 09:00:07 txt 274.35 268.97 0 2018-11-02 00:00:00 diff --git a/tests/queries/0_stateless/00910_zookeeper_custom_compression_codecs_replicated_long.reference b/tests/queries/0_stateless/00910_zookeeper_custom_compression_codecs_replicated_long.reference index 3b7faecbba4..6b7bddf2ac5 100644 --- a/tests/queries/0_stateless/00910_zookeeper_custom_compression_codecs_replicated_long.reference +++ b/tests/queries/0_stateless/00910_zookeeper_custom_compression_codecs_replicated_long.reference @@ -22,6 +22,6 @@ 9175437371954010821 CREATE TABLE default.compression_codec_multiple_more_types_replicated\n(\n `id` Decimal(38, 13) CODEC(ZSTD(1), LZ4, ZSTD(1), ZSTD(1), Delta(2), Delta(4), Delta(1), LZ4HC(0)),\n `data` FixedString(12) CODEC(ZSTD(1), ZSTD(1), Delta(1), Delta(1), Delta(1), NONE, NONE, NONE, LZ4HC(0)),\n `ddd.age` Array(UInt8) CODEC(LZ4, LZ4HC(0), NONE, NONE, NONE, ZSTD(1), Delta(8)),\n `ddd.Name` Array(String) CODEC(LZ4, LZ4HC(0), NONE, NONE, NONE, ZSTD(1), Delta(8))\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/tables/default/test_00910/compression_codec_multiple_more_types_replicated\', \'1\')\nORDER BY tuple()\nSETTINGS index_granularity = 8192 1.5555555555555 hello world! [77] ['John'] -7.1000000000000 xxxxxxxxxxxx [127] ['Henry'] +7.1 xxxxxxxxxxxx [127] ['Henry'] ! 222 diff --git a/tests/queries/0_stateless/00927_asof_join_other_types.reference b/tests/queries/0_stateless/00927_asof_join_other_types.reference index a34437f66c2..83ee534ff91 100644 --- a/tests/queries/0_stateless/00927_asof_join_other_types.reference +++ b/tests/queries/0_stateless/00927_asof_join_other_types.reference @@ -13,15 +13,15 @@ 2 1970-01-01 03:00:01 1 0 2 1970-01-01 03:00:03 3 3 2 1970-01-01 03:00:05 5 3 -2 1.00000 1 0 -2 3.00000 3 3 -2 5.00000 5 3 -2 1.00000 1 0 -2 3.00000 3 3 -2 5.00000 5 3 -2 1.00000 1 0 -2 3.00000 3 3 -2 5.00000 5 3 +2 1 1 0 +2 3 3 3 +2 5 5 3 +2 1 1 0 +2 3 3 3 +2 5 5 3 +2 1 1 0 +2 3 3 3 +2 5 5 3 2 1970-01-01 03:00:00.001 1 0 2 1970-01-01 03:00:00.003 3 3 2 1970-01-01 03:00:00.005 5 3 diff --git a/tests/queries/0_stateless/00950_dict_get.reference b/tests/queries/0_stateless/00950_dict_get.reference index c1b502bf773..191eb40a889 100644 --- a/tests/queries/0_stateless/00950_dict_get.reference +++ b/tests/queries/0_stateless/00950_dict_get.reference @@ -31,18 +31,18 @@ dictGetOrDefault complex_hashed_strings 0 * * dictGet complex_cache_strings 1 1 1 dictGetOrDefault complex_cache_strings 1 1 1 dictGetOrDefault complex_cache_strings 0 * * -dictGet flat_decimals 1 1.0000 1.000000 1.0 (1.0000,1.000000,1.0) -dictGetOrDefault flat_decimals 1 1.0000 1.000000 1.0 (1.0000,1.000000,1.0) -dictGetOrDefault flat_decimals 0 42.0000 42.000000 42.0 (42.0000,42.000000,42.0) -dictGet hashed_decimals 1 1.0000 1.000000 1.0 (1.0000,1.000000,1.0) -dictGetOrDefault hashed_decimals 1 1.0000 1.000000 1.0 (1.0000,1.000000,1.0) -dictGetOrDefault hashed_decimals 0 42.0000 42.000000 42.0 (42.0000,42.000000,42.0) -dictGet cache_decimals 1 1.0000 1.000000 1.0 (1.0000,1.000000,1.0) -dictGetOrDefault cache_decimals 1 1.0000 1.000000 1.0 (1.0000,1.000000,1.0) -dictGetOrDefault cache_decimals 0 42.0000 42.000000 42.0 (42.0000,42.000000,42.0) -dictGet complex_hashed_decimals (1) 1.0000 1.000000 1.0 (1.0000,1.000000,1.0) -dictGetOrDefault complex_hashed_decimals (1) 1.0000 1.000000 1.0 (1.0000,1.000000,1.0) -dictGetOrDefault complex_hashed_decimals (0) 42.0000 42.000000 42.0 (42.0000,42.000000,42.0) -dictGet complex_cache_decimals (1) 1.0000 1.000000 1.0 (1.0000,1.000000,1.0) -dictGetOrDefault complex_cache_decimals (1) 1.0000 1.000000 1.0 (1.0000,1.000000,1.0) -dictGetOrDefault complex_cache_decimals (0) 42.0000 42.000000 42.0 (42.0000,42.000000,42.0) +dictGet flat_decimals 1 1 1 1 (1,1,1) +dictGetOrDefault flat_decimals 1 1 1 1 (1,1,1) +dictGetOrDefault flat_decimals 0 42 42 42 (42,42,42) +dictGet hashed_decimals 1 1 1 1 (1,1,1) +dictGetOrDefault hashed_decimals 1 1 1 1 (1,1,1) +dictGetOrDefault hashed_decimals 0 42 42 42 (42,42,42) +dictGet cache_decimals 1 1 1 1 (1,1,1) +dictGetOrDefault cache_decimals 1 1 1 1 (1,1,1) +dictGetOrDefault cache_decimals 0 42 42 42 (42,42,42) +dictGet complex_hashed_decimals (1) 1 1 1 (1,1,1) +dictGetOrDefault complex_hashed_decimals (1) 1 1 1 (1,1,1) +dictGetOrDefault complex_hashed_decimals (0) 42 42 42 (42,42,42) +dictGet complex_cache_decimals (1) 1 1 1 (1,1,1) +dictGetOrDefault complex_cache_decimals (1) 1 1 1 (1,1,1) +dictGetOrDefault complex_cache_decimals (0) 42 42 42 (42,42,42) diff --git a/tests/queries/0_stateless/00974_low_cardinality_cast.sql b/tests/queries/0_stateless/00974_low_cardinality_cast.sql index e369a8c169e..b52c00513d3 100644 --- a/tests/queries/0_stateless/00974_low_cardinality_cast.sql +++ b/tests/queries/0_stateless/00974_low_cardinality_cast.sql @@ -1,3 +1,5 @@ +SET cast_keep_nullable = 0; + SELECT CAST('Hello' AS LowCardinality(Nullable(String))); SELECT CAST(Null AS LowCardinality(Nullable(String))); SELECT CAST(CAST('Hello' AS LowCardinality(Nullable(String))) AS String); diff --git a/tests/queries/0_stateless/00975_values_list.reference b/tests/queries/0_stateless/00975_values_list.reference index f8ada08d130..d0811d264b0 100644 --- a/tests/queries/0_stateless/00975_values_list.reference +++ b/tests/queries/0_stateless/00975_values_list.reference @@ -10,5 +10,5 @@ cadabra abracadabra 23 23 23 24 24 24 -1.6660 a b +1.666 a b \N diff --git a/tests/queries/0_stateless/00979_toFloat_monotonicity.reference b/tests/queries/0_stateless/00979_toFloat_monotonicity.reference index 7d9895ef9f3..b8ec6976930 100644 --- a/tests/queries/0_stateless/00979_toFloat_monotonicity.reference +++ b/tests/queries/0_stateless/00979_toFloat_monotonicity.reference @@ -2,5 +2,5 @@ 7777 7777 7777 -7777.000 -7777.000 +7777 +7777 diff --git a/tests/queries/0_stateless/00980_crash_nullable_decimal.reference b/tests/queries/0_stateless/00980_crash_nullable_decimal.reference index be6e399c4d9..fcb49fa9945 100644 --- a/tests/queries/0_stateless/00980_crash_nullable_decimal.reference +++ b/tests/queries/0_stateless/00980_crash_nullable_decimal.reference @@ -1,7 +1,7 @@ -1.00 -1.00 -1.00 -1.00 -1.00 -1.00 -1.00 +1 +1 +1 +1 +1 +1 +1 diff --git a/tests/queries/0_stateless/00987_distributed_stack_overflow.sql b/tests/queries/0_stateless/00987_distributed_stack_overflow.sql index d2e2b8f37ef..1ef7c543252 100644 --- a/tests/queries/0_stateless/00987_distributed_stack_overflow.sql +++ b/tests/queries/0_stateless/00987_distributed_stack_overflow.sql @@ -4,8 +4,7 @@ DROP TABLE IF EXISTS distr2; CREATE TABLE distr (x UInt8) ENGINE = Distributed(test_shard_localhost, currentDatabase(), distr); -- { serverError 269 } -CREATE TABLE distr0 (x UInt8) ENGINE = Distributed(test_shard_localhost, '', distr0); -SELECT * FROM distr0; -- { serverError 581 } +CREATE TABLE distr0 (x UInt8) ENGINE = Distributed(test_shard_localhost, '', distr0); -- { serverError 269 } CREATE TABLE distr1 (x UInt8) ENGINE = Distributed(test_shard_localhost, currentDatabase(), distr2); CREATE TABLE distr2 (x UInt8) ENGINE = Distributed(test_shard_localhost, currentDatabase(), distr1); @@ -13,6 +12,5 @@ CREATE TABLE distr2 (x UInt8) ENGINE = Distributed(test_shard_localhost, current SELECT * FROM distr1; -- { serverError 581 } SELECT * FROM distr2; -- { serverError 581 } -DROP TABLE distr0; DROP TABLE distr1; DROP TABLE distr2; diff --git a/tests/queries/0_stateless/00992_system_parts_race_condition_zookeeper_long.reference b/tests/queries/0_stateless/00992_system_parts_race_condition_zookeeper_long.reference index e69de29bb2d..c3165c3d6ef 100644 --- a/tests/queries/0_stateless/00992_system_parts_race_condition_zookeeper_long.reference +++ b/tests/queries/0_stateless/00992_system_parts_race_condition_zookeeper_long.reference @@ -0,0 +1,2 @@ +Replication did not hang: synced all replicas of alter_table +Consistency: 1 diff --git a/tests/queries/0_stateless/00992_system_parts_race_condition_zookeeper_long.sh b/tests/queries/0_stateless/00992_system_parts_race_condition_zookeeper_long.sh index 793fc8e9575..19f72120912 100755 --- a/tests/queries/0_stateless/00992_system_parts_race_condition_zookeeper_long.sh +++ b/tests/queries/0_stateless/00992_system_parts_race_condition_zookeeper_long.sh @@ -3,15 +3,17 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # shellcheck source=../shell_config.sh . "$CURDIR"/../shell_config.sh +# shellcheck source=./replication.lib +. "$CURDIR"/replication.lib set -e $CLICKHOUSE_CLIENT -n -q " - DROP TABLE IF EXISTS alter_table; - DROP TABLE IF EXISTS alter_table2; + DROP TABLE IF EXISTS alter_table0; + DROP TABLE IF EXISTS alter_table1; - CREATE TABLE alter_table (a UInt8, b Int16, c Float32, d String, e Array(UInt8), f Nullable(UUID), g Tuple(UInt8, UInt16)) ENGINE = ReplicatedMergeTree('/clickhouse/tables/$CLICKHOUSE_TEST_ZOOKEEPER_PREFIX/alter_table', 'r1') ORDER BY a PARTITION BY b % 10 SETTINGS old_parts_lifetime = 1, cleanup_delay_period = 1, cleanup_delay_period_random_add = 0; - CREATE TABLE alter_table2 (a UInt8, b Int16, c Float32, d String, e Array(UInt8), f Nullable(UUID), g Tuple(UInt8, UInt16)) ENGINE = ReplicatedMergeTree('/clickhouse/tables/$CLICKHOUSE_TEST_ZOOKEEPER_PREFIX/alter_table', 'r2') ORDER BY a PARTITION BY b % 10 SETTINGS old_parts_lifetime = 1, cleanup_delay_period = 1, cleanup_delay_period_random_add = 0 + CREATE TABLE alter_table0 (a UInt8, b Int16, c Float32, d String, e Array(UInt8), f Nullable(UUID), g Tuple(UInt8, UInt16)) ENGINE = ReplicatedMergeTree('/clickhouse/tables/$CLICKHOUSE_TEST_ZOOKEEPER_PREFIX/alter_table', 'r1') ORDER BY a PARTITION BY b % 10 SETTINGS old_parts_lifetime = 1, cleanup_delay_period = 1, cleanup_delay_period_random_add = 0; + CREATE TABLE alter_table1 (a UInt8, b Int16, c Float32, d String, e Array(UInt8), f Nullable(UUID), g Tuple(UInt8, UInt16)) ENGINE = ReplicatedMergeTree('/clickhouse/tables/$CLICKHOUSE_TEST_ZOOKEEPER_PREFIX/alter_table', 'r2') ORDER BY a PARTITION BY b % 10 SETTINGS old_parts_lifetime = 1, cleanup_delay_period = 1, cleanup_delay_period_random_add = 0 " function thread1() @@ -22,22 +24,22 @@ function thread1() function thread2() { - while true; do $CLICKHOUSE_CLIENT -n --query "ALTER TABLE alter_table ADD COLUMN h String DEFAULT '0'; ALTER TABLE alter_table MODIFY COLUMN h UInt64; ALTER TABLE alter_table DROP COLUMN h;"; done + while true; do $CLICKHOUSE_CLIENT -n --query "ALTER TABLE alter_table0 ADD COLUMN h String DEFAULT '0'; ALTER TABLE alter_table0 MODIFY COLUMN h UInt64; ALTER TABLE alter_table0 DROP COLUMN h;"; done } function thread3() { - while true; do $CLICKHOUSE_CLIENT -q "INSERT INTO alter_table SELECT rand(1), rand(2), 1 / rand(3), toString(rand(4)), [rand(5), rand(6)], rand(7) % 2 ? NULL : generateUUIDv4(), (rand(8), rand(9)) FROM numbers(100000)"; done + while true; do $CLICKHOUSE_CLIENT -q "INSERT INTO alter_table0 SELECT rand(1), rand(2), 1 / rand(3), toString(rand(4)), [rand(5), rand(6)], rand(7) % 2 ? NULL : generateUUIDv4(), (rand(8), rand(9)) FROM numbers(100000)"; done } function thread4() { - while true; do $CLICKHOUSE_CLIENT -q "OPTIMIZE TABLE alter_table FINAL"; done + while true; do $CLICKHOUSE_CLIENT -q "OPTIMIZE TABLE alter_table0 FINAL"; done } function thread5() { - while true; do $CLICKHOUSE_CLIENT -q "ALTER TABLE alter_table DELETE WHERE cityHash64(a,b,c,d,e,g) % 1048576 < 524288"; done + while true; do $CLICKHOUSE_CLIENT -q "ALTER TABLE alter_table0 DELETE WHERE cityHash64(a,b,c,d,e,g) % 1048576 < 524288"; done } # https://stackoverflow.com/questions/9954794/execute-a-shell-function-with-timeout @@ -74,8 +76,9 @@ timeout $TIMEOUT bash -c thread4 2> /dev/null & timeout $TIMEOUT bash -c thread5 2> /dev/null & wait +check_replication_consistency "alter_table" "count(), sum(a), sum(b), round(sum(c))" -$CLICKHOUSE_CLIENT -n -q "DROP TABLE alter_table;" & -$CLICKHOUSE_CLIENT -n -q "DROP TABLE alter_table2;" & +$CLICKHOUSE_CLIENT -n -q "DROP TABLE alter_table0;" & +$CLICKHOUSE_CLIENT -n -q "DROP TABLE alter_table1;" & wait diff --git a/tests/queries/0_stateless/00993_system_parts_race_condition_drop_zookeeper.reference b/tests/queries/0_stateless/00993_system_parts_race_condition_drop_zookeeper.reference index e69de29bb2d..6e705f05f04 100644 --- a/tests/queries/0_stateless/00993_system_parts_race_condition_drop_zookeeper.reference +++ b/tests/queries/0_stateless/00993_system_parts_race_condition_drop_zookeeper.reference @@ -0,0 +1,2 @@ +Replication did not hang: synced all replicas of alter_table_ +Consistency: 1 diff --git a/tests/queries/0_stateless/00993_system_parts_race_condition_drop_zookeeper.sh b/tests/queries/0_stateless/00993_system_parts_race_condition_drop_zookeeper.sh index 32fe31f68c6..bdad08fb0e1 100755 --- a/tests/queries/0_stateless/00993_system_parts_race_condition_drop_zookeeper.sh +++ b/tests/queries/0_stateless/00993_system_parts_race_condition_drop_zookeeper.sh @@ -3,6 +3,8 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # shellcheck source=../shell_config.sh . "$CURDIR"/../shell_config.sh +# shellcheck source=./replication.lib +. "$CURDIR"/replication.lib set -e @@ -99,6 +101,8 @@ timeout $TIMEOUT bash -c thread6 2>&1 | grep "was not completely removed from Zo wait +check_replication_consistency "alter_table_" "count(), sum(a), sum(b), round(sum(c))" + for i in {0..9}; do $CLICKHOUSE_CLIENT -q "DROP TABLE IF EXISTS alter_table_$i" 2>&1 | grep "was not completely removed from ZooKeeper" & done diff --git a/tests/queries/0_stateless/01014_lazy_database_concurrent_recreate_reattach_and_show_tables.sh b/tests/queries/0_stateless/01014_lazy_database_concurrent_recreate_reattach_and_show_tables.sh index 2003effb71b..1970dfe490c 100755 --- a/tests/queries/0_stateless/01014_lazy_database_concurrent_recreate_reattach_and_show_tables.sh +++ b/tests/queries/0_stateless/01014_lazy_database_concurrent_recreate_reattach_and_show_tables.sh @@ -99,14 +99,12 @@ timeout $TIMEOUT bash -c show_tables_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; -" -# DROP DATABASE $CURR_DATABASE; -- This fails for some reason +${CLICKHOUSE_CLIENT} -q "ATTACH TABLE $CURR_DATABASE.log;" 2>/dev/null +${CLICKHOUSE_CLIENT} -q "ATTACH TABLE $CURR_DATABASE.slog;" 2>/dev/null +${CLICKHOUSE_CLIENT} -q "ATTACH TABLE $CURR_DATABASE.tlog;" 2>/dev/null +${CLICKHOUSE_CLIENT} -q "ATTACH TABLE $CURR_DATABASE.tlog2;" 2>/dev/null + +${CLICKHOUSE_CLIENT} -q "DROP DATABASE $CURR_DATABASE" echo "Test OK" -# TODO: it doesn't work! $CLICKHOUSE_CLIENT -q "DROP DATABASE $CURR_DATABASE" diff --git a/tests/queries/0_stateless/01018_empty_aggregation_filling.reference b/tests/queries/0_stateless/01018_empty_aggregation_filling.reference index 4595c3b9112..c29807a7e15 100644 --- a/tests/queries/0_stateless/01018_empty_aggregation_filling.reference +++ b/tests/queries/0_stateless/01018_empty_aggregation_filling.reference @@ -45,7 +45,7 @@ nan \N 0 \N -0.00 +0 \N --- Other Types Non-empty --- hello diff --git a/tests/queries/0_stateless/01029_early_constant_folding.reference b/tests/queries/0_stateless/01029_early_constant_folding.reference index 88139b7e2b8..abcb2ddc6a7 100644 --- a/tests/queries/0_stateless/01029_early_constant_folding.reference +++ b/tests/queries/0_stateless/01029_early_constant_folding.reference @@ -2,7 +2,7 @@ SELECT 1 WHERE 0 SELECT 1 SELECT 1 -WHERE (1 IN (0, 2)) AND (2 = (identity(CAST(2, \'Nullable(UInt8)\')) AS subquery)) +WHERE (1 IN (0, 2)) AND (2 = (identity(_CAST(2, \'Nullable(UInt8)\')) AS subquery)) SELECT 1 WHERE 1 IN (( SELECT arrayJoin([1, 2, 3]) diff --git a/tests/queries/0_stateless/01054_cache_dictionary_overflow_cell.sql b/tests/queries/0_stateless/01054_cache_dictionary_overflow_cell.sql index d8d1d61be63..1b317e2165e 100644 --- a/tests/queries/0_stateless/01054_cache_dictionary_overflow_cell.sql +++ b/tests/queries/0_stateless/01054_cache_dictionary_overflow_cell.sql @@ -54,3 +54,4 @@ FROM ); DROP TABLE if exists test_01054.ints; +DROP DATABASE test_01054_overflow; diff --git a/tests/queries/0_stateless/01055_minmax_index_compact_parts.reference b/tests/queries/0_stateless/01055_minmax_index_compact_parts.reference index 0f5a8eb904e..8bde896b02a 100644 --- a/tests/queries/0_stateless/01055_minmax_index_compact_parts.reference +++ b/tests/queries/0_stateless/01055_minmax_index_compact_parts.reference @@ -1,6 +1,6 @@ -0 5 4.7 6.50 cba b 2014-01-04 -1 5 4.7 6.50 cba b 2014-03-11 -11 5 4.7 6.50 cba b 2014-06-11 -12 5 4.7 6.50 cba b 2015-01-01 +0 5 4.7 6.5 cba b 2014-01-04 +1 5 4.7 6.5 cba b 2014-03-11 +11 5 4.7 6.5 cba b 2014-06-11 +12 5 4.7 6.5 cba b 2015-01-01 "rows_read": 4, "rows_read": 2, diff --git a/tests/queries/0_stateless/01070_modify_ttl_recalc_only.reference b/tests/queries/0_stateless/01070_modify_ttl_recalc_only.reference new file mode 100644 index 00000000000..fe9cba71c4c --- /dev/null +++ b/tests/queries/0_stateless/01070_modify_ttl_recalc_only.reference @@ -0,0 +1,68 @@ +2000-10-10 1 +2000-10-10 2 +2100-10-10 3 +2100-10-10 4 +2000-10-11 00:00:00 2000-10-11 00:00:00 +2000-10-11 00:00:00 2000-10-11 00:00:00 +2100-10-11 00:00:00 2100-10-11 00:00:00 +2100-10-11 00:00:00 2100-10-11 00:00:00 +2100-10-10 3 +2100-10-10 4 +============= +1 a +2 b +3 c +4 d +2000-01-01 00:00:00 2100-01-01 00:00:00 +1 a +3 c +============= +1 a +3 c +2000-01-01 00:00:00 2000-01-01 00:00:00 +============= +1 a +2 b +3 c +4 d +1 a +2 +3 c +4 +============= +1 a +2 +3 c +4 +1 +2 +3 +4 +============= +1 a +2 b +3 c +4 d +2000-01-01 00:00:00 2100-01-01 00:00:00 +1 a +2 b +4 d +============= +1 a +2 b +4 d +1 +2 +4 d +============= +1 a aa +2 b bb +3 c cc +4 d dd +1 a +2 b bb +3 cc +4 d +1 +============= +0 diff --git a/tests/queries/0_stateless/01070_modify_ttl_recalc_only.sql b/tests/queries/0_stateless/01070_modify_ttl_recalc_only.sql new file mode 100644 index 00000000000..aafed1a7bce --- /dev/null +++ b/tests/queries/0_stateless/01070_modify_ttl_recalc_only.sql @@ -0,0 +1,107 @@ +set mutations_sync = 2; + +drop table if exists ttl; + +create table ttl (d Date, a Int) engine = MergeTree order by a partition by toDayOfMonth(d) +SETTINGS max_number_of_merges_with_ttl_in_pool=0,materialize_ttl_recalculate_only=true; + +insert into ttl values (toDateTime('2000-10-10 00:00:00'), 1); +insert into ttl values (toDateTime('2000-10-10 00:00:00'), 2); +insert into ttl values (toDateTime('2100-10-10 00:00:00'), 3); +insert into ttl values (toDateTime('2100-10-10 00:00:00'), 4); + + +alter table ttl modify ttl d + interval 1 day; +select * from ttl order by a; +select delete_ttl_info_min, delete_ttl_info_max from system.parts where database = currentDatabase() and table = 'ttl' and active > 0 order by name asc; +optimize table ttl final; +select * from ttl order by a; +select '============='; + +drop table if exists ttl; + +create table ttl (i Int, s String) engine = MergeTree order by i +SETTINGS max_number_of_merges_with_ttl_in_pool=0,materialize_ttl_recalculate_only=true; + +insert into ttl values (1, 'a') (2, 'b') (3, 'c') (4, 'd'); + +alter table ttl modify ttl i % 2 = 0 ? toDate('2000-01-01') : toDate('2100-01-01'); +select * from ttl order by i; +select delete_ttl_info_min, delete_ttl_info_max from system.parts where database = currentDatabase() and table = 'ttl' and active > 0; +optimize table ttl final; +select * from ttl order by i; +select '============='; + +alter table ttl modify ttl toDate('2000-01-01'); +select * from ttl order by i; +select delete_ttl_info_min, delete_ttl_info_max from system.parts where database = currentDatabase() and table = 'ttl' and active > 0; +optimize table ttl final; +select * from ttl order by i; +select '============='; + +drop table if exists ttl; + +create table ttl (i Int, s String) engine = MergeTree order by i +SETTINGS max_number_of_merges_with_ttl_in_pool=0,materialize_ttl_recalculate_only=true; + +insert into ttl values (1, 'a') (2, 'b') (3, 'c') (4, 'd'); + +alter table ttl modify column s String ttl i % 2 = 0 ? today() - 10 : toDate('2100-01-01'); +select * from ttl order by i; +optimize table ttl final; +select * from ttl order by i; +select '============='; + +alter table ttl modify column s String ttl toDate('2000-01-01'); +select * from ttl order by i; +optimize table ttl final; +select * from ttl order by i; +select '============='; + +drop table if exists ttl; + +create table ttl (d Date, i Int, s String) engine = MergeTree order by i +SETTINGS max_number_of_merges_with_ttl_in_pool=0,materialize_ttl_recalculate_only=true; + +insert into ttl values (toDate('2000-01-02'), 1, 'a') (toDate('2000-01-03'), 2, 'b') (toDate('2080-01-01'), 3, 'c') (toDate('2080-01-03'), 4, 'd'); + +alter table ttl modify ttl i % 3 = 0 ? toDate('2000-01-01') : toDate('2100-01-01'); +select i, s from ttl order by i; +select delete_ttl_info_min, delete_ttl_info_max from system.parts where database = currentDatabase() and table = 'ttl' and active > 0; +optimize table ttl final; +select i, s from ttl order by i; +select '============='; + +alter table ttl modify column s String ttl d + interval 1 month; +select i, s from ttl order by i; +optimize table ttl final; +select i, s from ttl order by i; +select '============='; + +drop table if exists ttl; + +create table ttl (i Int, s String, t String) engine = MergeTree order by i +SETTINGS max_number_of_merges_with_ttl_in_pool=0,materialize_ttl_recalculate_only=true; + +insert into ttl values (1, 'a', 'aa') (2, 'b', 'bb') (3, 'c', 'cc') (4, 'd', 'dd'); + +alter table ttl modify column s String ttl i % 3 = 0 ? today() - 10 : toDate('2100-01-01'), + modify column t String ttl i % 3 = 1 ? today() - 10 : toDate('2100-01-01'); + +select i, s, t from ttl order by i; +optimize table ttl final; +select i, s, t from ttl order by i; +-- MATERIALIZE TTL ran only once +select count() from system.mutations where database = currentDatabase() and table = 'ttl' and is_done; +select '============='; + +drop table if exists ttl; + +-- Nothing changed, don't run mutation +create table ttl (i Int, s String ttl toDate('2000-01-02')) engine = MergeTree order by i +SETTINGS max_number_of_merges_with_ttl_in_pool=0,materialize_ttl_recalculate_only=true; + +alter table ttl modify column s String ttl toDate('2000-01-02'); +select count() from system.mutations where database = currentDatabase() and table = 'ttl' and is_done; + +drop table if exists ttl; diff --git a/tests/queries/0_stateless/01079_parallel_alter_add_drop_column_zookeeper.reference b/tests/queries/0_stateless/01079_parallel_alter_add_drop_column_zookeeper.reference index af33a5bfc3f..4b640354c1b 100644 --- a/tests/queries/0_stateless/01079_parallel_alter_add_drop_column_zookeeper.reference +++ b/tests/queries/0_stateless/01079_parallel_alter_add_drop_column_zookeeper.reference @@ -1,6 +1,8 @@ Starting alters Finishing alters Equal number of columns +Replication did not hang: synced all replicas of concurrent_alter_add_drop_ +Consistency: 1 0 0 0 diff --git a/tests/queries/0_stateless/01079_parallel_alter_add_drop_column_zookeeper.sh b/tests/queries/0_stateless/01079_parallel_alter_add_drop_column_zookeeper.sh index fd0b53cf122..4b67a03760b 100755 --- a/tests/queries/0_stateless/01079_parallel_alter_add_drop_column_zookeeper.sh +++ b/tests/queries/0_stateless/01079_parallel_alter_add_drop_column_zookeeper.sh @@ -3,6 +3,8 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # shellcheck source=../shell_config.sh . "$CURDIR"/../shell_config.sh +# shellcheck source=./replication.lib +. "$CURDIR"/replication.lib REPLICAS=3 @@ -101,6 +103,8 @@ while [[ $(timeout 120 ${CLICKHOUSE_CLIENT} --query "ALTER TABLE concurrent_alte sleep 1 done +check_replication_consistency "concurrent_alter_add_drop_" "count(), sum(key), sum(cityHash64(value0))" + for i in $(seq $REPLICAS); do $CLICKHOUSE_CLIENT --query "SYSTEM SYNC REPLICA concurrent_alter_add_drop_$i" $CLICKHOUSE_CLIENT --query "SELECT COUNT() FROM system.mutations WHERE is_done = 0 and table = 'concurrent_alter_add_drop_$i'" diff --git a/tests/queries/0_stateless/01079_parallel_alter_modify_zookeeper_long.reference b/tests/queries/0_stateless/01079_parallel_alter_modify_zookeeper_long.reference index ff9c6824f00..435b1b1f1ae 100644 --- a/tests/queries/0_stateless/01079_parallel_alter_modify_zookeeper_long.reference +++ b/tests/queries/0_stateless/01079_parallel_alter_modify_zookeeper_long.reference @@ -5,6 +5,8 @@ 1725 Starting alters Finishing alters +Replication did not hang: synced all replicas of concurrent_alter_mt_ +Consistency: 1 1 0 1 diff --git a/tests/queries/0_stateless/01079_parallel_alter_modify_zookeeper_long.sh b/tests/queries/0_stateless/01079_parallel_alter_modify_zookeeper_long.sh index 37d880bdce7..acbb01a1c68 100755 --- a/tests/queries/0_stateless/01079_parallel_alter_modify_zookeeper_long.sh +++ b/tests/queries/0_stateless/01079_parallel_alter_modify_zookeeper_long.sh @@ -3,6 +3,8 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # shellcheck source=../shell_config.sh . "$CURDIR"/../shell_config.sh +# shellcheck source=./replication.lib +. "$CURDIR"/replication.lib REPLICAS=5 @@ -112,6 +114,8 @@ while [[ $(timeout 120 ${CLICKHOUSE_CLIENT} --query "ALTER TABLE concurrent_alte sleep 1 done +check_replication_consistency "concurrent_alter_mt_" "count(), sum(key), sum(cityHash64(value1)), sum(cityHash64(value2))" + for i in $(seq $REPLICAS); do $CLICKHOUSE_CLIENT --query "SYSTEM SYNC REPLICA concurrent_alter_mt_$i" $CLICKHOUSE_CLIENT --query "SELECT SUM(toUInt64(value1)) > $INITIAL_SUM FROM concurrent_alter_mt_$i" 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_table_function_generate.reference b/tests/queries/0_stateless/01087_table_function_generate.reference index bf301d34eb3..ea4162e4840 100644 --- a/tests/queries/0_stateless/01087_table_function_generate.reference +++ b/tests/queries/0_stateless/01087_table_function_generate.reference @@ -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 & -done -wait -echo "Replication did not hang" +check_replication_consistency "dst_" "count(), sum(p), sum(k), sum(v)" +try_sync_replicas "src_" for ((i=0; i<16; i++)) do $CLICKHOUSE_CLIENT -q "DROP TABLE dst_$i" 2>&1| grep -Fv "is already started to be removing" & diff --git a/tests/queries/0_stateless/01176_mysql_client_interactive.expect b/tests/queries/0_stateless/01176_mysql_client_interactive.expect index 6f0cea48e76..8f56d047e8e 100755 --- a/tests/queries/0_stateless/01176_mysql_client_interactive.expect +++ b/tests/queries/0_stateless/01176_mysql_client_interactive.expect @@ -34,6 +34,14 @@ expect "ERROR 395 (00000): Code: 395" 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) |" 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/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/01213_optimize_skip_unused_shards_DISTINCT.reference b/tests/queries/0_stateless/01213_optimize_skip_unused_shards_DISTINCT.reference index 4ade9cd9c5d..febec683df9 100644 --- a/tests/queries/0_stateless/01213_optimize_skip_unused_shards_DISTINCT.reference +++ b/tests/queries/0_stateless/01213_optimize_skip_unused_shards_DISTINCT.reference @@ -3,6 +3,11 @@ distributed_group_by_no_merge 1 optimize_skip_unused_shards 1 -optimize_skip_unused_shards lack of WHERE +optimize_skip_unused_shards lack of WHERE (optimize_distributed_group_by_sharding_key=0) +0 +1 +optimize_skip_unused_shards lack of WHERE (optimize_distributed_group_by_sharding_key=1) +0 +1 0 1 diff --git a/tests/queries/0_stateless/01213_optimize_skip_unused_shards_DISTINCT.sql b/tests/queries/0_stateless/01213_optimize_skip_unused_shards_DISTINCT.sql index 5b45bea9046..8024abc75ed 100644 --- a/tests/queries/0_stateless/01213_optimize_skip_unused_shards_DISTINCT.sql +++ b/tests/queries/0_stateless/01213_optimize_skip_unused_shards_DISTINCT.sql @@ -12,8 +12,15 @@ SELECT DISTINCT id FROM dist_01213 WHERE id = 1 SETTINGS distributed_group_by_no SELECT 'optimize_skip_unused_shards'; SELECT DISTINCT id FROM dist_01213 WHERE id = 1 SETTINGS optimize_skip_unused_shards=1; -- check that querying all shards is ok -SELECT 'optimize_skip_unused_shards lack of WHERE'; -SELECT DISTINCT id FROM dist_01213 SETTINGS optimize_skip_unused_shards=1; +SELECT 'optimize_skip_unused_shards lack of WHERE (optimize_distributed_group_by_sharding_key=0)'; +SELECT DISTINCT id FROM dist_01213 SETTINGS optimize_skip_unused_shards=1, optimize_distributed_group_by_sharding_key=0; +-- with optimize_distributed_group_by_sharding_key=1 there will be 4 rows, +-- since DISTINCT will be done on each shard separatelly, and initiator will +-- not do anything (since we use optimize_skip_unused_shards=1 that must +-- guarantee that the data had been INSERTed according to sharding key, +-- which is not our case, since we use one local table). +SELECT 'optimize_skip_unused_shards lack of WHERE (optimize_distributed_group_by_sharding_key=1)'; +SELECT DISTINCT id FROM dist_01213 SETTINGS optimize_skip_unused_shards=1, optimize_distributed_group_by_sharding_key=1; DROP TABLE local_01213; DROP TABLE dist_01213; 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/01236_graphite_mt.sql b/tests/queries/0_stateless/01236_graphite_mt.sql index 88d2d0ccb63..a6dd4b8b6fb 100644 --- a/tests/queries/0_stateless/01236_graphite_mt.sql +++ b/tests/queries/0_stateless/01236_graphite_mt.sql @@ -1,26 +1,36 @@ + +-- 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) +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 AS key, 'sum_1' AS s, 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 + + -- Older than 2 days use 6000 second windows + select 1 AS key, 'sum_1' AS s, 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; 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/01271_show_privileges.reference b/tests/queries/0_stateless/01271_show_privileges.reference index 95f9e407f21..46eb3bf9ba8 100644 --- a/tests/queries/0_stateless/01271_show_privileges.reference +++ b/tests/queries/0_stateless/01271_show_privileges.reference @@ -45,11 +45,13 @@ CREATE TABLE [] TABLE CREATE CREATE VIEW [] VIEW CREATE CREATE DICTIONARY [] DICTIONARY CREATE CREATE TEMPORARY TABLE [] GLOBAL CREATE +CREATE FUNCTION [] DATABASE CREATE CREATE [] \N ALL DROP DATABASE [] DATABASE DROP DROP TABLE [] TABLE DROP DROP VIEW [] VIEW DROP DROP DICTIONARY [] DICTIONARY DROP +DROP FUNCTION [] DATABASE DROP DROP [] \N ALL TRUNCATE ['TRUNCATE TABLE'] TABLE ALL OPTIMIZE ['OPTIMIZE TABLE'] TABLE ALL 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/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_ssd_complex_key_dictionary.sh b/tests/queries/0_stateless/01280_ssd_complex_key_dictionary.sh index ff62b70c184..e1e0018a1dd 100755 --- a/tests/queries/0_stateless/01280_ssd_complex_key_dictionary.sh +++ b/tests/queries/0_stateless/01280_ssd_complex_key_dictionary.sh @@ -122,3 +122,5 @@ $CLICKHOUSE_CLIENT -n --query="DROP DICTIONARY 01280_db.ssd_dict; SELECT arrayJoin([('1', toInt32(3)), ('2', toInt32(-1)), ('', toInt32(0)), ('', toInt32(0)), ('2', toInt32(-1)), ('1', toInt32(3))]) AS keys, dictGetInt32('01280_db.ssd_dict', 'b', keys); DROP DICTIONARY IF EXISTS database_for_dict.ssd_dict; DROP TABLE IF EXISTS database_for_dict.keys_table;" + +$CLICKHOUSE_CLIENT -n --query="DROP DATABASE IF EXISTS 01280_db;" diff --git a/tests/queries/0_stateless/01293_show_settings.reference b/tests/queries/0_stateless/01293_show_settings.reference index 6fcbf194614..5079f5c3d00 100644 --- a/tests/queries/0_stateless/01293_show_settings.reference +++ b/tests/queries/0_stateless/01293_show_settings.reference @@ -1,5 +1,3 @@ send_timeout Seconds 300 -connect_timeout Seconds 10 -connect_timeout_with_failover_ms Milliseconds 2000 -connect_timeout_with_failover_secure_ms Milliseconds 3000 +function_range_max_elements_in_block UInt64 500000000 max_memory_usage UInt64 10000000000 diff --git a/tests/queries/0_stateless/01293_show_settings.sql b/tests/queries/0_stateless/01293_show_settings.sql index 08f00ed201c..abdb06ff05e 100644 --- a/tests/queries/0_stateless/01293_show_settings.sql +++ b/tests/queries/0_stateless/01293_show_settings.sql @@ -1,3 +1,3 @@ show settings like 'send_timeout'; -SHOW SETTINGS ILIKE '%CONNECT_timeout%'; +SHOW SETTINGS ILIKE '%RANGE_max%'; SHOW CHANGED SETTINGS ILIKE '%MEMORY%'; 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 525974e78ba..e5cd3ea362f 100644 --- a/tests/queries/0_stateless/01294_system_distributed_on_cluster.sql +++ b/tests/queries/0_stateless/01294_system_distributed_on_cluster.sql @@ -11,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/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/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_long.sql b/tests/queries/0_stateless/01319_manual_write_to_replicas_long.sql index 7fb4d0b7d61..cec75ac1b23 100644 --- a/tests/queries/0_stateless/01319_manual_write_to_replicas_long.sql +++ b/tests/queries/0_stateless/01319_manual_write_to_replicas_long.sql @@ -4,7 +4,8 @@ DROP TABLE IF EXISTS r2; 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/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/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/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/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/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_opentelemetry_distributed.reference b/tests/queries/0_stateless/01455_opentelemetry_distributed.reference index b40e4f87c13..f45f1ab6104 100644 --- a/tests/queries/0_stateless/01455_opentelemetry_distributed.reference +++ b/tests/queries/0_stateless/01455_opentelemetry_distributed.reference @@ -1,8 +1,20 @@ ===http=== +{"query":"select 1 from remote('127.0.0.2', system, one) format Null\n","status":"QueryFinish","tracestate":"some custom state","sorted_by_start_time":1} +{"query":"DESC TABLE system.one","status":"QueryFinish","tracestate":"some custom state","sorted_by_start_time":1} +{"query":"DESC TABLE system.one","status":"QueryFinish","tracestate":"some custom state","sorted_by_start_time":1} +{"query":"SELECT 1 FROM system.one","status":"QueryFinish","tracestate":"some custom state","sorted_by_start_time":1} +{"query":"DESC TABLE system.one","query_status":"QueryFinish","tracestate":"some custom state","sorted_by_finish_time":1} +{"query":"DESC TABLE system.one","query_status":"QueryFinish","tracestate":"some custom state","sorted_by_finish_time":1} +{"query":"SELECT 1 FROM system.one","query_status":"QueryFinish","tracestate":"some custom state","sorted_by_finish_time":1} +{"query":"select 1 from remote('127.0.0.2', system, one) format Null\n","query_status":"QueryFinish","tracestate":"some custom state","sorted_by_finish_time":1} {"total spans":"4","unique spans":"4","unique non-zero parent spans":"3"} {"initial query spans with proper parent":"1"} {"unique non-empty tracestate values":"1"} ===native=== +{"query":"select * from url('http:\/\/127.0.0.2:8123\/?query=select%201%20format%20Null', CSV, 'a int')","status":"QueryFinish","tracestate":"another custom state","sorted_by_start_time":1} +{"query":"select 1 format Null\n","status":"QueryFinish","tracestate":"another custom state","sorted_by_start_time":1} +{"query":"select 1 format Null\n","query_status":"QueryFinish","tracestate":"another custom state","sorted_by_finish_time":1} +{"query":"select * from url('http:\/\/127.0.0.2:8123\/?query=select%201%20format%20Null', CSV, 'a int')","query_status":"QueryFinish","tracestate":"another custom state","sorted_by_finish_time":1} {"total spans":"2","unique spans":"2","unique non-zero parent spans":"2"} {"initial query spans with proper parent":"1"} {"unique non-empty tracestate values":"1"} diff --git a/tests/queries/0_stateless/01455_opentelemetry_distributed.sh b/tests/queries/0_stateless/01455_opentelemetry_distributed.sh index 8f034b0bf61..59cd1b57d1e 100755 --- a/tests/queries/0_stateless/01455_opentelemetry_distributed.sh +++ b/tests/queries/0_stateless/01455_opentelemetry_distributed.sh @@ -12,6 +12,28 @@ function check_log ${CLICKHOUSE_CLIENT} --format=JSONEachRow -nq " system flush logs; +-- Show queries sorted by start time. +select attribute['db.statement'] as query, + attribute['clickhouse.query_status'] as status, + attribute['clickhouse.tracestate'] as tracestate, + 1 as sorted_by_start_time + from system.opentelemetry_span_log + where trace_id = reinterpretAsUUID(reverse(unhex('$trace_id'))) + and operation_name = 'query' + order by start_time_us + ; + +-- Show queries sorted by finish time. +select attribute['db.statement'] as query, + attribute['clickhouse.query_status'] as query_status, + attribute['clickhouse.tracestate'] as tracestate, + 1 as sorted_by_finish_time + from system.opentelemetry_span_log + where trace_id = reinterpretAsUUID(reverse(unhex('$trace_id'))) + and operation_name = 'query' + order by finish_time_us + ; + -- Check the number of query spans with given trace id, to verify it was -- propagated. select count(*) "'"'"total spans"'"'", @@ -89,10 +111,10 @@ check_log echo "===sampled===" query_id=$(${CLICKHOUSE_CLIENT} -q "select lower(hex(reverse(reinterpretAsString(generateUUIDv4()))))") -for i in {1..200} +for i in {1..20} do ${CLICKHOUSE_CLIENT} \ - --opentelemetry_start_trace_probability=0.1 \ + --opentelemetry_start_trace_probability=0.5 \ --query_id "$query_id-$i" \ --query "select 1 from remote('127.0.0.2', system, one) format Null" \ & @@ -108,8 +130,8 @@ wait ${CLICKHOUSE_CLIENT} -q "system flush logs" ${CLICKHOUSE_CLIENT} -q " - -- expect 200 * 0.1 = 20 sampled events on average - select if(count() > 1 and count() < 50, 'OK', 'Fail') + -- expect 20 * 0.5 = 10 sampled events on average + select if(2 <= count() and count() <= 18, 'OK', 'Fail') from system.opentelemetry_span_log where operation_name = 'query' and parent_span_id = 0 -- only account for the initial queries 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/01470_columns_transformers2.reference b/tests/queries/0_stateless/01470_columns_transformers2.reference index 18c0f5c7e89..6d196530135 100644 --- a/tests/queries/0_stateless/01470_columns_transformers2.reference +++ b/tests/queries/0_stateless/01470_columns_transformers2.reference @@ -1 +1,4 @@ 100 10 324 120.00 B 8.00 B 23.00 B +0 +SELECT argMax(number, number) +FROM numbers(1) diff --git a/tests/queries/0_stateless/01470_columns_transformers2.sql b/tests/queries/0_stateless/01470_columns_transformers2.sql index 3691ef1e65d..88513d023c4 100644 --- a/tests/queries/0_stateless/01470_columns_transformers2.sql +++ b/tests/queries/0_stateless/01470_columns_transformers2.sql @@ -5,3 +5,6 @@ INSERT INTO columns_transformers VALUES (100, 10, 324, 120, 8, 23); SELECT * EXCEPT 'bytes', COLUMNS('bytes') APPLY formatReadableSize FROM columns_transformers; DROP TABLE IF EXISTS columns_transformers; + +SELECT * APPLY x->argMax(x, number) FROM numbers(1); +EXPLAIN SYNTAX SELECT * APPLY x->argMax(x, number) FROM numbers(1); 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/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/01516_drop_table_stress.sh b/tests/queries/0_stateless/01516_drop_table_stress.sh deleted file mode 100755 index d72104c8c7f..00000000000 --- a/tests/queries/0_stateless/01516_drop_table_stress.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env bash - -CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) -# shellcheck source=../shell_config.sh -. "$CURDIR"/../shell_config.sh - -function drop_database() -{ - # redirect stderr since it is racy with DROP TABLE - # and tries to remove db_01516.data too. - ${CLICKHOUSE_CLIENT} -q "DROP DATABASE IF EXISTS db_01516" 2>/dev/null -} - -function drop_table() -{ - ${CLICKHOUSE_CLIENT} -q "DROP TABLE IF EXISTS db_01516.data3;" 2>&1 | grep -F "Code: " | grep -Fv "is currently dropped or renamed" - ${CLICKHOUSE_CLIENT} -q "DROP TABLE IF EXISTS db_01516.data1;" 2>&1 | grep -F "Code: " | grep -Fv "is currently dropped or renamed" - ${CLICKHOUSE_CLIENT} -q "DROP TABLE IF EXISTS db_01516.data2;" 2>&1 | grep -F "Code: " | grep -Fv "is currently dropped or renamed" -} - -function create() -{ - ${CLICKHOUSE_CLIENT} -q "CREATE DATABASE IF NOT EXISTS db_01516;" - ${CLICKHOUSE_CLIENT} -q "CREATE TABLE IF NOT EXISTS db_01516.data1 Engine=MergeTree() ORDER BY number AS SELECT * FROM numbers(1);" 2>&1 | grep -F "Code: " | grep -Fv "is currently dropped or renamed" - ${CLICKHOUSE_CLIENT} -q "CREATE TABLE IF NOT EXISTS db_01516.data2 Engine=MergeTree() ORDER BY number AS SELECT * FROM numbers(1);" 2>&1 | grep -F "Code: " | grep -Fv "is currently dropped or renamed" - ${CLICKHOUSE_CLIENT} -q "CREATE TABLE IF NOT EXISTS db_01516.data3 Engine=MergeTree() ORDER BY number AS SELECT * FROM numbers(1);" 2>&1 | grep -F "Code: " | grep -Fv "is currently dropped or renamed" -} - -for _ in {1..100}; do - create - drop_table & - drop_database & - wait -done diff --git a/tests/queries/0_stateless/01516_drop_table_stress_long.reference b/tests/queries/0_stateless/01516_drop_table_stress_long.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/01516_drop_table_stress_long.sh b/tests/queries/0_stateless/01516_drop_table_stress_long.sh new file mode 100755 index 00000000000..20e76ce49c7 --- /dev/null +++ b/tests/queries/0_stateless/01516_drop_table_stress_long.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +export CURR_DATABASE="test_01516_${CLICKHOUSE_DATABASE}" + +function drop_database() +{ + # redirect stderr since it is racy with DROP TABLE + # and tries to remove ${CURR_DATABASE}.data too. + ${CLICKHOUSE_CLIENT} -q "DROP DATABASE IF EXISTS ${CURR_DATABASE}" 2>/dev/null +} +trap drop_database EXIT + +function drop_table() +{ + ${CLICKHOUSE_CLIENT} -q "DROP TABLE IF EXISTS ${CURR_DATABASE}.data3;" 2>&1 | grep -F "Code: " | grep -Fv "is currently dropped or renamed" + ${CLICKHOUSE_CLIENT} -q "DROP TABLE IF EXISTS ${CURR_DATABASE}.data1;" 2>&1 | grep -F "Code: " | grep -Fv "is currently dropped or renamed" + ${CLICKHOUSE_CLIENT} -q "DROP TABLE IF EXISTS ${CURR_DATABASE}.data2;" 2>&1 | grep -F "Code: " | grep -Fv "is currently dropped or renamed" +} + +function create() +{ + ${CLICKHOUSE_CLIENT} -q "CREATE DATABASE IF NOT EXISTS ${CURR_DATABASE};" + ${CLICKHOUSE_CLIENT} -q "CREATE TABLE IF NOT EXISTS ${CURR_DATABASE}.data1 Engine=MergeTree() ORDER BY number AS SELECT * FROM numbers(1);" 2>&1 | grep -F "Code: " | grep -Fv "is currently dropped or renamed" + ${CLICKHOUSE_CLIENT} -q "CREATE TABLE IF NOT EXISTS ${CURR_DATABASE}.data2 Engine=MergeTree() ORDER BY number AS SELECT * FROM numbers(1);" 2>&1 | grep -F "Code: " | grep -Fv "is currently dropped or renamed" + ${CLICKHOUSE_CLIENT} -q "CREATE TABLE IF NOT EXISTS ${CURR_DATABASE}.data3 Engine=MergeTree() ORDER BY number AS SELECT * FROM numbers(1);" 2>&1 | grep -F "Code: " | grep -Fv "is currently dropped or renamed" +} + +for _ in {1..100}; do + create + drop_table & + drop_database & + wait +done 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/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/01544_errorCodeToName.sql b/tests/queries/0_stateless/01544_errorCodeToName.sql index aa32270f00b..3a925bcea90 100644 --- a/tests/queries/0_stateless/01544_errorCodeToName.sql +++ b/tests/queries/0_stateless/01544_errorCodeToName.sql @@ -1,5 +1,5 @@ SELECT errorCodeToName(toUInt32(-1)); SELECT errorCodeToName(-1); -SELECT errorCodeToName(600); /* gap in error codes */ +SELECT errorCodeToName(950); /* gap in error codes */ SELECT errorCodeToName(0); SELECT errorCodeToName(1); 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/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/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/01593_concurrent_alter_mutations_kill_many_replicas_long.reference b/tests/queries/0_stateless/01593_concurrent_alter_mutations_kill_many_replicas_long.reference index f7c65e36be4..c68053e8270 100644 --- a/tests/queries/0_stateless/01593_concurrent_alter_mutations_kill_many_replicas_long.reference +++ b/tests/queries/0_stateless/01593_concurrent_alter_mutations_kill_many_replicas_long.reference @@ -14,3 +14,5 @@ CREATE TABLE default.concurrent_kill_4\n(\n `key` UInt64,\n `value` Int64\ Metadata version on replica 5 equal with first replica, OK CREATE TABLE default.concurrent_kill_5\n(\n `key` UInt64,\n `value` Int64\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/tables/01593_concurrent_alter_mutations_kill_many_replicas_long_default/{shard}\', \'{replica}5\')\nORDER BY key\nSETTINGS max_replicated_mutations_in_queue = 1000, number_of_free_entries_in_pool_to_execute_mutation = 0, max_replicated_merges_in_queue = 1000, index_granularity = 8192 499999500000 +Replication did not hang: synced all replicas of concurrent_kill_ +Consistency: 1 diff --git a/tests/queries/0_stateless/01593_concurrent_alter_mutations_kill_many_replicas_long.sh b/tests/queries/0_stateless/01593_concurrent_alter_mutations_kill_many_replicas_long.sh index e263750c431..bb04facba15 100755 --- a/tests/queries/0_stateless/01593_concurrent_alter_mutations_kill_many_replicas_long.sh +++ b/tests/queries/0_stateless/01593_concurrent_alter_mutations_kill_many_replicas_long.sh @@ -3,6 +3,8 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # shellcheck source=../shell_config.sh . "$CURDIR"/../shell_config.sh +# shellcheck source=./replication.lib +. "$CURDIR"/replication.lib REPLICAS=5 @@ -59,10 +61,6 @@ timeout $TIMEOUT bash -c kill_mutation_thread 2> /dev/null & wait -for i in $(seq $REPLICAS); do - $CLICKHOUSE_CLIENT --query "SYSTEM SYNC REPLICA concurrent_kill_$i" -done - # with timeout alter query can be not finished yet, so to execute new alter # we use retries counter=0 @@ -80,7 +78,7 @@ while true; do done -metadata_version=$($CLICKHOUSE_CLIENT --query "SELECT value FROM system.zookeeper WHERE path = '/clickhouse/tables/$CLICKHOUSE_TEST_ZOOKEEPER_PREFIX/s1/replicas/r1$i/' and name = 'metadata_version'") +metadata_version=$($CLICKHOUSE_CLIENT --query "SELECT value FROM system.zookeeper WHERE path = '/clickhouse/tables/$CLICKHOUSE_TEST_ZOOKEEPER_PREFIX/s1/replicas/r11/' and name = 'metadata_version'") for i in $(seq $REPLICAS); do replica_metadata_version=$($CLICKHOUSE_CLIENT --query "SELECT value FROM system.zookeeper WHERE path = '/clickhouse/tables/$CLICKHOUSE_TEST_ZOOKEEPER_PREFIX/s1/replicas/r1$i/' and name = 'metadata_version'") @@ -95,6 +93,8 @@ done $CLICKHOUSE_CLIENT --query "SELECT sum(value) FROM concurrent_kill_1" +check_replication_consistency "concurrent_kill_" "count(), sum(key), sum(cityHash64(value))" + for i in $(seq $REPLICAS); do $CLICKHOUSE_CLIENT --query "DROP TABLE IF EXISTS concurrent_kill_$i" done 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/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 6128cd109e2..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, \'Nullable(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/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/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/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/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/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/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/01720_join_implicit_cast.sql.j2 b/tests/queries/0_stateless/01720_join_implicit_cast.sql.j2 index f7760c38163..d1de6d06593 100644 --- a/tests/queries/0_stateless/01720_join_implicit_cast.sql.j2 +++ b/tests/queries/0_stateless/01720_join_implicit_cast.sql.j2 @@ -42,14 +42,13 @@ SELECT sum(a) + sum(t_ab2.a) - 1, sum(b) + sum(t_ab2.b) - 1 FROM t_ab1 RIGHT JOI 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 * 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 %} 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/01756_optimize_skip_unused_shards_rewrite_in.reference b/tests/queries/0_stateless/01756_optimize_skip_unused_shards_rewrite_in.reference index 972f4c89bdf..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\', \'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) +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\', \'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) +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\', \'Nullable(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\', \'Nullable(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 diff --git a/tests/queries/0_stateless/01761_alter_decimal_zookeeper_long.reference b/tests/queries/0_stateless/01761_alter_decimal_zookeeper_long.reference index ea3f608b6c7..ad5f224bc73 100644 --- a/tests/queries/0_stateless/01761_alter_decimal_zookeeper_long.reference +++ b/tests/queries/0_stateless/01761_alter_decimal_zookeeper_long.reference @@ -1,9 +1,9 @@ -1 5.00000000 -2 6.00000000 +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.00000000 -2 6.00000000 +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.00000000 -2 6.00000000 -3 7.00000000 +1 5 +2 6 +3 7 diff --git a/tests/queries/0_stateless/01763_max_distributed_depth.sql b/tests/queries/0_stateless/01763_max_distributed_depth.sql index d1bb9e4be90..89909a3bd8d 100644 --- a/tests/queries/0_stateless/01763_max_distributed_depth.sql +++ b/tests/queries/0_stateless/01763_max_distributed_depth.sql @@ -9,7 +9,9 @@ CREATE TABLE tt6 `status` String ) -ENGINE = Distributed('test_shard_localhost', '', 'tt6', rand()); +ENGINE = Distributed('test_shard_localhost', '', 'tt7', rand()); + +CREATE TABLE tt7 as tt6 ENGINE = Distributed('test_shard_localhost', '', 'tt6', rand()); INSERT INTO tt6 VALUES (1, 1, 1, 1, 'ok'); -- { serverError 581 } diff --git a/tests/queries/0_stateless/01766_todatetime64_no_timezone_arg.reference b/tests/queries/0_stateless/01766_todatetime64_no_timezone_arg.reference index 52eea094ae4..b0e96ac9e54 100644 --- a/tests/queries/0_stateless/01766_todatetime64_no_timezone_arg.reference +++ b/tests/queries/0_stateless/01766_todatetime64_no_timezone_arg.reference @@ -1 +1 @@ -2021-03-22 00:00:00.000 +2021-03-23 00:00:00.000 diff --git a/tests/queries/0_stateless/01766_todatetime64_no_timezone_arg.sql b/tests/queries/0_stateless/01766_todatetime64_no_timezone_arg.sql index 99141a694c1..2aac922487e 100644 --- a/tests/queries/0_stateless/01766_todatetime64_no_timezone_arg.sql +++ b/tests/queries/0_stateless/01766_todatetime64_no_timezone_arg.sql @@ -1 +1 @@ -SELECT toDateTime64('2021-03-22', 3); +SELECT toDateTime64('2021-03-23', 3); 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/01822_short_circuit.reference b/tests/queries/0_stateless/01822_short_circuit.reference new file mode 100644 index 00000000000..96c4e161244 --- /dev/null +++ b/tests/queries/0_stateless/01822_short_circuit.reference @@ -0,0 +1,1805 @@ +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 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +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 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +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 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +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 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +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 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +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 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +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 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +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 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +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 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +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 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +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 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +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 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +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 +00 +\N +\N +\N +\N +55 +\N +\N +\N +\N +1010 +\N +\N +\N +\N +1515 +\N +\N +\N +\N +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 +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +20 +\N +\N +\N +\N +25 +\N +\N +\N +\N +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 +\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 +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 +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 +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 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +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 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +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 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +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 +\N +\N +\N +\N +5 +\N +\N +\N +\N +10 +\N +\N +\N +\N +15 +\N +\N +\N +\N +[] +[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 +42 +21 +14 +10.5 +0 +42 +21 +14 +10.5 +\N +\N +\N 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..fe8a0315d4a --- /dev/null +++ b/tests/queries/0_stateless/01822_short_circuit.sql @@ -0,0 +1,150 @@ +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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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); +select if(number = 0, 0, toDecimal32(42, 2) / number) from numbers(5); +select if(isNull(x), Null, 42 / x) from (select CAST(materialize(Null), 'Nullable(Decimal32(2))') as x); +select if(isNull(x), Null, x / 0) from (select CAST(materialize(Null), 'Nullable(Decimal32(2))') as x); + +select if(isNull(x), Null, intDiv(42, x)) from (select CAST(materialize(Null), 'Nullable(Int64)') as x); diff --git a/tests/queries/0_stateless/01852_cast_operator.reference b/tests/queries/0_stateless/01852_cast_operator.reference index dc522ae8076..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 @@ -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_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_cast_operator_3.reference b/tests/queries/0_stateless/01852_cast_operator_3.reference new file mode 100644 index 00000000000..a1e54797d60 --- /dev/null +++ b/tests/queries/0_stateless/01852_cast_operator_3.reference @@ -0,0 +1,10 @@ +-1 +SELECT CAST(\'-1\', \'Int32\') +-0.1 +SELECT CAST(\'-0.1\', \'Decimal(38, 38)\') +-0.111 +SELECT CAST(\'-0.111\', \'Float64\') +[-1,2,-3] +SELECT CAST(\'[-1, 2, -3]\', \'Array(Int32)\') +[-1.1,2,-3] +SELECT CAST(\'[-1.1, 2, -3]\', \'Array(Float64)\') diff --git a/tests/queries/0_stateless/01852_cast_operator_3.sql b/tests/queries/0_stateless/01852_cast_operator_3.sql new file mode 100644 index 00000000000..1ad015a8dc4 --- /dev/null +++ b/tests/queries/0_stateless/01852_cast_operator_3.sql @@ -0,0 +1,14 @@ +SELECT -1::Int32; +EXPLAIN SYNTAX SELECT -1::Int32; + +SELECT -0.1::Decimal(38, 38); +EXPLAIN SYNTAX SELECT -0.1::Decimal(38, 38); + +SELECT -0.111::Float64; +EXPLAIN SYNTAX SELECT -0.111::Float64; + +SELECT [-1, 2, -3]::Array(Int32); +EXPLAIN SYNTAX SELECT [-1, 2, -3]::Array(Int32); + +SELECT [-1.1, 2, -3]::Array(Float64); +EXPLAIN SYNTAX SELECT [-1.1, 2, -3]::Array(Float64); diff --git a/tests/queries/0_stateless/01852_cast_operator_bad_cases.reference b/tests/queries/0_stateless/01852_cast_operator_bad_cases.reference index 2c4517e0eda..b179e5e927a 100644 --- a/tests/queries/0_stateless/01852_cast_operator_bad_cases.reference +++ b/tests/queries/0_stateless/01852_cast_operator_bad_cases.reference @@ -8,3 +8,11 @@ Syntax error Syntax error Syntax error Code: 6 +Syntax error +Syntax error +Syntax error +Syntax error +Syntax error +Syntax error +Syntax error +Syntax error diff --git a/tests/queries/0_stateless/01852_cast_operator_bad_cases.sh b/tests/queries/0_stateless/01852_cast_operator_bad_cases.sh index f2f566b78c4..6c578a0996c 100755 --- a/tests/queries/0_stateless/01852_cast_operator_bad_cases.sh +++ b/tests/queries/0_stateless/01852_cast_operator_bad_cases.sh @@ -15,3 +15,13 @@ $CLICKHOUSE_CLIENT --query="SELECT [1 2]::Array(UInt8)" 2>&1 | grep -o -m1 'Syn $CLICKHOUSE_CLIENT --query="SELECT 1 4::UInt32" 2>&1 | grep -o 'Syntax error' $CLICKHOUSE_CLIENT --query="SELECT '1' '4'::UInt32" 2>&1 | grep -o -m1 'Syntax error' $CLICKHOUSE_CLIENT --query="SELECT '1''4'::UInt32" 2>&1 | grep -o -m1 'Code: 6' + +$CLICKHOUSE_CLIENT --query="SELECT ::UInt32" 2>&1 | grep -o 'Syntax error' +$CLICKHOUSE_CLIENT --query="SELECT ::String" 2>&1 | grep -o 'Syntax error' +$CLICKHOUSE_CLIENT --query="SELECT -::Int32" 2>&1 | grep -o 'Syntax error' + +$CLICKHOUSE_CLIENT --query="SELECT [1, -]::Array(Int32)" 2>&1 | grep -o 'Syntax error' +$CLICKHOUSE_CLIENT --query="SELECT [1, 3-]::Array(Int32)" 2>&1 | grep -o 'Syntax error' +$CLICKHOUSE_CLIENT --query="SELECT [-, 2]::Array(Int32)" 2>&1 | grep -o 'Syntax error' +$CLICKHOUSE_CLIENT --query="SELECT [--, 2]::Array(Int32)" 2>&1 | grep -o 'Syntax error' +$CLICKHOUSE_CLIENT --query="SELECT [1, 2]-::Array(Int32)" 2>&1 | grep -o 'Syntax error' diff --git a/tests/queries/0_stateless/01856_create_function.reference b/tests/queries/0_stateless/01856_create_function.reference new file mode 100644 index 00000000000..a211b2318a0 --- /dev/null +++ b/tests/queries/0_stateless/01856_create_function.reference @@ -0,0 +1,2 @@ +24 +1 diff --git a/tests/queries/0_stateless/01856_create_function.sql b/tests/queries/0_stateless/01856_create_function.sql new file mode 100644 index 00000000000..7e2f38c2415 --- /dev/null +++ b/tests/queries/0_stateless/01856_create_function.sql @@ -0,0 +1,13 @@ +CREATE FUNCTION 01856_test_function_0 AS (a, b, c) -> a * b * c; +SELECT 01856_test_function_0(2, 3, 4); +SELECT isConstant(01856_test_function_0(1, 2, 3)); +DROP FUNCTION 01856_test_function_0; +CREATE FUNCTION 01856_test_function_1 AS (a, b) -> a || b || c; --{serverError 47} +CREATE FUNCTION 01856_test_function_1 AS (a, b) -> 01856_test_function_1(a, b) + 01856_test_function_1(a, b); --{serverError 600} +CREATE FUNCTION cast AS a -> a + 1; --{serverError 598} +CREATE FUNCTION sum AS (a, b) -> a + b; --{serverError 598} +CREATE FUNCTION 01856_test_function_2 AS (a, b) -> a + b; +CREATE FUNCTION 01856_test_function_2 AS (a) -> a || '!!!'; --{serverError 598} +DROP FUNCTION 01856_test_function_2; +DROP FUNCTION unknown_function; -- {serverError 46} +DROP FUNCTION CAST; -- {serverError 599} 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/01889_sqlite_read_write.sh b/tests/queries/0_stateless/01889_sqlite_read_write.sh index 73b106e9eb4..3e7e15d2830 100755 --- a/tests/queries/0_stateless/01889_sqlite_read_write.sh +++ b/tests/queries/0_stateless/01889_sqlite_read_write.sh @@ -7,60 +7,68 @@ CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # 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 +mkdir -p "${user_files_path}/" +chmod 777 "${user_files_path}" +export CURR_DATABASE="test_01889_sqllite_${CLICKHOUSE_DATABASE}" -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' +DB_PATH=${user_files_path}/${CURR_DATABASE}_db1 +DB_PATH2=$CUR_DIR/${CURR_DATABASE}_db2 -sqlite3 ${DB_PATH} 'CREATE TABLE table1 (col1 text, col2 smallint);' -sqlite3 ${DB_PATH} 'CREATE TABLE table2 (col1 int, col2 text);' +function cleanup() +{ + ${CLICKHOUSE_CLIENT} --query="DROP DATABASE IF EXISTS ${CURR_DATABASE}" + rm -r "${DB_PATH}" "${DB_PATH2}" +} +trap cleanup EXIT -chmod ugo+w ${DB_PATH} +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} "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 table1 (col1 text, col2 smallint);' +sqlite3 "${DB_PATH}" 'CREATE TABLE table2 (col1 int, col2 text);' -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)" +chmod ugo+w "${DB_PATH}" -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)' +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="CREATE DATABASE ${CURR_DATABASE} ENGINE = SQLite('${DB_PATH}')" ${CLICKHOUSE_CLIENT} --query="select 'show database tables:'"; -${CLICKHOUSE_CLIENT} --query='SHOW TABLES FROM sqlite_database;' +${CLICKHOUSE_CLIENT} --query='SHOW TABLES FROM '"${CURR_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="SHOW CREATE TABLE ${CURR_DATABASE}.table1;" | sed -r 's/(.*SQLite)(.*)/\1/' +${CLICKHOUSE_CLIENT} --query="SHOW CREATE TABLE ${CURR_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="DESCRIBE TABLE ${CURR_DATABASE}.table1;" +${CLICKHOUSE_CLIENT} --query="DESCRIBE TABLE ${CURR_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 * FROM ${CURR_DATABASE}.table1 ORDER BY col2" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM ${CURR_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="SHOW CREATE TABLE ${CURR_DATABASE}.table4;" | sed -r 's/(.*SQLite)(.*)/\1/' +${CLICKHOUSE_CLIENT} --query="SHOW CREATE TABLE ${CURR_DATABASE}.table5;" | sed -r 's/(.*SQLite)(.*)/\1/' -${CLICKHOUSE_CLIENT} --query='DROP DATABASE IF EXISTS sqlite_database' +${CLICKHOUSE_CLIENT} --query="DROP DATABASE IF EXISTS ${CURR_DATABASE}" ${CLICKHOUSE_CLIENT} --query="select 'create table engine with table3'"; @@ -79,11 +87,9 @@ ${CLICKHOUSE_CLIENT} --query="INSERT INTO TABLE FUNCTION sqlite('${DB_PATH}', 't ${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)" +sqlite3 "${DB_PATH2}" 'DROP TABLE IF EXISTS table1' +sqlite3 "${DB_PATH2}" 'CREATE TABLE table1 (col1 text, col2 smallint);' +sqlite3 "${DB_PATH2}" "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} +${CLICKHOUSE_LOCAL} --query="SELECT * FROM sqlite('${DB_PATH2}', 'table1') ORDER BY col2" 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_json_extract_raw_string.reference b/tests/queries/0_stateless/01915_json_extract_raw_string.reference index 839cb33f5f2..3a41f35710c 100644 --- a/tests/queries/0_stateless/01915_json_extract_raw_string.reference +++ b/tests/queries/0_stateless/01915_json_extract_raw_string.reference @@ -1 +1,2 @@ ('123','456','[7,8,9]') +\N diff --git a/tests/queries/0_stateless/01915_json_extract_raw_string.sql b/tests/queries/0_stateless/01915_json_extract_raw_string.sql index 6ba94ac6dfd..4c5be79f6ef 100644 --- a/tests/queries/0_stateless/01915_json_extract_raw_string.sql +++ b/tests/queries/0_stateless/01915_json_extract_raw_string.sql @@ -1 +1,3 @@ select JSONExtract('{"a": "123", "b": 456, "c": [7, 8, 9]}', 'Tuple(a String, b String, c String)'); + +with '{"string_value":null}' as json select JSONExtract(json, 'string_value', 'Nullable(String)'); diff --git a/tests/queries/0_stateless/01921_concurrent_ttl_and_normal_merges_zookeeper_long.reference b/tests/queries/0_stateless/01921_concurrent_ttl_and_normal_merges_zookeeper_long.reference index d00491fd7e5..e5a8ecd20b4 100644 --- a/tests/queries/0_stateless/01921_concurrent_ttl_and_normal_merges_zookeeper_long.reference +++ b/tests/queries/0_stateless/01921_concurrent_ttl_and_normal_merges_zookeeper_long.reference @@ -1 +1,3 @@ +Replication did not hang: synced all replicas of ttl_table +Consistency: 1 1 diff --git a/tests/queries/0_stateless/01921_concurrent_ttl_and_normal_merges_zookeeper_long.sh b/tests/queries/0_stateless/01921_concurrent_ttl_and_normal_merges_zookeeper_long.sh index 13086879e0d..80022bd472d 100755 --- a/tests/queries/0_stateless/01921_concurrent_ttl_and_normal_merges_zookeeper_long.sh +++ b/tests/queries/0_stateless/01921_concurrent_ttl_and_normal_merges_zookeeper_long.sh @@ -3,6 +3,8 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # shellcheck source=../shell_config.sh . "$CURDIR"/../shell_config.sh +# shellcheck source=./replication.lib +. "$CURDIR"/replication.lib NUM_REPLICAS=5 @@ -58,14 +60,16 @@ timeout $TIMEOUT bash -c optimize_thread 2> /dev/null & timeout $TIMEOUT bash -c optimize_thread 2> /dev/null & wait - for i in $(seq 1 $NUM_REPLICAS); do - $CLICKHOUSE_CLIENT --query "SYSTEM SYNC REPLICA ttl_table$i" + # disable ttl merges before checking consistency + $CLICKHOUSE_CLIENT --query "ALTER TABLE ttl_table$i MODIFY SETTING max_replicated_merges_with_ttl_in_queue=0" done +check_replication_consistency "ttl_table" "count(), sum(toUInt64(key))" $CLICKHOUSE_CLIENT --query "SELECT * FROM system.replication_queue where table like 'ttl_table%' and database = '${CLICKHOUSE_DATABASE}' and type='MERGE_PARTS' and last_exception != '' FORMAT Vertical" $CLICKHOUSE_CLIENT --query "SELECT COUNT() > 0 FROM system.part_log where table like 'ttl_table%' and database = '${CLICKHOUSE_DATABASE}'" + for i in $(seq 1 $NUM_REPLICAS); do $CLICKHOUSE_CLIENT --query "DROP TABLE IF EXISTS ttl_table$i" & done 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 index 235a227f548..fd3d3b2450d 100644 --- a/tests/queries/0_stateless/01925_map_populate_series_on_map.reference +++ b/tests/queries/0_stateless/01925_map_populate_series_on_map.reference @@ -29,39 +29,39 @@ select mapPopulateSeries(m, n) from map_test; {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) +{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) +{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) +{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) +{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) +{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) +{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) +{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) +{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) +{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) +{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) +{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) +{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) +{-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) +{-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) +{-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) +{-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) +{-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_test_group_by_const_consistency.reference b/tests/queries/0_stateless/01925_test_group_by_const_consistency.reference index 573541ac970..93f9e3d10db 100644 --- a/tests/queries/0_stateless/01925_test_group_by_const_consistency.reference +++ b/tests/queries/0_stateless/01925_test_group_by_const_consistency.reference @@ -1 +1,2 @@ 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 index 8a5de0e7c4f..a73c06bbe49 100644 --- a/tests/queries/0_stateless/01925_test_group_by_const_consistency.sql +++ b/tests/queries/0_stateless/01925_test_group_by_const_consistency.sql @@ -1,2 +1,4 @@ -SELECT 1 as a, count() FROM numbers(10) WHERE 0 GROUP BY a; -SELECT count() FROM numbers(10) WHERE 0 +SELECT 1 as a, count() FROM numbers(10) WHERE 0 GROUP BY a; +SELECT count() FROM numbers(10) WHERE 0; + +SELECT 1 as a, count() FROM numbers(10) WHERE 0 GROUP BY a SETTINGS empty_result_for_aggregation_by_constant_keys_on_empty_set = 0; diff --git a/tests/queries/0_stateless/01942_dateTimeToSnowflake.reference b/tests/queries/0_stateless/01942_dateTimeToSnowflake.reference new file mode 100644 index 00000000000..dfca3a10eeb --- /dev/null +++ b/tests/queries/0_stateless/01942_dateTimeToSnowflake.reference @@ -0,0 +1,6 @@ +const column +2021-08-15 18:57:56 1426860702823350272 +2021-08-15 18:57:56.492 1426860704886947840 +non-const column +2021-08-15 18:57:56 1426860702823350272 +2021-08-15 18:57:56.492 1426860704886947840 diff --git a/tests/queries/0_stateless/01942_dateTimeToSnowflake.sql b/tests/queries/0_stateless/01942_dateTimeToSnowflake.sql new file mode 100644 index 00000000000..047d8be7be5 --- /dev/null +++ b/tests/queries/0_stateless/01942_dateTimeToSnowflake.sql @@ -0,0 +1,23 @@ +-- Error cases +SELECT dateTimeToSnowflake(); -- {serverError 42} +SELECT dateTime64ToSnowflake(); -- {serverError 42} + +SELECT dateTimeToSnowflake('abc'); -- {serverError 43} +SELECT dateTime64ToSnowflake('abc'); -- {serverError 43} + +SELECT dateTimeToSnowflake('abc', 123); -- {serverError 42} +SELECT dateTime64ToSnowflake('abc', 123); -- {serverError 42} + +SELECT 'const column'; +WITH toDateTime('2021-08-15 18:57:56', 'Asia/Shanghai') AS dt +SELECT dt, dateTimeToSnowflake(dt); + +WITH toDateTime64('2021-08-15 18:57:56.492', 3, 'Asia/Shanghai') AS dt64 +SELECT dt64, dateTime64ToSnowflake(dt64); + +SELECT 'non-const column'; +WITH toDateTime('2021-08-15 18:57:56', 'Asia/Shanghai') AS x +SELECT materialize(x) as dt, dateTimeToSnowflake(dt);; + +WITH toDateTime64('2021-08-15 18:57:56.492', 3, 'Asia/Shanghai') AS x +SELECT materialize(x) as dt64, dateTime64ToSnowflake(dt64); diff --git a/tests/queries/0_stateless/01942_snowflakeToDateTime.reference b/tests/queries/0_stateless/01942_snowflakeToDateTime.reference new file mode 100644 index 00000000000..bed18023f6a --- /dev/null +++ b/tests/queries/0_stateless/01942_snowflakeToDateTime.reference @@ -0,0 +1,3 @@ +const column +UTC 1426860704886947840 2021-08-15 10:57:56 DateTime(\'UTC\') 2021-08-15 10:57:56.492 DateTime64(3, \'UTC\') +Asia/Shanghai 1426860704886947840 2021-08-15 18:57:56 DateTime(\'Asia/Shanghai\') 2021-08-15 18:57:56.492 DateTime64(3, \'Asia/Shanghai\') diff --git a/tests/queries/0_stateless/01942_snowflakeToDateTime.sql b/tests/queries/0_stateless/01942_snowflakeToDateTime.sql new file mode 100644 index 00000000000..f6f171afabf --- /dev/null +++ b/tests/queries/0_stateless/01942_snowflakeToDateTime.sql @@ -0,0 +1,32 @@ +-- -- Error cases +SELECT snowflakeToDateTime(); -- {serverError 42} +SELECT snowflakeToDateTime64(); -- {serverError 42} + +SELECT snowflakeToDateTime('abc'); -- {serverError 43} +SELECT snowflakeToDateTime64('abc'); -- {serverError 43} + +SELECT snowflakeToDateTime('abc', 123); -- {serverError 43} +SELECT snowflakeToDateTime64('abc', 123); -- {serverError 43} + +SELECT 'const column'; +WITH + CAST(1426860704886947840 AS Int64) AS i64, + 'UTC' AS tz +SELECT + tz, + i64, + snowflakeToDateTime(i64, tz) as dt, + toTypeName(dt), + snowflakeToDateTime64(i64, tz) as dt64, + toTypeName(dt64); + +WITH + CAST(1426860704886947840 AS Int64) AS i64, + 'Asia/Shanghai' AS tz +SELECT + tz, + i64, + snowflakeToDateTime(i64, tz) as dt, + toTypeName(dt), + snowflakeToDateTime64(i64, tz) as dt64, + toTypeName(dt64); \ No newline at end of file diff --git a/tests/queries/0_stateless/01944_insert_partition_by.reference b/tests/queries/0_stateless/01944_insert_partition_by.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/01944_insert_partition_by.sql b/tests/queries/0_stateless/01944_insert_partition_by.sql new file mode 100644 index 00000000000..1c7d96d7762 --- /dev/null +++ b/tests/queries/0_stateless/01944_insert_partition_by.sql @@ -0,0 +1,9 @@ +INSERT INTO TABLE FUNCTION file('foo.csv', 'CSV', 'id Int32, val Int32') PARTITION BY val VALUES (1, 1), (2, 2); -- { serverError NOT_IMPLEMENTED } +INSERT INTO TABLE FUNCTION s3('http://localhost:9001/foo/test_{_partition_id}.csv', 'admin', 'admin', 'CSV', 'id Int32, val String') PARTITION BY val VALUES (1, '\r\n'); -- { serverError CANNOT_PARSE_TEXT } +INSERT INTO TABLE FUNCTION s3('http://localhost:9001/foo/test_{_partition_id}.csv', 'admin', 'admin', 'CSV', 'id Int32, val String') PARTITION BY val VALUES (1, 'abc\x00abc'); -- { serverError CANNOT_PARSE_TEXT } +INSERT INTO TABLE FUNCTION s3('http://localhost:9001/foo/test_{_partition_id}.csv', 'admin', 'admin', 'CSV', 'id Int32, val String') PARTITION BY val VALUES (1, 'abc\xc3\x28abc'); -- { serverError CANNOT_PARSE_TEXT } +INSERT INTO TABLE FUNCTION s3('http://localhost:9001/foo/test_{_partition_id}.csv', 'admin', 'admin', 'CSV', 'id Int32, val String') PARTITION BY val VALUES (1, 'abc}{abc'); -- { serverError CANNOT_PARSE_TEXT } +INSERT INTO TABLE FUNCTION s3('http://localhost:9001/foo/test_{_partition_id}.csv', 'admin', 'admin', 'CSV', 'id Int32, val String') PARTITION BY val VALUES (1, 'abc*abc'); -- { serverError CANNOT_PARSE_TEXT } +INSERT INTO TABLE FUNCTION s3('http://localhost:9001/foo/{_partition_id}', 'admin', 'admin', 'CSV', 'id Int32, val String') PARTITION BY val VALUES (1, ''); -- { serverError BAD_ARGUMENTS } +INSERT INTO TABLE FUNCTION s3('http://localhost:9001/{_partition_id}/key.csv', 'admin', 'admin', 'CSV', 'id Int32, val String') PARTITION BY val VALUES (1, ''); -- { serverError BAD_ARGUMENTS } +INSERT INTO TABLE FUNCTION s3('http://localhost:9001/{_partition_id}/key.csv', 'admin', 'admin', 'CSV', 'id Int32, val String') PARTITION BY val VALUES (1, 'aa/bb'); -- { serverError CANNOT_PARSE_TEXT } diff --git a/tests/queries/0_stateless/01950_aliases_bad_cast.reference b/tests/queries/0_stateless/01950_aliases_bad_cast.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/01950_aliases_bad_cast.sql b/tests/queries/0_stateless/01950_aliases_bad_cast.sql new file mode 100644 index 00000000000..bdd2339f855 --- /dev/null +++ b/tests/queries/0_stateless/01950_aliases_bad_cast.sql @@ -0,0 +1,2 @@ +SELECT 1, * FROM (SELECT NULL AS `1`); -- { serverError 352 } +SELECT '7', 'xyz', * FROM (SELECT NULL AS `'xyz'`); -- { serverError 352 } 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 index 1602d6587ad..f1df2658897 100644 --- a/tests/queries/0_stateless/01950_kill_large_group_by_query.reference +++ b/tests/queries/0_stateless/01950_kill_large_group_by_query.reference @@ -1,2 +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 +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 name2, 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 name2, 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 index 465b923187e..0b369c7257e 100755 --- a/tests/queries/0_stateless/01950_kill_large_group_by_query.sh +++ b/tests/queries/0_stateless/01950_kill_large_group_by_query.sh @@ -23,7 +23,7 @@ $CLICKHOUSE_CLIENT --max_execution_time 10 --query_id "test_01948_tcp_$CLICKHOUS SELECT 'Name' as name, number FROM system.numbers LIMIT 2000000 ) AS a, ( - SELECT 'Name' as name, number FROM system.numbers LIMIT 2000000 + SELECT 'Name' as name2, number FROM system.numbers LIMIT 2000000 ) as b GROUP BY n ) @@ -44,7 +44,7 @@ ${CLICKHOUSE_CURL_COMMAND} -q --max-time 10 -sS "$CLICKHOUSE_URL&query_id=test_0 SELECT 'Name' as name, number FROM system.numbers LIMIT 2000000 ) AS a, ( - SELECT 'Name' as name, number FROM system.numbers LIMIT 2000000 + SELECT 'Name' as name2, number FROM system.numbers LIMIT 2000000 ) as b GROUP BY n ) diff --git a/tests/queries/0_stateless/02001_select_with_filter.reference b/tests/queries/0_stateless/02001_select_with_filter.reference new file mode 100644 index 00000000000..9d104af5e8c --- /dev/null +++ b/tests/queries/0_stateless/02001_select_with_filter.reference @@ -0,0 +1,2 @@ +98 +2450 diff --git a/tests/queries/0_stateless/02001_select_with_filter.sql b/tests/queries/0_stateless/02001_select_with_filter.sql new file mode 100644 index 00000000000..4d10f86ed96 --- /dev/null +++ b/tests/queries/0_stateless/02001_select_with_filter.sql @@ -0,0 +1,3 @@ +SELECT argMax(number, number + 1) FILTER(WHERE number != 99) FROM numbers(100) ; +SELECT sum(number) FILTER(WHERE number % 2 == 0) FROM numbers(100); +SELECT sumIfOrNull(number, number % 2 == 1) FILTER(WHERE number % 2 == 0) FROM numbers(100); -- { serverError 184 } 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/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/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_test_positional_arguments.reference b/tests/queries/0_stateless/02006_test_positional_arguments.reference new file mode 100644 index 00000000000..a8e8ccec100 --- /dev/null +++ b/tests/queries/0_stateless/02006_test_positional_arguments.reference @@ -0,0 +1,50 @@ +-- { echo } +select x3, x2, x1 from test order by 1; +1 100 100 +10 1 10 +100 10 1 +select x3, x2, x1 from test order by x3; +1 100 100 +10 1 10 +100 10 1 +select x3, x2, x1 from test order by 1 desc; +100 10 1 +10 1 10 +1 100 100 +select x3, x2, x1 from test order by x3 desc; +100 10 1 +10 1 10 +1 100 100 +insert into test values (1, 10, 200), (10, 1, 200), (100, 100, 1); +select x3, x2 from test group by x3, x2; +200 1 +10 1 +200 10 +1 100 +100 10 +select x3, x2 from test group by 1, 2; +200 1 +10 1 +200 10 +1 100 +100 10 +select x1, x2, x3 from test order by x3 limit 1 by x3; +100 100 1 +10 1 10 +1 10 100 +1 10 200 +select x1, x2, x3 from test order by 3 limit 1 by 3; +100 100 1 +10 1 10 +1 10 100 +1 10 200 +select x1, x2, x3 from test order by x3 limit 1 by x1; +100 100 1 +10 1 10 +1 10 100 +select x1, x2, x3 from test order by 3 limit 1 by 1; +100 100 1 +10 1 10 +1 10 100 +select max(x3), max(x2), max(x1) from test group by 1; -- { serverError 43 } +select max(x1) from test order by 1; -- { serverError 43 } diff --git a/tests/queries/0_stateless/02006_test_positional_arguments.sql b/tests/queries/0_stateless/02006_test_positional_arguments.sql new file mode 100644 index 00000000000..dc45b288016 --- /dev/null +++ b/tests/queries/0_stateless/02006_test_positional_arguments.sql @@ -0,0 +1,26 @@ +set enable_positional_arguments = 1; + +drop table if exists test; +create table test(x1 Int, x2 Int, x3 Int) engine=Memory(); +insert into test values (1, 10, 100), (10, 1, 10), (100, 100, 1); + +-- { echo } +select x3, x2, x1 from test order by 1; +select x3, x2, x1 from test order by x3; + +select x3, x2, x1 from test order by 1 desc; +select x3, x2, x1 from test order by x3 desc; + +insert into test values (1, 10, 200), (10, 1, 200), (100, 100, 1); +select x3, x2 from test group by x3, x2; +select x3, x2 from test group by 1, 2; + +select x1, x2, x3 from test order by x3 limit 1 by x3; +select x1, x2, x3 from test order by 3 limit 1 by 3; +select x1, x2, x3 from test order by x3 limit 1 by x1; +select x1, x2, x3 from test order by 3 limit 1 by 1; + +select max(x3), max(x2), max(x1) from test group by 1; -- { serverError 43 } +select max(x1) from test order by 1; -- { serverError 43 } + + 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_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/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_from_infile.reference b/tests/queries/0_stateless/02009_from_infile.reference new file mode 100644 index 00000000000..48483fe50c1 --- /dev/null +++ b/tests/queries/0_stateless/02009_from_infile.reference @@ -0,0 +1,3 @@ +Hello +Hello +Correct URL diff --git a/tests/queries/0_stateless/02009_from_infile.sh b/tests/queries/0_stateless/02009_from_infile.sh new file mode 100755 index 00000000000..578ac14f558 --- /dev/null +++ b/tests/queries/0_stateless/02009_from_infile.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 + +set -e + +[ -e "${CLICKHOUSE_TMP}"/test_infile.gz ] && rm "${CLICKHOUSE_TMP}"/test_infile.gz +[ -e "${CLICKHOUSE_TMP}"/test_infile ] && rm "${CLICKHOUSE_TMP}"/test_infile + +echo "Hello" > "${CLICKHOUSE_TMP}"/test_infile + +gzip "${CLICKHOUSE_TMP}"/test_infile + +${CLICKHOUSE_CLIENT} --query "DROP TABLE IF EXISTS test_infile;" +${CLICKHOUSE_CLIENT} --query "CREATE TABLE test_infile (word String) ENGINE=Memory();" +${CLICKHOUSE_CLIENT} --query "INSERT INTO test_infile FROM INFILE '${CLICKHOUSE_TMP}/test_infile.gz' FORMAT CSV;" +${CLICKHOUSE_CLIENT} --query "SELECT * FROM test_infile;" + +# if it not fails, select will print information +${CLICKHOUSE_LOCAL} --query "CREATE TABLE test_infile (word String) ENGINE=Memory(); INSERT INTO test_infile FROM INFILE '${CLICKHOUSE_TMP}/test_infile.gz' FORMAT CSV; SELECT * from test_infile;" + +${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&query=DROP+TABLE" -d 'IF EXISTS test_infile_url' +${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&query=CREATE" -d 'TABLE test_infile_url (x String) ENGINE = Memory' +${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}" -d "INSERT INTO test_infile_url FROM INFILE '${CLICKHOUSE_TMP}/test_infile.gz' FORMAT CSV" 2>&1 | grep -q "UNKNOWN_TYPE_OF_QUERY" && echo "Correct URL" || echo 'Fail' +${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}" -d 'SELECT x FROM test_infile_url' +${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&query=DROP+TABLE" -d 'test_infile_url' 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_dictionary_empty_attribute_list.reference b/tests/queries/0_stateless/02011_dictionary_empty_attribute_list.reference new file mode 100644 index 00000000000..7938dcdde86 --- /dev/null +++ b/tests/queries/0_stateless/02011_dictionary_empty_attribute_list.reference @@ -0,0 +1,3 @@ +0 +1 +0 diff --git a/tests/queries/0_stateless/02011_dictionary_empty_attribute_list.sql b/tests/queries/0_stateless/02011_dictionary_empty_attribute_list.sql new file mode 100644 index 00000000000..5c0668cb839 --- /dev/null +++ b/tests/queries/0_stateless/02011_dictionary_empty_attribute_list.sql @@ -0,0 +1,12 @@ +DROP TABLE IF EXISTS test_table; +CREATE TABLE test_table (id UInt64) ENGINE=TinyLog; +INSERT INTO test_table VALUES (0); + +DROP DICTIONARY IF EXISTS test_dictionary; +CREATE DICTIONARY test_dictionary (id UInt64) PRIMARY KEY id LAYOUT(DIRECT()) SOURCE(CLICKHOUSE(TABLE 'test_table')); +SELECT * FROM test_dictionary; +SELECT dictHas('test_dictionary', toUInt64(0)); +SELECT dictHas('test_dictionary', toUInt64(1)); + +DROP DICTIONARY test_dictionary; +DROP TABLE test_table; 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/02012_changed_enum_type_non_replicated.reference b/tests/queries/0_stateless/02012_changed_enum_type_non_replicated.reference new file mode 100644 index 00000000000..abb96cefb59 --- /dev/null +++ b/tests/queries/0_stateless/02012_changed_enum_type_non_replicated.reference @@ -0,0 +1,4 @@ +one +one +two +two diff --git a/tests/queries/0_stateless/02012_changed_enum_type_non_replicated.sql b/tests/queries/0_stateless/02012_changed_enum_type_non_replicated.sql new file mode 100644 index 00000000000..9e25df0f41a --- /dev/null +++ b/tests/queries/0_stateless/02012_changed_enum_type_non_replicated.sql @@ -0,0 +1,8 @@ +create table enum_alter_issue (a Enum8('one' = 1, 'two' = 2)) engine = MergeTree() ORDER BY a; +insert into enum_alter_issue values ('one'), ('two'); +alter table enum_alter_issue modify column a Enum8('one' = 1, 'two' = 2, 'three' = 3); +insert into enum_alter_issue values ('one'), ('two'); +alter table enum_alter_issue detach partition id 'all'; +alter table enum_alter_issue attach partition id 'all'; +select * from enum_alter_issue order by a; +drop table enum_alter_issue; diff --git a/tests/queries/0_stateless/02012_get_server_port.reference b/tests/queries/0_stateless/02012_get_server_port.reference new file mode 100644 index 00000000000..d58c55a31dc --- /dev/null +++ b/tests/queries/0_stateless/02012_get_server_port.reference @@ -0,0 +1 @@ +9000 diff --git a/tests/queries/0_stateless/02012_get_server_port.sql b/tests/queries/0_stateless/02012_get_server_port.sql new file mode 100644 index 00000000000..cc7fecb0bf0 --- /dev/null +++ b/tests/queries/0_stateless/02012_get_server_port.sql @@ -0,0 +1,3 @@ +select getServerPort('tcp_port'); + +select getServerPort('unknown'); -- { serverError 170 } diff --git a/tests/queries/0_stateless/02012_low_cardinality_uuid_with_extremes.reference b/tests/queries/0_stateless/02012_low_cardinality_uuid_with_extremes.reference new file mode 100644 index 00000000000..af2447df807 --- /dev/null +++ b/tests/queries/0_stateless/02012_low_cardinality_uuid_with_extremes.reference @@ -0,0 +1,4 @@ +0562380c-d1f3-4091-83d5-8c972f534317 + +0562380c-d1f3-4091-83d5-8c972f534317 +0562380c-d1f3-4091-83d5-8c972f534317 diff --git a/tests/queries/0_stateless/02012_low_cardinality_uuid_with_extremes.sql b/tests/queries/0_stateless/02012_low_cardinality_uuid_with_extremes.sql new file mode 100644 index 00000000000..191383cc978 --- /dev/null +++ b/tests/queries/0_stateless/02012_low_cardinality_uuid_with_extremes.sql @@ -0,0 +1,11 @@ +DROP TABLE IF EXISTS tbl; + +SET allow_suspicious_low_cardinality_types = 1; +CREATE TABLE tbl (`lc` LowCardinality(UUID)) ENGINE = Memory; + +INSERT INTO tbl VALUES ('0562380c-d1f3-4091-83d5-8c972f534317'); + +SET extremes = 1; +SELECT * FROM tbl; + +DROP TABLE tbl; diff --git a/tests/queries/0_stateless/02012_sha512_fixedstring.reference b/tests/queries/0_stateless/02012_sha512_fixedstring.reference new file mode 100644 index 00000000000..dfc2f87087c --- /dev/null +++ b/tests/queries/0_stateless/02012_sha512_fixedstring.reference @@ -0,0 +1,22 @@ +CF83E1357EEFB8BDF1542850D66D8007D620E4050B5715DC83F4A921D36CE9CE47D0D13C5D85F2B0FF8318D2877EEC2F63B931BD47417A81A538327AF927DA3E +DDAF35A193617ABACC417349AE20413112E6FA4E89A97EA20A9EEEE64B55D39A2192992A274FC1A836BA3C23A3FEEBBD454D4423643CE80E2A9AC94FA54CA49F +5809F3ECB4AA006F71AF562D4381F2BF64EA0931FD530E939740D0C38F6EEB2A71FA0113A21C170569D8319B8C4DE8A1C1A5ABA1A1C5B23A886B06712D373B9E +6FDB5E5BCCBD093ECC48DD262A99E6B867D6F48E1DAE014D26428365E7529B0022F000CBF852BEA38F43A2034E8FE7555AC41B9EA9E27FE72F4E968926998EA8 +8018978D8AAE19322205E4CACFA045CDF7A0C4A5773A93FD24331064AFC5726F324B76802AA6FC30DFC412A6E5C3EEF4693AE4E2D0A1EA24A2D3EC46439B7923 +22F1080BFD1CEA5B86CFDEFE129D2FF67E756AA3DA0EADB4C6EBA86A0710F3C2E0F91815A28062BDA4FBF23E5FA1BD66A3CFDA37AC7354516943AB6E08E88106 +08788919600C5C9B93704570858D8B64D5B335FAD2B23E28A5E68A08BCC4AD9BCA1991178FEA22BDAAA3C9C2FEB061FF4919C1C840DFA8188858D80EDCE98499 +0EFD835B217A94C32F45B9C3720644D7A4A49DD3A74EDE4257CFBB74164C80382322B8EA7B6131747609BA1B2776E84AEC2820D9414FC5F66B6A42D3F90F1D9F +C161DA64EE30E86768040C4BB7B88C3FAE5A1E79CA2441B2DB66552B126C00F952D2D854DF2F5D56FB85ED57C5A39E95BFE485A6AF70963A81BE67DFDB96CFBF +F65B5379D687EA1FB38E32F8251F0FB270061DC6DF9AECA1E258A6F1BAFF70D4E979FC9315ED1FAE24D000CC0EF7937D02703B2061694B3DCA2308C5C0779184 +DF25395F5FFF00E5B64BF5EEAFD94A1A21B4F4FC4FAE01DF48C27C77E0C9DC6FC253C7E7F32185146048190B73E3ED53BC76F626D24E9DE3FBA3EBC48B671CC0 +F1DD6EFB26D0169259FBD53150D6E0C4F2E1FFF2F9DA6B77EC9AD065AD67D33F95411CC5E5B31CEAB970974E5C8E3C6376445D8422F052CABB121BCE1449C494 +561A1DEDBB03FD632DBFDCC73E83A8DBD17D6E30B14642BAC8EBF3DF6622150A5E51ACC059E2C44EF71A00FBEEB062F2EE7A610E5462E6B4805449574AAE857F +D59943FE43CB50F2C3AE74F9BD09F72140519EA30C1A24E6F7A4BCBBD12860D954F9752A24FBAA1D606F362564D905E8B29806903B1542D948C2B8293FC09A59 +E18A99CED7BD69979406C5A666336D7316E11240FF5F8C1632F17BEB1BD58838E0222CCD48D4227F0751592F1C731B4BB11C325F09FB15923F0334C64303D73A +0508B92D15B0750343F9B3E2218C7D54BB6D9A3ABA5FA941977832AA89300516505E91034E4ECD4812A7A58438251651C00974DDCD3C471B9ED02451871F4A48 +ADFDC00D41881138C96581D43298C5724C20500C5A966144B51531FFB2FE6CE265BE3101CD19B985A2253A7B48EE4EC5EBD4B2876CF0E66F1095EB0A2521C525 +758ABA28159AABFFF659E6698397AD7A9EBBA77AA3FFC25551B7CF2057930AD051D357866259E5288B0B837E3F5C4ED1D1229320595F914381903CD48DF76CB2 +E7A061D9B066E2CA44CF959A76FC04D8B02998CB9D46A60C19E015EA9389F3F9595CBBC4CC46E1319B02B3269FBD21F62D15A6F13428F8389CB4507AF6DB6D89 +3438D75650E1EDB8A11EF4F63A5DFF239A70B28B6A14F13FCFDD14D02BE8BD00E84DF956C159CFDC85D6E44DB62D00E9206F40453FFD9CC97C38449527D33FF6 +DB229C3A53B0340E94EFDA4D03B54F161313699757CAC312F377B731AE6C62010E0C0010E78F73E6D6B0BB438F644D176244B2614897799F9FA3F85DA980C218 +FDD9FD54050D95855B8E3A34F3A54E309E1CA87CD44A8506EB10051D1CA650DB64ABD0BE4F4F44E45F630C22CA270FA7694AC2261DF2EFD766B8CED53F285A27 diff --git a/tests/queries/0_stateless/02012_sha512_fixedstring.sql b/tests/queries/0_stateless/02012_sha512_fixedstring.sql new file mode 100644 index 00000000000..8ea0fbb2f4e --- /dev/null +++ b/tests/queries/0_stateless/02012_sha512_fixedstring.sql @@ -0,0 +1,14 @@ +SELECT hex(SHA512('')); +SELECT hex(SHA512('abc')); + +DROP TABLE IF EXISTS defaults; +CREATE TABLE defaults +( + s FixedString(20) +)ENGINE = Memory(); + +INSERT INTO defaults SELECT s FROM generateRandom('s FixedString(20)', 1, 1, 1) LIMIT 20; + +SELECT hex(SHA512(s)) FROM defaults; + +DROP TABLE defaults; diff --git a/tests/queries/0_stateless/02012_zookeeper_changed_enum_type.reference b/tests/queries/0_stateless/02012_zookeeper_changed_enum_type.reference new file mode 100644 index 00000000000..a83c714a5cf --- /dev/null +++ b/tests/queries/0_stateless/02012_zookeeper_changed_enum_type.reference @@ -0,0 +1,4 @@ +one 1 +two 2 +one 3 +two 4 diff --git a/tests/queries/0_stateless/02012_zookeeper_changed_enum_type.sql b/tests/queries/0_stateless/02012_zookeeper_changed_enum_type.sql new file mode 100644 index 00000000000..0c95c7ff403 --- /dev/null +++ b/tests/queries/0_stateless/02012_zookeeper_changed_enum_type.sql @@ -0,0 +1,13 @@ +create table enum_alter_issue (a Enum8('one' = 1, 'two' = 2), b Int) +engine = ReplicatedMergeTree('/clickhouse/tables/{database}/test_02012/enum_alter_issue', 'r1') +ORDER BY a; + +insert into enum_alter_issue values ('one', 1), ('two', 2); +alter table enum_alter_issue modify column a Enum8('one' = 1, 'two' = 2, 'three' = 3); +insert into enum_alter_issue values ('one', 3), ('two', 4); + +alter table enum_alter_issue detach partition id 'all'; +alter table enum_alter_issue attach partition id 'all'; +select * from enum_alter_issue order by b; + +drop table enum_alter_issue; diff --git a/tests/queries/0_stateless/02012_zookeeper_changed_enum_type_incompatible.reference b/tests/queries/0_stateless/02012_zookeeper_changed_enum_type_incompatible.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/02012_zookeeper_changed_enum_type_incompatible.sql b/tests/queries/0_stateless/02012_zookeeper_changed_enum_type_incompatible.sql new file mode 100644 index 00000000000..e86023c96fa --- /dev/null +++ b/tests/queries/0_stateless/02012_zookeeper_changed_enum_type_incompatible.sql @@ -0,0 +1,12 @@ +drop table if exists enum_alter_issue; +create table enum_alter_issue (a Enum16('one' = 1, 'two' = 2), b Int) +engine = ReplicatedMergeTree('/clickhouse/tables/{database}/test_02012/enum_alter_issue', 'r2') +ORDER BY b; + +insert into enum_alter_issue values ('one', 1), ('two', 1); +alter table enum_alter_issue detach partition id 'all'; +alter table enum_alter_issue modify column a Enum8('one' = 1, 'two' = 2, 'three' = 3); +insert into enum_alter_issue values ('one', 1), ('two', 1); + +alter table enum_alter_issue attach partition id 'all'; -- {serverError TYPE_MISMATCH} +drop table enum_alter_issue; diff --git a/tests/queries/0_stateless/02013_bloom_filter_hasAll.reference b/tests/queries/0_stateless/02013_bloom_filter_hasAll.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/02013_bloom_filter_hasAll.sql b/tests/queries/0_stateless/02013_bloom_filter_hasAll.sql new file mode 100644 index 00000000000..adba3db6cf5 --- /dev/null +++ b/tests/queries/0_stateless/02013_bloom_filter_hasAll.sql @@ -0,0 +1,41 @@ +DROP TABLE IF EXISTS bftest; +CREATE TABLE bftest ( + k Int64, + y Array(Int64) DEFAULT x, + x Array(Int64), + index ix1(x) TYPE bloom_filter GRANULARITY 3 +) +Engine=MergeTree +ORDER BY k; + +INSERT INTO bftest (k, x) SELECT number, arrayMap(i->rand64()%565656, range(10)) FROM numbers(1000); + +-- index is not used, but query should still work +SELECT count() FROM bftest WHERE hasAll(x, materialize([1,2,3])) FORMAT Null; + +-- verify the expression in WHERE works on non-index col the same way as on index cols +SELECT count() FROM bftest WHERE hasAll(y, [NULL,-42]) FORMAT Null; +SELECT count() FROM bftest WHERE hasAll(y, [0,NULL]) FORMAT Null; +SELECT count() FROM bftest WHERE hasAll(y, [[123], -42]) FORMAT Null; -- { serverError 386 } +SELECT count() FROM bftest WHERE hasAll(y, [toDecimal32(123, 3), 2]) FORMAT Null; -- different, doesn't fail + +SET force_data_skipping_indices='ix1'; +SELECT count() FROM bftest WHERE has (x, 42) and has(x, -42) FORMAT Null; +SELECT count() FROM bftest WHERE hasAll(x, [42,-42]) FORMAT Null; +SELECT count() FROM bftest WHERE hasAll(x, []) FORMAT Null; +SELECT count() FROM bftest WHERE hasAll(x, [1]) FORMAT Null; + +-- can't use bloom_filter with `hasAll` on non-constant arguments (just like `has`) +SELECT count() FROM bftest WHERE hasAll(x, materialize([1,2,3])) FORMAT Null; -- { serverError 277 } + +-- NULLs are not Ok +SELECT count() FROM bftest WHERE hasAll(x, [NULL,-42]) FORMAT Null; -- { serverError 277 } +SELECT count() FROM bftest WHERE hasAll(x, [0,NULL]) FORMAT Null; -- { serverError 277 } + +-- non-compatible types +SELECT count() FROM bftest WHERE hasAll(x, [[123], -42]) FORMAT Null; -- { serverError 386 } +SELECT count() FROM bftest WHERE hasAll(x, [toDecimal32(123, 3), 2]) FORMAT Null; -- { serverError 277 } + +-- Bug discovered by AST fuzzier (fixed, shouldn't crash). +SELECT 1 FROM bftest WHERE has(x, -0.) OR 0. FORMAT Null; +SELECT count() FROM bftest WHERE hasAll(x, [0, 1]) OR 0. FORMAT Null; diff --git a/tests/queries/0_stateless/02013_zlib_read_after_eof.go b/tests/queries/0_stateless/02013_zlib_read_after_eof.go new file mode 100644 index 00000000000..a97a1438bdf --- /dev/null +++ b/tests/queries/0_stateless/02013_zlib_read_after_eof.go @@ -0,0 +1,61 @@ +package main + +import ( + "compress/gzip" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/url" + "os" +) + +func compress(data io.Reader) io.Reader { + pr, pw := io.Pipe() + gw := gzip.NewWriter(pw) + + go func() { + _, _ = io.Copy(gw, data) + gw.Close() + pw.Close() + }() + + return pr +} + +func main() { + database := os.Getenv("CLICKHOUSE_DATABASE") + p, err := url.Parse("http://localhost:8123/") + if err != nil { + panic(err) + } + q := p.Query() + + q.Set("query", "INSERT INTO "+database+".graphite FORMAT RowBinary") + p.RawQuery = q.Encode() + queryUrl := p.String() + + var req *http.Request + + req, err = http.NewRequest("POST", queryUrl, compress(os.Stdin)) + req.Header.Add("Content-Encoding", "gzip") + + if err != nil { + panic(err) + } + + client := &http.Client{ + Transport: &http.Transport{DisableKeepAlives: true}, + } + resp, err := client.Do(req) + if err != nil { + panic(err) + } + defer resp.Body.Close() + + body, _ := ioutil.ReadAll(resp.Body) + + if resp.StatusCode != 200 { + panic(fmt.Errorf("clickhouse response status %d: %s", resp.StatusCode, string(body))) + } +} diff --git a/tests/queries/0_stateless/02013_zlib_read_after_eof.reference b/tests/queries/0_stateless/02013_zlib_read_after_eof.reference new file mode 100644 index 00000000000..5caff40c4a0 --- /dev/null +++ b/tests/queries/0_stateless/02013_zlib_read_after_eof.reference @@ -0,0 +1 @@ +10000 diff --git a/tests/queries/0_stateless/02013_zlib_read_after_eof.sh b/tests/queries/0_stateless/02013_zlib_read_after_eof.sh new file mode 100755 index 00000000000..d74dca6cc61 --- /dev/null +++ b/tests/queries/0_stateless/02013_zlib_read_after_eof.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +DATA_FILE=$CUR_DIR/data_zlib/02013_zlib_read_after_eof_data + +$CLICKHOUSE_CLIENT -q "DROP TABLE IF EXISTS graphite;" + +$CLICKHOUSE_CLIENT -q "CREATE TABLE graphite(\`Path\` String, \`Value\` Float64, \`Time\` UInt32, \`Date\` Date, \`Timestamp\` UInt32) \ + ENGINE = MergeTree PARTITION BY toYYYYMM(Date) ORDER BY (Path, Time) SETTINGS index_granularity = 8192;" + +cat "$DATA_FILE" | go run $CUR_DIR/02013_zlib_read_after_eof.go + +$CLICKHOUSE_CLIENT -q "SELECT count() FROM graphite;" + +$CLICKHOUSE_CLIENT -q "drop table graphite;" diff --git a/tests/queries/0_stateless/02014_map_different_keys.reference b/tests/queries/0_stateless/02014_map_different_keys.reference new file mode 100644 index 00000000000..8af8f57f9df --- /dev/null +++ b/tests/queries/0_stateless/02014_map_different_keys.reference @@ -0,0 +1,22 @@ +...const maps... +0 +2 +0 +4 +0 +0 +2 +0 +4 +0 +4 +4 +...int keys... +foo bar bar + foo foo +...string keys... +foo foo +foo foo +foo foo +bar bar +0 diff --git a/tests/queries/0_stateless/02014_map_different_keys.sql b/tests/queries/0_stateless/02014_map_different_keys.sql new file mode 100644 index 00000000000..0998a9283f7 --- /dev/null +++ b/tests/queries/0_stateless/02014_map_different_keys.sql @@ -0,0 +1,32 @@ +SELECT '...const maps...'; + +WITH map(1, 2, 3, 4) AS m SELECT m[number] FROM numbers(5); +WITH map('1', 2, '3', 4) AS m SELECT m[toString(number)] FROM numbers(5); + +WITH map(1, 2, 3, 4) AS m SELECT m[3]; +WITH map('1', 2, '3', 4) AS m SELECT m['3']; + +DROP TABLE IF EXISTS t_map_02014; + +CREATE TABLE t_map_02014(i1 UInt64, i2 Int32, m1 Map(UInt32, String), m2 Map(Int8, String), m3 Map(Int128, String)) ENGINE = Memory; +INSERT INTO t_map_02014 VALUES (1, -1, map(1, 'foo', 2, 'bar'), map(-1, 'foo', 1, 'bar'), map(-1, 'foo', 1, 'bar')); + +SELECT '...int keys...'; + +SELECT m1[i1], m2[i1], m3[i1] FROM t_map_02014; +SELECT m1[i2], m2[i2], m3[i2] FROM t_map_02014; + +DROP TABLE IF EXISTS t_map_02014; + +CREATE TABLE t_map_02014(s String, fs FixedString(3), m1 Map(String, String), m2 Map(FixedString(3), String)) ENGINE = Memory; +INSERT INTO t_map_02014 VALUES ('aaa', 'bbb', map('aaa', 'foo', 'bbb', 'bar'), map('aaa', 'foo', 'bbb', 'bar')); + +SELECT '...string keys...'; + +SELECT m1['aaa'], m2['aaa'] FROM t_map_02014; +SELECT m1['aaa'::FixedString(3)], m2['aaa'::FixedString(3)] FROM t_map_02014; +SELECT m1[s], m2[s] FROM t_map_02014; +SELECT m1[fs], m2[fs] FROM t_map_02014; +SELECT length(m2['aaa'::FixedString(4)]) FROM t_map_02014; + +DROP TABLE IF EXISTS t_map_02014; diff --git a/tests/queries/0_stateless/arcadia_skip_list.txt b/tests/queries/0_stateless/arcadia_skip_list.txt index 606015c369f..8b97f4dcfa4 100644 --- a/tests/queries/0_stateless/arcadia_skip_list.txt +++ b/tests/queries/0_stateless/arcadia_skip_list.txt @@ -267,3 +267,4 @@ 01428_h3_range_check 01442_h3kring_range_check 01906_h3_to_geo +01944_insert_partition_by diff --git a/tests/queries/0_stateless/data_zlib/02013_zlib_read_after_eof_data b/tests/queries/0_stateless/data_zlib/02013_zlib_read_after_eof_data new file mode 100644 index 00000000000..3e57c082462 Binary files /dev/null and b/tests/queries/0_stateless/data_zlib/02013_zlib_read_after_eof_data differ diff --git a/tests/queries/0_stateless/dicts.arrow b/tests/queries/0_stateless/dicts.arrow deleted file mode 100644 index b96b75a3ccf..00000000000 Binary files a/tests/queries/0_stateless/dicts.arrow and /dev/null differ diff --git a/tests/queries/0_stateless/mergetree_mutations.lib b/tests/queries/0_stateless/mergetree_mutations.lib index d10ac883764..7d02f9f1b41 100644 --- a/tests/queries/0_stateless/mergetree_mutations.lib +++ b/tests/queries/0_stateless/mergetree_mutations.lib @@ -20,3 +20,23 @@ function wait_for_mutation() done } + +function wait_for_all_mutations() +{ + local table=$1 + local database=$2 + database=${database:="${CLICKHOUSE_DATABASE}"} + + for i in {1..200} + do + sleep 1 + if [[ $(${CLICKHOUSE_CLIENT} --query="SELECT coalesce(minOrNull(is_done), 1) FROM system.mutations WHERE database='$database' AND table like '$table'") -eq 1 ]]; then + break + fi + + if [[ $i -eq 200 ]]; then + echo "Timed out while waiting for mutation to execute!" + fi + + done +} diff --git a/tests/queries/0_stateless/replication.lib b/tests/queries/0_stateless/replication.lib new file mode 100755 index 00000000000..8fe300b59e8 --- /dev/null +++ b/tests/queries/0_stateless/replication.lib @@ -0,0 +1,87 @@ +#!/usr/bin/env bash +# shellcheck source=./mergetree_mutations.lib +. "$CURDIR"/mergetree_mutations.lib + +function try_sync_replicas() +{ + table_name_prefix=$1 + + readarray -t empty_partitions_arr < <(${CLICKHOUSE_CLIENT} -q \ + "SELECT DISTINCT substr(new_part_name, 1, position(new_part_name, '_') - 1) AS partition_id + FROM system.replication_queue + WHERE (database = currentDatabase()) AND (table LIKE '$table_name_prefix%') AND (last_exception LIKE '%No active replica has part%') AND (partition_id NOT IN ( + SELECT partition_id + FROM system.parts + WHERE (database = currentDatabase()) AND (table LIKE '$table_name_prefix%') + ))") + readarray -t tables_arr < <(${CLICKHOUSE_CLIENT} -q "SELECT name FROM system.tables WHERE database=currentDatabase() AND name like '$table_name_prefix%' AND engine like '%Replicated%'") + + for t in "${tables_arr[@]}" + do + for p in "${empty_partitions_arr[@]}" + do + # Avoid "Empty part ... is not created instead of lost part because there are no parts in partition" + $CLICKHOUSE_CLIENT -q "ALTER TABLE $t DROP PARTITION ID '$p'" 2>/dev/null + done + done + + for t in "${tables_arr[@]}" + do + # The size of log may be big, so increase timeout. + $CLICKHOUSE_CLIENT --receive_timeout 400 -q "SYSTEM SYNC REPLICA $t" || $CLICKHOUSE_CLIENT -q \ + "select 'sync failed, queue:', * from system.replication_queue where database=currentDatabase() and table='$t' order by database, table, node_name" & + done + wait + echo "Replication did not hang: synced all replicas of $table_name_prefix" +} + +function check_replication_consistency() +{ + table_name_prefix=$1 + check_query_part=$2 + + # Do not check anything if all replicas are readonly, + # because is this case all replicas are probably lost (it may happen and it's not a bug) + res=$($CLICKHOUSE_CLIENT -q "SELECT count() - sum(is_readonly) FROM system.replicas WHERE database=currentDatabase() AND table LIKE '$table_name_prefix%'") + if [ $res -eq 0 ]; then + # Print dummy lines + echo "Replication did not hang: synced all replicas of $table_name_prefix" + echo "Consistency: 1" + return 0 + fi + + # Trigger pullLogsToQueue(...) and updateMutations(...) on some replica to make it pull all mutations, so it will be possible to kill them + some_table=$($CLICKHOUSE_CLIENT -q "SELECT name FROM system.tables WHERE database=currentDatabase() AND name like '$table_name_prefix%' ORDER BY rand() LIMIT 1") + $CLICKHOUSE_CLIENT --receive_timeout 3 -q "SYSTEM SYNC REPLICA $some_table" 1>/dev/null 2>/dev/null ||: + some_table=$($CLICKHOUSE_CLIENT -q "SELECT name FROM system.tables WHERE database=currentDatabase() AND name like '$table_name_prefix%' ORDER BY rand() LIMIT 1") + $CLICKHOUSE_CLIENT --receive_timeout 3 -q "SYSTEM SYNC REPLICA $some_table" 1>/dev/null 2>/dev/null ||: + + # Forcefully cancel mutations to avoid waiting for them to finish + ${CLICKHOUSE_CLIENT} -q "KILL MUTATION WHERE database=currentDatabase() AND table like '$table_name_prefix%'" > /dev/null + + # SYNC REPLICA is not enough if some MUTATE_PARTs are not assigned yet + wait_for_all_mutations "$table_name_prefix%" + + try_sync_replicas "$table_name_prefix" + + res=$($CLICKHOUSE_CLIENT -q \ + "SELECT + if((countDistinct(data) as c) == 0, 1, c) + FROM + ( + SELECT _table, ($check_query_part) AS data + FROM merge(currentDatabase(), '$table_name_prefix') GROUP BY _table + )") + + echo "Consistency: $res" + if [ $res -ne 1 ]; then + echo "Replicas have diverged:" + $CLICKHOUSE_CLIENT -q "select 'data', _table, $check_query_part, arraySort(groupArrayDistinct(_part)) from merge(currentDatabase(), '$table_name_prefix') group by _table order by _table" + $CLICKHOUSE_CLIENT -q "select 'queue', * from system.replication_queue where database=currentDatabase() and table like '$table_name_prefix%' order by database, table, node_name" + $CLICKHOUSE_CLIENT -q "select 'mutations', * from system.mutations where database=currentDatabase() and table like '$table_name_prefix%' order by database, table, mutation_id" + $CLICKHOUSE_CLIENT -q "select 'parts', * from system.parts where database=currentDatabase() and table like '$table_name_prefix%' order by database, table, name" + echo "Good luck with debugging..." + fi + +} + diff --git a/tests/queries/0_stateless/test_infile.gz b/tests/queries/0_stateless/test_infile.gz new file mode 100644 index 00000000000..feb3ac52068 Binary files /dev/null and b/tests/queries/0_stateless/test_infile.gz differ 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 5f7dd79cf3f..1735febee44 100644 --- a/tests/queries/query_test.py +++ b/tests/queries/query_test.py @@ -156,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" @@ -168,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, @@ -182,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" @@ -197,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) @@ -217,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) @@ -250,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/skip_list.json b/tests/queries/skip_list.json index 5078dc9a256..335ed370b9b 100644 --- a/tests/queries/skip_list.json +++ b/tests/queries/skip_list.json @@ -160,6 +160,10 @@ "01781_merge_tree_deduplication", "00980_zookeeper_merge_tree_alter_settings", "00980_merge_alter_settings", + "02009_array_join_partition", + "02012_changed_enum_type_non_replicated", + "02012_zookeeper_changed_enum_type", + "02012_zookeeper_changed_enum_type_incompatible", /// Old syntax is not allowed "01062_alter_on_mutataion_zookeeper", "00925_zookeeper_empty_replicated_merge_tree_optimize_final", @@ -321,6 +325,7 @@ "01076_parallel_alter_replicated_zookeeper", "01079_parallel_alter_add_drop_column_zookeeper", "01079_parallel_alter_detach_table_zookeeper", + "01079_parallel_alter_modify_zookeeper_long", "01080_check_for_error_incorrect_size_of_nested_column", "01083_expressions_in_engine_arguments", "01084_regexp_empty", @@ -415,7 +420,6 @@ "01507_clickhouse_server_start_with_embedded_config", "01509_dictionary_preallocate", "01516_create_table_primary_key", - "01516_drop_table_stress", "01517_drop_mv_with_inner_table", "01526_complex_key_dict_direct_layout", "01527_clickhouse_local_optimize", @@ -483,10 +487,11 @@ "01804_dictionary_decimal256_type", "01850_dist_INSERT_preserve_error", // uses cluster with different static databases shard_0/shard_1 "01821_table_comment", + "01856_create_function", + "01857_create_function_and_check_jit_compiled", "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 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 part_log
+ toYYYYMM(event_date) 7500
- --> system part_log
+ toYYYYMM(event_date) 7500
- -->