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, &params, 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