You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by kx...@apache.org on 2023/07/13 13:05:30 UTC
[doris] branch branch-2.0 updated (b8fbc7c2a6 -> 3eec3fe70f)
This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a change to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
from b8fbc7c2a6 [fix](partial-update) transient rowset writer should not trigger segcompaction when build rowset (#21751)
new 677b46b0ef [FIX](serde)Fix decimal for arrow serde (#21716)
new d8b1b505bb [Improve](jsonb_extract) support jsonb_extract multi parse path (#21555)
new d036a024d5 [opt](regression case) add more index change case (#21734)
new 514e7a8c19 [Enhancement](multi-catalog) Merge hms events every round to speed up events processing. (#21589)
new 70fc3eb080 [enhancement](RoutineLoad)Mutile table support pipeline load (#21678)
new df20012e93 Revert "[imporve](bloomfilter) refactor runtime_filter_mgr with bloomfilter (#21715)" (#21763)
new bd0ed538a5 [Fix](Planner) fix limit execute before sort in show export job (#21663)
new 9542bc310e [Fix](rowset) When a rowset is cooled down, it is directly deleted. This can result in data query misses in the second phase of a two-phase query. (#21741)
new 46e7c2c7e3 [fix](ccr) Add tableName in DropInfo && BatchDropInfo (#21736)
new 004acb7352 [Fix](pipeline) close sink when fragment context destructs (#21668)
new 02248ea8d2 [Feature](Nereids) support select into outfile (#21197)
new 137b3f0afb [bugfix](ngram bf index) process differently for normal bloom filter index and ngram bf index (#21310)
new 05084ed54e [fix](multi-catalog)support oss-hdfs service (#21504)
new 3eec3fe70f [fix](merge-on-write) fix wrong result when query with prefix key predicate (#21770)
The 14 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
be/src/olap/accept_null_predicate.h | 4 +-
be/src/olap/block_column_predicate.h | 10 +-
be/src/olap/column_predicate.h | 2 +-
be/src/olap/comparison_predicate.h | 6 +-
be/src/olap/in_list_predicate.h | 6 +-
be/src/olap/like_column_predicate.h | 4 +-
be/src/olap/null_predicate.h | 4 +-
be/src/olap/rowset/segment_v2/column_reader.cpp | 3 +-
be/src/olap/rowset/segment_v2/column_reader.h | 10 +-
be/src/olap/rowset/segment_v2/segment_iterator.cpp | 4 +-
be/src/olap/storage_engine.cpp | 25 ++-
be/src/olap/storage_engine.h | 10 +
be/src/olap/tablet.cpp | 5 -
be/src/olap/task/index_builder.cpp | 5 -
be/src/pipeline/pipeline_fragment_context.cpp | 10 +
be/src/pipeline/pipeline_fragment_context.h | 1 +
be/src/runtime/fragment_mgr.cpp | 4 +
be/src/runtime/runtime_filter_mgr.cpp | 38 ++--
be/src/runtime/runtime_filter_mgr.h | 13 +-
be/src/service/internal_service.cpp | 5 +-
be/src/util/key_util.h | 7 +-
.../data_types/serde/data_type_decimal_serde.cpp | 26 +--
be/src/vec/exec/scan/new_olap_scanner.cpp | 1 +
be/src/vec/functions/function_jsonb.cpp | 154 ++++++++++----
.../serde/data_type_serde_arrow_test.cpp | 78 ++++++-
docs/en/docs/lakehouse/multi-catalog/dlf.md | 99 ++++-----
docs/en/docs/lakehouse/multi-catalog/iceberg.md | 6 +-
.../en/docs/lakehouse/multi-catalog/max_compute.md | 60 ++++++
docs/sidebars.json | 3 +-
docs/zh-CN/docs/lakehouse/multi-catalog/dlf.md | 105 +++++-----
docs/zh-CN/docs/lakehouse/multi-catalog/iceberg.md | 6 +-
.../docs/lakehouse/multi-catalog/max_compute.md | 60 ++++++
.../antlr4/org/apache/doris/nereids/DorisLexer.g4 | 1 +
.../antlr4/org/apache/doris/nereids/DorisParser.g4 | 9 +-
.../doris/alter/MaterializedViewHandler.java | 6 +-
.../org/apache/doris/binlog/DropTableRecord.java | 6 +
.../java/org/apache/doris/common/util/S3Util.java | 14 +-
.../apache/doris/datasource/InternalCatalog.java | 2 +-
.../datasource/hive/event/AddPartitionEvent.java | 10 +-
.../datasource/hive/event/AlterDatabaseEvent.java | 72 ++++++-
.../datasource/hive/event/AlterPartitionEvent.java | 23 ++-
.../datasource/hive/event/AlterTableEvent.java | 46 ++++-
.../datasource/hive/event/CreateDatabaseEvent.java | 5 +
.../datasource/hive/event/CreateTableEvent.java | 11 +
.../datasource/hive/event/DropPartitionEvent.java | 2 +-
.../datasource/hive/event/DropTableEvent.java | 19 ++
.../doris/datasource/hive/event/InsertEvent.java | 23 +++
.../datasource/hive/event/MetastoreEvent.java | 11 +
.../hive/event/MetastoreEventFactory.java | 86 +++++++-
...baseEvent.java => MetastorePartitionEvent.java} | 26 +--
.../datasource/hive/event/MetastoreTableEvent.java | 50 +++++
.../datasource/property/PropertyConverter.java | 51 ++++-
.../property/constants/OssProperties.java | 1 +
.../main/java/org/apache/doris/load/ExportMgr.java | 6 +-
.../doris/nereids/glue/LogicalPlanAdapter.java | 3 +-
.../glue/translator/PhysicalPlanTranslator.java | 32 +++
.../doris/nereids/parser/LogicalPlanBuilder.java | 36 +++-
.../properties/ChildOutputPropertyDeriver.java | 6 +
.../nereids/properties/RequestPropertyDeriver.java | 7 +
.../org/apache/doris/nereids/rules/RuleSet.java | 2 +
.../org/apache/doris/nereids/rules/RuleType.java | 1 +
.../LogicalFileSinkToPhysicalFileSink.java | 45 ++++
.../doris/nereids/stats/StatsCalculator.java | 12 ++
.../apache/doris/nereids/trees/plans/PlanType.java | 5 +-
.../trees/plans/logical/LogicalFileSink.java | 122 +++++++++++
.../trees/plans/physical/PhysicalFileSink.java | 132 ++++++++++++
.../nereids/trees/plans/visitor/PlanVisitor.java | 10 +
.../org/apache/doris/persist/BatchDropInfo.java | 12 +-
.../java/org/apache/doris/persist/DropInfo.java | 13 +-
.../java/org/apache/doris/persist/EditLog.java | 3 +-
.../apache/doris/planner/StreamLoadPlanner.java | 12 +-
.../doris/planner/external/FileQueryScanNode.java | 4 +
.../apache/doris/service/FrontendServiceImpl.java | 44 +++-
.../external/hms/MetastoreEventFactoryTest.java | 193 ++++++++++++++++++
.../doris/nereids/trees/plans/OutFileTest.java | 91 +++++++++
.../doris/persist/DropAndRecoverInfoTest.java | 10 +-
.../org/apache/doris/planner/QueryPlanTest.java | 1 +
gensrc/script/doris_builtins_functions.py | 8 +-
gensrc/thrift/FrontendService.thrift | 1 +
gensrc/thrift/PaloInternalService.thrift | 1 +
.../correctness_p0/test_select_with_prefix.out | 93 +++++++++
.../data/index_p0/test_ngram_bloomfilter_index.out | 33 +++
.../index_change/test_index_change_7.out | 121 +++++++++++
.../data/jsonb_p0/test_jsonb_load_and_function.out | 23 +++
.../test_jsonb_load_unique_key_and_function.out | 23 +++
.../outfile}/test_outfile.out | 0
.../outfile}/test_outfile_expr.out | 0
.../outfile}/test_outfile_parquet.out | 0
.../nereids_p0/outfile/test_outfile_separator.out | 11 +
.../correctness_p0/test_select_with_prefix.groovy | 149 ++++++++++++++
.../suites/export_p0/test_export_basic.groovy | 43 ++++
.../index_p0/test_ngram_bloomfilter_index.groovy | 62 ++++++
.../index_change/test_index_change_1.groovy | 2 -
.../index_change/test_index_change_2.groovy | 2 -
.../index_change/test_index_change_3.groovy | 2 -
.../index_change/test_index_change_4.groovy | 2 -
.../index_change/test_index_change_5.groovy | 2 -
.../index_change/test_index_change_6.groovy | 2 -
.../index_change/test_index_change_7.groovy | 118 +++++++++++
.../jsonb_p0/test_jsonb_load_and_function.groovy | 3 +
.../test_jsonb_load_unique_key_and_function.groovy | 4 +
.../suites/nereids_p0/outfile/test_outfile.groovy | 226 +++++++++++++++++++++
.../nereids_p0/outfile/test_outfile_expr.groovy | 135 ++++++++++++
.../nereids_p0/outfile/test_outfile_parquet.groovy | 162 +++++++++++++++
.../outfile/test_outfile_separator.groovy | 107 ++++++++++
105 files changed, 3072 insertions(+), 313 deletions(-)
create mode 100644 docs/en/docs/lakehouse/multi-catalog/max_compute.md
create mode 100644 docs/zh-CN/docs/lakehouse/multi-catalog/max_compute.md
copy fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/{AlterDatabaseEvent.java => MetastorePartitionEvent.java} (55%)
create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalFileSinkToPhysicalFileSink.java
create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileSink.java
create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFileSink.java
create mode 100644 fe/fe-core/src/test/java/org/apache/doris/external/hms/MetastoreEventFactoryTest.java
create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/OutFileTest.java
create mode 100644 regression-test/data/correctness_p0/test_select_with_prefix.out
create mode 100644 regression-test/data/index_p0/test_ngram_bloomfilter_index.out
create mode 100644 regression-test/data/inverted_index_p0/index_change/test_index_change_7.out
copy regression-test/data/{export_p0 => nereids_p0/outfile}/test_outfile.out (100%)
copy regression-test/data/{export_p0 => nereids_p0/outfile}/test_outfile_expr.out (100%)
copy regression-test/data/{export_p0 => nereids_p0/outfile}/test_outfile_parquet.out (100%)
create mode 100644 regression-test/data/nereids_p0/outfile/test_outfile_separator.out
create mode 100644 regression-test/suites/correctness_p0/test_select_with_prefix.groovy
create mode 100644 regression-test/suites/index_p0/test_ngram_bloomfilter_index.groovy
create mode 100644 regression-test/suites/inverted_index_p0/index_change/test_index_change_7.groovy
create mode 100644 regression-test/suites/nereids_p0/outfile/test_outfile.groovy
create mode 100644 regression-test/suites/nereids_p0/outfile/test_outfile_expr.groovy
create mode 100644 regression-test/suites/nereids_p0/outfile/test_outfile_parquet.groovy
create mode 100644 regression-test/suites/nereids_p0/outfile/test_outfile_separator.groovy
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org
[doris] 13/14: [fix](multi-catalog)support oss-hdfs service (#21504)
Posted by kx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
commit 05084ed54e2dcad678b11b3e6c8a4446f2f038d4
Author: slothever <18...@users.noreply.github.com>
AuthorDate: Thu Jul 13 18:02:15 2023 +0800
[fix](multi-catalog)support oss-hdfs service (#21504)
1. support oss-hdfs if it is enabled when use dlf or hms catalog
2. add docs for aliyun dlf and mc.
---
docs/en/docs/lakehouse/multi-catalog/dlf.md | 99 +++++++++----------
docs/en/docs/lakehouse/multi-catalog/iceberg.md | 6 +-
.../en/docs/lakehouse/multi-catalog/max_compute.md | 60 ++++++++++++
docs/sidebars.json | 3 +-
docs/zh-CN/docs/lakehouse/multi-catalog/dlf.md | 105 +++++++++------------
docs/zh-CN/docs/lakehouse/multi-catalog/iceberg.md | 6 +-
.../docs/lakehouse/multi-catalog/max_compute.md | 60 ++++++++++++
.../java/org/apache/doris/common/util/S3Util.java | 14 ++-
.../datasource/property/PropertyConverter.java | 51 +++++++++-
.../property/constants/OssProperties.java | 1 +
.../doris/planner/external/FileQueryScanNode.java | 4 +
11 files changed, 289 insertions(+), 120 deletions(-)
diff --git a/docs/en/docs/lakehouse/multi-catalog/dlf.md b/docs/en/docs/lakehouse/multi-catalog/dlf.md
index 42c302e5c7..763fa9fdd8 100644
--- a/docs/en/docs/lakehouse/multi-catalog/dlf.md
+++ b/docs/en/docs/lakehouse/multi-catalog/dlf.md
@@ -35,28 +35,28 @@ Doris can access DLF the same way as it accesses Hive Metastore.
## Connect to DLF
-### The First Way, Create a Hive Catalog.
+### Create a DLF Catalog.
```sql
-CREATE CATALOG hive_with_dlf PROPERTIES (
+CREATE CATALOG dlf PROPERTIES (
"type"="hms",
- "dlf.catalog.proxyMode" = "DLF_ONLY",
"hive.metastore.type" = "dlf",
- "dlf.catalog.endpoint" = "dlf.cn-beijing.aliyuncs.com",
- "dlf.catalog.region" = "cn-beijing",
- "dlf.catalog.uid" = "uid",
- "dlf.catalog.accessKeyId" = "ak",
- "dlf.catalog.accessKeySecret" = "sk"
+ "dlf.proxy.mode" = "DLF_ONLY",
+ "dlf.endpoint" = "datalake-vpc.cn-beijing.aliyuncs.com",
+ "dlf.region" = "cn-beijing",
+ "dlf.uid" = "uid",
+ "dlf.access_key" = "ak",
+ "dlf.secret_key" = "sk"
);
```
-`type` should always be `hms`. If you need to access Alibaba Cloud OSS on the public network, can add `"dlf.catalog.accessPublic"="true"`.
+`type` should always be `hms`. If you need to access Alibaba Cloud OSS on the public network, can add `"dlf.access.public"="true"`.
-* `dlf.catalog.endpoint`: DLF Endpoint. See [Regions and Endpoints of DLF](https://www.alibabacloud.com/help/en/data-lake-formation/latest/regions-and-endpoints).
-* `dlf.catalog.region`: DLF Region. See [Regions and Endpoints of DLF](https://www.alibabacloud.com/help/en/data-lake-formation/latest/regions-and-endpoints).
-* `dlf.catalog.uid`: Alibaba Cloud account. You can find the "Account ID" in the upper right corner on the Alibaba Cloud console.
-* `dlf.catalog.accessKeyId`:AccessKey, which you can create and manage on the [Alibaba Cloud console](https://ram.console.aliyun.com/manage/ak).
-* `dlf.catalog.accessKeySecret`:SecretKey, which you can create and manage on the [Alibaba Cloud console](https://ram.console.aliyun.com/manage/ak).
+* `dlf.endpoint`: DLF Endpoint. See [Regions and Endpoints of DLF](https://www.alibabacloud.com/help/en/data-lake-formation/latest/regions-and-endpoints).
+* `dlf.region`: DLF Region. See [Regions and Endpoints of DLF](https://www.alibabacloud.com/help/en/data-lake-formation/latest/regions-and-endpoints).
+* `dlf.uid`: Alibaba Cloud account. You can find the "Account ID" in the upper right corner on the Alibaba Cloud console.
+* `dlf.access_key`:AccessKey, which you can create and manage on the [Alibaba Cloud console](https://ram.console.aliyun.com/manage/ak).
+* `dlf.secret_key`:SecretKey, which you can create and manage on the [Alibaba Cloud console](https://ram.console.aliyun.com/manage/ak).
Other configuration items are fixed and require no modifications.
@@ -64,54 +64,43 @@ After the above steps, you can access metadata in DLF the same way as you access
Doris supports accessing Hive/Iceberg/Hudi metadata in DLF.
-### The Second Way, Configure the Hive Conf
+### Use OSS-HDFS as the datasource
-1. Create the `hive-site.xml` file, and put it in the `fe/conf` directory.
+1. Enable OSS-HDFS. [Grant access to OSS or OSS-HDFS](https://www.alibabacloud.com/help/en/e-mapreduce/latest/oss-hdfsnew)
+2. Download the SDK. [JindoData SDK](https://github.com/aliyun/alibabacloud-jindodata/blob/master/docs/user/5.x/5.0.0-beta7/jindodata_download.md)
+3. Decompress the jindosdk.tar.gz, and then enter its lib directory and put `jindo-core.jar, jindo-sdk.jar` to both `${DORIS_HOME}/fe/lib` and `${DORIS_HOME}/be/lib/java_extensions`.
+4. Create DLF Catalog, set `oss.hdfs.enabled` as `true`:
-```
-<?xml version="1.0"?>
-<configuration>
- <!--Set to use dlf client-->
- <property>
- <name>hive.metastore.type</name>
- <value>dlf</value>
- </property>
- <property>
- <name>dlf.catalog.endpoint</name>
- <value>dlf-vpc.cn-beijing.aliyuncs.com</value>
- </property>
- <property>
- <name>dlf.catalog.region</name>
- <value>cn-beijing</value>
- </property>
- <property>
- <name>dlf.catalog.proxyMode</name>
- <value>DLF_ONLY</value>
- </property>
- <property>
- <name>dlf.catalog.uid</name>
- <value>20000000000000000</value>
- </property>
- <property>
- <name>dlf.catalog.accessKeyId</name>
- <value>XXXXXXXXXXXXXXX</value>
- </property>
- <property>
- <name>dlf.catalog.accessKeySecret</name>
- <value>XXXXXXXXXXXXXXXXX</value>
- </property>
-</configuration>
+```sql
+CREATE CATALOG dlf_oss_hdfs PROPERTIES (
+ "type"="hms",
+ "hive.metastore.type" = "dlf",
+ "dlf.proxy.mode" = "DLF_ONLY",
+ "dlf.endpoint" = "datalake-vpc.cn-beijing.aliyuncs.com",
+ "dlf.region" = "cn-beijing",
+ "dlf.uid" = "uid",
+ "dlf.access_key" = "ak",
+ "dlf.secret_key" = "sk",
+ "oss.hdfs.enabled" = "true"
+);
```
-2. Restart FE, Doris will read and parse `fe/conf/hive-site.xml`. And then Create Catalog via the `CREATE CATALOG` statement.
+### DLF Iceberg Catalog
```sql
-CREATE CATALOG hive_with_dlf PROPERTIES (
- "type"="hms",
- "hive.metastore.uris" = "thrift://127.0.0.1:9083"
-)
+CREATE CATALOG dlf_iceberg PROPERTIES (
+ "type"="iceberg",
+ "iceberg.catalog.type" = "dlf",
+ "dlf.proxy.mode" = "DLF_ONLY",
+ "dlf.endpoint" = "datalake-vpc.cn-beijing.aliyuncs.com",
+ "dlf.region" = "cn-beijing",
+ "dlf.uid" = "uid",
+ "dlf.access_key" = "ak",
+ "dlf.secret_key" = "sk"
+);
```
-`type` should always be `hms`; while `hive.metastore.uris` can be arbitary since it is not used in real practice, but it should follow the format of Hive Metastore Thrift URI.
+## Column type mapping
+Consistent with Hive Catalog, please refer to the **column type mapping** section in [Hive Catalog](./hive.md).
diff --git a/docs/en/docs/lakehouse/multi-catalog/iceberg.md b/docs/en/docs/lakehouse/multi-catalog/iceberg.md
index 6f063ecf0b..18d66a5350 100644
--- a/docs/en/docs/lakehouse/multi-catalog/iceberg.md
+++ b/docs/en/docs/lakehouse/multi-catalog/iceberg.md
@@ -53,7 +53,7 @@ CREATE CATALOG iceberg PROPERTIES (
### Create Catalog based on Iceberg API
-Use the Iceberg API to access metadata, and support services such as Hive, REST, and Glue as Iceberg's Catalog.
+Use the Iceberg API to access metadata, and support services such as Hive, REST, DLF and Glue as Iceberg's Catalog.
#### Hive Metastore
@@ -85,6 +85,10 @@ CREATE CATALOG glue PROPERTIES (
For Iceberg properties, see [Iceberg Glue Catalog](https://iceberg.apache.org/docs/latest/aws/#glue-catalog)
+#### Alibaba Cloud DLF
+
+see [Alibaba Cloud DLF Catalog](dlf.md)
+
#### REST Catalog
This method needs to provide REST services in advance, and users need to implement the REST interface for obtaining Iceberg metadata.
diff --git a/docs/en/docs/lakehouse/multi-catalog/max_compute.md b/docs/en/docs/lakehouse/multi-catalog/max_compute.md
new file mode 100644
index 0000000000..a2f141df70
--- /dev/null
+++ b/docs/en/docs/lakehouse/multi-catalog/max_compute.md
@@ -0,0 +1,60 @@
+---
+{
+ "title": "Alibaba Cloud Max Compute",
+ "language": "en"
+}
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+
+# Alibaba Cloud MaxCompute
+
+MaxCompute (previously known as ODPS) is a data warehousing solution that can process terabytes or petabytes of data.
+
+> [What is MaxCompute](https://www.alibabacloud.com/help/en/maxcompute/product-overview/what-is-maxcompute)
+
+## Connect to MaxCompute
+
+```sql
+CREATE CATALOG mc PROPERTIES (
+ "type" = "max_compute",
+ "mc.region" = "cn-beijing",
+ "mc.default.project" = "your-project",
+ "mc.access_key" = "ak",
+ "mc.secret_key" = "sk"
+);
+```
+
+* `mc.region`: MaxCompute Region. Can Get the Region From [Endpoints](https://www.alibabacloud.com/help/en/maxcompute/user-guide/endpoints).
+* `mc.default.project`: MaxCompute Project. See Your [MaxCompute Projects](https://maxcompute.console.aliyun.com/cn-beijing/project-list).
+* `mc.access_key`: AccessKey, which you can create and manage on the [Alibaba Cloud console](https://ram.console.aliyun.com/manage/ak).
+* `mc.secret_key`: SecretKey, which you can create and manage on the [Alibaba Cloud console](https://ram.console.aliyun.com/manage/ak).
+* `mc.public_access`: You can enable public network access for test, when set `"mc.public_access"="true"`.
+
+## Quotas
+
+Pay-as-you-go quota has limited concurrency and usage. For additional resources, please refer to the documentation. See [Manage quotas](https://www.alibabacloud.com/help/en/maxcompute/user-guide/manage-quotas-in-the-new-maxcompute-console).
+
+## Column type mapping
+
+Consistent with Hive Catalog, please refer to the **column type mapping** section in [Hive Catalog](./hive.md).
+
+
diff --git a/docs/sidebars.json b/docs/sidebars.json
index 4e31a3fd91..9af06eded0 100644
--- a/docs/sidebars.json
+++ b/docs/sidebars.json
@@ -207,9 +207,10 @@
"lakehouse/multi-catalog/iceberg",
"lakehouse/multi-catalog/hudi",
"lakehouse/multi-catalog/paimon",
+ "lakehouse/multi-catalog/dlf",
+ "lakehouse/multi-catalog/max_compute",
"lakehouse/multi-catalog/es",
"lakehouse/multi-catalog/jdbc",
- "lakehouse/multi-catalog/dlf",
"lakehouse/multi-catalog/faq"
]
},
diff --git a/docs/zh-CN/docs/lakehouse/multi-catalog/dlf.md b/docs/zh-CN/docs/lakehouse/multi-catalog/dlf.md
index 02bf1a140b..822ecff1bb 100644
--- a/docs/zh-CN/docs/lakehouse/multi-catalog/dlf.md
+++ b/docs/zh-CN/docs/lakehouse/multi-catalog/dlf.md
@@ -35,28 +35,28 @@ under the License.
## 连接 DLF
-### 方式一:创建Hive Catalog连接DLF
+### 创建DLF Catalog
```sql
-CREATE CATALOG hive_with_dlf PROPERTIES (
+CREATE CATALOG dlf PROPERTIES (
"type"="hms",
- "dlf.catalog.proxyMode" = "DLF_ONLY",
"hive.metastore.type" = "dlf",
- "dlf.catalog.endpoint" = "dlf.cn-beijing.aliyuncs.com",
- "dlf.catalog.region" = "cn-beijing",
- "dlf.catalog.uid" = "uid",
- "dlf.catalog.accessKeyId" = "ak",
- "dlf.catalog.accessKeySecret" = "sk"
+ "dlf.proxy.mode" = "DLF_ONLY",
+ "dlf.endpoint" = "datalake-vpc.cn-beijing.aliyuncs.com",
+ "dlf.region" = "cn-beijing",
+ "dlf.uid" = "uid",
+ "dlf.access_key" = "ak",
+ "dlf.secret_key" = "sk"
);
```
-其中 `type` 固定为 `hms`。 如果需要公网访问阿里云对象存储的数据,可以设置 `"dlf.catalog.accessPublic"="true"`
+其中 `type` 固定为 `hms`。 如果需要公网访问阿里云对象存储的数据,可以设置 `"dlf.access.public"="true"`
-* `dlf.catalog.endpoint`:DLF Endpoint,参阅:[DLF Region和Endpoint对照表](https://www.alibabacloud.com/help/zh/data-lake-formation/latest/regions-and-endpoints)
-* `dlf.catalog.region`:DLF Region,参阅:[DLF Region和Endpoint对照表](https://www.alibabacloud.com/help/zh/data-lake-formation/latest/regions-and-endpoints)
-* `dlf.catalog.uid`:阿里云账号。即阿里云控制台右上角个人信息的“云账号ID”。
-* `dlf.catalog.accessKeyId`:AccessKey。可以在 [阿里云控制台](https://ram.console.aliyun.com/manage/ak) 中创建和管理。
-* `dlf.catalog.accessKeySecret`:SecretKey。可以在 [阿里云控制台](https://ram.console.aliyun.com/manage/ak) 中创建和管理。
+* `dlf.endpoint`:DLF Endpoint,参阅:[DLF Region和Endpoint对照表](https://www.alibabacloud.com/help/zh/data-lake-formation/latest/regions-and-endpoints)
+* `dlf.region`:DLF Region,参阅:[DLF Region和Endpoint对照表](https://www.alibabacloud.com/help/zh/data-lake-formation/latest/regions-and-endpoints)
+* `dlf.uid`:阿里云账号。即阿里云控制台右上角个人信息的“云账号ID”。
+* `dlf.access_key`:AccessKey。可以在 [阿里云控制台](https://ram.console.aliyun.com/manage/ak) 中创建和管理。
+* `dlf.secret_key`:SecretKey。可以在 [阿里云控制台](https://ram.console.aliyun.com/manage/ak) 中创建和管理。
其他配置项为固定值,无需改动。
@@ -64,55 +64,42 @@ CREATE CATALOG hive_with_dlf PROPERTIES (
同 Hive Catalog 一样,支持访问 DLF 中的 Hive/Iceberg/Hudi 的元数据信息。
-### 方式二:配置Hive Conf连接DLF
-
-1. 创建 hive-site.xml 文件,并将其放置在 `fe/conf` 目录下。
-
- ```
- <?xml version="1.0"?>
- <configuration>
- <!--Set to use dlf client-->
- <property>
- <name>hive.metastore.type</name>
- <value>dlf</value>
- </property>
- <property>
- <name>dlf.catalog.endpoint</name>
- <value>dlf-vpc.cn-beijing.aliyuncs.com</value>
- </property>
- <property>
- <name>dlf.catalog.region</name>
- <value>cn-beijing</value>
- </property>
- <property>
- <name>dlf.catalog.proxyMode</name>
- <value>DLF_ONLY</value>
- </property>
- <property>
- <name>dlf.catalog.uid</name>
- <value>20000000000000000</value>
- </property>
- <property>
- <name>dlf.catalog.accessKeyId</name>
- <value>XXXXXXXXXXXXXXX</value>
- </property>
- <property>
- <name>dlf.catalog.accessKeySecret</name>
- <value>XXXXXXXXXXXXXXXXX</value>
- </property>
- </configuration>
- ```
-
-2. 重启 FE,Doris 会读取和解析 fe/conf/hive-site.xml。 并通过 `CREATE CATALOG` 语句创建 catalog。
+### 使用开启了HDFS服务的OSS存储数据
+
+1. 确认OSS开启了HDFS服务。[开通并授权访问OSS-HDFS服务](https://help.aliyun.com/document_detail/419505.html?spm=a2c4g.2357115.0.i0)
+2. 下载SDK。[JindoData SDK下载](https://github.com/aliyun/alibabacloud-jindodata/blob/master/docs/user/5.x/5.0.0-beta7/jindodata_download.md)
+3. 解压下载后的jindosdk.tar.gz,将其lib目录下的`jindo-core.jar、jindo-sdk.jar`放到`${DORIS_HOME}/fe/lib`和`${DORIS_HOME}/be/lib/java_extensions`目录下。
+4. 创建DLF Catalog,并配置`oss.hdfs.enabled`为`true`:
```sql
-CREATE CATALOG hive_with_dlf PROPERTIES (
+CREATE CATALOG dlf_oss_hdfs PROPERTIES (
"type"="hms",
- "hive.metastore.uris" = "thrift://127.0.0.1:9083"
-)
+ "hive.metastore.type" = "dlf",
+ "dlf.proxy.mode" = "DLF_ONLY",
+ "dlf.endpoint" = "datalake-vpc.cn-beijing.aliyuncs.com",
+ "dlf.region" = "cn-beijing",
+ "dlf.uid" = "uid",
+ "dlf.access_key" = "ak",
+ "dlf.secret_key" = "sk",
+ "oss.hdfs.enabled" = "true"
+);
```
-其中 `type` 固定为 `hms`。`hive.metastore.uris` 的值随意填写即可,实际不会使用。但需要按照标准 hive metastore thrift uri 格式填写。
-
+### 访问DLF Iceberg表
+
+```sql
+CREATE CATALOG dlf_iceberg PROPERTIES (
+ "type"="iceberg",
+ "iceberg.catalog.type" = "dlf",
+ "dlf.proxy.mode" = "DLF_ONLY",
+ "dlf.endpoint" = "datalake-vpc.cn-beijing.aliyuncs.com",
+ "dlf.region" = "cn-beijing",
+ "dlf.uid" = "uid",
+ "dlf.access_key" = "ak",
+ "dlf.secret_key" = "sk"
+);
+```
+## 列类型映射
+和 Hive Catalog 一致,可参阅 [Hive Catalog](./hive.md) 中 **列类型映射** 一节。
diff --git a/docs/zh-CN/docs/lakehouse/multi-catalog/iceberg.md b/docs/zh-CN/docs/lakehouse/multi-catalog/iceberg.md
index f72553b6d0..bf5333388b 100644
--- a/docs/zh-CN/docs/lakehouse/multi-catalog/iceberg.md
+++ b/docs/zh-CN/docs/lakehouse/multi-catalog/iceberg.md
@@ -53,7 +53,7 @@ CREATE CATALOG iceberg PROPERTIES (
### 基于Iceberg API创建Catalog
-使用Iceberg API访问元数据的方式,支持Hive、REST、Glue等服务作为Iceberg的Catalog。
+使用Iceberg API访问元数据的方式,支持Hive、REST、Glue、DLF等服务作为Iceberg的Catalog。
#### Hive Metastore
@@ -85,6 +85,10 @@ CREATE CATALOG glue PROPERTIES (
Iceberg 属性详情参见 [Iceberg Glue Catalog](https://iceberg.apache.org/docs/latest/aws/#glue-catalog)
+#### 阿里云 DLF
+
+参见[阿里云DLF Catalog配置](dlf.md)
+
#### REST Catalog
该方式需要预先提供REST服务,用户需实现获取Iceberg元数据的REST接口。
diff --git a/docs/zh-CN/docs/lakehouse/multi-catalog/max_compute.md b/docs/zh-CN/docs/lakehouse/multi-catalog/max_compute.md
new file mode 100644
index 0000000000..e4b6eacb5f
--- /dev/null
+++ b/docs/zh-CN/docs/lakehouse/multi-catalog/max_compute.md
@@ -0,0 +1,60 @@
+---
+{
+ "title": "阿里云 Max Compute",
+ "language": "zh-CN"
+}
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+
+# 阿里云 MaxCompute
+
+MaxCompute是阿里云上的企业级SaaS(Software as a Service)模式云数据仓库。
+
+> [什么是 MaxCompute](https://help.aliyun.com/zh/maxcompute/product-overview/what-is-maxcompute?spm=a2c4g.11174283.0.i1)
+
+## 连接 Max Compute
+
+```sql
+CREATE CATALOG mc PROPERTIES (
+ "type" = "max_compute",
+ "mc.region" = "cn-beijing",
+ "mc.default.project" = "your-project",
+ "mc.access_key" = "ak",
+ "mc.secret_key" = "sk"
+);
+```
+
+* `mc.region`:MaxCompute开通的地域。可以从Endpoint中找到对应的Region,参阅[Endpoints](https://help.aliyun.com/zh/maxcompute/user-guide/endpoints?spm=a2c4g.11186623.0.0)。
+* `mc.default.project`:MaxCompute项目。可以在[MaxCompute项目列表](https://maxcompute.console.aliyun.com/cn-beijing/project-list)中创建和管理。
+* `mc.access_key`:AccessKey。可以在 [阿里云控制台](https://ram.console.aliyun.com/manage/ak) 中创建和管理。
+* `mc.secret_key`:SecretKey。可以在 [阿里云控制台](https://ram.console.aliyun.com/manage/ak) 中创建和管理。
+* `mc.public_access`: 当配置了`"mc.public_access"="true"`,可以开启公网访问,建议测试时使用。
+
+## 限额
+
+连接MaxCompute时,按量付费的Quota查询并发和使用量有限,如需增加资源,请参照MaxCompute文档。参见[配额管理](https://help.aliyun.com/zh/maxcompute/user-guide/manage-quotas-in-the-new-maxcompute-console).
+
+## 列类型映射
+
+和 Hive Catalog 一致,可参阅 [Hive Catalog](./hive.md) 中 **列类型映射** 一节。
+
+
diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/util/S3Util.java b/fe/fe-core/src/main/java/org/apache/doris/common/util/S3Util.java
index e3ae85461d..64c897c306 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/util/S3Util.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/util/S3Util.java
@@ -87,11 +87,23 @@ public class S3Util {
if (pos == -1) {
throw new RuntimeException("No '://' found in location: " + location);
}
- location = "s3" + location.substring(pos);
+ if (isHdfsOnOssEndpoint(location)) {
+ // if hdfs service is enabled on oss, use oss location
+ // example: oss://examplebucket.cn-shanghai.oss-dls.aliyuncs.com/dir/file/0000.orc
+ location = "oss" + location.substring(pos);
+ } else {
+ location = "s3" + location.substring(pos);
+ }
}
return new Path(location);
}
+ public static boolean isHdfsOnOssEndpoint(String location) {
+ // example: cn-shanghai.oss-dls.aliyuncs.com contains the "oss-dls.aliyuncs".
+ // https://www.alibabacloud.com/help/en/e-mapreduce/latest/oss-kusisurumen
+ return location.contains("oss-dls.aliyuncs");
+ }
+
public static S3Client buildS3Client(URI endpoint, String region, CloudCredential credential) {
StaticCredentialsProvider scp;
AwsCredentials awsCredential;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/PropertyConverter.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/PropertyConverter.java
index 094871d9f5..8787233e7d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/PropertyConverter.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/PropertyConverter.java
@@ -17,6 +17,7 @@
package org.apache.doris.datasource.property;
+import org.apache.doris.common.util.S3Util;
import org.apache.doris.common.util.Util;
import org.apache.doris.datasource.credentials.CloudCredential;
import org.apache.doris.datasource.credentials.CloudCredentialWithEndpoint;
@@ -253,6 +254,11 @@ public class PropertyConverter {
ossProperties.put(org.apache.hadoop.fs.aliyun.oss.Constants.ENDPOINT_KEY, endpoint);
ossProperties.put("fs.oss.impl.disable.cache", "true");
ossProperties.put("fs.oss.impl", AliyunOSSFileSystem.class.getName());
+ boolean hdfsEnabled = Boolean.parseBoolean(props.getOrDefault(OssProperties.OSS_HDFS_ENABLED, "false"));
+ if (S3Util.isHdfsOnOssEndpoint(endpoint) || hdfsEnabled) {
+ // use endpoint or enable hdfs
+ rewriteHdfsOnOssProperties(ossProperties, endpoint);
+ }
if (credential.isWhole()) {
ossProperties.put(org.apache.hadoop.fs.aliyun.oss.Constants.ACCESS_KEY_ID, credential.getAccessKey());
ossProperties.put(org.apache.hadoop.fs.aliyun.oss.Constants.ACCESS_KEY_SECRET, credential.getSecretKey());
@@ -268,6 +274,22 @@ public class PropertyConverter {
return ossProperties;
}
+ private static void rewriteHdfsOnOssProperties(Map<String, String> ossProperties, String endpoint) {
+ if (!S3Util.isHdfsOnOssEndpoint(endpoint)) {
+ // just for robustness here, avoid wrong endpoint when oss-hdfs is enabled.
+ // convert "oss-cn-beijing.aliyuncs.com" to "cn-beijing.oss-dls.aliyuncs.com"
+ // reference link: https://www.alibabacloud.com/help/en/e-mapreduce/latest/oss-kusisurumen
+ String[] endpointSplit = endpoint.split("\\.");
+ if (endpointSplit.length > 0) {
+ String region = endpointSplit[0].replace("oss-", "").replace("-internal", "");
+ ossProperties.put(org.apache.hadoop.fs.aliyun.oss.Constants.ENDPOINT_KEY,
+ region + ".oss-dls.aliyuncs.com");
+ }
+ }
+ ossProperties.put("fs.oss.impl", "com.aliyun.emr.fs.oss.JindoOssFileSystem");
+ ossProperties.put("fs.AbstractFileSystem.oss.impl", "com.aliyun.emr.fs.oss.OSS");
+ }
+
private static Map<String, String> convertToCOSProperties(Map<String, String> props, CloudCredential credential) {
Map<String, String> cosProperties = Maps.newHashMap();
cosProperties.put(CosNConfigKeys.COSN_ENDPOINT_SUFFIX_KEY, props.get(CosProperties.ENDPOINT));
@@ -368,6 +390,10 @@ public class PropertyConverter {
if (Strings.isNullOrEmpty(uid)) {
throw new IllegalArgumentException("Required dlf property: " + DataLakeConfig.CATALOG_USER_ID);
}
+ if (!props.containsKey(DLFProperties.ENDPOINT)) {
+ // just display DLFProperties in catalog, and hide DataLakeConfig properties
+ putNewPropertiesForCompatibility(props, credential);
+ }
// convert to oss property
if (credential.isWhole()) {
props.put(OssProperties.ACCESS_KEY, credential.getAccessKey());
@@ -379,11 +405,32 @@ public class PropertyConverter {
String publicAccess = props.getOrDefault(DLFProperties.Site.ACCESS_PUBLIC, "false");
String region = props.getOrDefault(DataLakeConfig.CATALOG_REGION_ID, props.get(DLFProperties.REGION));
if (!Strings.isNullOrEmpty(region)) {
- props.put(OssProperties.REGION, "oss-" + region);
- props.put(OssProperties.ENDPOINT, getOssEndpoint(region, Boolean.parseBoolean(publicAccess)));
+ boolean hdfsEnabled = Boolean.parseBoolean(props.getOrDefault(OssProperties.OSS_HDFS_ENABLED, "false"));
+ if (hdfsEnabled) {
+ props.putIfAbsent("fs.oss.impl", "com.aliyun.emr.fs.oss.JindoOssFileSystem");
+ props.putIfAbsent(OssProperties.REGION, region);
+ // example: cn-shanghai.oss-dls.aliyuncs.com
+ // from https://www.alibabacloud.com/help/en/e-mapreduce/latest/oss-kusisurumen
+ props.putIfAbsent(OssProperties.ENDPOINT, region + ".oss-dls.aliyuncs.com");
+ } else {
+ props.putIfAbsent(OssProperties.REGION, "oss-" + region);
+ props.putIfAbsent(OssProperties.ENDPOINT, getOssEndpoint(region, Boolean.parseBoolean(publicAccess)));
+ }
}
}
+ private static void putNewPropertiesForCompatibility(Map<String, String> props, CloudCredential credential) {
+ props.put(DLFProperties.UID, props.get(DataLakeConfig.CATALOG_USER_ID));
+ String endpoint = props.get(DataLakeConfig.CATALOG_ENDPOINT);
+ props.put(DLFProperties.ENDPOINT, endpoint);
+ props.put(DLFProperties.REGION, props.getOrDefault(DataLakeConfig.CATALOG_REGION_ID,
+ S3Properties.getRegionOfEndpoint(endpoint)));
+ props.put(DLFProperties.PROXY_MODE, props.getOrDefault(DataLakeConfig.CATALOG_PROXY_MODE, "DLF_ONLY"));
+ props.put(DLFProperties.ACCESS_KEY, credential.getAccessKey());
+ props.put(DLFProperties.SECRET_KEY, credential.getSecretKey());
+ props.put(DLFProperties.ACCESS_PUBLIC, props.getOrDefault(DLFProperties.Site.ACCESS_PUBLIC, "false"));
+ }
+
private static String getOssEndpoint(String region, boolean publicAccess) {
String prefix = "http://oss-";
String suffix = ".aliyuncs.com";
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/constants/OssProperties.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/constants/OssProperties.java
index 35c48c2730..210bc5814a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/constants/OssProperties.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/constants/OssProperties.java
@@ -33,6 +33,7 @@ public class OssProperties extends BaseProperties {
public static final String ACCESS_KEY = "oss.access_key";
public static final String SECRET_KEY = "oss.secret_key";
public static final String SESSION_TOKEN = "oss.session_token";
+ public static final String OSS_HDFS_ENABLED = "oss.hdfs.enabled";
public static final List<String> REQUIRED_FIELDS = Arrays.asList(ENDPOINT, ACCESS_KEY, SECRET_KEY);
public static CloudCredential getCredential(Map<String, String> props) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/external/FileQueryScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/external/FileQueryScanNode.java
index d366cbe90e..7a7dd76ab7 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/external/FileQueryScanNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/external/FileQueryScanNode.java
@@ -404,6 +404,10 @@ public abstract class FileQueryScanNode extends FileScanNode {
protected static Optional<TFileType> getTFileType(String location) {
if (location != null && !location.isEmpty()) {
if (S3Util.isObjStorage(location)) {
+ if (S3Util.isHdfsOnOssEndpoint(location)) {
+ // if hdfs service is enabled on oss, use hdfs lib to access oss.
+ return Optional.of(TFileType.FILE_HDFS);
+ }
return Optional.of(TFileType.FILE_S3);
} else if (location.startsWith(FeConstants.FS_PREFIX_HDFS)) {
return Optional.of(TFileType.FILE_HDFS);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org
[doris] 02/14: [Improve](jsonb_extract) support jsonb_extract multi parse path (#21555)
Posted by kx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
commit d8b1b505bb6a9385633efc744e88f63d8de898fb
Author: amory <wa...@selectdb.com>
AuthorDate: Wed Jul 12 21:37:36 2023 +0800
[Improve](jsonb_extract) support jsonb_extract multi parse path (#21555)
support jsonb_extract multi parse path
---
be/src/vec/functions/function_jsonb.cpp | 154 +++++++++++++++------
gensrc/script/doris_builtins_functions.py | 8 +-
.../data/jsonb_p0/test_jsonb_load_and_function.out | 23 +++
.../test_jsonb_load_unique_key_and_function.out | 23 +++
.../jsonb_p0/test_jsonb_load_and_function.groovy | 3 +
.../test_jsonb_load_unique_key_and_function.groovy | 4 +
6 files changed, 171 insertions(+), 44 deletions(-)
diff --git a/be/src/vec/functions/function_jsonb.cpp b/be/src/vec/functions/function_jsonb.cpp
index 42bdbe4b85..d9e498b4cf 100644
--- a/be/src/vec/functions/function_jsonb.cpp
+++ b/be/src/vec/functions/function_jsonb.cpp
@@ -339,7 +339,7 @@ using FunctionJsonbParseNotnullErrorValue =
using FunctionJsonbParseNotnullErrorInvalid =
FunctionJsonbParseBase<NullalbeMode::NOT_NULL, JsonbParseErrorMode::RETURN_INVALID>;
-// func(json,string) -> nullable(type)
+// func(jsonb, [varchar, varchar, ...]) -> nullable(type)
template <typename Impl>
class FunctionJsonbExtract : public IFunction {
public:
@@ -347,7 +347,8 @@ public:
static constexpr auto alias = Impl::alias;
static FunctionPtr create() { return std::make_shared<FunctionJsonbExtract>(); }
String get_name() const override { return name; }
- size_t get_number_of_arguments() const override { return 2; }
+ bool is_variadic() const override { return true; }
+ size_t get_number_of_arguments() const override { return 0; }
DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
return make_nullable(std::make_shared<typename Impl::ReturnType>());
}
@@ -355,26 +356,32 @@ public:
Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
size_t result, size_t input_rows_count) override {
auto null_map = ColumnUInt8::create(input_rows_count, 0);
- DCHECK_EQ(arguments.size(), 2);
- ColumnPtr argument_columns[2];
- bool col_const[2];
- for (int i = 0; i < 2; ++i) {
- std::tie(argument_columns[i], col_const[i]) =
- unpack_if_const(block.get_by_position(arguments[i]).column);
- check_set_nullable(argument_columns[i], null_map, col_const[i]);
+ DCHECK_GE(arguments.size(), 2);
+
+ ColumnPtr jsonb_data_column;
+ bool jsonb_data_const = false;
+ // prepare jsonb data column
+ std::tie(jsonb_data_column, jsonb_data_const) =
+ unpack_if_const(block.get_by_position(arguments[0]).column);
+ check_set_nullable(jsonb_data_column, null_map, jsonb_data_const);
+ auto& ldata = assert_cast<const ColumnString*>(jsonb_data_column.get())->get_chars();
+ auto& loffsets = assert_cast<const ColumnString*>(jsonb_data_column.get())->get_offsets();
+
+ // prepare parse path column prepare
+ std::vector<const ColumnString*> jsonb_path_columns;
+ std::vector<bool> path_const(arguments.size() - 1);
+ for (int i = 0; i < arguments.size() - 1; ++i) {
+ ColumnPtr path_column;
+ bool is_const = false;
+ std::tie(path_column, is_const) =
+ unpack_if_const(block.get_by_position(arguments[i + 1]).column);
+ path_const[i] = is_const;
+ check_set_nullable(path_column, null_map, path_const[i]);
+ jsonb_path_columns.push_back(assert_cast<const ColumnString*>(path_column.get()));
}
auto res = Impl::ColumnType::create();
- auto jsonb_data_column = assert_cast<const ColumnString*>(argument_columns[0].get());
- auto jsonb_path_column = assert_cast<const ColumnString*>(argument_columns[1].get());
-
- auto& ldata = jsonb_data_column->get_chars();
- auto& loffsets = jsonb_data_column->get_offsets();
-
- auto& rdata = jsonb_path_column->get_chars();
- auto& roffsets = jsonb_path_column->get_offsets();
-
bool is_invalid_json_path = false;
// execute Impl
@@ -382,36 +389,34 @@ public:
std::is_same_v<typename Impl::ReturnType, DataTypeJsonb>) {
auto& res_data = res->get_chars();
auto& res_offsets = res->get_offsets();
- if (col_const[0]) {
- Impl::scalar_vector(context, jsonb_data_column->get_data_at(0), rdata, roffsets,
- res_data, res_offsets, null_map->get_data(),
- is_invalid_json_path);
- } else if (col_const[1]) {
- Impl::vector_scalar(context, ldata, loffsets, jsonb_path_column->get_data_at(0),
- res_data, res_offsets, null_map->get_data(),
- is_invalid_json_path);
- } else {
- Impl::vector_vector(context, ldata, loffsets, rdata, roffsets, res_data,
- res_offsets, null_map->get_data(), is_invalid_json_path);
+ Status st = Impl::vector_vector_v2(
+ context, ldata, loffsets, jsonb_data_const, jsonb_path_columns, path_const,
+ res_data, res_offsets, null_map->get_data(), is_invalid_json_path);
+ if (st != Status::OK()) {
+ return st;
}
} else {
- if (col_const[0]) {
+ // not support other extract type for now (e.g. int, double, ...)
+ DCHECK_EQ(jsonb_path_columns.size(), 1);
+ auto& rdata = jsonb_path_columns[0]->get_chars();
+ auto& roffsets = jsonb_path_columns[0]->get_offsets();
+ if (jsonb_data_const) {
Impl::scalar_vector(context, jsonb_data_column->get_data_at(0), rdata, roffsets,
res->get_data(), null_map->get_data(), is_invalid_json_path);
- } else if (col_const[1]) {
- Impl::vector_scalar(context, ldata, loffsets, jsonb_path_column->get_data_at(0),
+ } else if (path_const[0]) {
+ Impl::vector_scalar(context, ldata, loffsets, jsonb_path_columns[0]->get_data_at(0),
res->get_data(), null_map->get_data(), is_invalid_json_path);
} else {
Impl::vector_vector(context, ldata, loffsets, rdata, roffsets, res->get_data(),
null_map->get_data(), is_invalid_json_path);
}
- }
-
- if (is_invalid_json_path) {
- return Status::InvalidArgument(
- "Json path error: {} for value: {}",
- JsonbErrMsg::getErrMsg(JsonbErrType::E_INVALID_JSON_PATH),
- std::string_view(reinterpret_cast<const char*>(rdata.data()), rdata.size()));
+ if (is_invalid_json_path) {
+ return Status::InvalidArgument(
+ "Json path error: {} for value: {}",
+ JsonbErrMsg::getErrMsg(JsonbErrType::E_INVALID_JSON_PATH),
+ std::string_view(reinterpret_cast<const char*>(rdata.data()),
+ rdata.size()));
+ }
}
block.get_by_position(result).column =
@@ -503,6 +508,77 @@ private:
public:
// for jsonb_extract_string
+ static Status vector_vector_v2(
+ FunctionContext* context, const ColumnString::Chars& ldata,
+ const ColumnString::Offsets& loffsets, const bool& json_data_const,
+ const std::vector<const ColumnString*>& rdata_columns, // here we can support more paths
+ const std::vector<bool>& path_const, ColumnString::Chars& res_data,
+ ColumnString::Offsets& res_offsets, NullMap& null_map, bool& is_invalid_json_path) {
+ size_t input_rows_count = json_data_const ? rdata_columns.size() : loffsets.size();
+ res_offsets.resize(input_rows_count);
+
+ auto writer = std::make_unique<JsonbWriter>();
+ std::unique_ptr<JsonbToJson> formater;
+
+ for (size_t i = 0; i < input_rows_count; ++i) {
+ if (null_map[i]) {
+ StringOP::push_null_string(i, res_data, res_offsets, null_map);
+ continue;
+ }
+ size_t l_off = loffsets[index_check_const(i, json_data_const) - 1];
+ size_t l_size = loffsets[index_check_const(i, json_data_const)] - l_off;
+ const char* l_raw = reinterpret_cast<const char*>(&ldata[l_off]);
+ if (rdata_columns.size() == 1) { // just return origin value
+ const ColumnString* path_col = rdata_columns[0];
+ const ColumnString::Chars& rdata = path_col->get_chars();
+ const ColumnString::Offsets& roffsets = path_col->get_offsets();
+ size_t r_off = roffsets[index_check_const(i, path_const[0]) - 1];
+ size_t r_size = roffsets[index_check_const(i, path_const[0])] - r_off;
+ const char* r_raw = reinterpret_cast<const char*>(&rdata[r_off]);
+ inner_loop_impl(i, res_data, res_offsets, null_map, writer, formater, l_raw, l_size,
+ r_raw, r_size, is_invalid_json_path);
+ } else { // will make array string to user
+ writer->reset();
+ writer->writeStartArray();
+ for (size_t pi = 0; pi < rdata_columns.size(); ++pi) {
+ const ColumnString* path_col = rdata_columns[pi];
+ const ColumnString::Chars& rdata = path_col->get_chars();
+ const ColumnString::Offsets& roffsets = path_col->get_offsets();
+ size_t r_off = roffsets[index_check_const(i, path_const[pi]) - 1];
+ size_t r_size = roffsets[index_check_const(i, path_const[pi])] - r_off;
+ const char* r_raw = reinterpret_cast<const char*>(&rdata[r_off]);
+ // doc is NOT necessary to be deleted since JsonbDocument will not allocate memory
+ JsonbDocument* doc = JsonbDocument::createDocument(l_raw, l_size);
+ if (UNLIKELY(!doc || !doc->getValue())) {
+ writer->writeNull();
+ continue;
+ }
+ // value is NOT necessary to be deleted since JsonbValue will not allocate memory
+ JsonbValue* value =
+ doc->getValue()->findPath(r_raw, r_size, is_invalid_json_path, nullptr);
+ // if not valid json path , should return error message to user
+ if (is_invalid_json_path) {
+ return Status::InvalidArgument(
+ "Json path error: {} for value: {}",
+ JsonbErrMsg::getErrMsg(JsonbErrType::E_INVALID_JSON_PATH),
+ std::string_view(reinterpret_cast<const char*>(rdata.data()),
+ rdata.size()));
+ }
+ if (UNLIKELY(!value)) {
+ writer->writeNull();
+ } else {
+ writer->writeValue(value);
+ }
+ }
+ writer->writeEndArray();
+ StringOP::push_value_string(std::string_view(writer->getOutput()->getBuffer(),
+ writer->getOutput()->getSize()),
+ i, res_data, res_offsets);
+ }
+ } //for
+ return Status::OK();
+ }
+
static void vector_vector(FunctionContext* context, const ColumnString::Chars& ldata,
const ColumnString::Offsets& loffsets,
const ColumnString::Chars& rdata,
diff --git a/gensrc/script/doris_builtins_functions.py b/gensrc/script/doris_builtins_functions.py
index 83db53b8a5..31f3db4bab 100644
--- a/gensrc/script/doris_builtins_functions.py
+++ b/gensrc/script/doris_builtins_functions.py
@@ -1690,11 +1690,11 @@ visible_functions = {
[['jsonb_exists_path'], 'BOOLEAN', ['JSONB', 'VARCHAR'], ''],
[['jsonb_exists_path'], 'BOOLEAN', ['JSONB', 'STRING'], ''],
- [['jsonb_type'], 'STRING', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],
+ [['jsonb_type'], 'STRING', ['JSONB', 'VARCHAR'], 'ALWAYS_NULLABLE'],
[['jsonb_type'], 'STRING', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],
- [['jsonb_extract'], 'JSONB', ['JSONB', 'VARCHAR'], 'ALWAYS_NULLABLE'],
- [['jsonb_extract'], 'JSONB', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],
+ [['jsonb_extract'], 'JSONB', ['JSONB', 'VARCHAR', '...'], 'ALWAYS_NULLABLE'],
+ [['jsonb_extract'], 'JSONB', ['JSONB', 'STRING', '...'], 'ALWAYS_NULLABLE'],
[['jsonb_extract_isnull'], 'BOOLEAN', ['JSONB', 'VARCHAR'], 'ALWAYS_NULLABLE'],
[['jsonb_extract_isnull'], 'BOOLEAN', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],
[['jsonb_extract_bool'], 'BOOLEAN', ['JSONB', 'VARCHAR'], 'ALWAYS_NULLABLE'],
@@ -1725,8 +1725,6 @@ visible_functions = {
[['json_type'], 'STRING', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],
[['json_type'], 'STRING', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],
- [['jsonb_extract'], 'JSONB', ['JSONB', 'VARCHAR'], 'ALWAYS_NULLABLE'],
- [['jsonb_extract'], 'JSONB', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],
[['json_extract_isnull'], 'BOOLEAN', ['JSONB', 'VARCHAR'], 'ALWAYS_NULLABLE'],
[['json_extract_isnull'], 'BOOLEAN', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],
[['json_extract_bool'], 'BOOLEAN', ['JSONB', 'VARCHAR'], 'ALWAYS_NULLABLE'],
diff --git a/regression-test/data/jsonb_p0/test_jsonb_load_and_function.out b/regression-test/data/jsonb_p0/test_jsonb_load_and_function.out
index 00944828bd..e1c176273c 100644
--- a/regression-test/data/jsonb_p0/test_jsonb_load_and_function.out
+++ b/regression-test/data/jsonb_p0/test_jsonb_load_and_function.out
@@ -709,6 +709,29 @@
27 {"k1":"v1","k2":200} \N
28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} \N
+-- !jsonb_extract_multipath --
+1 \N \N
+2 null [null,null,null,null]
+3 true [true,null,null,null]
+4 false [false,null,null,null]
+5 100 [100,null,null,null]
+6 10000 [10000,null,null,null]
+7 1000000000 [1000000000,null,null,null]
+8 1152921504606846976 [1152921504606846976,null,null,null]
+9 6.18 [6.18,null,null,null]
+10 "abcd" ["abcd",null,null,null]
+11 {} [{},{},null,{}]
+12 {"k1":"v31","k2":300} [{"k1":"v31","k2":300},{"k1":"v31","k2":300},"v31",{"k1":"v31","k2":300}]
+13 [] [[],null,null,null]
+14 [123,456] [[123,456],null,null,123]
+15 ["abc","def"] [["abc","def"],null,null,"abc"]
+16 [null,true,false,100,6.18,"abc"] [[null,true,false,100,6.18,"abc"],null,null,null]
+17 [{"k1":"v41","k2":400},1,"a",3.14] [[{"k1":"v41","k2":400},1,"a",3.14],null,null,{"k1":"v41","k2":400}]
+18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} [{"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]},{"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]},"v31",{"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]}]
+26 \N \N
+27 {"k1":"v1","k2":200} [{"k1":"v1","k2":200},{"k1":"v1","k2":200},"v1",{"k1":"v1","k2":200}]
+28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} [{"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"},{"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"},null,{"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"}]
+
-- !jsonb_extract_string_select --
1 \N \N
2 null null
diff --git a/regression-test/data/jsonb_p0/test_jsonb_load_unique_key_and_function.out b/regression-test/data/jsonb_p0/test_jsonb_load_unique_key_and_function.out
index 04946beaa1..632badf32e 100644
--- a/regression-test/data/jsonb_p0/test_jsonb_load_unique_key_and_function.out
+++ b/regression-test/data/jsonb_p0/test_jsonb_load_unique_key_and_function.out
@@ -709,6 +709,29 @@
27 {"k1":"v1","k2":200} \N
28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} \N
+-- !jsonb_extract_multipath --
+1 \N \N
+2 null [null,null,null,null]
+3 true [true,null,null,null]
+4 false [false,null,null,null]
+5 100 [100,null,null,null]
+6 10000 [10000,null,null,null]
+7 1000000000 [1000000000,null,null,null]
+8 1152921504606846976 [1152921504606846976,null,null,null]
+9 6.18 [6.18,null,null,null]
+10 "abcd" ["abcd",null,null,null]
+11 {} [{},{},null,{}]
+12 {"k1":"v31","k2":300} [{"k1":"v31","k2":300},{"k1":"v31","k2":300},"v31",{"k1":"v31","k2":300}]
+13 [] [[],null,null,null]
+14 [123,456] [[123,456],null,null,123]
+15 ["abc","def"] [["abc","def"],null,null,"abc"]
+16 [null,true,false,100,6.18,"abc"] [[null,true,false,100,6.18,"abc"],null,null,null]
+17 [{"k1":"v41","k2":400},1,"a",3.14] [[{"k1":"v41","k2":400},1,"a",3.14],null,null,{"k1":"v41","k2":400}]
+18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} [{"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]},{"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]},"v31",{"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]}]
+26 \N \N
+27 {"k1":"v1","k2":200} [{"k1":"v1","k2":200},{"k1":"v1","k2":200},"v1",{"k1":"v1","k2":200}]
+28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} [{"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"},{"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"},null,{"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"}]
+
-- !jsonb_extract_string_select --
1 \N \N
2 null null
diff --git a/regression-test/suites/jsonb_p0/test_jsonb_load_and_function.groovy b/regression-test/suites/jsonb_p0/test_jsonb_load_and_function.groovy
index 6941f335c2..d58b991ef2 100644
--- a/regression-test/suites/jsonb_p0/test_jsonb_load_and_function.groovy
+++ b/regression-test/suites/jsonb_p0/test_jsonb_load_and_function.groovy
@@ -178,6 +178,9 @@ suite("test_jsonb_load_and_function", "p0") {
qt_select "SELECT id, j, jsonb_extract(j, '\$.a1[-1]') FROM ${testTable} ORDER BY id"
qt_select "SELECT id, j, jsonb_extract(j, '\$.a1[-10]') FROM ${testTable} ORDER BY id"
+ // jsonb_extract_multipath
+ qt_jsonb_extract_multipath "SELECT id, j, jsonb_extract(j, '\$', '\$.*', '\$.k1', '\$[0]') FROM ${testTable} ORDER BY id"
+
// jsonb_extract_string
qt_jsonb_extract_string_select "SELECT id, j, jsonb_extract_string(j, '\$') FROM ${testTable} ORDER BY id"
diff --git a/regression-test/suites/jsonb_p0/test_jsonb_load_unique_key_and_function.groovy b/regression-test/suites/jsonb_p0/test_jsonb_load_unique_key_and_function.groovy
index eee42e3a69..5423ad33fc 100644
--- a/regression-test/suites/jsonb_p0/test_jsonb_load_unique_key_and_function.groovy
+++ b/regression-test/suites/jsonb_p0/test_jsonb_load_unique_key_and_function.groovy
@@ -171,6 +171,10 @@ suite("test_jsonb_unique_load_and_function", "p0") {
qt_select "SELECT id, j, jsonb_extract(j, '\$.a1[-1]') FROM ${testTable} ORDER BY id"
qt_select "SELECT id, j, jsonb_extract(j, '\$.a1[-10]') FROM ${testTable} ORDER BY id"
+
+ // jsonb_extract_multipath
+ qt_jsonb_extract_multipath "SELECT id, j, jsonb_extract(j, '\$', '\$.*', '\$.k1', '\$[0]') FROM ${testTable} ORDER BY id"
+
// jsonb_extract_string
qt_jsonb_extract_string_select "SELECT id, j, jsonb_extract_string(j, '\$') FROM ${testTable} ORDER BY id"
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org
[doris] 09/14: [fix](ccr) Add tableName in DropInfo && BatchDropInfo (#21736)
Posted by kx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
commit 46e7c2c7e37dc702faeb5aa7ca95d4cc335a60c4
Author: Jack Drogon <ja...@gmail.com>
AuthorDate: Thu Jul 13 11:47:49 2023 +0800
[fix](ccr) Add tableName in DropInfo && BatchDropInfo (#21736)
Signed-off-by: Jack Drogon <ja...@gmail.com>
---
.../org/apache/doris/alter/MaterializedViewHandler.java | 6 ++++--
.../main/java/org/apache/doris/binlog/DropTableRecord.java | 6 ++++++
.../java/org/apache/doris/datasource/InternalCatalog.java | 2 +-
.../main/java/org/apache/doris/persist/BatchDropInfo.java | 12 +++++++++++-
.../src/main/java/org/apache/doris/persist/DropInfo.java | 13 ++++++++++++-
.../src/main/java/org/apache/doris/persist/EditLog.java | 3 ++-
.../org/apache/doris/persist/DropAndRecoverInfoTest.java | 10 +++++-----
7 files changed, 41 insertions(+), 11 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java
index af1915b6fe..db7768a3f6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java
@@ -900,7 +900,8 @@ public class MaterializedViewHandler extends AlterHandler {
EditLog editLog = Env.getCurrentEnv().getEditLog();
long dbId = db.getId();
long tableId = olapTable.getId();
- editLog.logBatchDropRollup(new BatchDropInfo(dbId, tableId, indexIdSet));
+ String tableName = olapTable.getName();
+ editLog.logBatchDropRollup(new BatchDropInfo(dbId, tableId, tableName, indexIdSet));
LOG.info("finished drop rollup index[{}] in table[{}]",
String.join("", rollupNameSet), olapTable.getName());
} finally {
@@ -920,7 +921,8 @@ public class MaterializedViewHandler extends AlterHandler {
long mvIndexId = dropMaterializedView(mvName, olapTable);
// Step3: log drop mv operation
EditLog editLog = Env.getCurrentEnv().getEditLog();
- editLog.logDropRollup(new DropInfo(db.getId(), olapTable.getId(), mvIndexId, false, 0));
+ editLog.logDropRollup(
+ new DropInfo(db.getId(), olapTable.getId(), olapTable.getName(), mvIndexId, false, 0));
LOG.info("finished drop materialized view [{}] in table [{}]", mvName, olapTable.getName());
} catch (MetaNotFoundException e) {
if (dropMaterializedViewStmt.isIfExists()) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/binlog/DropTableRecord.java b/fe/fe-core/src/main/java/org/apache/doris/binlog/DropTableRecord.java
index dd5adb36c7..155898cbc9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/binlog/DropTableRecord.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/binlog/DropTableRecord.java
@@ -29,11 +29,17 @@ public class DropTableRecord {
private long dbId;
@SerializedName(value = "tableId")
private long tableId;
+ @SerializedName(value = "tableName")
+ private String tableName;
+ @SerializedName(value = "rawSql")
+ private String rawSql;
public DropTableRecord(long commitSeq, DropInfo info) {
this.commitSeq = commitSeq;
this.dbId = info.getDbId();
this.tableId = info.getTableId();
+ this.tableName = info.getTableName();
+ this.rawSql = String.format("DROP TABLE IF EXISTS `%s`", this.tableName);
}
public long getCommitSeq() {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
index 4f70c919f2..bb60ae2d50 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
@@ -893,7 +893,7 @@ public class InternalCatalog implements CatalogIf<Database> {
} finally {
table.writeUnlock();
}
- DropInfo info = new DropInfo(db.getId(), table.getId(), -1L, stmt.isForceDrop(), recycleTime);
+ DropInfo info = new DropInfo(db.getId(), table.getId(), tableName, -1L, stmt.isForceDrop(), recycleTime);
Env.getCurrentEnv().getEditLog().logDropTable(info);
Env.getCurrentEnv().getQueryStats().clear(Env.getCurrentEnv().getCurrentCatalog().getId(),
db.getId(), table.getId());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/persist/BatchDropInfo.java b/fe/fe-core/src/main/java/org/apache/doris/persist/BatchDropInfo.java
index 234456dcc1..fdfc44e27b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/persist/BatchDropInfo.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/persist/BatchDropInfo.java
@@ -39,12 +39,15 @@ public class BatchDropInfo implements Writable {
private long dbId;
@SerializedName(value = "tableId")
private long tableId;
+ @SerializedName(value = "tableName")
+ private String tableName; // not used in equals and hashCode
@SerializedName(value = "indexIdSet")
private Set<Long> indexIdSet;
- public BatchDropInfo(long dbId, long tableId, Set<Long> indexIdSet) {
+ public BatchDropInfo(long dbId, long tableId, String tableName, Set<Long> indexIdSet) {
this.dbId = dbId;
this.tableId = tableId;
+ this.tableName = tableName;
this.indexIdSet = indexIdSet;
}
@@ -87,4 +90,11 @@ public class BatchDropInfo implements Writable {
return tableId;
}
+ public String getTableName() {
+ return tableName;
+ }
+
+ public String toJson() {
+ return GsonUtils.GSON.toJson(this);
+ }
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/persist/DropInfo.java b/fe/fe-core/src/main/java/org/apache/doris/persist/DropInfo.java
index 50ee6adb89..b30522e942 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/persist/DropInfo.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/persist/DropInfo.java
@@ -34,6 +34,8 @@ public class DropInfo implements Writable {
private long dbId;
@SerializedName(value = "tableId")
private long tableId;
+ @SerializedName(value = "tableName")
+ private String tableName; // not used in equals and hashCode
@SerializedName(value = "indexId")
private long indexId;
@SerializedName(value = "forceDrop")
@@ -44,9 +46,10 @@ public class DropInfo implements Writable {
public DropInfo() {
}
- public DropInfo(long dbId, long tableId, long indexId, boolean forceDrop, long recycleTime) {
+ public DropInfo(long dbId, long tableId, String tableName, long indexId, boolean forceDrop, long recycleTime) {
this.dbId = dbId;
this.tableId = tableId;
+ this.tableName = tableName;
this.indexId = indexId;
this.forceDrop = forceDrop;
this.recycleTime = recycleTime;
@@ -60,6 +63,10 @@ public class DropInfo implements Writable {
return this.tableId;
}
+ public String getTableName() {
+ return this.tableName;
+ }
+
public long getIndexId() {
return this.indexId;
}
@@ -114,4 +121,8 @@ public class DropInfo implements Writable {
return (dbId == info.dbId) && (tableId == info.tableId) && (indexId == info.indexId)
&& (forceDrop == info.forceDrop) && (recycleTime == info.recycleTime);
}
+
+ public String toJson() {
+ return GsonUtils.GSON.toJson(this);
+ }
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java b/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java
index b92b2cb980..f19d215e30 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java
@@ -326,7 +326,8 @@ public class EditLog {
BatchDropInfo batchDropInfo = (BatchDropInfo) journal.getData();
for (long indexId : batchDropInfo.getIndexIdSet()) {
env.getMaterializedViewHandler().replayDropRollup(
- new DropInfo(batchDropInfo.getDbId(), batchDropInfo.getTableId(), indexId, false, 0),
+ new DropInfo(batchDropInfo.getDbId(), batchDropInfo.getTableId(),
+ batchDropInfo.getTableName(), indexId, false, 0),
env);
}
break;
diff --git a/fe/fe-core/src/test/java/org/apache/doris/persist/DropAndRecoverInfoTest.java b/fe/fe-core/src/test/java/org/apache/doris/persist/DropAndRecoverInfoTest.java
index 5b70ff4f80..bdaab002c5 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/persist/DropAndRecoverInfoTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/persist/DropAndRecoverInfoTest.java
@@ -44,7 +44,7 @@ public class DropAndRecoverInfoTest {
DropInfo info1 = new DropInfo();
info1.write(dos);
- DropInfo info2 = new DropInfo(1, 2, -1, true, 0);
+ DropInfo info2 = new DropInfo(1, 2, "t2", -1, true, 0);
info2.write(dos);
dos.flush();
@@ -65,10 +65,10 @@ public class DropAndRecoverInfoTest {
Assert.assertEquals(rInfo2, rInfo2);
Assert.assertNotEquals(rInfo2, this);
- Assert.assertNotEquals(info2, new DropInfo(0, 2, -1L, true, 0));
- Assert.assertNotEquals(info2, new DropInfo(1, 0, -1L, true, 0));
- Assert.assertNotEquals(info2, new DropInfo(1, 2, -1L, false, 0));
- Assert.assertEquals(info2, new DropInfo(1, 2, -1L, true, 0));
+ Assert.assertNotEquals(info2, new DropInfo(0, 2, "t2", -1L, true, 0));
+ Assert.assertNotEquals(info2, new DropInfo(1, 0, "t0", -1L, true, 0));
+ Assert.assertNotEquals(info2, new DropInfo(1, 2, "t2", -1L, false, 0));
+ Assert.assertEquals(info2, new DropInfo(1, 2, "t2", -1L, true, 0));
// 3. delete files
dis.close();
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org
[doris] 11/14: [Feature](Nereids) support select into outfile (#21197)
Posted by kx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
commit 02248ea8d23be0e65d5d206875e9a65690fc9e8b
Author: mch_ucchi <41...@users.noreply.github.com>
AuthorDate: Thu Jul 13 17:01:47 2023 +0800
[Feature](Nereids) support select into outfile (#21197)
---
.../antlr4/org/apache/doris/nereids/DorisLexer.g4 | 1 +
.../antlr4/org/apache/doris/nereids/DorisParser.g4 | 9 +-
.../doris/nereids/glue/LogicalPlanAdapter.java | 3 +-
.../glue/translator/PhysicalPlanTranslator.java | 32 +
.../doris/nereids/parser/LogicalPlanBuilder.java | 36 +-
.../properties/ChildOutputPropertyDeriver.java | 6 +
.../nereids/properties/RequestPropertyDeriver.java | 7 +
.../org/apache/doris/nereids/rules/RuleSet.java | 2 +
.../org/apache/doris/nereids/rules/RuleType.java | 1 +
.../LogicalFileSinkToPhysicalFileSink.java | 45 +
.../doris/nereids/stats/StatsCalculator.java | 12 +
.../apache/doris/nereids/trees/plans/PlanType.java | 5 +-
.../trees/plans/logical/LogicalFileSink.java | 122 +++
.../trees/plans/physical/PhysicalFileSink.java | 132 +++
.../nereids/trees/plans/visitor/PlanVisitor.java | 10 +
.../doris/nereids/trees/plans/OutFileTest.java | 91 ++
.../org/apache/doris/planner/QueryPlanTest.java | 1 +
.../data/nereids_p0/outfile/test_outfile.out | 1003 ++++++++++++++++++++
.../data/nereids_p0/outfile/test_outfile_expr.out | 1003 ++++++++++++++++++++
.../nereids_p0/outfile/test_outfile_parquet.out | 25 +
.../nereids_p0/outfile/test_outfile_separator.out | 11 +
.../suites/nereids_p0/outfile/test_outfile.groovy | 226 +++++
.../nereids_p0/outfile/test_outfile_expr.groovy | 135 +++
.../nereids_p0/outfile/test_outfile_parquet.groovy | 162 ++++
.../outfile/test_outfile_separator.groovy | 107 +++
25 files changed, 3179 insertions(+), 8 deletions(-)
diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4 b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4
index b69bc05004..78071820ff 100644
--- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4
+++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4
@@ -272,6 +272,7 @@ OR: 'OR';
ORDER: 'ORDER';
OUT: 'OUT';
OUTER: 'OUTER';
+OUTFILE: 'OUTFILE';
OUTPUTFORMAT: 'OUTPUTFORMAT';
OVER: 'OVER';
OVERLAPS: 'OVERLAPS';
diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
index 9d29436d6d..3fd8e8b1af 100644
--- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
+++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
@@ -34,7 +34,7 @@ singleStatement
;
statement
- : explain? query #statementDefault
+ : explain? query outFileClause? #statementDefault
| CREATE ROW POLICY (IF NOT EXISTS)? name=identifier
ON table=multipartIdentifier
AS type=(RESTRICTIVE | PERMISSIVE)
@@ -84,6 +84,13 @@ planType
// -----------------Query-----------------
// add queryOrganization for parse (q1) union (q2) union (q3) order by keys, otherwise 'order' will be recognized to be
// identifier.
+
+outFileClause
+ : INTO OUTFILE filePath=constant
+ (FORMAT AS format=identifier)?
+ (PROPERTIES LEFT_PAREN properties+=tvfProperty (COMMA properties+=tvfProperty)* RIGHT_PAREN)?
+ ;
+
query
: {!doris_legacy_SQL_syntax}? cte? queryTerm queryOrganization
| {doris_legacy_SQL_syntax}? queryTerm queryOrganization
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/LogicalPlanAdapter.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/LogicalPlanAdapter.java
index 44d57b3688..355cdfdec5 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/LogicalPlanAdapter.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/LogicalPlanAdapter.java
@@ -26,6 +26,7 @@ import org.apache.doris.analysis.StatementBase;
import org.apache.doris.nereids.StatementContext;
import org.apache.doris.nereids.trees.plans.Plan;
import org.apache.doris.nereids.trees.plans.commands.ExplainCommand;
+import org.apache.doris.nereids.trees.plans.logical.LogicalFileSink;
import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
import java.util.ArrayList;
@@ -59,7 +60,7 @@ public class LogicalPlanAdapter extends StatementBase implements Queriable {
@Override
public boolean hasOutFileClause() {
- return false;
+ return logicalPlan instanceof LogicalFileSink;
}
@Override
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
index fb01db5c41..56e4139357 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
@@ -29,6 +29,7 @@ import org.apache.doris.analysis.GroupByClause.GroupingType;
import org.apache.doris.analysis.GroupingInfo;
import org.apache.doris.analysis.IsNullPredicate;
import org.apache.doris.analysis.OrderByElement;
+import org.apache.doris.analysis.OutFileClause;
import org.apache.doris.analysis.SlotDescriptor;
import org.apache.doris.analysis.SlotId;
import org.apache.doris.analysis.SlotRef;
@@ -95,6 +96,7 @@ import org.apache.doris.nereids.trees.plans.physical.PhysicalEmptyRelation;
import org.apache.doris.nereids.trees.plans.physical.PhysicalEsScan;
import org.apache.doris.nereids.trees.plans.physical.PhysicalExcept;
import org.apache.doris.nereids.trees.plans.physical.PhysicalFileScan;
+import org.apache.doris.nereids.trees.plans.physical.PhysicalFileSink;
import org.apache.doris.nereids.trees.plans.physical.PhysicalFilter;
import org.apache.doris.nereids.trees.plans.physical.PhysicalGenerate;
import org.apache.doris.nereids.trees.plans.physical.PhysicalHashAggregate;
@@ -146,6 +148,7 @@ import org.apache.doris.planner.PartitionSortNode;
import org.apache.doris.planner.PlanFragment;
import org.apache.doris.planner.PlanNode;
import org.apache.doris.planner.RepeatNode;
+import org.apache.doris.planner.ResultFileSink;
import org.apache.doris.planner.ResultSink;
import org.apache.doris.planner.ScanNode;
import org.apache.doris.planner.SchemaScanNode;
@@ -329,7 +332,36 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
);
rootFragment.setSink(sink);
+
rootFragment.setOutputPartition(DataPartition.UNPARTITIONED);
+
+ return rootFragment;
+ }
+
+ @Override
+ public PlanFragment visitPhysicalFileSink(PhysicalFileSink<? extends Plan> fileSink,
+ PlanTranslatorContext context) {
+ PlanFragment rootFragment = fileSink.child().accept(this, context);
+ OutFileClause outFile = new OutFileClause(
+ fileSink.getFilePath(),
+ fileSink.getFormat(),
+ fileSink.getProperties()
+ );
+
+ List<Expr> outputExprs = Lists.newArrayList();
+ fileSink.getOutput().stream().map(Slot::getExprId)
+ .forEach(exprId -> outputExprs.add(context.findSlotRef(exprId)));
+ rootFragment.setOutputExprs(outputExprs);
+
+ try {
+ outFile.analyze(null, outputExprs,
+ fileSink.getOutput().stream().map(NamedExpression::getName).collect(Collectors.toList()));
+ } catch (Exception e) {
+ throw new AnalysisException(e.getMessage(), e.getCause());
+ }
+ ResultFileSink sink = new ResultFileSink(rootFragment.getPlanRoot().getId(), outFile);
+
+ rootFragment.setSink(sink);
return rootFragment;
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
index e5133e99fa..dffc10d7df 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
@@ -37,6 +37,7 @@ import org.apache.doris.nereids.DorisParser.ColumnReferenceContext;
import org.apache.doris.nereids.DorisParser.CommentJoinHintContext;
import org.apache.doris.nereids.DorisParser.CommentRelationHintContext;
import org.apache.doris.nereids.DorisParser.ComparisonContext;
+import org.apache.doris.nereids.DorisParser.ConstantContext;
import org.apache.doris.nereids.DorisParser.CreateRowPolicyContext;
import org.apache.doris.nereids.DorisParser.CteContext;
import org.apache.doris.nereids.DorisParser.Date_addContext;
@@ -71,6 +72,7 @@ import org.apache.doris.nereids.DorisParser.MultipartIdentifierContext;
import org.apache.doris.nereids.DorisParser.NamedExpressionContext;
import org.apache.doris.nereids.DorisParser.NamedExpressionSeqContext;
import org.apache.doris.nereids.DorisParser.NullLiteralContext;
+import org.apache.doris.nereids.DorisParser.OutFileClauseContext;
import org.apache.doris.nereids.DorisParser.ParenthesizedExpressionContext;
import org.apache.doris.nereids.DorisParser.PlanTypeContext;
import org.apache.doris.nereids.DorisParser.PredicateContext;
@@ -224,6 +226,7 @@ import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate;
import org.apache.doris.nereids.trees.plans.logical.LogicalCTE;
import org.apache.doris.nereids.trees.plans.logical.LogicalCheckPolicy;
import org.apache.doris.nereids.trees.plans.logical.LogicalExcept;
+import org.apache.doris.nereids.trees.plans.logical.LogicalFileSink;
import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
import org.apache.doris.nereids.trees.plans.logical.LogicalGenerate;
import org.apache.doris.nereids.trees.plans.logical.LogicalHaving;
@@ -308,7 +311,7 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
@Override
public LogicalPlan visitStatementDefault(StatementDefaultContext ctx) {
LogicalPlan plan = plan(ctx.query());
- return withExplain(plan, ctx.explain());
+ return withExplain(withOutFile(plan, ctx.outFileClause()), ctx.explain());
}
@Override
@@ -1427,6 +1430,24 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
});
}
+ private LogicalPlan withOutFile(LogicalPlan plan, OutFileClauseContext ctx) {
+ if (ctx == null) {
+ return plan;
+ }
+ String format = "csv";
+ if (ctx.format != null) {
+ format = ctx.format.getText();
+ }
+ Map<String, String> properties = Maps.newHashMap();
+ for (TvfPropertyContext argument : ctx.properties) {
+ String key = parseConstant(argument.key.constant());
+ String value = parseConstant(argument.value.constant());
+ properties.put(key, value);
+ }
+ Literal filePath = (Literal) visit(ctx.filePath);
+ return new LogicalFileSink<>(filePath.getStringValue(), format, properties, plan);
+ }
+
private LogicalPlan withQueryOrganization(LogicalPlan inputPlan, QueryOrganizationContext ctx) {
if (ctx == null) {
return inputPlan;
@@ -1856,10 +1877,7 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
private String parseTVFPropertyItem(TvfPropertyItemContext item) {
if (item.constant() != null) {
- Object constant = visit(item.constant());
- if (constant instanceof Literal && ((Literal) constant).isStringLikeLiteral()) {
- return ((Literal) constant).getStringValue();
- }
+ return parseConstant(item.constant());
}
return item.getText();
}
@@ -1910,4 +1928,12 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
}
throw new ParseException("Unsupported function with order expressions" + ctx.getText(), ctx);
}
+
+ private String parseConstant(ConstantContext context) {
+ Object constant = visit(context);
+ if (constant instanceof Literal && ((Literal) constant).isStringLikeLiteral()) {
+ return ((Literal) constant).getStringValue();
+ }
+ return context.getText();
+ }
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/ChildOutputPropertyDeriver.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/ChildOutputPropertyDeriver.java
index 316f31a0f3..6672ecfe08 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/ChildOutputPropertyDeriver.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/ChildOutputPropertyDeriver.java
@@ -38,6 +38,7 @@ import org.apache.doris.nereids.trees.plans.physical.PhysicalDistribute;
import org.apache.doris.nereids.trees.plans.physical.PhysicalEmptyRelation;
import org.apache.doris.nereids.trees.plans.physical.PhysicalEsScan;
import org.apache.doris.nereids.trees.plans.physical.PhysicalFileScan;
+import org.apache.doris.nereids.trees.plans.physical.PhysicalFileSink;
import org.apache.doris.nereids.trees.plans.physical.PhysicalFilter;
import org.apache.doris.nereids.trees.plans.physical.PhysicalGenerate;
import org.apache.doris.nereids.trees.plans.physical.PhysicalHashAggregate;
@@ -95,6 +96,11 @@ public class ChildOutputPropertyDeriver extends PlanVisitor<PhysicalProperties,
* sink Node, in lexicographical order
* ******************************************************************************************** */
+ @Override
+ public PhysicalProperties visitPhysicalFileSink(PhysicalFileSink<? extends Plan> fileSink, PlanContext context) {
+ return PhysicalProperties.GATHER;
+ }
+
@Override
public PhysicalProperties visitPhysicalOlapTableSink(PhysicalOlapTableSink<? extends Plan> olapTableSink,
PlanContext context) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/RequestPropertyDeriver.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/RequestPropertyDeriver.java
index 9b223e1a53..11375064f4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/RequestPropertyDeriver.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/RequestPropertyDeriver.java
@@ -29,6 +29,7 @@ import org.apache.doris.nereids.trees.plans.Plan;
import org.apache.doris.nereids.trees.plans.physical.AbstractPhysicalSort;
import org.apache.doris.nereids.trees.plans.physical.PhysicalAssertNumRows;
import org.apache.doris.nereids.trees.plans.physical.PhysicalCTEAnchor;
+import org.apache.doris.nereids.trees.plans.physical.PhysicalFileSink;
import org.apache.doris.nereids.trees.plans.physical.PhysicalHashJoin;
import org.apache.doris.nereids.trees.plans.physical.PhysicalLimit;
import org.apache.doris.nereids.trees.plans.physical.PhysicalNestedLoopJoin;
@@ -219,6 +220,12 @@ public class RequestPropertyDeriver extends PlanVisitor<Void, PlanContext> {
return null;
}
+ @Override
+ public Void visitPhysicalFileSink(PhysicalFileSink<? extends Plan> fileSink, PlanContext context) {
+ addRequestPropertyToChildren(PhysicalProperties.GATHER);
+ return null;
+ }
+
private List<PhysicalProperties> createHashRequestAccordingToParent(
Plan plan, DistributionSpecHash distributionRequestFromParent, PlanContext context) {
List<PhysicalProperties> requiredPropertyList =
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java
index 3e39cf50b6..6eb68e3ec5 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java
@@ -48,6 +48,7 @@ import org.apache.doris.nereids.rules.implementation.LogicalEmptyRelationToPhysi
import org.apache.doris.nereids.rules.implementation.LogicalEsScanToPhysicalEsScan;
import org.apache.doris.nereids.rules.implementation.LogicalExceptToPhysicalExcept;
import org.apache.doris.nereids.rules.implementation.LogicalFileScanToPhysicalFileScan;
+import org.apache.doris.nereids.rules.implementation.LogicalFileSinkToPhysicalFileSink;
import org.apache.doris.nereids.rules.implementation.LogicalFilterToPhysicalFilter;
import org.apache.doris.nereids.rules.implementation.LogicalGenerateToPhysicalGenerate;
import org.apache.doris.nereids.rules.implementation.LogicalIntersectToPhysicalIntersect;
@@ -167,6 +168,7 @@ public class RuleSet {
.add(new LogicalIntersectToPhysicalIntersect())
.add(new LogicalGenerateToPhysicalGenerate())
.add(new LogicalOlapTableSinkToPhysicalOlapTableSink())
+ .add(new LogicalFileSinkToPhysicalFileSink())
.build();
public static final List<Rule> ZIG_ZAG_TREE_JOIN_REORDER = planRuleFactories()
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
index c4d4e54f00..a537eb2cbf 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
@@ -298,6 +298,7 @@ public enum RuleType {
LOGICAL_JDBC_SCAN_TO_PHYSICAL_JDBC_SCAN_RULE(RuleTypeClass.IMPLEMENTATION),
LOGICAL_ES_SCAN_TO_PHYSICAL_ES_SCAN_RULE(RuleTypeClass.IMPLEMENTATION),
LOGICAL_OLAP_TABLE_SINK_TO_PHYSICAL_OLAP_TABLE_SINK_RULE(RuleTypeClass.IMPLEMENTATION),
+ LOGICAL_FILE_SINK_TO_PHYSICAL_FILE_SINK_RULE(RuleTypeClass.IMPLEMENTATION),
LOGICAL_ASSERT_NUM_ROWS_TO_PHYSICAL_ASSERT_NUM_ROWS(RuleTypeClass.IMPLEMENTATION),
STORAGE_LAYER_AGGREGATE_WITHOUT_PROJECT(RuleTypeClass.IMPLEMENTATION),
STORAGE_LAYER_AGGREGATE_WITH_PROJECT(RuleTypeClass.IMPLEMENTATION),
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalFileSinkToPhysicalFileSink.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalFileSinkToPhysicalFileSink.java
new file mode 100644
index 0000000000..456822c8de
--- /dev/null
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalFileSinkToPhysicalFileSink.java
@@ -0,0 +1,45 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.rules.implementation;
+
+import org.apache.doris.nereids.rules.Rule;
+import org.apache.doris.nereids.rules.RuleType;
+import org.apache.doris.nereids.trees.plans.Plan;
+import org.apache.doris.nereids.trees.plans.logical.LogicalFileSink;
+import org.apache.doris.nereids.trees.plans.physical.PhysicalFileSink;
+
+import java.util.Optional;
+
+/**
+ * logical file sink to physical file sink
+ */
+public class LogicalFileSinkToPhysicalFileSink extends OneImplementationRuleFactory {
+ @Override
+ public Rule build() {
+ return logicalFileSink().thenApply(ctx -> {
+ LogicalFileSink<? extends Plan> sink = ctx.root;
+ return new PhysicalFileSink<>(
+ sink.getFilePath(),
+ sink.getFormat(),
+ sink.getProperties(),
+ Optional.empty(),
+ sink.getLogicalProperties(),
+ sink.child());
+ }).toRule(RuleType.LOGICAL_FILE_SINK_TO_PHYSICAL_FILE_SINK_RULE);
+ }
+}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java
index da6af46376..3b58c04eb8 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java
@@ -59,6 +59,7 @@ import org.apache.doris.nereids.trees.plans.logical.LogicalEmptyRelation;
import org.apache.doris.nereids.trees.plans.logical.LogicalEsScan;
import org.apache.doris.nereids.trees.plans.logical.LogicalExcept;
import org.apache.doris.nereids.trees.plans.logical.LogicalFileScan;
+import org.apache.doris.nereids.trees.plans.logical.LogicalFileSink;
import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
import org.apache.doris.nereids.trees.plans.logical.LogicalGenerate;
import org.apache.doris.nereids.trees.plans.logical.LogicalIntersect;
@@ -86,6 +87,7 @@ import org.apache.doris.nereids.trees.plans.physical.PhysicalEmptyRelation;
import org.apache.doris.nereids.trees.plans.physical.PhysicalEsScan;
import org.apache.doris.nereids.trees.plans.physical.PhysicalExcept;
import org.apache.doris.nereids.trees.plans.physical.PhysicalFileScan;
+import org.apache.doris.nereids.trees.plans.physical.PhysicalFileSink;
import org.apache.doris.nereids.trees.plans.physical.PhysicalFilter;
import org.apache.doris.nereids.trees.plans.physical.PhysicalGenerate;
import org.apache.doris.nereids.trees.plans.physical.PhysicalHashAggregate;
@@ -238,6 +240,11 @@ public class StatsCalculator extends DefaultPlanVisitor<Statistics, Void> {
return groupExpression.childStatistics(0);
}
+ @Override
+ public Statistics visitLogicalFileSink(LogicalFileSink<? extends Plan> olapTableSink, Void context) {
+ return groupExpression.childStatistics(0);
+ }
+
@Override
public Statistics visitLogicalEmptyRelation(LogicalEmptyRelation emptyRelation, Void context) {
return computeEmptyRelation(emptyRelation);
@@ -370,6 +377,11 @@ public class StatsCalculator extends DefaultPlanVisitor<Statistics, Void> {
return groupExpression.childStatistics(0);
}
+ @Override
+ public Statistics visitPhysicalFileSink(PhysicalFileSink<? extends Plan> olapTableSink, Void context) {
+ return groupExpression.childStatistics(0);
+ }
+
@Override
public Statistics visitPhysicalWindow(PhysicalWindow window, Void context) {
return computeWindow(window);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java
index 4671d95f60..2c3a68b093 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java
@@ -65,6 +65,7 @@ public enum PlanType {
LOGICAL_CTE_ANCHOR,
LOGICAL_CTE_PRODUCER,
LOGICAL_CTE_CONSUMER,
+ LOGICAL_FILE_SINK,
GROUP_PLAN,
@@ -101,11 +102,13 @@ public enum PlanType {
PHYSICAL_UNION,
PHYSICAL_EXCEPT,
PHYSICAL_INTERSECT,
+ PHYSICAL_FILE_SINK,
COMMAND,
EXPLAIN_COMMAND,
CREATE_POLICY_COMMAND,
INSERT_INTO_TABLE_COMMAND,
UPDATE_COMMAND,
- DELETE_COMMAND
+ DELETE_COMMAND,
+ SELECT_INTO_OUTFILE_COMMAND
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileSink.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileSink.java
new file mode 100644
index 0000000000..2ec4c128ce
--- /dev/null
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileSink.java
@@ -0,0 +1,122 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.trees.plans.logical;
+
+import org.apache.doris.nereids.memo.GroupExpression;
+import org.apache.doris.nereids.properties.LogicalProperties;
+import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.Slot;
+import org.apache.doris.nereids.trees.plans.Plan;
+import org.apache.doris.nereids.trees.plans.PlanType;
+import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+/**
+ * logicalFileSink for select into outfile
+ */
+public class LogicalFileSink<CHILD_TYPE extends Plan> extends LogicalUnary<CHILD_TYPE> {
+ private final String filePath;
+ private final String format;
+ private final Map<String, String> properties;
+
+ public LogicalFileSink(String filePath, String format, Map<String, String> properties, CHILD_TYPE child) {
+ this(filePath, format, properties, Optional.empty(), Optional.empty(), child);
+ }
+
+ public LogicalFileSink(String filePath, String format, Map<String, String> properties,
+ Optional<GroupExpression> groupExpression, Optional<LogicalProperties> logicalProperties,
+ CHILD_TYPE child) {
+ super(PlanType.LOGICAL_FILE_SINK, groupExpression, logicalProperties, child);
+ this.filePath = Objects.requireNonNull(filePath);
+ this.format = Objects.requireNonNull(format);
+ this.properties = ImmutableMap.copyOf(Objects.requireNonNull(properties));
+ }
+
+ @Override
+ public Plan withChildren(List<Plan> children) {
+ Preconditions.checkArgument(children.size() == 1);
+ return new LogicalFileSink<>(filePath, format, properties, children.get(0));
+ }
+
+ @Override
+ public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+ return visitor.visitLogicalFileSink(this, context);
+ }
+
+ @Override
+ public List<? extends Expression> getExpressions() {
+ return ImmutableList.of();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ LogicalFileSink<?> that = (LogicalFileSink<?>) o;
+ return Objects.equals(filePath, that.filePath)
+ && Objects.equals(format, that.format)
+ && Objects.equals(properties, that.properties);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), filePath, format, properties);
+ }
+
+ @Override
+ public Plan withGroupExpression(Optional<GroupExpression> groupExpression) {
+ return new LogicalFileSink<>(filePath, format, properties, groupExpression,
+ Optional.of(getLogicalProperties()), child());
+ }
+
+ @Override
+ public Plan withGroupExprLogicalPropChildren(Optional<GroupExpression> groupExpression,
+ Optional<LogicalProperties> logicalProperties, List<Plan> children) {
+ Preconditions.checkArgument(children.size() == 1);
+ return new LogicalFileSink<>(filePath, format, properties, groupExpression, logicalProperties, children.get(0));
+ }
+
+ @Override
+ public List<Slot> computeOutput() {
+ return child().getOutput();
+ }
+
+ public String getFilePath() {
+ return filePath;
+ }
+
+ public String getFormat() {
+ return format;
+ }
+
+ public Map<String, String> getProperties() {
+ return properties;
+ }
+}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFileSink.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFileSink.java
new file mode 100644
index 0000000000..2e72639c00
--- /dev/null
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFileSink.java
@@ -0,0 +1,132 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.trees.plans.physical;
+
+import org.apache.doris.nereids.memo.GroupExpression;
+import org.apache.doris.nereids.properties.LogicalProperties;
+import org.apache.doris.nereids.properties.PhysicalProperties;
+import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.plans.Plan;
+import org.apache.doris.nereids.trees.plans.PlanType;
+import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.statistics.Statistics;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+/**
+ * physicalFileSink for select into outfile
+ */
+public class PhysicalFileSink<CHILD_TYPE extends Plan> extends PhysicalUnary<CHILD_TYPE> {
+ private final String filePath;
+ private final String format;
+ private final Map<String, String> properties;
+
+ public PhysicalFileSink(String filePath, String format, Map<String, String> properties,
+ LogicalProperties logicalProperties, CHILD_TYPE child) {
+ this(filePath, format, properties, Optional.empty(), logicalProperties, child);
+ }
+
+ public PhysicalFileSink(String filePath, String format, Map<String, String> properties,
+ Optional<GroupExpression> groupExpression, LogicalProperties logicalProperties,
+ CHILD_TYPE child) {
+ super(PlanType.PHYSICAL_FILE_SINK, groupExpression, logicalProperties, child);
+ this.filePath = filePath;
+ this.format = format;
+ this.properties = properties;
+ }
+
+ public PhysicalFileSink(String filePath, String format, Map<String, String> properties,
+ Optional<GroupExpression> groupExpression, LogicalProperties logicalProperties,
+ PhysicalProperties physicalProperties, Statistics statistics, CHILD_TYPE child) {
+ super(PlanType.PHYSICAL_FILE_SINK, groupExpression, logicalProperties, physicalProperties, statistics, child);
+ this.filePath = filePath;
+ this.format = format;
+ this.properties = properties;
+ }
+
+ public String getFilePath() {
+ return filePath;
+ }
+
+ public String getFormat() {
+ return format;
+ }
+
+ public Map<String, String> getProperties() {
+ return properties;
+ }
+
+ @Override
+ public Plan withChildren(List<Plan> children) {
+ Preconditions.checkArgument(children.size() == 1, "PhysicalFileSink only accepts one child");
+ return new PhysicalFileSink<>(filePath, format, properties, getLogicalProperties(), children.get(0));
+ }
+
+ @Override
+ public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+ return visitor.visitPhysicalFileSink(this, context);
+ }
+
+ @Override
+ public List<? extends Expression> getExpressions() {
+ return ImmutableList.of();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ PhysicalFileSink<?> that = (PhysicalFileSink<?>) o;
+ return Objects.equals(filePath, that.filePath)
+ && Objects.equals(format, that.format)
+ && Objects.equals(properties, that.properties);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), filePath, format, properties);
+ }
+
+ @Override
+ public Plan withGroupExpression(Optional<GroupExpression> groupExpression) {
+ return new PhysicalFileSink<>(filePath, format, properties, groupExpression, getLogicalProperties(), child());
+ }
+
+ @Override
+ public Plan withGroupExprLogicalPropChildren(Optional<GroupExpression> groupExpression,
+ Optional<LogicalProperties> logicalProperties, List<Plan> children) {
+ return new PhysicalFileSink<>(filePath, format, properties, groupExpression, logicalProperties.get(),
+ children.get(0));
+ }
+
+ @Override
+ public PhysicalPlan withPhysicalPropertiesAndStats(PhysicalProperties physicalProperties, Statistics statistics) {
+ return new PhysicalFileSink<>(filePath, format, properties, groupExpression, getLogicalProperties(),
+ physicalProperties, statistics, child());
+ }
+}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/PlanVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/PlanVisitor.java
index 799988c449..1beff0f123 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/PlanVisitor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/PlanVisitor.java
@@ -36,6 +36,7 @@ import org.apache.doris.nereids.trees.plans.logical.LogicalEmptyRelation;
import org.apache.doris.nereids.trees.plans.logical.LogicalEsScan;
import org.apache.doris.nereids.trees.plans.logical.LogicalExcept;
import org.apache.doris.nereids.trees.plans.logical.LogicalFileScan;
+import org.apache.doris.nereids.trees.plans.logical.LogicalFileSink;
import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
import org.apache.doris.nereids.trees.plans.logical.LogicalGenerate;
import org.apache.doris.nereids.trees.plans.logical.LogicalHaving;
@@ -70,6 +71,7 @@ import org.apache.doris.nereids.trees.plans.physical.PhysicalEmptyRelation;
import org.apache.doris.nereids.trees.plans.physical.PhysicalEsScan;
import org.apache.doris.nereids.trees.plans.physical.PhysicalExcept;
import org.apache.doris.nereids.trees.plans.physical.PhysicalFileScan;
+import org.apache.doris.nereids.trees.plans.physical.PhysicalFileSink;
import org.apache.doris.nereids.trees.plans.physical.PhysicalFilter;
import org.apache.doris.nereids.trees.plans.physical.PhysicalGenerate;
import org.apache.doris.nereids.trees.plans.physical.PhysicalHashAggregate;
@@ -421,4 +423,12 @@ public abstract class PlanVisitor<R, C> implements CommandVisitor<R, C> {
public R visitLogicalCTEAnchor(LogicalCTEAnchor<? extends Plan, ? extends Plan> cteAnchor, C context) {
return visit(cteAnchor, context);
}
+
+ public R visitLogicalFileSink(LogicalFileSink<? extends Plan> fileSink, C context) {
+ return visit(fileSink, context);
+ }
+
+ public R visitPhysicalFileSink(PhysicalFileSink<? extends Plan> fileSink, C context) {
+ return visit(fileSink, context);
+ }
}
diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/OutFileTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/OutFileTest.java
new file mode 100644
index 0000000000..426c641425
--- /dev/null
+++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/OutFileTest.java
@@ -0,0 +1,91 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.trees.plans;
+
+import org.apache.doris.nereids.NereidsPlanner;
+import org.apache.doris.nereids.StatementContext;
+import org.apache.doris.nereids.glue.translator.PhysicalPlanTranslator;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.nereids.parser.NereidsParser;
+import org.apache.doris.nereids.properties.PhysicalProperties;
+import org.apache.doris.nereids.trees.expressions.StatementScopeIdGenerator;
+import org.apache.doris.nereids.trees.plans.physical.PhysicalPlan;
+import org.apache.doris.nereids.util.MemoTestUtils;
+import org.apache.doris.nereids.util.PlanPatternMatchSupported;
+import org.apache.doris.planner.PlanFragment;
+import org.apache.doris.thrift.TExplainLevel;
+import org.apache.doris.utframe.TestWithFeService;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class OutFileTest extends TestWithFeService implements PlanPatternMatchSupported {
+ private final NereidsParser parser = new NereidsParser();
+
+ @Override
+ protected void runBeforeAll() throws Exception {
+ createDatabase("test");
+ connectContext.setDatabase("default_cluster:test");
+
+ createTables(
+ "CREATE TABLE IF NOT EXISTS T1 (\n"
+ + " id bigint,\n"
+ + " score bigint\n"
+ + ")\n"
+ + "DUPLICATE KEY(id)\n"
+ + "DISTRIBUTED BY HASH(id) BUCKETS 1\n"
+ + "PROPERTIES (\n"
+ + " \"replication_num\" = \"1\"\n"
+ + ")\n",
+ "CREATE TABLE IF NOT EXISTS T2 (\n"
+ + " id bigint,\n"
+ + " score bigint\n"
+ + ")\n"
+ + "DUPLICATE KEY(id)\n"
+ + "DISTRIBUTED BY HASH(id) BUCKETS 1\n"
+ + "PROPERTIES (\n"
+ + " \"replication_num\" = \"1\"\n"
+ + ")\n"
+ );
+ }
+
+ @Test
+ public void testWriteOutFile() throws Exception {
+ String sql = "select * from T1 join T2 on T1.id = T2.id into outfile 'file://~/result.csv'\n"
+ + " format as csv\n"
+ + " properties (\n"
+ + " \"column_separator\" = \",\",\n"
+ + " \"line_delimiter\" = \"\\n\",\n"
+ + " \"broker.name\" = \"my_broker\",\n"
+ + " \"max_file_size\" = \"100MB\"\n"
+ + ")";
+ Assertions.assertTrue(getOutputFragment(sql).getExplainString(TExplainLevel.BRIEF)
+ .contains("FILE SINK"));
+ }
+
+ private PlanFragment getOutputFragment(String sql) throws Exception {
+ StatementScopeIdGenerator.clear();
+ StatementContext statementContext = MemoTestUtils.createStatementContext(connectContext, sql);
+ NereidsPlanner planner = new NereidsPlanner(statementContext);
+ PhysicalPlan plan = planner.plan(
+ parser.parseSingle(sql),
+ PhysicalProperties.ANY
+ );
+ return new PhysicalPlanTranslator(new PlanTranslatorContext(planner.getCascadesContext())).translatePlan(plan);
+ }
+}
diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
index 0309718ed0..4b00fa303b 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
@@ -65,6 +65,7 @@ public class QueryPlanTest extends TestWithFeService {
// create database
createDatabase("test");
+ connectContext.getSessionVariable().setEnableNereidsPlanner(false);
createTable("create table test.test1\n"
+ "(\n"
diff --git a/regression-test/data/nereids_p0/outfile/test_outfile.out b/regression-test/data/nereids_p0/outfile/test_outfile.out
new file mode 100644
index 0000000000..0b6acb84f4
--- /dev/null
+++ b/regression-test/data/nereids_p0/outfile/test_outfile.out
@@ -0,0 +1,1003 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !select_default --
+1 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 1 1 true 1 1 1 1.1 1.1 char1 1
+2 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 2 2 true 2 2 2 2.2 2.2 char2 2
+3 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 3 3 true 3 3 3 3.3 3.3 char3 3
+4 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 4 4 true 4 4 4 4.4 4.4 char4 4
+5 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 5 5 true 5 5 5 5.5 5.5 char5 5
+6 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 6 6 true 6 6 6 6.6 6.6 char6 6
+7 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 7 7 true 7 7 7 7.7 7.7 char7 7
+8 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 8 8 true 8 8 8 8.8 8.8 char8 8
+9 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 9 9 true 9 9 9 9.9 9.9 char9 9
+10 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 10 10 true 10 10 10 10.1 10.1 char10 10
+11 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 11 11 true 11 11 11 11.11 11.11 char11 11
+12 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 12 12 true 12 12 12 12.12 12.12 char12 12
+13 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 13 13 true 13 13 13 13.13 13.13 char13 13
+14 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 14 14 true 14 14 14 14.14 14.14 char14 14
+15 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 15 15 true 15 15 15 15.15 15.15 char15 15
+16 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 16 16 true 16 16 16 16.16 16.16 char16 16
+17 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 17 17 true 17 17 17 17.17 17.17 char17 17
+18 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 18 18 true 18 18 18 18.18 18.18 char18 18
+19 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 19 19 true 19 19 19 19.19 19.19 char19 19
+20 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 20 20 true 20 20 20 20.2 20.2 char20 20
+21 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 21 21 true 21 21 21 21.21 21.21 char21 21
+22 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 22 22 true 22 22 22 22.22 22.22 char22 22
+23 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 23 23 true 23 23 23 23.23 23.23 char23 23
+24 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 24 24 true 24 24 24 24.24 24.24 char24 24
+25 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 25 25 true 25 25 25 25.25 25.25 char25 25
+26 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 26 26 true 26 26 26 26.26 26.26 char26 26
+27 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 27 27 true 27 27 27 27.27 27.27 char27 27
+28 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 28 28 true 28 28 28 28.28 28.28 char28 28
+29 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 29 29 true 29 29 29 29.29 29.29 char29 29
+30 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 30 30 true 30 30 30 30.3 30.3 char30 30
+31 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 31 31 true 31 31 31 31.31 31.31 char31 31
+32 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 32 32 true 32 32 32 32.32 32.32 char32 32
+33 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 33 33 true 33 33 33 33.33 33.33 char33 33
+34 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 34 34 true 34 34 34 34.34 34.34 char34 34
+35 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 35 35 true 35 35 35 35.35 35.35 char35 35
+36 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 36 36 true 36 36 36 36.36 36.36 char36 36
+37 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 37 37 true 37 37 37 37.37 37.37 char37 37
+38 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 38 38 true 38 38 38 38.38 38.38 char38 38
+39 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 39 39 true 39 39 39 39.39 39.39 char39 39
+40 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 40 40 true 40 40 40 40.4 40.4 char40 40
+41 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 41 41 true 41 41 41 41.41 41.41 char41 41
+42 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 42 42 true 42 42 42 42.42 42.42 char42 42
+43 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 43 43 true 43 43 43 43.43 43.43 char43 43
+44 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 44 44 true 44 44 44 44.44 44.44 char44 44
+45 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 45 45 true 45 45 45 45.45 45.45 char45 45
+46 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 46 46 true 46 46 46 46.46 46.46 char46 46
+47 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 47 47 true 47 47 47 47.47 47.47 char47 47
+48 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 48 48 true 48 48 48 48.48 48.48 char48 48
+49 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 49 49 true 49 49 49 49.49 49.49 char49 49
+50 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 50 50 true 50 50 50 50.5 50.5 char50 50
+51 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 51 51 true 51 51 51 51.51 51.51 char51 51
+52 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 52 52 true 52 52 52 52.52 52.52 char52 52
+53 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 53 53 true 53 53 53 53.53 53.53 char53 53
+54 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 54 54 true 54 54 54 54.54 54.54 char54 54
+55 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 55 55 true 55 55 55 55.55 55.55 char55 55
+56 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 56 56 true 56 56 56 56.56 56.56 char56 56
+57 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 57 57 true 57 57 57 57.57 57.57 char57 57
+58 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 58 58 true 58 58 58 58.58 58.58 char58 58
+59 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 59 59 true 59 59 59 59.59 59.59 char59 59
+60 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 60 60 true 60 60 60 60.6 60.6 char60 60
+61 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 61 61 true 61 61 61 61.61 61.61 char61 61
+62 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 62 62 true 62 62 62 62.62 62.62 char62 62
+63 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 63 63 true 63 63 63 63.63 63.63 char63 63
+64 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 64 64 true 64 64 64 64.64 64.64 char64 64
+65 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 65 65 true 65 65 65 65.65 65.65 char65 65
+66 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 66 66 true 66 66 66 66.66 66.66 char66 66
+67 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 67 67 true 67 67 67 67.67 67.67 char67 67
+68 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 68 68 true 68 68 68 68.68 68.68 char68 68
+69 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 69 69 true 69 69 69 69.69 69.69 char69 69
+70 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 70 70 true 70 70 70 70.7 70.7 char70 70
+71 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 71 71 true 71 71 71 71.71 71.71 char71 71
+72 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 72 72 true 72 72 72 72.72 72.72 char72 72
+73 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 73 73 true 73 73 73 73.73 73.73 char73 73
+74 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 74 74 true 74 74 74 74.74 74.74 char74 74
+75 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 75 75 true 75 75 75 75.75 75.75 char75 75
+76 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 76 76 true 76 76 76 76.76 76.76 char76 76
+77 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 77 77 true 77 77 77 77.77 77.77 char77 77
+78 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 78 78 true 78 78 78 78.78 78.78 char78 78
+79 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 79 79 true 79 79 79 79.79 79.79 char79 79
+80 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 80 80 true 80 80 80 80.8 80.8 char80 80
+81 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 81 81 true 81 81 81 81.81 81.81 char81 81
+82 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 82 82 true 82 82 82 82.82 82.82 char82 82
+83 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 83 83 true 83 83 83 83.83 83.83 char83 83
+84 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 84 84 true 84 84 84 84.84 84.84 char84 84
+85 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 85 85 true 85 85 85 85.85 85.85 char85 85
+86 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 86 86 true 86 86 86 86.86 86.86 char86 86
+87 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 87 87 true 87 87 87 87.87 87.87 char87 87
+88 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 88 88 true 88 88 88 88.88 88.88 char88 88
+89 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 89 89 true 89 89 89 89.89 89.89 char89 89
+90 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 90 90 true 90 90 90 90.9 90.9 char90 90
+91 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 91 91 true 91 91 91 91.91 91.91 char91 91
+92 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 92 92 true 92 92 92 92.92 92.92 char92 92
+93 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 93 93 true 93 93 93 93.93 93.93 char93 93
+94 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 94 94 true 94 94 94 94.94 94.94 char94 94
+95 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 95 95 true 95 95 95 95.95 95.95 char95 95
+96 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 96 96 true 96 96 96 96.96 96.96 char96 96
+97 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 97 97 true 97 97 97 97.97 97.97 char97 97
+98 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 98 98 true 98 98 98 98.98 98.98 char98 98
+99 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 99 99 true 99 99 99 99.99 99.99 char99 99
+100 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 100 100 true 100 100 100 100.1 100.1 char100 100
+101 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 101 101 true 101 101 101 101.101 101.101 char101 101
+102 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 102 102 true 102 102 102 102.102 102.102 char102 102
+103 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 103 103 true 103 103 103 103.103 103.103 char103 103
+104 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 104 104 true 104 104 104 104.104 104.104 char104 104
+105 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 105 105 true 105 105 105 105.105 105.105 char105 105
+106 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 106 106 true 106 106 106 106.106 106.106 char106 106
+107 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 107 107 true 107 107 107 107.107 107.107 char107 107
+108 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 108 108 true 108 108 108 108.108 108.108 char108 108
+109 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 109 109 true 109 109 109 109.109 109.109 char109 109
+110 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 110 110 true 110 110 110 110.11 110.11 char110 110
+111 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 111 111 true 111 111 111 111.111 111.111 char111 111
+112 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 112 112 true 112 112 112 112.112 112.112 char112 112
+113 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 113 113 true 113 113 113 113.113 113.113 char113 113
+114 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 114 114 true 114 114 114 114.114 114.114 char114 114
+115 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 115 115 true 115 115 115 115.115 115.115 char115 115
+116 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 116 116 true 116 116 116 116.116 116.116 char116 116
+117 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 117 117 true 117 117 117 117.117 117.117 char117 117
+118 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 118 118 true 118 118 118 118.118 118.118 char118 118
+119 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 119 119 true 119 119 119 119.119 119.119 char119 119
+120 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 120 120 true 120 120 120 120.12 120.12 char120 120
+121 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 121 121 true 121 121 121 121.121 121.121 char121 121
+122 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 122 122 true 122 122 122 122.122 122.122 char122 122
+123 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 123 123 true 123 123 123 123.123 123.123 char123 123
+124 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 124 124 true 124 124 124 124.124 124.124 char124 124
+125 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 125 125 true 125 125 125 125.125 125.125 char125 125
+126 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 126 126 true 126 126 126 126.126 126.126 char126 126
+127 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 127 127 true 127 127 127 127.127 127.127 char127 127
+128 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 128 0 true 128 128 128 128.128 128.128 char128 128
+129 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 129 1 true 129 129 129 129.129 129.129 char129 129
+130 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 130 2 true 130 130 130 130.13 130.13 char130 130
+131 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 131 3 true 131 131 131 131.131 131.131 char131 131
+132 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 132 4 true 132 132 132 132.132 132.132 char132 132
+133 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 133 5 true 133 133 133 133.133 133.133 char133 133
+134 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 134 6 true 134 134 134 134.134 134.134 char134 134
+135 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 135 7 true 135 135 135 135.135 135.135 char135 135
+136 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 136 8 true 136 136 136 136.136 136.136 char136 136
+137 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 137 9 true 137 137 137 137.137 137.137 char137 137
+138 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 138 10 true 138 138 138 138.138 138.138 char138 138
+139 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 139 11 true 139 139 139 139.139 139.139 char139 139
+140 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 140 12 true 140 140 140 140.14 140.14 char140 140
+141 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 141 13 true 141 141 141 141.141 141.141 char141 141
+142 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 142 14 true 142 142 142 142.142 142.142 char142 142
+143 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 143 15 true 143 143 143 143.143 143.143 char143 143
+144 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 144 16 true 144 144 144 144.144 144.144 char144 144
+145 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 145 17 true 145 145 145 145.145 145.145 char145 145
+146 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 146 18 true 146 146 146 146.146 146.146 char146 146
+147 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 147 19 true 147 147 147 147.147 147.147 char147 147
+148 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 148 20 true 148 148 148 148.148 148.148 char148 148
+149 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 149 21 true 149 149 149 149.149 149.149 char149 149
+150 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 150 22 true 150 150 150 150.15 150.15 char150 150
+151 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 151 23 true 151 151 151 151.151 151.151 char151 151
+152 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 152 24 true 152 152 152 152.152 152.152 char152 152
+153 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 153 25 true 153 153 153 153.153 153.153 char153 153
+154 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 154 26 true 154 154 154 154.154 154.154 char154 154
+155 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 155 27 true 155 155 155 155.155 155.155 char155 155
+156 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 156 28 true 156 156 156 156.156 156.156 char156 156
+157 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 157 29 true 157 157 157 157.157 157.157 char157 157
+158 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 158 30 true 158 158 158 158.158 158.158 char158 158
+159 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 159 31 true 159 159 159 159.159 159.159 char159 159
+160 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 160 32 true 160 160 160 160.16 160.16 char160 160
+161 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 161 33 true 161 161 161 161.161 161.161 char161 161
+162 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 162 34 true 162 162 162 162.162 162.162 char162 162
+163 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 163 35 true 163 163 163 163.163 163.163 char163 163
+164 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 164 36 true 164 164 164 164.164 164.164 char164 164
+165 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 165 37 true 165 165 165 165.165 165.165 char165 165
+166 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 166 38 true 166 166 166 166.166 166.166 char166 166
+167 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 167 39 true 167 167 167 167.167 167.167 char167 167
+168 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 168 40 true 168 168 168 168.168 168.168 char168 168
+169 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 169 41 true 169 169 169 169.169 169.169 char169 169
+170 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 170 42 true 170 170 170 170.17 170.17 char170 170
+171 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 171 43 true 171 171 171 171.171 171.171 char171 171
+172 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 172 44 true 172 172 172 172.172 172.172 char172 172
+173 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 173 45 true 173 173 173 173.173 173.173 char173 173
+174 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 174 46 true 174 174 174 174.174 174.174 char174 174
+175 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 175 47 true 175 175 175 175.175 175.175 char175 175
+176 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 176 48 true 176 176 176 176.176 176.176 char176 176
+177 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 177 49 true 177 177 177 177.177 177.177 char177 177
+178 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 178 50 true 178 178 178 178.178 178.178 char178 178
+179 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 179 51 true 179 179 179 179.179 179.179 char179 179
+180 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 180 52 true 180 180 180 180.18 180.18 char180 180
+181 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 181 53 true 181 181 181 181.181 181.181 char181 181
+182 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 182 54 true 182 182 182 182.182 182.182 char182 182
+183 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 183 55 true 183 183 183 183.183 183.183 char183 183
+184 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 184 56 true 184 184 184 184.184 184.184 char184 184
+185 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 185 57 true 185 185 185 185.185 185.185 char185 185
+186 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 186 58 true 186 186 186 186.186 186.186 char186 186
+187 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 187 59 true 187 187 187 187.187 187.187 char187 187
+188 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 188 60 true 188 188 188 188.188 188.188 char188 188
+189 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 189 61 true 189 189 189 189.189 189.189 char189 189
+190 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 190 62 true 190 190 190 190.19 190.19 char190 190
+191 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 191 63 true 191 191 191 191.191 191.191 char191 191
+192 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 192 64 true 192 192 192 192.192 192.192 char192 192
+193 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 193 65 true 193 193 193 193.193 193.193 char193 193
+194 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 194 66 true 194 194 194 194.194 194.194 char194 194
+195 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 195 67 true 195 195 195 195.195 195.195 char195 195
+196 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 196 68 true 196 196 196 196.196 196.196 char196 196
+197 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 197 69 true 197 197 197 197.197 197.197 char197 197
+198 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 198 70 true 198 198 198 198.198 198.198 char198 198
+199 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 199 71 true 199 199 199 199.199 199.199 char199 199
+200 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 200 72 true 200 200 200 200.2 200.2 char200 200
+201 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 201 73 true 201 201 201 201.201 201.201 char201 201
+202 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 202 74 true 202 202 202 202.202 202.202 char202 202
+203 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 203 75 true 203 203 203 203.203 203.203 char203 203
+204 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 204 76 true 204 204 204 204.204 204.204 char204 204
+205 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 205 77 true 205 205 205 205.205 205.205 char205 205
+206 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 206 78 true 206 206 206 206.206 206.206 char206 206
+207 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 207 79 true 207 207 207 207.207 207.207 char207 207
+208 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 208 80 true 208 208 208 208.208 208.208 char208 208
+209 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 209 81 true 209 209 209 209.209 209.209 char209 209
+210 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 210 82 true 210 210 210 210.21 210.21 char210 210
+211 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 211 83 true 211 211 211 211.211 211.211 char211 211
+212 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 212 84 true 212 212 212 212.212 212.212 char212 212
+213 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 213 85 true 213 213 213 213.213 213.213 char213 213
+214 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 214 86 true 214 214 214 214.214 214.214 char214 214
+215 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 215 87 true 215 215 215 215.215 215.215 char215 215
+216 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 216 88 true 216 216 216 216.216 216.216 char216 216
+217 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 217 89 true 217 217 217 217.217 217.217 char217 217
+218 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 218 90 true 218 218 218 218.218 218.218 char218 218
+219 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 219 91 true 219 219 219 219.219 219.219 char219 219
+220 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 220 92 true 220 220 220 220.22 220.22 char220 220
+221 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 221 93 true 221 221 221 221.221 221.221 char221 221
+222 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 222 94 true 222 222 222 222.222 222.222 char222 222
+223 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 223 95 true 223 223 223 223.223 223.223 char223 223
+224 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 224 96 true 224 224 224 224.224 224.224 char224 224
+225 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 225 97 true 225 225 225 225.225 225.225 char225 225
+226 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 226 98 true 226 226 226 226.226 226.226 char226 226
+227 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 227 99 true 227 227 227 227.227 227.227 char227 227
+228 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 228 100 true 228 228 228 228.228 228.228 char228 228
+229 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 229 101 true 229 229 229 229.229 229.229 char229 229
+230 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 230 102 true 230 230 230 230.23 230.23 char230 230
+231 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 231 103 true 231 231 231 231.231 231.231 char231 231
+232 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 232 104 true 232 232 232 232.232 232.232 char232 232
+233 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 233 105 true 233 233 233 233.233 233.233 char233 233
+234 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 234 106 true 234 234 234 234.234 234.234 char234 234
+235 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 235 107 true 235 235 235 235.235 235.235 char235 235
+236 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 236 108 true 236 236 236 236.236 236.236 char236 236
+237 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 237 109 true 237 237 237 237.237 237.237 char237 237
+238 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 238 110 true 238 238 238 238.238 238.238 char238 238
+239 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 239 111 true 239 239 239 239.239 239.239 char239 239
+240 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 240 112 true 240 240 240 240.24 240.24 char240 240
+241 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 241 113 true 241 241 241 241.241 241.241 char241 241
+242 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 242 114 true 242 242 242 242.242 242.242 char242 242
+243 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 243 115 true 243 243 243 243.243 243.243 char243 243
+244 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 244 116 true 244 244 244 244.244 244.244 char244 244
+245 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 245 117 true 245 245 245 245.245 245.245 char245 245
+246 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 246 118 true 246 246 246 246.246 246.246 char246 246
+247 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 247 119 true 247 247 247 247.247 247.247 char247 247
+248 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 248 120 true 248 248 248 248.248 248.248 char248 248
+249 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 249 121 true 249 249 249 249.249 249.249 char249 249
+250 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 250 122 true 250 250 250 250.25 250.25 char250 250
+251 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 251 123 true 251 251 251 251.251 251.251 char251 251
+252 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 252 124 true 252 252 252 252.252 252.252 char252 252
+253 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 253 125 true 253 253 253 253.253 253.253 char253 253
+254 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 254 126 true 254 254 254 254.254 254.254 char254 254
+255 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 255 127 true 255 255 255 255.255 255.255 char255 255
+256 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 256 0 true 256 256 256 256.256 256.256 char256 256
+257 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 257 1 true 257 257 257 257.257 257.257 char257 257
+258 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 258 2 true 258 258 258 258.258 258.258 char258 258
+259 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 259 3 true 259 259 259 259.259 259.259 char259 259
+260 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 260 4 true 260 260 260 260.26 260.26 char260 260
+261 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 261 5 true 261 261 261 261.261 261.261 char261 261
+262 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 262 6 true 262 262 262 262.262 262.262 char262 262
+263 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 263 7 true 263 263 263 263.263 263.263 char263 263
+264 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 264 8 true 264 264 264 264.264 264.264 char264 264
+265 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 265 9 true 265 265 265 265.265 265.265 char265 265
+266 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 266 10 true 266 266 266 266.266 266.266 char266 266
+267 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 267 11 true 267 267 267 267.267 267.267 char267 267
+268 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 268 12 true 268 268 268 268.268 268.268 char268 268
+269 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 269 13 true 269 269 269 269.269 269.269 char269 269
+270 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 270 14 true 270 270 270 270.27 270.27 char270 270
+271 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 271 15 true 271 271 271 271.271 271.271 char271 271
+272 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 272 16 true 272 272 272 272.272 272.272 char272 272
+273 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 273 17 true 273 273 273 273.273 273.273 char273 273
+274 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 274 18 true 274 274 274 274.274 274.274 char274 274
+275 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 275 19 true 275 275 275 275.275 275.275 char275 275
+276 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 276 20 true 276 276 276 276.276 276.276 char276 276
+277 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 277 21 true 277 277 277 277.277 277.277 char277 277
+278 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 278 22 true 278 278 278 278.278 278.278 char278 278
+279 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 279 23 true 279 279 279 279.279 279.279 char279 279
+280 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 280 24 true 280 280 280 280.28 280.28 char280 280
+281 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 281 25 true 281 281 281 281.281 281.281 char281 281
+282 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 282 26 true 282 282 282 282.282 282.282 char282 282
+283 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 283 27 true 283 283 283 283.283 283.283 char283 283
+284 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 284 28 true 284 284 284 284.284 284.284 char284 284
+285 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 285 29 true 285 285 285 285.285 285.285 char285 285
+286 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 286 30 true 286 286 286 286.286 286.286 char286 286
+287 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 287 31 true 287 287 287 287.287 287.287 char287 287
+288 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 288 32 true 288 288 288 288.288 288.288 char288 288
+289 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 289 33 true 289 289 289 289.289 289.289 char289 289
+290 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 290 34 true 290 290 290 290.29 290.29 char290 290
+291 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 291 35 true 291 291 291 291.291 291.291 char291 291
+292 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 292 36 true 292 292 292 292.292 292.292 char292 292
+293 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 293 37 true 293 293 293 293.293 293.293 char293 293
+294 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 294 38 true 294 294 294 294.294 294.294 char294 294
+295 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 295 39 true 295 295 295 295.295 295.295 char295 295
+296 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 296 40 true 296 296 296 296.296 296.296 char296 296
+297 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 297 41 true 297 297 297 297.297 297.297 char297 297
+298 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 298 42 true 298 298 298 298.298 298.298 char298 298
+299 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 299 43 true 299 299 299 299.299 299.299 char299 299
+300 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 300 44 true 300 300 300 300.3 300.3 char300 300
+301 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 301 45 true 301 301 301 301.301 301.301 char301 301
+302 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 302 46 true 302 302 302 302.302 302.302 char302 302
+303 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 303 47 true 303 303 303 303.303 303.303 char303 303
+304 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 304 48 true 304 304 304 304.304 304.304 char304 304
+305 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 305 49 true 305 305 305 305.305 305.305 char305 305
+306 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 306 50 true 306 306 306 306.306 306.306 char306 306
+307 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 307 51 true 307 307 307 307.307 307.307 char307 307
+308 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 308 52 true 308 308 308 308.308 308.308 char308 308
+309 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 309 53 true 309 309 309 309.309 309.309 char309 309
+310 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 310 54 true 310 310 310 310.31 310.31 char310 310
+311 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 311 55 true 311 311 311 311.311 311.311 char311 311
+312 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 312 56 true 312 312 312 312.312 312.312 char312 312
+313 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 313 57 true 313 313 313 313.313 313.313 char313 313
+314 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 314 58 true 314 314 314 314.314 314.314 char314 314
+315 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 315 59 true 315 315 315 315.315 315.315 char315 315
+316 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 316 60 true 316 316 316 316.316 316.316 char316 316
+317 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 317 61 true 317 317 317 317.317 317.317 char317 317
+318 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 318 62 true 318 318 318 318.318 318.318 char318 318
+319 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 319 63 true 319 319 319 319.319 319.319 char319 319
+320 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 320 64 true 320 320 320 320.32 320.32 char320 320
+321 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 321 65 true 321 321 321 321.321 321.321 char321 321
+322 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 322 66 true 322 322 322 322.322 322.322 char322 322
+323 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 323 67 true 323 323 323 323.323 323.323 char323 323
+324 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 324 68 true 324 324 324 324.324 324.324 char324 324
+325 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 325 69 true 325 325 325 325.325 325.325 char325 325
+326 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 326 70 true 326 326 326 326.326 326.326 char326 326
+327 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 327 71 true 327 327 327 327.327 327.327 char327 327
+328 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 328 72 true 328 328 328 328.328 328.328 char328 328
+329 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 329 73 true 329 329 329 329.329 329.329 char329 329
+330 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 330 74 true 330 330 330 330.33 330.33 char330 330
+331 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 331 75 true 331 331 331 331.331 331.331 char331 331
+332 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 332 76 true 332 332 332 332.332 332.332 char332 332
+333 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 333 77 true 333 333 333 333.333 333.333 char333 333
+334 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 334 78 true 334 334 334 334.334 334.334 char334 334
+335 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 335 79 true 335 335 335 335.335 335.335 char335 335
+336 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 336 80 true 336 336 336 336.336 336.336 char336 336
+337 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 337 81 true 337 337 337 337.337 337.337 char337 337
+338 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 338 82 true 338 338 338 338.338 338.338 char338 338
+339 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 339 83 true 339 339 339 339.339 339.339 char339 339
+340 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 340 84 true 340 340 340 340.34 340.34 char340 340
+341 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 341 85 true 341 341 341 341.341 341.341 char341 341
+342 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 342 86 true 342 342 342 342.342 342.342 char342 342
+343 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 343 87 true 343 343 343 343.343 343.343 char343 343
+344 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 344 88 true 344 344 344 344.344 344.344 char344 344
+345 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 345 89 true 345 345 345 345.345 345.345 char345 345
+346 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 346 90 true 346 346 346 346.346 346.346 char346 346
+347 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 347 91 true 347 347 347 347.347 347.347 char347 347
+348 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 348 92 true 348 348 348 348.348 348.348 char348 348
+349 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 349 93 true 349 349 349 349.349 349.349 char349 349
+350 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 350 94 true 350 350 350 350.35 350.35 char350 350
+351 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 351 95 true 351 351 351 351.351 351.351 char351 351
+352 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 352 96 true 352 352 352 352.352 352.352 char352 352
+353 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 353 97 true 353 353 353 353.353 353.353 char353 353
+354 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 354 98 true 354 354 354 354.354 354.354 char354 354
+355 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 355 99 true 355 355 355 355.355 355.355 char355 355
+356 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 356 100 true 356 356 356 356.356 356.356 char356 356
+357 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 357 101 true 357 357 357 357.357 357.357 char357 357
+358 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 358 102 true 358 358 358 358.358 358.358 char358 358
+359 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 359 103 true 359 359 359 359.359 359.359 char359 359
+360 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 360 104 true 360 360 360 360.36 360.36 char360 360
+361 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 361 105 true 361 361 361 361.361 361.361 char361 361
+362 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 362 106 true 362 362 362 362.362 362.362 char362 362
+363 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 363 107 true 363 363 363 363.363 363.363 char363 363
+364 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 364 108 true 364 364 364 364.364 364.364 char364 364
+365 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 365 109 true 365 365 365 365.365 365.365 char365 365
+366 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 366 110 true 366 366 366 366.366 366.366 char366 366
+367 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 367 111 true 367 367 367 367.367 367.367 char367 367
+368 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 368 112 true 368 368 368 368.368 368.368 char368 368
+369 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 369 113 true 369 369 369 369.369 369.369 char369 369
+370 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 370 114 true 370 370 370 370.37 370.37 char370 370
+371 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 371 115 true 371 371 371 371.371 371.371 char371 371
+372 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 372 116 true 372 372 372 372.372 372.372 char372 372
+373 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 373 117 true 373 373 373 373.373 373.373 char373 373
+374 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 374 118 true 374 374 374 374.374 374.374 char374 374
+375 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 375 119 true 375 375 375 375.375 375.375 char375 375
+376 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 376 120 true 376 376 376 376.376 376.376 char376 376
+377 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 377 121 true 377 377 377 377.377 377.377 char377 377
+378 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 378 122 true 378 378 378 378.378 378.378 char378 378
+379 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 379 123 true 379 379 379 379.379 379.379 char379 379
+380 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 380 124 true 380 380 380 380.38 380.38 char380 380
+381 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 381 125 true 381 381 381 381.381 381.381 char381 381
+382 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 382 126 true 382 382 382 382.382 382.382 char382 382
+383 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 383 127 true 383 383 383 383.383 383.383 char383 383
+384 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 384 0 true 384 384 384 384.384 384.384 char384 384
+385 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 385 1 true 385 385 385 385.385 385.385 char385 385
+386 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 386 2 true 386 386 386 386.386 386.386 char386 386
+387 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 387 3 true 387 387 387 387.387 387.387 char387 387
+388 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 388 4 true 388 388 388 388.388 388.388 char388 388
+389 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 389 5 true 389 389 389 389.389 389.389 char389 389
+390 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 390 6 true 390 390 390 390.39 390.39 char390 390
+391 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 391 7 true 391 391 391 391.391 391.391 char391 391
+392 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 392 8 true 392 392 392 392.392 392.392 char392 392
+393 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 393 9 true 393 393 393 393.393 393.393 char393 393
+394 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 394 10 true 394 394 394 394.394 394.394 char394 394
+395 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 395 11 true 395 395 395 395.395 395.395 char395 395
+396 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 396 12 true 396 396 396 396.396 396.396 char396 396
+397 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 397 13 true 397 397 397 397.397 397.397 char397 397
+398 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 398 14 true 398 398 398 398.398 398.398 char398 398
+399 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 399 15 true 399 399 399 399.399 399.399 char399 399
+400 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 400 16 true 400 400 400 400.4 400.4 char400 400
+401 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 401 17 true 401 401 401 401.401 401.401 char401 401
+402 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 402 18 true 402 402 402 402.402 402.402 char402 402
+403 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 403 19 true 403 403 403 403.403 403.403 char403 403
+404 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 404 20 true 404 404 404 404.404 404.404 char404 404
+405 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 405 21 true 405 405 405 405.405 405.405 char405 405
+406 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 406 22 true 406 406 406 406.406 406.406 char406 406
+407 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 407 23 true 407 407 407 407.407 407.407 char407 407
+408 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 408 24 true 408 408 408 408.408 408.408 char408 408
+409 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 409 25 true 409 409 409 409.409 409.409 char409 409
+410 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 410 26 true 410 410 410 410.41 410.41 char410 410
+411 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 411 27 true 411 411 411 411.411 411.411 char411 411
+412 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 412 28 true 412 412 412 412.412 412.412 char412 412
+413 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 413 29 true 413 413 413 413.413 413.413 char413 413
+414 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 414 30 true 414 414 414 414.414 414.414 char414 414
+415 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 415 31 true 415 415 415 415.415 415.415 char415 415
+416 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 416 32 true 416 416 416 416.416 416.416 char416 416
+417 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 417 33 true 417 417 417 417.417 417.417 char417 417
+418 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 418 34 true 418 418 418 418.418 418.418 char418 418
+419 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 419 35 true 419 419 419 419.419 419.419 char419 419
+420 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 420 36 true 420 420 420 420.42 420.42 char420 420
+421 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 421 37 true 421 421 421 421.421 421.421 char421 421
+422 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 422 38 true 422 422 422 422.422 422.422 char422 422
+423 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 423 39 true 423 423 423 423.423 423.423 char423 423
+424 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 424 40 true 424 424 424 424.424 424.424 char424 424
+425 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 425 41 true 425 425 425 425.425 425.425 char425 425
+426 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 426 42 true 426 426 426 426.426 426.426 char426 426
+427 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 427 43 true 427 427 427 427.427 427.427 char427 427
+428 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 428 44 true 428 428 428 428.428 428.428 char428 428
+429 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 429 45 true 429 429 429 429.429 429.429 char429 429
+430 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 430 46 true 430 430 430 430.43 430.43 char430 430
+431 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 431 47 true 431 431 431 431.431 431.431 char431 431
+432 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 432 48 true 432 432 432 432.432 432.432 char432 432
+433 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 433 49 true 433 433 433 433.433 433.433 char433 433
+434 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 434 50 true 434 434 434 434.434 434.434 char434 434
+435 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 435 51 true 435 435 435 435.435 435.435 char435 435
+436 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 436 52 true 436 436 436 436.436 436.436 char436 436
+437 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 437 53 true 437 437 437 437.437 437.437 char437 437
+438 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 438 54 true 438 438 438 438.438 438.438 char438 438
+439 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 439 55 true 439 439 439 439.439 439.439 char439 439
+440 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 440 56 true 440 440 440 440.44 440.44 char440 440
+441 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 441 57 true 441 441 441 441.441 441.441 char441 441
+442 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 442 58 true 442 442 442 442.442 442.442 char442 442
+443 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 443 59 true 443 443 443 443.443 443.443 char443 443
+444 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 444 60 true 444 444 444 444.444 444.444 char444 444
+445 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 445 61 true 445 445 445 445.445 445.445 char445 445
+446 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 446 62 true 446 446 446 446.446 446.446 char446 446
+447 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 447 63 true 447 447 447 447.447 447.447 char447 447
+448 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 448 64 true 448 448 448 448.448 448.448 char448 448
+449 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 449 65 true 449 449 449 449.449 449.449 char449 449
+450 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 450 66 true 450 450 450 450.45 450.45 char450 450
+451 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 451 67 true 451 451 451 451.451 451.451 char451 451
+452 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 452 68 true 452 452 452 452.452 452.452 char452 452
+453 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 453 69 true 453 453 453 453.453 453.453 char453 453
+454 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 454 70 true 454 454 454 454.454 454.454 char454 454
+455 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 455 71 true 455 455 455 455.455 455.455 char455 455
+456 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 456 72 true 456 456 456 456.456 456.456 char456 456
+457 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 457 73 true 457 457 457 457.457 457.457 char457 457
+458 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 458 74 true 458 458 458 458.458 458.458 char458 458
+459 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 459 75 true 459 459 459 459.459 459.459 char459 459
+460 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 460 76 true 460 460 460 460.46 460.46 char460 460
+461 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 461 77 true 461 461 461 461.461 461.461 char461 461
+462 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 462 78 true 462 462 462 462.462 462.462 char462 462
+463 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 463 79 true 463 463 463 463.463 463.463 char463 463
+464 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 464 80 true 464 464 464 464.464 464.464 char464 464
+465 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 465 81 true 465 465 465 465.465 465.465 char465 465
+466 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 466 82 true 466 466 466 466.466 466.466 char466 466
+467 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 467 83 true 467 467 467 467.467 467.467 char467 467
+468 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 468 84 true 468 468 468 468.468 468.468 char468 468
+469 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 469 85 true 469 469 469 469.469 469.469 char469 469
+470 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 470 86 true 470 470 470 470.47 470.47 char470 470
+471 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 471 87 true 471 471 471 471.471 471.471 char471 471
+472 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 472 88 true 472 472 472 472.472 472.472 char472 472
+473 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 473 89 true 473 473 473 473.473 473.473 char473 473
+474 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 474 90 true 474 474 474 474.474 474.474 char474 474
+475 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 475 91 true 475 475 475 475.475 475.475 char475 475
+476 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 476 92 true 476 476 476 476.476 476.476 char476 476
+477 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 477 93 true 477 477 477 477.477 477.477 char477 477
+478 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 478 94 true 478 478 478 478.478 478.478 char478 478
+479 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 479 95 true 479 479 479 479.479 479.479 char479 479
+480 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 480 96 true 480 480 480 480.48 480.48 char480 480
+481 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 481 97 true 481 481 481 481.481 481.481 char481 481
+482 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 482 98 true 482 482 482 482.482 482.482 char482 482
+483 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 483 99 true 483 483 483 483.483 483.483 char483 483
+484 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 484 100 true 484 484 484 484.484 484.484 char484 484
+485 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 485 101 true 485 485 485 485.485 485.485 char485 485
+486 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 486 102 true 486 486 486 486.486 486.486 char486 486
+487 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 487 103 true 487 487 487 487.487 487.487 char487 487
+488 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 488 104 true 488 488 488 488.488 488.488 char488 488
+489 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 489 105 true 489 489 489 489.489 489.489 char489 489
+490 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 490 106 true 490 490 490 490.49 490.49 char490 490
+491 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 491 107 true 491 491 491 491.491 491.491 char491 491
+492 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 492 108 true 492 492 492 492.492 492.492 char492 492
+493 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 493 109 true 493 493 493 493.493 493.493 char493 493
+494 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 494 110 true 494 494 494 494.494 494.494 char494 494
+495 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 495 111 true 495 495 495 495.495 495.495 char495 495
+496 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 496 112 true 496 496 496 496.496 496.496 char496 496
+497 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 497 113 true 497 497 497 497.497 497.497 char497 497
+498 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 498 114 true 498 498 498 498.498 498.498 char498 498
+499 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 499 115 true 499 499 499 499.499 499.499 char499 499
+500 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 500 116 true 500 500 500 500.5 500.5 char500 500
+501 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 501 117 true 501 501 501 501.501 501.501 char501 501
+502 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 502 118 true 502 502 502 502.502 502.502 char502 502
+503 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 503 119 true 503 503 503 503.503 503.503 char503 503
+504 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 504 120 true 504 504 504 504.504 504.504 char504 504
+505 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 505 121 true 505 505 505 505.505 505.505 char505 505
+506 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 506 122 true 506 506 506 506.506 506.506 char506 506
+507 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 507 123 true 507 507 507 507.507 507.507 char507 507
+508 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 508 124 true 508 508 508 508.508 508.508 char508 508
+509 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 509 125 true 509 509 509 509.509 509.509 char509 509
+510 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 510 126 true 510 510 510 510.51 510.51 char510 510
+511 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 511 127 true 511 511 511 511.511 511.511 char511 511
+512 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 512 0 true 512 512 512 512.512 512.512 char512 512
+513 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 513 1 true 513 513 513 513.513 513.513 char513 513
+514 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 514 2 true 514 514 514 514.514 514.514 char514 514
+515 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 515 3 true 515 515 515 515.515 515.515 char515 515
+516 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 516 4 true 516 516 516 516.516 516.516 char516 516
+517 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 517 5 true 517 517 517 517.517 517.517 char517 517
+518 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 518 6 true 518 518 518 518.518 518.518 char518 518
+519 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 519 7 true 519 519 519 519.519 519.519 char519 519
+520 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 520 8 true 520 520 520 520.52 520.52 char520 520
+521 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 521 9 true 521 521 521 521.521 521.521 char521 521
+522 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 522 10 true 522 522 522 522.522 522.522 char522 522
+523 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 523 11 true 523 523 523 523.523 523.523 char523 523
+524 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 524 12 true 524 524 524 524.524 524.524 char524 524
+525 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 525 13 true 525 525 525 525.525 525.525 char525 525
+526 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 526 14 true 526 526 526 526.526 526.526 char526 526
+527 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 527 15 true 527 527 527 527.527 527.527 char527 527
+528 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 528 16 true 528 528 528 528.528 528.528 char528 528
+529 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 529 17 true 529 529 529 529.529 529.529 char529 529
+530 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 530 18 true 530 530 530 530.53 530.53 char530 530
+531 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 531 19 true 531 531 531 531.531 531.531 char531 531
+532 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 532 20 true 532 532 532 532.532 532.532 char532 532
+533 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 533 21 true 533 533 533 533.533 533.533 char533 533
+534 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 534 22 true 534 534 534 534.534 534.534 char534 534
+535 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 535 23 true 535 535 535 535.535 535.535 char535 535
+536 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 536 24 true 536 536 536 536.536 536.536 char536 536
+537 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 537 25 true 537 537 537 537.537 537.537 char537 537
+538 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 538 26 true 538 538 538 538.538 538.538 char538 538
+539 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 539 27 true 539 539 539 539.539 539.539 char539 539
+540 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 540 28 true 540 540 540 540.54 540.54 char540 540
+541 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 541 29 true 541 541 541 541.541 541.541 char541 541
+542 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 542 30 true 542 542 542 542.542 542.542 char542 542
+543 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 543 31 true 543 543 543 543.543 543.543 char543 543
+544 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 544 32 true 544 544 544 544.544 544.544 char544 544
+545 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 545 33 true 545 545 545 545.545 545.545 char545 545
+546 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 546 34 true 546 546 546 546.546 546.546 char546 546
+547 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 547 35 true 547 547 547 547.547 547.547 char547 547
+548 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 548 36 true 548 548 548 548.548 548.548 char548 548
+549 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 549 37 true 549 549 549 549.549 549.549 char549 549
+550 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 550 38 true 550 550 550 550.55 550.55 char550 550
+551 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 551 39 true 551 551 551 551.551 551.551 char551 551
+552 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 552 40 true 552 552 552 552.552 552.552 char552 552
+553 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 553 41 true 553 553 553 553.553 553.553 char553 553
+554 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 554 42 true 554 554 554 554.554 554.554 char554 554
+555 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 555 43 true 555 555 555 555.555 555.555 char555 555
+556 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 556 44 true 556 556 556 556.556 556.556 char556 556
+557 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 557 45 true 557 557 557 557.557 557.557 char557 557
+558 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 558 46 true 558 558 558 558.558 558.558 char558 558
+559 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 559 47 true 559 559 559 559.559 559.559 char559 559
+560 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 560 48 true 560 560 560 560.56 560.56 char560 560
+561 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 561 49 true 561 561 561 561.561 561.561 char561 561
+562 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 562 50 true 562 562 562 562.562 562.562 char562 562
+563 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 563 51 true 563 563 563 563.563 563.563 char563 563
+564 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 564 52 true 564 564 564 564.564 564.564 char564 564
+565 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 565 53 true 565 565 565 565.565 565.565 char565 565
+566 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 566 54 true 566 566 566 566.566 566.566 char566 566
+567 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 567 55 true 567 567 567 567.567 567.567 char567 567
+568 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 568 56 true 568 568 568 568.568 568.568 char568 568
+569 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 569 57 true 569 569 569 569.569 569.569 char569 569
+570 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 570 58 true 570 570 570 570.57 570.57 char570 570
+571 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 571 59 true 571 571 571 571.571 571.571 char571 571
+572 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 572 60 true 572 572 572 572.572 572.572 char572 572
+573 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 573 61 true 573 573 573 573.573 573.573 char573 573
+574 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 574 62 true 574 574 574 574.574 574.574 char574 574
+575 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 575 63 true 575 575 575 575.575 575.575 char575 575
+576 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 576 64 true 576 576 576 576.576 576.576 char576 576
+577 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 577 65 true 577 577 577 577.577 577.577 char577 577
+578 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 578 66 true 578 578 578 578.578 578.578 char578 578
+579 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 579 67 true 579 579 579 579.579 579.579 char579 579
+580 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 580 68 true 580 580 580 580.58 580.58 char580 580
+581 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 581 69 true 581 581 581 581.581 581.581 char581 581
+582 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 582 70 true 582 582 582 582.582 582.582 char582 582
+583 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 583 71 true 583 583 583 583.583 583.583 char583 583
+584 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 584 72 true 584 584 584 584.584 584.584 char584 584
+585 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 585 73 true 585 585 585 585.585 585.585 char585 585
+586 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 586 74 true 586 586 586 586.586 586.586 char586 586
+587 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 587 75 true 587 587 587 587.587 587.587 char587 587
+588 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 588 76 true 588 588 588 588.588 588.588 char588 588
+589 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 589 77 true 589 589 589 589.589 589.589 char589 589
+590 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 590 78 true 590 590 590 590.59 590.59 char590 590
+591 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 591 79 true 591 591 591 591.591 591.591 char591 591
+592 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 592 80 true 592 592 592 592.592 592.592 char592 592
+593 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 593 81 true 593 593 593 593.593 593.593 char593 593
+594 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 594 82 true 594 594 594 594.594 594.594 char594 594
+595 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 595 83 true 595 595 595 595.595 595.595 char595 595
+596 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 596 84 true 596 596 596 596.596 596.596 char596 596
+597 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 597 85 true 597 597 597 597.597 597.597 char597 597
+598 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 598 86 true 598 598 598 598.598 598.598 char598 598
+599 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 599 87 true 599 599 599 599.599 599.599 char599 599
+600 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 600 88 true 600 600 600 600.6 600.6 char600 600
+601 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 601 89 true 601 601 601 601.601 601.601 char601 601
+602 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 602 90 true 602 602 602 602.602 602.602 char602 602
+603 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 603 91 true 603 603 603 603.603 603.603 char603 603
+604 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 604 92 true 604 604 604 604.604 604.604 char604 604
+605 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 605 93 true 605 605 605 605.605 605.605 char605 605
+606 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 606 94 true 606 606 606 606.606 606.606 char606 606
+607 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 607 95 true 607 607 607 607.607 607.607 char607 607
+608 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 608 96 true 608 608 608 608.608 608.608 char608 608
+609 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 609 97 true 609 609 609 609.609 609.609 char609 609
+610 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 610 98 true 610 610 610 610.61 610.61 char610 610
+611 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 611 99 true 611 611 611 611.611 611.611 char611 611
+612 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 612 100 true 612 612 612 612.612 612.612 char612 612
+613 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 613 101 true 613 613 613 613.613 613.613 char613 613
+614 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 614 102 true 614 614 614 614.614 614.614 char614 614
+615 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 615 103 true 615 615 615 615.615 615.615 char615 615
+616 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 616 104 true 616 616 616 616.616 616.616 char616 616
+617 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 617 105 true 617 617 617 617.617 617.617 char617 617
+618 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 618 106 true 618 618 618 618.618 618.618 char618 618
+619 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 619 107 true 619 619 619 619.619 619.619 char619 619
+620 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 620 108 true 620 620 620 620.62 620.62 char620 620
+621 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 621 109 true 621 621 621 621.621 621.621 char621 621
+622 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 622 110 true 622 622 622 622.622 622.622 char622 622
+623 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 623 111 true 623 623 623 623.623 623.623 char623 623
+624 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 624 112 true 624 624 624 624.624 624.624 char624 624
+625 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 625 113 true 625 625 625 625.625 625.625 char625 625
+626 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 626 114 true 626 626 626 626.626 626.626 char626 626
+627 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 627 115 true 627 627 627 627.627 627.627 char627 627
+628 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 628 116 true 628 628 628 628.628 628.628 char628 628
+629 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 629 117 true 629 629 629 629.629 629.629 char629 629
+630 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 630 118 true 630 630 630 630.63 630.63 char630 630
+631 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 631 119 true 631 631 631 631.631 631.631 char631 631
+632 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 632 120 true 632 632 632 632.632 632.632 char632 632
+633 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 633 121 true 633 633 633 633.633 633.633 char633 633
+634 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 634 122 true 634 634 634 634.634 634.634 char634 634
+635 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 635 123 true 635 635 635 635.635 635.635 char635 635
+636 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 636 124 true 636 636 636 636.636 636.636 char636 636
+637 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 637 125 true 637 637 637 637.637 637.637 char637 637
+638 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 638 126 true 638 638 638 638.638 638.638 char638 638
+639 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 639 127 true 639 639 639 639.639 639.639 char639 639
+640 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 640 0 true 640 640 640 640.64 640.64 char640 640
+641 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 641 1 true 641 641 641 641.641 641.641 char641 641
+642 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 642 2 true 642 642 642 642.642 642.642 char642 642
+643 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 643 3 true 643 643 643 643.643 643.643 char643 643
+644 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 644 4 true 644 644 644 644.644 644.644 char644 644
+645 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 645 5 true 645 645 645 645.645 645.645 char645 645
+646 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 646 6 true 646 646 646 646.646 646.646 char646 646
+647 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 647 7 true 647 647 647 647.647 647.647 char647 647
+648 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 648 8 true 648 648 648 648.648 648.648 char648 648
+649 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 649 9 true 649 649 649 649.649 649.649 char649 649
+650 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 650 10 true 650 650 650 650.65 650.65 char650 650
+651 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 651 11 true 651 651 651 651.651 651.651 char651 651
+652 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 652 12 true 652 652 652 652.652 652.652 char652 652
+653 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 653 13 true 653 653 653 653.653 653.653 char653 653
+654 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 654 14 true 654 654 654 654.654 654.654 char654 654
+655 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 655 15 true 655 655 655 655.655 655.655 char655 655
+656 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 656 16 true 656 656 656 656.656 656.656 char656 656
+657 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 657 17 true 657 657 657 657.657 657.657 char657 657
+658 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 658 18 true 658 658 658 658.658 658.658 char658 658
+659 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 659 19 true 659 659 659 659.659 659.659 char659 659
+660 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 660 20 true 660 660 660 660.66 660.66 char660 660
+661 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 661 21 true 661 661 661 661.661 661.661 char661 661
+662 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 662 22 true 662 662 662 662.662 662.662 char662 662
+663 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 663 23 true 663 663 663 663.663 663.663 char663 663
+664 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 664 24 true 664 664 664 664.664 664.664 char664 664
+665 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 665 25 true 665 665 665 665.665 665.665 char665 665
+666 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 666 26 true 666 666 666 666.666 666.666 char666 666
+667 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 667 27 true 667 667 667 667.667 667.667 char667 667
+668 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 668 28 true 668 668 668 668.668 668.668 char668 668
+669 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 669 29 true 669 669 669 669.669 669.669 char669 669
+670 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 670 30 true 670 670 670 670.67 670.67 char670 670
+671 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 671 31 true 671 671 671 671.671 671.671 char671 671
+672 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 672 32 true 672 672 672 672.672 672.672 char672 672
+673 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 673 33 true 673 673 673 673.673 673.673 char673 673
+674 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 674 34 true 674 674 674 674.674 674.674 char674 674
+675 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 675 35 true 675 675 675 675.675 675.675 char675 675
+676 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 676 36 true 676 676 676 676.676 676.676 char676 676
+677 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 677 37 true 677 677 677 677.677 677.677 char677 677
+678 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 678 38 true 678 678 678 678.678 678.678 char678 678
+679 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 679 39 true 679 679 679 679.679 679.679 char679 679
+680 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 680 40 true 680 680 680 680.68 680.68 char680 680
+681 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 681 41 true 681 681 681 681.681 681.681 char681 681
+682 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 682 42 true 682 682 682 682.682 682.682 char682 682
+683 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 683 43 true 683 683 683 683.683 683.683 char683 683
+684 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 684 44 true 684 684 684 684.684 684.684 char684 684
+685 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 685 45 true 685 685 685 685.685 685.685 char685 685
+686 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 686 46 true 686 686 686 686.686 686.686 char686 686
+687 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 687 47 true 687 687 687 687.687 687.687 char687 687
+688 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 688 48 true 688 688 688 688.688 688.688 char688 688
+689 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 689 49 true 689 689 689 689.689 689.689 char689 689
+690 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 690 50 true 690 690 690 690.69 690.69 char690 690
+691 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 691 51 true 691 691 691 691.691 691.691 char691 691
+692 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 692 52 true 692 692 692 692.692 692.692 char692 692
+693 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 693 53 true 693 693 693 693.693 693.693 char693 693
+694 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 694 54 true 694 694 694 694.694 694.694 char694 694
+695 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 695 55 true 695 695 695 695.695 695.695 char695 695
+696 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 696 56 true 696 696 696 696.696 696.696 char696 696
+697 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 697 57 true 697 697 697 697.697 697.697 char697 697
+698 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 698 58 true 698 698 698 698.698 698.698 char698 698
+699 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 699 59 true 699 699 699 699.699 699.699 char699 699
+700 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 700 60 true 700 700 700 700.7 700.7 char700 700
+701 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 701 61 true 701 701 701 701.701 701.701 char701 701
+702 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 702 62 true 702 702 702 702.702 702.702 char702 702
+703 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 703 63 true 703 703 703 703.703 703.703 char703 703
+704 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 704 64 true 704 704 704 704.704 704.704 char704 704
+705 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 705 65 true 705 705 705 705.705 705.705 char705 705
+706 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 706 66 true 706 706 706 706.706 706.706 char706 706
+707 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 707 67 true 707 707 707 707.707 707.707 char707 707
+708 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 708 68 true 708 708 708 708.708 708.708 char708 708
+709 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 709 69 true 709 709 709 709.709 709.709 char709 709
+710 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 710 70 true 710 710 710 710.71 710.71 char710 710
+711 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 711 71 true 711 711 711 711.711 711.711 char711 711
+712 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 712 72 true 712 712 712 712.712 712.712 char712 712
+713 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 713 73 true 713 713 713 713.713 713.713 char713 713
+714 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 714 74 true 714 714 714 714.714 714.714 char714 714
+715 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 715 75 true 715 715 715 715.715 715.715 char715 715
+716 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 716 76 true 716 716 716 716.716 716.716 char716 716
+717 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 717 77 true 717 717 717 717.717 717.717 char717 717
+718 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 718 78 true 718 718 718 718.718 718.718 char718 718
+719 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 719 79 true 719 719 719 719.719 719.719 char719 719
+720 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 720 80 true 720 720 720 720.72 720.72 char720 720
+721 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 721 81 true 721 721 721 721.721 721.721 char721 721
+722 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 722 82 true 722 722 722 722.722 722.722 char722 722
+723 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 723 83 true 723 723 723 723.723 723.723 char723 723
+724 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 724 84 true 724 724 724 724.724 724.724 char724 724
+725 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 725 85 true 725 725 725 725.725 725.725 char725 725
+726 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 726 86 true 726 726 726 726.726 726.726 char726 726
+727 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 727 87 true 727 727 727 727.727 727.727 char727 727
+728 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 728 88 true 728 728 728 728.728 728.728 char728 728
+729 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 729 89 true 729 729 729 729.729 729.729 char729 729
+730 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 730 90 true 730 730 730 730.73 730.73 char730 730
+731 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 731 91 true 731 731 731 731.731 731.731 char731 731
+732 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 732 92 true 732 732 732 732.732 732.732 char732 732
+733 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 733 93 true 733 733 733 733.733 733.733 char733 733
+734 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 734 94 true 734 734 734 734.734 734.734 char734 734
+735 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 735 95 true 735 735 735 735.735 735.735 char735 735
+736 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 736 96 true 736 736 736 736.736 736.736 char736 736
+737 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 737 97 true 737 737 737 737.737 737.737 char737 737
+738 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 738 98 true 738 738 738 738.738 738.738 char738 738
+739 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 739 99 true 739 739 739 739.739 739.739 char739 739
+740 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 740 100 true 740 740 740 740.74 740.74 char740 740
+741 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 741 101 true 741 741 741 741.741 741.741 char741 741
+742 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 742 102 true 742 742 742 742.742 742.742 char742 742
+743 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 743 103 true 743 743 743 743.743 743.743 char743 743
+744 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 744 104 true 744 744 744 744.744 744.744 char744 744
+745 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 745 105 true 745 745 745 745.745 745.745 char745 745
+746 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 746 106 true 746 746 746 746.746 746.746 char746 746
+747 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 747 107 true 747 747 747 747.747 747.747 char747 747
+748 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 748 108 true 748 748 748 748.748 748.748 char748 748
+749 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 749 109 true 749 749 749 749.749 749.749 char749 749
+750 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 750 110 true 750 750 750 750.75 750.75 char750 750
+751 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 751 111 true 751 751 751 751.751 751.751 char751 751
+752 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 752 112 true 752 752 752 752.752 752.752 char752 752
+753 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 753 113 true 753 753 753 753.753 753.753 char753 753
+754 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 754 114 true 754 754 754 754.754 754.754 char754 754
+755 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 755 115 true 755 755 755 755.755 755.755 char755 755
+756 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 756 116 true 756 756 756 756.756 756.756 char756 756
+757 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 757 117 true 757 757 757 757.757 757.757 char757 757
+758 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 758 118 true 758 758 758 758.758 758.758 char758 758
+759 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 759 119 true 759 759 759 759.759 759.759 char759 759
+760 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 760 120 true 760 760 760 760.76 760.76 char760 760
+761 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 761 121 true 761 761 761 761.761 761.761 char761 761
+762 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 762 122 true 762 762 762 762.762 762.762 char762 762
+763 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 763 123 true 763 763 763 763.763 763.763 char763 763
+764 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 764 124 true 764 764 764 764.764 764.764 char764 764
+765 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 765 125 true 765 765 765 765.765 765.765 char765 765
+766 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 766 126 true 766 766 766 766.766 766.766 char766 766
+767 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 767 127 true 767 767 767 767.767 767.767 char767 767
+768 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 768 0 true 768 768 768 768.768 768.768 char768 768
+769 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 769 1 true 769 769 769 769.769 769.769 char769 769
+770 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 770 2 true 770 770 770 770.77 770.77 char770 770
+771 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 771 3 true 771 771 771 771.771 771.771 char771 771
+772 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 772 4 true 772 772 772 772.772 772.772 char772 772
+773 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 773 5 true 773 773 773 773.773 773.773 char773 773
+774 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 774 6 true 774 774 774 774.774 774.774 char774 774
+775 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 775 7 true 775 775 775 775.775 775.775 char775 775
+776 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 776 8 true 776 776 776 776.776 776.776 char776 776
+777 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 777 9 true 777 777 777 777.777 777.777 char777 777
+778 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 778 10 true 778 778 778 778.778 778.778 char778 778
+779 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 779 11 true 779 779 779 779.779 779.779 char779 779
+780 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 780 12 true 780 780 780 780.78 780.78 char780 780
+781 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 781 13 true 781 781 781 781.781 781.781 char781 781
+782 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 782 14 true 782 782 782 782.782 782.782 char782 782
+783 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 783 15 true 783 783 783 783.783 783.783 char783 783
+784 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 784 16 true 784 784 784 784.784 784.784 char784 784
+785 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 785 17 true 785 785 785 785.785 785.785 char785 785
+786 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 786 18 true 786 786 786 786.786 786.786 char786 786
+787 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 787 19 true 787 787 787 787.787 787.787 char787 787
+788 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 788 20 true 788 788 788 788.788 788.788 char788 788
+789 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 789 21 true 789 789 789 789.789 789.789 char789 789
+790 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 790 22 true 790 790 790 790.79 790.79 char790 790
+791 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 791 23 true 791 791 791 791.791 791.791 char791 791
+792 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 792 24 true 792 792 792 792.792 792.792 char792 792
+793 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 793 25 true 793 793 793 793.793 793.793 char793 793
+794 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 794 26 true 794 794 794 794.794 794.794 char794 794
+795 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 795 27 true 795 795 795 795.795 795.795 char795 795
+796 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 796 28 true 796 796 796 796.796 796.796 char796 796
+797 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 797 29 true 797 797 797 797.797 797.797 char797 797
+798 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 798 30 true 798 798 798 798.798 798.798 char798 798
+799 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 799 31 true 799 799 799 799.799 799.799 char799 799
+800 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 800 32 true 800 800 800 800.8 800.8 char800 800
+801 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 801 33 true 801 801 801 801.801 801.801 char801 801
+802 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 802 34 true 802 802 802 802.802 802.802 char802 802
+803 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 803 35 true 803 803 803 803.803 803.803 char803 803
+804 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 804 36 true 804 804 804 804.804 804.804 char804 804
+805 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 805 37 true 805 805 805 805.805 805.805 char805 805
+806 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 806 38 true 806 806 806 806.806 806.806 char806 806
+807 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 807 39 true 807 807 807 807.807 807.807 char807 807
+808 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 808 40 true 808 808 808 808.808 808.808 char808 808
+809 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 809 41 true 809 809 809 809.809 809.809 char809 809
+810 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 810 42 true 810 810 810 810.81 810.81 char810 810
+811 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 811 43 true 811 811 811 811.811 811.811 char811 811
+812 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 812 44 true 812 812 812 812.812 812.812 char812 812
+813 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 813 45 true 813 813 813 813.813 813.813 char813 813
+814 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 814 46 true 814 814 814 814.814 814.814 char814 814
+815 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 815 47 true 815 815 815 815.815 815.815 char815 815
+816 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 816 48 true 816 816 816 816.816 816.816 char816 816
+817 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 817 49 true 817 817 817 817.817 817.817 char817 817
+818 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 818 50 true 818 818 818 818.818 818.818 char818 818
+819 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 819 51 true 819 819 819 819.819 819.819 char819 819
+820 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 820 52 true 820 820 820 820.82 820.82 char820 820
+821 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 821 53 true 821 821 821 821.821 821.821 char821 821
+822 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 822 54 true 822 822 822 822.822 822.822 char822 822
+823 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 823 55 true 823 823 823 823.823 823.823 char823 823
+824 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 824 56 true 824 824 824 824.824 824.824 char824 824
+825 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 825 57 true 825 825 825 825.825 825.825 char825 825
+826 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 826 58 true 826 826 826 826.826 826.826 char826 826
+827 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 827 59 true 827 827 827 827.827 827.827 char827 827
+828 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 828 60 true 828 828 828 828.828 828.828 char828 828
+829 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 829 61 true 829 829 829 829.829 829.829 char829 829
+830 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 830 62 true 830 830 830 830.83 830.83 char830 830
+831 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 831 63 true 831 831 831 831.831 831.831 char831 831
+832 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 832 64 true 832 832 832 832.832 832.832 char832 832
+833 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 833 65 true 833 833 833 833.833 833.833 char833 833
+834 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 834 66 true 834 834 834 834.834 834.834 char834 834
+835 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 835 67 true 835 835 835 835.835 835.835 char835 835
+836 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 836 68 true 836 836 836 836.836 836.836 char836 836
+837 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 837 69 true 837 837 837 837.837 837.837 char837 837
+838 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 838 70 true 838 838 838 838.838 838.838 char838 838
+839 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 839 71 true 839 839 839 839.839 839.839 char839 839
+840 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 840 72 true 840 840 840 840.84 840.84 char840 840
+841 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 841 73 true 841 841 841 841.841 841.841 char841 841
+842 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 842 74 true 842 842 842 842.842 842.842 char842 842
+843 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 843 75 true 843 843 843 843.843 843.843 char843 843
+844 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 844 76 true 844 844 844 844.844 844.844 char844 844
+845 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 845 77 true 845 845 845 845.845 845.845 char845 845
+846 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 846 78 true 846 846 846 846.846 846.846 char846 846
+847 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 847 79 true 847 847 847 847.847 847.847 char847 847
+848 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 848 80 true 848 848 848 848.848 848.848 char848 848
+849 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 849 81 true 849 849 849 849.849 849.849 char849 849
+850 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 850 82 true 850 850 850 850.85 850.85 char850 850
+851 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 851 83 true 851 851 851 851.851 851.851 char851 851
+852 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 852 84 true 852 852 852 852.852 852.852 char852 852
+853 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 853 85 true 853 853 853 853.853 853.853 char853 853
+854 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 854 86 true 854 854 854 854.854 854.854 char854 854
+855 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 855 87 true 855 855 855 855.855 855.855 char855 855
+856 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 856 88 true 856 856 856 856.856 856.856 char856 856
+857 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 857 89 true 857 857 857 857.857 857.857 char857 857
+858 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 858 90 true 858 858 858 858.858 858.858 char858 858
+859 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 859 91 true 859 859 859 859.859 859.859 char859 859
+860 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 860 92 true 860 860 860 860.86 860.86 char860 860
+861 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 861 93 true 861 861 861 861.861 861.861 char861 861
+862 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 862 94 true 862 862 862 862.862 862.862 char862 862
+863 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 863 95 true 863 863 863 863.863 863.863 char863 863
+864 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 864 96 true 864 864 864 864.864 864.864 char864 864
+865 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 865 97 true 865 865 865 865.865 865.865 char865 865
+866 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 866 98 true 866 866 866 866.866 866.866 char866 866
+867 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 867 99 true 867 867 867 867.867 867.867 char867 867
+868 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 868 100 true 868 868 868 868.868 868.868 char868 868
+869 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 869 101 true 869 869 869 869.869 869.869 char869 869
+870 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 870 102 true 870 870 870 870.87 870.87 char870 870
+871 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 871 103 true 871 871 871 871.871 871.871 char871 871
+872 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 872 104 true 872 872 872 872.872 872.872 char872 872
+873 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 873 105 true 873 873 873 873.873 873.873 char873 873
+874 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 874 106 true 874 874 874 874.874 874.874 char874 874
+875 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 875 107 true 875 875 875 875.875 875.875 char875 875
+876 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 876 108 true 876 876 876 876.876 876.876 char876 876
+877 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 877 109 true 877 877 877 877.877 877.877 char877 877
+878 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 878 110 true 878 878 878 878.878 878.878 char878 878
+879 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 879 111 true 879 879 879 879.879 879.879 char879 879
+880 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 880 112 true 880 880 880 880.88 880.88 char880 880
+881 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 881 113 true 881 881 881 881.881 881.881 char881 881
+882 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 882 114 true 882 882 882 882.882 882.882 char882 882
+883 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 883 115 true 883 883 883 883.883 883.883 char883 883
+884 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 884 116 true 884 884 884 884.884 884.884 char884 884
+885 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 885 117 true 885 885 885 885.885 885.885 char885 885
+886 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 886 118 true 886 886 886 886.886 886.886 char886 886
+887 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 887 119 true 887 887 887 887.887 887.887 char887 887
+888 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 888 120 true 888 888 888 888.888 888.888 char888 888
+889 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 889 121 true 889 889 889 889.889 889.889 char889 889
+890 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 890 122 true 890 890 890 890.89 890.89 char890 890
+891 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 891 123 true 891 891 891 891.891 891.891 char891 891
+892 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 892 124 true 892 892 892 892.892 892.892 char892 892
+893 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 893 125 true 893 893 893 893.893 893.893 char893 893
+894 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 894 126 true 894 894 894 894.894 894.894 char894 894
+895 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 895 127 true 895 895 895 895.895 895.895 char895 895
+896 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 896 0 true 896 896 896 896.896 896.896 char896 896
+897 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 897 1 true 897 897 897 897.897 897.897 char897 897
+898 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 898 2 true 898 898 898 898.898 898.898 char898 898
+899 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 899 3 true 899 899 899 899.899 899.899 char899 899
+900 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 900 4 true 900 900 900 900.9 900.9 char900 900
+901 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 901 5 true 901 901 901 901.901 901.901 char901 901
+902 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 902 6 true 902 902 902 902.902 902.902 char902 902
+903 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 903 7 true 903 903 903 903.903 903.903 char903 903
+904 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 904 8 true 904 904 904 904.904 904.904 char904 904
+905 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 905 9 true 905 905 905 905.905 905.905 char905 905
+906 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 906 10 true 906 906 906 906.906 906.906 char906 906
+907 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 907 11 true 907 907 907 907.907 907.907 char907 907
+908 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 908 12 true 908 908 908 908.908 908.908 char908 908
+909 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 909 13 true 909 909 909 909.909 909.909 char909 909
+910 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 910 14 true 910 910 910 910.91 910.91 char910 910
+911 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 911 15 true 911 911 911 911.911 911.911 char911 911
+912 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 912 16 true 912 912 912 912.912 912.912 char912 912
+913 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 913 17 true 913 913 913 913.913 913.913 char913 913
+914 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 914 18 true 914 914 914 914.914 914.914 char914 914
+915 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 915 19 true 915 915 915 915.915 915.915 char915 915
+916 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 916 20 true 916 916 916 916.916 916.916 char916 916
+917 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 917 21 true 917 917 917 917.917 917.917 char917 917
+918 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 918 22 true 918 918 918 918.918 918.918 char918 918
+919 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 919 23 true 919 919 919 919.919 919.919 char919 919
+920 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 920 24 true 920 920 920 920.92 920.92 char920 920
+921 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 921 25 true 921 921 921 921.921 921.921 char921 921
+922 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 922 26 true 922 922 922 922.922 922.922 char922 922
+923 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 923 27 true 923 923 923 923.923 923.923 char923 923
+924 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 924 28 true 924 924 924 924.924 924.924 char924 924
+925 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 925 29 true 925 925 925 925.925 925.925 char925 925
+926 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 926 30 true 926 926 926 926.926 926.926 char926 926
+927 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 927 31 true 927 927 927 927.927 927.927 char927 927
+928 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 928 32 true 928 928 928 928.928 928.928 char928 928
+929 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 929 33 true 929 929 929 929.929 929.929 char929 929
+930 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 930 34 true 930 930 930 930.93 930.93 char930 930
+931 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 931 35 true 931 931 931 931.931 931.931 char931 931
+932 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 932 36 true 932 932 932 932.932 932.932 char932 932
+933 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 933 37 true 933 933 933 933.933 933.933 char933 933
+934 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 934 38 true 934 934 934 934.934 934.934 char934 934
+935 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 935 39 true 935 935 935 935.935 935.935 char935 935
+936 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 936 40 true 936 936 936 936.936 936.936 char936 936
+937 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 937 41 true 937 937 937 937.937 937.937 char937 937
+938 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 938 42 true 938 938 938 938.938 938.938 char938 938
+939 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 939 43 true 939 939 939 939.939 939.939 char939 939
+940 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 940 44 true 940 940 940 940.94 940.94 char940 940
+941 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 941 45 true 941 941 941 941.941 941.941 char941 941
+942 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 942 46 true 942 942 942 942.942 942.942 char942 942
+943 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 943 47 true 943 943 943 943.943 943.943 char943 943
+944 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 944 48 true 944 944 944 944.944 944.944 char944 944
+945 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 945 49 true 945 945 945 945.945 945.945 char945 945
+946 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 946 50 true 946 946 946 946.946 946.946 char946 946
+947 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 947 51 true 947 947 947 947.947 947.947 char947 947
+948 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 948 52 true 948 948 948 948.948 948.948 char948 948
+949 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 949 53 true 949 949 949 949.949 949.949 char949 949
+950 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 950 54 true 950 950 950 950.95 950.95 char950 950
+951 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 951 55 true 951 951 951 951.951 951.951 char951 951
+952 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 952 56 true 952 952 952 952.952 952.952 char952 952
+953 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 953 57 true 953 953 953 953.953 953.953 char953 953
+954 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 954 58 true 954 954 954 954.954 954.954 char954 954
+955 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 955 59 true 955 955 955 955.955 955.955 char955 955
+956 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 956 60 true 956 956 956 956.956 956.956 char956 956
+957 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 957 61 true 957 957 957 957.957 957.957 char957 957
+958 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 958 62 true 958 958 958 958.958 958.958 char958 958
+959 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 959 63 true 959 959 959 959.959 959.959 char959 959
+960 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 960 64 true 960 960 960 960.96 960.96 char960 960
+961 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 961 65 true 961 961 961 961.961 961.961 char961 961
+962 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 962 66 true 962 962 962 962.962 962.962 char962 962
+963 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 963 67 true 963 963 963 963.963 963.963 char963 963
+964 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 964 68 true 964 964 964 964.964 964.964 char964 964
+965 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 965 69 true 965 965 965 965.965 965.965 char965 965
+966 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 966 70 true 966 966 966 966.966 966.966 char966 966
+967 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 967 71 true 967 967 967 967.967 967.967 char967 967
+968 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 968 72 true 968 968 968 968.968 968.968 char968 968
+969 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 969 73 true 969 969 969 969.969 969.969 char969 969
+970 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 970 74 true 970 970 970 970.97 970.97 char970 970
+971 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 971 75 true 971 971 971 971.971 971.971 char971 971
+972 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 972 76 true 972 972 972 972.972 972.972 char972 972
+973 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 973 77 true 973 973 973 973.973 973.973 char973 973
+974 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 974 78 true 974 974 974 974.974 974.974 char974 974
+975 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 975 79 true 975 975 975 975.975 975.975 char975 975
+976 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 976 80 true 976 976 976 976.976 976.976 char976 976
+977 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 977 81 true 977 977 977 977.977 977.977 char977 977
+978 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 978 82 true 978 978 978 978.978 978.978 char978 978
+979 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 979 83 true 979 979 979 979.979 979.979 char979 979
+980 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 980 84 true 980 980 980 980.98 980.98 char980 980
+981 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 981 85 true 981 981 981 981.981 981.981 char981 981
+982 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 982 86 true 982 982 982 982.982 982.982 char982 982
+983 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 983 87 true 983 983 983 983.983 983.983 char983 983
+984 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 984 88 true 984 984 984 984.984 984.984 char984 984
+985 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 985 89 true 985 985 985 985.985 985.985 char985 985
+986 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 986 90 true 986 986 986 986.986 986.986 char986 986
+987 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 987 91 true 987 987 987 987.987 987.987 char987 987
+988 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 988 92 true 988 988 988 988.988 988.988 char988 988
+989 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 989 93 true 989 989 989 989.989 989.989 char989 989
+990 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 990 94 true 990 990 990 990.99 990.99 char990 990
+991 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 991 95 true 991 991 991 991.991 991.991 char991 991
+992 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 992 96 true 992 992 992 992.992 992.992 char992 992
+993 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 993 97 true 993 993 993 993.993 993.993 char993 993
+994 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 994 98 true 994 994 994 994.994 994.994 char994 994
+995 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 995 99 true 995 995 995 995.995 995.995 char995 995
+996 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 996 100 true 996 996 996 996.996 996.996 char996 996
+997 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 997 101 true 997 997 997 997.997 997.997 char997 997
+998 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 998 102 true 998 998 998 998.998 998.998 char998 998
+999 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 999 103 true 999 999 999 999.999 999.999 char999 999
+1000 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 \N \N \N \N \N \N \N \N \N \N \N
+
diff --git a/regression-test/data/nereids_p0/outfile/test_outfile_expr.out b/regression-test/data/nereids_p0/outfile/test_outfile_expr.out
new file mode 100644
index 0000000000..1d92f44ee6
--- /dev/null
+++ b/regression-test/data/nereids_p0/outfile/test_outfile_expr.out
@@ -0,0 +1,1003 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !select_default --
+2 2 char1char1char1char1char1char1char1char1char1char1
+3 4 char2char2char2char2char2char2char2char2char2char2
+4 6 char3char3char3char3char3char3char3char3char3char3
+5 8 char4char4char4char4char4char4char4char4char4char4
+6 10 char5char5char5char5char5char5char5char5char5char5
+7 12 char6char6char6char6char6char6char6char6char6char6
+8 14 char7char7char7char7char7char7char7char7char7char7
+9 16 char8char8char8char8char8char8char8char8char8char8
+10 18 char9char9char9char9char9char9char9char9char9char9
+11 20 char10char10char10char10char10char10char10char10char10char10
+12 22 char11char11char11char11char11char11char11char11char11char11
+13 24 char12char12char12char12char12char12char12char12char12char12
+14 26 char13char13char13char13char13char13char13char13char13char13
+15 28 char14char14char14char14char14char14char14char14char14char14
+16 30 char15char15char15char15char15char15char15char15char15char15
+17 32 char16char16char16char16char16char16char16char16char16char16
+18 34 char17char17char17char17char17char17char17char17char17char17
+19 36 char18char18char18char18char18char18char18char18char18char18
+20 38 char19char19char19char19char19char19char19char19char19char19
+21 40 char20char20char20char20char20char20char20char20char20char20
+22 42 char21char21char21char21char21char21char21char21char21char21
+23 44 char22char22char22char22char22char22char22char22char22char22
+24 46 char23char23char23char23char23char23char23char23char23char23
+25 48 char24char24char24char24char24char24char24char24char24char24
+26 50 char25char25char25char25char25char25char25char25char25char25
+27 52 char26char26char26char26char26char26char26char26char26char26
+28 54 char27char27char27char27char27char27char27char27char27char27
+29 56 char28char28char28char28char28char28char28char28char28char28
+30 58 char29char29char29char29char29char29char29char29char29char29
+31 60 char30char30char30char30char30char30char30char30char30char30
+32 62 char31char31char31char31char31char31char31char31char31char31
+33 64 char32char32char32char32char32char32char32char32char32char32
+34 66 char33char33char33char33char33char33char33char33char33char33
+35 68 char34char34char34char34char34char34char34char34char34char34
+36 70 char35char35char35char35char35char35char35char35char35char35
+37 72 char36char36char36char36char36char36char36char36char36char36
+38 74 char37char37char37char37char37char37char37char37char37char37
+39 76 char38char38char38char38char38char38char38char38char38char38
+40 78 char39char39char39char39char39char39char39char39char39char39
+41 80 char40char40char40char40char40char40char40char40char40char40
+42 82 char41char41char41char41char41char41char41char41char41char41
+43 84 char42char42char42char42char42char42char42char42char42char42
+44 86 char43char43char43char43char43char43char43char43char43char43
+45 88 char44char44char44char44char44char44char44char44char44char44
+46 90 char45char45char45char45char45char45char45char45char45char45
+47 92 char46char46char46char46char46char46char46char46char46char46
+48 94 char47char47char47char47char47char47char47char47char47char47
+49 96 char48char48char48char48char48char48char48char48char48char48
+50 98 char49char49char49char49char49char49char49char49char49char49
+51 100 char50char50char50char50char50char50char50char50char50char50
+52 102 char51char51char51char51char51char51char51char51char51char51
+53 104 char52char52char52char52char52char52char52char52char52char52
+54 106 char53char53char53char53char53char53char53char53char53char53
+55 108 char54char54char54char54char54char54char54char54char54char54
+56 110 char55char55char55char55char55char55char55char55char55char55
+57 112 char56char56char56char56char56char56char56char56char56char56
+58 114 char57char57char57char57char57char57char57char57char57char57
+59 116 char58char58char58char58char58char58char58char58char58char58
+60 118 char59char59char59char59char59char59char59char59char59char59
+61 120 char60char60char60char60char60char60char60char60char60char60
+62 122 char61char61char61char61char61char61char61char61char61char61
+63 124 char62char62char62char62char62char62char62char62char62char62
+64 126 char63char63char63char63char63char63char63char63char63char63
+65 128 char64char64char64char64char64char64char64char64char64char64
+66 130 char65char65char65char65char65char65char65char65char65char65
+67 132 char66char66char66char66char66char66char66char66char66char66
+68 134 char67char67char67char67char67char67char67char67char67char67
+69 136 char68char68char68char68char68char68char68char68char68char68
+70 138 char69char69char69char69char69char69char69char69char69char69
+71 140 char70char70char70char70char70char70char70char70char70char70
+72 142 char71char71char71char71char71char71char71char71char71char71
+73 144 char72char72char72char72char72char72char72char72char72char72
+74 146 char73char73char73char73char73char73char73char73char73char73
+75 148 char74char74char74char74char74char74char74char74char74char74
+76 150 char75char75char75char75char75char75char75char75char75char75
+77 152 char76char76char76char76char76char76char76char76char76char76
+78 154 char77char77char77char77char77char77char77char77char77char77
+79 156 char78char78char78char78char78char78char78char78char78char78
+80 158 char79char79char79char79char79char79char79char79char79char79
+81 160 char80char80char80char80char80char80char80char80char80char80
+82 162 char81char81char81char81char81char81char81char81char81char81
+83 164 char82char82char82char82char82char82char82char82char82char82
+84 166 char83char83char83char83char83char83char83char83char83char83
+85 168 char84char84char84char84char84char84char84char84char84char84
+86 170 char85char85char85char85char85char85char85char85char85char85
+87 172 char86char86char86char86char86char86char86char86char86char86
+88 174 char87char87char87char87char87char87char87char87char87char87
+89 176 char88char88char88char88char88char88char88char88char88char88
+90 178 char89char89char89char89char89char89char89char89char89char89
+91 180 char90char90char90char90char90char90char90char90char90char90
+92 182 char91char91char91char91char91char91char91char91char91char91
+93 184 char92char92char92char92char92char92char92char92char92char92
+94 186 char93char93char93char93char93char93char93char93char93char93
+95 188 char94char94char94char94char94char94char94char94char94char94
+96 190 char95char95char95char95char95char95char95char95char95char95
+97 192 char96char96char96char96char96char96char96char96char96char96
+98 194 char97char97char97char97char97char97char97char97char97char97
+99 196 char98char98char98char98char98char98char98char98char98char98
+100 198 char99char99char99char99char99char99char99char99char99char99
+101 200 char100char100char100char100char100char100char100char100char100char100
+102 202 char101char101char101char101char101char101char101char101char101char101
+103 204 char102char102char102char102char102char102char102char102char102char102
+104 206 char103char103char103char103char103char103char103char103char103char103
+105 208 char104char104char104char104char104char104char104char104char104char104
+106 210 char105char105char105char105char105char105char105char105char105char105
+107 212 char106char106char106char106char106char106char106char106char106char106
+108 214 char107char107char107char107char107char107char107char107char107char107
+109 216 char108char108char108char108char108char108char108char108char108char108
+110 218 char109char109char109char109char109char109char109char109char109char109
+111 220 char110char110char110char110char110char110char110char110char110char110
+112 222 char111char111char111char111char111char111char111char111char111char111
+113 224 char112char112char112char112char112char112char112char112char112char112
+114 226 char113char113char113char113char113char113char113char113char113char113
+115 228 char114char114char114char114char114char114char114char114char114char114
+116 230 char115char115char115char115char115char115char115char115char115char115
+117 232 char116char116char116char116char116char116char116char116char116char116
+118 234 char117char117char117char117char117char117char117char117char117char117
+119 236 char118char118char118char118char118char118char118char118char118char118
+120 238 char119char119char119char119char119char119char119char119char119char119
+121 240 char120char120char120char120char120char120char120char120char120char120
+122 242 char121char121char121char121char121char121char121char121char121char121
+123 244 char122char122char122char122char122char122char122char122char122char122
+124 246 char123char123char123char123char123char123char123char123char123char123
+125 248 char124char124char124char124char124char124char124char124char124char124
+126 250 char125char125char125char125char125char125char125char125char125char125
+127 252 char126char126char126char126char126char126char126char126char126char126
+128 254 char127char127char127char127char127char127char127char127char127char127
+129 128 char128char128char128char128char128char128char128char128char128char128
+130 130 char129char129char129char129char129char129char129char129char129char129
+131 132 char130char130char130char130char130char130char130char130char130char130
+132 134 char131char131char131char131char131char131char131char131char131char131
+133 136 char132char132char132char132char132char132char132char132char132char132
+134 138 char133char133char133char133char133char133char133char133char133char133
+135 140 char134char134char134char134char134char134char134char134char134char134
+136 142 char135char135char135char135char135char135char135char135char135char135
+137 144 char136char136char136char136char136char136char136char136char136char136
+138 146 char137char137char137char137char137char137char137char137char137char137
+139 148 char138char138char138char138char138char138char138char138char138char138
+140 150 char139char139char139char139char139char139char139char139char139char139
+141 152 char140char140char140char140char140char140char140char140char140char140
+142 154 char141char141char141char141char141char141char141char141char141char141
+143 156 char142char142char142char142char142char142char142char142char142char142
+144 158 char143char143char143char143char143char143char143char143char143char143
+145 160 char144char144char144char144char144char144char144char144char144char144
+146 162 char145char145char145char145char145char145char145char145char145char145
+147 164 char146char146char146char146char146char146char146char146char146char146
+148 166 char147char147char147char147char147char147char147char147char147char147
+149 168 char148char148char148char148char148char148char148char148char148char148
+150 170 char149char149char149char149char149char149char149char149char149char149
+151 172 char150char150char150char150char150char150char150char150char150char150
+152 174 char151char151char151char151char151char151char151char151char151char151
+153 176 char152char152char152char152char152char152char152char152char152char152
+154 178 char153char153char153char153char153char153char153char153char153char153
+155 180 char154char154char154char154char154char154char154char154char154char154
+156 182 char155char155char155char155char155char155char155char155char155char155
+157 184 char156char156char156char156char156char156char156char156char156char156
+158 186 char157char157char157char157char157char157char157char157char157char157
+159 188 char158char158char158char158char158char158char158char158char158char158
+160 190 char159char159char159char159char159char159char159char159char159char159
+161 192 char160char160char160char160char160char160char160char160char160char160
+162 194 char161char161char161char161char161char161char161char161char161char161
+163 196 char162char162char162char162char162char162char162char162char162char162
+164 198 char163char163char163char163char163char163char163char163char163char163
+165 200 char164char164char164char164char164char164char164char164char164char164
+166 202 char165char165char165char165char165char165char165char165char165char165
+167 204 char166char166char166char166char166char166char166char166char166char166
+168 206 char167char167char167char167char167char167char167char167char167char167
+169 208 char168char168char168char168char168char168char168char168char168char168
+170 210 char169char169char169char169char169char169char169char169char169char169
+171 212 char170char170char170char170char170char170char170char170char170char170
+172 214 char171char171char171char171char171char171char171char171char171char171
+173 216 char172char172char172char172char172char172char172char172char172char172
+174 218 char173char173char173char173char173char173char173char173char173char173
+175 220 char174char174char174char174char174char174char174char174char174char174
+176 222 char175char175char175char175char175char175char175char175char175char175
+177 224 char176char176char176char176char176char176char176char176char176char176
+178 226 char177char177char177char177char177char177char177char177char177char177
+179 228 char178char178char178char178char178char178char178char178char178char178
+180 230 char179char179char179char179char179char179char179char179char179char179
+181 232 char180char180char180char180char180char180char180char180char180char180
+182 234 char181char181char181char181char181char181char181char181char181char181
+183 236 char182char182char182char182char182char182char182char182char182char182
+184 238 char183char183char183char183char183char183char183char183char183char183
+185 240 char184char184char184char184char184char184char184char184char184char184
+186 242 char185char185char185char185char185char185char185char185char185char185
+187 244 char186char186char186char186char186char186char186char186char186char186
+188 246 char187char187char187char187char187char187char187char187char187char187
+189 248 char188char188char188char188char188char188char188char188char188char188
+190 250 char189char189char189char189char189char189char189char189char189char189
+191 252 char190char190char190char190char190char190char190char190char190char190
+192 254 char191char191char191char191char191char191char191char191char191char191
+193 256 char192char192char192char192char192char192char192char192char192char192
+194 258 char193char193char193char193char193char193char193char193char193char193
+195 260 char194char194char194char194char194char194char194char194char194char194
+196 262 char195char195char195char195char195char195char195char195char195char195
+197 264 char196char196char196char196char196char196char196char196char196char196
+198 266 char197char197char197char197char197char197char197char197char197char197
+199 268 char198char198char198char198char198char198char198char198char198char198
+200 270 char199char199char199char199char199char199char199char199char199char199
+201 272 char200char200char200char200char200char200char200char200char200char200
+202 274 char201char201char201char201char201char201char201char201char201char201
+203 276 char202char202char202char202char202char202char202char202char202char202
+204 278 char203char203char203char203char203char203char203char203char203char203
+205 280 char204char204char204char204char204char204char204char204char204char204
+206 282 char205char205char205char205char205char205char205char205char205char205
+207 284 char206char206char206char206char206char206char206char206char206char206
+208 286 char207char207char207char207char207char207char207char207char207char207
+209 288 char208char208char208char208char208char208char208char208char208char208
+210 290 char209char209char209char209char209char209char209char209char209char209
+211 292 char210char210char210char210char210char210char210char210char210char210
+212 294 char211char211char211char211char211char211char211char211char211char211
+213 296 char212char212char212char212char212char212char212char212char212char212
+214 298 char213char213char213char213char213char213char213char213char213char213
+215 300 char214char214char214char214char214char214char214char214char214char214
+216 302 char215char215char215char215char215char215char215char215char215char215
+217 304 char216char216char216char216char216char216char216char216char216char216
+218 306 char217char217char217char217char217char217char217char217char217char217
+219 308 char218char218char218char218char218char218char218char218char218char218
+220 310 char219char219char219char219char219char219char219char219char219char219
+221 312 char220char220char220char220char220char220char220char220char220char220
+222 314 char221char221char221char221char221char221char221char221char221char221
+223 316 char222char222char222char222char222char222char222char222char222char222
+224 318 char223char223char223char223char223char223char223char223char223char223
+225 320 char224char224char224char224char224char224char224char224char224char224
+226 322 char225char225char225char225char225char225char225char225char225char225
+227 324 char226char226char226char226char226char226char226char226char226char226
+228 326 char227char227char227char227char227char227char227char227char227char227
+229 328 char228char228char228char228char228char228char228char228char228char228
+230 330 char229char229char229char229char229char229char229char229char229char229
+231 332 char230char230char230char230char230char230char230char230char230char230
+232 334 char231char231char231char231char231char231char231char231char231char231
+233 336 char232char232char232char232char232char232char232char232char232char232
+234 338 char233char233char233char233char233char233char233char233char233char233
+235 340 char234char234char234char234char234char234char234char234char234char234
+236 342 char235char235char235char235char235char235char235char235char235char235
+237 344 char236char236char236char236char236char236char236char236char236char236
+238 346 char237char237char237char237char237char237char237char237char237char237
+239 348 char238char238char238char238char238char238char238char238char238char238
+240 350 char239char239char239char239char239char239char239char239char239char239
+241 352 char240char240char240char240char240char240char240char240char240char240
+242 354 char241char241char241char241char241char241char241char241char241char241
+243 356 char242char242char242char242char242char242char242char242char242char242
+244 358 char243char243char243char243char243char243char243char243char243char243
+245 360 char244char244char244char244char244char244char244char244char244char244
+246 362 char245char245char245char245char245char245char245char245char245char245
+247 364 char246char246char246char246char246char246char246char246char246char246
+248 366 char247char247char247char247char247char247char247char247char247char247
+249 368 char248char248char248char248char248char248char248char248char248char248
+250 370 char249char249char249char249char249char249char249char249char249char249
+251 372 char250char250char250char250char250char250char250char250char250char250
+252 374 char251char251char251char251char251char251char251char251char251char251
+253 376 char252char252char252char252char252char252char252char252char252char252
+254 378 char253char253char253char253char253char253char253char253char253char253
+255 380 char254char254char254char254char254char254char254char254char254char254
+256 382 char255char255char255char255char255char255char255char255char255char255
+257 256 char256char256char256char256char256char256char256char256char256char256
+258 258 char257char257char257char257char257char257char257char257char257char257
+259 260 char258char258char258char258char258char258char258char258char258char258
+260 262 char259char259char259char259char259char259char259char259char259char259
+261 264 char260char260char260char260char260char260char260char260char260char260
+262 266 char261char261char261char261char261char261char261char261char261char261
+263 268 char262char262char262char262char262char262char262char262char262char262
+264 270 char263char263char263char263char263char263char263char263char263char263
+265 272 char264char264char264char264char264char264char264char264char264char264
+266 274 char265char265char265char265char265char265char265char265char265char265
+267 276 char266char266char266char266char266char266char266char266char266char266
+268 278 char267char267char267char267char267char267char267char267char267char267
+269 280 char268char268char268char268char268char268char268char268char268char268
+270 282 char269char269char269char269char269char269char269char269char269char269
+271 284 char270char270char270char270char270char270char270char270char270char270
+272 286 char271char271char271char271char271char271char271char271char271char271
+273 288 char272char272char272char272char272char272char272char272char272char272
+274 290 char273char273char273char273char273char273char273char273char273char273
+275 292 char274char274char274char274char274char274char274char274char274char274
+276 294 char275char275char275char275char275char275char275char275char275char275
+277 296 char276char276char276char276char276char276char276char276char276char276
+278 298 char277char277char277char277char277char277char277char277char277char277
+279 300 char278char278char278char278char278char278char278char278char278char278
+280 302 char279char279char279char279char279char279char279char279char279char279
+281 304 char280char280char280char280char280char280char280char280char280char280
+282 306 char281char281char281char281char281char281char281char281char281char281
+283 308 char282char282char282char282char282char282char282char282char282char282
+284 310 char283char283char283char283char283char283char283char283char283char283
+285 312 char284char284char284char284char284char284char284char284char284char284
+286 314 char285char285char285char285char285char285char285char285char285char285
+287 316 char286char286char286char286char286char286char286char286char286char286
+288 318 char287char287char287char287char287char287char287char287char287char287
+289 320 char288char288char288char288char288char288char288char288char288char288
+290 322 char289char289char289char289char289char289char289char289char289char289
+291 324 char290char290char290char290char290char290char290char290char290char290
+292 326 char291char291char291char291char291char291char291char291char291char291
+293 328 char292char292char292char292char292char292char292char292char292char292
+294 330 char293char293char293char293char293char293char293char293char293char293
+295 332 char294char294char294char294char294char294char294char294char294char294
+296 334 char295char295char295char295char295char295char295char295char295char295
+297 336 char296char296char296char296char296char296char296char296char296char296
+298 338 char297char297char297char297char297char297char297char297char297char297
+299 340 char298char298char298char298char298char298char298char298char298char298
+300 342 char299char299char299char299char299char299char299char299char299char299
+301 344 char300char300char300char300char300char300char300char300char300char300
+302 346 char301char301char301char301char301char301char301char301char301char301
+303 348 char302char302char302char302char302char302char302char302char302char302
+304 350 char303char303char303char303char303char303char303char303char303char303
+305 352 char304char304char304char304char304char304char304char304char304char304
+306 354 char305char305char305char305char305char305char305char305char305char305
+307 356 char306char306char306char306char306char306char306char306char306char306
+308 358 char307char307char307char307char307char307char307char307char307char307
+309 360 char308char308char308char308char308char308char308char308char308char308
+310 362 char309char309char309char309char309char309char309char309char309char309
+311 364 char310char310char310char310char310char310char310char310char310char310
+312 366 char311char311char311char311char311char311char311char311char311char311
+313 368 char312char312char312char312char312char312char312char312char312char312
+314 370 char313char313char313char313char313char313char313char313char313char313
+315 372 char314char314char314char314char314char314char314char314char314char314
+316 374 char315char315char315char315char315char315char315char315char315char315
+317 376 char316char316char316char316char316char316char316char316char316char316
+318 378 char317char317char317char317char317char317char317char317char317char317
+319 380 char318char318char318char318char318char318char318char318char318char318
+320 382 char319char319char319char319char319char319char319char319char319char319
+321 384 char320char320char320char320char320char320char320char320char320char320
+322 386 char321char321char321char321char321char321char321char321char321char321
+323 388 char322char322char322char322char322char322char322char322char322char322
+324 390 char323char323char323char323char323char323char323char323char323char323
+325 392 char324char324char324char324char324char324char324char324char324char324
+326 394 char325char325char325char325char325char325char325char325char325char325
+327 396 char326char326char326char326char326char326char326char326char326char326
+328 398 char327char327char327char327char327char327char327char327char327char327
+329 400 char328char328char328char328char328char328char328char328char328char328
+330 402 char329char329char329char329char329char329char329char329char329char329
+331 404 char330char330char330char330char330char330char330char330char330char330
+332 406 char331char331char331char331char331char331char331char331char331char331
+333 408 char332char332char332char332char332char332char332char332char332char332
+334 410 char333char333char333char333char333char333char333char333char333char333
+335 412 char334char334char334char334char334char334char334char334char334char334
+336 414 char335char335char335char335char335char335char335char335char335char335
+337 416 char336char336char336char336char336char336char336char336char336char336
+338 418 char337char337char337char337char337char337char337char337char337char337
+339 420 char338char338char338char338char338char338char338char338char338char338
+340 422 char339char339char339char339char339char339char339char339char339char339
+341 424 char340char340char340char340char340char340char340char340char340char340
+342 426 char341char341char341char341char341char341char341char341char341char341
+343 428 char342char342char342char342char342char342char342char342char342char342
+344 430 char343char343char343char343char343char343char343char343char343char343
+345 432 char344char344char344char344char344char344char344char344char344char344
+346 434 char345char345char345char345char345char345char345char345char345char345
+347 436 char346char346char346char346char346char346char346char346char346char346
+348 438 char347char347char347char347char347char347char347char347char347char347
+349 440 char348char348char348char348char348char348char348char348char348char348
+350 442 char349char349char349char349char349char349char349char349char349char349
+351 444 char350char350char350char350char350char350char350char350char350char350
+352 446 char351char351char351char351char351char351char351char351char351char351
+353 448 char352char352char352char352char352char352char352char352char352char352
+354 450 char353char353char353char353char353char353char353char353char353char353
+355 452 char354char354char354char354char354char354char354char354char354char354
+356 454 char355char355char355char355char355char355char355char355char355char355
+357 456 char356char356char356char356char356char356char356char356char356char356
+358 458 char357char357char357char357char357char357char357char357char357char357
+359 460 char358char358char358char358char358char358char358char358char358char358
+360 462 char359char359char359char359char359char359char359char359char359char359
+361 464 char360char360char360char360char360char360char360char360char360char360
+362 466 char361char361char361char361char361char361char361char361char361char361
+363 468 char362char362char362char362char362char362char362char362char362char362
+364 470 char363char363char363char363char363char363char363char363char363char363
+365 472 char364char364char364char364char364char364char364char364char364char364
+366 474 char365char365char365char365char365char365char365char365char365char365
+367 476 char366char366char366char366char366char366char366char366char366char366
+368 478 char367char367char367char367char367char367char367char367char367char367
+369 480 char368char368char368char368char368char368char368char368char368char368
+370 482 char369char369char369char369char369char369char369char369char369char369
+371 484 char370char370char370char370char370char370char370char370char370char370
+372 486 char371char371char371char371char371char371char371char371char371char371
+373 488 char372char372char372char372char372char372char372char372char372char372
+374 490 char373char373char373char373char373char373char373char373char373char373
+375 492 char374char374char374char374char374char374char374char374char374char374
+376 494 char375char375char375char375char375char375char375char375char375char375
+377 496 char376char376char376char376char376char376char376char376char376char376
+378 498 char377char377char377char377char377char377char377char377char377char377
+379 500 char378char378char378char378char378char378char378char378char378char378
+380 502 char379char379char379char379char379char379char379char379char379char379
+381 504 char380char380char380char380char380char380char380char380char380char380
+382 506 char381char381char381char381char381char381char381char381char381char381
+383 508 char382char382char382char382char382char382char382char382char382char382
+384 510 char383char383char383char383char383char383char383char383char383char383
+385 384 char384char384char384char384char384char384char384char384char384char384
+386 386 char385char385char385char385char385char385char385char385char385char385
+387 388 char386char386char386char386char386char386char386char386char386char386
+388 390 char387char387char387char387char387char387char387char387char387char387
+389 392 char388char388char388char388char388char388char388char388char388char388
+390 394 char389char389char389char389char389char389char389char389char389char389
+391 396 char390char390char390char390char390char390char390char390char390char390
+392 398 char391char391char391char391char391char391char391char391char391char391
+393 400 char392char392char392char392char392char392char392char392char392char392
+394 402 char393char393char393char393char393char393char393char393char393char393
+395 404 char394char394char394char394char394char394char394char394char394char394
+396 406 char395char395char395char395char395char395char395char395char395char395
+397 408 char396char396char396char396char396char396char396char396char396char396
+398 410 char397char397char397char397char397char397char397char397char397char397
+399 412 char398char398char398char398char398char398char398char398char398char398
+400 414 char399char399char399char399char399char399char399char399char399char399
+401 416 char400char400char400char400char400char400char400char400char400char400
+402 418 char401char401char401char401char401char401char401char401char401char401
+403 420 char402char402char402char402char402char402char402char402char402char402
+404 422 char403char403char403char403char403char403char403char403char403char403
+405 424 char404char404char404char404char404char404char404char404char404char404
+406 426 char405char405char405char405char405char405char405char405char405char405
+407 428 char406char406char406char406char406char406char406char406char406char406
+408 430 char407char407char407char407char407char407char407char407char407char407
+409 432 char408char408char408char408char408char408char408char408char408char408
+410 434 char409char409char409char409char409char409char409char409char409char409
+411 436 char410char410char410char410char410char410char410char410char410char410
+412 438 char411char411char411char411char411char411char411char411char411char411
+413 440 char412char412char412char412char412char412char412char412char412char412
+414 442 char413char413char413char413char413char413char413char413char413char413
+415 444 char414char414char414char414char414char414char414char414char414char414
+416 446 char415char415char415char415char415char415char415char415char415char415
+417 448 char416char416char416char416char416char416char416char416char416char416
+418 450 char417char417char417char417char417char417char417char417char417char417
+419 452 char418char418char418char418char418char418char418char418char418char418
+420 454 char419char419char419char419char419char419char419char419char419char419
+421 456 char420char420char420char420char420char420char420char420char420char420
+422 458 char421char421char421char421char421char421char421char421char421char421
+423 460 char422char422char422char422char422char422char422char422char422char422
+424 462 char423char423char423char423char423char423char423char423char423char423
+425 464 char424char424char424char424char424char424char424char424char424char424
+426 466 char425char425char425char425char425char425char425char425char425char425
+427 468 char426char426char426char426char426char426char426char426char426char426
+428 470 char427char427char427char427char427char427char427char427char427char427
+429 472 char428char428char428char428char428char428char428char428char428char428
+430 474 char429char429char429char429char429char429char429char429char429char429
+431 476 char430char430char430char430char430char430char430char430char430char430
+432 478 char431char431char431char431char431char431char431char431char431char431
+433 480 char432char432char432char432char432char432char432char432char432char432
+434 482 char433char433char433char433char433char433char433char433char433char433
+435 484 char434char434char434char434char434char434char434char434char434char434
+436 486 char435char435char435char435char435char435char435char435char435char435
+437 488 char436char436char436char436char436char436char436char436char436char436
+438 490 char437char437char437char437char437char437char437char437char437char437
+439 492 char438char438char438char438char438char438char438char438char438char438
+440 494 char439char439char439char439char439char439char439char439char439char439
+441 496 char440char440char440char440char440char440char440char440char440char440
+442 498 char441char441char441char441char441char441char441char441char441char441
+443 500 char442char442char442char442char442char442char442char442char442char442
+444 502 char443char443char443char443char443char443char443char443char443char443
+445 504 char444char444char444char444char444char444char444char444char444char444
+446 506 char445char445char445char445char445char445char445char445char445char445
+447 508 char446char446char446char446char446char446char446char446char446char446
+448 510 char447char447char447char447char447char447char447char447char447char447
+449 512 char448char448char448char448char448char448char448char448char448char448
+450 514 char449char449char449char449char449char449char449char449char449char449
+451 516 char450char450char450char450char450char450char450char450char450char450
+452 518 char451char451char451char451char451char451char451char451char451char451
+453 520 char452char452char452char452char452char452char452char452char452char452
+454 522 char453char453char453char453char453char453char453char453char453char453
+455 524 char454char454char454char454char454char454char454char454char454char454
+456 526 char455char455char455char455char455char455char455char455char455char455
+457 528 char456char456char456char456char456char456char456char456char456char456
+458 530 char457char457char457char457char457char457char457char457char457char457
+459 532 char458char458char458char458char458char458char458char458char458char458
+460 534 char459char459char459char459char459char459char459char459char459char459
+461 536 char460char460char460char460char460char460char460char460char460char460
+462 538 char461char461char461char461char461char461char461char461char461char461
+463 540 char462char462char462char462char462char462char462char462char462char462
+464 542 char463char463char463char463char463char463char463char463char463char463
+465 544 char464char464char464char464char464char464char464char464char464char464
+466 546 char465char465char465char465char465char465char465char465char465char465
+467 548 char466char466char466char466char466char466char466char466char466char466
+468 550 char467char467char467char467char467char467char467char467char467char467
+469 552 char468char468char468char468char468char468char468char468char468char468
+470 554 char469char469char469char469char469char469char469char469char469char469
+471 556 char470char470char470char470char470char470char470char470char470char470
+472 558 char471char471char471char471char471char471char471char471char471char471
+473 560 char472char472char472char472char472char472char472char472char472char472
+474 562 char473char473char473char473char473char473char473char473char473char473
+475 564 char474char474char474char474char474char474char474char474char474char474
+476 566 char475char475char475char475char475char475char475char475char475char475
+477 568 char476char476char476char476char476char476char476char476char476char476
+478 570 char477char477char477char477char477char477char477char477char477char477
+479 572 char478char478char478char478char478char478char478char478char478char478
+480 574 char479char479char479char479char479char479char479char479char479char479
+481 576 char480char480char480char480char480char480char480char480char480char480
+482 578 char481char481char481char481char481char481char481char481char481char481
+483 580 char482char482char482char482char482char482char482char482char482char482
+484 582 char483char483char483char483char483char483char483char483char483char483
+485 584 char484char484char484char484char484char484char484char484char484char484
+486 586 char485char485char485char485char485char485char485char485char485char485
+487 588 char486char486char486char486char486char486char486char486char486char486
+488 590 char487char487char487char487char487char487char487char487char487char487
+489 592 char488char488char488char488char488char488char488char488char488char488
+490 594 char489char489char489char489char489char489char489char489char489char489
+491 596 char490char490char490char490char490char490char490char490char490char490
+492 598 char491char491char491char491char491char491char491char491char491char491
+493 600 char492char492char492char492char492char492char492char492char492char492
+494 602 char493char493char493char493char493char493char493char493char493char493
+495 604 char494char494char494char494char494char494char494char494char494char494
+496 606 char495char495char495char495char495char495char495char495char495char495
+497 608 char496char496char496char496char496char496char496char496char496char496
+498 610 char497char497char497char497char497char497char497char497char497char497
+499 612 char498char498char498char498char498char498char498char498char498char498
+500 614 char499char499char499char499char499char499char499char499char499char499
+501 616 char500char500char500char500char500char500char500char500char500char500
+502 618 char501char501char501char501char501char501char501char501char501char501
+503 620 char502char502char502char502char502char502char502char502char502char502
+504 622 char503char503char503char503char503char503char503char503char503char503
+505 624 char504char504char504char504char504char504char504char504char504char504
+506 626 char505char505char505char505char505char505char505char505char505char505
+507 628 char506char506char506char506char506char506char506char506char506char506
+508 630 char507char507char507char507char507char507char507char507char507char507
+509 632 char508char508char508char508char508char508char508char508char508char508
+510 634 char509char509char509char509char509char509char509char509char509char509
+511 636 char510char510char510char510char510char510char510char510char510char510
+512 638 char511char511char511char511char511char511char511char511char511char511
+513 512 char512char512char512char512char512char512char512char512char512char512
+514 514 char513char513char513char513char513char513char513char513char513char513
+515 516 char514char514char514char514char514char514char514char514char514char514
+516 518 char515char515char515char515char515char515char515char515char515char515
+517 520 char516char516char516char516char516char516char516char516char516char516
+518 522 char517char517char517char517char517char517char517char517char517char517
+519 524 char518char518char518char518char518char518char518char518char518char518
+520 526 char519char519char519char519char519char519char519char519char519char519
+521 528 char520char520char520char520char520char520char520char520char520char520
+522 530 char521char521char521char521char521char521char521char521char521char521
+523 532 char522char522char522char522char522char522char522char522char522char522
+524 534 char523char523char523char523char523char523char523char523char523char523
+525 536 char524char524char524char524char524char524char524char524char524char524
+526 538 char525char525char525char525char525char525char525char525char525char525
+527 540 char526char526char526char526char526char526char526char526char526char526
+528 542 char527char527char527char527char527char527char527char527char527char527
+529 544 char528char528char528char528char528char528char528char528char528char528
+530 546 char529char529char529char529char529char529char529char529char529char529
+531 548 char530char530char530char530char530char530char530char530char530char530
+532 550 char531char531char531char531char531char531char531char531char531char531
+533 552 char532char532char532char532char532char532char532char532char532char532
+534 554 char533char533char533char533char533char533char533char533char533char533
+535 556 char534char534char534char534char534char534char534char534char534char534
+536 558 char535char535char535char535char535char535char535char535char535char535
+537 560 char536char536char536char536char536char536char536char536char536char536
+538 562 char537char537char537char537char537char537char537char537char537char537
+539 564 char538char538char538char538char538char538char538char538char538char538
+540 566 char539char539char539char539char539char539char539char539char539char539
+541 568 char540char540char540char540char540char540char540char540char540char540
+542 570 char541char541char541char541char541char541char541char541char541char541
+543 572 char542char542char542char542char542char542char542char542char542char542
+544 574 char543char543char543char543char543char543char543char543char543char543
+545 576 char544char544char544char544char544char544char544char544char544char544
+546 578 char545char545char545char545char545char545char545char545char545char545
+547 580 char546char546char546char546char546char546char546char546char546char546
+548 582 char547char547char547char547char547char547char547char547char547char547
+549 584 char548char548char548char548char548char548char548char548char548char548
+550 586 char549char549char549char549char549char549char549char549char549char549
+551 588 char550char550char550char550char550char550char550char550char550char550
+552 590 char551char551char551char551char551char551char551char551char551char551
+553 592 char552char552char552char552char552char552char552char552char552char552
+554 594 char553char553char553char553char553char553char553char553char553char553
+555 596 char554char554char554char554char554char554char554char554char554char554
+556 598 char555char555char555char555char555char555char555char555char555char555
+557 600 char556char556char556char556char556char556char556char556char556char556
+558 602 char557char557char557char557char557char557char557char557char557char557
+559 604 char558char558char558char558char558char558char558char558char558char558
+560 606 char559char559char559char559char559char559char559char559char559char559
+561 608 char560char560char560char560char560char560char560char560char560char560
+562 610 char561char561char561char561char561char561char561char561char561char561
+563 612 char562char562char562char562char562char562char562char562char562char562
+564 614 char563char563char563char563char563char563char563char563char563char563
+565 616 char564char564char564char564char564char564char564char564char564char564
+566 618 char565char565char565char565char565char565char565char565char565char565
+567 620 char566char566char566char566char566char566char566char566char566char566
+568 622 char567char567char567char567char567char567char567char567char567char567
+569 624 char568char568char568char568char568char568char568char568char568char568
+570 626 char569char569char569char569char569char569char569char569char569char569
+571 628 char570char570char570char570char570char570char570char570char570char570
+572 630 char571char571char571char571char571char571char571char571char571char571
+573 632 char572char572char572char572char572char572char572char572char572char572
+574 634 char573char573char573char573char573char573char573char573char573char573
+575 636 char574char574char574char574char574char574char574char574char574char574
+576 638 char575char575char575char575char575char575char575char575char575char575
+577 640 char576char576char576char576char576char576char576char576char576char576
+578 642 char577char577char577char577char577char577char577char577char577char577
+579 644 char578char578char578char578char578char578char578char578char578char578
+580 646 char579char579char579char579char579char579char579char579char579char579
+581 648 char580char580char580char580char580char580char580char580char580char580
+582 650 char581char581char581char581char581char581char581char581char581char581
+583 652 char582char582char582char582char582char582char582char582char582char582
+584 654 char583char583char583char583char583char583char583char583char583char583
+585 656 char584char584char584char584char584char584char584char584char584char584
+586 658 char585char585char585char585char585char585char585char585char585char585
+587 660 char586char586char586char586char586char586char586char586char586char586
+588 662 char587char587char587char587char587char587char587char587char587char587
+589 664 char588char588char588char588char588char588char588char588char588char588
+590 666 char589char589char589char589char589char589char589char589char589char589
+591 668 char590char590char590char590char590char590char590char590char590char590
+592 670 char591char591char591char591char591char591char591char591char591char591
+593 672 char592char592char592char592char592char592char592char592char592char592
+594 674 char593char593char593char593char593char593char593char593char593char593
+595 676 char594char594char594char594char594char594char594char594char594char594
+596 678 char595char595char595char595char595char595char595char595char595char595
+597 680 char596char596char596char596char596char596char596char596char596char596
+598 682 char597char597char597char597char597char597char597char597char597char597
+599 684 char598char598char598char598char598char598char598char598char598char598
+600 686 char599char599char599char599char599char599char599char599char599char599
+601 688 char600char600char600char600char600char600char600char600char600char600
+602 690 char601char601char601char601char601char601char601char601char601char601
+603 692 char602char602char602char602char602char602char602char602char602char602
+604 694 char603char603char603char603char603char603char603char603char603char603
+605 696 char604char604char604char604char604char604char604char604char604char604
+606 698 char605char605char605char605char605char605char605char605char605char605
+607 700 char606char606char606char606char606char606char606char606char606char606
+608 702 char607char607char607char607char607char607char607char607char607char607
+609 704 char608char608char608char608char608char608char608char608char608char608
+610 706 char609char609char609char609char609char609char609char609char609char609
+611 708 char610char610char610char610char610char610char610char610char610char610
+612 710 char611char611char611char611char611char611char611char611char611char611
+613 712 char612char612char612char612char612char612char612char612char612char612
+614 714 char613char613char613char613char613char613char613char613char613char613
+615 716 char614char614char614char614char614char614char614char614char614char614
+616 718 char615char615char615char615char615char615char615char615char615char615
+617 720 char616char616char616char616char616char616char616char616char616char616
+618 722 char617char617char617char617char617char617char617char617char617char617
+619 724 char618char618char618char618char618char618char618char618char618char618
+620 726 char619char619char619char619char619char619char619char619char619char619
+621 728 char620char620char620char620char620char620char620char620char620char620
+622 730 char621char621char621char621char621char621char621char621char621char621
+623 732 char622char622char622char622char622char622char622char622char622char622
+624 734 char623char623char623char623char623char623char623char623char623char623
+625 736 char624char624char624char624char624char624char624char624char624char624
+626 738 char625char625char625char625char625char625char625char625char625char625
+627 740 char626char626char626char626char626char626char626char626char626char626
+628 742 char627char627char627char627char627char627char627char627char627char627
+629 744 char628char628char628char628char628char628char628char628char628char628
+630 746 char629char629char629char629char629char629char629char629char629char629
+631 748 char630char630char630char630char630char630char630char630char630char630
+632 750 char631char631char631char631char631char631char631char631char631char631
+633 752 char632char632char632char632char632char632char632char632char632char632
+634 754 char633char633char633char633char633char633char633char633char633char633
+635 756 char634char634char634char634char634char634char634char634char634char634
+636 758 char635char635char635char635char635char635char635char635char635char635
+637 760 char636char636char636char636char636char636char636char636char636char636
+638 762 char637char637char637char637char637char637char637char637char637char637
+639 764 char638char638char638char638char638char638char638char638char638char638
+640 766 char639char639char639char639char639char639char639char639char639char639
+641 640 char640char640char640char640char640char640char640char640char640char640
+642 642 char641char641char641char641char641char641char641char641char641char641
+643 644 char642char642char642char642char642char642char642char642char642char642
+644 646 char643char643char643char643char643char643char643char643char643char643
+645 648 char644char644char644char644char644char644char644char644char644char644
+646 650 char645char645char645char645char645char645char645char645char645char645
+647 652 char646char646char646char646char646char646char646char646char646char646
+648 654 char647char647char647char647char647char647char647char647char647char647
+649 656 char648char648char648char648char648char648char648char648char648char648
+650 658 char649char649char649char649char649char649char649char649char649char649
+651 660 char650char650char650char650char650char650char650char650char650char650
+652 662 char651char651char651char651char651char651char651char651char651char651
+653 664 char652char652char652char652char652char652char652char652char652char652
+654 666 char653char653char653char653char653char653char653char653char653char653
+655 668 char654char654char654char654char654char654char654char654char654char654
+656 670 char655char655char655char655char655char655char655char655char655char655
+657 672 char656char656char656char656char656char656char656char656char656char656
+658 674 char657char657char657char657char657char657char657char657char657char657
+659 676 char658char658char658char658char658char658char658char658char658char658
+660 678 char659char659char659char659char659char659char659char659char659char659
+661 680 char660char660char660char660char660char660char660char660char660char660
+662 682 char661char661char661char661char661char661char661char661char661char661
+663 684 char662char662char662char662char662char662char662char662char662char662
+664 686 char663char663char663char663char663char663char663char663char663char663
+665 688 char664char664char664char664char664char664char664char664char664char664
+666 690 char665char665char665char665char665char665char665char665char665char665
+667 692 char666char666char666char666char666char666char666char666char666char666
+668 694 char667char667char667char667char667char667char667char667char667char667
+669 696 char668char668char668char668char668char668char668char668char668char668
+670 698 char669char669char669char669char669char669char669char669char669char669
+671 700 char670char670char670char670char670char670char670char670char670char670
+672 702 char671char671char671char671char671char671char671char671char671char671
+673 704 char672char672char672char672char672char672char672char672char672char672
+674 706 char673char673char673char673char673char673char673char673char673char673
+675 708 char674char674char674char674char674char674char674char674char674char674
+676 710 char675char675char675char675char675char675char675char675char675char675
+677 712 char676char676char676char676char676char676char676char676char676char676
+678 714 char677char677char677char677char677char677char677char677char677char677
+679 716 char678char678char678char678char678char678char678char678char678char678
+680 718 char679char679char679char679char679char679char679char679char679char679
+681 720 char680char680char680char680char680char680char680char680char680char680
+682 722 char681char681char681char681char681char681char681char681char681char681
+683 724 char682char682char682char682char682char682char682char682char682char682
+684 726 char683char683char683char683char683char683char683char683char683char683
+685 728 char684char684char684char684char684char684char684char684char684char684
+686 730 char685char685char685char685char685char685char685char685char685char685
+687 732 char686char686char686char686char686char686char686char686char686char686
+688 734 char687char687char687char687char687char687char687char687char687char687
+689 736 char688char688char688char688char688char688char688char688char688char688
+690 738 char689char689char689char689char689char689char689char689char689char689
+691 740 char690char690char690char690char690char690char690char690char690char690
+692 742 char691char691char691char691char691char691char691char691char691char691
+693 744 char692char692char692char692char692char692char692char692char692char692
+694 746 char693char693char693char693char693char693char693char693char693char693
+695 748 char694char694char694char694char694char694char694char694char694char694
+696 750 char695char695char695char695char695char695char695char695char695char695
+697 752 char696char696char696char696char696char696char696char696char696char696
+698 754 char697char697char697char697char697char697char697char697char697char697
+699 756 char698char698char698char698char698char698char698char698char698char698
+700 758 char699char699char699char699char699char699char699char699char699char699
+701 760 char700char700char700char700char700char700char700char700char700char700
+702 762 char701char701char701char701char701char701char701char701char701char701
+703 764 char702char702char702char702char702char702char702char702char702char702
+704 766 char703char703char703char703char703char703char703char703char703char703
+705 768 char704char704char704char704char704char704char704char704char704char704
+706 770 char705char705char705char705char705char705char705char705char705char705
+707 772 char706char706char706char706char706char706char706char706char706char706
+708 774 char707char707char707char707char707char707char707char707char707char707
+709 776 char708char708char708char708char708char708char708char708char708char708
+710 778 char709char709char709char709char709char709char709char709char709char709
+711 780 char710char710char710char710char710char710char710char710char710char710
+712 782 char711char711char711char711char711char711char711char711char711char711
+713 784 char712char712char712char712char712char712char712char712char712char712
+714 786 char713char713char713char713char713char713char713char713char713char713
+715 788 char714char714char714char714char714char714char714char714char714char714
+716 790 char715char715char715char715char715char715char715char715char715char715
+717 792 char716char716char716char716char716char716char716char716char716char716
+718 794 char717char717char717char717char717char717char717char717char717char717
+719 796 char718char718char718char718char718char718char718char718char718char718
+720 798 char719char719char719char719char719char719char719char719char719char719
+721 800 char720char720char720char720char720char720char720char720char720char720
+722 802 char721char721char721char721char721char721char721char721char721char721
+723 804 char722char722char722char722char722char722char722char722char722char722
+724 806 char723char723char723char723char723char723char723char723char723char723
+725 808 char724char724char724char724char724char724char724char724char724char724
+726 810 char725char725char725char725char725char725char725char725char725char725
+727 812 char726char726char726char726char726char726char726char726char726char726
+728 814 char727char727char727char727char727char727char727char727char727char727
+729 816 char728char728char728char728char728char728char728char728char728char728
+730 818 char729char729char729char729char729char729char729char729char729char729
+731 820 char730char730char730char730char730char730char730char730char730char730
+732 822 char731char731char731char731char731char731char731char731char731char731
+733 824 char732char732char732char732char732char732char732char732char732char732
+734 826 char733char733char733char733char733char733char733char733char733char733
+735 828 char734char734char734char734char734char734char734char734char734char734
+736 830 char735char735char735char735char735char735char735char735char735char735
+737 832 char736char736char736char736char736char736char736char736char736char736
+738 834 char737char737char737char737char737char737char737char737char737char737
+739 836 char738char738char738char738char738char738char738char738char738char738
+740 838 char739char739char739char739char739char739char739char739char739char739
+741 840 char740char740char740char740char740char740char740char740char740char740
+742 842 char741char741char741char741char741char741char741char741char741char741
+743 844 char742char742char742char742char742char742char742char742char742char742
+744 846 char743char743char743char743char743char743char743char743char743char743
+745 848 char744char744char744char744char744char744char744char744char744char744
+746 850 char745char745char745char745char745char745char745char745char745char745
+747 852 char746char746char746char746char746char746char746char746char746char746
+748 854 char747char747char747char747char747char747char747char747char747char747
+749 856 char748char748char748char748char748char748char748char748char748char748
+750 858 char749char749char749char749char749char749char749char749char749char749
+751 860 char750char750char750char750char750char750char750char750char750char750
+752 862 char751char751char751char751char751char751char751char751char751char751
+753 864 char752char752char752char752char752char752char752char752char752char752
+754 866 char753char753char753char753char753char753char753char753char753char753
+755 868 char754char754char754char754char754char754char754char754char754char754
+756 870 char755char755char755char755char755char755char755char755char755char755
+757 872 char756char756char756char756char756char756char756char756char756char756
+758 874 char757char757char757char757char757char757char757char757char757char757
+759 876 char758char758char758char758char758char758char758char758char758char758
+760 878 char759char759char759char759char759char759char759char759char759char759
+761 880 char760char760char760char760char760char760char760char760char760char760
+762 882 char761char761char761char761char761char761char761char761char761char761
+763 884 char762char762char762char762char762char762char762char762char762char762
+764 886 char763char763char763char763char763char763char763char763char763char763
+765 888 char764char764char764char764char764char764char764char764char764char764
+766 890 char765char765char765char765char765char765char765char765char765char765
+767 892 char766char766char766char766char766char766char766char766char766char766
+768 894 char767char767char767char767char767char767char767char767char767char767
+769 768 char768char768char768char768char768char768char768char768char768char768
+770 770 char769char769char769char769char769char769char769char769char769char769
+771 772 char770char770char770char770char770char770char770char770char770char770
+772 774 char771char771char771char771char771char771char771char771char771char771
+773 776 char772char772char772char772char772char772char772char772char772char772
+774 778 char773char773char773char773char773char773char773char773char773char773
+775 780 char774char774char774char774char774char774char774char774char774char774
+776 782 char775char775char775char775char775char775char775char775char775char775
+777 784 char776char776char776char776char776char776char776char776char776char776
+778 786 char777char777char777char777char777char777char777char777char777char777
+779 788 char778char778char778char778char778char778char778char778char778char778
+780 790 char779char779char779char779char779char779char779char779char779char779
+781 792 char780char780char780char780char780char780char780char780char780char780
+782 794 char781char781char781char781char781char781char781char781char781char781
+783 796 char782char782char782char782char782char782char782char782char782char782
+784 798 char783char783char783char783char783char783char783char783char783char783
+785 800 char784char784char784char784char784char784char784char784char784char784
+786 802 char785char785char785char785char785char785char785char785char785char785
+787 804 char786char786char786char786char786char786char786char786char786char786
+788 806 char787char787char787char787char787char787char787char787char787char787
+789 808 char788char788char788char788char788char788char788char788char788char788
+790 810 char789char789char789char789char789char789char789char789char789char789
+791 812 char790char790char790char790char790char790char790char790char790char790
+792 814 char791char791char791char791char791char791char791char791char791char791
+793 816 char792char792char792char792char792char792char792char792char792char792
+794 818 char793char793char793char793char793char793char793char793char793char793
+795 820 char794char794char794char794char794char794char794char794char794char794
+796 822 char795char795char795char795char795char795char795char795char795char795
+797 824 char796char796char796char796char796char796char796char796char796char796
+798 826 char797char797char797char797char797char797char797char797char797char797
+799 828 char798char798char798char798char798char798char798char798char798char798
+800 830 char799char799char799char799char799char799char799char799char799char799
+801 832 char800char800char800char800char800char800char800char800char800char800
+802 834 char801char801char801char801char801char801char801char801char801char801
+803 836 char802char802char802char802char802char802char802char802char802char802
+804 838 char803char803char803char803char803char803char803char803char803char803
+805 840 char804char804char804char804char804char804char804char804char804char804
+806 842 char805char805char805char805char805char805char805char805char805char805
+807 844 char806char806char806char806char806char806char806char806char806char806
+808 846 char807char807char807char807char807char807char807char807char807char807
+809 848 char808char808char808char808char808char808char808char808char808char808
+810 850 char809char809char809char809char809char809char809char809char809char809
+811 852 char810char810char810char810char810char810char810char810char810char810
+812 854 char811char811char811char811char811char811char811char811char811char811
+813 856 char812char812char812char812char812char812char812char812char812char812
+814 858 char813char813char813char813char813char813char813char813char813char813
+815 860 char814char814char814char814char814char814char814char814char814char814
+816 862 char815char815char815char815char815char815char815char815char815char815
+817 864 char816char816char816char816char816char816char816char816char816char816
+818 866 char817char817char817char817char817char817char817char817char817char817
+819 868 char818char818char818char818char818char818char818char818char818char818
+820 870 char819char819char819char819char819char819char819char819char819char819
+821 872 char820char820char820char820char820char820char820char820char820char820
+822 874 char821char821char821char821char821char821char821char821char821char821
+823 876 char822char822char822char822char822char822char822char822char822char822
+824 878 char823char823char823char823char823char823char823char823char823char823
+825 880 char824char824char824char824char824char824char824char824char824char824
+826 882 char825char825char825char825char825char825char825char825char825char825
+827 884 char826char826char826char826char826char826char826char826char826char826
+828 886 char827char827char827char827char827char827char827char827char827char827
+829 888 char828char828char828char828char828char828char828char828char828char828
+830 890 char829char829char829char829char829char829char829char829char829char829
+831 892 char830char830char830char830char830char830char830char830char830char830
+832 894 char831char831char831char831char831char831char831char831char831char831
+833 896 char832char832char832char832char832char832char832char832char832char832
+834 898 char833char833char833char833char833char833char833char833char833char833
+835 900 char834char834char834char834char834char834char834char834char834char834
+836 902 char835char835char835char835char835char835char835char835char835char835
+837 904 char836char836char836char836char836char836char836char836char836char836
+838 906 char837char837char837char837char837char837char837char837char837char837
+839 908 char838char838char838char838char838char838char838char838char838char838
+840 910 char839char839char839char839char839char839char839char839char839char839
+841 912 char840char840char840char840char840char840char840char840char840char840
+842 914 char841char841char841char841char841char841char841char841char841char841
+843 916 char842char842char842char842char842char842char842char842char842char842
+844 918 char843char843char843char843char843char843char843char843char843char843
+845 920 char844char844char844char844char844char844char844char844char844char844
+846 922 char845char845char845char845char845char845char845char845char845char845
+847 924 char846char846char846char846char846char846char846char846char846char846
+848 926 char847char847char847char847char847char847char847char847char847char847
+849 928 char848char848char848char848char848char848char848char848char848char848
+850 930 char849char849char849char849char849char849char849char849char849char849
+851 932 char850char850char850char850char850char850char850char850char850char850
+852 934 char851char851char851char851char851char851char851char851char851char851
+853 936 char852char852char852char852char852char852char852char852char852char852
+854 938 char853char853char853char853char853char853char853char853char853char853
+855 940 char854char854char854char854char854char854char854char854char854char854
+856 942 char855char855char855char855char855char855char855char855char855char855
+857 944 char856char856char856char856char856char856char856char856char856char856
+858 946 char857char857char857char857char857char857char857char857char857char857
+859 948 char858char858char858char858char858char858char858char858char858char858
+860 950 char859char859char859char859char859char859char859char859char859char859
+861 952 char860char860char860char860char860char860char860char860char860char860
+862 954 char861char861char861char861char861char861char861char861char861char861
+863 956 char862char862char862char862char862char862char862char862char862char862
+864 958 char863char863char863char863char863char863char863char863char863char863
+865 960 char864char864char864char864char864char864char864char864char864char864
+866 962 char865char865char865char865char865char865char865char865char865char865
+867 964 char866char866char866char866char866char866char866char866char866char866
+868 966 char867char867char867char867char867char867char867char867char867char867
+869 968 char868char868char868char868char868char868char868char868char868char868
+870 970 char869char869char869char869char869char869char869char869char869char869
+871 972 char870char870char870char870char870char870char870char870char870char870
+872 974 char871char871char871char871char871char871char871char871char871char871
+873 976 char872char872char872char872char872char872char872char872char872char872
+874 978 char873char873char873char873char873char873char873char873char873char873
+875 980 char874char874char874char874char874char874char874char874char874char874
+876 982 char875char875char875char875char875char875char875char875char875char875
+877 984 char876char876char876char876char876char876char876char876char876char876
+878 986 char877char877char877char877char877char877char877char877char877char877
+879 988 char878char878char878char878char878char878char878char878char878char878
+880 990 char879char879char879char879char879char879char879char879char879char879
+881 992 char880char880char880char880char880char880char880char880char880char880
+882 994 char881char881char881char881char881char881char881char881char881char881
+883 996 char882char882char882char882char882char882char882char882char882char882
+884 998 char883char883char883char883char883char883char883char883char883char883
+885 1000 char884char884char884char884char884char884char884char884char884char884
+886 1002 char885char885char885char885char885char885char885char885char885char885
+887 1004 char886char886char886char886char886char886char886char886char886char886
+888 1006 char887char887char887char887char887char887char887char887char887char887
+889 1008 char888char888char888char888char888char888char888char888char888char888
+890 1010 char889char889char889char889char889char889char889char889char889char889
+891 1012 char890char890char890char890char890char890char890char890char890char890
+892 1014 char891char891char891char891char891char891char891char891char891char891
+893 1016 char892char892char892char892char892char892char892char892char892char892
+894 1018 char893char893char893char893char893char893char893char893char893char893
+895 1020 char894char894char894char894char894char894char894char894char894char894
+896 1022 char895char895char895char895char895char895char895char895char895char895
+897 896 char896char896char896char896char896char896char896char896char896char896
+898 898 char897char897char897char897char897char897char897char897char897char897
+899 900 char898char898char898char898char898char898char898char898char898char898
+900 902 char899char899char899char899char899char899char899char899char899char899
+901 904 char900char900char900char900char900char900char900char900char900char900
+902 906 char901char901char901char901char901char901char901char901char901char901
+903 908 char902char902char902char902char902char902char902char902char902char902
+904 910 char903char903char903char903char903char903char903char903char903char903
+905 912 char904char904char904char904char904char904char904char904char904char904
+906 914 char905char905char905char905char905char905char905char905char905char905
+907 916 char906char906char906char906char906char906char906char906char906char906
+908 918 char907char907char907char907char907char907char907char907char907char907
+909 920 char908char908char908char908char908char908char908char908char908char908
+910 922 char909char909char909char909char909char909char909char909char909char909
+911 924 char910char910char910char910char910char910char910char910char910char910
+912 926 char911char911char911char911char911char911char911char911char911char911
+913 928 char912char912char912char912char912char912char912char912char912char912
+914 930 char913char913char913char913char913char913char913char913char913char913
+915 932 char914char914char914char914char914char914char914char914char914char914
+916 934 char915char915char915char915char915char915char915char915char915char915
+917 936 char916char916char916char916char916char916char916char916char916char916
+918 938 char917char917char917char917char917char917char917char917char917char917
+919 940 char918char918char918char918char918char918char918char918char918char918
+920 942 char919char919char919char919char919char919char919char919char919char919
+921 944 char920char920char920char920char920char920char920char920char920char920
+922 946 char921char921char921char921char921char921char921char921char921char921
+923 948 char922char922char922char922char922char922char922char922char922char922
+924 950 char923char923char923char923char923char923char923char923char923char923
+925 952 char924char924char924char924char924char924char924char924char924char924
+926 954 char925char925char925char925char925char925char925char925char925char925
+927 956 char926char926char926char926char926char926char926char926char926char926
+928 958 char927char927char927char927char927char927char927char927char927char927
+929 960 char928char928char928char928char928char928char928char928char928char928
+930 962 char929char929char929char929char929char929char929char929char929char929
+931 964 char930char930char930char930char930char930char930char930char930char930
+932 966 char931char931char931char931char931char931char931char931char931char931
+933 968 char932char932char932char932char932char932char932char932char932char932
+934 970 char933char933char933char933char933char933char933char933char933char933
+935 972 char934char934char934char934char934char934char934char934char934char934
+936 974 char935char935char935char935char935char935char935char935char935char935
+937 976 char936char936char936char936char936char936char936char936char936char936
+938 978 char937char937char937char937char937char937char937char937char937char937
+939 980 char938char938char938char938char938char938char938char938char938char938
+940 982 char939char939char939char939char939char939char939char939char939char939
+941 984 char940char940char940char940char940char940char940char940char940char940
+942 986 char941char941char941char941char941char941char941char941char941char941
+943 988 char942char942char942char942char942char942char942char942char942char942
+944 990 char943char943char943char943char943char943char943char943char943char943
+945 992 char944char944char944char944char944char944char944char944char944char944
+946 994 char945char945char945char945char945char945char945char945char945char945
+947 996 char946char946char946char946char946char946char946char946char946char946
+948 998 char947char947char947char947char947char947char947char947char947char947
+949 1000 char948char948char948char948char948char948char948char948char948char948
+950 1002 char949char949char949char949char949char949char949char949char949char949
+951 1004 char950char950char950char950char950char950char950char950char950char950
+952 1006 char951char951char951char951char951char951char951char951char951char951
+953 1008 char952char952char952char952char952char952char952char952char952char952
+954 1010 char953char953char953char953char953char953char953char953char953char953
+955 1012 char954char954char954char954char954char954char954char954char954char954
+956 1014 char955char955char955char955char955char955char955char955char955char955
+957 1016 char956char956char956char956char956char956char956char956char956char956
+958 1018 char957char957char957char957char957char957char957char957char957char957
+959 1020 char958char958char958char958char958char958char958char958char958char958
+960 1022 char959char959char959char959char959char959char959char959char959char959
+961 1024 char960char960char960char960char960char960char960char960char960char960
+962 1026 char961char961char961char961char961char961char961char961char961char961
+963 1028 char962char962char962char962char962char962char962char962char962char962
+964 1030 char963char963char963char963char963char963char963char963char963char963
+965 1032 char964char964char964char964char964char964char964char964char964char964
+966 1034 char965char965char965char965char965char965char965char965char965char965
+967 1036 char966char966char966char966char966char966char966char966char966char966
+968 1038 char967char967char967char967char967char967char967char967char967char967
+969 1040 char968char968char968char968char968char968char968char968char968char968
+970 1042 char969char969char969char969char969char969char969char969char969char969
+971 1044 char970char970char970char970char970char970char970char970char970char970
+972 1046 char971char971char971char971char971char971char971char971char971char971
+973 1048 char972char972char972char972char972char972char972char972char972char972
+974 1050 char973char973char973char973char973char973char973char973char973char973
+975 1052 char974char974char974char974char974char974char974char974char974char974
+976 1054 char975char975char975char975char975char975char975char975char975char975
+977 1056 char976char976char976char976char976char976char976char976char976char976
+978 1058 char977char977char977char977char977char977char977char977char977char977
+979 1060 char978char978char978char978char978char978char978char978char978char978
+980 1062 char979char979char979char979char979char979char979char979char979char979
+981 1064 char980char980char980char980char980char980char980char980char980char980
+982 1066 char981char981char981char981char981char981char981char981char981char981
+983 1068 char982char982char982char982char982char982char982char982char982char982
+984 1070 char983char983char983char983char983char983char983char983char983char983
+985 1072 char984char984char984char984char984char984char984char984char984char984
+986 1074 char985char985char985char985char985char985char985char985char985char985
+987 1076 char986char986char986char986char986char986char986char986char986char986
+988 1078 char987char987char987char987char987char987char987char987char987char987
+989 1080 char988char988char988char988char988char988char988char988char988char988
+990 1082 char989char989char989char989char989char989char989char989char989char989
+991 1084 char990char990char990char990char990char990char990char990char990char990
+992 1086 char991char991char991char991char991char991char991char991char991char991
+993 1088 char992char992char992char992char992char992char992char992char992char992
+994 1090 char993char993char993char993char993char993char993char993char993char993
+995 1092 char994char994char994char994char994char994char994char994char994char994
+996 1094 char995char995char995char995char995char995char995char995char995char995
+997 1096 char996char996char996char996char996char996char996char996char996char996
+998 1098 char997char997char997char997char997char997char997char997char997char997
+999 1100 char998char998char998char998char998char998char998char998char998char998
+1000 1102 char999char999char999char999char999char999char999char999char999char999
+1001 \N \N
+
diff --git a/regression-test/data/nereids_p0/outfile/test_outfile_parquet.out b/regression-test/data/nereids_p0/outfile/test_outfile_parquet.out
new file mode 100644
index 0000000000..cb6eab3268
--- /dev/null
+++ b/regression-test/data/nereids_p0/outfile/test_outfile_parquet.out
@@ -0,0 +1,25 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !select_default --
+1 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 1 1 true 1 1 1 1.1 1.1 char1 1
+2 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 2 2 true 2 2 2 2.2 2.2 char2 2
+3 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 3 3 true 3 3 3 3.3 3.3 char3 3
+4 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 4 4 true 4 4 4 4.4 4.4 char4 4
+5 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 5 5 true 5 5 5 5.5 5.5 char5 5
+6 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 6 6 true 6 6 6 6.6 6.6 char6 6
+7 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 7 7 true 7 7 7 7.7 7.7 char7 7
+8 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 8 8 true 8 8 8 8.8 8.8 char8 8
+9 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 9 9 true 9 9 9 9.9 9.9 char9 9
+10 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 \N \N \N \N \N \N \N \N \N \N \N
+
+-- !select_default --
+1 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 1 1 true 1 1 1 1.1 1.1 char1 1
+2 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 2 2 true 2 2 2 2.2 2.2 char2 2
+3 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 3 3 true 3 3 3 3.3 3.3 char3 3
+4 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 4 4 true 4 4 4 4.4 4.4 char4 4
+5 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 5 5 true 5 5 5 5.5 5.5 char5 5
+6 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 6 6 true 6 6 6 6.6 6.6 char6 6
+7 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 7 7 true 7 7 7 7.7 7.7 char7 7
+8 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 8 8 true 8 8 8 8.8 8.8 char8 8
+9 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 Beijing 9 9 true 9 9 9 9.9 9.9 char9 9
+10 2017-10-01 2017-10-01T00:00 2017-10-01 2017-10-01T00:00 2017-10-01T00:00:00.111 2017-10-01T00:00:00.111111 \N \N \N \N \N \N \N \N \N \N \N
+
diff --git a/regression-test/data/nereids_p0/outfile/test_outfile_separator.out b/regression-test/data/nereids_p0/outfile/test_outfile_separator.out
new file mode 100644
index 0000000000..a27e122476
--- /dev/null
+++ b/regression-test/data/nereids_p0/outfile/test_outfile_separator.out
@@ -0,0 +1,11 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !select_1 --
+1 abc
+2 def
+
+-- !select_2 --
+1 abc
+1 abc
+2 def
+2 def
+
diff --git a/regression-test/suites/nereids_p0/outfile/test_outfile.groovy b/regression-test/suites/nereids_p0/outfile/test_outfile.groovy
new file mode 100644
index 0000000000..4da96b2f22
--- /dev/null
+++ b/regression-test/suites/nereids_p0/outfile/test_outfile.groovy
@@ -0,0 +1,226 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+import org.codehaus.groovy.runtime.IOGroovyMethods
+
+import java.nio.charset.StandardCharsets
+import java.nio.file.Files
+import java.nio.file.Paths
+
+suite("test_outfile") {
+ sql 'set enable_nereids_planner=true'
+ sql 'set enable_fallback_to_original_planner=false'
+
+ StringBuilder strBuilder = new StringBuilder()
+ strBuilder.append("curl --location-trusted -u " + context.config.jdbcUser + ":" + context.config.jdbcPassword)
+ strBuilder.append(" http://" + context.config.feHttpAddress + "/rest/v1/config/fe")
+
+ String command = strBuilder.toString()
+ def process = command.toString().execute()
+ def code = process.waitFor()
+ def err = IOGroovyMethods.getText(new BufferedReader(new InputStreamReader(process.getErrorStream())));
+ def out = process.getText()
+ logger.info("Request FE Config: code=" + code + ", out=" + out + ", err=" + err)
+ assertEquals(code, 0)
+ def response = parseJson(out.trim())
+ assertEquals(response.code, 0)
+ assertEquals(response.msg, "success")
+ def configJson = response.data.rows
+ boolean enableOutfileToLocal = false
+ for (Object conf: configJson) {
+ assert conf instanceof Map
+ if (((Map<String, String>) conf).get("Name").toLowerCase() == "enable_outfile_to_local") {
+ enableOutfileToLocal = ((Map<String, String>) conf).get("Value").toLowerCase() == "true"
+ }
+ }
+ if (!enableOutfileToLocal) {
+ logger.warn("Please set enable_outfile_to_local to true to run test_outfile")
+ return
+ }
+ def tableName = "outfile_test"
+ def uuid = UUID.randomUUID().toString()
+ def outFilePath = """/tmp/test_outfile_${uuid}"""
+ try {
+ sql """ DROP TABLE IF EXISTS ${tableName} """
+ sql """
+ CREATE TABLE IF NOT EXISTS ${tableName} (
+ `user_id` LARGEINT NOT NULL COMMENT "用户id",
+ `date` DATE NOT NULL COMMENT "数据灌入日期时间",
+ `datetime` DATETIME NOT NULL COMMENT "数据灌入日期时间",
+ `date_1` DATEV2 NOT NULL COMMENT "",
+ `datetime_1` DATETIMEV2 NOT NULL COMMENT "",
+ `datetime_2` DATETIMEV2(3) NOT NULL COMMENT "",
+ `datetime_3` DATETIMEV2(6) NOT NULL COMMENT "",
+ `city` VARCHAR(20) COMMENT "用户所在城市",
+ `age` SMALLINT COMMENT "用户年龄",
+ `sex` TINYINT COMMENT "用户性别",
+ `bool_col` boolean COMMENT "",
+ `int_col` int COMMENT "",
+ `bigint_col` bigint COMMENT "",
+ `largeint_col` largeint COMMENT "",
+ `float_col` float COMMENT "",
+ `double_col` double COMMENT "",
+ `char_col` CHAR(10) COMMENT "",
+ `decimal_col` decimal COMMENT ""
+ )
+ DISTRIBUTED BY HASH(user_id) PROPERTIES("replication_num" = "1");
+ """
+ StringBuilder sb = new StringBuilder()
+ int i = 1
+ for (; i < 1000; i ++) {
+ sb.append("""
+ (${i}, '2017-10-01', '2017-10-01 00:00:00', '2017-10-01', '2017-10-01 00:00:00.111111', '2017-10-01 00:00:00.111111', '2017-10-01 00:00:00.111111', 'Beijing', ${i}, ${i % 128}, true, ${i}, ${i}, ${i}, ${i}.${i}, ${i}.${i}, 'char${i}', ${i}),
+ """)
+ }
+ sb.append("""
+ (${i}, '2017-10-01', '2017-10-01 00:00:00', '2017-10-01', '2017-10-01 00:00:00.111111', '2017-10-01 00:00:00.111111', '2017-10-01 00:00:00.111111', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
+ """)
+ sql """ INSERT INTO ${tableName} VALUES
+ ${sb.toString()}
+ """
+ qt_select_default """ SELECT * FROM ${tableName} t ORDER BY user_id; """
+
+ // check outfile
+ File path = new File(outFilePath)
+ if (!path.exists()) {
+ assert path.mkdirs()
+ } else {
+ throw new IllegalStateException("""${outFilePath} already exists! """)
+ }
+ sql """
+ SELECT * FROM ${tableName} t ORDER BY user_id INTO OUTFILE "file://${outFilePath}/";
+ """
+ File[] files = path.listFiles()
+ assert files.length == 1
+ List<String> outLines = Files.readAllLines(Paths.get(files[0].getAbsolutePath()), StandardCharsets.UTF_8);
+ List<String> baseLines = Files.readAllLines(Paths.get("""${context.config.dataPath}/export_p0/test_outfile.out"""), StandardCharsets.UTF_8)
+ for (int j = 0; j < outLines.size(); j ++) {
+ String[] outLine = outLines.get(j).split("\t")
+ String[] baseLine = baseLines.get(j + 2).split("\t")
+ for (int slotId = 0; slotId < outLine.size(); slotId ++) {
+ // FIXME: Correctness validation for Datetime doesn't work in a right way so we just skip it now
+ if (outLine[slotId].contains("00:00:00")) {
+ continue
+ }
+ if (baseLine[slotId] == "false") {
+ assert outLine[slotId] == "0"
+ } else if (baseLine[slotId] == "true") {
+ assert outLine[slotId] == "1"
+ } else {
+ assert outLine[slotId] == baseLine[slotId]
+ }
+ }
+ }
+ } finally {
+ try_sql("DROP TABLE IF EXISTS ${tableName}")
+ File path = new File(outFilePath)
+ if (path.exists()) {
+ for (File f: path.listFiles()) {
+ f.delete();
+ }
+ path.delete();
+ }
+ }
+
+ // test hll column outfile
+ try {
+ sql """ DROP TABLE IF EXISTS ${tableName} """
+ sql """
+ CREATE TABLE IF NOT EXISTS ${tableName} (
+ `k1` int(11) NOT NULL,
+ `v1` hll HLL_UNION NOT NULL,
+ `v2` int(11) SUM NOT NULL
+ ) ENGINE=OLAP
+ AGGREGATE KEY(`k1`)
+ COMMENT 'OLAP'
+ DISTRIBUTED BY HASH(`k1`) BUCKETS 2
+ PROPERTIES (
+ "replication_allocation" = "tag.location.default: 1"
+ );
+ """
+
+ sql """
+ insert into ${tableName} values (7483648, hll_hash(7483648), 1), (7483648, hll_hash(7483648), 1),
+ (706432 , hll_hash(706432 ), 1), (706432 , hll_hash(706432 ), 1)
+ """
+
+ File path = new File(outFilePath)
+ if (!path.exists()) {
+ assert path.mkdirs()
+ } else {
+ throw new IllegalStateException("""${outFilePath} already exists! """)
+ }
+
+ sql "set return_object_data_as_binary = false"
+ sql """
+ SELECT * FROM ${tableName} t ORDER BY k1, v2 INTO OUTFILE "file://${outFilePath}/" properties("success_file_name" = "SUCCESS")
+ """
+
+ File[] files = path.listFiles()
+ assert files.length == 2 // one is outfile, the other is SUCCESS file
+ File dataFile = files[0].getName().contains("SUCCESS") ? files[1] : files[0];
+ List<String> outLines = Files.readAllLines(Paths.get(dataFile.getAbsolutePath()), StandardCharsets.UTF_8);
+ assertEquals(2, outLines.size())
+ String[] outLine1 = outLines.get(0).split("\t")
+ assertEquals(3, outLine1.size())
+ assert outLine1[1] == "\\N"
+ assert outLines.get(1).split("\t")[1] == "\\N"
+ } finally {
+ try_sql("DROP TABLE IF EXISTS ${tableName}")
+ File path = new File(outFilePath)
+ if (path.exists()) {
+ for (File f: path.listFiles()) {
+ f.delete();
+ }
+ path.delete();
+ }
+ }
+
+ // test parallel output
+ try {
+ File path = new File(outFilePath)
+ if (!path.exists()) {
+ assert path.mkdirs()
+ } else {
+ throw new IllegalStateException("""${outFilePath} already exists! """)
+ }
+ sql """drop table if exists select_into_file"""
+ sql """CREATE TABLE `select_into_file` (
+ `id` int,
+ `name` varchar(30)
+ ) ENGINE=OLAP
+ DUPLICATE KEY(`id`)
+ DISTRIBUTED BY HASH(`id`) BUCKETS 2
+ PROPERTIES (
+ "replication_allocation" = "tag.location.default: 1"
+ );"""
+ sql """insert into select_into_file values(1, "b"),(2, "z"),(3, "a"),
+ (4, "c"), (5, "睿"), (6, "多"), (7, "丝"), (8, "test"),
+ (100, "aa"), (111, "bb"), (123, "cc"), (222, "dd");"""
+ sql "set enable_parallel_outfile = true;"
+ sql """select * from select_into_file into outfile "file://${outFilePath}/" properties("success_file_name" = "SUCCESS");"""
+ } finally {
+ try_sql("DROP TABLE IF EXISTS select_into_file")
+ File path = new File(outFilePath)
+ if (path.exists()) {
+ for (File f: path.listFiles()) {
+ f.delete();
+ }
+ path.delete();
+ }
+ }
+}
diff --git a/regression-test/suites/nereids_p0/outfile/test_outfile_expr.groovy b/regression-test/suites/nereids_p0/outfile/test_outfile_expr.groovy
new file mode 100644
index 0000000000..6af38d4459
--- /dev/null
+++ b/regression-test/suites/nereids_p0/outfile/test_outfile_expr.groovy
@@ -0,0 +1,135 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+import org.codehaus.groovy.runtime.IOGroovyMethods
+
+import java.nio.charset.StandardCharsets
+import java.nio.file.Files
+import java.nio.file.Paths
+
+suite("test_outfile_expr") {
+ sql 'set enable_nereids_planner=true'
+ sql 'set enable_fallback_to_original_planner=false'
+
+ StringBuilder strBuilder = new StringBuilder()
+ strBuilder.append("curl --location-trusted -u " + context.config.jdbcUser + ":" + context.config.jdbcPassword)
+ strBuilder.append(" http://" + context.config.feHttpAddress + "/rest/v1/config/fe")
+
+ String command = strBuilder.toString()
+ def process = command.toString().execute()
+ def code = process.waitFor()
+ def err = IOGroovyMethods.getText(new BufferedReader(new InputStreamReader(process.getErrorStream())));
+ def out = process.getText()
+ logger.info("Request FE Config: code=" + code + ", out=" + out + ", err=" + err)
+ assertEquals(code, 0)
+ def response = parseJson(out.trim())
+ assertEquals(response.code, 0)
+ assertEquals(response.msg, "success")
+ def configJson = response.data.rows
+ boolean enableOutfileToLocal = false
+ for (Object conf: configJson) {
+ assert conf instanceof Map
+ if (((Map<String, String>) conf).get("Name").toLowerCase() == "enable_outfile_to_local") {
+ enableOutfileToLocal = ((Map<String, String>) conf).get("Value").toLowerCase() == "true"
+ }
+ }
+ if (!enableOutfileToLocal) {
+ logger.warn("Please set enable_outfile_to_local to true to run test_outfile_expr")
+ return
+ }
+ def tableName = "outfile_test_expr"
+ def uuid = UUID.randomUUID().toString()
+ def outFilePath = """/tmp/test_outfile_expr_${uuid}"""
+ try {
+ sql """ DROP TABLE IF EXISTS ${tableName} """
+ sql """
+ CREATE TABLE IF NOT EXISTS ${tableName} (
+ `user_id` LARGEINT NOT NULL COMMENT "用户id",
+ `date` DATE NOT NULL COMMENT "数据灌入日期时间",
+ `datetime` DATETIME NOT NULL COMMENT "数据灌入日期时间",
+ `city` VARCHAR(20) COMMENT "用户所在城市",
+ `age` SMALLINT COMMENT "用户年龄",
+ `sex` TINYINT COMMENT "用户性别",
+ `bool_col` boolean COMMENT "",
+ `int_col` int COMMENT "",
+ `bigint_col` bigint COMMENT "",
+ `largeint_col` largeint COMMENT "",
+ `float_col` float COMMENT "",
+ `double_col` double COMMENT "",
+ `char_col` CHAR(10) COMMENT "",
+ `decimal_col` decimal COMMENT ""
+ )
+ DISTRIBUTED BY HASH(user_id) PROPERTIES("replication_num" = "1");
+ """
+ StringBuilder sb = new StringBuilder()
+ int i = 1
+ for (; i < 1000; i ++) {
+ sb.append("""
+ (${i}, '2017-10-01', '2017-10-01 00:00:00', 'Beijing', ${i}, ${i % 128}, true, ${i}, ${i}, ${i}, ${i}.${i}, ${i}.${i}, 'char${i}', ${i}),
+ """)
+ }
+ sb.append("""
+ (${i}, '2017-10-01', '2017-10-01 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
+ """)
+ sql """ INSERT INTO ${tableName} VALUES
+ ${sb.toString()}
+ """
+ qt_select_default """ SELECT user_id+1, age+sex, repeat(char_col, 10) FROM ${tableName} t ORDER BY user_id; """
+
+ // check outfile
+ File path = new File(outFilePath)
+ if (!path.exists()) {
+ assert path.mkdirs()
+ } else {
+ throw new IllegalStateException("""${outFilePath} already exists! """)
+ }
+ sql """
+ SELECT user_id+1, age+sex, repeat(char_col, 10) FROM ${tableName} t ORDER BY user_id INTO OUTFILE "file://${outFilePath}/";
+ """
+ File[] files = path.listFiles()
+ assert files.length == 1
+ List<String> outLines = Files.readAllLines(Paths.get(files[0].getAbsolutePath()), StandardCharsets.UTF_8);
+ List<String> baseLines = Files.readAllLines(Paths.get("""${context.config.dataPath}/export_p0/test_outfile_expr.out"""), StandardCharsets.UTF_8)
+ for (int j = 0; j < outLines.size(); j ++) {
+ String[] outLine = outLines.get(j).split("\t")
+ String[] baseLine = baseLines.get(j + 2).split("\t")
+ for (int slotId = 0; slotId < outLine.size(); slotId ++) {
+ // FIXME: Correctness validation for Datetime doesn't work in a right way so we just skip it now
+ if (outLine[slotId].contains("00:00:00")) {
+ continue
+ }
+ if (baseLine[slotId] == "false") {
+ assert outLine[slotId] == "0"
+ } else if (baseLine[slotId] == "true") {
+ assert outLine[slotId] == "1"
+ } else {
+ assert outLine[slotId] == baseLine[slotId]
+ }
+ }
+ }
+ } finally {
+ try_sql("DROP TABLE IF EXISTS ${tableName}")
+ File path = new File(outFilePath)
+ if (path.exists()) {
+ for (File f: path.listFiles()) {
+ f.delete();
+ }
+ path.delete();
+ }
+ }
+
+}
diff --git a/regression-test/suites/nereids_p0/outfile/test_outfile_parquet.groovy b/regression-test/suites/nereids_p0/outfile/test_outfile_parquet.groovy
new file mode 100644
index 0000000000..a5492041e5
--- /dev/null
+++ b/regression-test/suites/nereids_p0/outfile/test_outfile_parquet.groovy
@@ -0,0 +1,162 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+import org.codehaus.groovy.runtime.IOGroovyMethods
+
+import java.nio.charset.StandardCharsets
+import java.nio.file.Files
+import java.nio.file.Paths
+
+suite("test_outfile_parquet") {
+ sql 'set enable_nereids_planner=true'
+ sql 'set enable_fallback_to_original_planner=false'
+
+ def dbName = "test_outfile_parquet"
+ sql "CREATE DATABASE IF NOT EXISTS ${dbName}"
+ sql "USE $dbName"
+ StringBuilder strBuilder = new StringBuilder()
+ strBuilder.append("curl --location-trusted -u " + context.config.jdbcUser + ":" + context.config.jdbcPassword)
+ strBuilder.append(" http://" + context.config.feHttpAddress + "/rest/v1/config/fe")
+
+ String command = strBuilder.toString()
+ def process = command.toString().execute()
+ def code = process.waitFor()
+ def err = IOGroovyMethods.getText(new BufferedReader(new InputStreamReader(process.getErrorStream())));
+ def out = process.getText()
+ logger.info("Request FE Config: code=" + code + ", out=" + out + ", err=" + err)
+ assertEquals(code, 0)
+ def response = parseJson(out.trim())
+ assertEquals(response.code, 0)
+ assertEquals(response.msg, "success")
+ def configJson = response.data.rows
+ boolean enableOutfileToLocal = false
+ for (Object conf: configJson) {
+ assert conf instanceof Map
+ if (((Map<String, String>) conf).get("Name").toLowerCase() == "enable_outfile_to_local") {
+ enableOutfileToLocal = ((Map<String, String>) conf).get("Value").toLowerCase() == "true"
+ }
+ }
+ if (!enableOutfileToLocal) {
+ logger.warn("Please set enable_outfile_to_local to true to run test_outfile")
+ return
+ }
+ def tableName = "outfile_parquet_test"
+ def tableName2 = "outfile_parquet_test2"
+ def uuid = UUID.randomUUID().toString()
+ def outFilePath = """/tmp/test_outfile_parquet_${uuid}"""
+ try {
+ sql """ DROP TABLE IF EXISTS ${tableName} """
+ sql """
+ CREATE TABLE IF NOT EXISTS ${tableName} (
+ `user_id` INT NOT NULL COMMENT "用户id",
+ `date` DATE NOT NULL COMMENT "数据灌入日期时间",
+ `datetime` DATETIME NOT NULL COMMENT "数据灌入日期时间",
+ `date_1` DATEV2 NOT NULL COMMENT "",
+ `datetime_1` DATETIMEV2 NOT NULL COMMENT "",
+ `datetime_2` DATETIMEV2(3) NOT NULL COMMENT "",
+ `datetime_3` DATETIMEV2(6) NOT NULL COMMENT "",
+ `city` VARCHAR(20) COMMENT "用户所在城市",
+ `age` SMALLINT COMMENT "用户年龄",
+ `sex` TINYINT COMMENT "用户性别",
+ `bool_col` boolean COMMENT "",
+ `int_col` int COMMENT "",
+ `bigint_col` bigint COMMENT "",
+ `largeint_col` int COMMENT "",
+ `float_col` float COMMENT "",
+ `double_col` double COMMENT "",
+ `char_col` CHAR(10) COMMENT "",
+ `decimal_col` decimal COMMENT ""
+ )
+ DISTRIBUTED BY HASH(user_id) PROPERTIES("replication_num" = "1");
+ """
+ StringBuilder sb = new StringBuilder()
+ int i = 1
+ for (; i < 10; i ++) {
+ sb.append("""
+ (${i}, '2017-10-01', '2017-10-01 00:00:00', '2017-10-01', '2017-10-01 00:00:00.111111', '2017-10-01 00:00:00.111111', '2017-10-01 00:00:00.111111', 'Beijing', ${i}, ${i % 128}, true, ${i}, ${i}, ${i}, ${i}.${i}, ${i}.${i}, 'char${i}', ${i}),
+ """)
+ }
+ sb.append("""
+ (${i}, '2017-10-01', '2017-10-01 00:00:00', '2017-10-01', '2017-10-01 00:00:00.111111', '2017-10-01 00:00:00.111111', '2017-10-01 00:00:00.111111', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
+ """)
+ sql """ INSERT INTO ${tableName} VALUES
+ ${sb.toString()}
+ """
+ qt_select_default """ SELECT * FROM ${tableName} t ORDER BY user_id; """
+
+ // check outfile
+ File path = new File(outFilePath)
+ if (!path.exists()) {
+ assert path.mkdirs()
+ } else {
+ throw new IllegalStateException("""${outFilePath} already exists! """)
+ }
+ sql """
+ SELECT * FROM ${tableName} t ORDER BY user_id INTO OUTFILE "file://${outFilePath}/" FORMAT AS PARQUET;
+ """
+
+ File[] files = path.listFiles()
+ assert files.length == 1
+
+ sql """ DROP TABLE IF EXISTS ${tableName2} """
+ sql """
+ CREATE TABLE IF NOT EXISTS ${tableName2} (
+ `user_id` INT NOT NULL COMMENT "用户id",
+ `date` DATE NOT NULL COMMENT "数据灌入日期时间",
+ `datetime` DATETIME NOT NULL COMMENT "数据灌入日期时间",
+ `date_1` DATEV2 NOT NULL COMMENT "",
+ `datetime_1` DATETIMEV2 NOT NULL COMMENT "",
+ `datetime_2` DATETIMEV2(3) NOT NULL COMMENT "",
+ `datetime_3` DATETIMEV2(6) NOT NULL COMMENT "",
+ `city` VARCHAR(20) COMMENT "用户所在城市",
+ `age` SMALLINT COMMENT "用户年龄",
+ `sex` TINYINT COMMENT "用户性别",
+ `bool_col` boolean COMMENT "",
+ `int_col` int COMMENT "",
+ `bigint_col` bigint COMMENT "",
+ `largeint_col` int COMMENT "",
+ `float_col` float COMMENT "",
+ `double_col` double COMMENT "",
+ `char_col` CHAR(10) COMMENT "",
+ `decimal_col` decimal COMMENT ""
+ )
+ DISTRIBUTED BY HASH(user_id) PROPERTIES("replication_num" = "1");
+ """
+
+ StringBuilder commandBuilder = new StringBuilder()
+ commandBuilder.append("""curl -v --location-trusted -u ${context.config.feHttpUser}:${context.config.feHttpPassword}""")
+ commandBuilder.append(""" -H format:parquet -T """ + files[0].getAbsolutePath() + """ http://${context.config.feHttpAddress}/api/""" + dbName + "/" + tableName2 + "/_stream_load")
+ command = commandBuilder.toString()
+ process = command.execute()
+ code = process.waitFor()
+ err = IOGroovyMethods.getText(new BufferedReader(new InputStreamReader(process.getErrorStream())))
+ out = process.getText()
+ logger.info("Run command: command=" + command + ",code=" + code + ", out=" + out + ", err=" + err)
+ assertEquals(code, 0)
+ qt_select_default """ SELECT * FROM ${tableName2} t ORDER BY user_id; """
+ } finally {
+ try_sql("DROP TABLE IF EXISTS ${tableName}")
+ try_sql("DROP TABLE IF EXISTS ${tableName2}")
+ File path = new File(outFilePath)
+ if (path.exists()) {
+ for (File f: path.listFiles()) {
+ f.delete();
+ }
+ path.delete();
+ }
+ }
+}
diff --git a/regression-test/suites/nereids_p0/outfile/test_outfile_separator.groovy b/regression-test/suites/nereids_p0/outfile/test_outfile_separator.groovy
new file mode 100644
index 0000000000..0168cfe430
--- /dev/null
+++ b/regression-test/suites/nereids_p0/outfile/test_outfile_separator.groovy
@@ -0,0 +1,107 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+import org.codehaus.groovy.runtime.IOGroovyMethods
+
+import java.nio.charset.StandardCharsets
+import java.nio.file.Files
+import java.nio.file.Paths
+
+suite("test_outfile_separator") {
+ sql 'set enable_nereids_planner=true'
+ sql 'set enable_fallback_to_original_planner=false'
+
+ StringBuilder strBuilder = new StringBuilder()
+ strBuilder.append("curl --location-trusted -u " + context.config.jdbcUser + ":" + context.config.jdbcPassword)
+ strBuilder.append(" http://" + context.config.feHttpAddress + "/rest/v1/config/fe")
+
+ String command = strBuilder.toString()
+ def process = command.toString().execute()
+ def code = process.waitFor()
+ def err = IOGroovyMethods.getText(new BufferedReader(new InputStreamReader(process.getErrorStream())));
+ def out = process.getText()
+ logger.info("Request FE Config: code=" + code + ", out=" + out + ", err=" + err)
+ assertEquals(code, 0)
+ def response = parseJson(out.trim())
+ assertEquals(response.code, 0)
+ assertEquals(response.msg, "success")
+ def configJson = response.data.rows
+ boolean enableOutfileToLocal = false
+ for (Object conf: configJson) {
+ assert conf instanceof Map
+ if (((Map<String, String>) conf).get("Name").toLowerCase() == "enable_outfile_to_local") {
+ enableOutfileToLocal = ((Map<String, String>) conf).get("Value").toLowerCase() == "true"
+ }
+ }
+ if (!enableOutfileToLocal) {
+ logger.warn("Please set enable_outfile_to_local to true to run test_outfile_separator")
+ return
+ }
+ def dbName = context.config.getDbNameByFile(context.file)
+ def tableName = "outfile_test_separator"
+ def uuid = UUID.randomUUID().toString()
+ def outFilePath = """/tmp/test_outfile_separator_${uuid}"""
+ try {
+ sql """ DROP TABLE IF EXISTS ${tableName} """
+ sql """
+ CREATE TABLE IF NOT EXISTS ${tableName} (
+ k1 int, k2 varchar(100)
+ )
+ DISTRIBUTED BY HASH(k1) PROPERTIES("replication_num" = "1");
+ """
+ sql """ INSERT INTO ${tableName} VALUES
+ (1, "abc"), (2, "def");
+ """
+ qt_select_1 """ SELECT * FROM ${tableName} t ORDER BY k1; """
+
+ // check outfile
+ File path = new File(outFilePath)
+ if (!path.exists()) {
+ assert path.mkdirs()
+ } else {
+ throw new IllegalStateException("""${outFilePath} already exists! """)
+ }
+ sql """
+ SELECT * FROM ${tableName} t INTO OUTFILE "file://${outFilePath}/" properties("column_separator" = "\\\\x01");
+ """
+ File[] files = path.listFiles()
+ assert files.length == 1
+ List<String> outLines = Files.readAllLines(Paths.get(files[0].getAbsolutePath()), StandardCharsets.UTF_8);
+ assert outLines.size() == 2
+
+ streamLoad {
+ db """${dbName}"""
+ table 'outfile_test_separator'
+ set 'column_separator', '\\x01'
+ file files[0].getAbsolutePath()
+ time 10000 // limit inflight 10s
+ }
+
+ qt_select_2 """ SELECT * FROM ${tableName} t ORDER BY k1; """
+
+ } finally {
+ try_sql("DROP TABLE IF EXISTS ${tableName}")
+ File path = new File(outFilePath)
+ if (path.exists()) {
+ for (File f: path.listFiles()) {
+ f.delete();
+ }
+ path.delete();
+ }
+ }
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org
[doris] 12/14: [bugfix](ngram bf index) process differently for normal bloom filter index and ngram bf index (#21310)
Posted by kx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
commit 137b3f0afbfc6f6a92f0f3ea6064f4521fb4925d
Author: Kang <kx...@gmail.com>
AuthorDate: Thu Jul 13 17:31:45 2023 +0800
[bugfix](ngram bf index) process differently for normal bloom filter index and ngram bf index (#21310)
* process differently for normal bloom filter index and ngram bf index
* fix review comments for readbility
* add test case
* add testcase for delete condition
---
be/src/olap/accept_null_predicate.h | 4 +-
be/src/olap/block_column_predicate.h | 10 ++--
be/src/olap/column_predicate.h | 2 +-
be/src/olap/comparison_predicate.h | 6 ++-
be/src/olap/in_list_predicate.h | 6 ++-
be/src/olap/like_column_predicate.h | 4 +-
be/src/olap/null_predicate.h | 4 +-
be/src/olap/rowset/segment_v2/column_reader.cpp | 3 +-
be/src/olap/rowset/segment_v2/column_reader.h | 10 +++-
.../data/index_p0/test_ngram_bloomfilter_index.out | 33 ++++++++++++
.../index_p0/test_ngram_bloomfilter_index.groovy | 62 ++++++++++++++++++++++
11 files changed, 132 insertions(+), 12 deletions(-)
diff --git a/be/src/olap/accept_null_predicate.h b/be/src/olap/accept_null_predicate.h
index bfff2910ca..1a5f586ed5 100644
--- a/be/src/olap/accept_null_predicate.h
+++ b/be/src/olap/accept_null_predicate.h
@@ -148,7 +148,9 @@ public:
bool evaluate_and(const BloomFilter* bf) const override { return _nested->evaluate_and(bf); }
- bool can_do_bloom_filter() const override { return _nested->can_do_bloom_filter(); }
+ bool can_do_bloom_filter(bool ngram) const override {
+ return _nested->can_do_bloom_filter(ngram);
+ }
void evaluate_vec(const vectorized::IColumn& column, uint16_t size,
bool* flags) const override {
diff --git a/be/src/olap/block_column_predicate.h b/be/src/olap/block_column_predicate.h
index 0069a62d29..c91dc0c367 100644
--- a/be/src/olap/block_column_predicate.h
+++ b/be/src/olap/block_column_predicate.h
@@ -87,7 +87,7 @@ public:
return true;
}
- virtual bool can_do_bloom_filter() const { return false; }
+ virtual bool can_do_bloom_filter(bool ngram) const { return false; }
//evaluate predicate on inverted
virtual Status evaluate(const std::string& column_name, InvertedIndexIterator* iterator,
@@ -121,7 +121,9 @@ public:
void evaluate_vec(vectorized::MutableColumns& block, uint16_t size, bool* flags) const override;
- bool can_do_bloom_filter() const override { return _predicate->can_do_bloom_filter(); }
+ bool can_do_bloom_filter(bool ngram) const override {
+ return _predicate->can_do_bloom_filter(ngram);
+ }
private:
const ColumnPredicate* _predicate;
@@ -188,9 +190,9 @@ public:
bool evaluate_and(const StringRef* dict_words, const size_t dict_num) const override;
- bool can_do_bloom_filter() const override {
+ bool can_do_bloom_filter(bool ngram) const override {
for (auto& pred : _block_column_predicate_vec) {
- if (!pred->can_do_bloom_filter()) {
+ if (!pred->can_do_bloom_filter(ngram)) {
return false;
}
}
diff --git a/be/src/olap/column_predicate.h b/be/src/olap/column_predicate.h
index 88f40c92c1..cad253ac1a 100644
--- a/be/src/olap/column_predicate.h
+++ b/be/src/olap/column_predicate.h
@@ -183,7 +183,7 @@ public:
return true;
}
- virtual bool can_do_bloom_filter() const { return false; }
+ virtual bool can_do_bloom_filter(bool ngram) const { return false; }
// used to evaluate pre read column in lazy materialization
// now only support integer/float
diff --git a/be/src/olap/comparison_predicate.h b/be/src/olap/comparison_predicate.h
index 6524fdfc7d..04dfd5dc5c 100644
--- a/be/src/olap/comparison_predicate.h
+++ b/be/src/olap/comparison_predicate.h
@@ -244,6 +244,8 @@ public:
bool evaluate_and(const segment_v2::BloomFilter* bf) const override {
if constexpr (PT == PredicateType::EQ) {
+ // EQ predicate can not use ngram bf, just return true to accept
+ if (bf->is_ngram_bf()) return true;
if constexpr (std::is_same_v<T, StringRef>) {
return bf->test_bytes(_value.data, _value.size);
} else if constexpr (Type == TYPE_DATE) {
@@ -272,7 +274,9 @@ public:
return true;
}
- bool can_do_bloom_filter() const override { return PT == PredicateType::EQ; }
+ bool can_do_bloom_filter(bool ngram) const override {
+ return PT == PredicateType::EQ && !ngram;
+ }
void evaluate_or(const vectorized::IColumn& column, const uint16_t* sel, uint16_t size,
bool* flags) const override {
diff --git a/be/src/olap/in_list_predicate.h b/be/src/olap/in_list_predicate.h
index 5f0f99f7eb..f4e432cf28 100644
--- a/be/src/olap/in_list_predicate.h
+++ b/be/src/olap/in_list_predicate.h
@@ -381,6 +381,8 @@ public:
bool evaluate_and(const segment_v2::BloomFilter* bf) const override {
if constexpr (PT == PredicateType::IN_LIST) {
+ // IN predicate can not use ngram bf, just return true to accept
+ if (bf->is_ngram_bf()) return true;
HybridSetBase::IteratorBase* iter = _values->begin();
while (iter->has_next()) {
if constexpr (std::is_same_v<T, StringRef>) {
@@ -408,7 +410,9 @@ public:
}
}
- bool can_do_bloom_filter() const override { return PT == PredicateType::IN_LIST; }
+ bool can_do_bloom_filter(bool ngram) const override {
+ return PT == PredicateType::IN_LIST && !ngram;
+ }
private:
template <typename LeftT, typename RightT>
diff --git a/be/src/olap/like_column_predicate.h b/be/src/olap/like_column_predicate.h
index ddbe892303..f97ff46453 100644
--- a/be/src/olap/like_column_predicate.h
+++ b/be/src/olap/like_column_predicate.h
@@ -76,12 +76,14 @@ public:
_page_ng_bf = std::move(src);
}
bool evaluate_and(const BloomFilter* bf) const override {
+ // like predicate can not use normal bf, just return true to accept
+ if (!bf->is_ngram_bf()) return true;
if (_page_ng_bf) {
return bf->contains(*_page_ng_bf);
}
return true;
}
- bool can_do_bloom_filter() const override { return true; }
+ bool can_do_bloom_filter(bool ngram) const override { return ngram; }
private:
template <bool is_and>
diff --git a/be/src/olap/null_predicate.h b/be/src/olap/null_predicate.h
index ed81cc6f1b..4313adea11 100644
--- a/be/src/olap/null_predicate.h
+++ b/be/src/olap/null_predicate.h
@@ -84,6 +84,8 @@ public:
}
bool evaluate_and(const segment_v2::BloomFilter* bf) const override {
+ // null predicate can not use ngram bf, just return true to accept
+ if (bf->is_ngram_bf()) return true;
if (_is_null) {
return bf->test_bytes(nullptr, 0);
} else {
@@ -92,7 +94,7 @@ public:
}
}
- bool can_do_bloom_filter() const override { return _is_null; }
+ bool can_do_bloom_filter(bool ngram) const override { return _is_null && !ngram; }
void evaluate_vec(const vectorized::IColumn& column, uint16_t size, bool* flags) const override;
diff --git a/be/src/olap/rowset/segment_v2/column_reader.cpp b/be/src/olap/rowset/segment_v2/column_reader.cpp
index a27d999169..2e4db26c50 100644
--- a/be/src/olap/rowset/segment_v2/column_reader.cpp
+++ b/be/src/olap/rowset/segment_v2/column_reader.cpp
@@ -1213,7 +1213,8 @@ Status FileColumnIterator::get_row_ranges_by_zone_map(
Status FileColumnIterator::get_row_ranges_by_bloom_filter(
const AndBlockColumnPredicate* col_predicates, RowRanges* row_ranges) {
- if (col_predicates->can_do_bloom_filter() && _reader->has_bloom_filter_index()) {
+ if ((col_predicates->can_do_bloom_filter(false) && _reader->has_bloom_filter_index(false)) ||
+ (col_predicates->can_do_bloom_filter(true) && _reader->has_bloom_filter_index(true))) {
RETURN_IF_ERROR(_reader->get_row_ranges_by_bloom_filter(col_predicates, row_ranges));
}
return Status::OK();
diff --git a/be/src/olap/rowset/segment_v2/column_reader.h b/be/src/olap/rowset/segment_v2/column_reader.h
index a6d23ac950..fb212ef33d 100644
--- a/be/src/olap/rowset/segment_v2/column_reader.h
+++ b/be/src/olap/rowset/segment_v2/column_reader.h
@@ -137,7 +137,15 @@ public:
bool has_zone_map() const { return _zone_map_index_meta != nullptr; }
bool has_bitmap_index() const { return _bitmap_index_meta != nullptr; }
- bool has_bloom_filter_index() const { return _bf_index_meta != nullptr; }
+ bool has_bloom_filter_index(bool ngram) const {
+ if (_bf_index_meta == nullptr) return false;
+
+ if (ngram) {
+ return _bf_index_meta->algorithm() == BloomFilterAlgorithmPB::NGRAM_BLOOM_FILTER;
+ } else {
+ return _bf_index_meta->algorithm() != BloomFilterAlgorithmPB::NGRAM_BLOOM_FILTER;
+ }
+ }
// Check if this column could match `cond' using segment zone map.
// Since segment zone map is stored in metadata, this function is fast without I/O.
diff --git a/regression-test/data/index_p0/test_ngram_bloomfilter_index.out b/regression-test/data/index_p0/test_ngram_bloomfilter_index.out
new file mode 100644
index 0000000000..7849739f42
--- /dev/null
+++ b/regression-test/data/index_p0/test_ngram_bloomfilter_index.out
@@ -0,0 +1,33 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !select_all_1 --
+1 dt_bjn001 p9-webcast-sign.douyinpic.com test /%/7212503657802320699% /test 100 false
+1 dt_bjn001 p9-webcast-sign.douyinpic.com test /%/7212503657802320699%xxx /test 100 false
+
+-- !select_eq_1 --
+1 dt_bjn001 p9-webcast-sign.douyinpic.com test /%/7212503657802320699% /test 100 false
+
+-- !select_in_1 --
+1 dt_bjn001 p9-webcast-sign.douyinpic.com test /%/7212503657802320699% /test 100 false
+
+-- !select_like_1 --
+1 dt_bjn001 p9-webcast-sign.douyinpic.com test /%/7212503657802320699% /test 100 false
+1 dt_bjn001 p9-webcast-sign.douyinpic.com test /%/7212503657802320699%xxx /test 100 false
+
+-- !select_all_2 --
+1 dt_bjn001 p9-webcast-sign.douyinpic.com test /%/7212503657802320699%xxx /test 100 false
+
+-- !select_eq_2 --
+
+-- !select_in_2 --
+
+-- !select_like_2 --
+1 dt_bjn001 p9-webcast-sign.douyinpic.com test /%/7212503657802320699%xxx /test 100 false
+
+-- !select_all_3 --
+
+-- !select_eq_3 --
+
+-- !select_in_3 --
+
+-- !select_like_3 --
+
diff --git a/regression-test/suites/index_p0/test_ngram_bloomfilter_index.groovy b/regression-test/suites/index_p0/test_ngram_bloomfilter_index.groovy
new file mode 100644
index 0000000000..7619adedc3
--- /dev/null
+++ b/regression-test/suites/index_p0/test_ngram_bloomfilter_index.groovy
@@ -0,0 +1,62 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+suite("test_ngram_bloomfilter_index") {
+ // todo: test bitmap index, such as create, drop, alter table index
+ def tableName = 'test_ngram_bloomfilter_index'
+ sql "DROP TABLE IF EXISTS ${tableName}"
+ sql """
+ CREATE TABLE IF NOT EXISTS ${tableName} (
+ `key_id` bigint(20) NULL COMMENT '',
+ `category` varchar(200) NULL COMMENT '',
+ `https_url` varchar(300) NULL COMMENT '',
+ `hostname` varchar(300) NULL,
+ `http_url` text NULL COMMENT '',
+ `url_path` varchar(2000) NULL COMMENT '',
+ `cnt` bigint(20) NULL COMMENT '',
+ `host_flag` boolean NULL COMMENT '',
+ INDEX idx_ngrambf (`http_url`) USING NGRAM_BF PROPERTIES("gram_size" = "2", "bf_size" = "512")
+ ) ENGINE=OLAP
+ DUPLICATE KEY(`key_id`, `category`)
+ COMMENT 'OLAP'
+ DISTRIBUTED BY HASH(`key_id`) BUCKETS 3
+ PROPERTIES("replication_num" = "1");
+ """
+
+ sql "INSERT INTO ${tableName} values (1, 'dt_bjn001', 'p9-webcast-sign.douyinpic.com', 'test', '/%/7212503657802320699%', '/test', 100, false);"
+ sql "INSERT INTO ${tableName} values (1, 'dt_bjn001', 'p9-webcast-sign.douyinpic.com', 'test', '/%/7212503657802320699%xxx', '/test', 100, false);"
+
+
+ sql "SET enable_function_pushdown = true"
+
+ qt_select_all_1 "SELECT * FROM ${tableName}"
+ qt_select_eq_1 "SELECT * FROM ${tableName} WHERE http_url = '/%/7212503657802320699%'"
+ qt_select_in_1 "SELECT * FROM ${tableName} WHERE http_url IN ('/%/7212503657802320699%')"
+ qt_select_like_1 "SELECT * FROM ${tableName} WHERE http_url like '/%/7212503657802320699%'"
+
+ // delete and then select
+ sql "DELETE FROM ${tableName} WHERE http_url IN ('/%/7212503657802320699%')"
+ qt_select_all_2 "SELECT * FROM ${tableName}"
+ qt_select_eq_2 "SELECT * FROM ${tableName} WHERE http_url = '/%/7212503657802320699%'"
+ qt_select_in_2 "SELECT * FROM ${tableName} WHERE http_url IN ('/%/7212503657802320699%')"
+ qt_select_like_2 "SELECT * FROM ${tableName} WHERE http_url like '/%/7212503657802320699%'"
+
+ sql "DELETE FROM ${tableName} WHERE http_url = '/%/7212503657802320699%xxx'"
+ qt_select_all_3 "SELECT * FROM ${tableName}"
+ qt_select_eq_3 "SELECT * FROM ${tableName} WHERE http_url = '/%/7212503657802320699%'"
+ qt_select_in_3 "SELECT * FROM ${tableName} WHERE http_url IN ('/%/7212503657802320699%')"
+ qt_select_like_3 "SELECT * FROM ${tableName} WHERE http_url like '/%/7212503657802320699%'"
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org
[doris] 05/14: [enhancement](RoutineLoad)Mutile table support pipeline load (#21678)
Posted by kx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
commit 70fc3eb0801cacaefc837ba6983f451149b45cec
Author: Calvin Kirs <ac...@163.com>
AuthorDate: Thu Jul 13 10:26:46 2023 +0800
[enhancement](RoutineLoad)Mutile table support pipeline load (#21678)
---
.../apache/doris/planner/StreamLoadPlanner.java | 12 ++++--
.../apache/doris/service/FrontendServiceImpl.java | 44 +++++++++++++++++-----
gensrc/thrift/FrontendService.thrift | 1 +
gensrc/thrift/PaloInternalService.thrift | 1 +
4 files changed, 46 insertions(+), 12 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadPlanner.java b/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadPlanner.java
index 2ae793e389..b9014206dd 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadPlanner.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadPlanner.java
@@ -307,12 +307,18 @@ public class StreamLoadPlanner {
queryGlobals.setNanoSeconds(LocalDateTime.now().getNano());
params.setQueryGlobals(queryGlobals);
+ params.setTableName(destTable.getName());
// LOG.debug("stream load txn id: {}, plan: {}", streamLoadTask.getTxnId(), params);
return params;
}
+ // single table plan fragmentInstanceIndex is 1(default value)
public TPipelineFragmentParams planForPipeline(TUniqueId loadId) throws UserException {
+ return this.planForPipeline(loadId, 1);
+ }
+
+ public TPipelineFragmentParams planForPipeline(TUniqueId loadId, int fragmentInstanceIdIndex) throws UserException {
if (destTable.getKeysType() != KeysType.UNIQUE_KEYS
&& taskInfo.getMergeType() != LoadTask.MergeType.APPEND) {
throw new AnalysisException("load by MERGE or DELETE is only supported in unique tables.");
@@ -461,6 +467,7 @@ public class StreamLoadPlanner {
TPipelineFragmentParams pipParams = new TPipelineFragmentParams();
pipParams.setProtocolVersion(PaloInternalServiceVersion.V1);
pipParams.setFragment(fragment.toThrift());
+ pipParams.setFragmentId(fragmentInstanceIdIndex);
pipParams.setDescTbl(analyzer.getDescTbl().toThrift());
pipParams.setCoord(new TNetworkAddress(FrontendOptions.getLocalHostAddress(), Config.rpc_port));
@@ -470,7 +477,7 @@ public class StreamLoadPlanner {
pipParams.setNumSenders(1);
TPipelineInstanceParams localParams = new TPipelineInstanceParams();
- localParams.setFragmentInstanceId(new TUniqueId(loadId.hi, loadId.lo + 1));
+ localParams.setFragmentInstanceId(new TUniqueId(loadId.hi, loadId.lo + fragmentInstanceIdIndex));
Map<Integer, List<TScanRangeParams>> perNodeScanRange = Maps.newHashMap();
List<TScanRangeParams> scanRangeParams = Lists.newArrayList();
@@ -504,8 +511,7 @@ public class StreamLoadPlanner {
queryGlobals.setNanoSeconds(LocalDateTime.now().getNano());
pipParams.setQueryGlobals(queryGlobals);
-
- // LOG.debug("stream load txn id: {}, plan: {}", streamLoadTask.getTxnId(), params);
+ pipParams.setTableName(destTable.getName());
return pipParams;
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
index 41d4a5e56e..206bd56d10 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
@@ -1741,16 +1741,23 @@ public class FrontendServiceImpl implements FrontendService.Iface {
return result;
}
long timeoutMs = request.isSetThriftRpcTimeoutMs() ? request.getThriftRpcTimeoutMs() : 5000;
- List<TExecPlanFragmentParams> planFragmentParamsList = new ArrayList<>(tableNames.size());
+ List planFragmentParamsList = new ArrayList<>(tableNames.size());
List<Long> tableIds = olapTables.stream().map(OlapTable::getId).collect(Collectors.toList());
// todo: if is multi table, we need consider the lock time and the timeout
+ boolean enablePipelineLoad = Config.enable_pipeline_load;
try {
multiTableFragmentInstanceIdIndexMap.putIfAbsent(request.getTxnId(), 1);
for (OlapTable table : olapTables) {
int index = multiTableFragmentInstanceIdIndexMap.get(request.getTxnId());
- TExecPlanFragmentParams planFragmentParams = generatePlanFragmentParams(request, db, fullDbName,
- table, timeoutMs, index);
- planFragmentParamsList.add(planFragmentParams);
+ if (enablePipelineLoad) {
+ planFragmentParamsList.add(generatePipelineStreamLoadPut(request, db, fullDbName, table, timeoutMs,
+ index));
+ } else {
+ TExecPlanFragmentParams planFragmentParams = generatePlanFragmentParams(request, db, fullDbName,
+ table, timeoutMs, index);
+
+ planFragmentParamsList.add(planFragmentParams);
+ }
multiTableFragmentInstanceIdIndexMap.put(request.getTxnId(), ++index);
}
Env.getCurrentGlobalTransactionMgr().getDatabaseTransactionMgr(db.getId())
@@ -1763,6 +1770,10 @@ public class FrontendServiceImpl implements FrontendService.Iface {
status.addToErrorMsgs(e.getClass().getSimpleName() + ": " + Strings.nullToEmpty(e.getMessage()));
return result;
}
+ if (enablePipelineLoad) {
+ result.setPipelineParams(planFragmentParamsList);
+ return result;
+ }
result.setParams(planFragmentParamsList);
return result;
}
@@ -1791,7 +1802,7 @@ public class FrontendServiceImpl implements FrontendService.Iface {
private TExecPlanFragmentParams generatePlanFragmentParams(TStreamLoadPutRequest request, Database db,
String fullDbName, OlapTable table,
long timeoutMs) throws UserException {
- return generatePlanFragmentParams(request, db, fullDbName, table, timeoutMs, 0);
+ return generatePlanFragmentParams(request, db, fullDbName, table, timeoutMs, 1);
}
private TExecPlanFragmentParams generatePlanFragmentParams(TStreamLoadPutRequest request, Database db,
@@ -1825,7 +1836,6 @@ public class FrontendServiceImpl implements FrontendService.Iface {
if (Strings.isNullOrEmpty(cluster)) {
cluster = SystemInfoService.DEFAULT_CLUSTER;
}
-
Env env = Env.getCurrentEnv();
String fullDbName = ClusterNamespace.getFullName(cluster, request.getDb());
Database db = env.getInternalCatalog().getDbNullable(fullDbName);
@@ -1838,21 +1848,37 @@ public class FrontendServiceImpl implements FrontendService.Iface {
}
long timeoutMs = request.isSetThriftRpcTimeoutMs() ? request.getThriftRpcTimeoutMs() : 5000;
Table table = db.getTableOrMetaException(request.getTbl(), TableType.OLAP);
+ return this.generatePipelineStreamLoadPut(request, db, fullDbName, (OlapTable) table, timeoutMs, 1);
+ }
+
+ private TPipelineFragmentParams generatePipelineStreamLoadPut(TStreamLoadPutRequest request, Database db,
+ String fullDbName, OlapTable table,
+ long timeoutMs,
+ int multiTableFragmentInstanceIdIndex)
+ throws UserException {
+ if (db == null) {
+ String dbName = fullDbName;
+ if (Strings.isNullOrEmpty(request.getCluster())) {
+ dbName = request.getDb();
+ }
+ throw new UserException("unknown database, database=" + dbName);
+ }
if (!table.tryReadLock(timeoutMs, TimeUnit.MILLISECONDS)) {
throw new UserException(
"get table read lock timeout, database=" + fullDbName + ",table=" + table.getName());
}
try {
StreamLoadTask streamLoadTask = StreamLoadTask.fromTStreamLoadPutRequest(request);
- StreamLoadPlanner planner = new StreamLoadPlanner(db, (OlapTable) table, streamLoadTask);
- TPipelineFragmentParams plan = planner.planForPipeline(streamLoadTask.getId());
+ StreamLoadPlanner planner = new StreamLoadPlanner(db, table, streamLoadTask);
+ TPipelineFragmentParams plan = planner.planForPipeline(streamLoadTask.getId(),
+ multiTableFragmentInstanceIdIndex);
// add table indexes to transaction state
TransactionState txnState = Env.getCurrentGlobalTransactionMgr()
.getTransactionState(db.getId(), request.getTxnId());
if (txnState == null) {
throw new UserException("txn does not exist: " + request.getTxnId());
}
- txnState.addTableIndexes((OlapTable) table);
+ txnState.addTableIndexes(table);
return plan;
} finally {
table.readUnlock();
diff --git a/gensrc/thrift/FrontendService.thrift b/gensrc/thrift/FrontendService.thrift
index 0b74c10fba..4630f8bdd0 100644
--- a/gensrc/thrift/FrontendService.thrift
+++ b/gensrc/thrift/FrontendService.thrift
@@ -618,6 +618,7 @@ struct TStreamLoadMultiTablePutResult {
1: required Status.TStatus status
// valid when status is OK
2: optional list<PaloInternalService.TExecPlanFragmentParams> params
+ 3: optional list<PaloInternalService.TPipelineFragmentParams> pipeline_params
}
struct TKafkaRLTaskProgress {
diff --git a/gensrc/thrift/PaloInternalService.thrift b/gensrc/thrift/PaloInternalService.thrift
index e556ee46f1..40457481b7 100644
--- a/gensrc/thrift/PaloInternalService.thrift
+++ b/gensrc/thrift/PaloInternalService.thrift
@@ -631,6 +631,7 @@ struct TPipelineFragmentParams {
24: list<TPipelineInstanceParams> local_params
26: optional list<TPipelineWorkloadGroup> workload_groups
27: optional TTxnParams txn_conf
+ 28: optional string table_name
}
struct TPipelineFragmentParamsList {
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org
[doris] 07/14: [Fix](Planner) fix limit execute before sort in show export job (#21663)
Posted by kx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
commit bd0ed538a51a080a9926874f00d2f9a269de38f1
Author: LiBinfeng <46...@users.noreply.github.com>
AuthorDate: Thu Jul 13 11:17:28 2023 +0800
[Fix](Planner) fix limit execute before sort in show export job (#21663)
Problem:
When doing show export jobs, limit would execute before sort before changed. So the result would not be expected because limit always cut results first and we can not get what we want.
Example:
we having export job1 and job2 with JobId1 > JobId2. We want to get job with JobId1
show export from db order by JobId desc limit 1;
We do limit 1 first, so we would probably get Job2 because JobId assigned from small to large
Solve:
We can not cut results first if we have order by clause. And cut result set after sorting
---
.../main/java/org/apache/doris/load/ExportMgr.java | 6 ++-
.../suites/export_p0/test_export_basic.groovy | 43 ++++++++++++++++++++++
2 files changed, 48 insertions(+), 1 deletion(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/ExportMgr.java b/fe/fe-core/src/main/java/org/apache/doris/load/ExportMgr.java
index a81144138e..0e0b26f273 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/ExportMgr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/ExportMgr.java
@@ -307,7 +307,7 @@ public class ExportMgr extends MasterDaemon {
exportJobInfos.add(composeExportJobInfo(job));
}
- if (++counter >= resultNum) {
+ if (++counter >= resultNum && orderByPairs == null) {
break;
}
}
@@ -327,8 +327,12 @@ public class ExportMgr extends MasterDaemon {
Collections.sort(exportJobInfos, comparator);
List<List<String>> results = Lists.newArrayList();
+ int counter = 0;
for (List<Comparable> list : exportJobInfos) {
results.add(list.stream().map(e -> e.toString()).collect(Collectors.toList()));
+ if (++counter >= resultNum) {
+ break;
+ }
}
return results;
diff --git a/regression-test/suites/export_p0/test_export_basic.groovy b/regression-test/suites/export_p0/test_export_basic.groovy
index 07c3168c5d..95805db491 100644
--- a/regression-test/suites/export_p0/test_export_basic.groovy
+++ b/regression-test/suites/export_p0/test_export_basic.groovy
@@ -386,4 +386,47 @@ suite("test_export_basic", "p0") {
try_sql("DROP TABLE IF EXISTS ${table_load_name}")
delete_files.call("${outFilePath}")
}
+
+ // 5. test order by and limit clause
+ uuid1 = UUID.randomUUID().toString()
+ outFilePath = """${outfile_path_prefix}_${uuid1}"""
+ label1 = "label_${uuid1}"
+ uuid2 = UUID.randomUUID().toString()
+ label2 = "label_${uuid2}"
+ try {
+ // check export path
+ check_path_exists.call("${outFilePath}")
+
+ // exec export
+ sql """
+ EXPORT TABLE ${table_export_name} PARTITION (less_than_20)
+ TO "file://${outFilePath}/"
+ PROPERTIES(
+ "label" = "${label1}",
+ "format" = "csv",
+ "column_separator"=","
+ );
+ """
+ sql """
+ EXPORT TABLE ${table_export_name} PARTITION (between_20_70)
+ TO "file://${outFilePath}/"
+ PROPERTIES(
+ "label" = "${label2}",
+ "format" = "csv",
+ "column_separator"=","
+ );
+ """
+ waiting_export.call(label1)
+ waiting_export.call(label2)
+
+ // check file amounts
+ check_file_amounts.call("${outFilePath}", 2)
+
+ // check show export correctness
+ def res = sql """ show export where STATE = "FINISHED" order by JobId desc limit 2"""
+ assertTrue(res[0][0] > res[1][0])
+
+ } finally {
+ delete_files.call("${outFilePath}")
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org
[doris] 01/14: [FIX](serde)Fix decimal for arrow serde (#21716)
Posted by kx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
commit 677b46b0eff98126eccbb938b43a02a3aeda6b30
Author: amory <wa...@selectdb.com>
AuthorDate: Wed Jul 12 19:15:48 2023 +0800
[FIX](serde)Fix decimal for arrow serde (#21716)
---
.../data_types/serde/data_type_decimal_serde.cpp | 26 ++++----
.../serde/data_type_serde_arrow_test.cpp | 78 +++++++++++++++++++++-
2 files changed, 88 insertions(+), 16 deletions(-)
diff --git a/be/src/vec/data_types/serde/data_type_decimal_serde.cpp b/be/src/vec/data_types/serde/data_type_decimal_serde.cpp
index 4137dd885c..5e46c996e7 100644
--- a/be/src/vec/data_types/serde/data_type_decimal_serde.cpp
+++ b/be/src/vec/data_types/serde/data_type_decimal_serde.cpp
@@ -80,10 +80,8 @@ void DataTypeDecimalSerDe<T>::write_column_to_arrow(const IColumn& column, const
array_builder->type()->name());
continue;
}
- const auto& data_ref = col.get_data_at(i);
- const int32_t* p_value = reinterpret_cast<const int32_t*>(data_ref.data);
- int64_t high = *p_value > 0 ? 0 : 1UL << 63;
- arrow::Decimal128 value(high, *p_value > 0 ? *p_value : -*p_value);
+ Int128 p_value = Int128(col.get_element(i));
+ arrow::Decimal128 value(reinterpret_cast<const uint8_t*>(&p_value));
checkArrowStatus(builder.Append(value), column.get_name(),
array_builder->type()->name());
}
@@ -96,10 +94,8 @@ void DataTypeDecimalSerDe<T>::write_column_to_arrow(const IColumn& column, const
array_builder->type()->name());
continue;
}
- const auto& data_ref = col.get_data_at(i);
- const int64_t* p_value = reinterpret_cast<const int64_t*>(data_ref.data);
- int64_t high = *p_value > 0 ? 0 : 1UL << 63;
- arrow::Decimal128 value(high, *p_value > 0 ? *p_value : -*p_value);
+ Int128 p_value = Int128(col.get_element(i));
+ arrow::Decimal128 value(reinterpret_cast<const uint8_t*>(&p_value));
checkArrowStatus(builder.Append(value), column.get_name(),
array_builder->type()->name());
}
@@ -112,13 +108,13 @@ template <typename T>
void DataTypeDecimalSerDe<T>::read_column_from_arrow(IColumn& column,
const arrow::Array* arrow_array, int start,
int end, const cctz::time_zone& ctz) const {
+ auto concrete_array = down_cast<const arrow::DecimalArray*>(arrow_array);
+ const auto* arrow_decimal_type =
+ static_cast<const arrow::DecimalType*>(arrow_array->type().get());
+ const auto arrow_scale = arrow_decimal_type->scale();
+ auto& column_data = static_cast<ColumnDecimal<T>&>(column).get_data();
if constexpr (std::is_same_v<T, Decimal<Int128>>) {
- auto& column_data = static_cast<ColumnDecimal<vectorized::Decimal128>&>(column).get_data();
- auto concrete_array = down_cast<const arrow::DecimalArray*>(arrow_array);
- const auto* arrow_decimal_type =
- static_cast<const arrow::DecimalType*>(arrow_array->type().get());
// TODO check precision
- const auto arrow_scale = arrow_decimal_type->scale();
for (size_t value_i = start; value_i < end; ++value_i) {
auto value = *reinterpret_cast<const vectorized::Decimal128*>(
concrete_array->Value(value_i));
@@ -140,6 +136,10 @@ void DataTypeDecimalSerDe<T>::read_column_from_arrow(IColumn& column,
}
column_data.emplace_back(value);
}
+ } else if constexpr (std::is_same_v<T, Decimal64> || std::is_same_v<T, Decimal32>) {
+ for (size_t value_i = start; value_i < end; ++value_i) {
+ column_data.emplace_back(*reinterpret_cast<const T*>(concrete_array->Value(value_i)));
+ }
} else {
LOG(FATAL) << "Not support read " << column.get_name() << " from arrow";
}
diff --git a/be/test/vec/data_types/serde/data_type_serde_arrow_test.cpp b/be/test/vec/data_types/serde/data_type_serde_arrow_test.cpp
index a51cb9bc90..7792d40839 100644
--- a/be/test/vec/data_types/serde/data_type_serde_arrow_test.cpp
+++ b/be/test/vec/data_types/serde/data_type_serde_arrow_test.cpp
@@ -51,6 +51,7 @@
#include "util/arrow/row_batch.h"
#include "util/bitmap_value.h"
#include "util/quantile_state.h"
+#include "util/string_parser.hpp"
#include "vec/columns/column.h"
#include "vec/columns/column_array.h"
#include "vec/columns/column_complex.h"
@@ -77,6 +78,7 @@
#include "vec/data_types/data_type_time_v2.h"
#include "vec/runtime/vdatetime_value.h"
#include "vec/utils/arrow_column_to_doris_column.h"
+
namespace doris::vectorized {
template <bool is_scalar>
@@ -84,12 +86,16 @@ void serialize_and_deserialize_arrow_test() {
vectorized::Block block;
std::vector<std::tuple<std::string, FieldType, int, PrimitiveType, bool>> cols;
if constexpr (is_scalar) {
- cols = {{"k1", FieldType::OLAP_FIELD_TYPE_INT, 1, TYPE_INT, false},
+ cols = {
+ {"k1", FieldType::OLAP_FIELD_TYPE_INT, 1, TYPE_INT, false},
{"k7", FieldType::OLAP_FIELD_TYPE_INT, 7, TYPE_INT, true},
{"k2", FieldType::OLAP_FIELD_TYPE_STRING, 2, TYPE_STRING, false},
{"k3", FieldType::OLAP_FIELD_TYPE_DECIMAL128I, 3, TYPE_DECIMAL128I, false},
{"k11", FieldType::OLAP_FIELD_TYPE_DATETIME, 11, TYPE_DATETIME, false},
- {"k4", FieldType::OLAP_FIELD_TYPE_BOOL, 4, TYPE_BOOLEAN, false}};
+ {"k4", FieldType::OLAP_FIELD_TYPE_BOOL, 4, TYPE_BOOLEAN, false},
+ {"k5", FieldType::OLAP_FIELD_TYPE_DECIMAL32, 5, TYPE_DECIMAL32, false},
+ {"k6", FieldType::OLAP_FIELD_TYPE_DECIMAL64, 6, TYPE_DECIMAL64, false},
+ };
} else {
cols = {{"a", FieldType::OLAP_FIELD_TYPE_ARRAY, 6, TYPE_ARRAY, true},
{"m", FieldType::OLAP_FIELD_TYPE_MAP, 8, TYPE_MAP, true},
@@ -153,6 +159,72 @@ void serialize_and_deserialize_arrow_test() {
block.insert(std::move(type_and_name));
}
break;
+ case TYPE_DECIMAL32:
+ type_desc.precision = 9;
+ type_desc.scale = 2;
+ tslot.__set_slotType(type_desc.to_thrift());
+ {
+ vectorized::DataTypePtr decimal_data_type =
+ std::make_shared<DataTypeDecimal<Decimal32>>(type_desc.precision,
+ type_desc.scale);
+ auto decimal_column = decimal_data_type->create_column();
+ auto& data = ((vectorized::ColumnDecimal<vectorized::Decimal<vectorized::Int32>>*)
+ decimal_column.get())
+ ->get_data();
+ for (int i = 0; i < row_num; ++i) {
+ if (i == 0) {
+ data.push_back(Int32(0));
+ continue;
+ }
+ Int32 val;
+ StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
+ i % 2 == 0 ? val = StringParser::string_to_decimal<__int128>(
+ "1234567.56", 11, type_desc.precision, type_desc.scale,
+ &result)
+ : val = StringParser::string_to_decimal<__int128>(
+ "-1234567.56", 12, type_desc.precision, type_desc.scale,
+ &result);
+ EXPECT_TRUE(result == StringParser::PARSE_SUCCESS);
+ data.push_back(val);
+ }
+
+ vectorized::ColumnWithTypeAndName type_and_name(decimal_column->get_ptr(),
+ decimal_data_type, col_name);
+ block.insert(type_and_name);
+ }
+ break;
+ case TYPE_DECIMAL64:
+ type_desc.precision = 18;
+ type_desc.scale = 6;
+ tslot.__set_slotType(type_desc.to_thrift());
+ {
+ vectorized::DataTypePtr decimal_data_type =
+ std::make_shared<DataTypeDecimal<Decimal64>>(type_desc.precision,
+ type_desc.scale);
+ auto decimal_column = decimal_data_type->create_column();
+ auto& data = ((vectorized::ColumnDecimal<vectorized::Decimal<vectorized::Int64>>*)
+ decimal_column.get())
+ ->get_data();
+ for (int i = 0; i < row_num; ++i) {
+ if (i == 0) {
+ data.push_back(Int64(0));
+ continue;
+ }
+ Int64 val;
+ StringParser::ParseResult result = StringParser::PARSE_SUCCESS;
+ std::string decimal_string =
+ i % 2 == 0 ? "-123456789012.123456" : "123456789012.123456";
+ val = StringParser::string_to_decimal<__int128>(
+ decimal_string.c_str(), decimal_string.size(), type_desc.precision,
+ type_desc.scale, &result);
+ EXPECT_TRUE(result == StringParser::PARSE_SUCCESS);
+ data.push_back(val);
+ }
+ vectorized::ColumnWithTypeAndName type_and_name(decimal_column->get_ptr(),
+ decimal_data_type, col_name);
+ block.insert(type_and_name);
+ }
+ break;
case TYPE_DECIMAL128I:
type_desc.precision = 27;
type_desc.scale = 9;
@@ -362,7 +434,7 @@ void serialize_and_deserialize_arrow_test() {
// serialize
std::shared_ptr<arrow::RecordBatch> result;
- std::cout << "block structure: " << block.dump_structure() << std::endl;
+ std::cout << "block data: " << block.dump_data(0, row_num) << std::endl;
std::cout << "_arrow_schema: " << _arrow_schema->ToString(true) << std::endl;
convert_to_arrow_batch(block, _arrow_schema, arrow::default_memory_pool(), &result);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org
[doris] 08/14: [Fix](rowset) When a rowset is cooled down, it is directly deleted. This can result in data query misses in the second phase of a two-phase query. (#21741)
Posted by kx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
commit 9542bc310e415fe8a27106860b4a301c4ea4801c
Author: lihangyu <15...@163.com>
AuthorDate: Thu Jul 13 11:46:12 2023 +0800
[Fix](rowset) When a rowset is cooled down, it is directly deleted. This can result in data query misses in the second phase of a two-phase query. (#21741)
* [Fix](rowset) When a rowset is cooled down, it is directly deleted. This can result in data query misses in the second phase of a two-phase query.
related pr #20732
There are two reasons for moving the logic of delayed deletion from the Tablet to the StorageEngine. The first reason is to consolidate the logic and unify the delayed operations. The second reason is that delayed garbage collection during queries can cause rowsets to remain in the "stale rowsets" state, preventing the timely deletion of rowset metadata, It may cause rowset metadata too large.
* not use unused rowsets
---
be/src/olap/storage_engine.cpp | 25 ++++++++++++++++++++++++-
be/src/olap/storage_engine.h | 10 ++++++++++
be/src/olap/tablet.cpp | 5 -----
be/src/service/internal_service.cpp | 5 +++--
be/src/vec/exec/scan/new_olap_scanner.cpp | 1 +
5 files changed, 38 insertions(+), 8 deletions(-)
diff --git a/be/src/olap/storage_engine.cpp b/be/src/olap/storage_engine.cpp
index d52353b3cb..a182fccd31 100644
--- a/be/src/olap/storage_engine.cpp
+++ b/be/src/olap/storage_engine.cpp
@@ -903,11 +903,15 @@ void StorageEngine::start_delete_unused_rowset() {
{
std::lock_guard<std::mutex> lock(_gc_mutex);
for (auto it = _unused_rowsets.begin(); it != _unused_rowsets.end();) {
- if (it->second.use_count() == 1 && it->second->need_delete_file()) {
+ uint64_t now = UnixSeconds();
+ if (it->second.use_count() == 1 && it->second->need_delete_file() &&
+ // We delay the GC time of this rowset since it's maybe still needed, see #20732
+ now > it->second->delayed_expired_timestamp()) {
if (it->second->is_local()) {
unused_rowsets_copy[it->first] = it->second;
}
// remote rowset data will be reclaimed by `remove_unused_remote_files`
+ evict_querying_rowset(it->second->rowset_id());
it = _unused_rowsets.erase(it);
} else {
++it;
@@ -1169,4 +1173,23 @@ Status StorageEngine::get_compaction_status_json(std::string* result) {
return Status::OK();
}
+void StorageEngine::add_quering_rowset(RowsetSharedPtr rs) {
+ std::lock_guard<std::mutex> lock(_quering_rowsets_mutex);
+ _querying_rowsets.emplace(rs->rowset_id(), rs);
+}
+
+RowsetSharedPtr StorageEngine::get_quering_rowset(RowsetId rs_id) {
+ std::lock_guard<std::mutex> lock(_quering_rowsets_mutex);
+ auto it = _querying_rowsets.find(rs_id);
+ if (it != _querying_rowsets.end()) {
+ return it->second;
+ }
+ return nullptr;
+}
+
+void StorageEngine::evict_querying_rowset(RowsetId rs_id) {
+ std::lock_guard<std::mutex> lock(_quering_rowsets_mutex);
+ _querying_rowsets.erase(rs_id);
+}
+
} // namespace doris
diff --git a/be/src/olap/storage_engine.h b/be/src/olap/storage_engine.h
index d6215586ed..2bd01ba2cb 100644
--- a/be/src/olap/storage_engine.h
+++ b/be/src/olap/storage_engine.h
@@ -224,6 +224,12 @@ public:
int64_t transaction_id, bool is_recover);
int64_t get_pending_publish_min_version(int64_t tablet_id);
+ void add_quering_rowset(RowsetSharedPtr rs);
+
+ RowsetSharedPtr get_quering_rowset(RowsetId rs_id);
+
+ void evict_querying_rowset(RowsetId rs_id);
+
private:
// Instance should be inited from `static open()`
// MUST NOT be called in other circumstances.
@@ -372,6 +378,10 @@ private:
// map<rowset_id(str), RowsetSharedPtr>, if we use RowsetId as the key, we need custom hash func
std::unordered_map<std::string, RowsetSharedPtr> _unused_rowsets;
+ // Hold reference of quering rowsets
+ std::mutex _quering_rowsets_mutex;
+ std::unordered_map<RowsetId, RowsetSharedPtr, HashOfRowsetId> _querying_rowsets;
+
// Count the memory consumption of segment compaction tasks.
std::shared_ptr<MemTracker> _segcompaction_mem_tracker;
// This mem tracker is only for tracking memory use by segment meta data such as footer or index page.
diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp
index d5652ba6d5..417fdcee5c 100644
--- a/be/src/olap/tablet.cpp
+++ b/be/src/olap/tablet.cpp
@@ -781,11 +781,6 @@ void Tablet::delete_expired_stale_rowset() {
for (auto& timestampedVersion : to_delete_version) {
auto it = _stale_rs_version_map.find(timestampedVersion->version());
if (it != _stale_rs_version_map.end()) {
- uint64_t now = UnixSeconds();
- if (now <= it->second->delayed_expired_timestamp()) {
- // Some rowsets gc time was delayed, ignore
- continue;
- }
// delete rowset
StorageEngine::instance()->add_unused_rowset(it->second);
_stale_rs_version_map.erase(it);
diff --git a/be/src/service/internal_service.cpp b/be/src/service/internal_service.cpp
index 05d9f16cfe..745de1bb71 100644
--- a/be/src/service/internal_service.cpp
+++ b/be/src/service/internal_service.cpp
@@ -1540,8 +1540,9 @@ Status PInternalServiceImpl::_multi_get(const PMultiGetRequest& request,
if (!tablet) {
continue;
}
- BetaRowsetSharedPtr rowset =
- std::static_pointer_cast<BetaRowset>(tablet->get_rowset(rowset_id));
+ // We ensured it's rowset is not released when init Tablet reader param, rowset->update_delayed_expired_timestamp();
+ BetaRowsetSharedPtr rowset = std::static_pointer_cast<BetaRowset>(
+ StorageEngine::instance()->get_quering_rowset(rowset_id));
if (!rowset) {
LOG(INFO) << "no such rowset " << rowset_id;
continue;
diff --git a/be/src/vec/exec/scan/new_olap_scanner.cpp b/be/src/vec/exec/scan/new_olap_scanner.cpp
index 0b631b143e..b945d42f6c 100644
--- a/be/src/vec/exec/scan/new_olap_scanner.cpp
+++ b/be/src/vec/exec/scan/new_olap_scanner.cpp
@@ -413,6 +413,7 @@ Status NewOlapScanner::_init_tablet_reader_params(
UnixSeconds() + _tablet_reader_params.runtime_state->execution_timeout() +
delayed_s;
rs_reader->rowset()->update_delayed_expired_timestamp(delayed_expired_timestamp);
+ StorageEngine::instance()->add_quering_rowset(rs_reader->rowset());
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org
[doris] 03/14: [opt](regression case) add more index change case (#21734)
Posted by kx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
commit d036a024d57d03b63fed6972c31e20dde97e3194
Author: YueW <45...@users.noreply.github.com>
AuthorDate: Wed Jul 12 21:52:48 2023 +0800
[opt](regression case) add more index change case (#21734)
---
be/src/olap/task/index_builder.cpp | 5 -
.../index_change/test_index_change_7.out | 121 +++++++++++++++++++++
.../index_change/test_index_change_1.groovy | 2 -
.../index_change/test_index_change_2.groovy | 2 -
.../index_change/test_index_change_3.groovy | 2 -
.../index_change/test_index_change_4.groovy | 2 -
.../index_change/test_index_change_5.groovy | 2 -
.../index_change/test_index_change_6.groovy | 2 -
.../index_change/test_index_change_7.groovy | 118 ++++++++++++++++++++
9 files changed, 239 insertions(+), 17 deletions(-)
diff --git a/be/src/olap/task/index_builder.cpp b/be/src/olap/task/index_builder.cpp
index 6af5e18d24..67e39104c6 100644
--- a/be/src/olap/task/index_builder.cpp
+++ b/be/src/olap/task/index_builder.cpp
@@ -398,11 +398,6 @@ Status IndexBuilder::do_build_inverted_index() {
"failed to obtain build inverted index lock. tablet={}", _tablet->tablet_id());
}
- if (_tablet->get_clone_occurred()) {
- _tablet->set_clone_occurred(false);
- return Status::Error<ErrorCode::BE_CLONE_OCCURRED>("get_clone_occurred failed");
- }
-
_input_rowsets =
_tablet->pick_candidate_rowsets_to_build_inverted_index(_alter_index_ids, _is_drop_op);
if (_input_rowsets.empty()) {
diff --git a/regression-test/data/inverted_index_p0/index_change/test_index_change_7.out b/regression-test/data/inverted_index_p0/index_change/test_index_change_7.out
new file mode 100644
index 0000000000..cb96edff04
--- /dev/null
+++ b/regression-test/data/inverted_index_p0/index_change/test_index_change_7.out
@@ -0,0 +1,121 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !select1 --
+1 [10, 20, 30] ["i", "love", "china"]
+2 [20, 30, 40] ["i", "love", "north korea"]
+3 [30, 40, 50] \N
+4 [40, 50, 60] \N
+
+-- !select2 --
+1 [10, 20, 30] ["i", "love", "china"]
+
+-- !select3 --
+1 [10, 20, 30] ["i", "love", "china"]
+2 [20, 30, 40] ["i", "love", "north korea"]
+
+-- !select4 --
+2 [20, 30, 40] ["i", "love", "north korea"]
+
+-- !select5 --
+2 [20, 30, 40] ["i", "love", "north korea"]
+
+-- !select6 --
+2 [20, 30, 40] ["i", "love", "north korea"]
+3 [30, 40, 50] \N
+4 [40, 50, 60] \N
+
+-- !select7 --
+1 [10, 20, 30] ["i", "love", "china"]
+2 [20, 30, 40] ["i", "love", "north korea"]
+3 [30, 40, 50] \N
+4 [40, 50, 60] \N
+
+-- !select8 --
+3 [30, 40, 50] \N
+4 [40, 50, 60] \N
+
+-- !select9 --
+1 [10, 20, 30] ["i", "love", "china"]
+2 [20, 30, 40] ["i", "love", "north korea"]
+3 [30, 40, 50] \N
+
+-- !select10 --
+1 [10, 20, 30] ["i", "love", "china"]
+
+-- !select11 --
+1 [10, 20, 30] ["i", "love", "china"]
+2 [20, 30, 40] ["i", "love", "north korea"]
+
+-- !select12 --
+1 [10, 20, 30] ["i", "love", "china"]
+2 [20, 30, 40] ["i", "love", "north korea"]
+3 [30, 40, 50] \N
+
+-- !select13 --
+2 [20, 30, 40] ["i", "love", "north korea"]
+3 [30, 40, 50] \N
+4 [40, 50, 60] \N
+
+-- !select14 --
+3 [30, 40, 50] \N
+4 [40, 50, 60] \N
+
+-- !select15 --
+4 [40, 50, 60] \N
+
+-- !select16 --
+1 [10, 20, 30] ["i", "love", "china"]
+
+-- !select17 --
+1 [10, 20, 30] ["i", "love", "china"]
+2 [20, 30, 40] ["i", "love", "north korea"]
+
+-- !select18 --
+2 [20, 30, 40] ["i", "love", "north korea"]
+
+-- !select19 --
+2 [20, 30, 40] ["i", "love", "north korea"]
+
+-- !select20 --
+2 [20, 30, 40] ["i", "love", "north korea"]
+3 [30, 40, 50] \N
+4 [40, 50, 60] \N
+
+-- !select21 --
+1 [10, 20, 30] ["i", "love", "china"]
+2 [20, 30, 40] ["i", "love", "north korea"]
+3 [30, 40, 50] \N
+4 [40, 50, 60] \N
+
+-- !select22 --
+3 [30, 40, 50] \N
+4 [40, 50, 60] \N
+
+-- !select23 --
+1 [10, 20, 30] ["i", "love", "china"]
+2 [20, 30, 40] ["i", "love", "north korea"]
+3 [30, 40, 50] \N
+
+-- !select24 --
+1 [10, 20, 30] ["i", "love", "china"]
+
+-- !select25 --
+1 [10, 20, 30] ["i", "love", "china"]
+2 [20, 30, 40] ["i", "love", "north korea"]
+
+-- !select26 --
+1 [10, 20, 30] ["i", "love", "china"]
+2 [20, 30, 40] ["i", "love", "north korea"]
+3 [30, 40, 50] \N
+
+-- !select27 --
+2 [20, 30, 40] ["i", "love", "north korea"]
+3 [30, 40, 50] \N
+4 [40, 50, 60] \N
+
+-- !select28 --
+3 [30, 40, 50] \N
+4 [40, 50, 60] \N
+
+-- !select29 --
+4 [40, 50, 60] \N
+
diff --git a/regression-test/suites/inverted_index_p0/index_change/test_index_change_1.groovy b/regression-test/suites/inverted_index_p0/index_change/test_index_change_1.groovy
index 7fa805c0ba..9cfa77c587 100644
--- a/regression-test/suites/inverted_index_p0/index_change/test_index_change_1.groovy
+++ b/regression-test/suites/inverted_index_p0/index_change/test_index_change_1.groovy
@@ -78,8 +78,6 @@ suite("test_index_change_1") {
qt_select1 """ SELECT * FROM ${tableName} t ORDER BY user_id,date,city,age,sex; """
- //TabletId,ReplicaId,BackendId,SchemaHash,Version,LstSuccessVersion,LstFailedVersion,LstFailedTime,LocalDataSize,RemoteDataSize,RowCount,State,LstConsistencyCheckTime,CheckVersion,VersionCount,QueryHits,PathHash,MetaUrl,CompactionStatus
- String[][] tablets = sql """ show tablets from ${tableName}; """
// create inverted index
sql """ CREATE INDEX idx_user_id ON ${tableName}(`user_id`) USING INVERTED """
sql """ CREATE INDEX idx_note ON ${tableName}(`note`) USING INVERTED PROPERTIES("parser"="english") """
diff --git a/regression-test/suites/inverted_index_p0/index_change/test_index_change_2.groovy b/regression-test/suites/inverted_index_p0/index_change/test_index_change_2.groovy
index e80b805204..e146418038 100644
--- a/regression-test/suites/inverted_index_p0/index_change/test_index_change_2.groovy
+++ b/regression-test/suites/inverted_index_p0/index_change/test_index_change_2.groovy
@@ -92,8 +92,6 @@ suite("test_index_change_2") {
qt_select5 """ SELECT * FROM ${tableName} t WHERE note MATCH_PHRASE 'electrical engineer' ORDER BY user_id; """
qt_select6 """ SELECT * FROM ${tableName} t WHERE note MATCH 'engineer Developer' AND city match_all 'Shanghai China' ORDER BY user_id; """
- //TabletId,ReplicaId,BackendId,SchemaHash,Version,LstSuccessVersion,LstFailedVersion,LstFailedTime,LocalDataSize,RemoteDataSize,RowCount,State,LstConsistencyCheckTime,CheckVersion,VersionCount,QueryHits,PathHash,MetaUrl,CompactionStatus
- String[][] tablets = sql """ show tablets from ${tableName}; """
// create inverted index idx_city
sql """ CREATE INDEX idx_city ON ${tableName}(`city`) USING INVERTED PROPERTIES("parser"="english") """
diff --git a/regression-test/suites/inverted_index_p0/index_change/test_index_change_3.groovy b/regression-test/suites/inverted_index_p0/index_change/test_index_change_3.groovy
index deb77a028e..34a416f0d8 100644
--- a/regression-test/suites/inverted_index_p0/index_change/test_index_change_3.groovy
+++ b/regression-test/suites/inverted_index_p0/index_change/test_index_change_3.groovy
@@ -92,8 +92,6 @@ suite("test_index_change_3") {
qt_select5 """ SELECT * FROM ${tableName} t WHERE note MATCH_PHRASE 'electrical engineer' ORDER BY user_id; """
qt_select6 """ SELECT * FROM ${tableName} t WHERE note MATCH 'engineer Developer' AND city match_all 'Shanghai China' ORDER BY user_id; """
- //TabletId,ReplicaId,BackendId,SchemaHash,Version,LstSuccessVersion,LstFailedVersion,LstFailedTime,LocalDataSize,RemoteDataSize,RowCount,State,LstConsistencyCheckTime,CheckVersion,VersionCount,QueryHits,PathHash,MetaUrl,CompactionStatus
- String[][] tablets = sql """ show tablets from ${tableName}; """
// create inverted index idx_city
sql """ CREATE INDEX idx_city ON ${tableName}(`city`) USING INVERTED PROPERTIES("parser"="english") """
// build index
diff --git a/regression-test/suites/inverted_index_p0/index_change/test_index_change_4.groovy b/regression-test/suites/inverted_index_p0/index_change/test_index_change_4.groovy
index 78c24ad660..6c0dbe463f 100644
--- a/regression-test/suites/inverted_index_p0/index_change/test_index_change_4.groovy
+++ b/regression-test/suites/inverted_index_p0/index_change/test_index_change_4.groovy
@@ -92,8 +92,6 @@ suite("test_index_change_4") {
qt_select5 """ SELECT * FROM ${tableName} t WHERE note MATCH_PHRASE 'electrical engineer' ORDER BY user_id; """
qt_select6 """ SELECT * FROM ${tableName} t WHERE note MATCH 'engineer Developer' AND city match_all 'Shanghai China' ORDER BY user_id; """
- //TabletId,ReplicaId,BackendId,SchemaHash,Version,LstSuccessVersion,LstFailedVersion,LstFailedTime,LocalDataSize,RemoteDataSize,RowCount,State,LstConsistencyCheckTime,CheckVersion,VersionCount,QueryHits,PathHash,MetaUrl,CompactionStatus
- String[][] tablets = sql """ show tablets from ${tableName}; """
// drop inverted index idx_user_id, idx_note
sql """ DROP INDEX idx_user_id ON ${tableName} """
sql """ DROP INDEX idx_note ON ${tableName} """
diff --git a/regression-test/suites/inverted_index_p0/index_change/test_index_change_5.groovy b/regression-test/suites/inverted_index_p0/index_change/test_index_change_5.groovy
index 4817d6f2d5..dd8a6b495a 100644
--- a/regression-test/suites/inverted_index_p0/index_change/test_index_change_5.groovy
+++ b/regression-test/suites/inverted_index_p0/index_change/test_index_change_5.groovy
@@ -86,8 +86,6 @@ suite("test_index_change_5") {
qt_select5 """ SELECT * FROM ${tableName} t WHERE note MATCH_PHRASE 'electrical engineer' ORDER BY user_id; """
qt_select6 """ SELECT * FROM ${tableName} t WHERE note MATCH 'engineer Developer' AND city match_all 'Shanghai China' ORDER BY user_id; """
- //TabletId,ReplicaId,BackendId,SchemaHash,Version,LstSuccessVersion,LstFailedVersion,LstFailedTime,LocalDataSize,RemoteDataSize,RowCount,State,LstConsistencyCheckTime,CheckVersion,VersionCount,QueryHits,PathHash,MetaUrl,CompactionStatus
- String[][] tablets = sql """ show tablets from ${tableName}; """
// drop inverted index idx_user_id, idx_note
sql """ DROP INDEX idx_user_id ON ${tableName} """
sql """ DROP INDEX idx_note ON ${tableName} """
diff --git a/regression-test/suites/inverted_index_p0/index_change/test_index_change_6.groovy b/regression-test/suites/inverted_index_p0/index_change/test_index_change_6.groovy
index c839fae0d0..45c68bd7ce 100644
--- a/regression-test/suites/inverted_index_p0/index_change/test_index_change_6.groovy
+++ b/regression-test/suites/inverted_index_p0/index_change/test_index_change_6.groovy
@@ -92,8 +92,6 @@ suite("test_index_change_6") {
qt_select5 """ SELECT * FROM ${tableName} t WHERE note MATCH_PHRASE 'electrical engineer' ORDER BY user_id; """
qt_select6 """ SELECT * FROM ${tableName} t WHERE note MATCH 'engineer Developer' AND city match_all 'Shanghai China' ORDER BY user_id; """
- //TabletId,ReplicaId,BackendId,SchemaHash,Version,LstSuccessVersion,LstFailedVersion,LstFailedTime,LocalDataSize,RemoteDataSize,RowCount,State,LstConsistencyCheckTime,CheckVersion,VersionCount,QueryHits,PathHash,MetaUrl,CompactionStatus
- String[][] tablets = sql """ show tablets from ${tableName}; """
// drop inverted index idx_user_id, idx_note
sql """ DROP INDEX idx_user_id ON ${tableName} """
sql """ DROP INDEX idx_note ON ${tableName} """
diff --git a/regression-test/suites/inverted_index_p0/index_change/test_index_change_7.groovy b/regression-test/suites/inverted_index_p0/index_change/test_index_change_7.groovy
new file mode 100644
index 0000000000..f26cf6792f
--- /dev/null
+++ b/regression-test/suites/inverted_index_p0/index_change/test_index_change_7.groovy
@@ -0,0 +1,118 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+import org.codehaus.groovy.runtime.IOGroovyMethods
+
+suite("test_index_change_7") {
+ def timeout = 60000
+ def delta_time = 1000
+ def alter_res = "null"
+ def useTime = 0
+ def wait_for_build_index_on_partition_finish = { table_name, OpTimeout ->
+ for(int t = delta_time; t <= OpTimeout; t += delta_time){
+ alter_res = sql """SHOW BUILD INDEX WHERE TableName = "${table_name}";"""
+ def expected_finished_num = alter_res.size();
+ def finished_num = 0;
+ for (int i = 0; i < expected_finished_num; i++) {
+ logger.info(table_name + " build index job state: " + alter_res[i][7] + i)
+ if (alter_res[i][7] == "FINISHED") {
+ ++finished_num;
+ }
+ }
+ if (finished_num == expected_finished_num) {
+ logger.info(table_name + " all build index jobs finished, detail: " + alter_res)
+ break
+ }
+ useTime = t
+ sleep(delta_time)
+ }
+ assertTrue(useTime <= OpTimeout, "wait_for_latest_build_index_on_partition_finish timeout")
+ }
+
+ def tableName = "test_index_change_7"
+
+ sql """ DROP TABLE IF EXISTS ${tableName} """
+
+ sql """
+ CREATE TABLE IF NOT EXISTS ${tableName}(
+ `id`int(11)NULL,
+ `int_array` array<int(20)> NULL,
+ `c_array` array<varchar(20)> NULL,
+ INDEX c_array_idx(`c_array`) USING INVERTED PROPERTIES("parser"="english") COMMENT 'c_array index',
+ INDEX int_array_idx(`int_array`) USING INVERTED COMMENT 'int_array index'
+ ) ENGINE=OLAP
+ DUPLICATE KEY(`id`)
+ COMMENT 'OLAP'
+ DISTRIBUTED BY HASH(`id`) BUCKETS 1
+ PROPERTIES(
+ "replication_allocation" = "tag.location.default: 1"
+ );
+ """
+
+ sql "INSERT INTO ${tableName} VALUES (1, [10,20,30], ['i','love','china']), (2, [20,30,40], ['i','love','north korea']), (3, [30,40,50], NULL);"
+ sql "INSERT INTO ${tableName} VALUES (4, [40,50,60], NULL);"
+
+ qt_select1 """ SELECT * FROM ${tableName} t ORDER BY id; """
+ qt_select2 """ SELECT * FROM ${tableName} t WHERE c_array MATCH 'china' ORDER BY id; """
+ qt_select3 """ SELECT * FROM ${tableName} t WHERE c_array MATCH 'love' ORDER BY id; """
+ qt_select4 """ SELECT * FROM ${tableName} t WHERE c_array MATCH 'north' ORDER BY id; """
+ qt_select5 """ SELECT * FROM ${tableName} t WHERE c_array MATCH 'korea' ORDER BY id; """
+ qt_select6 """ SELECT * FROM ${tableName} t WHERE int_array element_ge 40 ORDER BY id; """
+ qt_select7 """ SELECT * FROM ${tableName} t WHERE int_array element_le 40 ORDER BY id; """
+ qt_select8 """ SELECT * FROM ${tableName} t WHERE int_array element_gt 40 ORDER BY id; """
+ qt_select9 """ SELECT * FROM ${tableName} t WHERE int_array element_lt 40 ORDER BY id; """
+ qt_select10 """ SELECT * FROM ${tableName} t WHERE int_array element_eq 10 ORDER BY id; """
+ qt_select11 """ SELECT * FROM ${tableName} t WHERE int_array element_eq 20 ORDER BY id; """
+ qt_select12 """ SELECT * FROM ${tableName} t WHERE int_array element_eq 30 ORDER BY id; """
+ qt_select13 """ SELECT * FROM ${tableName} t WHERE int_array element_eq 40 ORDER BY id; """
+ qt_select14 """ SELECT * FROM ${tableName} t WHERE int_array element_eq 50 ORDER BY id; """
+ qt_select15 """ SELECT * FROM ${tableName} t WHERE int_array element_eq 60 ORDER BY id; """
+
+ // drop inverted index c_array_idx, int_array_idx
+ sql """ DROP INDEX c_array_idx ON ${tableName} """
+ sql """ DROP INDEX int_array_idx ON ${tableName} """
+
+ // create inverted index
+ sql """ CREATE INDEX c_array_idx ON ${tableName}(`c_array`) USING INVERTED PROPERTIES("parser"="english") """
+ sql """ CREATE INDEX int_array_idx ON ${tableName}(`int_array`) USING INVERTED """
+
+ // build inverted index
+ sql """ BUILD INDEX c_array_idx ON ${tableName} """
+ sql """ BUILD INDEX int_array_idx ON ${tableName} """
+ wait_for_build_index_on_partition_finish(tableName, timeout)
+
+ def show_result = sql "show index from ${tableName}"
+ logger.info("show index from " + tableName + " result: " + show_result)
+ assertEquals(show_result.size(), 2)
+ assertEquals(show_result[0][2], "c_array_idx")
+ assertEquals(show_result[1][2], "int_array_idx")
+
+ qt_select16 """ SELECT * FROM ${tableName} t WHERE c_array MATCH 'china' ORDER BY id; """
+ qt_select17 """ SELECT * FROM ${tableName} t WHERE c_array MATCH 'love' ORDER BY id; """
+ qt_select18 """ SELECT * FROM ${tableName} t WHERE c_array MATCH 'north' ORDER BY id; """
+ qt_select19 """ SELECT * FROM ${tableName} t WHERE c_array MATCH 'korea' ORDER BY id; """
+ qt_select20 """ SELECT * FROM ${tableName} t WHERE int_array element_ge 40 ORDER BY id; """
+ qt_select21 """ SELECT * FROM ${tableName} t WHERE int_array element_le 40 ORDER BY id; """
+ qt_select22 """ SELECT * FROM ${tableName} t WHERE int_array element_gt 40 ORDER BY id; """
+ qt_select23 """ SELECT * FROM ${tableName} t WHERE int_array element_lt 40 ORDER BY id; """
+ qt_select24 """ SELECT * FROM ${tableName} t WHERE int_array element_eq 10 ORDER BY id; """
+ qt_select25 """ SELECT * FROM ${tableName} t WHERE int_array element_eq 20 ORDER BY id; """
+ qt_select26 """ SELECT * FROM ${tableName} t WHERE int_array element_eq 30 ORDER BY id; """
+ qt_select27 """ SELECT * FROM ${tableName} t WHERE int_array element_eq 40 ORDER BY id; """
+ qt_select28 """ SELECT * FROM ${tableName} t WHERE int_array element_eq 50 ORDER BY id; """
+ qt_select29 """ SELECT * FROM ${tableName} t WHERE int_array element_eq 60 ORDER BY id; """
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org
[doris] 04/14: [Enhancement](multi-catalog) Merge hms events every round to speed up events processing. (#21589)
Posted by kx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
commit 514e7a8c19abe8698f836170ea3f6b626fd2eca3
Author: Xiangyu Wang <du...@gmail.com>
AuthorDate: Wed Jul 12 23:41:07 2023 +0800
[Enhancement](multi-catalog) Merge hms events every round to speed up events processing. (#21589)
Currently we find that MetastoreEventsProcessor can not catch up the event producing rate in our cluster, so we need to merge some hms events every round.
---
.../datasource/hive/event/AddPartitionEvent.java | 10 +-
.../datasource/hive/event/AlterDatabaseEvent.java | 72 +++++++-
.../datasource/hive/event/AlterPartitionEvent.java | 23 ++-
.../datasource/hive/event/AlterTableEvent.java | 46 ++++-
.../datasource/hive/event/CreateDatabaseEvent.java | 5 +
.../datasource/hive/event/CreateTableEvent.java | 11 ++
.../datasource/hive/event/DropPartitionEvent.java | 2 +-
.../datasource/hive/event/DropTableEvent.java | 19 ++
.../doris/datasource/hive/event/InsertEvent.java | 23 +++
.../datasource/hive/event/MetastoreEvent.java | 11 ++
.../hive/event/MetastoreEventFactory.java | 86 +++++++--
...baseEvent.java => MetastorePartitionEvent.java} | 26 +--
.../datasource/hive/event/MetastoreTableEvent.java | 50 ++++++
.../external/hms/MetastoreEventFactoryTest.java | 193 +++++++++++++++++++++
14 files changed, 543 insertions(+), 34 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/AddPartitionEvent.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/AddPartitionEvent.java
index 11d74ed9c2..b94333e41b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/AddPartitionEvent.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/AddPartitionEvent.java
@@ -37,10 +37,18 @@ import java.util.stream.Collectors;
/**
* MetastoreEvent for ADD_PARTITION event type
*/
-public class AddPartitionEvent extends MetastoreTableEvent {
+public class AddPartitionEvent extends MetastorePartitionEvent {
private final Table hmsTbl;
private final List<String> partitionNames;
+ // for test
+ public AddPartitionEvent(long eventId, String catalogName, String dbName,
+ String tblName, List<String> partitionNames) {
+ super(eventId, catalogName, dbName, tblName);
+ this.partitionNames = partitionNames;
+ this.hmsTbl = null;
+ }
+
private AddPartitionEvent(NotificationEvent event,
String catalogName) {
super(event, catalogName);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/AlterDatabaseEvent.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/AlterDatabaseEvent.java
index 59445a5dc4..d56eb52fad 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/AlterDatabaseEvent.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/AlterDatabaseEvent.java
@@ -18,21 +18,74 @@
package org.apache.doris.datasource.hive.event;
+import org.apache.doris.catalog.Env;
+import org.apache.doris.common.DdlException;
+import org.apache.doris.datasource.CatalogIf;
+import org.apache.doris.datasource.ExternalCatalog;
+
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
+import org.apache.hadoop.hive.metastore.api.Database;
import org.apache.hadoop.hive.metastore.api.NotificationEvent;
+import org.apache.hadoop.hive.metastore.messaging.json.JSONAlterDatabaseMessage;
import java.util.List;
/**
- * MetastoreEvent for Alter_DATABASE event type
+ * MetastoreEvent for ALTER_DATABASE event type
*/
public class AlterDatabaseEvent extends MetastoreEvent {
+ private final Database dbBefore;
+ private final Database dbAfter;
+
+ // true if this alter event was due to a rename operation
+ private final boolean isRename;
+
+ // for test
+ public AlterDatabaseEvent(long eventId, String catalogName, String dbName, boolean isRename) {
+ super(eventId, catalogName, dbName, null);
+ this.isRename = isRename;
+ this.dbBefore = null;
+ this.dbAfter = null;
+ }
+
private AlterDatabaseEvent(NotificationEvent event,
String catalogName) {
super(event, catalogName);
Preconditions.checkArgument(getEventType().equals(MetastoreEventType.ALTER_DATABASE));
+
+ try {
+ JSONAlterDatabaseMessage alterDatabaseMessage =
+ (JSONAlterDatabaseMessage) MetastoreEventsProcessor.getMessageDeserializer(event.getMessageFormat())
+ .getAlterDatabaseMessage(event.getMessage());
+ dbBefore = Preconditions.checkNotNull(alterDatabaseMessage.getDbObjBefore());
+ dbAfter = Preconditions.checkNotNull(alterDatabaseMessage.getDbObjAfter());
+ } catch (Exception e) {
+ throw new MetastoreNotificationException(
+ debugString("Unable to parse the alter database message"), e);
+ }
+ // this is a rename event if either dbName of before and after object changed
+ isRename = !dbBefore.getName().equalsIgnoreCase(dbAfter.getName());
+ }
+
+ private void processRename() throws DdlException {
+ CatalogIf catalog = Env.getCurrentEnv().getCatalogMgr().getCatalog(catalogName);
+ if (catalog == null) {
+ throw new DdlException("No catalog found with name: " + catalogName);
+ }
+ if (!(catalog instanceof ExternalCatalog)) {
+ throw new DdlException("Only support ExternalCatalog Databases");
+ }
+ if (catalog.getDbNullable(dbAfter.getName()) != null) {
+ infoLog("AlterExternalDatabase canceled, because dbAfter has exist, "
+ + "catalogName:[{}],dbName:[{}]",
+ catalogName, dbAfter.getName());
+ return;
+ }
+ Env.getCurrentEnv().getCatalogMgr().dropExternalDatabase(dbBefore.getName(), catalogName, true);
+ Env.getCurrentEnv().getCatalogMgr().createExternalDatabase(dbAfter.getName(), catalogName, true);
+
}
protected static List<MetastoreEvent> getEvents(NotificationEvent event,
@@ -40,9 +93,22 @@ public class AlterDatabaseEvent extends MetastoreEvent {
return Lists.newArrayList(new AlterDatabaseEvent(event, catalogName));
}
+ public boolean isRename() {
+ return isRename;
+ }
+
@Override
protected void process() throws MetastoreNotificationException {
- // only can change properties,we do nothing
- infoLog("catalogName:[{}],dbName:[{}]", catalogName, dbName);
+ try {
+ if (isRename) {
+ processRename();
+ return;
+ }
+ // only can change properties,we do nothing
+ infoLog("catalogName:[{}],dbName:[{}]", catalogName, dbName);
+ } catch (Exception e) {
+ throw new MetastoreNotificationException(
+ debugString("Failed to process event"), e);
+ }
}
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/AlterPartitionEvent.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/AlterPartitionEvent.java
index 788b79f885..0fc6be375d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/AlterPartitionEvent.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/AlterPartitionEvent.java
@@ -30,12 +30,13 @@ import org.apache.hadoop.hive.metastore.api.Table;
import org.apache.hadoop.hive.metastore.messaging.AlterPartitionMessage;
import java.util.List;
+import java.util.Objects;
import java.util.stream.Collectors;
/**
* MetastoreEvent for ALTER_PARTITION event type
*/
-public class AlterPartitionEvent extends MetastoreTableEvent {
+public class AlterPartitionEvent extends MetastorePartitionEvent {
private final Table hmsTbl;
private final org.apache.hadoop.hive.metastore.api.Partition partitionAfter;
private final org.apache.hadoop.hive.metastore.api.Partition partitionBefore;
@@ -44,6 +45,18 @@ public class AlterPartitionEvent extends MetastoreTableEvent {
// true if this alter event was due to a rename operation
private final boolean isRename;
+ // for test
+ public AlterPartitionEvent(long eventId, String catalogName, String dbName, String tblName,
+ String partitionNameBefore, String partitionNameAfter) {
+ super(eventId, catalogName, dbName, tblName);
+ this.partitionNameBefore = partitionNameBefore;
+ this.partitionNameAfter = partitionNameAfter;
+ this.hmsTbl = null;
+ this.partitionAfter = null;
+ this.partitionBefore = null;
+ isRename = !partitionNameBefore.equalsIgnoreCase(partitionNameAfter);
+ }
+
private AlterPartitionEvent(NotificationEvent event,
String catalogName) {
super(event, catalogName);
@@ -94,4 +107,12 @@ public class AlterPartitionEvent extends MetastoreTableEvent {
debugString("Failed to process event"), e);
}
}
+
+ @Override
+ protected boolean canBeBatched(MetastoreEvent event) {
+ return isSameTable(event)
+ && event instanceof AlterPartitionEvent
+ && Objects.equals(partitionBefore, ((AlterPartitionEvent) event).partitionBefore)
+ && Objects.equals(partitionAfter, ((AlterPartitionEvent) event).partitionAfter);
+ }
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/AlterTableEvent.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/AlterTableEvent.java
index cbb1ee8478..bc09d6ef2c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/AlterTableEvent.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/AlterTableEvent.java
@@ -41,6 +41,18 @@ public class AlterTableEvent extends MetastoreTableEvent {
// true if this alter event was due to a rename operation
private final boolean isRename;
private final boolean isView;
+ private final boolean willCreateOrDropTable;
+
+ // for test
+ public AlterTableEvent(long eventId, String catalogName, String dbName,
+ String tblName, boolean isRename, boolean isView) {
+ super(eventId, catalogName, dbName, tblName);
+ this.isRename = isRename;
+ this.isView = isView;
+ this.tableBefore = null;
+ this.tableAfter = null;
+ this.willCreateOrDropTable = isRename || isView;
+ }
private AlterTableEvent(NotificationEvent event, String catalogName) {
super(event, catalogName);
@@ -61,13 +73,19 @@ public class AlterTableEvent extends MetastoreTableEvent {
isRename = !tableBefore.getDbName().equalsIgnoreCase(tableAfter.getDbName())
|| !tableBefore.getTableName().equalsIgnoreCase(tableAfter.getTableName());
isView = tableBefore.isSetViewExpandedText() || tableBefore.isSetViewOriginalText();
+ this.willCreateOrDropTable = isRename || isView;
}
public static List<MetastoreEvent> getEvents(NotificationEvent event,
- String catalogName) {
+ String catalogName) {
return Lists.newArrayList(new AlterTableEvent(event, catalogName));
}
+ @Override
+ protected boolean willCreateOrDropTable() {
+ return willCreateOrDropTable;
+ }
+
private void processRecreateTable() throws DdlException {
if (!isView) {
return;
@@ -97,6 +115,14 @@ public class AlterTableEvent extends MetastoreTableEvent {
}
+ public boolean isRename() {
+ return isRename;
+ }
+
+ public boolean isView() {
+ return isView;
+ }
+
/**
* If the ALTER_TABLE event is due a table rename, this method removes the old table
* and creates a new table with the new name. Else, we just refresh table
@@ -124,4 +150,22 @@ public class AlterTableEvent extends MetastoreTableEvent {
debugString("Failed to process event"), e);
}
}
+
+ @Override
+ protected boolean canBeBatched(MetastoreEvent that) {
+ if (!isSameTable(that)) {
+ return false;
+ }
+
+ // `that` event must not be a rename table event
+ // so if the process of this event will drop this table,
+ // it can merge all the table's events before
+ if (willCreateOrDropTable) {
+ return true;
+ }
+
+ // that event must be a MetastoreTableEvent event
+ // otherwise `isSameTable` will return false
+ return !((MetastoreTableEvent) that).willCreateOrDropTable();
+ }
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/CreateDatabaseEvent.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/CreateDatabaseEvent.java
index e115f80f51..eb8da00cfe 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/CreateDatabaseEvent.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/CreateDatabaseEvent.java
@@ -32,6 +32,11 @@ import java.util.List;
*/
public class CreateDatabaseEvent extends MetastoreEvent {
+ // for test
+ public CreateDatabaseEvent(long eventId, String catalogName, String dbName) {
+ super(eventId, catalogName, dbName, null);
+ }
+
private CreateDatabaseEvent(NotificationEvent event,
String catalogName) {
super(event, catalogName);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/CreateTableEvent.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/CreateTableEvent.java
index 9ac8fd4e68..1ec8cbfde5 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/CreateTableEvent.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/CreateTableEvent.java
@@ -35,6 +35,12 @@ import java.util.List;
public class CreateTableEvent extends MetastoreTableEvent {
private final Table hmsTbl;
+ // for test
+ public CreateTableEvent(long eventId, String catalogName, String dbName, String tblName) {
+ super(eventId, catalogName, dbName, tblName);
+ this.hmsTbl = null;
+ }
+
private CreateTableEvent(NotificationEvent event, String catalogName) throws MetastoreNotificationException {
super(event, catalogName);
Preconditions.checkArgument(MetastoreEventType.CREATE_TABLE.equals(getEventType()));
@@ -55,6 +61,11 @@ public class CreateTableEvent extends MetastoreTableEvent {
return Lists.newArrayList(new CreateTableEvent(event, catalogName));
}
+ @Override
+ protected boolean willCreateOrDropTable() {
+ return true;
+ }
+
@Override
protected void process() throws MetastoreNotificationException {
try {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/DropPartitionEvent.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/DropPartitionEvent.java
index a53cf218db..7f8ade0819 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/DropPartitionEvent.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/DropPartitionEvent.java
@@ -36,7 +36,7 @@ import java.util.stream.Collectors;
/**
* MetastoreEvent for ADD_PARTITION event type
*/
-public class DropPartitionEvent extends MetastoreTableEvent {
+public class DropPartitionEvent extends MetastorePartitionEvent {
private final Table hmsTbl;
private final List<String> partitionNames;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/DropTableEvent.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/DropTableEvent.java
index c73a59f1c3..7b43a09666 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/DropTableEvent.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/DropTableEvent.java
@@ -34,6 +34,13 @@ import java.util.List;
public class DropTableEvent extends MetastoreTableEvent {
private final String tableName;
+ // for test
+ public DropTableEvent(long eventId, String catalogName, String dbName,
+ String tblName) {
+ super(eventId, catalogName, dbName, tblName);
+ this.tableName = tblName;
+ }
+
private DropTableEvent(NotificationEvent event,
String catalogName) {
super(event, catalogName);
@@ -55,6 +62,11 @@ public class DropTableEvent extends MetastoreTableEvent {
return Lists.newArrayList(new DropTableEvent(event, catalogName));
}
+ @Override
+ protected boolean willCreateOrDropTable() {
+ return true;
+ }
+
@Override
protected void process() throws MetastoreNotificationException {
try {
@@ -65,4 +77,11 @@ public class DropTableEvent extends MetastoreTableEvent {
debugString("Failed to process event"), e);
}
}
+
+ @Override
+ protected boolean canBeBatched(MetastoreEvent that) {
+ // `that` event must not be a rename table event
+ // so merge all events which belong to this table before is ok
+ return isSameTable(that);
+ }
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/InsertEvent.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/InsertEvent.java
index 27438a4dcb..3b5650ade4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/InsertEvent.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/InsertEvent.java
@@ -35,6 +35,13 @@ import java.util.List;
public class InsertEvent extends MetastoreTableEvent {
private final Table hmsTbl;
+ // for test
+ public InsertEvent(long eventId, String catalogName, String dbName,
+ String tblName) {
+ super(eventId, catalogName, dbName, tblName);
+ this.hmsTbl = null;
+ }
+
private InsertEvent(NotificationEvent event, String catalogName) {
super(event, catalogName);
Preconditions.checkArgument(getEventType().equals(MetastoreEventType.INSERT));
@@ -54,6 +61,11 @@ public class InsertEvent extends MetastoreTableEvent {
return Lists.newArrayList(new InsertEvent(event, catalogName));
}
+ @Override
+ protected boolean willCreateOrDropTable() {
+ return false;
+ }
+
@Override
protected void process() throws MetastoreNotificationException {
try {
@@ -72,4 +84,15 @@ public class InsertEvent extends MetastoreTableEvent {
debugString("Failed to process event"), e);
}
}
+
+ @Override
+ protected boolean canBeBatched(MetastoreEvent that) {
+ if (!isSameTable(that)) {
+ return false;
+ }
+
+ // that event must be a MetastoreTableEvent event
+ // otherwise `isSameTable` will return false
+ return !((MetastoreTableEvent) that).willCreateOrDropTable();
+ }
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/MetastoreEvent.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/MetastoreEvent.java
index 9693bb0c4c..08aff93dda 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/MetastoreEvent.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/MetastoreEvent.java
@@ -57,6 +57,17 @@ public abstract class MetastoreEvent {
protected final String catalogName;
+ // for test
+ protected MetastoreEvent(long eventId, String catalogName, String dbName, String tblName) {
+ this.eventId = eventId;
+ this.catalogName = catalogName;
+ this.dbName = dbName;
+ this.tblName = tblName;
+ this.eventType = null;
+ this.metastoreNotificationEvent = null;
+ this.event = null;
+ }
+
protected MetastoreEvent(NotificationEvent event, String catalogName) {
this.event = event;
this.dbName = event.getDbName();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/MetastoreEventFactory.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/MetastoreEventFactory.java
index 3ab2a7e030..a5bf0d953c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/MetastoreEventFactory.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/MetastoreEventFactory.java
@@ -21,12 +21,17 @@ package org.apache.doris.datasource.hive.event;
import org.apache.doris.datasource.HMSExternalCatalog;
import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
import org.apache.hadoop.hive.metastore.api.NotificationEvent;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
/**
* Factory class to create various MetastoreEvents.
@@ -36,7 +41,7 @@ public class MetastoreEventFactory implements EventFactory {
@Override
public List<MetastoreEvent> transferNotificationEventToMetastoreEvents(NotificationEvent event,
- String catalogName) {
+ String catalogName) {
Preconditions.checkNotNull(event.getEventType());
MetastoreEventType metastoreEventType = MetastoreEventType.from(event.getEventType());
switch (metastoreEventType) {
@@ -68,19 +73,80 @@ public class MetastoreEventFactory implements EventFactory {
List<MetastoreEvent> getMetastoreEvents(List<NotificationEvent> events, HMSExternalCatalog hmsExternalCatalog) {
List<MetastoreEvent> metastoreEvents = Lists.newArrayList();
+ String catalogName = hmsExternalCatalog.getName();
for (NotificationEvent event : events) {
- metastoreEvents.addAll(transferNotificationEventToMetastoreEvents(event, hmsExternalCatalog.getName()));
+ metastoreEvents.addAll(transferNotificationEventToMetastoreEvents(event, catalogName));
}
- return createBatchEvents(metastoreEvents);
+ return createBatchEvents(catalogName, metastoreEvents);
}
/**
- * Create batch event tasks according to HivePartitionName to facilitate subsequent parallel processing.
- * For ADD_PARTITION and DROP_PARTITION, we directly override any events before that partition.
- * For a partition, it is meaningless to process any events before the drop partition.
- */
- List<MetastoreEvent> createBatchEvents(List<MetastoreEvent> events) {
- // now do nothing
- return events;
+ * Merge events to reduce the cost time on event processing, currently mainly handles MetastoreTableEvent
+ * because merge MetastoreTableEvent is simple and cost-effective.
+ * For example, consider there are some events as following:
+ *
+ * event1: alter table db1.t1 add partition p1;
+ * event2: alter table db1.t1 drop partition p2;
+ * event3: alter table db1.t2 add partition p3;
+ * event4: alter table db2.t3 rename to t4;
+ * event5: drop table db1.t1;
+ *
+ * Only `event3 event4 event5` will be reserved and other events will be skipped.
+ * */
+ public List<MetastoreEvent> createBatchEvents(String catalogName, List<MetastoreEvent> events) {
+ List<MetastoreEvent> eventsCopy = Lists.newArrayList(events);
+ Map<MetastoreTableEvent.TableKey, List<Integer>> indexMap = Maps.newLinkedHashMap();
+ for (int i = 0; i < events.size(); i++) {
+ MetastoreEvent event = events.get(i);
+
+ // if the event is a rename event, just clear indexMap
+ // to make sure the table references of these events in indexMap will not change
+ if (event instanceof AlterDatabaseEvent && ((AlterDatabaseEvent) event).isRename()) {
+ indexMap.clear();
+ continue;
+ }
+
+ // Only check MetastoreTableEvent
+ if (!(event instanceof MetastoreTableEvent)) {
+ continue;
+ }
+
+ // Divide events into multi groups to reduce check count
+ MetastoreTableEvent.TableKey groupKey = ((MetastoreTableEvent) event).getTableKey();
+ if (!indexMap.containsKey(groupKey)) {
+ List<Integer> indexList = Lists.newLinkedList();
+ indexList.add(i);
+ indexMap.put(groupKey, indexList);
+ continue;
+ }
+
+ List<Integer> indexList = indexMap.get(groupKey);
+ for (int j = 0; j < indexList.size(); j++) {
+ int candidateIndex = indexList.get(j);
+ if (candidateIndex == -1) {
+ continue;
+ }
+ if (event.canBeBatched(events.get(candidateIndex))) {
+ eventsCopy.set(candidateIndex, null);
+ indexList.set(j, -1);
+ }
+ }
+ indexList = indexList.stream().filter(index -> index != -1)
+ .collect(Collectors.toList());
+ indexList.add(i);
+ indexMap.put(groupKey, indexList);
+
+ // if the event is a rename event, just clear indexMap
+ // to make sure the table references of these events in indexMap will not change
+ if (event instanceof AlterTableEvent && ((AlterTableEvent) event).isRename()) {
+ indexMap.clear();
+ }
+ }
+
+ List<MetastoreEvent> filteredEvents = eventsCopy.stream().filter(Objects::nonNull)
+ .collect(Collectors.toList());
+ LOG.info("Event size on catalog [{}] before merge is [{}], after merge is [{}]",
+ catalogName, events.size(), filteredEvents.size());
+ return ImmutableList.copyOf(filteredEvents);
}
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/AlterDatabaseEvent.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/MetastorePartitionEvent.java
similarity index 55%
copy from fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/AlterDatabaseEvent.java
copy to fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/MetastorePartitionEvent.java
index 59445a5dc4..f8bb457ea3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/AlterDatabaseEvent.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/MetastorePartitionEvent.java
@@ -18,31 +18,23 @@
package org.apache.doris.datasource.hive.event;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Lists;
import org.apache.hadoop.hive.metastore.api.NotificationEvent;
-import java.util.List;
-
/**
- * MetastoreEvent for Alter_DATABASE event type
+ * Base class for all the partition events
*/
-public class AlterDatabaseEvent extends MetastoreEvent {
+public abstract class MetastorePartitionEvent extends MetastoreTableEvent {
- private AlterDatabaseEvent(NotificationEvent event,
- String catalogName) {
- super(event, catalogName);
- Preconditions.checkArgument(getEventType().equals(MetastoreEventType.ALTER_DATABASE));
+ // for test
+ protected MetastorePartitionEvent(long eventId, String catalogName, String dbName, String tblName) {
+ super(eventId, catalogName, dbName, tblName);
}
- protected static List<MetastoreEvent> getEvents(NotificationEvent event,
- String catalogName) {
- return Lists.newArrayList(new AlterDatabaseEvent(event, catalogName));
+ protected MetastorePartitionEvent(NotificationEvent event, String catalogName) {
+ super(event, catalogName);
}
- @Override
- protected void process() throws MetastoreNotificationException {
- // only can change properties,we do nothing
- infoLog("catalogName:[{}],dbName:[{}]", catalogName, dbName);
+ protected boolean willCreateOrDropTable() {
+ return false;
}
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/MetastoreTableEvent.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/MetastoreTableEvent.java
index 70f56bdbb0..c797c1c08d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/MetastoreTableEvent.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/MetastoreTableEvent.java
@@ -23,12 +23,17 @@ import com.google.common.collect.ImmutableList;
import org.apache.hadoop.hive.metastore.api.NotificationEvent;
import java.util.List;
+import java.util.Objects;
/**
* Base class for all the table events
*/
public abstract class MetastoreTableEvent extends MetastoreEvent {
+ // for test
+ protected MetastoreTableEvent(long eventId, String catalogName, String dbName, String tblName) {
+ super(eventId, catalogName, dbName, tblName);
+ }
protected MetastoreTableEvent(NotificationEvent event, String catalogName) {
super(event, catalogName);
@@ -47,4 +52,49 @@ public abstract class MetastoreTableEvent extends MetastoreEvent {
.add("numFiles")
.add("comment")
.build();
+
+ protected boolean isSameTable(MetastoreEvent that) {
+ if (!(that instanceof MetastoreTableEvent)) {
+ return false;
+ }
+ TableKey thisKey = getTableKey();
+ TableKey thatKey = ((MetastoreTableEvent) that).getTableKey();
+ return Objects.equals(thisKey, thatKey);
+ }
+
+ /**
+ * Returns if the process of this event will create or drop this table.
+ */
+ protected abstract boolean willCreateOrDropTable();
+
+ public TableKey getTableKey() {
+ return new TableKey(catalogName, dbName, tblName);
+ }
+
+ static class TableKey {
+ private final String catalogName;
+ private final String dbName;
+ private final String tblName;
+
+ private TableKey(String catalogName, String dbName, String tblName) {
+ this.catalogName = catalogName;
+ this.dbName = dbName;
+ this.tblName = tblName;
+ }
+
+ @Override
+ public boolean equals(Object that) {
+ if (!(that instanceof TableKey)) {
+ return false;
+ }
+ return Objects.equals(catalogName, ((TableKey) that).catalogName)
+ && Objects.equals(dbName, ((TableKey) that).dbName)
+ && Objects.equals(tblName, ((TableKey) that).tblName);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(catalogName, dbName, tblName);
+ }
+ }
}
diff --git a/fe/fe-core/src/test/java/org/apache/doris/external/hms/MetastoreEventFactoryTest.java b/fe/fe-core/src/test/java/org/apache/doris/external/hms/MetastoreEventFactoryTest.java
new file mode 100644
index 0000000000..ba18c84bd7
--- /dev/null
+++ b/fe/fe-core/src/test/java/org/apache/doris/external/hms/MetastoreEventFactoryTest.java
@@ -0,0 +1,193 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.external.hms;
+
+import org.apache.doris.datasource.hive.event.AddPartitionEvent;
+import org.apache.doris.datasource.hive.event.AlterDatabaseEvent;
+import org.apache.doris.datasource.hive.event.AlterPartitionEvent;
+import org.apache.doris.datasource.hive.event.AlterTableEvent;
+import org.apache.doris.datasource.hive.event.CreateDatabaseEvent;
+import org.apache.doris.datasource.hive.event.CreateTableEvent;
+import org.apache.doris.datasource.hive.event.DropTableEvent;
+import org.apache.doris.datasource.hive.event.InsertEvent;
+import org.apache.doris.datasource.hive.event.MetastoreEvent;
+import org.apache.doris.datasource.hive.event.MetastoreEventFactory;
+
+import org.apache.hadoop.util.Lists;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.Arrays;
+import java.util.List;
+
+
+public class MetastoreEventFactoryTest {
+ private static final MetastoreEventFactory factory = new MetastoreEventFactory();
+
+ @Test
+ public void testCreateBatchEvents() {
+ AlterPartitionEvent e1 = new AlterPartitionEvent(1L, "test_ctl", "test_db", "t1", "p1", "p1");
+ AlterPartitionEvent e2 = new AlterPartitionEvent(2L, "test_ctl", "test_db", "t1", "p1", "p1");
+ AddPartitionEvent e3 = new AddPartitionEvent(3L, "test_ctl", "test_db", "t1", Arrays.asList("p1"));
+ AlterTableEvent e4 = new AlterTableEvent(4L, "test_ctl", "test_db", "t1", false, false);
+ AlterTableEvent e5 = new AlterTableEvent(5L, "test_ctl", "test_db", "t1", true, false);
+ AlterTableEvent e6 = new AlterTableEvent(6L, "test_ctl", "test_db", "t1", false, true);
+ DropTableEvent e7 = new DropTableEvent(7L, "test_ctl", "test_db", "t1");
+ InsertEvent e8 = new InsertEvent(8L, "test_ctl", "test_db", "t1");
+ CreateDatabaseEvent e9 = new CreateDatabaseEvent(9L, "test_ctl", "test_db2");
+ AlterPartitionEvent e10 = new AlterPartitionEvent(10L, "test_ctl", "test_db", "t2", "p1", "p1");
+ AlterTableEvent e11 = new AlterTableEvent(11L, "test_ctl", "test_db", "t1", false, false);
+ CreateTableEvent e12 = new CreateTableEvent(12L, "test_ctl", "test_db", "t1");
+ AlterDatabaseEvent e13 = new AlterDatabaseEvent(13L, "test_ctl", "test_db", true);
+ AlterDatabaseEvent e14 = new AlterDatabaseEvent(14L, "test_ctl", "test_db", false);
+
+ List<MetastoreEvent> mergedEvents;
+ List<MetastoreEvent> testEvents = Lists.newLinkedList();
+
+ testEvents.add(e1);
+ testEvents.add(e2);
+ mergedEvents = factory.createBatchEvents("test_ctl", testEvents);
+ Assertions.assertTrue(mergedEvents.size() == 1);
+ Assertions.assertTrue(mergedEvents.get(0).getEventId() == 2L);
+
+ testEvents.clear();
+ testEvents.add(e1);
+ testEvents.add(e2);
+ testEvents.add(e3);
+ testEvents.add(e9);
+ testEvents.add(e10);
+ testEvents.add(e4);
+ mergedEvents = factory.createBatchEvents("test_ctl", testEvents);
+ Assertions.assertTrue(mergedEvents.size() == 3);
+ Assertions.assertTrue(mergedEvents.get(0).getEventId() == 9L);
+ Assertions.assertTrue(mergedEvents.get(1).getEventId() == 10L);
+ Assertions.assertTrue(mergedEvents.get(2).getEventId() == 4L);
+
+ // because e5 is a rename event, it will not be merged
+ testEvents.clear();
+ testEvents.add(e1);
+ testEvents.add(e2);
+ testEvents.add(e10);
+ testEvents.add(e5);
+ testEvents.add(e4);
+ mergedEvents = factory.createBatchEvents("test_ctl", testEvents);
+ Assertions.assertTrue(mergedEvents.size() == 3);
+ Assertions.assertTrue(mergedEvents.get(0).getEventId() == 10L);
+ Assertions.assertTrue(mergedEvents.get(1).getEventId() == 5L);
+ Assertions.assertTrue(mergedEvents.get(2).getEventId() == 4L);
+
+ testEvents.clear();
+ testEvents.add(e1);
+ testEvents.add(e2);
+ testEvents.add(e10);
+ testEvents.add(e6);
+ testEvents.add(e4);
+ mergedEvents = factory.createBatchEvents("test_ctl", testEvents);
+ Assertions.assertTrue(mergedEvents.size() == 3);
+ Assertions.assertTrue(mergedEvents.get(0).getEventId() == 10L);
+ Assertions.assertTrue(mergedEvents.get(1).getEventId() == 6L);
+ Assertions.assertTrue(mergedEvents.get(2).getEventId() == 4L);
+
+ testEvents.clear();
+ testEvents.add(e1);
+ testEvents.add(e2);
+ testEvents.add(e10);
+ testEvents.add(e4);
+ testEvents.add(e11);
+ mergedEvents = factory.createBatchEvents("test_ctl", testEvents);
+ Assertions.assertTrue(mergedEvents.size() == 2);
+ Assertions.assertTrue(mergedEvents.get(0).getEventId() == 10L);
+ Assertions.assertTrue(mergedEvents.get(1).getEventId() == 11L);
+
+ testEvents.clear();
+ testEvents.add(e1);
+ testEvents.add(e2);
+ testEvents.add(e10);
+ testEvents.add(e4);
+ testEvents.add(e8);
+ mergedEvents = factory.createBatchEvents("test_ctl", testEvents);
+ Assertions.assertTrue(mergedEvents.size() == 2);
+ Assertions.assertTrue(mergedEvents.get(0).getEventId() == 10L);
+ Assertions.assertTrue(mergedEvents.get(1).getEventId() == 8L);
+
+ // because e5 is a rename event, it will not be merged
+ testEvents.clear();
+ testEvents.add(e1);
+ testEvents.add(e2);
+ testEvents.add(e10);
+ testEvents.add(e5);
+ testEvents.add(e8);
+ mergedEvents = factory.createBatchEvents("test_ctl", testEvents);
+ Assertions.assertTrue(mergedEvents.size() == 3);
+ Assertions.assertTrue(mergedEvents.get(0).getEventId() == 10L);
+ Assertions.assertTrue(mergedEvents.get(1).getEventId() == 5L);
+ Assertions.assertTrue(mergedEvents.get(2).getEventId() == 8L);
+
+ testEvents.clear();
+ testEvents.add(e1);
+ testEvents.add(e2);
+ testEvents.add(e10);
+ testEvents.add(e12);
+ testEvents.add(e4);
+ testEvents.add(e7);
+ mergedEvents = factory.createBatchEvents("test_ctl", testEvents);
+ Assertions.assertTrue(mergedEvents.size() == 2);
+ Assertions.assertTrue(mergedEvents.get(0).getEventId() == 10L);
+ Assertions.assertTrue(mergedEvents.get(1).getEventId() == 7L);
+
+ // because e5 is a rename event, it will not be merged
+ testEvents.clear();
+ testEvents.add(e1);
+ testEvents.add(e2);
+ testEvents.add(e10);
+ testEvents.add(e5);
+ testEvents.add(e7);
+ mergedEvents = factory.createBatchEvents("test_ctl", testEvents);
+ Assertions.assertTrue(mergedEvents.size() == 3);
+ Assertions.assertTrue(mergedEvents.get(0).getEventId() == 10L);
+ Assertions.assertTrue(mergedEvents.get(1).getEventId() == 5L);
+ Assertions.assertTrue(mergedEvents.get(2).getEventId() == 7L);
+
+ testEvents.clear();
+ testEvents.add(e1);
+ testEvents.add(e2);
+ testEvents.add(e10);
+ testEvents.add(e4);
+ testEvents.add(e13);
+ testEvents.add(e7);
+ mergedEvents = factory.createBatchEvents("test_ctl", testEvents);
+ Assertions.assertTrue(mergedEvents.size() == 4);
+ Assertions.assertTrue(mergedEvents.get(0).getEventId() == 10L);
+ Assertions.assertTrue(mergedEvents.get(1).getEventId() == 4L);
+ Assertions.assertTrue(mergedEvents.get(2).getEventId() == 13L);
+ Assertions.assertTrue(mergedEvents.get(3).getEventId() == 7L);
+
+ testEvents.clear();
+ testEvents.add(e1);
+ testEvents.add(e2);
+ testEvents.add(e10);
+ testEvents.add(e4);
+ testEvents.add(e14);
+ testEvents.add(e7);
+ mergedEvents = factory.createBatchEvents("test_ctl", testEvents);
+ Assertions.assertTrue(mergedEvents.size() == 3);
+ Assertions.assertTrue(mergedEvents.get(0).getEventId() == 10L);
+ Assertions.assertTrue(mergedEvents.get(1).getEventId() == 14L);
+ Assertions.assertTrue(mergedEvents.get(2).getEventId() == 7L);
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org
[doris] 14/14: [fix](merge-on-write) fix wrong result when query with prefix key predicate (#21770)
Posted by kx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
commit 3eec3fe70f4d1ed394c58346dc60f411e50a1c80
Author: Xin Liao <li...@126.com>
AuthorDate: Thu Jul 13 19:56:00 2023 +0800
[fix](merge-on-write) fix wrong result when query with prefix key predicate (#21770)
---
be/src/olap/rowset/segment_v2/segment_iterator.cpp | 4 +-
be/src/util/key_util.h | 7 +-
.../correctness_p0/test_select_with_prefix.out | 93 +++++++++++++
.../correctness_p0/test_select_with_prefix.groovy | 149 +++++++++++++++++++++
4 files changed, 251 insertions(+), 2 deletions(-)
diff --git a/be/src/olap/rowset/segment_v2/segment_iterator.cpp b/be/src/olap/rowset/segment_v2/segment_iterator.cpp
index 9b8ec54b24..1c6bfbadb0 100644
--- a/be/src/olap/rowset/segment_v2/segment_iterator.cpp
+++ b/be/src/olap/rowset/segment_v2/segment_iterator.cpp
@@ -1149,8 +1149,10 @@ Status SegmentIterator::_lookup_ordinal_from_pk_index(const RowCursor& key, bool
DCHECK(pk_index_reader != nullptr);
std::string index_key;
+ // when is_include is false, we shoudle append KEY_NORMAL_MARKER to the
+ // encode key. Otherwise, we will get an incorrect upper bound.
encode_key_with_padding<RowCursor, true, true>(
- &index_key, key, _segment->_tablet_schema->num_key_columns(), is_include);
+ &index_key, key, _segment->_tablet_schema->num_key_columns(), is_include, true);
if (index_key < _segment->min_key()) {
*rowid = 0;
return Status::OK();
diff --git a/be/src/util/key_util.h b/be/src/util/key_util.h
index ccd67b9cdd..3648a45c56 100644
--- a/be/src/util/key_util.h
+++ b/be/src/util/key_util.h
@@ -59,15 +59,20 @@ constexpr uint8_t KEY_MAXIMAL_MARKER = 0xFF;
// fill a marker and return. If padding_minimal is true, KEY_MINIMAL_MARKER will
// be added, if padding_minimal is false, KEY_MAXIMAL_MARKER will be added.
// If all num_keys are found in row, no marker will be added.
+// if padding_minimal is false and padding_normal_marker is true,
+// KEY_NORMAL_MARKER will be added.
template <typename RowType, bool null_first = true, bool full_encode = false>
void encode_key_with_padding(std::string* buf, const RowType& row, size_t num_keys,
- bool padding_minimal) {
+ bool padding_minimal, bool padding_normal_marker = false) {
for (auto cid = 0; cid < num_keys; cid++) {
auto field = row.schema()->column(cid);
if (field == nullptr) {
if (padding_minimal) {
buf->push_back(KEY_MINIMAL_MARKER);
} else {
+ if (padding_normal_marker) {
+ buf->push_back(KEY_NORMAL_MARKER);
+ }
buf->push_back(KEY_MAXIMAL_MARKER);
}
break;
diff --git a/regression-test/data/correctness_p0/test_select_with_prefix.out b/regression-test/data/correctness_p0/test_select_with_prefix.out
new file mode 100644
index 0000000000..8b59f59f49
--- /dev/null
+++ b/regression-test/data/correctness_p0/test_select_with_prefix.out
@@ -0,0 +1,93 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !sql --
+
+-- !sql --
+
+-- !sql --
+abcd efgh 1 abcdad 2023-06-27T00:00 1
+abcd efgh 2 abcdad 2023-06-27T00:00 1
+abcd efghf 2 abcdad 2023-06-27T00:00 1
+
+-- !sql --
+abcd
+abcd
+abcd
+
+-- !sql --
+
+-- !sql --
+efgh
+efgh
+efghf
+
+-- !sql --
+ efgh 1 abcdad 2023-06-27T00:00 1
+ mefgh 1 abcdad 2023-06-27T00:00 1
+
+-- !sql --
+
+
+
+-- !sql --
+2
+
+-- !sql --
+
+-- !sql --
+
+-- !sql --
+ efgh 1 abcdad 2023-06-27T00:00 1
+abcd efgh 1 abcdad 2023-06-27T00:00 1
+abcd efgh 2 abcdad 2023-06-27T00:00 1
+
+-- !sql --
+
+abcd
+abcd
+
+-- !sql --
+
+-- !sql --
+
+-- !sql --
+abcd efgh 1 abcdad 2023-06-27T00:00 1
+abcd efgh 2 abcdad 2023-06-27T00:00 1
+abcd efghf 2 abcdad 2023-06-27T00:00 1
+
+-- !sql --
+abcd
+abcd
+abcd
+
+-- !sql --
+
+-- !sql --
+efgh
+efgh
+efghf
+
+-- !sql --
+ efgh 1 abcdad 2023-06-27T00:00 1
+ mefgh 1 abcdad 2023-06-27T00:00 1
+
+-- !sql --
+
+
+
+-- !sql --
+2
+
+-- !sql --
+
+-- !sql --
+
+-- !sql --
+ efgh 1 abcdad 2023-06-27T00:00 1
+abcd efgh 1 abcdad 2023-06-27T00:00 1
+abcd efgh 2 abcdad 2023-06-27T00:00 1
+
+-- !sql --
+
+abcd
+abcd
+
diff --git a/regression-test/suites/correctness_p0/test_select_with_prefix.groovy b/regression-test/suites/correctness_p0/test_select_with_prefix.groovy
new file mode 100644
index 0000000000..c12e0da4c1
--- /dev/null
+++ b/regression-test/suites/correctness_p0/test_select_with_prefix.groovy
@@ -0,0 +1,149 @@
+
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_select_with_prefix") {
+ def tableName = "test_select_with_perfix"
+ sql """ DROP TABLE IF EXISTS $tableName """
+ sql """
+ CREATE TABLE $tableName (
+ `c0` varchar(64) NULL,
+ `c1` varchar(64) NULL,
+ `c2` bigint(20) NOT NULL,
+ `c3` char(32) NULL,
+ `c4` datetime NULL,
+ `c5` tinyint(4) NOT NULL
+ ) ENGINE=OLAP
+ UNIQUE KEY(`c0`, `c1`, `c2`, `c3`)
+ COMMENT 'OLAP'
+ DISTRIBUTED BY HASH(`c0`) BUCKETS 1
+ PROPERTIES (
+ "replication_allocation" = "tag.location.default: 1",
+ "enable_unique_key_merge_on_write" = "true"
+ );
+ """
+
+ sql """
+ INSERT INTO $tableName (`c0`, `c1`, `c2`, `c3`, `c4`, `c5`) VALUES
+ ('', 'efgh', 1, 'abcdad', '2023-06-27 00:00:00', 1),
+ ('', 'mefgh', 1, 'abcdad', '2023-06-27 00:00:00', 1),
+ ('abcd', 'efgh', 1, 'abcdad', '2023-06-27 00:00:00', 1),
+ ('abcd', 'efgh', 2, 'abcdad', '2023-06-27 00:00:00', 1),
+ ('abcd', 'efghf', 2, 'abcdad', '2023-06-27 00:00:00', 1),
+ ('abcde', 'ab', 2, '2efraeef', '2023-06-27 00:00:00', 1),
+ ('abcdf', 'ab', 2, '2efraeef', '2023-06-27 00:00:00', 1),
+ ('abcdf', 'dab', 2, '2efraeef', '2023-06-27 00:00:00', 1),
+ ('abce', 'dab', 2, '2efraeef', '2023-06-27 00:00:00', 1),
+ ('abce', 'ldab', 2, '2efraeef', '2023-06-27 00:00:00', 1),
+ ('abd', 'ldab', 2, '2efraeef', '2023-06-27 00:00:00', 1),
+ ('def', 'hh', 2, 'afad', '2023-06-27 00:00:00', 1)
+ """
+
+ sql "sync"
+
+ qt_sql "select * from $tableName where c0='abc'"
+
+ qt_sql "select c0 from $tableName where c0='abc'"
+
+ qt_sql "select * from $tableName where c0='abcd'"
+
+ qt_sql "select c0 from $tableName where c0='abcd'"
+
+ qt_sql "select c1 from $tableName where c0='abc'"
+
+ qt_sql "select c1 from $tableName where c0='abcd'"
+
+ qt_sql "select * from $tableName where c0=''"
+
+ qt_sql "select c0 from $tableName where c0=''"
+
+ qt_sql "select count(*) from $tableName where c0=''"
+
+ qt_sql "select * from $tableName where c1='efg'"
+
+ qt_sql "select c0 from $tableName where c1='efg'"
+
+ qt_sql "select * from $tableName where c1='efgh'"
+
+ qt_sql "select c0 from $tableName where c1='efgh'"
+
+ sql """ DROP TABLE IF EXISTS $tableName """
+ sql """
+ CREATE TABLE $tableName (
+ `c0` varchar(64) NULL,
+ `c1` varchar(64) NULL,
+ `c2` bigint(20) NOT NULL,
+ `c3` char(32) NULL,
+ `c4` datetime NULL,
+ `c5` tinyint(4) NOT NULL
+ ) ENGINE=OLAP
+ UNIQUE KEY(`c0`, `c1`, `c2`, `c3`)
+ COMMENT 'OLAP'
+ DISTRIBUTED BY HASH(`c0`) BUCKETS 1
+ PROPERTIES (
+ "replication_allocation" = "tag.location.default: 1",
+ "enable_unique_key_merge_on_write" = "false"
+ );
+ """
+
+ sql """
+ INSERT INTO $tableName (`c0`, `c1`, `c2`, `c3`, `c4`, `c5`) VALUES
+ ('', 'efgh', 1, 'abcdad', '2023-06-27 00:00:00', 1),
+ ('', 'mefgh', 1, 'abcdad', '2023-06-27 00:00:00', 1),
+ ('abcd', 'efgh', 1, 'abcdad', '2023-06-27 00:00:00', 1),
+ ('abcd', 'efgh', 2, 'abcdad', '2023-06-27 00:00:00', 1),
+ ('abcd', 'efghf', 2, 'abcdad', '2023-06-27 00:00:00', 1),
+ ('abcde', 'ab', 2, '2efraeef', '2023-06-27 00:00:00', 1),
+ ('abcdf', 'ab', 2, '2efraeef', '2023-06-27 00:00:00', 1),
+ ('abcdf', 'dab', 2, '2efraeef', '2023-06-27 00:00:00', 1),
+ ('abce', 'dab', 2, '2efraeef', '2023-06-27 00:00:00', 1),
+ ('abce', 'ldab', 2, '2efraeef', '2023-06-27 00:00:00', 1),
+ ('abd', 'ldab', 2, '2efraeef', '2023-06-27 00:00:00', 1),
+ ('def', 'hh', 2, 'afad', '2023-06-27 00:00:00', 1)
+ """
+
+ sql "sync"
+
+ qt_sql "select * from $tableName where c0='abc'"
+
+ qt_sql "select c0 from $tableName where c0='abc'"
+
+ qt_sql "select * from $tableName where c0='abcd'"
+
+ qt_sql "select c0 from $tableName where c0='abcd'"
+
+ qt_sql "select c1 from $tableName where c0='abc'"
+
+ qt_sql "select c1 from $tableName where c0='abcd'"
+
+ qt_sql "select * from $tableName where c0=''"
+
+ qt_sql "select c0 from $tableName where c0=''"
+
+ qt_sql "select count(*) from $tableName where c0=''"
+
+ qt_sql "select * from $tableName where c1='efg'"
+
+ qt_sql "select c0 from $tableName where c1='efg'"
+
+ qt_sql "select * from $tableName where c1='efgh'"
+
+ qt_sql "select c0 from $tableName where c1='efgh'"
+
+ sql """ DROP TABLE IF EXISTS $tableName """
+}
+
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org
[doris] 06/14: Revert "[imporve](bloomfilter) refactor runtime_filter_mgr with bloomfilter (#21715)" (#21763)
Posted by kx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
commit df20012e93f4cf97a1f37c99e284612a76be2253
Author: Mryange <59...@users.noreply.github.com>
AuthorDate: Thu Jul 13 10:44:20 2023 +0800
Revert "[imporve](bloomfilter) refactor runtime_filter_mgr with bloomfilter (#21715)" (#21763)
This reverts commit 925da90480f60afc0e5333a536d41e004234874e.
---
be/src/runtime/runtime_filter_mgr.cpp | 38 ++++++++++++++++-------------------
be/src/runtime/runtime_filter_mgr.h | 13 ++++++------
2 files changed, 23 insertions(+), 28 deletions(-)
diff --git a/be/src/runtime/runtime_filter_mgr.cpp b/be/src/runtime/runtime_filter_mgr.cpp
index 6614532d85..4380716671 100644
--- a/be/src/runtime/runtime_filter_mgr.cpp
+++ b/be/src/runtime/runtime_filter_mgr.cpp
@@ -39,7 +39,6 @@
#include "runtime/runtime_state.h"
#include "runtime/thread_context.h"
#include "util/brpc_client_cache.h"
-#include "util/spinlock.h"
namespace doris {
@@ -209,7 +208,7 @@ Status RuntimeFilterMergeControllerEntity::_init_with_desc(
const TRuntimeFilterDesc* runtime_filter_desc, const TQueryOptions* query_options,
const std::vector<doris::TRuntimeFilterTargetParams>* target_info,
const int producer_size) {
- std::unique_lock<std::shared_mutex> guard(_filter_map_mutex);
+ std::lock_guard<std::mutex> guard(_filter_map_mutex);
std::shared_ptr<RuntimeFilterCntlVal> cntVal = std::make_shared<RuntimeFilterCntlVal>();
// runtime_filter_desc and target will be released,
// so we need to copy to cntVal
@@ -220,10 +219,10 @@ Status RuntimeFilterMergeControllerEntity::_init_with_desc(
cntVal->filter =
cntVal->pool->add(new IRuntimeFilter(_state, &_state->get_query_ctx()->obj_pool));
- auto filter_id = runtime_filter_desc->filter_id;
+ std::string filter_id = std::to_string(runtime_filter_desc->filter_id);
// LOG(INFO) << "entity filter id:" << filter_id;
cntVal->filter->init_with_desc(&cntVal->runtime_filter_desc, query_options, -1, false);
- _filter_map.emplace(filter_id, CntlValwithLock {cntVal, std::make_unique<SpinLock>()});
+ _filter_map.emplace(filter_id, cntVal);
return Status::OK();
}
@@ -231,7 +230,7 @@ Status RuntimeFilterMergeControllerEntity::_init_with_desc(
const TRuntimeFilterDesc* runtime_filter_desc, const TQueryOptions* query_options,
const std::vector<doris::TRuntimeFilterTargetParamsV2>* targetv2_info,
const int producer_size) {
- std::unique_lock<std::shared_mutex> guard(_filter_map_mutex);
+ std::lock_guard<std::mutex> guard(_filter_map_mutex);
std::shared_ptr<RuntimeFilterCntlVal> cntVal = std::make_shared<RuntimeFilterCntlVal>();
// runtime_filter_desc and target will be released,
// so we need to copy to cntVal
@@ -242,10 +241,10 @@ Status RuntimeFilterMergeControllerEntity::_init_with_desc(
cntVal->filter =
cntVal->pool->add(new IRuntimeFilter(_state, &_state->get_query_ctx()->obj_pool));
- auto filter_id = runtime_filter_desc->filter_id;
+ std::string filter_id = std::to_string(runtime_filter_desc->filter_id);
// LOG(INFO) << "entity filter id:" << filter_id;
cntVal->filter->init_with_desc(&cntVal->runtime_filter_desc, query_options);
- _filter_map.emplace(filter_id, CntlValwithLock {cntVal, std::make_unique<SpinLock>()});
+ _filter_map.emplace(filter_id, cntVal);
return Status::OK();
}
@@ -313,37 +312,34 @@ Status RuntimeFilterMergeControllerEntity::merge(const PMergeFilterRequest* requ
std::shared_ptr<RuntimeFilterCntlVal> cntVal;
int merged_size = 0;
int64_t merge_time = 0;
- int64_t start_merge = MonotonicMillis();
- auto filter_id = request->filter_id();
- std::map<int, CntlValwithLock>::iterator iter;
{
- std::shared_lock<std::shared_mutex> guard(_filter_map_mutex);
- iter = _filter_map.find(filter_id);
+ int64_t start_merge = MonotonicMillis();
+ std::lock_guard<std::mutex> guard(_filter_map_mutex);
+ auto iter = _filter_map.find(std::to_string(request->filter_id()));
VLOG_ROW << "recv filter id:" << request->filter_id() << " " << request->ShortDebugString();
if (iter == _filter_map.end()) {
return Status::InvalidArgument("unknown filter id {}",
std::to_string(request->filter_id()));
}
- }
- // iter->second = pair{CntlVal,SpinLock}
- cntVal = iter->second.first;
- {
- std::lock_guard<SpinLock> l(*iter->second.second);
+ cntVal = iter->second;
+ if (auto bf = cntVal->filter->get_bloomfilter()) {
+ RETURN_IF_ERROR(bf->init_with_fixed_length());
+ }
MergeRuntimeFilterParams params(request, attach_data);
- ObjectPool* pool = cntVal->pool.get();
+ ObjectPool* pool = iter->second->pool.get();
RuntimeFilterWrapperHolder holder;
RETURN_IF_ERROR(IRuntimeFilter::create_wrapper(_state, ¶ms, pool, holder.getHandle()));
RETURN_IF_ERROR(cntVal->filter->merge_from(holder.getHandle()->get()));
- cntVal->arrive_id.insert(UniqueId(request->fragment_id()));
+ cntVal->arrive_id.insert(UniqueId(request->fragment_id()).to_string());
merged_size = cntVal->arrive_id.size();
// TODO: avoid log when we had acquired a lock
VLOG_ROW << "merge size:" << merged_size << ":" << cntVal->producer_size;
DCHECK_LE(merged_size, cntVal->producer_size);
- cntVal->merge_time += (MonotonicMillis() - start_merge);
+ iter->second->merge_time += (MonotonicMillis() - start_merge);
if (merged_size < cntVal->producer_size) {
return Status::OK();
} else {
- merge_time = cntVal->merge_time;
+ merge_time = iter->second->merge_time;
}
}
diff --git a/be/src/runtime/runtime_filter_mgr.h b/be/src/runtime/runtime_filter_mgr.h
index 2048229cd2..7d7e7a0ba1 100644
--- a/be/src/runtime/runtime_filter_mgr.h
+++ b/be/src/runtime/runtime_filter_mgr.h
@@ -26,7 +26,6 @@
#include <map>
#include <memory>
#include <mutex>
-#include <shared_mutex>
#include <string>
#include <unordered_map>
#include <unordered_set>
@@ -146,12 +145,12 @@ public:
std::vector<doris::TRuntimeFilterTargetParams> target_info;
std::vector<doris::TRuntimeFilterTargetParamsV2> targetv2_info;
IRuntimeFilter* filter;
- std::unordered_set<UniqueId> arrive_id; // fragment_instance_id ?
+ std::unordered_set<std::string> arrive_id; // fragment_instance_id ?
std::shared_ptr<ObjectPool> pool;
};
public:
- RuntimeFilterCntlVal* get_filter(int id) { return _filter_map[id].first.get(); }
+ RuntimeFilterCntlVal* get_filter(int id) { return _filter_map[std::to_string(id)].get(); }
private:
Status _init_with_desc(const TRuntimeFilterDesc* runtime_filter_desc,
@@ -167,11 +166,11 @@ private:
UniqueId _query_id;
UniqueId _fragment_instance_id;
// protect _filter_map
- std::shared_mutex _filter_map_mutex;
+ std::mutex _filter_map_mutex;
std::shared_ptr<MemTracker> _mem_tracker;
- using CntlValwithLock =
- std::pair<std::shared_ptr<RuntimeFilterCntlVal>, std::unique_ptr<SpinLock>>;
- std::map<int, CntlValwithLock> _filter_map;
+ // TODO: convert filter id to i32
+ // filter-id -> val
+ std::map<std::string, std::shared_ptr<RuntimeFilterCntlVal>> _filter_map;
RuntimeState* _state;
bool _opt_remote_rf = true;
};
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org
[doris] 10/14: [Fix](pipeline) close sink when fragment context destructs (#21668)
Posted by kx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
commit 004acb7352d51e742a325c1cdf57b6d993d81e50
Author: airborne12 <ai...@gmail.com>
AuthorDate: Thu Jul 13 11:52:24 2023 +0800
[Fix](pipeline) close sink when fragment context destructs (#21668)
Co-authored-by: airborne12 <ai...@gmail.com>
---
be/src/pipeline/pipeline_fragment_context.cpp | 10 ++++++++++
be/src/pipeline/pipeline_fragment_context.h | 1 +
be/src/runtime/fragment_mgr.cpp | 4 ++++
3 files changed, 15 insertions(+)
diff --git a/be/src/pipeline/pipeline_fragment_context.cpp b/be/src/pipeline/pipeline_fragment_context.cpp
index 9969770ecd..9fc8c4ce24 100644
--- a/be/src/pipeline/pipeline_fragment_context.cpp
+++ b/be/src/pipeline/pipeline_fragment_context.cpp
@@ -702,6 +702,16 @@ Status PipelineFragmentContext::submit() {
}
}
+void PipelineFragmentContext::close_sink() {
+ if (_sink) {
+ if (_prepared) {
+ _sink->close(_runtime_state.get(), Status::RuntimeError("prepare failed"));
+ } else {
+ _sink->close(_runtime_state.get(), Status::OK());
+ }
+ }
+}
+
void PipelineFragmentContext::close_if_prepare_failed() {
if (_tasks.empty()) {
if (_root_plan) {
diff --git a/be/src/pipeline/pipeline_fragment_context.h b/be/src/pipeline/pipeline_fragment_context.h
index 25c8b8ac51..287fac9e40 100644
--- a/be/src/pipeline/pipeline_fragment_context.h
+++ b/be/src/pipeline/pipeline_fragment_context.h
@@ -87,6 +87,7 @@ public:
Status submit();
void close_if_prepare_failed();
+ void close_sink();
void set_is_report_success(bool is_report_success) { _is_report_success = is_report_success; }
diff --git a/be/src/runtime/fragment_mgr.cpp b/be/src/runtime/fragment_mgr.cpp
index 2e1f9bb607..b5fcb933cb 100644
--- a/be/src/runtime/fragment_mgr.cpp
+++ b/be/src/runtime/fragment_mgr.cpp
@@ -348,6 +348,10 @@ FragmentMgr::~FragmentMgr() {
std::lock_guard<std::mutex> lock(_lock);
_fragment_map.clear();
_query_ctx_map.clear();
+ for (auto& pipeline : _pipeline_map) {
+ pipeline.second->close_sink();
+ }
+ _pipeline_map.clear();
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org