From bb16ee94e954a7571ca5bbc4e60dd29419648d0b Mon Sep 17 00:00:00 2001 From: John Zhang Date: Mon, 18 Nov 2024 18:58:31 +0800 Subject: [PATCH 01/63] [fix](analyzer) fixed the NullPointerException (#43269) (#44173) cherry-pick: #43269 stack info : ``` 2024-11-01 14:04:24,570 INFO (replayer|118) [EditLog.loadJournal():249] Begin to unprotect add partition. db = 50402 table = 3355198 partitionName = p2024110115 2024-11-01 14:04:24,572 INFO (replayer|118) [Env.replayJournal():2795] replayed journal id is 91381595, replay to journal id is 91381596 2024-11-01 14:04:24,572 INFO (replayer|118) [EditLog.loadJournal():259] Begin to unprotect drop partition. db = 50402 table = 23712088 partitionName = p2024110112 2024-11-01 14:04:24,573 INFO (replayer|118) [CatalogRecycleBin.recyclePartition():197] recycle partition[30713663-p2024110112] of table [23712088-real_result] 2024-11-01 14:04:24,573 INFO (replayer|118) [OlapTable.updateVisibleVersionAndTime():2740] updateVisibleVersionAndTime, tableName: real_result, visibleVersion, 1653, visibleVersionTime: 1730441064570 2024-11-01 14:04:24,573 WARN (mysql-nio-pool-109891|1159519) [StmtExecutor.executeByLegacy():985] execute Exception. stmt[76210227, 9822ba51b0b14b33-b8c313b570b26832] java.lang.NullPointerException: null at org.apache.doris.qe.cache.CacheAnalyzer.buildCacheTableForOlapScanNode(CacheAnalyzer.java:705) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.cache.CacheAnalyzer.buildCacheTableList(CacheAnalyzer.java:516) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.cache.CacheAnalyzer.innerCheckCacheMode(CacheAnalyzer.java:259) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.cache.CacheAnalyzer.getCacheData(CacheAnalyzer.java:528) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.StmtExecutor.handleCacheStmt(StmtExecutor.java:1615) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.StmtExecutor.handleQueryStmt(StmtExecutor.java:1721) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.StmtExecutor.handleQueryWithRetry(StmtExecutor.java:810) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.StmtExecutor.executeByLegacy(StmtExecutor.java:903) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.StmtExecutor.execute(StmtExecutor.java:597) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.StmtExecutor.execute(StmtExecutor.java:523) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.ConnectProcessor.executeQuery(ConnectProcessor.java:328) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.ConnectProcessor.handleQuery(ConnectProcessor.java:206) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.MysqlConnectProcessor.handleQuery(MysqlConnectProcessor.java:260) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.MysqlConnectProcessor.dispatch(MysqlConnectProcessor.java:288) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.MysqlConnectProcessor.processOnce(MysqlConnectProcessor.java:341) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.mysql.ReadListener.lambda$handleEvent$0(ReadListener.java:52) ~[doris-fe.jar:1.2-SNAPSHOT] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[?:1.8.0_272] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[?:1.8.0_272] at java.lang.Thread.run(Thread.java:748) ~[?:1.8.0_272] 2024-11-01 14:04:24,578 INFO (replayer|118) [Env.replayJournal():2795] replayed journal id is 91381596, replay to journal id is 91381597 2024-11-01 14:04:24,578 INFO (replayer|118) [EditLog.loadJournal():249] Begin to unprotect add partition. db = 50402 table = 23712088 partitionName = p2024110115 2024-11-01 14:04:24,580 INFO (replayer|118) [Env.replayJournal():2795] replayed journal id is 91381597, replay to journal id is 91381598 2024-11-01 14:04:24,580 INFO (replayer|118) [EditLog.loadJournal():259] Begin to unprotect drop partition. db = 50402 table = 67267 partitionName = p2024110111 ``` ``` # partition get null here Partition partition = olapTable.getPartition(partitionId); # Unable to obtain the specified partition in idToPartition and tempPartitions through partitionId public Partition getPartition(long partitionId) { Partition partition = idToPartition.get(partitionId); if (partition == null) { partition = tempPartitions.getPartition(partitionId); } return partition; } ``` Because there is reading and writing, the partition should have already been deleted when reading again --- .../apache/doris/qe/cache/CacheAnalyzer.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/cache/CacheAnalyzer.java b/fe/fe-core/src/main/java/org/apache/doris/qe/cache/CacheAnalyzer.java index 67917a07e4ef2f..a6fd3bc8fcbfe6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/cache/CacheAnalyzer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/cache/CacheAnalyzer.java @@ -518,13 +518,18 @@ private List buildCacheTableList() { } public InternalService.PFetchCacheResult getCacheData() throws UserException { - if (parsedStmt instanceof LogicalPlanAdapter) { - cacheMode = innerCheckCacheModeForNereids(0); - } else if (parsedStmt instanceof SelectStmt) { - cacheMode = innerCheckCacheMode(0); - } else if (parsedStmt instanceof SetOperationStmt) { - cacheMode = innerCheckCacheModeSetOperation(0); - } else { + try { + if (parsedStmt instanceof LogicalPlanAdapter) { + cacheMode = innerCheckCacheModeForNereids(0); + } else if (parsedStmt instanceof SelectStmt) { + cacheMode = innerCheckCacheMode(0); + } else if (parsedStmt instanceof SetOperationStmt) { + cacheMode = innerCheckCacheModeSetOperation(0); + } else { + return null; + } + } catch (NullPointerException e) { + LOG.error("getCacheData error", e); return null; } From 05b6f5aca1ea609abbdd447c64d4d57fd474b295 Mon Sep 17 00:00:00 2001 From: "Mingyu Chen (Rayner)" Date: Mon, 18 Nov 2024 18:58:54 +0800 Subject: [PATCH 02/63] [fix](external) fix count(*) performance fallback in external table query (#44172) ### What problem does this PR solve? Related PR: #41789 Problem Summary: This PR #41789 change the local shuffle logic, but forget to implement `numScanBackends()` in FileQueryScanNode, which causing `select count(*) from hive_table` query performance fallback. This PR implement this method in `FileQueryScanNode()` --- .../org/apache/doris/datasource/FileQueryScanNode.java | 3 +++ .../main/java/org/apache/doris/planner/OlapScanNode.java | 7 ------- .../src/main/java/org/apache/doris/planner/ScanNode.java | 7 ++++++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/FileQueryScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/FileQueryScanNode.java index 6a0933b0c6c0a7..96dae05b7fd045 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/FileQueryScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/FileQueryScanNode.java @@ -297,6 +297,7 @@ public void createScanRangeLocations() throws UserException { location.setServer(new TNetworkAddress(backend.getHost(), backend.getBePort())); curLocations.addToLocations(location); scanRangeLocations.add(curLocations); + scanBackendIds.add(backendId); return; } } @@ -346,6 +347,7 @@ public void createScanRangeLocations() throws UserException { // However, even one ScanNode instance can provide maximum scanning concurrency. scanRangeLocations.add(curLocations); setLocationPropertiesIfNecessary(backend, locationType, locationProperties); + scanBackendIds.add(backend.getId()); } } else { List inputSplits = getSplits(); @@ -363,6 +365,7 @@ public void createScanRangeLocations() throws UserException { scanRangeLocations.add(splitToScanRange(backend, locationProperties, split, pathPartitionKeys)); totalFileSize += split.getLength(); } + scanBackendIds.add(backend.getId()); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java index afdffc748c01a6..41c055062e3e9b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java @@ -192,8 +192,6 @@ public class OlapScanNode extends ScanNode { private Set sampleTabletIds = Sets.newHashSet(); private TableSample tableSample; - private HashSet scanBackendIds = new HashSet<>(); - private Map tabletId2BucketSeq = Maps.newHashMap(); // a bucket seq may map to many tablets, and each tablet has a // TScanRangeLocations. @@ -1919,9 +1917,4 @@ public boolean pushDownAggNoGroupingCheckCol(FunctionCallExpr aggExpr, Column co public int getScanRangeNum() { return getScanTabletIds().size(); } - - @Override - public int numScanBackends() { - return scanBackendIds.size(); - } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/ScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/ScanNode.java index 53aa0d5b24df5d..a2583868346704 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/ScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/ScanNode.java @@ -111,6 +111,11 @@ public abstract class ScanNode extends PlanNode implements SplitGenerator { protected TableSnapshot tableSnapshot; + // Save the id of backends which this scan node will be executed on. + // This is also important for local shuffle logic. + // Now only OlapScanNode and FileQueryScanNode implement this. + protected HashSet scanBackendIds = new HashSet<>(); + public ScanNode(PlanNodeId id, TupleDescriptor desc, String planNodeName, StatisticalType statisticalType) { super(id, desc.getId().asList(), planNodeName, statisticalType); this.desc = desc; @@ -732,7 +737,7 @@ && getScanRangeNum() } public int numScanBackends() { - return 0; + return scanBackendIds.size(); } public int getScanRangeNum() { From 5a1959d1c1c9b0c79be70b806e357a7dda678f08 Mon Sep 17 00:00:00 2001 From: Vallish Pai Date: Mon, 18 Nov 2024 16:46:34 +0530 Subject: [PATCH 03/63] [Enhancement] (nereids)implement showPluginsCommand in nereids (#43131) Issue Number: close #42733 --- .../org/apache/doris/nereids/DorisParser.g4 | 2 +- .../nereids/parser/LogicalPlanBuilder.java | 6 ++ .../doris/nereids/trees/plans/PlanType.java | 1 + .../plans/commands/ShowPluginsCommand.java | 77 +++++++++++++++++++ .../trees/plans/visitor/CommandVisitor.java | 5 ++ .../show/test_nereids_show_plugins.groovy | 22 ++++++ 6 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowPluginsCommand.java create mode 100644 regression-test/suites/nereids_p0/show/test_nereids_show_plugins.groovy 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 56eb417406869a..ff155e7672ffbf 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 @@ -202,6 +202,7 @@ supportedShowStatement | SHOW VIEW (FROM |IN) tableName=multipartIdentifier ((FROM | IN) database=identifier)? #showView + | SHOW PLUGINS #showPlugins | SHOW REPOSITORIES #showRepositories | SHOW ROLES #showRoles | SHOW PARTITION partitionId=INTEGER_VALUE #showPartitionId @@ -258,7 +259,6 @@ unsupportedShowStatement | SHOW (GLOBAL | SESSION | LOCAL)? STATUS wildWhere? #showStatus | SHOW FULL? TRIGGERS ((FROM | IN) database=multipartIdentifier)? wildWhere? #showTriggers | SHOW EVENTS ((FROM | IN) database=multipartIdentifier)? wildWhere? #showEvents - | SHOW PLUGINS #showPlugins | SHOW BRIEF? CREATE TABLE name=multipartIdentifier #showCreateTable | SHOW CREATE VIEW name=multipartIdentifier #showCreateView | SHOW CREATE MATERIALIZED VIEW name=multipartIdentifier #showMaterializedView 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 2b6716d69b0269..05399ab63e7fc1 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 @@ -204,6 +204,7 @@ import org.apache.doris.nereids.DorisParser.ShowFrontendsContext; import org.apache.doris.nereids.DorisParser.ShowLastInsertContext; import org.apache.doris.nereids.DorisParser.ShowPartitionIdContext; +import org.apache.doris.nereids.DorisParser.ShowPluginsContext; import org.apache.doris.nereids.DorisParser.ShowProcContext; import org.apache.doris.nereids.DorisParser.ShowProcedureStatusContext; import org.apache.doris.nereids.DorisParser.ShowRepositoriesContext; @@ -449,6 +450,7 @@ import org.apache.doris.nereids.trees.plans.commands.ShowFrontendsCommand; import org.apache.doris.nereids.trees.plans.commands.ShowLastInsertCommand; import org.apache.doris.nereids.trees.plans.commands.ShowPartitionIdCommand; +import org.apache.doris.nereids.trees.plans.commands.ShowPluginsCommand; import org.apache.doris.nereids.trees.plans.commands.ShowProcCommand; import org.apache.doris.nereids.trees.plans.commands.ShowProcedureStatusCommand; import org.apache.doris.nereids.trees.plans.commands.ShowRepositoriesCommand; @@ -4105,6 +4107,10 @@ public LogicalPlan visitShowBackends(ShowBackendsContext ctx) { return new ShowBackendsCommand(); } + public LogicalPlan visitShowPlugins(ShowPluginsContext ctx) { + return new ShowPluginsCommand(); + } + @Override public LogicalPlan visitShowRepositories(ShowRepositoriesContext ctx) { return new ShowRepositoriesCommand(); 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 ce34ee818ff644..7763a85bd5e82e 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 @@ -183,6 +183,7 @@ public enum PlanType { SHOW_LAST_INSERT_COMMAND, SHOW_PARTITIONID_COMMAND, SHOW_PROC_COMMAND, + SHOW_PLUGINS_COMMAND, SHOW_REPOSITORIES_COMMAND, SHOW_ROLE_COMMAND, SHOW_STORAGE_ENGINES_COMMAND, diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowPluginsCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowPluginsCommand.java new file mode 100644 index 00000000000000..1f66e8614ec57a --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowPluginsCommand.java @@ -0,0 +1,77 @@ +// 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.commands; + +import org.apache.doris.catalog.Column; +import org.apache.doris.catalog.Env; +import org.apache.doris.catalog.ScalarType; +import org.apache.doris.common.ErrorCode; +import org.apache.doris.common.ErrorReport; +import org.apache.doris.mysql.privilege.PrivPredicate; +import org.apache.doris.nereids.trees.plans.PlanType; +import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor; +import org.apache.doris.qe.ConnectContext; +import org.apache.doris.qe.ShowResultSet; +import org.apache.doris.qe.ShowResultSetMetaData; +import org.apache.doris.qe.StmtExecutor; + +import java.util.List; + +/** + * show plugins command + */ +public class ShowPluginsCommand extends ShowCommand { + private static final ShowResultSetMetaData META_DATA = + ShowResultSetMetaData.builder() + .addColumn(new Column("Name", ScalarType.createVarchar(64))) + .addColumn(new Column("Type", ScalarType.createVarchar(10))) + .addColumn(new Column("Description", ScalarType.createVarchar(200))) + .addColumn(new Column("Version", ScalarType.createVarchar(20))) + .addColumn(new Column("JavaVersion", ScalarType.createVarchar(20))) + .addColumn(new Column("ClassName", ScalarType.createVarchar(64))) + .addColumn(new Column("SoName", ScalarType.createVarchar(64))) + .addColumn(new Column("Sources", ScalarType.createVarchar(200))) + .addColumn(new Column("Status", ScalarType.createVarchar(20))) + .addColumn(new Column("Properties", ScalarType.createVarchar(250))) + .build(); + + /** + * constructor + */ + + public ShowPluginsCommand() { + super(PlanType.SHOW_PLUGINS_COMMAND); + } + + @Override + public ShowResultSet doRun(ConnectContext ctx, StmtExecutor executor) throws Exception { + // check auth + if (!Env.getCurrentEnv().getAccessManager().checkGlobalPriv(ConnectContext.get(), PrivPredicate.ADMIN)) { + ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR, + PrivPredicate.ADMIN.getPrivs().toString()); + } + + List> rows = Env.getCurrentPluginMgr().getPluginShowInfos(); + return new ShowResultSet(META_DATA, rows); + } + + @Override + public R accept(PlanVisitor visitor, C context) { + return visitor.visitShowPluginsCommand(this, context); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java index 26917aeca77f0b..db75e0de41bb63 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java @@ -60,6 +60,7 @@ import org.apache.doris.nereids.trees.plans.commands.ShowFrontendsCommand; import org.apache.doris.nereids.trees.plans.commands.ShowLastInsertCommand; import org.apache.doris.nereids.trees.plans.commands.ShowPartitionIdCommand; +import org.apache.doris.nereids.trees.plans.commands.ShowPluginsCommand; import org.apache.doris.nereids.trees.plans.commands.ShowProcCommand; import org.apache.doris.nereids.trees.plans.commands.ShowProcedureStatusCommand; import org.apache.doris.nereids.trees.plans.commands.ShowRepositoriesCommand; @@ -273,6 +274,10 @@ default R visitShowBackendsCommand(ShowBackendsCommand showBackendsCommand, C co return visitCommand(showBackendsCommand, context); } + default R visitShowPluginsCommand(ShowPluginsCommand showPluginsCommand, C context) { + return visitCommand(showPluginsCommand, context); + } + default R visitShowRepositoriesCommand(ShowRepositoriesCommand showRepositoriesCommand, C context) { return visitCommand(showRepositoriesCommand, context); } diff --git a/regression-test/suites/nereids_p0/show/test_nereids_show_plugins.groovy b/regression-test/suites/nereids_p0/show/test_nereids_show_plugins.groovy new file mode 100644 index 00000000000000..c79d7657a95b5b --- /dev/null +++ b/regression-test/suites/nereids_p0/show/test_nereids_show_plugins.groovy @@ -0,0 +1,22 @@ +// 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_nereids_show_plugins") { + checkNereidsExecute("""show plugins;""") +} + From 846138c152aa4225d31b1e0f0f2b694e105047a6 Mon Sep 17 00:00:00 2001 From: zhangdong Date: Mon, 18 Nov 2024 20:32:11 +0800 Subject: [PATCH 04/63] [fix](mtmv)After failure, one should quickly return to avoid repeated failures (#44174) ### What problem does this PR solve? BuildContext may fail, and we are currently ignoring this error, which may result in repeated failures. We should quickly return Problem Summary: BuildContext may fail, and we are currently ignoring this error, which may result in repeated failures. We should quickly return ### Release note BuildContext may fail, and we are currently ignoring this error, which may result in repeated failures. We should quickly return --- .../java/org/apache/doris/mtmv/MTMVRewriteUtil.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRewriteUtil.java b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRewriteUtil.java index 5e17673a06883f..7b7d743a36bc8c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRewriteUtil.java +++ b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRewriteUtil.java @@ -64,10 +64,16 @@ public static Collection getMTMVCanRewritePartitions(MTMV mtmv, Conne res.add(partition); continue; } - try { - if (refreshContext == null) { + if (refreshContext == null) { + try { refreshContext = MTMVRefreshContext.buildContext(mtmv); + } catch (AnalysisException e) { + LOG.warn("buildContext failed", e); + // After failure, one should quickly return to avoid repeated failures + return res; } + } + try { if (MTMVPartitionUtil.isMTMVPartitionSync(refreshContext, partition.getName(), mtmvRelation.getBaseTablesOneLevel(), Sets.newHashSet())) { From f5bffd4d515039c7952127536ff46f1d36a9d9c7 Mon Sep 17 00:00:00 2001 From: Vallish Pai Date: Mon, 18 Nov 2024 18:24:36 +0530 Subject: [PATCH 05/63] [Enhancement] (nereids)implement showPrivilegesCommand in nereids (#43119) Issue Number: close #42769 --- .../org/apache/doris/nereids/DorisParser.g4 | 2 +- .../nereids/parser/LogicalPlanBuilder.java | 7 ++ .../doris/nereids/trees/plans/PlanType.java | 1 + .../plans/commands/ShowPrivilegesCommand.java | 74 +++++++++++++++++++ .../trees/plans/visitor/CommandVisitor.java | 5 ++ .../show/test_nereids_show_privileges.groovy | 23 ++++++ 6 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowPrivilegesCommand.java create mode 100644 regression-test/suites/nereids_p0/show/test_nereids_show_privileges.groovy 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 ff155e7672ffbf..734be9fa51da79 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 @@ -206,6 +206,7 @@ supportedShowStatement | SHOW REPOSITORIES #showRepositories | SHOW ROLES #showRoles | SHOW PARTITION partitionId=INTEGER_VALUE #showPartitionId + | SHOW PRIVILEGES #showPrivileges | SHOW PROC path=STRING_LITERAL #showProc | SHOW STORAGE? ENGINES #showStorageEngines | SHOW CREATE MATERIALIZED VIEW mvName=identifier @@ -309,7 +310,6 @@ unsupportedShowStatement | SHOW SNAPSHOT ON repo=identifier wildWhere? #showSnapshot | SHOW ALL? GRANTS #showGrants | SHOW GRANTS FOR userIdentify #showGrantsForUser - | SHOW PRIVILEGES #showPrivileges | SHOW FULL? BUILTIN? FUNCTIONS ((FROM | IN) database=multipartIdentifier)? wildWhere? #showFunctions | SHOW GLOBAL FULL? FUNCTIONS wildWhere? #showGlobalFunctions 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 05399ab63e7fc1..064e9568ac2d69 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 @@ -205,6 +205,7 @@ import org.apache.doris.nereids.DorisParser.ShowLastInsertContext; import org.apache.doris.nereids.DorisParser.ShowPartitionIdContext; import org.apache.doris.nereids.DorisParser.ShowPluginsContext; +import org.apache.doris.nereids.DorisParser.ShowPrivilegesContext; import org.apache.doris.nereids.DorisParser.ShowProcContext; import org.apache.doris.nereids.DorisParser.ShowProcedureStatusContext; import org.apache.doris.nereids.DorisParser.ShowRepositoriesContext; @@ -451,6 +452,7 @@ import org.apache.doris.nereids.trees.plans.commands.ShowLastInsertCommand; import org.apache.doris.nereids.trees.plans.commands.ShowPartitionIdCommand; import org.apache.doris.nereids.trees.plans.commands.ShowPluginsCommand; +import org.apache.doris.nereids.trees.plans.commands.ShowPrivilegesCommand; import org.apache.doris.nereids.trees.plans.commands.ShowProcCommand; import org.apache.doris.nereids.trees.plans.commands.ShowProcedureStatusCommand; import org.apache.doris.nereids.trees.plans.commands.ShowRepositoriesCommand; @@ -4170,4 +4172,9 @@ public LogicalPlan visitShowTableId(ShowTableIdContext ctx) { } return new ShowTableIdCommand(tableId); } + + @Override + public LogicalPlan visitShowPrivileges(ShowPrivilegesContext ctx) { + return new ShowPrivilegesCommand(); + } } 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 7763a85bd5e82e..55c73c11a81e87 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 @@ -184,6 +184,7 @@ public enum PlanType { SHOW_PARTITIONID_COMMAND, SHOW_PROC_COMMAND, SHOW_PLUGINS_COMMAND, + SHOW_PRIVILEGES_COMMAND, SHOW_REPOSITORIES_COMMAND, SHOW_ROLE_COMMAND, SHOW_STORAGE_ENGINES_COMMAND, diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowPrivilegesCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowPrivilegesCommand.java new file mode 100644 index 00000000000000..6e4373e9976578 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowPrivilegesCommand.java @@ -0,0 +1,74 @@ +// 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.commands; + +import org.apache.doris.catalog.Column; +import org.apache.doris.catalog.ScalarType; +import org.apache.doris.mysql.privilege.Privilege; +import org.apache.doris.nereids.trees.plans.PlanType; +import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor; +import org.apache.doris.qe.ConnectContext; +import org.apache.doris.qe.ShowResultSet; +import org.apache.doris.qe.ShowResultSetMetaData; +import org.apache.doris.qe.StmtExecutor; + +import com.google.common.collect.Lists; + +import java.util.List; + +/** + * show privileges command + */ +public class ShowPrivilegesCommand extends ShowCommand { + private static final ShowResultSetMetaData META_DATA; + + static { + ShowResultSetMetaData.Builder builder = ShowResultSetMetaData.builder(); + + builder.addColumn(new Column("Privilege", ScalarType.createVarchar(100))); + builder.addColumn(new Column("Context", ScalarType.createVarchar(100))); + builder.addColumn(new Column("Comment", ScalarType.createVarchar(100))); + + META_DATA = builder.build(); + } + + /** + * constructor + */ + + public ShowPrivilegesCommand() { + super(PlanType.SHOW_PRIVILEGES_COMMAND); + } + + @Override + public ShowResultSet doRun(ConnectContext ctx, StmtExecutor executor) throws Exception { + List> infos = Lists.newArrayList(); + Privilege[] values = Privilege.values(); + for (Privilege privilege : values) { + if (!privilege.isDeprecated()) { + infos.add(Lists.newArrayList(privilege.getName(), privilege.getContext(), privilege.getDesc())); + } + } + return new ShowResultSet(META_DATA, infos); + } + + @Override + public R accept(PlanVisitor visitor, C context) { + return visitor.visitShowPrivilegesCommand(this, context); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java index db75e0de41bb63..2ffdcc767ab3d8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java @@ -61,6 +61,7 @@ import org.apache.doris.nereids.trees.plans.commands.ShowLastInsertCommand; import org.apache.doris.nereids.trees.plans.commands.ShowPartitionIdCommand; import org.apache.doris.nereids.trees.plans.commands.ShowPluginsCommand; +import org.apache.doris.nereids.trees.plans.commands.ShowPrivilegesCommand; import org.apache.doris.nereids.trees.plans.commands.ShowProcCommand; import org.apache.doris.nereids.trees.plans.commands.ShowProcedureStatusCommand; import org.apache.doris.nereids.trees.plans.commands.ShowRepositoriesCommand; @@ -318,4 +319,8 @@ default R visitDropRoleCommand(DropRoleCommand dropRoleCommand, C context) { default R visitShowTableIdCommand(ShowTableIdCommand showTableIdCommand, C context) { return visitCommand(showTableIdCommand, context); } + + default R visitShowPrivilegesCommand(ShowPrivilegesCommand showPrivilegesCommand, C context) { + return visitCommand(showPrivilegesCommand, context); + } } diff --git a/regression-test/suites/nereids_p0/show/test_nereids_show_privileges.groovy b/regression-test/suites/nereids_p0/show/test_nereids_show_privileges.groovy new file mode 100644 index 00000000000000..871a5cc86f1c70 --- /dev/null +++ b/regression-test/suites/nereids_p0/show/test_nereids_show_privileges.groovy @@ -0,0 +1,23 @@ +// 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.junit.Assert; + +suite("test_nereids_show_privileges") { + // only check syntax + checkNereidsExecute("""show privileges""") +} From 20473c1703d972c50019a5b280d5d439bf5c98f5 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 18 Nov 2024 22:02:26 +0800 Subject: [PATCH 06/63] [test](statistics)Add stats test for replace table. (#44011) ### What problem does this PR solve? Add stats test case for replace table. Issue Number: close #xxx Related PR: #xxx Problem Summary: ### Release note None --- .../statistics/test_replace_table.grovvy | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 regression-test/suites/statistics/test_replace_table.grovvy diff --git a/regression-test/suites/statistics/test_replace_table.grovvy b/regression-test/suites/statistics/test_replace_table.grovvy new file mode 100644 index 00000000000000..08c68c5ac20af8 --- /dev/null +++ b/regression-test/suites/statistics/test_replace_table.grovvy @@ -0,0 +1,81 @@ +// 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_replace_table") { + + sql """drop database if exists test_replace_table""" + sql """create database test_replace_table""" + sql """use test_replace_table""" + sql """set global force_sample_analyze=false""" + sql """set global enable_auto_analyze=false""" + + sql """CREATE TABLE t1 ( + t1key int NOT NULL, + t1value varchar(25) NOT NULL + )ENGINE=OLAP + DUPLICATE KEY(`t1key`) + COMMENT "OLAP" + DISTRIBUTED BY HASH(`t1key`) BUCKETS 1 + PROPERTIES ( + "replication_num" = "1" + ) + """ + + sql """CREATE TABLE t2 ( + t2key int NOT NULL + )ENGINE=OLAP + DUPLICATE KEY(`t2key`) + COMMENT "OLAP" + DISTRIBUTED BY HASH(`t2key`) BUCKETS 1 + PROPERTIES ( + "replication_num" = "1" + ) + """ + + sql """insert into t1 values (1, "1"), (2, "2")""" + sql """insert into t2 values (3)""" + sql """analyze table t1 with sync""" + sql """analyze table t2 with sync""" + + def result = sql """show column stats t1""" + assertEquals(2, result.size()) + result = sql """show column cached stats t1""" + assertEquals(2, result.size()) + result = sql """show column stats t2""" + assertEquals(1, result.size()) + result = sql """show column cached stats t2""" + assertEquals(1, result.size()) + + sql """ALTER TABLE t1 REPLACE WITH TABLE t2;""" + result = sql """show column stats t1""" + assertEquals(1, result.size()) + result = sql """show column cached stats t1""" + assertEquals(1, result.size()) + result = sql """show column stats t2""" + assertEquals(2, result.size()) + result = sql """show column cached stats t2""" + assertEquals(2, result.size()) + + sql """ALTER TABLE t1 REPLACE WITH TABLE t2 PROPERTIES('swap' = 'false');""" + result = sql """show column stats t1""" + assertEquals(2, result.size()) + result = sql """show column cached stats t1""" + assertEquals(2, result.size()) + + sql """drop database if exists test_replace_table""" +} + From c5ee28b0e90d39cd6270e610f5fd158f99ca3604 Mon Sep 17 00:00:00 2001 From: airborne12 Date: Tue, 19 Nov 2024 10:28:34 +0800 Subject: [PATCH 07/63] [feat](test) add ut case for inverted index file writer (#44213) ### What problem does this PR solve? Related PR: #44084 Problem Summary: add UT case for #44084 fix --- .../segment_v2/inverted_index_file_writer.h | 4 +- .../inverted_index_fs_directory.cpp | 33 --- .../segment_v2/inverted_index_fs_directory.h | 33 +++ .../inverted_index_file_writer_test.cpp | 233 +++++++++++++++++- 4 files changed, 267 insertions(+), 36 deletions(-) diff --git a/be/src/olap/rowset/segment_v2/inverted_index_file_writer.h b/be/src/olap/rowset/segment_v2/inverted_index_file_writer.h index 3a2fcc1e6acaa7..ddb22975d68467 100644 --- a/be/src/olap/rowset/segment_v2/inverted_index_file_writer.h +++ b/be/src/olap/rowset/segment_v2/inverted_index_file_writer.h @@ -112,14 +112,14 @@ class InvertedIndexFileWriter { // Helper functions specific to write_v1 std::pair calculate_header_length(const std::vector& sorted_files, lucene::store::Directory* directory); - std::pair> + virtual std::pair> create_output_stream_v1(int64_t index_id, const std::string& index_suffix); virtual void write_header_and_data_v1(lucene::store::IndexOutput* output, const std::vector& sorted_files, lucene::store::Directory* directory, int64_t header_length, int32_t header_file_count); // Helper functions specific to write_v2 - std::pair> + virtual std::pair> create_output_stream_v2(); void write_version_and_indices_count(lucene::store::IndexOutput* output); struct FileMetadata { diff --git a/be/src/olap/rowset/segment_v2/inverted_index_fs_directory.cpp b/be/src/olap/rowset/segment_v2/inverted_index_fs_directory.cpp index 29caf29936dddf..fe0a81c41a6970 100644 --- a/be/src/olap/rowset/segment_v2/inverted_index_fs_directory.cpp +++ b/be/src/olap/rowset/segment_v2/inverted_index_fs_directory.cpp @@ -83,39 +83,6 @@ namespace doris::segment_v2 { const char* const DorisFSDirectory::WRITE_LOCK_FILE = "write.lock"; -class DorisFSDirectory::FSIndexOutput : public lucene::store::BufferedIndexOutput { -protected: - void flushBuffer(const uint8_t* b, const int32_t size) override; - -public: - FSIndexOutput() = default; - void init(const io::FileSystemSPtr& fs, const char* path); - ~FSIndexOutput() override; - void close() override; - int64_t length() const override; - - void set_file_writer_opts(const io::FileWriterOptions& opts) { _opts = opts; } - -private: - io::FileWriterPtr _writer; - io::FileWriterOptions _opts; -}; - -class DorisFSDirectory::FSIndexOutputV2 : public lucene::store::BufferedIndexOutput { -private: - io::FileWriter* _index_v2_file_writer = nullptr; - -protected: - void flushBuffer(const uint8_t* b, const int32_t size) override; - -public: - FSIndexOutputV2() = default; - void init(io::FileWriter* file_writer); - ~FSIndexOutputV2() override; - void close() override; - int64_t length() const override; -}; - bool DorisFSDirectory::FSIndexInput::open(const io::FileSystemSPtr& fs, const char* path, IndexInput*& ret, CLuceneError& error, int32_t buffer_size, int64_t file_size) { diff --git a/be/src/olap/rowset/segment_v2/inverted_index_fs_directory.h b/be/src/olap/rowset/segment_v2/inverted_index_fs_directory.h index fd92873c9707bf..dde436054cd35b 100644 --- a/be/src/olap/rowset/segment_v2/inverted_index_fs_directory.h +++ b/be/src/olap/rowset/segment_v2/inverted_index_fs_directory.h @@ -210,6 +210,39 @@ class DorisFSDirectory::FSIndexInput : public lucene::store::BufferedIndexInput void readInternal(uint8_t* b, const int32_t len) override; }; +class DorisFSDirectory::FSIndexOutput : public lucene::store::BufferedIndexOutput { +protected: + void flushBuffer(const uint8_t* b, const int32_t size) override; + +public: + FSIndexOutput() = default; + void init(const io::FileSystemSPtr& fs, const char* path); + ~FSIndexOutput() override; + void close() override; + int64_t length() const override; + + void set_file_writer_opts(const io::FileWriterOptions& opts) { _opts = opts; } + +private: + io::FileWriterPtr _writer; + io::FileWriterOptions _opts; +}; + +class DorisFSDirectory::FSIndexOutputV2 : public lucene::store::BufferedIndexOutput { +private: + io::FileWriter* _index_v2_file_writer = nullptr; + +protected: + void flushBuffer(const uint8_t* b, const int32_t size) override; + +public: + FSIndexOutputV2() = default; + void init(io::FileWriter* file_writer); + ~FSIndexOutputV2() override; + void close() override; + int64_t length() const override; +}; + /** * Factory function to create DorisFSDirectory */ diff --git a/be/test/olap/rowset/segment_v2/inverted_index_file_writer_test.cpp b/be/test/olap/rowset/segment_v2/inverted_index_file_writer_test.cpp index dd3b4195c141f9..460b99a0ce785e 100644 --- a/be/test/olap/rowset/segment_v2/inverted_index_file_writer_test.cpp +++ b/be/test/olap/rowset/segment_v2/inverted_index_file_writer_test.cpp @@ -511,5 +511,236 @@ TEST_F(InvertedIndexFileWriterTest, WriteV2ExceptionHandlingTest) { ASSERT_EQ(status.code(), ErrorCode::INVERTED_INDEX_CLUCENE_ERROR); } +class InvertedIndexFileWriterMockCreateOutputStreamV2 : public InvertedIndexFileWriter { +public: + InvertedIndexFileWriterMockCreateOutputStreamV2(const io::FileSystemSPtr& fs, + const std::string& index_path_prefix, + const std::string& rowset_id, + int32_t segment_id, + InvertedIndexStorageFormatPB storage_format) + : InvertedIndexFileWriter(fs, index_path_prefix, rowset_id, segment_id, + storage_format) {} + + MOCK_METHOD((std::pair>), + create_output_stream_v2, (), (override)); +}; + +class InvertedIndexFileWriterMockCreateOutputStreamV1 : public InvertedIndexFileWriter { +public: + InvertedIndexFileWriterMockCreateOutputStreamV1(const io::FileSystemSPtr& fs, + const std::string& index_path_prefix, + const std::string& rowset_id, + int32_t segment_id, + InvertedIndexStorageFormatPB storage_format) + : InvertedIndexFileWriter(fs, index_path_prefix, rowset_id, segment_id, + storage_format) {} + + MOCK_METHOD((std::pair>), + create_output_stream_v1, (int64_t index_id, const std::string& index_suffix), + (override)); +}; + +class MockDorisFSDirectoryOutput : public DorisFSDirectory { +public: + //MOCK_METHOD(lucene::store::IndexOutput*, createOutput, (const char* name), (override)); + //MOCK_METHOD(int64_t, fileLength, (const char* name), (const, override)); + MOCK_METHOD(void, close, (), (override)); + //MOCK_METHOD(const char*, getObjectName, (), (const, override)); +}; + +class MockFSIndexOutputV2 : public DorisFSDirectory::FSIndexOutputV2 { +public: + //MOCK_METHOD(void, close, (), (override)); + MOCK_METHOD(void, flushBuffer, (const uint8_t* b, const int32_t size), (override)); +}; + +class MockFSIndexOutputV1 : public DorisFSDirectory::FSIndexOutput { +public: + //MOCK_METHOD(void, close, (), (override)); + MOCK_METHOD(void, flushBuffer, (const uint8_t* b, const int32_t size), (override)); +}; + +TEST_F(InvertedIndexFileWriterTest, WriteV1OutputTest) { + int64_t index_id = 1; + std::string index_suffix = "suffix1"; + InvertedIndexFileWriterMockCreateOutputStreamV1 writer_mock( + _fs, _index_path_prefix, _rowset_id, _seg_id, InvertedIndexStorageFormatPB::V1); + io::Path cfs_path(InvertedIndexDescriptor::get_index_file_path_v1(_index_path_prefix, index_id, + index_suffix)); + auto idx_path = cfs_path.parent_path(); + std::string idx_name = cfs_path.filename(); + + auto* out_dir = DorisFSDirectoryFactory::getDirectory(_fs, idx_path.c_str()); + auto* mock_output_v1 = new MockFSIndexOutputV1(); + EXPECT_CALL(*mock_output_v1, flushBuffer(::testing::_, ::testing::_)) + .WillOnce(::testing::Throw(CLuceneError(CL_ERR_IO, "Simulated exception", false))); + auto compound_file_output = std::unique_ptr(mock_output_v1); + compound_file_output->init(_fs, cfs_path.c_str()); + + EXPECT_CALL(writer_mock, create_output_stream_v1(index_id, index_suffix)) + .WillOnce(::testing::Invoke( + [&]() -> std::pair> { + return std::make_pair(out_dir, std::move(compound_file_output)); + })); + + auto index_meta = create_mock_tablet_index(index_id, index_suffix); + ASSERT_NE(index_meta, nullptr); + + auto open_result = writer_mock.open(index_meta.get()); + ASSERT_TRUE(open_result.has_value()); + auto dir = open_result.value(); + + auto out_file = std::unique_ptr(dir->createOutput("test_file")); + out_file->writeString("test data"); + out_file->close(); + dir->close(); + + Status status = writer_mock.close(); + ASSERT_FALSE(status.ok()); + ASSERT_EQ(status.code(), ErrorCode::INVERTED_INDEX_CLUCENE_ERROR); +} + +TEST_F(InvertedIndexFileWriterTest, WriteV2OutputTest) { + io::FileWriterPtr file_writer; + std::string index_path = InvertedIndexDescriptor::get_index_file_path_v2(_index_path_prefix); + io::FileWriterOptions opts; + Status st = _fs->create_file(index_path, &file_writer, &opts); + ASSERT_TRUE(st.ok()); + + InvertedIndexFileWriterMockCreateOutputStreamV2 writer_mock( + _fs, _index_path_prefix, _rowset_id, _seg_id, InvertedIndexStorageFormatPB::V2); + auto* out_dir = DorisFSDirectoryFactory::getDirectory(_fs, index_path.c_str()); + auto* mock_output_v2 = new MockFSIndexOutputV2(); + EXPECT_CALL(*mock_output_v2, flushBuffer(::testing::_, ::testing::_)) + .WillOnce(::testing::Throw(CLuceneError(CL_ERR_IO, "Simulated exception", false))); + auto compound_file_output = std::unique_ptr(mock_output_v2); + compound_file_output->init(file_writer.get()); + + EXPECT_CALL(writer_mock, create_output_stream_v2()) + .WillOnce(::testing::Invoke( + [&]() -> std::pair> { + return std::make_pair(out_dir, std::move(compound_file_output)); + })); + + int64_t index_id = 1; + std::string index_suffix = "suffix1"; + auto index_meta = create_mock_tablet_index(index_id, index_suffix); + ASSERT_NE(index_meta, nullptr); + + auto open_result = writer_mock.open(index_meta.get()); + ASSERT_TRUE(open_result.has_value()); + auto dir = open_result.value(); + + auto out_file = std::unique_ptr(dir->createOutput("test_file")); + out_file->writeString("test data"); + out_file->close(); + dir->close(); + + Status status = writer_mock.close(); + ASSERT_FALSE(status.ok()); + ASSERT_EQ(status.code(), ErrorCode::INVERTED_INDEX_CLUCENE_ERROR); +} + +class MockFSIndexOutputCloseV2 : public DorisFSDirectory::FSIndexOutputV2 { +public: + MOCK_METHOD(void, close, (), (override)); + void base_close() { DorisFSDirectory::FSIndexOutputV2::BufferedIndexOutput::close(); } +}; + +class MockFSIndexOutputCloseV1 : public DorisFSDirectory::FSIndexOutput { +public: + MOCK_METHOD(void, close, (), (override)); + void base_close() { DorisFSDirectory::FSIndexOutput::BufferedIndexOutput::close(); } +}; + +TEST_F(InvertedIndexFileWriterTest, WriteV2OutputCloseErrorTest) { + io::FileWriterPtr file_writer; + std::string index_path = InvertedIndexDescriptor::get_index_file_path_v2(_index_path_prefix); + io::FileWriterOptions opts; + Status st = _fs->create_file(index_path, &file_writer, &opts); + ASSERT_TRUE(st.ok()); + + InvertedIndexFileWriterMockCreateOutputStreamV2 writer_mock( + _fs, _index_path_prefix, _rowset_id, _seg_id, InvertedIndexStorageFormatPB::V2); + auto* out_dir = DorisFSDirectoryFactory::getDirectory(_fs, index_path.c_str()); + auto* mock_output_v2 = new MockFSIndexOutputCloseV2(); + EXPECT_CALL(*mock_output_v2, close()).WillOnce(::testing::Invoke([&]() { + mock_output_v2->base_close(); + throw CLuceneError(CL_ERR_IO, "Simulated exception", false); + })); + auto compound_file_output = std::unique_ptr(mock_output_v2); + compound_file_output->init(file_writer.get()); + + EXPECT_CALL(writer_mock, create_output_stream_v2()) + .WillOnce(::testing::Invoke( + [&]() -> std::pair> { + return std::make_pair(out_dir, std::move(compound_file_output)); + })); + + int64_t index_id = 1; + std::string index_suffix = "suffix1"; + auto index_meta = create_mock_tablet_index(index_id, index_suffix); + ASSERT_NE(index_meta, nullptr); + + auto open_result = writer_mock.open(index_meta.get()); + ASSERT_TRUE(open_result.has_value()); + auto dir = open_result.value(); + + auto out_file = std::unique_ptr(dir->createOutput("test_file")); + out_file->writeString("test data"); + out_file->close(); + dir->close(); + + Status status = writer_mock.close(); + ASSERT_FALSE(status.ok()); + ASSERT_EQ(status.code(), ErrorCode::INVERTED_INDEX_CLUCENE_ERROR); +} + +TEST_F(InvertedIndexFileWriterTest, WriteV1OutputCloseErrorTest) { + int64_t index_id = 1; + std::string index_suffix = "suffix1"; + InvertedIndexFileWriterMockCreateOutputStreamV1 writer_mock( + _fs, _index_path_prefix, _rowset_id, _seg_id, InvertedIndexStorageFormatPB::V1); + io::Path cfs_path(InvertedIndexDescriptor::get_index_file_path_v1(_index_path_prefix, index_id, + index_suffix)); + auto idx_path = cfs_path.parent_path(); + std::string idx_name = cfs_path.filename(); + + auto* out_dir = DorisFSDirectoryFactory::getDirectory(_fs, idx_path.c_str()); + auto* mock_output_v1 = new MockFSIndexOutputCloseV1(); + EXPECT_CALL(*mock_output_v1, close()).WillOnce(::testing::Invoke([&]() { + mock_output_v1->base_close(); + throw CLuceneError(CL_ERR_IO, "Simulated exception", false); + })); + auto compound_file_output = std::unique_ptr(mock_output_v1); + compound_file_output->init(_fs, cfs_path.c_str()); + + EXPECT_CALL(writer_mock, create_output_stream_v1(index_id, index_suffix)) + .WillOnce(::testing::Invoke( + [&]() -> std::pair> { + return std::make_pair(out_dir, std::move(compound_file_output)); + })); + + auto index_meta = create_mock_tablet_index(index_id, index_suffix); + ASSERT_NE(index_meta, nullptr); + + auto open_result = writer_mock.open(index_meta.get()); + ASSERT_TRUE(open_result.has_value()); + auto dir = open_result.value(); + + auto out_file = std::unique_ptr(dir->createOutput("test_file")); + out_file->writeString("test data"); + out_file->close(); + dir->close(); + + Status status = writer_mock.close(); + ASSERT_FALSE(status.ok()); + ASSERT_EQ(status.code(), ErrorCode::INVERTED_INDEX_CLUCENE_ERROR); +} + } // namespace segment_v2 -} // namespace doris +} // namespace doris \ No newline at end of file From 1dcd96da1d5e21fb11901b3c49dd41937f4e5b0c Mon Sep 17 00:00:00 2001 From: Xinyi Zou Date: Tue, 19 Nov 2024 10:54:42 +0800 Subject: [PATCH 08/63] [fix](arrow-flight-sql) Fix Doris NULL column conversion to arrow batch (#43929) ### What problem does this PR solve? Problem Summary: The representation of NULL columns in Doris is special, which is `DataTypeNull`. `Uint8` uses `arrow::BooleanBuilder` when serializing into arrow batch, which does not match the expected `arrow::NullBuilder`. Fix: ``` *** Query id: fd32741526804c1e-bc016473fd8f3aa3 *** *** is nereids: 1 *** *** tablet id: 0 *** *** Aborted at 1731327262 (unix time) try "date -d @1731327262" if you are using GNU date *** *** Current BE git commitID: 653e315ba5 *** *** SIGSEGV address not mapped to object (@0x100000024) received by PID 1442863 (TID 1443456 OR 0x7f8b8cdea700) from PID 36; stack trace: *** 0# doris::signal::(anonymous namespace)::FailureSignalHandler(int, siginfo_t*, void*) at /mnt/disk2/liyifan/doris/doris_2.1/doris/be/src/common/signal_handler.h:421 1# PosixSignals::chained_handler(int, siginfo*, void*) [clone .part.0] in /mnt/disk2/liyifan/doris/jdk-17.0.2/lib/server/libjvm.so 2# JVM_handle_linux_signal in /mnt/disk2/liyifan/doris/jdk-17.0.2/lib/server/libjvm.so 3# 0x00007F8CA1F38B50 in /lib64/libc.so.6 4# 0x000055FC45E5B2D3 in /mnt/disk2/liyifan/doris/doris_2.1/doris/output_run/be/lib/doris_be 5# arrow::BooleanBuilder::AppendValues(unsigned char const*, long, unsigned char const*) in /mnt/disk2/liyifan/doris/doris_2.1/doris/output_run/be/lib/doris_be 6# doris::vectorized::DataTypeNumberSerDe::write_column_to_arrow(doris::vectorized::IColumn const&, doris::vectorized::PODArray, 15ul, 16ul> const*, arrow::ArrayBuilder*, int, int, cctz::time_zone const&) const at /mnt/disk2/liyifan/doris/doris_2.1/doris/be/src/vec/data_types/serde/data_type_number_serde.cpp:86 7# doris::FromBlockConverter::convert(std::shared_ptr*) at /mnt/disk2/liyifan/doris/doris_2.1/doris/be/src/util/arrow/block_convertor.cpp:390 8# doris::convert_to_arrow_batch(doris::vectorized::Block const&, std::shared_ptr const&, arrow::MemoryPool*, std::shared_ptr*, cctz::time_zone const&) in /mnt/disk2/liyifan/doris/doris_2.1/doris/output_run/be/lib/doris_be 9# doris::vectorized::VArrowFlightResultWriter::write(doris::vectorized::Block&) at /mnt/disk2/liyifan/doris/doris_2.1/doris/be/src/vec/sink/varrow_flight_result_writer.cpp:76 10# doris::vectorized::VResultSink::send(doris::RuntimeState*, doris::vectorized::Block*, bool) at /mnt/disk2/liyifan/doris/doris_2.1/doris/be/src/vec/sink/vresult_sink.cpp:149 11# doris::PlanFragmentExecutor::open_vectorized_internal() at /mnt/disk2/liyifan/doris/doris_2.1/doris/be/src/runtime/plan_fragment_executor.cpp:341 12# doris::PlanFragmentExecutor::open() at /mnt/disk2/liyifan/doris/doris_2.1/doris/be/src/runtime/plan_fragment_executor.cpp:273 ``` --- .../serde/data_type_number_serde.cpp | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/be/src/vec/data_types/serde/data_type_number_serde.cpp b/be/src/vec/data_types/serde/data_type_number_serde.cpp index efa41e346bfa6e..f4fb6bbbb1f9cf 100644 --- a/be/src/vec/data_types/serde/data_type_number_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_number_serde.cpp @@ -78,12 +78,21 @@ void DataTypeNumberSerDe::write_column_to_arrow(const IColumn& column, const auto arrow_null_map = revert_null_map(null_map, start, end); auto arrow_null_map_data = arrow_null_map.empty() ? nullptr : arrow_null_map.data(); if constexpr (std::is_same_v) { - ARROW_BUILDER_TYPE& builder = assert_cast(*array_builder); - checkArrowStatus( - builder.AppendValues(reinterpret_cast(col_data.data() + start), - end - start, - reinterpret_cast(arrow_null_map_data)), - column.get_name(), array_builder->type()->name()); + auto* null_builder = dynamic_cast(array_builder); + if (null_builder) { + for (size_t i = start; i < end; ++i) { + checkArrowStatus(null_builder->AppendNull(), column.get_name(), + null_builder->type()->name()); + } + } else { + ARROW_BUILDER_TYPE& builder = assert_cast(*array_builder); + checkArrowStatus( + builder.AppendValues(reinterpret_cast(col_data.data() + start), + end - start, + reinterpret_cast(arrow_null_map_data)), + column.get_name(), array_builder->type()->name()); + } + } else if constexpr (std::is_same_v) { auto& string_builder = assert_cast(*array_builder); for (size_t i = start; i < end; ++i) { From 6f6c61c8e12e2253202da924153ce9237bd41b78 Mon Sep 17 00:00:00 2001 From: Xinyi Zou Date: Tue, 19 Nov 2024 10:54:49 +0800 Subject: [PATCH 09/63] [fix](memory) Fix UT `ThreadMemTrackerMgrTest` (#44147) ### What problem does this PR solve? Problem Summary: `ThreadMemTrackerMgrTest` will try reserve 4G memory, but the github pipeline machine may be not have enough memory and fail occasionally. --- be/test/runtime/memory/thread_mem_tracker_mgr_test.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/be/test/runtime/memory/thread_mem_tracker_mgr_test.cpp b/be/test/runtime/memory/thread_mem_tracker_mgr_test.cpp index a30e764be1d251..b0974460f4539c 100644 --- a/be/test/runtime/memory/thread_mem_tracker_mgr_test.cpp +++ b/be/test/runtime/memory/thread_mem_tracker_mgr_test.cpp @@ -231,7 +231,7 @@ TEST_F(ThreadMemTrackerMgrTest, ReserveMemory) { int64_t size1 = 4 * 1024; int64_t size2 = 4 * 1024 * 1024; - int64_t size3 = size2 * 1024; + int64_t size3 = size2 * 2; thread_context->attach_task(TUniqueId(), t, workload_group); thread_context->consume_memory(size1); @@ -255,7 +255,7 @@ TEST_F(ThreadMemTrackerMgrTest, ReserveMemory) { // std::abs(-size1 - size1) < SYNC_PROC_RESERVED_INTERVAL_BYTES, not update process_reserved_memory. EXPECT_EQ(doris::GlobalMemoryArbitrator::process_reserved_memory(), size3 - size2); - thread_context->consume_memory(size2 * 1023); + thread_context->consume_memory(size2); EXPECT_EQ(t->consumption(), size1 + size2 + size3); EXPECT_EQ(doris::GlobalMemoryArbitrator::process_reserved_memory(), size1 + size1); @@ -382,7 +382,7 @@ TEST_F(ThreadMemTrackerMgrTest, NestedSwitchMemTrackerReserveMemory) { int64_t size1 = 4 * 1024; int64_t size2 = 4 * 1024 * 1024; - int64_t size3 = size2 * 1024; + int64_t size3 = size2 * 2; thread_context->attach_task(TUniqueId(), t1, workload_group); auto st = thread_context->try_reserve_memory(size3); From 318174418a24377a74759dc2ac30711154ca5883 Mon Sep 17 00:00:00 2001 From: zclllhhjj Date: Tue, 19 Nov 2024 10:57:47 +0800 Subject: [PATCH 10/63] [Enhancement](scan) Make temp columns in expr pushdowns less intrusive (#44165) ### What problem does this PR solve? Issue Number: close #xxx Related PR: #xxx Problem Summary: before we change col1 to a `ColumnString` for row number indicator. it's not friendly for debug use in expr calculation. now use its origin type. btw, add more comments in this logic. --- .../olap/rowset/segment_v2/segment_iterator.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/be/src/olap/rowset/segment_v2/segment_iterator.cpp b/be/src/olap/rowset/segment_v2/segment_iterator.cpp index 5b1bfaf076279f..2c7aa5a0ce1cd0 100644 --- a/be/src/olap/rowset/segment_v2/segment_iterator.cpp +++ b/be/src/olap/rowset/segment_v2/segment_iterator.cpp @@ -2205,17 +2205,23 @@ Status SegmentIterator::_next_batch_internal(vectorized::Block* block) { _sel_rowid_idx[i] = i; } + // Here we just use col0 as row_number indicator. when reach here, we will calculate the predicates first. + // then use the result to reduce our data read(that is, expr push down). there's now row in block means the first + // column is not in common expr. so it's safe to replace it temporarily to provide correct `selected_size`. if (block->rows() == 0) { vectorized::MutableColumnPtr col0 = std::move(*block->get_by_position(0).column).mutate(); - auto res_column = vectorized::ColumnString::create(); - res_column->insert_data("", 0); - auto col_const = - vectorized::ColumnConst::create(std::move(res_column), selected_size); - block->replace_by_position(0, std::move(col_const)); + // temporary replace the column with a row number indicator. using a ColumnConst is more efficient than + // insert_many_default + auto tmp_indicator_col = + block->get_by_position(0).type->create_column_const_with_default_value( + selected_size); + block->replace_by_position(0, std::move(tmp_indicator_col)); + _output_index_result_column_for_expr(_sel_rowid_idx.data(), selected_size, block); block->shrink_char_type_column_suffix_zero(_char_type_idx_no_0); RETURN_IF_ERROR(_execute_common_expr(_sel_rowid_idx.data(), selected_size, block)); + // now recover the origin col0 block->replace_by_position(0, std::move(col0)); } else { _output_index_result_column_for_expr(_sel_rowid_idx.data(), selected_size, block); From 8cb6723658f95061c72beac5ce4774fab3bf3dac Mon Sep 17 00:00:00 2001 From: Gabriel Date: Tue, 19 Nov 2024 10:58:49 +0800 Subject: [PATCH 11/63] [fix](local shuffle) Fix unbalanced data distribution (#44137) Now `LOCAL_EXCHANGE_OPERATOR (BUCKET_HASH_SHUFFLE) ` use a wrong buckets num to distribute rows so it got an unbalance distribution. This PR fix it. Before: ``` LOCAL_EXCHANGE_OPERATOR (BUCKET_HASH_SHUFFLE) (id=-10): - RowsProduced: sum 32.636547M (32636547), avg 2.719712M (2719712), max 10.932368M (10932368), min 0 ``` After: ``` LOCAL_EXCHANGE_OPERATOR (BUCKET_HASH_SHUFFLE) (id=-10): - RowsProduced: sum 32.636547M (32636547), avg 2.719712M (2719712), max 2.736918M (2736918), min 2.6938M (2693800) ``` --- .../local_exchange/local_exchange_sink_operator.cpp | 1 + be/src/pipeline/local_exchange/local_exchanger.cpp | 13 ------------- be/src/pipeline/local_exchange/local_exchanger.h | 9 +++++---- be/src/pipeline/pipeline_fragment_context.cpp | 6 +++--- 4 files changed, 9 insertions(+), 20 deletions(-) diff --git a/be/src/pipeline/local_exchange/local_exchange_sink_operator.cpp b/be/src/pipeline/local_exchange/local_exchange_sink_operator.cpp index a939d25654b4cc..0369cf75834ce9 100644 --- a/be/src/pipeline/local_exchange/local_exchange_sink_operator.cpp +++ b/be/src/pipeline/local_exchange/local_exchange_sink_operator.cpp @@ -62,6 +62,7 @@ Status LocalExchangeSinkOperatorX::init(ExchangeType type, const int num_buckets _num_partitions)); RETURN_IF_ERROR(_partitioner->init(_texprs)); } else if (_type == ExchangeType::BUCKET_HASH_SHUFFLE) { + DCHECK_GT(num_buckets, 0); _partitioner.reset( new vectorized::Crc32HashPartitioner(num_buckets)); RETURN_IF_ERROR(_partitioner->init(_texprs)); diff --git a/be/src/pipeline/local_exchange/local_exchanger.cpp b/be/src/pipeline/local_exchange/local_exchanger.cpp index c5f99ca5d6a4a5..647988f8b794cb 100644 --- a/be/src/pipeline/local_exchange/local_exchanger.cpp +++ b/be/src/pipeline/local_exchange/local_exchanger.cpp @@ -226,19 +226,6 @@ Status ShuffleExchanger::_split_rows(RuntimeState* state, const uint32_t* __rest new_block_wrapper->unref(local_state._shared_state, local_state._channel_id); } } - } else if (_num_senders != _num_sources) { - // In this branch, data just should be distributed equally into all instances. - new_block_wrapper->ref(_num_partitions); - for (size_t i = 0; i < _num_partitions; i++) { - uint32_t start = local_state._partition_rows_histogram[i]; - uint32_t size = local_state._partition_rows_histogram[i + 1] - start; - if (size > 0) { - _enqueue_data_and_set_ready(i % _num_sources, local_state, - {new_block_wrapper, {row_idx, start, size}}); - } else { - new_block_wrapper->unref(local_state._shared_state, local_state._channel_id); - } - } } else { DCHECK(!bucket_seq_to_instance_idx.empty()); new_block_wrapper->ref(_num_partitions); diff --git a/be/src/pipeline/local_exchange/local_exchanger.h b/be/src/pipeline/local_exchange/local_exchanger.h index bf052ac3b924ca..4912ab3369815b 100644 --- a/be/src/pipeline/local_exchange/local_exchanger.h +++ b/be/src/pipeline/local_exchange/local_exchanger.h @@ -220,9 +220,7 @@ class ShuffleExchanger : public Exchanger { ShuffleExchanger(int running_sink_operators, int num_sources, int num_partitions, int free_block_limit) : Exchanger(running_sink_operators, num_sources, num_partitions, - free_block_limit) { - _data_queue.resize(num_partitions); - } + free_block_limit) {} Status _split_rows(RuntimeState* state, const uint32_t* __restrict channel_ids, vectorized::Block* block, LocalExchangeSinkLocalState& local_state); }; @@ -232,7 +230,10 @@ class BucketShuffleExchanger final : public ShuffleExchanger { BucketShuffleExchanger(int running_sink_operators, int num_sources, int num_partitions, int free_block_limit) : ShuffleExchanger(running_sink_operators, num_sources, num_partitions, - free_block_limit) {} + free_block_limit) { + DCHECK_GT(num_partitions, 0); + _data_queue.resize(std::max(num_partitions, num_sources)); + } ~BucketShuffleExchanger() override = default; ExchangeType get_type() const override { return ExchangeType::BUCKET_HASH_SHUFFLE; } }; diff --git a/be/src/pipeline/pipeline_fragment_context.cpp b/be/src/pipeline/pipeline_fragment_context.cpp index 06c39988238f43..7572b20d34112e 100644 --- a/be/src/pipeline/pipeline_fragment_context.cpp +++ b/be/src/pipeline/pipeline_fragment_context.cpp @@ -947,9 +947,9 @@ Status PipelineFragmentContext::_plan_local_exchange( // if 'num_buckets == 0' means the fragment is colocated by exchange node not the // scan node. so here use `_num_instance` to replace the `num_buckets` to prevent dividing 0 // still keep colocate plan after local shuffle - RETURN_IF_ERROR(_plan_local_exchange( - _use_serial_source || num_buckets == 0 ? _num_instances : num_buckets, pip_idx, - _pipelines[pip_idx], bucket_seq_to_instance_idx, shuffle_idx_to_instance_idx)); + RETURN_IF_ERROR(_plan_local_exchange(num_buckets, pip_idx, _pipelines[pip_idx], + bucket_seq_to_instance_idx, + shuffle_idx_to_instance_idx)); } return Status::OK(); } From 11a1435ef0fc7fc9325e05d76b25f1ffcfe35086 Mon Sep 17 00:00:00 2001 From: zzzxl Date: Tue, 19 Nov 2024 11:04:53 +0800 Subject: [PATCH 12/63] [fix](compile) fix macos compile failed (#44219) --- .../aggregate_functions/aggregate_function_approx_top_sum.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/be/src/vec/aggregate_functions/aggregate_function_approx_top_sum.h b/be/src/vec/aggregate_functions/aggregate_function_approx_top_sum.h index 9b3ba6a965091a..12b89bd02b51fd 100644 --- a/be/src/vec/aggregate_functions/aggregate_function_approx_top_sum.h +++ b/be/src/vec/aggregate_functions/aggregate_function_approx_top_sum.h @@ -89,7 +89,7 @@ class AggregateFunctionApproxTopSum final void deserialize(AggregateDataPtr __restrict place, BufferReadable& buf, Arena* arena) const override { auto readStringBinaryInto = [](Arena& arena, BufferReadable& buf) { - size_t size = 0; + uint64_t size = 0; read_var_uint(size, buf); if (UNLIKELY(size > DEFAULT_MAX_STRING_SIZE)) { @@ -105,7 +105,7 @@ class AggregateFunctionApproxTopSum final auto& set = this->data(place).value; set.clear(); - size_t size = 0; + uint64_t size = 0; read_var_uint(size, buf); if (UNLIKELY(size > TOP_K_MAX_SIZE)) { throw Exception(ErrorCode::INTERNAL_ERROR, From d08ac87e6c1ded4fed02a7aa4be58274b637321a Mon Sep 17 00:00:00 2001 From: starocean999 Date: Tue, 19 Nov 2024 11:22:43 +0800 Subject: [PATCH 13/63] [fix](nereids)should set isForwardedToMaster and redirectStatus to null before fallback to legacy planner (#44163) Problem Summary: when fallback to legacy planner, we need legacy planner to decide if the sql needs to be forwarded to master. But legacy planner doesn't work if isForwardedToMaster is already set to non-null value. So we should set isForwardedToMaster and redirectStatus to null before fallback --- fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java index 68e2b62fa69665..05c7853ca469df 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java @@ -629,6 +629,8 @@ public void execute(TUniqueId queryId) throws Exception { } parsedStmt = null; planner = null; + isForwardedToMaster = null; + redirectStatus = null; // Attention: currently exception from nereids does not mean an Exception to user terminal // unless user does not allow fallback to lagency planner. But state of query // has already been set to Error in this case, it will have some side effect on profile result From 52b827fae44752da42ea1c782cd3d816e6e4a148 Mon Sep 17 00:00:00 2001 From: Calvin Kirs Date: Tue, 19 Nov 2024 11:25:10 +0800 Subject: [PATCH 14/63] [chore](autopick)Change the conflict label to dev/2.1.x-conflict dev/3.0.x-conflict (#43917) Keep it consistent with the conflicting labels we picked earlier --- .github/workflows/auto-cherry-pick.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/auto-cherry-pick.yml b/.github/workflows/auto-cherry-pick.yml index 55a426f3d3282b..df1a44153ac9dd 100644 --- a/.github/workflows/auto-cherry-pick.yml +++ b/.github/workflows/auto-cherry-pick.yml @@ -59,7 +59,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} REPO_NAME: ${{ github.repository }} - CONFLICT_LABEL: cherry-pick-conflict-in-3.0 + CONFLICT_LABEL: dev/3.0.x-conflict run: | python tools/auto-pick-script.py ${{ github.event.pull_request.number }} branch-3.0 - name: Auto cherry-pick to branch-2.1 @@ -67,6 +67,6 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} REPO_NAME: ${{ github.repository }} - CONFLICT_LABEL: cherry-pick-conflict-in-2.1.x + CONFLICT_LABEL: dev/2.1.x-conflict run: | python tools/auto-pick-script.py ${{ github.event.pull_request.number }} branch-2.1 From ed556b6b3bda81b0802bcd1e5f624b282e349a9d Mon Sep 17 00:00:00 2001 From: Xinyi Zou Date: Tue, 19 Nov 2024 11:50:59 +0800 Subject: [PATCH 15/63] [fix](arrow-flight-sql) Fix conf `public_host` and `arrow_flight_sql_proxy_port` (#44177) ### What problem does this PR solve? Problem Summary: Rename `public_access_ip` to `public_host` and `public_access_port` to `arrow_flight_sql_proxy_port`, they do not have to be used together. --- be/src/common/config.cpp | 25 +++++++++++++++-- be/src/common/config.h | 28 +++++++++++++++---- be/src/service/internal_service.cpp | 8 ++++-- .../arrowflight/DorisFlightSqlProducer.java | 11 ++++++-- .../FlightSqlConnectProcessor.java | 8 ++++-- 5 files changed, 65 insertions(+), 15 deletions(-) diff --git a/be/src/common/config.cpp b/be/src/common/config.cpp index 796e9af62ce480..d9b9a02260a4e6 100644 --- a/be/src/common/config.cpp +++ b/be/src/common/config.cpp @@ -63,8 +63,29 @@ DEFINE_Int32(brpc_port, "8060"); DEFINE_Int32(arrow_flight_sql_port, "-1"); -DEFINE_mString(public_access_ip, ""); -DEFINE_Int32(public_access_port, "-1"); +// If the external client cannot directly access priority_networks, set public_host to be accessible +// to external client. +// There are usually two usage scenarios: +// 1. in production environment, it is often inconvenient to expose Doris BE nodes to the external network. +// However, a reverse proxy (such as Nginx) can be added to all Doris BE nodes, and the external client will be +// randomly routed to a Doris BE node when connecting to Nginx. set public_host to the host of Nginx. +// 2. if priority_networks is an internal network IP, and BE node has its own independent external IP, +// but Doris currently does not support modifying priority_networks, setting public_host to the real external IP. +DEFINE_mString(public_host, ""); + +// If the BE node is connected to the external network through a reverse proxy like Nginx +// and need to use Arrow Flight SQL, should add a server in Nginx to reverse proxy +// `Nginx:arrow_flight_sql_proxy_port` to `BE_priority_networks:arrow_flight_sql_port`. For example: +// upstream arrowflight { +// server 10.16.10.8:8069; +// server 10.16.10.8:8068; +//} +// server { +// listen 8167 http2; +// listen [::]:8167 http2; +// server_name doris.arrowflight.com; +// } +DEFINE_Int32(arrow_flight_sql_proxy_port, "-1"); // the number of bthreads for brpc, the default value is set to -1, // which means the number of bthreads is #cpu-cores diff --git a/be/src/common/config.h b/be/src/common/config.h index c40875728a3623..7f18406eeee721 100644 --- a/be/src/common/config.h +++ b/be/src/common/config.h @@ -100,11 +100,29 @@ DECLARE_Int32(brpc_port); // Default -1, do not start arrow flight sql server. DECLARE_Int32(arrow_flight_sql_port); -// If priority_networks is incorrect but cannot be modified, set public_access_ip as BE’s real IP. -// For ADBC client fetch result, default is empty, the ADBC client uses the backend ip to fetch the result. -// If ADBC client cannot access the backend ip, can set public_access_ip to modify the fetch result ip. -DECLARE_mString(public_access_ip); -DECLARE_Int32(public_access_port); +// If the external client cannot directly access priority_networks, set public_host to be accessible +// to external client. +// There are usually two usage scenarios: +// 1. in production environment, it is often inconvenient to expose Doris BE nodes to the external network. +// However, a reverse proxy (such as Nginx) can be added to all Doris BE nodes, and the external client will be +// randomly routed to a Doris BE node when connecting to Nginx. set public_host to the host of Nginx. +// 2. if priority_networks is an internal network IP, and BE node has its own independent external IP, +// but Doris currently does not support modifying priority_networks, setting public_host to the real external IP. +DECLARE_mString(public_host); + +// If the BE node is connected to the external network through a reverse proxy like Nginx +// and need to use Arrow Flight SQL, should add a server in Nginx to reverse proxy +// `Nginx:arrow_flight_sql_proxy_port` to `BE_priority_networks:arrow_flight_sql_port`. For example: +// upstream arrowflight { +// server 10.16.10.8:8069; +// server 10.16.10.8:8068; +//} +// server { +// listen 8167 http2; +// listen [::]:8167 http2; +// server_name doris.arrowflight.com; +// } +DECLARE_Int32(arrow_flight_sql_proxy_port); // the number of bthreads for brpc, the default value is set to -1, // which means the number of bthreads is #cpu-cores diff --git a/be/src/service/internal_service.cpp b/be/src/service/internal_service.cpp index be99278ab541a3..adcd07e7de7484 100644 --- a/be/src/service/internal_service.cpp +++ b/be/src/service/internal_service.cpp @@ -912,9 +912,11 @@ void PInternalService::fetch_arrow_flight_schema(google::protobuf::RpcController st = serialize_arrow_schema(&schema, &schema_str); if (st.ok()) { result->set_schema(std::move(schema_str)); - if (!config::public_access_ip.empty() && config::public_access_port != -1) { - result->set_be_arrow_flight_ip(config::public_access_ip); - result->set_be_arrow_flight_port(config::public_access_port); + if (!config::public_host.empty()) { + result->set_be_arrow_flight_ip(config::public_host); + } + if (config::arrow_flight_sql_proxy_port != -1) { + result->set_be_arrow_flight_port(config::arrow_flight_sql_proxy_port); } } st.to_protobuf(result->mutable_status()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/service/arrowflight/DorisFlightSqlProducer.java b/fe/fe-core/src/main/java/org/apache/doris/service/arrowflight/DorisFlightSqlProducer.java index 371680813502f4..9d44a55b081645 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/service/arrowflight/DorisFlightSqlProducer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/service/arrowflight/DorisFlightSqlProducer.java @@ -253,8 +253,15 @@ private FlightInfo executeQueryStatement(String peerIdentity, ConnectContext con // The query results of Arrow Flight SQL will be randomly saved on a Doris BE node. // If it is different from the Doris BE node randomly routed by nginx, // data forwarding needs to be done inside the Doris BE node. - location = Location.forGrpcInsecure(flightSQLConnectProcessor.getPublicAccessAddr().hostname, - flightSQLConnectProcessor.getPublicAccessAddr().port); + if (flightSQLConnectProcessor.getPublicAccessAddr().isSetPort()) { + location = Location.forGrpcInsecure( + flightSQLConnectProcessor.getPublicAccessAddr().hostname, + flightSQLConnectProcessor.getPublicAccessAddr().port); + } else { + location = Location.forGrpcInsecure( + flightSQLConnectProcessor.getPublicAccessAddr().hostname, + connectContext.getResultFlightServerAddr().port); + } } else { location = Location.forGrpcInsecure(connectContext.getResultFlightServerAddr().hostname, connectContext.getResultFlightServerAddr().port); diff --git a/fe/fe-core/src/main/java/org/apache/doris/service/arrowflight/FlightSqlConnectProcessor.java b/fe/fe-core/src/main/java/org/apache/doris/service/arrowflight/FlightSqlConnectProcessor.java index febadbef0ab0d2..db5213cb7d4d08 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/service/arrowflight/FlightSqlConnectProcessor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/service/arrowflight/FlightSqlConnectProcessor.java @@ -137,9 +137,11 @@ public Schema fetchArrowFlightSchema(int timeoutMs) { throw new RuntimeException(String.format("fetch arrow flight schema failed, queryId: %s, errmsg: %s", DebugUtil.printId(tid), resultStatus)); } - if (pResult.hasBeArrowFlightIp() && pResult.hasBeArrowFlightPort()) { - publicAccessAddr.hostname = pResult.getBeArrowFlightIp().toStringUtf8(); - publicAccessAddr.port = pResult.getBeArrowFlightPort(); + if (pResult.hasBeArrowFlightIp()) { + publicAccessAddr.setHostname(pResult.getBeArrowFlightIp().toStringUtf8()); + } + if (pResult.hasBeArrowFlightPort()) { + publicAccessAddr.setPort(pResult.getBeArrowFlightPort()); } if (pResult.hasSchema() && pResult.getSchema().size() > 0) { RootAllocator rootAllocator = new RootAllocator(Integer.MAX_VALUE); From faa8a6425e692f9604e342800c6143b79ca9008e Mon Sep 17 00:00:00 2001 From: Xinyi Zou Date: Tue, 19 Nov 2024 12:02:49 +0800 Subject: [PATCH 16/63] [chore](sink) `enable_parallel_result_sink` default value is changed to false (#43933) ### What problem does this PR solve? Problem Summary: For most queries, result sink will not become a performance bottleneck, but the parallel result sink will increase the pressure of RPC between fe and be. --- .../java/org/apache/doris/qe/SessionVariable.java | 2 +- .../org/apache/doris/utframe/AnotherDemoTest.java | 15 ++++++++++++++- .../java/org/apache/doris/utframe/DemoTest.java | 15 ++++++++++++++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java index 084005020377f6..eb0a669e05be5e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java @@ -1203,7 +1203,7 @@ public enum IgnoreSplitType { private boolean enableSyncRuntimeFilterSize = true; @VariableMgr.VarAttr(name = ENABLE_PARALLEL_RESULT_SINK, needForward = true, fuzzy = true) - private boolean enableParallelResultSink = true; + private boolean enableParallelResultSink = false; @VariableMgr.VarAttr(name = "sort_phase_num", fuzzy = true, needForward = true, description = {"如设置为1,则只生成1阶段sort,设置为2,则只生成2阶段sort,设置其它值,优化器根据代价选择sort类型", diff --git a/fe/fe-core/src/test/java/org/apache/doris/utframe/AnotherDemoTest.java b/fe/fe-core/src/test/java/org/apache/doris/utframe/AnotherDemoTest.java index 2da5a3cabd871e..530fd15a9b6f37 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/utframe/AnotherDemoTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/utframe/AnotherDemoTest.java @@ -25,6 +25,7 @@ import org.apache.doris.catalog.Table; import org.apache.doris.common.DdlException; import org.apache.doris.common.FeConstants; +import org.apache.doris.planner.ExchangeNode; import org.apache.doris.planner.OlapScanNode; import org.apache.doris.planner.PlanFragment; import org.apache.doris.planner.Planner; @@ -120,7 +121,8 @@ public void testCreateDbAndTable() throws Exception { } // 5. query // TODO: we can not process real query for now. So it has to be a explain query - String queryStr = "explain select /*+ SET_VAR(disable_nereids_rules=PRUNE_EMPTY_PARTITION) */ * from db1.tbl1"; + String queryStr = "explain select /*+ SET_VAR(disable_nereids_rules=PRUNE_EMPTY_PARTITION, " + + "enable_parallel_result_sink=true) */ * from db1.tbl1"; StmtExecutor stmtExecutor = new StmtExecutor(ctx, queryStr); stmtExecutor.execute(); Planner planner = stmtExecutor.planner(); @@ -129,5 +131,16 @@ public void testCreateDbAndTable() throws Exception { PlanFragment fragment = fragments.get(0); Assert.assertTrue(fragment.getPlanRoot() instanceof OlapScanNode); Assert.assertEquals(0, fragment.getChildren().size()); + + queryStr = "explain select /*+ SET_VAR(disable_nereids_rules=PRUNE_EMPTY_PARTITION, " + + "enable_parallel_result_sink=false) */ * from db1.tbl1"; + stmtExecutor = new StmtExecutor(ctx, queryStr); + stmtExecutor.execute(); + planner = stmtExecutor.planner(); + fragments = planner.getFragments(); + Assert.assertEquals(2, fragments.size()); + fragment = fragments.get(0); + Assert.assertTrue(fragment.getPlanRoot() instanceof ExchangeNode); + Assert.assertEquals(1, fragment.getChildren().size()); } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/utframe/DemoTest.java b/fe/fe-core/src/test/java/org/apache/doris/utframe/DemoTest.java index 289f6c9902d8f8..f1f9fd7ef23d5c 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/utframe/DemoTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/utframe/DemoTest.java @@ -26,6 +26,7 @@ import org.apache.doris.catalog.OlapTable; import org.apache.doris.catalog.Table; import org.apache.doris.common.FeConstants; +import org.apache.doris.planner.ExchangeNode; import org.apache.doris.planner.OlapScanNode; import org.apache.doris.planner.PlanFragment; import org.apache.doris.planner.Planner; @@ -108,7 +109,8 @@ public void testCreateDbAndTable() throws Exception { // 7. query // TODO: we can not process real query for now. So it has to be a explain query - String queryStr = "explain select /*+ SET_VAR(disable_nereids_rules=PRUNE_EMPTY_PARTITION) */ * from db1.tbl1"; + String queryStr = "explain select /*+ SET_VAR(disable_nereids_rules=PRUNE_EMPTY_PARTITION, " + + "enable_parallel_result_sink=true) */ * from db1.tbl1"; StmtExecutor stmtExecutor = new StmtExecutor(connectContext, queryStr); stmtExecutor.execute(); Planner planner = stmtExecutor.planner(); @@ -117,5 +119,16 @@ public void testCreateDbAndTable() throws Exception { PlanFragment fragment = fragments.get(0); Assertions.assertTrue(fragment.getPlanRoot() instanceof OlapScanNode); Assertions.assertEquals(0, fragment.getChildren().size()); + + queryStr = "explain select /*+ SET_VAR(disable_nereids_rules=PRUNE_EMPTY_PARTITION, " + + "enable_parallel_result_sink=false) */ * from db1.tbl1"; + stmtExecutor = new StmtExecutor(connectContext, queryStr); + stmtExecutor.execute(); + planner = stmtExecutor.planner(); + fragments = planner.getFragments(); + Assertions.assertEquals(2, fragments.size()); + fragment = fragments.get(0); + Assertions.assertTrue(fragment.getPlanRoot() instanceof ExchangeNode); + Assertions.assertEquals(1, fragment.getChildren().size()); } } From 48ef81aa085b391f8f4eacf3ede8788b30053e18 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Tue, 19 Nov 2024 14:12:41 +0800 Subject: [PATCH 17/63] [conf](fe) Print jvm `ClassHistogram` in fe gc log after full gc (#44010) * Add `-XX:+PrintClassHistogramAfterFullGC` for JAVA_OPTS * Add `classhisto*=trace` for JAVA_OPTS_FOR_JDK_17 fe.gc.log will print like this: ``` 2024-11-15T11:49:00.316+0800: 11.346: [Class Histogram (after full gc): num #instances #bytes class name ---------------------------------------------- 1: 7464 7053464 [B 2: 37465 3656360 [C 3: 7076 2909880 [Ljava.lang.Object; 4: 4915 2306872 [I 5: 9167 1719552 [S 6: 16229 1168488 io.grpc.netty.shaded.io.netty.buffer.PoolSubpage ...... ``` --- conf/fe.conf | 4 ++-- regression-test/pipeline/external/conf/fe.conf | 4 ++-- regression-test/pipeline/p0/conf/fe.conf | 4 ++-- regression-test/pipeline/p1/conf/fe.conf | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/conf/fe.conf b/conf/fe.conf index bbfad0c15a82d0..72734a86733a31 100644 --- a/conf/fe.conf +++ b/conf/fe.conf @@ -27,10 +27,10 @@ CUR_DATE=`date +%Y%m%d-%H%M%S` LOG_DIR = ${DORIS_HOME}/log # For jdk 8 -JAVA_OPTS="-Dfile.encoding=UTF-8 -Djavax.security.auth.useSubjectCredsOnly=false -Xss4m -Xmx8192m -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:$LOG_DIR/log/fe.gc.log.$CUR_DATE -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=50M -Dlog4j2.formatMsgNoLookups=true" +JAVA_OPTS="-Dfile.encoding=UTF-8 -Djavax.security.auth.useSubjectCredsOnly=false -Xss4m -Xmx8192m -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintClassHistogramAfterFullGC -Xloggc:$LOG_DIR/log/fe.gc.log.$CUR_DATE -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=50M -Dlog4j2.formatMsgNoLookups=true" # For jdk 17, this JAVA_OPTS will be used as default JVM options -JAVA_OPTS_FOR_JDK_17="-Dfile.encoding=UTF-8 -Djavax.security.auth.useSubjectCredsOnly=false -Xmx8192m -Xms8192m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$LOG_DIR -Xlog:gc*:$LOG_DIR/fe.gc.log.$CUR_DATE:time,uptime:filecount=10,filesize=50M --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens java.base/jdk.internal.ref=ALL-UNNAMED" +JAVA_OPTS_FOR_JDK_17="-Dfile.encoding=UTF-8 -Djavax.security.auth.useSubjectCredsOnly=false -Xmx8192m -Xms8192m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$LOG_DIR -Xlog:gc*,classhisto*=trace:$LOG_DIR/fe.gc.log.$CUR_DATE:time,uptime:filecount=10,filesize=50M --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens java.base/jdk.internal.ref=ALL-UNNAMED" # Set your own JAVA_HOME # JAVA_HOME=/path/to/jdk/ diff --git a/regression-test/pipeline/external/conf/fe.conf b/regression-test/pipeline/external/conf/fe.conf index 92a6184fd92c75..2271abaa8e474e 100644 --- a/regression-test/pipeline/external/conf/fe.conf +++ b/regression-test/pipeline/external/conf/fe.conf @@ -25,13 +25,13 @@ LOG_DIR = ${DORIS_HOME}/log DATE = `date +%Y%m%d-%H%M%S` -JAVA_OPTS="-Xmx4096m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$DORIS_HOME/log/fe.jmap -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xloggc:$DORIS_HOME/log/fe.gc.log.$DATE -Dcom.mysql.cj.disableAbandonedConnectionCleanup=true" +JAVA_OPTS="-Xmx4096m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$DORIS_HOME/log/fe.jmap -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintClassHistogramAfterFullGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xloggc:$DORIS_HOME/log/fe.gc.log.$DATE -Dcom.mysql.cj.disableAbandonedConnectionCleanup=true" # For jdk 9+, this JAVA_OPTS will be used as default JVM options JAVA_OPTS_FOR_JDK_9="-Xmx4096m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$DORIS_HOME/log/fe.jmap -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xlog:gc*:$DORIS_HOME/log/fe.gc.log.$DATE:time -Dcom.mysql.cj.disableAbandonedConnectionCleanup=true" # For jdk 17+, this JAVA_OPTS will be used as default JVM options -JAVA_OPTS_FOR_JDK_17="-Djavax.security.auth.useSubjectCredsOnly=false -Xmx8192m -Xms8192m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$DORIS_HOME/log/ -Xlog:gc*:$DORIS_HOME/log/fe.gc.log.$CUR_DATE:time -Dcom.mysql.cj.disableAbandonedConnectionCleanup=true" +JAVA_OPTS_FOR_JDK_17="-Djavax.security.auth.useSubjectCredsOnly=false -Xmx8192m -Xms8192m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$DORIS_HOME/log/ -Xlog:gc*,classhisto*=trace:$DORIS_HOME/log/fe.gc.log.$CUR_DATE:time -Dcom.mysql.cj.disableAbandonedConnectionCleanup=true" ## ## the lowercase properties are read by main program. diff --git a/regression-test/pipeline/p0/conf/fe.conf b/regression-test/pipeline/p0/conf/fe.conf index c31db3d902676d..44688ff4adc2db 100644 --- a/regression-test/pipeline/p0/conf/fe.conf +++ b/regression-test/pipeline/p0/conf/fe.conf @@ -27,10 +27,10 @@ CUR_DATE=`date +%Y%m%d-%H%M%S` LOG_DIR = ${DORIS_HOME}/log # For jdk 8 -JAVA_OPTS="-Djavax.security.auth.useSubjectCredsOnly=false -Xss4m -Xmx4096m -XX:+HeapDumpOnOutOfMemoryError -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:$DORIS_HOME/log/fe.gc.log.$CUR_DATE -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=50M -Dlog4j2.formatMsgNoLookups=true -Dcom.mysql.cj.disableAbandonedConnectionCleanup=true" +JAVA_OPTS="-Djavax.security.auth.useSubjectCredsOnly=false -Xss4m -Xmx4096m -XX:+HeapDumpOnOutOfMemoryError -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintClassHistogramAfterFullGC -Xloggc:$DORIS_HOME/log/fe.gc.log.$CUR_DATE -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=50M -Dlog4j2.formatMsgNoLookups=true -Dcom.mysql.cj.disableAbandonedConnectionCleanup=true" # For jdk 17, this JAVA_OPTS will be used as default JVM options -JAVA_OPTS_FOR_JDK_17="-Djavax.security.auth.useSubjectCredsOnly=false -Xmx8192m -Xms8192m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$DORIS_HOME/log/ -Xlog:gc*:$DORIS_HOME/log/fe.gc.log.$CUR_DATE:time,uptime:filecount=10,filesize=50M -Dcom.mysql.cj.disableAbandonedConnectionCleanup=true --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens java.base/jdk.internal.ref=ALL-UNNAMED" +JAVA_OPTS_FOR_JDK_17="-Djavax.security.auth.useSubjectCredsOnly=false -Xmx8192m -Xms8192m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$DORIS_HOME/log/ -Xlog:gc*,classhisto*=trace:$DORIS_HOME/log/fe.gc.log.$CUR_DATE:time,uptime:filecount=10,filesize=50M -Dcom.mysql.cj.disableAbandonedConnectionCleanup=true --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens java.base/jdk.internal.ref=ALL-UNNAMED" sys_log_level = INFO sys_log_mode = NORMAL diff --git a/regression-test/pipeline/p1/conf/fe.conf b/regression-test/pipeline/p1/conf/fe.conf index 07a8b71b9a3ed1..168fe99c6e0790 100644 --- a/regression-test/pipeline/p1/conf/fe.conf +++ b/regression-test/pipeline/p1/conf/fe.conf @@ -27,10 +27,10 @@ CUR_DATE=`date +%Y%m%d-%H%M%S` LOG_DIR = ${DORIS_HOME}/log # For jdk 8 -JAVA_OPTS="-Djavax.security.auth.useSubjectCredsOnly=false -Xss4m -Xmx4096m -XX:+HeapDumpOnOutOfMemoryError -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:$DORIS_HOME/log/fe.gc.log.$CUR_DATE -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=50M -Dlog4j2.formatMsgNoLookups=true -Dcom.mysql.cj.disableAbandonedConnectionCleanup=true" +JAVA_OPTS="-Djavax.security.auth.useSubjectCredsOnly=false -Xss4m -Xmx4096m -XX:+HeapDumpOnOutOfMemoryError -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintClassHistogramAfterFullGC -Xloggc:$DORIS_HOME/log/fe.gc.log.$CUR_DATE -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=50M -Dlog4j2.formatMsgNoLookups=true -Dcom.mysql.cj.disableAbandonedConnectionCleanup=true" # For jdk 17, this JAVA_OPTS will be used as default JVM options -JAVA_OPTS_FOR_JDK_17="-Djavax.security.auth.useSubjectCredsOnly=false -Xmx8192m -Xms8192m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$DORIS_HOME/log/ -Xlog:gc*:$DORIS_HOME/log/fe.gc.log.$CUR_DATE:time,uptime:filecount=10,filesize=50M -Dcom.mysql.cj.disableAbandonedConnectionCleanup=true" +JAVA_OPTS_FOR_JDK_17="-Djavax.security.auth.useSubjectCredsOnly=false -Xmx8192m -Xms8192m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$DORIS_HOME/log/ -Xlog:gc*,classhisto*=trace:$DORIS_HOME/log/fe.gc.log.$CUR_DATE:time,uptime:filecount=10,filesize=50M -Dcom.mysql.cj.disableAbandonedConnectionCleanup=true" sys_log_level = INFO sys_log_mode = NORMAL From 889b3482dbeda67fc51cb6cbcd354fe0e70f0098 Mon Sep 17 00:00:00 2001 From: Kaijie Chen Date: Tue, 19 Nov 2024 14:17:33 +0800 Subject: [PATCH 18/63] [cleanup](load) remove unused load properties "use_new_load_scan_node" (#43989) remove unused load properties "use_new_load_scan_node" --- .../main/java/org/apache/doris/analysis/LoadStmt.java | 9 --------- .../org/apache/doris/cloud/load/CloudBrokerLoadJob.java | 2 +- .../apache/doris/cloud/load/CloudLoadLoadingTask.java | 4 ++-- .../java/org/apache/doris/load/loadv2/BrokerLoadJob.java | 2 +- .../main/java/org/apache/doris/load/loadv2/LoadJob.java | 4 ---- .../org/apache/doris/load/loadv2/LoadLoadingTask.java | 6 ++---- .../org/apache/doris/load/loadv2/LoadingTaskPlanner.java | 4 +--- .../test_segcompaction_fault_injection.groovy | 3 --- .../test_too_many_segments_fault_injection.groovy | 3 --- .../test_csv_with_enclose_and_escapeS3_load.groovy | 1 - .../suites/load_p0/broker_load/test_etl_failed.groovy | 4 ---- .../load_p0/broker_load/test_multi_table_load.groovy | 2 -- .../suites/load_p0/broker_load/test_seq_load.groovy | 5 +---- .../suites/load_p2/broker_load/test_broker_load.groovy | 3 --- .../load_p2/broker_load/test_s3_load_properties.groovy | 1 - .../test_s3_load_with_load_parallelism.groovy | 1 - .../suites/query_profile/s3_load_profile_test.groovy | 1 - .../segcompaction_p2/test_segcompaction_agg_keys.groovy | 3 --- .../test_segcompaction_agg_keys_index.groovy | 3 --- .../segcompaction_p2/test_segcompaction_dup_keys.groovy | 3 --- .../test_segcompaction_dup_keys_index.groovy | 3 --- .../test_segcompaction_unique_keys.groovy | 3 --- .../test_segcompaction_unique_keys_mow.groovy | 3 --- .../test_segcompaction_unique_keys_mow_index.groovy | 3 --- 24 files changed, 8 insertions(+), 68 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/LoadStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/LoadStmt.java index 790bedda198c10..3a2efe3c98c902 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/LoadStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/LoadStmt.java @@ -98,9 +98,6 @@ public class LoadStmt extends DdlStmt implements NotFallbackInParser { public static final String SEND_BATCH_PARALLELISM = "send_batch_parallelism"; public static final String PRIORITY = "priority"; public static final String LOAD_TO_SINGLE_TABLET = "load_to_single_tablet"; - // temp property, just make regression test happy. - // should remove when Config.enable_new_load_scan_node is set to true by default. - public static final String USE_NEW_LOAD_SCAN_NODE = "use_new_load_scan_node"; // for load data from Baidu Object Store(BOS) public static final String BOS_ENDPOINT = "bos_endpoint"; @@ -224,12 +221,6 @@ public class LoadStmt extends DdlStmt implements NotFallbackInParser { return Boolean.valueOf(s); } }) - .put(USE_NEW_LOAD_SCAN_NODE, new Function() { - @Override - public @Nullable Boolean apply(@Nullable String s) { - return Boolean.valueOf(s); - } - }) .put(KEY_SKIP_LINES, new Function() { @Override public @Nullable Integer apply(@Nullable String s) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/cloud/load/CloudBrokerLoadJob.java b/fe/fe-core/src/main/java/org/apache/doris/cloud/load/CloudBrokerLoadJob.java index 920e03bdfa2472..86c57baa1dd642 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/cloud/load/CloudBrokerLoadJob.java +++ b/fe/fe-core/src/main/java/org/apache/doris/cloud/load/CloudBrokerLoadJob.java @@ -154,7 +154,7 @@ brokerFileGroups, getDeadlineMs(), getExecMemLimit(), isStrictMode(), isPartialUpdate(), transactionId, this, getTimeZone(), getTimeout(), getLoadParallelism(), getSendBatchParallelism(), getMaxFilterRatio() <= 0, enableProfile ? jobProfile : null, isSingleTabletLoadPerSink(), - useNewLoadScanNode(), getPriority(), isEnableMemtableOnSinkNode, batchSize, cloudClusterId); + getPriority(), isEnableMemtableOnSinkNode, batchSize, cloudClusterId); UUID uuid = UUID.randomUUID(); TUniqueId loadId = new TUniqueId(uuid.getMostSignificantBits(), uuid.getLeastSignificantBits()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/cloud/load/CloudLoadLoadingTask.java b/fe/fe-core/src/main/java/org/apache/doris/cloud/load/CloudLoadLoadingTask.java index 2316a072fa809b..f5614b8e3ed5ad 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/cloud/load/CloudLoadLoadingTask.java +++ b/fe/fe-core/src/main/java/org/apache/doris/cloud/load/CloudLoadLoadingTask.java @@ -47,11 +47,11 @@ public CloudLoadLoadingTask(Database db, OlapTable table, long txnId, LoadTaskCallback callback, String timezone, long timeoutS, int loadParallelism, int sendBatchParallelism, boolean loadZeroTolerance, Profile jobProfile, boolean singleTabletLoadPerSink, - boolean useNewLoadScanNode, Priority priority, boolean enableMemTableOnSinkNode, int batchSize, + Priority priority, boolean enableMemTableOnSinkNode, int batchSize, String clusterId) { super(db, table, brokerDesc, fileGroups, jobDeadlineMs, execMemLimit, strictMode, isPartialUpdate, txnId, callback, timezone, timeoutS, loadParallelism, sendBatchParallelism, loadZeroTolerance, - jobProfile, singleTabletLoadPerSink, useNewLoadScanNode, priority, enableMemTableOnSinkNode, batchSize); + jobProfile, singleTabletLoadPerSink, priority, enableMemTableOnSinkNode, batchSize); this.cloudClusterId = clusterId; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/BrokerLoadJob.java b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/BrokerLoadJob.java index 872d0c5396a76d..895f46866e0e71 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/BrokerLoadJob.java +++ b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/BrokerLoadJob.java @@ -227,7 +227,7 @@ brokerFileGroups, getDeadlineMs(), getExecMemLimit(), isStrictMode(), isPartialUpdate(), transactionId, this, getTimeZone(), getTimeout(), getLoadParallelism(), getSendBatchParallelism(), getMaxFilterRatio() <= 0, enableProfile ? jobProfile : null, isSingleTabletLoadPerSink(), - useNewLoadScanNode(), getPriority(), isEnableMemtableOnSinkNode, batchSize); + getPriority(), isEnableMemtableOnSinkNode, batchSize); UUID uuid = UUID.randomUUID(); TUniqueId loadId = new TUniqueId(uuid.getMostSignificantBits(), uuid.getLeastSignificantBits()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadJob.java b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadJob.java index 8cb9070cf7a503..64c8442f0f4ea6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadJob.java +++ b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadJob.java @@ -1228,10 +1228,6 @@ public boolean isSingleTabletLoadPerSink() { return (boolean) jobProperties.get(LoadStmt.LOAD_TO_SINGLE_TABLET); } - public boolean useNewLoadScanNode() { - return (boolean) jobProperties.getOrDefault(LoadStmt.USE_NEW_LOAD_SCAN_NODE, false); - } - // Return true if this job is finished for a long time public boolean isExpired(long currentTimeMs) { if (!isCompleted()) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadLoadingTask.java b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadLoadingTask.java index 8510c2dc124be8..fd64ae7e8ba70d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadLoadingTask.java +++ b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadLoadingTask.java @@ -74,7 +74,6 @@ public class LoadLoadingTask extends LoadTask { private final int sendBatchParallelism; private final boolean loadZeroTolerance; private final boolean singleTabletLoadPerSink; - private final boolean useNewLoadScanNode; private final boolean enableMemTableOnSinkNode; private final int batchSize; @@ -92,7 +91,7 @@ public LoadLoadingTask(Database db, OlapTable table, long txnId, LoadTaskCallback callback, String timezone, long timeoutS, int loadParallelism, int sendBatchParallelism, boolean loadZeroTolerance, Profile jobProfile, boolean singleTabletLoadPerSink, - boolean useNewLoadScanNode, Priority priority, boolean enableMemTableOnSinkNode, int batchSize) { + Priority priority, boolean enableMemTableOnSinkNode, int batchSize) { super(callback, TaskType.LOADING, priority); this.db = db; this.table = table; @@ -112,7 +111,6 @@ public LoadLoadingTask(Database db, OlapTable table, this.loadZeroTolerance = loadZeroTolerance; this.jobProfile = jobProfile; this.singleTabletLoadPerSink = singleTabletLoadPerSink; - this.useNewLoadScanNode = useNewLoadScanNode; this.enableMemTableOnSinkNode = enableMemTableOnSinkNode; this.batchSize = batchSize; } @@ -122,7 +120,7 @@ public void init(TUniqueId loadId, List> fileStatusList, this.loadId = loadId; planner = new LoadingTaskPlanner(callback.getCallbackId(), txnId, db.getId(), table, brokerDesc, fileGroups, strictMode, isPartialUpdate, timezone, this.timeoutS, this.loadParallelism, this.sendBatchParallelism, - this.useNewLoadScanNode, userInfo, singleTabletLoadPerSink, enableMemTableOnSinkNode); + userInfo, singleTabletLoadPerSink, enableMemTableOnSinkNode); planner.plan(loadId, fileStatusList, fileNum); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadingTaskPlanner.java b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadingTaskPlanner.java index ef429a1d564208..ed881ce02f1ab0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadingTaskPlanner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadingTaskPlanner.java @@ -71,7 +71,6 @@ public class LoadingTaskPlanner { private final long timeoutS; // timeout of load job, in second private final int loadParallelism; private final int sendBatchParallelism; - private final boolean useNewLoadScanNode; private final boolean singleTabletLoadPerSink; private final boolean enableMemtableOnSinkNode; private UserIdentity userInfo; @@ -89,7 +88,7 @@ public class LoadingTaskPlanner { public LoadingTaskPlanner(Long loadJobId, long txnId, long dbId, OlapTable table, BrokerDesc brokerDesc, List brokerFileGroups, boolean strictMode, boolean isPartialUpdate, String timezone, long timeoutS, int loadParallelism, - int sendBatchParallelism, boolean useNewLoadScanNode, UserIdentity userInfo, + int sendBatchParallelism, UserIdentity userInfo, boolean singleTabletLoadPerSink, boolean enableMemtableOnSinkNode) { this.loadJobId = loadJobId; this.txnId = txnId; @@ -103,7 +102,6 @@ public LoadingTaskPlanner(Long loadJobId, long txnId, long dbId, OlapTable table this.timeoutS = timeoutS; this.loadParallelism = loadParallelism; this.sendBatchParallelism = sendBatchParallelism; - this.useNewLoadScanNode = useNewLoadScanNode; this.userInfo = userInfo; this.singleTabletLoadPerSink = singleTabletLoadPerSink; this.enableMemtableOnSinkNode = enableMemtableOnSinkNode; diff --git a/regression-test/suites/fault_injection_p0/test_segcompaction_fault_injection.groovy b/regression-test/suites/fault_injection_p0/test_segcompaction_fault_injection.groovy index 3c679af7a6603f..20252e9189d277 100644 --- a/regression-test/suites/fault_injection_p0/test_segcompaction_fault_injection.groovy +++ b/regression-test/suites/fault_injection_p0/test_segcompaction_fault_injection.groovy @@ -65,9 +65,6 @@ suite("test_segcompaction_correctness", "nonConcurrent,p2") { "AWS_REGION" = "$region", "provider" = "${getS3Provider()}" ) - properties( - "use_new_load_scan_node" = "true" - ) """ def max_try_milli_secs = 3600000 diff --git a/regression-test/suites/fault_injection_p0/test_too_many_segments_fault_injection.groovy b/regression-test/suites/fault_injection_p0/test_too_many_segments_fault_injection.groovy index cd36bb7d18525f..c9015b77c7f21d 100644 --- a/regression-test/suites/fault_injection_p0/test_too_many_segments_fault_injection.groovy +++ b/regression-test/suites/fault_injection_p0/test_too_many_segments_fault_injection.groovy @@ -65,9 +65,6 @@ suite("test_too_many_segments", "nonConcurrent,p2") { // the epic -238 case "AWS_REGION" = "$region", "provider" = "${getS3Provider()}" ) - properties( - "use_new_load_scan_node" = "true" - ) """ Thread.sleep(2000) diff --git a/regression-test/suites/load_p0/broker_load/test_csv_with_enclose_and_escapeS3_load.groovy b/regression-test/suites/load_p0/broker_load/test_csv_with_enclose_and_escapeS3_load.groovy index 291f623a512eac..5991a62bb79912 100644 --- a/regression-test/suites/load_p0/broker_load/test_csv_with_enclose_and_escapeS3_load.groovy +++ b/regression-test/suites/load_p0/broker_load/test_csv_with_enclose_and_escapeS3_load.groovy @@ -161,7 +161,6 @@ class LoadAttributes { this.isExceptFailed = isExceptFailed properties = new HashMap<>() - properties.put("use_new_load_scan_node", "true") } LoadAttributes addProperties(String k, String v) { diff --git a/regression-test/suites/load_p0/broker_load/test_etl_failed.groovy b/regression-test/suites/load_p0/broker_load/test_etl_failed.groovy index 70d2a42166dac0..b09f3d83b4b610 100644 --- a/regression-test/suites/load_p0/broker_load/test_etl_failed.groovy +++ b/regression-test/suites/load_p0/broker_load/test_etl_failed.groovy @@ -52,10 +52,6 @@ suite("test_etl_failed", "load_p0") { "AWS_REGION" = "${s3Region}", "provider" = "${getS3Provider()}" ) - PROPERTIES( - "use_new_load_scan_node" = "true", - "max_filter_ratio" = "0.1" - ); """ def max_try_milli_secs = 600000 diff --git a/regression-test/suites/load_p0/broker_load/test_multi_table_load.groovy b/regression-test/suites/load_p0/broker_load/test_multi_table_load.groovy index d9dc1da355d6f5..d5e120493672e8 100644 --- a/regression-test/suites/load_p0/broker_load/test_multi_table_load.groovy +++ b/regression-test/suites/load_p0/broker_load/test_multi_table_load.groovy @@ -137,7 +137,6 @@ suite("test_multi_table_load", "load_p0") { "provider" = "${getS3Provider()}" ) properties( - "use_new_load_scan_node" = "true", "max_filter_ratio" = "1.0" ) """ @@ -186,7 +185,6 @@ suite("test_multi_table_load", "load_p0") { "provider" = "${getS3Provider()}" ) properties( - "use_new_load_scan_node" = "true", "max_filter_ratio" = "1.0" ) """ diff --git a/regression-test/suites/load_p0/broker_load/test_seq_load.groovy b/regression-test/suites/load_p0/broker_load/test_seq_load.groovy index da91277b3fa0bf..9929482c878f6d 100644 --- a/regression-test/suites/load_p0/broker_load/test_seq_load.groovy +++ b/regression-test/suites/load_p0/broker_load/test_seq_load.groovy @@ -103,9 +103,6 @@ suite("test_seq_load", "load_p0") { "AWS_ENDPOINT" = "${getS3Endpoint()}", "AWS_REGION" = "${getS3Region()}" ) - properties( - "use_new_load_scan_node" = "true" - ) """ logger.info("submit sql: ${sql_str}"); sql """${sql_str}""" @@ -132,4 +129,4 @@ suite("test_seq_load", "load_p0") { } qt_sql """ SELECT COUNT(*) FROM ${tableName} """ -} \ No newline at end of file +} diff --git a/regression-test/suites/load_p2/broker_load/test_broker_load.groovy b/regression-test/suites/load_p2/broker_load/test_broker_load.groovy index f8a0043842c094..9ec4f7dcfde79f 100644 --- a/regression-test/suites/load_p2/broker_load/test_broker_load.groovy +++ b/regression-test/suites/load_p2/broker_load/test_broker_load.groovy @@ -411,9 +411,6 @@ suite("test_broker_load_p2", "p2") { "AWS_REGION" = "${s3Region}", "provider" = "${getS3Provider()}" ) - properties( - "use_new_load_scan_node" = "true" - ) """ logger.info("submit sql: ${sql_str}"); sql """${sql_str}""" diff --git a/regression-test/suites/load_p2/broker_load/test_s3_load_properties.groovy b/regression-test/suites/load_p2/broker_load/test_s3_load_properties.groovy index 59ad8e67dfff11..9d73256d38ccd2 100644 --- a/regression-test/suites/load_p2/broker_load/test_s3_load_properties.groovy +++ b/regression-test/suites/load_p2/broker_load/test_s3_load_properties.groovy @@ -621,7 +621,6 @@ class LoadAttributes { this.isExceptFailed = isExceptFailed properties = new HashMap<>() - properties.put("use_new_load_scan_node", "true") } LoadAttributes addProperties(String k, String v) { diff --git a/regression-test/suites/load_p2/broker_load/test_s3_load_with_load_parallelism.groovy b/regression-test/suites/load_p2/broker_load/test_s3_load_with_load_parallelism.groovy index e81e7ab9b21ad8..d37a674ef1a2d4 100644 --- a/regression-test/suites/load_p2/broker_load/test_s3_load_with_load_parallelism.groovy +++ b/regression-test/suites/load_p2/broker_load/test_s3_load_with_load_parallelism.groovy @@ -164,7 +164,6 @@ class LoadAttributes { this.isExceptFailed = isExceptFailed properties = new HashMap<>() - properties.put("use_new_load_scan_node", "true") } LoadAttributes addProperties(String k, String v) { diff --git a/regression-test/suites/query_profile/s3_load_profile_test.groovy b/regression-test/suites/query_profile/s3_load_profile_test.groovy index 686e357d4e1395..b0b1c357beb487 100644 --- a/regression-test/suites/query_profile/s3_load_profile_test.groovy +++ b/regression-test/suites/query_profile/s3_load_profile_test.groovy @@ -218,7 +218,6 @@ class LoadAttributes { this.isExceptFailed = isExceptFailed properties = new HashMap<>() - properties.put("use_new_load_scan_node", "true") } LoadAttributes addProperties(String k, String v) { diff --git a/regression-test/suites/segcompaction_p2/test_segcompaction_agg_keys.groovy b/regression-test/suites/segcompaction_p2/test_segcompaction_agg_keys.groovy index 11b94bc90ee7d5..3c09af9c542039 100644 --- a/regression-test/suites/segcompaction_p2/test_segcompaction_agg_keys.groovy +++ b/regression-test/suites/segcompaction_p2/test_segcompaction_agg_keys.groovy @@ -66,9 +66,6 @@ suite("test_segcompaction_agg_keys") { "AWS_REGION" = "$region", "provider" = "${getS3Provider()}" ) - properties( - "use_new_load_scan_node" = "true" - ) """ def max_try_milli_secs = 3600000 diff --git a/regression-test/suites/segcompaction_p2/test_segcompaction_agg_keys_index.groovy b/regression-test/suites/segcompaction_p2/test_segcompaction_agg_keys_index.groovy index a30b53670d89e5..7a38d52772ba8d 100644 --- a/regression-test/suites/segcompaction_p2/test_segcompaction_agg_keys_index.groovy +++ b/regression-test/suites/segcompaction_p2/test_segcompaction_agg_keys_index.groovy @@ -69,9 +69,6 @@ suite("test_segcompaction_agg_keys_index") { "AWS_REGION" = "$region", "provider" = "${getS3Provider()}" ) - properties( - "use_new_load_scan_node" = "true" - ) """ def max_try_milli_secs = 3600000 diff --git a/regression-test/suites/segcompaction_p2/test_segcompaction_dup_keys.groovy b/regression-test/suites/segcompaction_p2/test_segcompaction_dup_keys.groovy index 910a650ab31233..bbac3e22cf9b2e 100644 --- a/regression-test/suites/segcompaction_p2/test_segcompaction_dup_keys.groovy +++ b/regression-test/suites/segcompaction_p2/test_segcompaction_dup_keys.groovy @@ -66,9 +66,6 @@ suite("test_segcompaction_dup_keys") { "AWS_REGION" = "$region", "provider" = "${getS3Provider()}" ) - properties( - "use_new_load_scan_node" = "true" - ) """ def max_try_milli_secs = 3600000 diff --git a/regression-test/suites/segcompaction_p2/test_segcompaction_dup_keys_index.groovy b/regression-test/suites/segcompaction_p2/test_segcompaction_dup_keys_index.groovy index 958fb590c12ee0..f100f7a3f1a5a3 100644 --- a/regression-test/suites/segcompaction_p2/test_segcompaction_dup_keys_index.groovy +++ b/regression-test/suites/segcompaction_p2/test_segcompaction_dup_keys_index.groovy @@ -69,9 +69,6 @@ suite("test_segcompaction_dup_keys_index") { "AWS_REGION" = "$region", "provider" = "${getS3Provider()}" ) - properties( - "use_new_load_scan_node" = "true" - ) """ def max_try_milli_secs = 3600000 diff --git a/regression-test/suites/segcompaction_p2/test_segcompaction_unique_keys.groovy b/regression-test/suites/segcompaction_p2/test_segcompaction_unique_keys.groovy index c4c3c123e8d96c..cb0013f9e2d266 100644 --- a/regression-test/suites/segcompaction_p2/test_segcompaction_unique_keys.groovy +++ b/regression-test/suites/segcompaction_p2/test_segcompaction_unique_keys.groovy @@ -66,9 +66,6 @@ suite("test_segcompaction_unique_keys") { "AWS_REGION" = "$region", "provider" = "${getS3Provider()}" ) - properties( - "use_new_load_scan_node" = "true" - ) """ def max_try_milli_secs = 3600000 diff --git a/regression-test/suites/segcompaction_p2/test_segcompaction_unique_keys_mow.groovy b/regression-test/suites/segcompaction_p2/test_segcompaction_unique_keys_mow.groovy index 946bfee3168808..cc7a40c20aca91 100644 --- a/regression-test/suites/segcompaction_p2/test_segcompaction_unique_keys_mow.groovy +++ b/regression-test/suites/segcompaction_p2/test_segcompaction_unique_keys_mow.groovy @@ -70,9 +70,6 @@ suite("test_segcompaction_unique_keys_mow") { "AWS_REGION" = "$region", "provider" = "${getS3Provider()}" ) - properties( - "use_new_load_scan_node" = "true" - ) """ def max_try_milli_secs = 3600000 diff --git a/regression-test/suites/segcompaction_p2/test_segcompaction_unique_keys_mow_index.groovy b/regression-test/suites/segcompaction_p2/test_segcompaction_unique_keys_mow_index.groovy index ae7fa357bd40ad..6ad9f659dd61b1 100644 --- a/regression-test/suites/segcompaction_p2/test_segcompaction_unique_keys_mow_index.groovy +++ b/regression-test/suites/segcompaction_p2/test_segcompaction_unique_keys_mow_index.groovy @@ -74,9 +74,6 @@ suite("test_segcompaction_unique_keys_mow_index") { "AWS_REGION" = "$region", "provider" = "${getS3Provider()}" ) - properties( - "use_new_load_scan_node" = "true" - ) """ def max_try_milli_secs = 3600000 From d87c8cc24b4d5ddfa23ecb7809685c7e2468c97c Mon Sep 17 00:00:00 2001 From: bobhan1 Date: Tue, 19 Nov 2024 14:20:00 +0800 Subject: [PATCH 19/63] [test](flexible partial update) Add upgrade/downgrade case for flexible partial update (#42420) --- .../flexible/downgrade/test.out | 93 ++++++++++++++ .../flexible/downgrade/test1.json | 8 ++ .../flexible/upgrade/test.out | 117 ++++++++++++++++++ .../flexible/upgrade/test1.json | 8 ++ .../flexible/downgrade/load.groovy | 65 ++++++++++ .../flexible/downgrade/test.groovy | 40 ++++++ .../flexible/upgrade/load.groovy | 55 ++++++++ .../flexible/upgrade/test.groovy | 54 ++++++++ 8 files changed, 440 insertions(+) create mode 100644 regression-test/data/unique_with_mow_p0/flexible/downgrade/test.out create mode 100644 regression-test/data/unique_with_mow_p0/flexible/downgrade/test1.json create mode 100644 regression-test/data/unique_with_mow_p0/flexible/upgrade/test.out create mode 100644 regression-test/data/unique_with_mow_p0/flexible/upgrade/test1.json create mode 100644 regression-test/suites/unique_with_mow_p0/flexible/downgrade/load.groovy create mode 100644 regression-test/suites/unique_with_mow_p0/flexible/downgrade/test.groovy create mode 100644 regression-test/suites/unique_with_mow_p0/flexible/upgrade/load.groovy create mode 100644 regression-test/suites/unique_with_mow_p0/flexible/upgrade/test.groovy diff --git a/regression-test/data/unique_with_mow_p0/flexible/downgrade/test.out b/regression-test/data/unique_with_mow_p0/flexible/downgrade/test.out new file mode 100644 index 00000000000000..79d25e505aeda6 --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/flexible/downgrade/test.out @@ -0,0 +1,93 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +0 0 0 0 0 0 +1 10 111 111 1 1 +2 2 20 2 222 25 +3 3 3 30 3 3 +4 43 4 99 20 4 +5 5 5 5 5 \N +6 999 6 777 6 6 +7 7 7 7 7 7 +8 8 8 8 8 8 +9 9 9 9 9 9 + +-- !sql -- +0 0 0 0 0 0 +1 999 111 999 1 999 +2 888 20 888 222 888 +3 3 3 30 3 3 +4 43 4 99 20 4 +5 777 5 777 5 777 +6 999 6 777 6 6 +7 7 7 7 7 7 +8 8 8 8 8 8 +9 9 9 9 9 9 +20 555 9876 555 1234 555 + +-- !sql -- +0 0 0 0 0 0 +1 999 111 999 1 999 +2 888 20 888 222 888 +7 7 7 7 7 7 +8 8 8 8 8 8 +9 9 9 9 9 9 +20 555 9876 555 1234 555 + +-- !sql -- +0 0 0 0 0 0 +1 999 111 999 1 999 +2 888 20 888 222 888 +3 10 10 10 10 10 +4 12 12 12 12 12 +7 7 7 7 7 7 +8 8 8 8 8 8 +9 9 9 9 9 9 +20 555 9876 555 1234 555 +30 11 11 11 11 11 + +-- !sql -- +0 0 0 0 0 0 +1 10 111 111 1 1 +2 2 20 2 222 25 +3 3 3 30 3 3 +4 43 4 99 20 4 +5 5 5 5 5 \N +6 999 6 777 6 6 +7 7 7 7 7 7 +8 8 8 8 8 8 +9 9 9 9 9 9 + +-- !sql -- +0 0 0 0 0 0 +1 999 111 999 1 999 +2 888 20 888 222 888 +3 3 3 30 3 3 +4 43 4 99 20 4 +5 777 5 777 5 777 +6 999 6 777 6 6 +7 7 7 7 7 7 +8 8 8 8 8 8 +9 9 9 9 9 9 +20 555 9876 555 1234 555 + +-- !sql -- +0 0 0 0 0 0 +1 999 111 999 1 999 +2 888 20 888 222 888 +7 7 7 7 7 7 +8 8 8 8 8 8 +9 9 9 9 9 9 +20 555 9876 555 1234 555 + +-- !sql -- +0 0 0 0 0 0 +1 999 111 999 1 999 +2 888 20 888 222 888 +3 10 10 10 10 10 +4 12 12 12 12 12 +7 7 7 7 7 7 +8 8 8 8 8 8 +9 9 9 9 9 9 +20 555 9876 555 1234 555 +30 11 11 11 11 11 + diff --git a/regression-test/data/unique_with_mow_p0/flexible/downgrade/test1.json b/regression-test/data/unique_with_mow_p0/flexible/downgrade/test1.json new file mode 100644 index 00000000000000..b61fbb04364175 --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/flexible/downgrade/test1.json @@ -0,0 +1,8 @@ +{"k": 1, "v1": 10} +{"k": 2, "v2": 20, "v5": 25} +{"k": 3, "v3": 30} +{"k": 4, "v4": 20, "v1": 43, "v3": 99} +{"k": 5, "v5": null} +{"k": 6, "v1": 999, "v3": 777} +{"k": 2, "v4": 222} +{"k": 1, "v2": 111, "v3": 111} \ No newline at end of file diff --git a/regression-test/data/unique_with_mow_p0/flexible/upgrade/test.out b/regression-test/data/unique_with_mow_p0/flexible/upgrade/test.out new file mode 100644 index 00000000000000..e1ae6f512478f6 --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/flexible/upgrade/test.out @@ -0,0 +1,117 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +0 0 0 0 0 0 +1 1 1 1 1 1 +2 2 2 2 2 2 +3 3 3 3 3 3 +4 4 4 4 4 4 +5 5 5 5 5 5 +6 6 6 6 6 6 +7 7 7 7 7 7 +8 8 8 8 8 8 +9 9 9 9 9 9 + +-- !sql -- +0 0 0 0 0 0 +1 10 111 111 1 1 4,5,6 +2 2 20 2 222 25 1,3,6 +3 3 3 30 3 3 1,2,4,5,6 +4 43 4 99 20 4 2,5,6 +5 5 5 5 5 \N 1,2,3,4,6 +6 999 6 777 6 6 2,4,5,6 +7 7 7 7 7 7 +8 8 8 8 8 8 +9 9 9 9 9 9 + +-- !sql -- +0 0 0 0 0 0 +1 999 111 999 1 999 +2 888 20 888 222 888 +3 3 3 30 3 3 +4 43 4 99 20 4 +5 777 5 777 5 777 +6 999 6 777 6 6 +7 7 7 7 7 7 +8 8 8 8 8 8 +9 9 9 9 9 9 +20 555 9876 555 1234 555 + +-- !sql -- +0 0 0 0 0 0 +1 999 111 999 1 999 +2 888 20 888 222 888 +7 7 7 7 7 7 +8 8 8 8 8 8 +9 9 9 9 9 9 +20 555 9876 555 1234 555 + +-- !sql -- +0 0 0 0 0 0 +1 999 111 999 1 999 +2 888 20 888 222 888 +3 10 10 10 10 10 +4 12 12 12 12 12 +7 7 7 7 7 7 +8 8 8 8 8 8 +9 9 9 9 9 9 +20 555 9876 555 1234 555 +30 11 11 11 11 11 + +-- !sql -- +0 0 0 0 0 0 +1 1 1 1 1 1 +2 2 2 2 2 2 +3 3 3 3 3 3 +4 4 4 4 4 4 +5 5 5 5 5 5 +6 6 6 6 6 6 +7 7 7 7 7 7 +8 8 8 8 8 8 +9 9 9 9 9 9 + +-- !sql -- +0 0 0 0 0 0 +1 10 111 111 1 1 4,5,6 +2 2 20 2 222 25 1,3,6 +3 3 3 30 3 3 1,2,4,5,6 +4 43 4 99 20 4 2,5,6 +5 5 5 5 5 \N 1,2,3,4,6 +6 999 6 777 6 6 2,4,5,6 +7 7 7 7 7 7 +8 8 8 8 8 8 +9 9 9 9 9 9 + +-- !sql -- +0 0 0 0 0 0 +1 999 111 999 1 999 +2 888 20 888 222 888 +3 3 3 30 3 3 +4 43 4 99 20 4 +5 777 5 777 5 777 +6 999 6 777 6 6 +7 7 7 7 7 7 +8 8 8 8 8 8 +9 9 9 9 9 9 +20 555 9876 555 1234 555 + +-- !sql -- +0 0 0 0 0 0 +1 999 111 999 1 999 +2 888 20 888 222 888 +7 7 7 7 7 7 +8 8 8 8 8 8 +9 9 9 9 9 9 +20 555 9876 555 1234 555 + +-- !sql -- +0 0 0 0 0 0 +1 999 111 999 1 999 +2 888 20 888 222 888 +3 10 10 10 10 10 +4 12 12 12 12 12 +7 7 7 7 7 7 +8 8 8 8 8 8 +9 9 9 9 9 9 +20 555 9876 555 1234 555 +30 11 11 11 11 11 + diff --git a/regression-test/data/unique_with_mow_p0/flexible/upgrade/test1.json b/regression-test/data/unique_with_mow_p0/flexible/upgrade/test1.json new file mode 100644 index 00000000000000..b61fbb04364175 --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/flexible/upgrade/test1.json @@ -0,0 +1,8 @@ +{"k": 1, "v1": 10} +{"k": 2, "v2": 20, "v5": 25} +{"k": 3, "v3": 30} +{"k": 4, "v4": 20, "v1": 43, "v3": 99} +{"k": 5, "v5": null} +{"k": 6, "v1": 999, "v3": 777} +{"k": 2, "v4": 222} +{"k": 1, "v2": 111, "v3": 111} \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p0/flexible/downgrade/load.groovy b/regression-test/suites/unique_with_mow_p0/flexible/downgrade/load.groovy new file mode 100644 index 00000000000000..bae20d3c68e24b --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/flexible/downgrade/load.groovy @@ -0,0 +1,65 @@ +// 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_flexible_partial_update_downgrade_base_data', 'p0,restart_fe') { + String db = context.config.getDbNameByFile(context.file) + for (def use_row_store : [false, true]) { + logger.info("current params: use_row_store: ${use_row_store}") + def tableName = "test_f_downgrade_${use_row_store}" + + sql "use ${db};" + def tbls = sql "show tables;" + boolean shouldSkip = false + for (def tbl : tbls) { + if (tbl[0] == tableName) { + logger.info("skip to create table ${tableName};") + shouldSkip = true + break; + } + } + if (shouldSkip) { + continue + } + + sql """ DROP TABLE IF EXISTS ${tableName} """ + sql """ CREATE TABLE ${tableName} ( + `k` int(11) NULL, + `v1` BIGINT NULL, + `v2` BIGINT NULL DEFAULT "9876", + `v3` BIGINT NOT NULL, + `v4` BIGINT NOT NULL DEFAULT "1234", + `v5` BIGINT NULL + ) UNIQUE KEY(`k`) DISTRIBUTED BY HASH(`k`) BUCKETS 1 + PROPERTIES( + "replication_num" = "1", + "enable_unique_key_merge_on_write" = "true", + "light_schema_change" = "true", + "enable_unique_key_skip_bitmap_column" = "true", + "store_row_column" = "${use_row_store}"); """ + + sql """insert into ${tableName} select number, number, number, number, number, number from numbers("number" = "10"); """ + streamLoad { + table "${tableName}" + set 'format', 'json' + set 'read_json_by_line', 'true' + set 'strict_mode', 'false' + set 'unique_key_update_mode', 'UPDATE_FLEXIBLE_COLUMNS' + file "test1.json" + time 20000 + } + } +} \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p0/flexible/downgrade/test.groovy b/regression-test/suites/unique_with_mow_p0/flexible/downgrade/test.groovy new file mode 100644 index 00000000000000..059324a1943d49 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/flexible/downgrade/test.groovy @@ -0,0 +1,40 @@ +// 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_flexible_partial_update_downgrade', 'p0,restart_fe') { + String db = context.config.getDbNameByFile(context.file) + for (def use_row_store : [false, true]) { + logger.info("current params: use_row_store: ${use_row_store}") + def tableName = "test_f_downgrade_${use_row_store}" + qt_sql "select k,v1,v2,v3,v4,v5 from ${tableName} order by k;" + + sql "set enable_unique_key_partial_update=true;" + sql "set enable_insert_strict=false;" + sql "sync;" + sql "insert into ${tableName}(k,v1,v3,v5) values(1,999,999,999),(2,888,888,888),(5,777,777,777),(20,555,555,555);" + sql "set enable_unique_key_partial_update=false;" + sql "set enable_insert_strict=true;" + sql "sync;" + qt_sql "select k,v1,v2,v3,v4,v5 from ${tableName} order by k;" + + sql "delete from ${tableName} where k>=3 and k<=6;" + qt_sql "select k,v1,v2,v3,v4,v5 from ${tableName} order by k;" + + sql "insert into ${tableName} values(3,10,10,10,10,10),(30,11,11,11,11,11),(4,12,12,12,12,12);" + qt_sql "select k,v1,v2,v3,v4,v5 from ${tableName} order by k;" + } +} \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p0/flexible/upgrade/load.groovy b/regression-test/suites/unique_with_mow_p0/flexible/upgrade/load.groovy new file mode 100644 index 00000000000000..df2fa79f8cb947 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/flexible/upgrade/load.groovy @@ -0,0 +1,55 @@ +// 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_flexible_partial_update_upgrade_base_data', 'p0,restart_fe') { + String db = context.config.getDbNameByFile(context.file) + for (def use_row_store : [false, true]) { + logger.info("current params: use_row_store: ${use_row_store}") + def tableName = "test_f_upgrade_${use_row_store}" + + sql "use ${db};" + def tbls = sql "show tables;" + boolean shouldSkip = false + for (def tbl : tbls) { + if (tbl[0] == tableName) { + logger.info("skip to create table ${tableName};") + shouldSkip = true + break; + } + } + if (shouldSkip) { + continue + } + + sql """ DROP TABLE IF EXISTS ${tableName} """ + sql """ CREATE TABLE ${tableName} ( + `k` int(11) NULL, + `v1` BIGINT NULL, + `v2` BIGINT NULL DEFAULT "9876", + `v3` BIGINT NOT NULL, + `v4` BIGINT NOT NULL DEFAULT "1234", + `v5` BIGINT NULL + ) UNIQUE KEY(`k`) DISTRIBUTED BY HASH(`k`) BUCKETS 1 + PROPERTIES( + "replication_num" = "1", + "enable_unique_key_merge_on_write" = "true", + "light_schema_change" = "true", + "store_row_column" = "${use_row_store}"); """ + + sql """insert into ${tableName} select number, number, number, number, number, number from numbers("number" = "10"); """ + } +} \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p0/flexible/upgrade/test.groovy b/regression-test/suites/unique_with_mow_p0/flexible/upgrade/test.groovy new file mode 100644 index 00000000000000..91fa2267032ea1 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/flexible/upgrade/test.groovy @@ -0,0 +1,54 @@ +// 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_flexible_partial_update_upgrade', 'p0,restart_fe') { + + for (def use_row_store : [false, true]) { + logger.info("current params: use_row_store: ${use_row_store}") + def tableName = "test_f_upgrade_${use_row_store}" + sql """alter table ${tableName} enable feature "UPDATE_FLEXIBLE_COLUMNS"; """ + show_res = sql "show create table ${tableName}" + assertTrue(show_res.toString().contains('"enable_unique_key_skip_bitmap_column" = "true"')) + qt_sql "select k,v1,v2,v3,v4,v5 from ${tableName} order by k;" + + streamLoad { + table "${tableName}" + set 'format', 'json' + set 'read_json_by_line', 'true' + set 'strict_mode', 'false' + set 'unique_key_update_mode', 'UPDATE_FLEXIBLE_COLUMNS' + file "test1.json" + time 20000 + } + qt_sql "select k,v1,v2,v3,v4,v5,BITMAP_TO_STRING(__DORIS_SKIP_BITMAP_COL__) from ${tableName} order by k;" + + sql "set enable_unique_key_partial_update=true;" + sql "set enable_insert_strict=false;" + sql "sync;" + sql "insert into ${tableName}(k,v1,v3,v5) values(1,999,999,999),(2,888,888,888),(5,777,777,777),(20,555,555,555);" + sql "set enable_unique_key_partial_update=false;" + sql "set enable_insert_strict=true;" + sql "sync;" + qt_sql "select k,v1,v2,v3,v4,v5 from ${tableName} order by k;" + + sql "delete from ${tableName} where k>=3 and k<=6;" + qt_sql "select k,v1,v2,v3,v4,v5 from ${tableName} order by k;" + + sql "insert into ${tableName} values(3,10,10,10,10,10),(30,11,11,11,11,11),(4,12,12,12,12,12);" + qt_sql "select k,v1,v2,v3,v4,v5 from ${tableName} order by k;" + } +} \ No newline at end of file From def0bc24d475b742bc52bc073643aaa9514d3d8d Mon Sep 17 00:00:00 2001 From: "Mingyu Chen (Rayner)" Date: Tue, 19 Nov 2024 14:38:30 +0800 Subject: [PATCH 20/63] [fix](s3) do not replace https scheme if specified (#44242) ### What problem does this PR solve? Problem Summary: When creating s3 resource with endpoint, it user already specify `https://` schema in endpoint url, we should not replace it with `http://`. ### Release note [fix](s3) fix bug that s3 resource do not support `https://` --- .../org/apache/doris/catalog/S3Resource.java | 2 +- .../org/apache/doris/catalog/S3ResourceTest.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/S3Resource.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/S3Resource.java index e1cde40c4ad40f..a40e91f47d46d5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/S3Resource.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/S3Resource.java @@ -95,7 +95,7 @@ protected void setProperties(Map properties) throws DdlException // the endpoint for ping need add uri scheme. String pingEndpoint = properties.get(S3Properties.ENDPOINT); - if (!pingEndpoint.startsWith("http://")) { + if (!pingEndpoint.startsWith("http://") && !pingEndpoint.startsWith("https://")) { pingEndpoint = "http://" + properties.get(S3Properties.ENDPOINT); properties.put(S3Properties.ENDPOINT, pingEndpoint); properties.put(S3Properties.Env.ENDPOINT, pingEndpoint); diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/S3ResourceTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/S3ResourceTest.java index 720e2690c05fa4..4e620d569031f5 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/catalog/S3ResourceTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/S3ResourceTest.java @@ -222,4 +222,20 @@ public void testModifyProperties() throws Exception { modify.put("s3.access_key", "aaa"); s3Resource.modifyProperties(modify); } + + @Test + public void testHttpScheme() throws DdlException { + // if https:// is set, it should be replaced with http:// + Map properties = new HashMap<>(); + properties.put("AWS_ENDPOINT", "https://aaa"); + properties.put("AWS_REGION", "bbb"); + properties.put("AWS_ROOT_PATH", "/path/to/root"); + properties.put("AWS_ACCESS_KEY", "xxx"); + properties.put("AWS_SECRET_KEY", "yyy"); + properties.put("AWS_BUCKET", "test-bucket"); + properties.put("s3_validity_check", "false"); + S3Resource s3Resource = new S3Resource("s3_2"); + s3Resource.setProperties(properties); + Assert.assertEquals(s3Resource.getProperty(S3Properties.ENDPOINT), "https://aaa"); + } } From 689509f5f1420b303a7ffc2e91b07266712d11bb Mon Sep 17 00:00:00 2001 From: Yongqiang YANG Date: Tue, 19 Nov 2024 15:18:20 +0800 Subject: [PATCH 21/63] [fix](test) logging result of show tablet to investigate problem (#44224) --- regression-test/suites/show_p0/test_show_tablet.groovy | 2 ++ 1 file changed, 2 insertions(+) diff --git a/regression-test/suites/show_p0/test_show_tablet.groovy b/regression-test/suites/show_p0/test_show_tablet.groovy index 99a1e191369c56..59e7c1a8e4da2f 100644 --- a/regression-test/suites/show_p0/test_show_tablet.groovy +++ b/regression-test/suites/show_p0/test_show_tablet.groovy @@ -26,6 +26,8 @@ suite("test_show_tablet") { "replication_num" = "1" );""" def res = sql """SHOW TABLETS FROM show_tablets_test_t limit 5, 1;""" + + logger.info("result: " + res.toString()); assertTrue(res.size() == 0) res = sql """SHOW TABLETS FROM show_tablets_test_t limit 3, 5;""" From 1a7ca97e9f8d652d885fdf943956ce351a94699c Mon Sep 17 00:00:00 2001 From: Siyang Tang Date: Tue, 19 Nov 2024 15:26:33 +0800 Subject: [PATCH 22/63] [enhancement](cloud-schema-change) Rowset [0-1] should not engage in delete bitmap calculation during MOW SC (#44171) Rowset [0-1] should not engage in delete bitmap calculation during schema change for MOW. Rowset [0-1] is not included in ouput rowset. When BE restart, building deletebitmap will fail due to rowset not found. --- be/src/cloud/cloud_schema_change_job.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/be/src/cloud/cloud_schema_change_job.cpp b/be/src/cloud/cloud_schema_change_job.cpp index 896804578d7db9..0bab742c3ad6e5 100644 --- a/be/src/cloud/cloud_schema_change_job.cpp +++ b/be/src/cloud/cloud_schema_change_job.cpp @@ -363,7 +363,8 @@ Status CloudSchemaChangeJob::_convert_historical_rowsets(const SchemaChangeParam // If there are historical versions of rowsets, we need to recalculate their delete // bitmaps, otherwise we will miss the delete bitmaps of incremental rowsets int64_t start_calc_delete_bitmap_version = - already_exist_any_version ? 0 : sc_job->alter_version() + 1; + // [0-1] is a placeholder rowset, start from 2. + already_exist_any_version ? 2 : sc_job->alter_version() + 1; RETURN_IF_ERROR(_process_delete_bitmap(sc_job->alter_version(), start_calc_delete_bitmap_version, initiator)); sc_job->set_delete_bitmap_lock_initiator(initiator); From 7aec6ffb6aef6b41f345cfeaf5fbdd78d19bc5b9 Mon Sep 17 00:00:00 2001 From: seawinde Date: Tue, 19 Nov 2024 16:13:40 +0800 Subject: [PATCH 23/63] [fix](mtmv) Fix get mv read lock too late when rewritten by materialized view (#44164) Problem Summary: When materialized view is rewritten, it would use the mv metadata. Should try to get read lock before use these metadata. or it would cause error. Such as mv def is as following CREATE MATERIALIZED VIEW mv1 BUILD IMMEDIATE REFRESH COMPLETE ON MANUAL DISTRIBUTED BY RANDOM BUCKETS 2 PROPERTIES ('replication_num' = '1') AS select o_orderdate, o_shippriority, o_comment, o.o_code as o_o_code, l_orderkey, l_partkey, l.o_code as l_o_code from orders_same_col o left join lineitem_same_col l on l_orderkey = o_orderkey left join partsupp on ps_partkey = l_partkey and l_suppkey = ps_suppkey; When handling transparent rewriting, a MV scan plan is used for the transparent rewrite. During the initialization of the scan plan, the partitions of the table are retrieved, so it is necessary to attempt to acquire a read lock on the table during initialization. If the read lock is not acquired, subsequent operations may add or delete partitions, and in the later processing of table partitions, calling get Partition may not retrieve the corresponding partition, leading to data errors. --- .../mv/AbstractMaterializedViewRule.java | 12 ++--- .../mv/AsyncMaterializationContext.java | 14 ++++-- .../mv/MaterializationContext.java | 48 +++++++++--------- .../mv/SyncMaterializationContext.java | 25 ++++++---- .../doris/nereids/mv/IdStatisticsMapTest.java | 2 +- .../mv/join/left_outer/outer_join.out | 46 +++++++++++++++++ .../mv/join/left_outer/outer_join.groovy | 49 +++++++++++++++++++ 7 files changed, 150 insertions(+), 46 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/AbstractMaterializedViewRule.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/AbstractMaterializedViewRule.java index 60b5c58d4c50df..8e9ef1eaa97b7a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/AbstractMaterializedViewRule.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/AbstractMaterializedViewRule.java @@ -234,7 +234,7 @@ protected List doRewrite(StructInfo queryStructInfo, CascadesContext casca continue; } Plan rewrittenPlan; - Plan mvScan = materializationContext.getScanPlan(queryStructInfo); + Plan mvScan = materializationContext.getScanPlan(queryStructInfo, cascadesContext); Plan queryPlan = queryStructInfo.getTopPlan(); if (compensatePredicates.isAlwaysTrue()) { rewrittenPlan = mvScan; @@ -262,12 +262,6 @@ protected List doRewrite(StructInfo queryStructInfo, CascadesContext casca // Rewrite query by view rewrittenPlan = rewriteQueryByView(matchMode, queryStructInfo, viewStructInfo, viewToQuerySlotMapping, rewrittenPlan, materializationContext, cascadesContext); - // If rewrite successfully, try to get mv read lock to avoid data inconsistent, - // try to get lock which should added before RBO - if (materializationContext instanceof AsyncMaterializationContext && !materializationContext.isSuccess()) { - cascadesContext.getStatementContext() - .addTableReadLock(((AsyncMaterializationContext) materializationContext).getMtmv()); - } rewrittenPlan = MaterializedViewUtils.rewriteByRules(cascadesContext, childContext -> { Rewriter.getWholeTreeRewriter(childContext).execute(); @@ -379,9 +373,9 @@ protected List doRewrite(StructInfo queryStructInfo, CascadesContext casca } trySetStatistics(materializationContext, cascadesContext); rewriteResults.add(rewrittenPlan); - // if rewrite successfully, try to regenerate mv scan because it maybe used again - materializationContext.tryReGenerateScanPlan(cascadesContext); recordIfRewritten(queryStructInfo.getOriginalPlan(), materializationContext, cascadesContext); + // If rewrite successfully, try to clear mv scan currently because it maybe used again + materializationContext.clearScanPlan(cascadesContext); } return rewriteResults; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/AsyncMaterializationContext.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/AsyncMaterializationContext.java index 0d88672fed64de..96d37ad546a7b4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/AsyncMaterializationContext.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/AsyncMaterializationContext.java @@ -57,9 +57,7 @@ public class AsyncMaterializationContext extends MaterializationContext { */ public AsyncMaterializationContext(MTMV mtmv, Plan mvPlan, Plan mvOriginalPlan, List baseTables, List
baseViews, CascadesContext cascadesContext, StructInfo structInfo) { - super(mvPlan, mvOriginalPlan, MaterializedViewUtils.generateMvScanPlan(mtmv, mtmv.getBaseIndexId(), - mtmv.getPartitionIds(), PreAggStatus.on(), cascadesContext), - cascadesContext, structInfo); + super(mvPlan, mvOriginalPlan, cascadesContext, structInfo); this.mtmv = mtmv; } @@ -110,7 +108,7 @@ public Optional> getPlanStatistics(CascadesContext cascades return Optional.empty(); } RelationId relationId = null; - Optional logicalOlapScan = this.getScanPlan(null) + Optional logicalOlapScan = this.getScanPlan(null, cascadesContext) .collectFirst(LogicalOlapScan.class::isInstance); if (logicalOlapScan.isPresent()) { relationId = logicalOlapScan.get().getRelationId(); @@ -132,7 +130,13 @@ boolean isFinalChosen(Relation relation) { } @Override - public Plan getScanPlan(StructInfo queryInfo) { + public Plan getScanPlan(StructInfo queryInfo, CascadesContext cascadesContext) { + // If try to get scan plan or rewrite successfully, try to get mv read lock to avoid meta data inconsistent, + // try to get lock which should added before RBO + if (!this.isSuccess()) { + cascadesContext.getStatementContext().addTableReadLock(this.getMtmv()); + } + super.getScanPlan(queryInfo, cascadesContext); return scanPlan; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializationContext.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializationContext.java index df535d59d87399..38eba2ac3406ff 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializationContext.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializationContext.java @@ -105,22 +105,13 @@ public abstract class MaterializationContext { /** * MaterializationContext, this contains necessary info for query rewriting by materialization */ - public MaterializationContext(Plan plan, Plan originalPlan, Plan scanPlan, + public MaterializationContext(Plan plan, Plan originalPlan, CascadesContext cascadesContext, StructInfo structInfo) { this.plan = plan; this.originalPlan = originalPlan; - this.scanPlan = scanPlan; - StatementBase parsedStatement = cascadesContext.getStatementContext().getParsedStatement(); this.enableRecordFailureDetail = parsedStatement != null && parsedStatement.isExplain() && ExplainLevel.MEMO_PLAN == parsedStatement.getExplainOptions().getExplainLevel(); - List originalPlanOutput = originalPlan.getOutput(); - List scanPlanOutput = this.scanPlan.getOutput(); - if (originalPlanOutput.size() == scanPlanOutput.size()) { - for (int slotIndex = 0; slotIndex < originalPlanOutput.size(); slotIndex++) { - this.exprToScanExprMapping.put(originalPlanOutput.get(slotIndex), scanPlanOutput.get(slotIndex)); - } - } // Construct materialization struct info, catch exception which may cause planner roll back this.structInfo = structInfo == null ? constructStructInfo(plan, originalPlan, cascadesContext, new BitSet()).orElseGet(() -> null) @@ -128,10 +119,6 @@ public MaterializationContext(Plan plan, Plan originalPlan, Plan scanPlan, this.available = this.structInfo != null; if (available) { this.planOutputShuttledExpressions = this.structInfo.getPlanOutputShuttledExpressions(); - // materialization output expression shuttle, this will be used to expression rewrite - this.shuttledExprToScanExprMapping = ExpressionMapping.generate( - this.planOutputShuttledExpressions, - scanPlanOutput); } } @@ -176,17 +163,19 @@ public void addMatchedGroup(GroupId groupId, boolean rewriteSuccess) { * if MaterializationContext is already rewritten successfully, then should generate new scan plan in later * query rewrite, because one plan may hit the materialized view repeatedly and the materialization scan output * should be different. - * This method should be called when query rewrite successfully */ - public void tryReGenerateScanPlan(CascadesContext cascadesContext) { + public void tryGenerateScanPlan(CascadesContext cascadesContext) { + if (!this.isAvailable()) { + return; + } this.scanPlan = doGenerateScanPlan(cascadesContext); - // materialization output expression shuttle, this will be used to expression rewrite - this.shuttledExprToScanExprMapping = ExpressionMapping.generate( - this.planOutputShuttledExpressions, - this.scanPlan.getOutput()); + // Materialization output expression shuttle, this will be used to expression rewrite + List scanPlanOutput = this.scanPlan.getOutput(); + this.shuttledExprToScanExprMapping = ExpressionMapping.generate(this.planOutputShuttledExpressions, + scanPlanOutput); + // This is used by normalize statistics column expression Map regeneratedMapping = new HashMap<>(); List originalPlanOutput = originalPlan.getOutput(); - List scanPlanOutput = this.scanPlan.getOutput(); if (originalPlanOutput.size() == scanPlanOutput.size()) { for (int slotIndex = 0; slotIndex < originalPlanOutput.size(); slotIndex++) { regeneratedMapping.put(originalPlanOutput.get(slotIndex), scanPlanOutput.get(slotIndex)); @@ -195,6 +184,17 @@ public void tryReGenerateScanPlan(CascadesContext cascadesContext) { this.exprToScanExprMapping = regeneratedMapping; } + /** + * Should clear scan plan after materializationContext is already rewritten successfully, + * Because one plan may hit the materialized view repeatedly and the materialization scan output + * should be different. + */ + public void clearScanPlan(CascadesContext cascadesContext) { + this.scanPlan = null; + this.shuttledExprToScanExprMapping = null; + this.exprToScanExprMapping = null; + } + public void addSlotMappingToCache(RelationMapping relationMapping, SlotMapping slotMapping) { queryToMaterializationSlotMappingCache.put(relationMapping, slotMapping); } @@ -275,7 +275,11 @@ public Plan getOriginalPlan() { return originalPlan; } - public Plan getScanPlan(StructInfo queryStructInfo) { + public Plan getScanPlan(StructInfo queryStructInfo, CascadesContext cascadesContext) { + if (this.scanPlan == null || this.shuttledExprToScanExprMapping == null + || this.exprToScanExprMapping == null) { + tryGenerateScanPlan(cascadesContext); + } return scanPlan; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/SyncMaterializationContext.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/SyncMaterializationContext.java index 47b01385ac1646..e27b3d5174391f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/SyncMaterializationContext.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/SyncMaterializationContext.java @@ -25,6 +25,7 @@ import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.PreAggStatus; import org.apache.doris.nereids.trees.plans.RelationId; +import org.apache.doris.nereids.trees.plans.algebra.CatalogRelation; import org.apache.doris.nereids.trees.plans.algebra.Relation; import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan; import org.apache.doris.nereids.trees.plans.physical.PhysicalOlapScan; @@ -55,9 +56,7 @@ public class SyncMaterializationContext extends MaterializationContext { */ public SyncMaterializationContext(Plan mvPlan, Plan mvOriginalPlan, OlapTable olapTable, long indexId, String indexName, CascadesContext cascadesContext, Statistics statistics) { - super(mvPlan, mvOriginalPlan, - MaterializedViewUtils.generateMvScanPlan(olapTable, indexId, olapTable.getPartitionIds(), - PreAggStatus.unset(), cascadesContext), cascadesContext, null); + super(mvPlan, mvOriginalPlan, cascadesContext, null); this.olapTable = olapTable; this.indexId = indexId; this.indexName = indexName; @@ -100,7 +99,7 @@ String getStringInfo() { @Override Optional> getPlanStatistics(CascadesContext cascadesContext) { RelationId relationId = null; - Optional scanObj = this.getScanPlan(null) + Optional scanObj = this.getScanPlan(null, cascadesContext) .collectFirst(LogicalOlapScan.class::isInstance); if (scanObj.isPresent()) { relationId = scanObj.get().getRelationId(); @@ -109,19 +108,27 @@ Optional> getPlanStatistics(CascadesContext cascadesContext } @Override - public Plan getScanPlan(StructInfo queryStructInfo) { + public Plan getScanPlan(StructInfo queryStructInfo, CascadesContext cascadesContext) { + // Already get lock if sync mv, doesn't need to get lock + super.getScanPlan(queryStructInfo, cascadesContext); if (queryStructInfo == null) { return scanPlan; } - if (queryStructInfo.getRelations().size() == 1 - && queryStructInfo.getRelations().get(0) instanceof LogicalOlapScan - && !((LogicalOlapScan) queryStructInfo.getRelations().get(0)).getSelectedPartitionIds().isEmpty()) { + List queryStructInfoRelations = queryStructInfo.getRelations(); + if (queryStructInfoRelations.size() == 1 + && queryStructInfoRelations.get(0) instanceof LogicalOlapScan + && !((LogicalOlapScan) queryStructInfoRelations.get(0)).getSelectedPartitionIds().isEmpty()) { // Partition prune if sync materialized view return scanPlan.accept(new DefaultPlanRewriter() { @Override public Plan visitLogicalOlapScan(LogicalOlapScan olapScan, Void context) { + if (!queryStructInfoRelations.get(0).getTable().getFullQualifiers().equals( + olapScan.getTable().getFullQualifiers())) { + // Only the same table, we can do partition prue + return olapScan; + } return olapScan.withSelectedPartitionIds( - ((LogicalOlapScan) queryStructInfo.getRelations().get(0)).getSelectedPartitionIds()); + ((LogicalOlapScan) queryStructInfoRelations.get(0)).getSelectedPartitionIds()); } }, null); } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/mv/IdStatisticsMapTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/mv/IdStatisticsMapTest.java index a4c05fa81e6d0c..0090982db00898 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/mv/IdStatisticsMapTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/mv/IdStatisticsMapTest.java @@ -76,7 +76,7 @@ public boolean isMVPartitionValid(MTMV mtmv, ConnectContext ctx, boolean isMVPar .rewrite(); // scan plan output will be refreshed after mv rewrite successfully, so need tmp store Set materializationScanOutput = c1.getMaterializationContexts().get(0) - .getScanPlan(null).getOutputSet(); + .getScanPlan(null, c1).getOutputSet(); tmpPlanChecker .optimize() .printlnBestPlanTree(); diff --git a/regression-test/data/nereids_rules_p0/mv/join/left_outer/outer_join.out b/regression-test/data/nereids_rules_p0/mv/join/left_outer/outer_join.out index 1a1b846054bbce..b8e78048d8e9ff 100644 --- a/regression-test/data/nereids_rules_p0/mv/join/left_outer/outer_join.out +++ b/regression-test/data/nereids_rules_p0/mv/join/left_outer/outer_join.out @@ -373,3 +373,49 @@ 2023-12-12 2 mi 108 2 2023-12-12 2 mi 108 2 +-- !query12_0_before -- +2023-12-09 1 yy 95 4 +2023-12-09 1 yy 95 4 +2023-12-09 1 yy 96 4 +2023-12-09 1 yy 96 4 +2023-12-09 1 yy 97 4 +2023-12-09 1 yy 97 4 +2023-12-10 1 yy 100 2 +2023-12-10 1 yy 101 2 +2023-12-10 1 yy 98 2 +2023-12-10 1 yy 99 2 +2023-12-11 2 mm 102 3 +2023-12-11 2 mm 103 3 +2023-12-11 2 mm 104 3 +2023-12-12 2 mi 105 2 +2023-12-12 2 mi 105 2 +2023-12-12 2 mi 106 2 +2023-12-12 2 mi 106 2 +2023-12-12 2 mi 107 2 +2023-12-12 2 mi 107 2 +2023-12-12 2 mi 108 2 +2023-12-12 2 mi 108 2 + +-- !query12_0_after -- +2023-12-09 1 yy 95 4 +2023-12-09 1 yy 95 4 +2023-12-09 1 yy 96 4 +2023-12-09 1 yy 96 4 +2023-12-09 1 yy 97 4 +2023-12-09 1 yy 97 4 +2023-12-10 1 yy 100 2 +2023-12-10 1 yy 101 2 +2023-12-10 1 yy 98 2 +2023-12-10 1 yy 99 2 +2023-12-11 2 mm 102 3 +2023-12-11 2 mm 103 3 +2023-12-11 2 mm 104 3 +2023-12-12 2 mi 105 2 +2023-12-12 2 mi 105 2 +2023-12-12 2 mi 106 2 +2023-12-12 2 mi 106 2 +2023-12-12 2 mi 107 2 +2023-12-12 2 mi 107 2 +2023-12-12 2 mi 108 2 +2023-12-12 2 mi 108 2 + diff --git a/regression-test/suites/nereids_rules_p0/mv/join/left_outer/outer_join.groovy b/regression-test/suites/nereids_rules_p0/mv/join/left_outer/outer_join.groovy index f31a1a77978cb4..faa2c747a837c5 100644 --- a/regression-test/suites/nereids_rules_p0/mv/join/left_outer/outer_join.groovy +++ b/regression-test/suites/nereids_rules_p0/mv/join/left_outer/outer_join.groovy @@ -759,4 +759,53 @@ suite("outer_join") { async_mv_rewrite_success(db, mv11_0, query11_0, "mv11_0") order_qt_query11_0_after "${query11_0}" sql """ DROP MATERIALIZED VIEW IF EXISTS mv11_0""" + + + def mv12_0 = """ + select + o_orderdate, + o_shippriority, + o_comment, + o.o_code as o_o_code, + l_orderkey, + l_partkey, + l.o_code as l_o_code + from + orders_same_col o left + join lineitem_same_col l on l_orderkey = o_orderkey + left join partsupp on ps_partkey = l_partkey and l_suppkey = ps_suppkey; + """ + + def query12_0 = """ + select + o_orderdate, + o_shippriority, + o_comment, + o.o_code + l_orderkey, + l_partkey + from + orders_same_col o left + join lineitem_same_col l on l_orderkey = o_orderkey + left join partsupp on ps_partkey = l_partkey and l_suppkey = ps_suppkey + where l.o_code <> '91' + union all + select + o_orderdate, + o_shippriority, + o_comment, + o.o_code + l_orderkey, + l_partkey + from + orders_same_col o left + join lineitem_same_col l on l_orderkey = o_orderkey + left join partsupp on ps_partkey = l_partkey and l_suppkey = ps_suppkey + where l.o_code = '92'; + """ + + order_qt_query12_0_before "${query12_0}" + async_mv_rewrite_success(db, mv12_0, query12_0, "mv12_0") + order_qt_query12_0_after "${query12_0}" + sql """ DROP MATERIALIZED VIEW IF EXISTS mv12_0""" } From d1b2b1b44f920ff27a5135070276cf5ecbc51169 Mon Sep 17 00:00:00 2001 From: meiyi Date: Tue, 19 Nov 2024 16:17:14 +0800 Subject: [PATCH 24/63] [fix](transaction load) transaction may publish stuck if fe restart (#44190) 1. a transaction for txn load is committed and not published 2. restart FE 3. the `subTxnIdToTxnId` in `DatabaseTransactionMgr` is empty, not record the map of sub txn_id to txn_id 4. if BE report tablet and txn infos, FE will get transaction state to judge if the txn load info in BE can be removed, but get txnId is null from `subTxnIdToTxnId`, so be remove the txn load info 5. the publish will fail because `publish version failed on transaction, tablet version not exists` --- .../doris/transaction/DatabaseTransactionMgr.java | 13 +++++++++++++ .../transaction/DatabaseTransactionMgrTest.java | 6 +++--- .../transaction/txn_insert_restart_fe.groovy | 1 + 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java b/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java index 163830e447515f..a4dcd877ac3f73 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java @@ -1660,6 +1660,14 @@ protected void unprotectUpsertTransactionState(TransactionState transactionState if (idToRunningTransactionState.put(transactionState.getTransactionId(), transactionState) == null) { runningTxnNums++; } + if (isReplay && transactionState.getSubTxnIds() != null) { + LOG.info("add sub transactions for txn_id={}, status={}, sub_txn_ids={}", + transactionState.getTransactionId(), transactionState.getTransactionStatus(), + transactionState.getSubTxnIds()); + for (Long subTxnId : transactionState.getSubTxnIds()) { + addSubTransaction(transactionState.getTransactionId(), subTxnId); + } + } } else { if (idToRunningTransactionState.remove(transactionState.getTransactionId()) != null) { runningTxnNums--; @@ -1670,6 +1678,11 @@ protected void unprotectUpsertTransactionState(TransactionState transactionState } else { finalStatusTransactionStateDequeLong.add(transactionState); } + if (transactionState.getSubTxnIds() != null) { + LOG.info("clean sub transactions for txn_id={}, sub_txn_ids={}", transactionState.getTransactionId(), + transactionState.getSubTxnIds()); + cleanSubTransactions(transactionState.getTransactionId()); + } } updateTxnLabels(transactionState); } diff --git a/fe/fe-core/src/test/java/org/apache/doris/transaction/DatabaseTransactionMgrTest.java b/fe/fe-core/src/test/java/org/apache/doris/transaction/DatabaseTransactionMgrTest.java index a189aba68116b8..82c79e9f6f00de 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/transaction/DatabaseTransactionMgrTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/transaction/DatabaseTransactionMgrTest.java @@ -357,13 +357,13 @@ public void testSubTransaction() throws UserException { long subTransactionId3 = transactionState6.getSubTxnIds().get(2); TransactionState subTransactionState = masterTransMgr.getTransactionState(CatalogTestUtil.testDbId1, subTransactionId3); - Assert.assertEquals(transactionState6, subTransactionState); + Assert.assertEquals(null, subTransactionState); // finished txn will remove sub txn map // test show transaction state command - List> singleTranInfos = masterDbTransMgr.getSingleTranInfo(CatalogTestUtil.testDbId1, + /*List> singleTranInfos = masterDbTransMgr.getSingleTranInfo(CatalogTestUtil.testDbId1, subTransactionId3); Assert.assertEquals(1, singleTranInfos.size()); List txnInfo = singleTranInfos.get(0); - Assert.assertEquals(String.valueOf(transactionId6), txnInfo.get(0)); + Assert.assertEquals(String.valueOf(transactionId6), txnInfo.get(0));*/ // test get table transaction info: table_id to partition_id map List> tableTransInfos = masterDbTransMgr.getTableTransInfo(transactionId6); diff --git a/regression-test/suites/insert_p0/transaction/txn_insert_restart_fe.groovy b/regression-test/suites/insert_p0/transaction/txn_insert_restart_fe.groovy index bd478bc2359959..9a743bfc9859ba 100644 --- a/regression-test/suites/insert_p0/transaction/txn_insert_restart_fe.groovy +++ b/regression-test/suites/insert_p0/transaction/txn_insert_restart_fe.groovy @@ -44,6 +44,7 @@ suite("txn_insert_restart_fe", 'docker') { options.feConfigs.add('sys_log_verbose_modules=org.apache.doris') // options.beConfigs.add('sys_log_verbose_modules=*') options.beConfigs.add('enable_java_support=false') + options.beConfigs.add('pending_data_expire_time_sec=1') docker(options) { // ---------- test restart fe ---------- def result = sql 'SELECT DATABASE()' From 0cbad3b4f15fa57aaab1d1c4dccb8f0fca8ae219 Mon Sep 17 00:00:00 2001 From: Gabriel Date: Tue, 19 Nov 2024 16:37:14 +0800 Subject: [PATCH 25/63] =?UTF-8?q?[fix](runtime=20filter)=20Disable=20`buil?= =?UTF-8?q?d=5Fbf=5Fexactly`=20if=20`sync=5Ffilter=5Fsize=E2=80=A6=20(#441?= =?UTF-8?q?69)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …` is disabled When a bloom filter has multiple targets, it should use a size which is estimated by FE. --- be/src/exprs/runtime_filter.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/be/src/exprs/runtime_filter.cpp b/be/src/exprs/runtime_filter.cpp index 2070deffffd6fa..becda350d21d30 100644 --- a/be/src/exprs/runtime_filter.cpp +++ b/be/src/exprs/runtime_filter.cpp @@ -1355,18 +1355,19 @@ Status IRuntimeFilter::init_with_desc(const TRuntimeFilterDesc* desc, const TQue params.runtime_bloom_filter_max_size = options->__isset.runtime_bloom_filter_max_size ? options->runtime_bloom_filter_max_size : 0; - // We build runtime filter by exact distinct count iff three conditions are met: + auto sync_filter_size = desc->__isset.sync_filter_size && desc->sync_filter_size; + // We build runtime filter by exact distinct count if all of 3 conditions are met: // 1. Only 1 join key - // 2. Do not have remote target (e.g. do not need to merge), or broadcast join - // 3. Bloom filter + // 2. Bloom filter + // 3. Size of all bloom filters will be same (size will be sync or this is a broadcast join). params.build_bf_exactly = build_bf_exactly && (_runtime_filter_type == RuntimeFilterType::BLOOM_FILTER || _runtime_filter_type == RuntimeFilterType::IN_OR_BLOOM_FILTER); params.bloom_filter_size_calculated_by_ndv = desc->bloom_filter_size_calculated_by_ndv; - if (!desc->__isset.sync_filter_size || !desc->sync_filter_size) { - params.build_bf_exactly &= (!_has_remote_target || _is_broadcast_join); + if (!sync_filter_size) { + params.build_bf_exactly &= !_is_broadcast_join; } if (desc->__isset.bloom_filter_size_bytes) { From 956da4cb4446306c1c170e39dd8124b5e4038739 Mon Sep 17 00:00:00 2001 From: yujun Date: Tue, 19 Nov 2024 16:37:43 +0800 Subject: [PATCH 26/63] [feature](decommission) decommission backend skip leaky tablets (#42401) When decommission a backend, it will get this backend's tablet meta list from TabletInvertIndex. Only after all its tablets had migrated or moved to recyle bin, then can drop this backend. But sometimes, TabletInvertIndex may had leaky because deletting a partition forget to delete its tablet meta. After that, decommission will be blocked. So let decommission skip the leaky tablet metas, if a tablet meta couldn't found its partition, and not in catalog recyle bin, that just skip it. But for safy reason, let drop after leaky had exceed 5 hours(Config.decommission_skip_leaky_tablet_second). --- .../java/org/apache/doris/common/Config.java | 11 +- .../org/apache/doris/alter/SystemHandler.java | 166 ++++++++++++++++-- .../apache/doris/load/GroupCommitManager.java | 4 + .../cluster/DecommissionBackendTest.java | 96 +++++++++- 4 files changed, 261 insertions(+), 16 deletions(-) diff --git a/fe/fe-common/src/main/java/org/apache/doris/common/Config.java b/fe/fe-common/src/main/java/org/apache/doris/common/Config.java index 993702c4dac57f..39cda4806b35a4 100644 --- a/fe/fe-common/src/main/java/org/apache/doris/common/Config.java +++ b/fe/fe-common/src/main/java/org/apache/doris/common/Config.java @@ -1352,7 +1352,16 @@ public class Config extends ConfigBase { * For performance based considerations, better not set a very high value for this. */ @ConfField(mutable = true, masterOnly = true) - public static int decommission_tablet_check_threshold = 5000; + public static int decommission_tablet_check_threshold = 50000; + + /** + * When decommission a backend, need to migrate all its tablets to other backends. + * But there maybe some leaky tablets due to forgetting to delete them from TabletInvertIndex. + * They are not in use. Decommission can skip migrating them. + * For safety, decommission wait for a period after founding leaky tablets. + */ + @ConfField(mutable = true, masterOnly = true) + public static int decommission_skip_leaky_tablet_second = 3600 * 5; /** * Decommission a tablet need to wait all the previous txns finished. diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/SystemHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/SystemHandler.java index 78b3b76ea78d46..6725207f8d2fc9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/SystemHandler.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/SystemHandler.java @@ -31,6 +31,7 @@ import org.apache.doris.analysis.ModifyBackendHostNameClause; import org.apache.doris.analysis.ModifyBrokerClause; import org.apache.doris.analysis.ModifyFrontendHostNameClause; +import org.apache.doris.catalog.CatalogRecycleBin; import org.apache.doris.catalog.Database; import org.apache.doris.catalog.Env; import org.apache.doris.catalog.MysqlCompatibleDatabase; @@ -39,11 +40,13 @@ import org.apache.doris.catalog.ReplicaAllocation; import org.apache.doris.catalog.Table; import org.apache.doris.catalog.TabletInvertedIndex; +import org.apache.doris.catalog.TabletMeta; import org.apache.doris.common.Config; import org.apache.doris.common.DdlException; import org.apache.doris.common.UserException; import org.apache.doris.common.util.DebugPointUtil; import org.apache.doris.common.util.NetUtils; +import org.apache.doris.datasource.InternalCatalog; import org.apache.doris.ha.FrontendNodeType; import org.apache.doris.resource.Tag; import org.apache.doris.system.Backend; @@ -60,6 +63,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; import java.util.stream.Collectors; /* @@ -71,6 +76,9 @@ public class SystemHandler extends AlterHandler { private static final Logger LOG = LogManager.getLogger(SystemHandler.class); + // backendId -> tabletId -> checkTime + private Map> backendLeakyTablets = Maps.newHashMap(); + public SystemHandler() { super("system"); } @@ -86,7 +94,11 @@ protected void runAfterCatalogReady() { // check all decommissioned backends, if there is no available tablet on that backend, drop it. private void runAlterJobV2() { SystemInfoService systemInfoService = Env.getCurrentSystemInfo(); - TabletInvertedIndex invertedIndex = Env.getCurrentInvertedIndex(); + backendLeakyTablets.entrySet().removeIf(entry -> { + long beId = entry.getKey(); + Backend backend = systemInfoService.getBackend(beId); + return backend == null || !backend.isDecommissioned(); + }); // check if decommission is finished for (Long beId : systemInfoService.getAllBackendIds(false)) { Backend backend = systemInfoService.getBackend(beId); @@ -94,9 +106,13 @@ private void runAlterJobV2() { continue; } - List backendTabletIds = invertedIndex.getTabletIdsByBackendId(beId); + AtomicInteger totalTabletNum = new AtomicInteger(0); + List sampleTablets = Lists.newArrayList(); + List sampleLeakyTablets = Lists.newArrayList(); + // check backend had migrated all its tablets, otherwise sample some tablets for log + boolean migratedTablets = checkMigrateTablets(beId, 10, sampleTablets, sampleLeakyTablets, totalTabletNum); long walNum = Env.getCurrentEnv().getGroupCommitManager().getAllWalQueueSize(backend); - if (Config.drop_backend_after_decommission && checkTablets(beId, backendTabletIds) && walNum == 0) { + if (Config.drop_backend_after_decommission && migratedTablets && walNum == 0) { try { systemInfoService.dropBackend(beId); LOG.info("no available tablet on decommission backend {}, drop it", beId); @@ -107,8 +123,9 @@ private void runAlterJobV2() { continue; } - LOG.info("backend {} lefts {} replicas to decommission: {}{}", beId, backendTabletIds.size(), - backendTabletIds.subList(0, Math.min(10, backendTabletIds.size())), + LOG.info("backend {} lefts {} replicas to decommission: normal tablets {}{}{}", + beId, totalTabletNum.get(), sampleTablets, + sampleLeakyTablets.isEmpty() ? "" : "; maybe leaky tablets " + sampleLeakyTablets, walNum > 0 ? "; and has " + walNum + " unfinished WALs" : ""); } } @@ -193,19 +210,142 @@ public synchronized void process(String rawSql, List alterClauses, /* * check if the specified backends can be dropped * 1. backend does not have any tablet. - * 2. all tablets in backend have been recycled. + * 2. or all tablets in backend have been recycled or been leaky for a long time. + * + * and return some sample tablets for log. + * + * sampleLimit: the max sample tablet num + * sampleTablets: sample normal tablets + * sampleLeakyTablets: sample leaky tablets + * */ - private boolean checkTablets(Long beId, List backendTabletIds) { + private boolean checkMigrateTablets(long beId, int sampleLimit, List sampleTablets, + List sampleLeakyTablets, AtomicInteger totalTabletNum) { + TabletInvertedIndex invertedIndex = Env.getCurrentInvertedIndex(); + List backendTabletIds = invertedIndex.getTabletIdsByBackendId(beId); + totalTabletNum.set(backendTabletIds.size()); if (backendTabletIds.isEmpty()) { return true; } - if (backendTabletIds.size() < Config.decommission_tablet_check_threshold - && Env.getCurrentRecycleBin().allTabletsInRecycledStatus(backendTabletIds)) { - LOG.info("tablet size is {}, all tablets on decommissioned backend {} have been recycled," - + " so this backend will be dropped immediately", backendTabletIds.size(), beId); - return true; + // if too many tablets, no check for efficiency + if (backendTabletIds.size() > Config.decommission_tablet_check_threshold) { + backendTabletIds.stream().limit(sampleLimit).forEach(sampleTablets::add); + return false; + } + // dbId -> tableId -> partitionId -> tablet list + Map>>> tabletsMap = Maps.newHashMap(); + List tabletMetaList = invertedIndex.getTabletMetaList(backendTabletIds); + for (int i = 0; i < backendTabletIds.size(); i++) { + long tabletId = backendTabletIds.get(i); + TabletMeta tabletMeta = tabletMetaList.get(i); + if (tabletMeta == TabletInvertedIndex.NOT_EXIST_TABLET_META) { + continue; + } + tabletsMap.computeIfAbsent(tabletMeta.getDbId(), k -> Maps.newHashMap()) + .computeIfAbsent(tabletMeta.getTableId(), k -> Maps.newHashMap()) + .computeIfAbsent(tabletMeta.getPartitionId(), k -> Lists.newArrayList()) + .add(tabletId); + } + InternalCatalog catalog = Env.getCurrentInternalCatalog(); + CatalogRecycleBin recycleBin = Env.getCurrentRecycleBin(); + long now = System.currentTimeMillis(); + Map leakyTablets = Maps.newHashMap(); + boolean searchedFirstTime = !backendLeakyTablets.containsKey(beId); + Map lastLeakyTablets = backendLeakyTablets.computeIfAbsent(beId, k -> Maps.newHashMap()); + backendLeakyTablets.put(beId, leakyTablets); + Consumer> addPartitionLeakyTablets = tabletsOfPartition -> { + tabletsOfPartition.forEach(tabletId -> { + leakyTablets.put(tabletId, lastLeakyTablets.getOrDefault(tabletId, now)); + }); + }; + Consumer>> addTableLeakyTablets = tabletsOfTable -> { + tabletsOfTable.values().forEach(addPartitionLeakyTablets); + }; + Consumer>>> addDbLeakyTablets = tabletsOfDb -> { + tabletsOfDb.values().forEach(addTableLeakyTablets); + }; + + // Search backend's tablets, put 10 normal tablets into sampleTablets, put leaky tablets into leakyTablets. + // For the first time search, it will search all this backend's tablets. + // For later search, it only search at most 10 normal tablets, in order to reduce lock table. + boolean searchedAllTablets = true; + OUTER: + for (Map.Entry>>> dbEntry : tabletsMap.entrySet()) { + long dbId = dbEntry.getKey(); + Database db = catalog.getDbNullable(dbId); + if (db == null) { + // not found db, and it's not in recyle bin, then it should be leaky. + if (!recycleBin.isRecycleDatabase(dbId)) { + addDbLeakyTablets.accept(dbEntry.getValue()); + } + continue; + } + + for (Map.Entry>> tableEntry : dbEntry.getValue().entrySet()) { + long tableId = tableEntry.getKey(); + Table tbl = db.getTableNullable(tableId); + if (tbl == null || !tbl.isManagedTable()) { + if (!recycleBin.isRecycleTable(dbId, tableId)) { + addTableLeakyTablets.accept(tableEntry.getValue()); + } + continue; + } + + OlapTable olapTable = (OlapTable) tbl; + olapTable.readLock(); + try { + for (Map.Entry> partitionEntry : tableEntry.getValue().entrySet()) { + long partitionId = partitionEntry.getKey(); + Partition partition = olapTable.getPartition(partitionId); + if (partition == null) { + if (!recycleBin.isRecyclePartition(dbId, tableId, partitionId)) { + addPartitionLeakyTablets.accept(partitionEntry.getValue()); + } + continue; + } + // at present, the leaky tablets are belong to a not-found partition. + // so if a partition is in a table, no more check this partition really contains this tablet, + // just treat this tablet as no leaky. + for (long tabletId : partitionEntry.getValue()) { + if (sampleTablets.size() < sampleLimit) { + sampleTablets.add(tabletId); + } else if (!searchedFirstTime) { + // First time will search all tablets, + // The later search will stop searching after found 10 normal tablets + // in order to reduce table lock. + searchedAllTablets = false; + break OUTER; + } + } + } + } finally { + olapTable.readUnlock(); + } + } + } + + if (!searchedAllTablets) { + // due to not search all tablets, it may miss some leaky tablets. + // so we add the leaky tablets of the last time search. + // it can infer that leakyTablets will contains all leaky tablets of the first time search. + // And we know that the first time it searched all tablets. + leakyTablets.putAll(lastLeakyTablets); } - return false; + leakyTablets.keySet().stream().limit(sampleLimit).forEach(sampleLeakyTablets::add); + + // If a tablet can't be found in path 'db -> table -> partition', and it's not in recyle bin, + // we treat this tablet as leaky, but it maybe not real leaky. + // The onflight creating new partiton/table may let its tablets seem like leaky temporarily. + // For example, when creatting a new partition, firstly its tablets will add to TabletInvertedIndex. + // But at this moment, the partition hadn't add to table, so search the tablet with path + // 'db -> table -> partition' will failed. Only after finish creating, the partition will add to the table. + // + // So the onflight new tablet maynot be real leaky. Need to wait for a time to confirm they are real leaky. + long skipLeakyTs = now - Config.decommission_skip_leaky_tablet_second * 1000L; + + // if a backend no normal tablets (sampleTablets size = 0), and leaky tablets had been leaky for a long time, + // then can drop it now. + return sampleTablets.isEmpty() && leakyTablets.values().stream().allMatch(ts -> ts < skipLeakyTs); } private List checkDecommission(DecommissionBackendClause decommissionBackendClause) diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/GroupCommitManager.java b/fe/fe-core/src/main/java/org/apache/doris/load/GroupCommitManager.java index 3b108ed638aff9..60394f943654c6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/load/GroupCommitManager.java +++ b/fe/fe-core/src/main/java/org/apache/doris/load/GroupCommitManager.java @@ -25,6 +25,7 @@ import org.apache.doris.common.DdlException; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; +import org.apache.doris.common.FeConstants; import org.apache.doris.common.LoadException; import org.apache.doris.common.util.SlidingWindowCounter; import org.apache.doris.mysql.privilege.Auth; @@ -138,6 +139,9 @@ public long getAllWalQueueSize(Backend backend) { } private long getWalQueueSize(Backend backend, PGetWalQueueSizeRequest request) { + if (FeConstants.runningUnitTest) { + return 0; + } PGetWalQueueSizeResponse response = null; long expireTime = System.currentTimeMillis() + Config.check_wal_queue_timeout_threshold; long size = 0; diff --git a/fe/fe-core/src/test/java/org/apache/doris/cluster/DecommissionBackendTest.java b/fe/fe-core/src/test/java/org/apache/doris/cluster/DecommissionBackendTest.java index 53355f6faa4929..a3add70afa906b 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/cluster/DecommissionBackendTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/cluster/DecommissionBackendTest.java @@ -25,20 +25,25 @@ import org.apache.doris.catalog.Partition; import org.apache.doris.catalog.Replica; import org.apache.doris.catalog.Tablet; +import org.apache.doris.catalog.TabletInvertedIndex; +import org.apache.doris.catalog.TabletMeta; import org.apache.doris.clone.RebalancerTestUtil; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.Config; import org.apache.doris.common.FeConstants; import org.apache.doris.system.Backend; import org.apache.doris.system.SystemInfoService; +import org.apache.doris.thrift.TStorageMedium; import org.apache.doris.utframe.TestWithFeService; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import java.util.List; +import java.util.function.Supplier; public class DecommissionBackendTest extends TestWithFeService { @Override @@ -58,7 +63,7 @@ public void beforeClass() { @Override protected void beforeCreatingConnectContext() throws Exception { - FeConstants.default_scheduler_interval_millisecond = 1000; + FeConstants.default_scheduler_interval_millisecond = 100; Config.tablet_checker_interval_ms = 100; Config.tablet_schedule_interval_ms = 100; Config.tablet_repair_delay_factor_second = 1; @@ -197,7 +202,7 @@ public void testDecommissionBackendWithDropTable() throws Exception { int tabletNum = Env.getCurrentInvertedIndex().getTabletMetaMap().size(); Assertions.assertTrue(tabletNum > 0); - Database db = Env.getCurrentInternalCatalog().getDbOrMetaException("db2"); + Database db = Env.getCurrentInternalCatalog().getDbOrMetaException("db3"); OlapTable tbl = (OlapTable) db.getTableOrMetaException("tbl1"); Assertions.assertNotNull(tbl); long backendId = tbl.getPartitions().iterator().next() @@ -337,5 +342,92 @@ public void testDecommissionBackendWithMTMV() throws Exception { // 6. add backend addNewBackend(); Assertions.assertEquals(backendNum(), Env.getCurrentSystemInfo().getAllBackendsByAllCluster().size()); + + dropDatabase("db4"); } + + @Test + public void testDecommissionBackendWithLeakyTablets() throws Exception { + // 1. create connect context + connectContext = createDefaultCtx(); + + Assertions.assertEquals(backendNum(), Env.getCurrentSystemInfo().getAllBackendsByAllCluster().size()); + + // 2. create database db5 + createDatabase("db5"); + System.out.println(Env.getCurrentInternalCatalog().getDbNames()); + + // 3. create table tbl1 + createTable("create table db5.tbl1(k1 int) distributed by hash(k1) buckets 3 properties('replication_num' = '1');"); + RebalancerTestUtil.updateReplicaPathHash(); + + Database db = Env.getCurrentInternalCatalog().getDbOrMetaException("db5"); + OlapTable tbl = (OlapTable) db.getTableOrMetaException("tbl1"); + Assertions.assertNotNull(tbl); + + Partition partition = tbl.getPartitions().iterator().next(); + Tablet tablet = partition.getMaterializedIndices(MaterializedIndex.IndexExtState.ALL) + .iterator().next().getTablets().iterator().next(); + Assertions.assertNotNull(tablet); + Backend srcBackend = Env.getCurrentSystemInfo().getBackend(tablet.getReplicas().get(0).getBackendId()); + Assertions.assertNotNull(srcBackend); + + TabletInvertedIndex invertIndex = Env.getCurrentInvertedIndex(); + long fakeTabletId = 123123123L; + TabletMeta fakeTabletMeta = new TabletMeta(1234567L, 1234568L, 1234569L, 1234570L, 0, TStorageMedium.HDD); + Replica fakeReplica = new Replica(1234571L, srcBackend.getId(), 0, Replica.ReplicaState.NORMAL); + + Supplier> getNotInRecycleBinTablets = () -> { + List tabletIds = Lists.newArrayList(); + for (long tabletId : invertIndex.getTabletIdsByBackendId(srcBackend.getId())) { + TabletMeta tabletMeta = invertIndex.getTabletMeta(tabletId); + if (tabletMeta == null || !Env.getCurrentRecycleBin().isRecyclePartition( + tabletMeta.getDbId(), tabletMeta.getTableId(), tabletMeta.getPartitionId())) { + tabletIds.add(tabletId); + } + } + return tabletIds; + }; + try { + Config.decommission_skip_leaky_tablet_second = 3600; + + // add leaky tablet + invertIndex.addTablet(fakeTabletId, fakeTabletMeta); + invertIndex.addReplica(fakeTabletId, fakeReplica); + + String decommissionStmtStr = "alter system decommission backend \"" + srcBackend.getAddress() + "\""; + AlterSystemStmt decommissionStmt = (AlterSystemStmt) parseAndAnalyzeStmt(decommissionStmtStr); + Env.getCurrentEnv().getAlterInstance().processAlterSystem(decommissionStmt); + + Assertions.assertTrue(srcBackend.isDecommissioned()); + + long startTimestamp = System.currentTimeMillis(); + + List expectTabletIds = Lists.newArrayList(fakeTabletId); + while (System.currentTimeMillis() - startTimestamp < 90000 + && !expectTabletIds.equals(getNotInRecycleBinTablets.get())) { + Thread.sleep(1000); + } + + Assertions.assertEquals(expectTabletIds, getNotInRecycleBinTablets.get()); + Thread.sleep(5000); + Assertions.assertEquals(expectTabletIds, getNotInRecycleBinTablets.get()); + Assertions.assertNotNull(Env.getCurrentSystemInfo().getBackend(srcBackend.getId())); + // skip leaky tablets, decommission succ + Config.decommission_skip_leaky_tablet_second = 1; + Thread.sleep(4000); + Assertions.assertNull(Env.getCurrentSystemInfo().getBackend(srcBackend.getId())); + } finally { + invertIndex.deleteTablet(fakeTabletId); + } + + Assertions.assertEquals(backendNum() - 1, Env.getCurrentSystemInfo().getAllBackendsByAllCluster().size()); + + // 6. add backend + addNewBackend(); + Assertions.assertEquals(backendNum(), Env.getCurrentSystemInfo().getAllBackendsByAllCluster().size()); + + dropDatabase("db5"); + } + } From 07ebf029ffca60dde72e9d86fd4a74fed7ca6a44 Mon Sep 17 00:00:00 2001 From: zhangstar333 Date: Tue, 19 Nov 2024 16:53:13 +0800 Subject: [PATCH 27/63] [env](compile)open compile check in data type serde files (#42888) ## Proposed changes open compile check in data type serde files --- be/src/runtime/jsonb_value.cpp | 2 +- be/src/runtime/jsonb_value.h | 4 +- be/src/util/arrow/block_convertor.cpp | 5 +- be/src/util/jsonb_document.h | 4 +- be/src/util/jsonb_parser.h | 6 +- be/src/util/jsonb_parser_simd.h | 6 +- be/src/util/jsonb_stream.h | 20 ++++--- be/src/util/jsonb_writer.h | 13 ++--- be/src/vec/columns/column_object.cpp | 6 +- be/src/vec/columns/column_object.h | 6 +- .../serde/data_type_array_serde.cpp | 37 ++++++------ .../data_types/serde/data_type_array_serde.h | 25 ++++---- .../serde/data_type_bitmap_serde.cpp | 31 +++++----- .../data_types/serde/data_type_bitmap_serde.h | 21 +++---- .../serde/data_type_date64_serde.cpp | 29 +++++----- .../data_types/serde/data_type_date64_serde.h | 19 ++++--- .../serde/data_type_datetimev2_serde.cpp | 30 +++++----- .../serde/data_type_datetimev2_serde.h | 15 ++--- .../serde/data_type_datev2_serde.cpp | 32 ++++++----- .../data_types/serde/data_type_datev2_serde.h | 15 ++--- .../serde/data_type_decimal_serde.cpp | 29 +++++----- .../serde/data_type_decimal_serde.h | 31 +++++----- .../data_types/serde/data_type_hll_serde.cpp | 37 ++++++------ .../data_types/serde/data_type_hll_serde.h | 21 +++---- .../data_types/serde/data_type_ipv4_serde.cpp | 19 ++++--- .../data_types/serde/data_type_ipv4_serde.h | 15 ++--- .../data_types/serde/data_type_ipv6_serde.cpp | 35 +++++++----- .../data_types/serde/data_type_ipv6_serde.h | 19 ++++--- .../serde/data_type_jsonb_serde.cpp | 38 +++++++------ .../data_types/serde/data_type_jsonb_serde.h | 21 +++---- .../data_types/serde/data_type_map_serde.cpp | 34 +++++------ .../data_types/serde/data_type_map_serde.h | 25 ++++---- .../serde/data_type_nothing_serde.h | 18 +++--- .../serde/data_type_nullable_serde.cpp | 40 ++++++------- .../serde/data_type_nullable_serde.h | 28 ++++----- .../serde/data_type_number_serde.cpp | 33 ++++++----- .../data_types/serde/data_type_number_serde.h | 57 +++++++++++-------- .../serde/data_type_object_serde.cpp | 21 ++++--- .../data_types/serde/data_type_object_serde.h | 24 ++++---- .../serde/data_type_quantilestate_serde.h | 31 +++++----- .../vec/data_types/serde/data_type_serde.cpp | 8 ++- be/src/vec/data_types/serde/data_type_serde.h | 47 ++++++++------- .../data_types/serde/data_type_string_serde.h | 40 +++++++------ .../serde/data_type_struct_serde.cpp | 45 ++++++++------- .../data_types/serde/data_type_struct_serde.h | 27 +++++---- .../data_types/serde/data_type_time_serde.cpp | 10 ++-- .../data_types/serde/data_type_time_serde.h | 10 ++-- be/src/vec/runtime/vdatetime_value.cpp | 6 +- be/src/vec/runtime/vdatetime_value.h | 14 ++--- .../json_functions/json_search.groovy | 2 +- 50 files changed, 599 insertions(+), 512 deletions(-) diff --git a/be/src/runtime/jsonb_value.cpp b/be/src/runtime/jsonb_value.cpp index e88ce3b3d74d1a..0227281fdd0d0e 100644 --- a/be/src/runtime/jsonb_value.cpp +++ b/be/src/runtime/jsonb_value.cpp @@ -28,7 +28,7 @@ namespace doris { -Status JsonBinaryValue::from_json_string(const char* s, int length) { +Status JsonBinaryValue::from_json_string(const char* s, size_t length) { JsonbErrType error = JsonbErrType::E_NONE; if (!parser.parse(s, length)) { error = parser.getErrorCode(); diff --git a/be/src/runtime/jsonb_value.h b/be/src/runtime/jsonb_value.h index 1df9469e1720cd..65f4927759c304 100644 --- a/be/src/runtime/jsonb_value.h +++ b/be/src/runtime/jsonb_value.h @@ -43,7 +43,7 @@ struct JsonBinaryValue { JsonbParser parser; JsonBinaryValue() : ptr(nullptr), len(0) {} - JsonBinaryValue(char* ptr, int len) { + JsonBinaryValue(char* ptr, size_t len) { static_cast(from_json_string(const_cast(ptr), len)); } JsonBinaryValue(const std::string& s) { @@ -115,7 +115,7 @@ struct JsonBinaryValue { __builtin_unreachable(); } - Status from_json_string(const char* s, int len); + Status from_json_string(const char* s, size_t len); std::string to_json_string() const; diff --git a/be/src/util/arrow/block_convertor.cpp b/be/src/util/arrow/block_convertor.cpp index 817231e02ba03e..eb2508c8d0cb74 100644 --- a/be/src/util/arrow/block_convertor.cpp +++ b/be/src/util/arrow/block_convertor.cpp @@ -391,8 +391,9 @@ Status FromBlockConverter::convert(std::shared_ptr* out) { _cur_start, _cur_start + _cur_rows, _timezone_obj); } catch (std::exception& e) { - return Status::InternalError("Fail to convert block data to arrow data, error: {}", - e.what()); + return Status::InternalError( + "Fail to convert block data to arrow data, tyep: {}, name: {}, error: {}", + _cur_type->get_name(), e.what()); } arrow_st = _cur_builder->Finish(&_arrays[_cur_field_idx]); if (!arrow_st.ok()) { diff --git a/be/src/util/jsonb_document.h b/be/src/util/jsonb_document.h index 016da3142cd24c..909ee70742998e 100644 --- a/be/src/util/jsonb_document.h +++ b/be/src/util/jsonb_document.h @@ -180,7 +180,7 @@ class JsonbDocument { static JsonbDocument* createDocument(const char* pb, size_t size); // create an JsonbValue from JSONB packed bytes - static JsonbValue* createValue(const char* pb, uint32_t size); + static JsonbValue* createValue(const char* pb, size_t size); uint8_t version() { return header_.ver_; } @@ -1160,7 +1160,7 @@ inline void JsonbDocument::setValue(const JsonbValue* value) { memcpy(payload_, value, value->numPackedBytes()); } -inline JsonbValue* JsonbDocument::createValue(const char* pb, uint32_t size) { +inline JsonbValue* JsonbDocument::createValue(const char* pb, size_t size) { if (!pb || size < sizeof(JsonbHeader) + sizeof(JsonbValue)) { return nullptr; } diff --git a/be/src/util/jsonb_parser.h b/be/src/util/jsonb_parser.h index c90012a4fbef30..4192e36ea5cc80 100644 --- a/be/src/util/jsonb_parser.h +++ b/be/src/util/jsonb_parser.h @@ -84,16 +84,16 @@ class JsonbParserT { // parse a UTF-8 JSON string bool parse(const std::string& str, hDictInsert handler = nullptr) { - return parse(str.c_str(), (unsigned int)str.size(), handler); + return parse(str.c_str(), str.size(), handler); } // parse a UTF-8 JSON c-style string (NULL terminated) bool parse(const char* c_str, hDictInsert handler = nullptr) { - return parse(c_str, (unsigned int)strlen(c_str), handler); + return parse(c_str, strlen(c_str), handler); } // parse a UTF-8 JSON string with length - bool parse(const char* pch, unsigned int len, hDictInsert handler = nullptr) { + bool parse(const char* pch, size_t len, hDictInsert handler = nullptr) { if (!pch || len == 0) { err_ = JsonbErrType::E_EMPTY_DOCUMENT; return false; diff --git a/be/src/util/jsonb_parser_simd.h b/be/src/util/jsonb_parser_simd.h index 6621912a9d0400..96ce866f74e256 100644 --- a/be/src/util/jsonb_parser_simd.h +++ b/be/src/util/jsonb_parser_simd.h @@ -85,16 +85,16 @@ class JsonbParserTSIMD { // parse a UTF-8 JSON string bool parse(const std::string& str, hDictInsert handler = nullptr) { - return parse(str.c_str(), (unsigned int)str.size(), handler); + return parse(str.c_str(), str.size(), handler); } // parse a UTF-8 JSON c-style string (NULL terminated) bool parse(const char* c_str, hDictInsert handler = nullptr) { - return parse(c_str, (unsigned int)strlen(c_str), handler); + return parse(c_str, strlen(c_str), handler); } // parse a UTF-8 JSON string with length - bool parse(const char* pch, unsigned int len, hDictInsert handler = nullptr) { + bool parse(const char* pch, size_t len, hDictInsert handler = nullptr) { // reset state before parse reset(); diff --git a/be/src/util/jsonb_stream.h b/be/src/util/jsonb_stream.h index 4567ab8384bd9d..2ea5d9090c735b 100644 --- a/be/src/util/jsonb_stream.h +++ b/be/src/util/jsonb_stream.h @@ -72,7 +72,7 @@ class JsonbInBuffer : public std::streambuf { */ class JsonbOutStream : public std::ostream { public: - explicit JsonbOutStream(uint32_t capacity = 1024) + explicit JsonbOutStream(uint64_t capacity = 1024) : std::ostream(nullptr), head_(nullptr), size_(0), capacity_(capacity), alloc_(true) { if (capacity_ == 0) { capacity_ = 1024; @@ -81,7 +81,7 @@ class JsonbOutStream : public std::ostream { head_ = (char*)malloc(capacity_); } - JsonbOutStream(char* buffer, uint32_t capacity) + JsonbOutStream(char* buffer, uint64_t capacity) : std::ostream(nullptr), head_(buffer), size_(0), capacity_(capacity), alloc_(false) { assert(buffer && capacity_ > 0); } @@ -94,10 +94,12 @@ class JsonbOutStream : public std::ostream { void put(char c) { write(&c, 1); } - void write(const char* c_str) { write(c_str, (uint32_t)strlen(c_str)); } + void write(const char* c_str) { write(c_str, strlen(c_str)); } - void write(const char* bytes, uint32_t len) { - if (len == 0) return; + void write(const char* bytes, uint64_t len) { + if (len == 0) { + return; + } if (size_ + len > capacity_) { realloc(len); @@ -156,14 +158,14 @@ class JsonbOutStream : public std::ostream { pos_type tellp() const { return size_; } - void seekp(pos_type pos) { size_ = (uint32_t)pos; } + void seekp(pos_type pos) { size_ = (uint64_t)pos; } const char* getBuffer() const { return head_; } pos_type getSize() const { return tellp(); } private: - void realloc(uint32_t len) { + void realloc(uint64_t len) { assert(capacity_ > 0); capacity_ *= 2; @@ -186,8 +188,8 @@ class JsonbOutStream : public std::ostream { private: char* head_ = nullptr; - uint32_t size_; - uint32_t capacity_; + uint64_t size_; + uint64_t capacity_; bool alloc_; }; diff --git a/be/src/util/jsonb_writer.h b/be/src/util/jsonb_writer.h index 61bd28bb783bd2..52d912d29d3b6d 100644 --- a/be/src/util/jsonb_writer.h +++ b/be/src/util/jsonb_writer.h @@ -315,7 +315,9 @@ class JsonbWriterT { return false; } - uint32_t writeString(const char* str, uint32_t len) { + // TODO: here changed length to uint64_t, as some api also need changed, But the thirdparty api is uint_32t + // need consider a better way to handle case. + uint64_t writeString(const char* str, uint64_t len) { if (kvState_ == WS_String) { os_->write(str, len); return len; @@ -324,9 +326,7 @@ class JsonbWriterT { return 0; } - uint32_t writeString(const std::string& str) { - return writeString(str.c_str(), (uint32_t)str.size()); - } + uint32_t writeString(const std::string& str) { return writeString(str.c_str(), str.size()); } uint32_t writeString(char ch) { if (kvState_ == WS_String) { os_->put(ch); @@ -372,7 +372,7 @@ class JsonbWriterT { return false; } - uint32_t writeBinary(const char* bin, uint32_t len) { + uint64_t writeBinary(const char* bin, uint64_t len) { if (kvState_ == WS_Binary) { os_->write(bin, len); return len; @@ -483,8 +483,7 @@ class JsonbWriterT { } JsonbValue* getValue() { - return JsonbDocument::createValue(getOutput()->getBuffer(), - (uint32_t)getOutput()->getSize()); + return JsonbDocument::createValue(getOutput()->getBuffer(), getOutput()->getSize()); } bool writeEnd() { diff --git a/be/src/vec/columns/column_object.cpp b/be/src/vec/columns/column_object.cpp index 02cf40ab81c34c..d5e52d07bcf788 100644 --- a/be/src/vec/columns/column_object.cpp +++ b/be/src/vec/columns/column_object.cpp @@ -1416,7 +1416,7 @@ void get_json_by_column_tree(rapidjson::Value& root, rapidjson::Document::Alloca } } -Status ColumnObject::serialize_one_row_to_string(int row, std::string* output) const { +Status ColumnObject::serialize_one_row_to_string(int64_t row, std::string* output) const { if (!is_finalized()) { const_cast(this)->finalize(FinalizeMode::READ_MODE); } @@ -1432,7 +1432,7 @@ Status ColumnObject::serialize_one_row_to_string(int row, std::string* output) c return Status::OK(); } -Status ColumnObject::serialize_one_row_to_string(int row, BufferWritable& output) const { +Status ColumnObject::serialize_one_row_to_string(int64_t row, BufferWritable& output) const { if (!is_finalized()) { const_cast(this)->finalize(FinalizeMode::READ_MODE); } @@ -1447,7 +1447,7 @@ Status ColumnObject::serialize_one_row_to_string(int row, BufferWritable& output return Status::OK(); } -Status ColumnObject::serialize_one_row_to_json_format(int row, rapidjson::StringBuffer* output, +Status ColumnObject::serialize_one_row_to_json_format(int64_t row, rapidjson::StringBuffer* output, bool* is_null) const { CHECK(is_finalized()); if (subcolumns.empty()) { diff --git a/be/src/vec/columns/column_object.h b/be/src/vec/columns/column_object.h index 3379a5ff8e88e2..d7dd0a88da8a04 100644 --- a/be/src/vec/columns/column_object.h +++ b/be/src/vec/columns/column_object.h @@ -272,12 +272,12 @@ class ColumnObject final : public COWHelper { return subcolumns.get_mutable_root()->data.get_finalized_column_ptr()->assume_mutable(); } - Status serialize_one_row_to_string(int row, std::string* output) const; + Status serialize_one_row_to_string(int64_t row, std::string* output) const; - Status serialize_one_row_to_string(int row, BufferWritable& output) const; + Status serialize_one_row_to_string(int64_t row, BufferWritable& output) const; // serialize one row to json format - Status serialize_one_row_to_json_format(int row, rapidjson::StringBuffer* output, + Status serialize_one_row_to_json_format(int64_t row, rapidjson::StringBuffer* output, bool* is_null) const; // merge multiple sub sparse columns into root diff --git a/be/src/vec/data_types/serde/data_type_array_serde.cpp b/be/src/vec/data_types/serde/data_type_array_serde.cpp index 0d5dea7fc3dcd7..a56eb00dbdd6fb 100644 --- a/be/src/vec/data_types/serde/data_type_array_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_array_serde.cpp @@ -32,14 +32,15 @@ namespace doris { namespace vectorized { class Arena; +#include "common/compile_check_begin.h" -Status DataTypeArraySerDe::serialize_column_to_json(const IColumn& column, int start_idx, - int end_idx, BufferWritable& bw, +Status DataTypeArraySerDe::serialize_column_to_json(const IColumn& column, int64_t start_idx, + int64_t end_idx, BufferWritable& bw, FormatOptions& options) const { SERIALIZE_COLUMN_TO_JSON(); } -Status DataTypeArraySerDe::serialize_one_cell_to_json(const IColumn& column, int row_num, +Status DataTypeArraySerDe::serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const { auto result = check_column_const_set_readability(column, row_num); @@ -193,7 +194,7 @@ Status DataTypeArraySerDe::deserialize_column_from_hive_text_vector( } Status DataTypeArraySerDe::serialize_one_cell_to_hive_text( - const IColumn& column, int row_num, BufferWritable& bw, FormatOptions& options, + const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options, int hive_text_complex_type_delimiter_level) const { auto result = check_column_const_set_readability(column, row_num); ColumnPtr ptr = result.first; @@ -220,8 +221,9 @@ Status DataTypeArraySerDe::serialize_one_cell_to_hive_text( void DataTypeArraySerDe::write_one_cell_to_jsonb(const IColumn& column, JsonbWriter& result, Arena* mem_pool, int32_t col_id, - int row_num) const { - result.writeKey(col_id); + int64_t row_num) const { + // JsonbKeyValue::keyid_type is uint16_t and col_id is int32_t, need a cast + result.writeKey(cast_set(col_id)); const char* begin = nullptr; // maybe serialize_value_into_arena should move to here later. StringRef value = column.serialize_value_into_arena(row_num, *mem_pool, begin); @@ -232,7 +234,7 @@ void DataTypeArraySerDe::write_one_cell_to_jsonb(const IColumn& column, JsonbWri Status DataTypeArraySerDe::write_one_cell_to_json(const IColumn& column, rapidjson::Value& result, rapidjson::Document::AllocatorType& allocator, - Arena& mem_pool, int row_num) const { + Arena& mem_pool, int64_t row_num) const { // Use allocator instead of stack memory, since rapidjson hold the reference of String value // otherwise causes stack use after free auto& column_array = static_cast(column); @@ -273,8 +275,8 @@ void DataTypeArraySerDe::read_one_cell_from_jsonb(IColumn& column, const JsonbVa } void DataTypeArraySerDe::write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, - int end, const cctz::time_zone& ctz) const { + arrow::ArrayBuilder* array_builder, int64_t start, + int64_t end, const cctz::time_zone& ctz) const { auto& array_column = static_cast(column); auto& offsets = array_column.get_offsets(); auto& nested_data = array_column.get_data(); @@ -315,7 +317,7 @@ void DataTypeArraySerDe::read_column_from_arrow(IColumn& column, const arrow::Ar template Status DataTypeArraySerDe::_write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx_of_mysql, bool col_const, + int64_t row_idx_of_mysql, bool col_const, const FormatOptions& options) const { auto& column_array = assert_cast(column); auto& offsets = column_array.get_offsets(); @@ -330,7 +332,7 @@ Status DataTypeArraySerDe::_write_column_to_mysql(const IColumn& column, const auto begin_arr_element = offsets[row_idx_of_col_arr - 1]; const auto end_arr_element = offsets[row_idx_of_col_arr]; - for (int j = begin_arr_element; j < end_arr_element; ++j) { + for (auto j = begin_arr_element; j < end_arr_element; ++j) { if (j != begin_arr_element) { if (0 != result.push_string(", ", 2)) { return Status::InternalError("pack mysql buffer failed."); @@ -364,14 +366,14 @@ Status DataTypeArraySerDe::_write_column_to_mysql(const IColumn& column, } Status DataTypeArraySerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, + MysqlRowBuffer& row_buffer, int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status DataTypeArraySerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, + MysqlRowBuffer& row_buffer, int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); @@ -379,8 +381,9 @@ Status DataTypeArraySerDe::write_column_to_mysql(const IColumn& column, Status DataTypeArraySerDe::write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, - orc::ColumnVectorBatch* orc_col_batch, int start, - int end, std::vector& buffer_list) const { + orc::ColumnVectorBatch* orc_col_batch, int64_t start, + int64_t end, + std::vector& buffer_list) const { auto* cur_batch = dynamic_cast(orc_col_batch); cur_batch->offsets[0] = 0; @@ -401,8 +404,8 @@ Status DataTypeArraySerDe::write_column_to_orc(const std::string& timezone, cons return Status::OK(); } -Status DataTypeArraySerDe::write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const { +Status DataTypeArraySerDe::write_column_to_pb(const IColumn& column, PValues& result, int64_t start, + int64_t end) const { const auto& array_col = assert_cast(column); auto* ptype = result.mutable_type(); ptype->set_id(PGenericType::LIST); diff --git a/be/src/vec/data_types/serde/data_type_array_serde.h b/be/src/vec/data_types/serde/data_type_array_serde.h index 13c40e60777258..5b15f48f502b81 100644 --- a/be/src/vec/data_types/serde/data_type_array_serde.h +++ b/be/src/vec/data_types/serde/data_type_array_serde.h @@ -39,10 +39,10 @@ class DataTypeArraySerDe : public DataTypeSerDe { DataTypeArraySerDe(const DataTypeSerDeSPtr& _nested_serde, int nesting_level = 1) : DataTypeSerDe(nesting_level), nested_serde(_nested_serde) {} - Status serialize_one_cell_to_json(const IColumn& column, int row_num, BufferWritable& bw, + Status serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const override; - Status serialize_column_to_json(const IColumn& column, int start_idx, int end_idx, + Status serialize_column_to_json(const IColumn& column, int64_t start_idx, int64_t end_idx, BufferWritable& bw, FormatOptions& options) const override; Status deserialize_one_cell_from_json(IColumn& column, Slice& slice, @@ -60,40 +60,40 @@ class DataTypeArraySerDe : public DataTypeSerDe { const FormatOptions& options, int hive_text_complex_type_delimiter_level = 1) const override; Status serialize_one_cell_to_hive_text( - const IColumn& column, int row_num, BufferWritable& bw, FormatOptions& options, + const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options, int hive_text_complex_type_delimiter_level = 1) const override; - Status write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const override; + Status write_column_to_pb(const IColumn& column, PValues& result, int64_t start, + int64_t end) const override; Status read_column_from_pb(IColumn& column, const PValues& arg) const override; void write_one_cell_to_jsonb(const IColumn& column, JsonbWriter& result, Arena* mem_pool, - int32_t col_id, int row_num) const override; + int32_t col_id, int64_t row_num) const override; Status write_one_cell_to_json(const IColumn& column, rapidjson::Value& result, rapidjson::Document::AllocatorType& allocator, Arena& mem_pool, - int row_num) const override; + int64_t row_num) const override; Status read_one_cell_from_json(IColumn& column, const rapidjson::Value& result) const override; void read_one_cell_from_jsonb(IColumn& column, const JsonbValue* arg) const override; void write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, int end, + arrow::ArrayBuilder* array_builder, int64_t start, int64_t end, const cctz::time_zone& ctz) const override; void read_column_from_arrow(IColumn& column, const arrow::Array* arrow_array, int start, int end, const cctz::time_zone& ctz) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, orc::ColumnVectorBatch* orc_col_batch, - int start, int end, + int64_t start, int64_t end, std::vector& buffer_list) const override; void set_return_object_as_string(bool value) override { @@ -104,7 +104,8 @@ class DataTypeArraySerDe : public DataTypeSerDe { private: template Status _write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, const FormatOptions& options) const; + int64_t row_idx, bool col_const, + const FormatOptions& options) const; DataTypeSerDeSPtr nested_serde; }; diff --git a/be/src/vec/data_types/serde/data_type_bitmap_serde.cpp b/be/src/vec/data_types/serde/data_type_bitmap_serde.cpp index f52a3d1e9b4858..a4a2367aded65e 100644 --- a/be/src/vec/data_types/serde/data_type_bitmap_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_bitmap_serde.cpp @@ -32,6 +32,7 @@ namespace doris { namespace vectorized { class IColumn; +#include "common/compile_check_begin.h" Status DataTypeBitMapSerDe::deserialize_column_from_json_vector( IColumn& column, std::vector& slices, int* num_deserialized, @@ -52,17 +53,17 @@ Status DataTypeBitMapSerDe::deserialize_one_cell_from_json(IColumn& column, Slic return Status::OK(); } -Status DataTypeBitMapSerDe::write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const { +Status DataTypeBitMapSerDe::write_column_to_pb(const IColumn& column, PValues& result, + int64_t start, int64_t end) const { auto ptype = result.mutable_type(); ptype->set_id(PGenericType::BITMAP); auto& data_column = assert_cast(column); - int row_count = end - start; + auto row_count = cast_set(end - start); result.mutable_bytes_value()->Reserve(row_count); - for (int row = start; row < end; ++row) { + for (auto row = start; row < end; ++row) { auto& value = const_cast(data_column.get_element(row)); std::string memory_buffer; - int bytesize = value.getSizeInBytes(); + auto bytesize = value.getSizeInBytes(); memory_buffer.resize(bytesize); value.write_to(const_cast(memory_buffer.data())); result.add_bytes_value(memory_buffer); @@ -81,14 +82,14 @@ Status DataTypeBitMapSerDe::read_column_from_pb(IColumn& column, const PValues& void DataTypeBitMapSerDe::write_one_cell_to_jsonb(const IColumn& column, JsonbWriter& result, Arena* mem_pool, int32_t col_id, - int row_num) const { - auto& data_column = assert_cast(column); - result.writeKey(col_id); + int64_t row_num) const { + const auto& data_column = assert_cast(column); + result.writeKey(cast_set(col_id)); auto bitmap_value = const_cast(data_column.get_element(row_num)); // serialize the content of string auto size = bitmap_value.getSizeInBytes(); // serialize the content of string - auto ptr = mem_pool->alloc(size); + auto* ptr = mem_pool->alloc(size); bitmap_value.write_to(const_cast(ptr)); result.writeStartBinary(); result.writeBinary(reinterpret_cast(ptr), size); @@ -105,7 +106,7 @@ void DataTypeBitMapSerDe::read_one_cell_from_jsonb(IColumn& column, const JsonbV template Status DataTypeBitMapSerDe::_write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const { auto& data_column = assert_cast(column); if (_return_object_as_string) { @@ -126,23 +127,23 @@ Status DataTypeBitMapSerDe::_write_column_to_mysql(const IColumn& column, } Status DataTypeBitMapSerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, + MysqlRowBuffer& row_buffer, int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status DataTypeBitMapSerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, - bool col_const, + MysqlRowBuffer& row_buffer, + int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status DataTypeBitMapSerDe::write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, - orc::ColumnVectorBatch* orc_col_batch, int start, - int end, + orc::ColumnVectorBatch* orc_col_batch, + int64_t start, int64_t end, std::vector& buffer_list) const { auto& col_data = assert_cast(column); orc::StringVectorBatch* cur_batch = dynamic_cast(orc_col_batch); diff --git a/be/src/vec/data_types/serde/data_type_bitmap_serde.h b/be/src/vec/data_types/serde/data_type_bitmap_serde.h index d4a643b3b163ae..a4be5b8ec204f1 100644 --- a/be/src/vec/data_types/serde/data_type_bitmap_serde.h +++ b/be/src/vec/data_types/serde/data_type_bitmap_serde.h @@ -35,12 +35,12 @@ class DataTypeBitMapSerDe : public DataTypeSerDe { public: DataTypeBitMapSerDe(int nesting_level = 1) : DataTypeSerDe(nesting_level) {}; - Status serialize_one_cell_to_json(const IColumn& column, int row_num, BufferWritable& bw, + Status serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const override { return Status::NotSupported("serialize_one_cell_to_json with type [{}]", column.get_name()); } - Status serialize_column_to_json(const IColumn& column, int start_idx, int end_idx, + Status serialize_column_to_json(const IColumn& column, int64_t start_idx, int64_t end_idx, BufferWritable& bw, FormatOptions& options) const override { return Status::NotSupported("serialize_column_to_json with type [{}]", column.get_name()); } @@ -52,17 +52,17 @@ class DataTypeBitMapSerDe : public DataTypeSerDe { int* num_deserialized, const FormatOptions& options) const override; - Status write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const override; + Status write_column_to_pb(const IColumn& column, PValues& result, int64_t start, + int64_t end) const override; Status read_column_from_pb(IColumn& column, const PValues& arg) const override; void write_one_cell_to_jsonb(const IColumn& column, JsonbWriter& result, Arena* mem_pool, - int32_t col_id, int row_num) const override; + int32_t col_id, int64_t row_num) const override; void read_one_cell_from_jsonb(IColumn& column, const JsonbValue* arg) const override; void write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, int end, + arrow::ArrayBuilder* array_builder, int64_t start, int64_t end, const cctz::time_zone& ctz) const override { throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR, "write_column_to_arrow with type " + column.get_name()); @@ -75,22 +75,23 @@ class DataTypeBitMapSerDe : public DataTypeSerDe { } Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, orc::ColumnVectorBatch* orc_col_batch, - int start, int end, + int64_t start, int64_t end, std::vector& buffer_list) const override; private: // Bitmap is binary data which is not shown by mysql. template Status _write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, const FormatOptions& options) const; + int64_t row_idx, bool col_const, + const FormatOptions& options) const; }; } // namespace vectorized } // namespace doris diff --git a/be/src/vec/data_types/serde/data_type_date64_serde.cpp b/be/src/vec/data_types/serde/data_type_date64_serde.cpp index e749b2fa2e74a0..6cb5b31ae387a2 100644 --- a/be/src/vec/data_types/serde/data_type_date64_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_date64_serde.cpp @@ -26,14 +26,15 @@ namespace doris { namespace vectorized { +#include "common/compile_check_begin.h" -Status DataTypeDate64SerDe::serialize_column_to_json(const IColumn& column, int start_idx, - int end_idx, BufferWritable& bw, +Status DataTypeDate64SerDe::serialize_column_to_json(const IColumn& column, int64_t start_idx, + int64_t end_idx, BufferWritable& bw, FormatOptions& options) const { SERIALIZE_COLUMN_TO_JSON(); } -Status DataTypeDate64SerDe::serialize_one_cell_to_json(const IColumn& column, int row_num, +Status DataTypeDate64SerDe::serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const { auto result = check_column_const_set_readability(column, row_num); @@ -89,12 +90,12 @@ Status DataTypeDate64SerDe::deserialize_one_cell_from_json(IColumn& column, Slic return Status::OK(); } -Status DataTypeDateTimeSerDe::serialize_column_to_json(const IColumn& column, int start_idx, - int end_idx, BufferWritable& bw, +Status DataTypeDateTimeSerDe::serialize_column_to_json(const IColumn& column, int64_t start_idx, + int64_t end_idx, BufferWritable& bw, FormatOptions& options) const { SERIALIZE_COLUMN_TO_JSON()} -Status DataTypeDateTimeSerDe::serialize_one_cell_to_json(const IColumn& column, int row_num, +Status DataTypeDateTimeSerDe::serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const { auto result = check_column_const_set_readability(column, row_num); @@ -159,8 +160,8 @@ Status DataTypeDateTimeSerDe::deserialize_one_cell_from_json(IColumn& column, Sl } void DataTypeDate64SerDe::write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, - int end, const cctz::time_zone& ctz) const { + arrow::ArrayBuilder* array_builder, int64_t start, + int64_t end, const cctz::time_zone& ctz) const { auto& col_data = static_cast&>(column).get_data(); auto& string_builder = assert_cast(*array_builder); for (size_t i = start; i < end; ++i) { @@ -242,7 +243,7 @@ void DataTypeDate64SerDe::read_column_from_arrow(IColumn& column, const arrow::A template Status DataTypeDate64SerDe::_write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const { auto& data = assert_cast&>(column).get_data(); const auto col_index = index_check_const(row_idx, col_const); @@ -267,23 +268,23 @@ Status DataTypeDate64SerDe::_write_column_to_mysql(const IColumn& column, } Status DataTypeDate64SerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, + MysqlRowBuffer& row_buffer, int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status DataTypeDate64SerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, - bool col_const, + MysqlRowBuffer& row_buffer, + int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status DataTypeDate64SerDe::write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, - orc::ColumnVectorBatch* orc_col_batch, int start, - int end, + orc::ColumnVectorBatch* orc_col_batch, + int64_t start, int64_t end, std::vector& buffer_list) const { auto& col_data = static_cast&>(column).get_data(); orc::StringVectorBatch* cur_batch = dynamic_cast(orc_col_batch); diff --git a/be/src/vec/data_types/serde/data_type_date64_serde.h b/be/src/vec/data_types/serde/data_type_date64_serde.h index 497ac2aeff4d5f..c3b97b4273c9cf 100644 --- a/be/src/vec/data_types/serde/data_type_date64_serde.h +++ b/be/src/vec/data_types/serde/data_type_date64_serde.h @@ -45,9 +45,9 @@ class DataTypeDate64SerDe : public DataTypeNumberSerDe { public: DataTypeDate64SerDe(int nesting_level = 1) : DataTypeNumberSerDe(nesting_level) {}; - Status serialize_one_cell_to_json(const IColumn& column, int row_num, BufferWritable& bw, + Status serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const override; - Status serialize_column_to_json(const IColumn& column, int start_idx, int end_idx, + Status serialize_column_to_json(const IColumn& column, int64_t start_idx, int64_t end_idx, BufferWritable& bw, FormatOptions& options) const override; Status deserialize_one_cell_from_json(IColumn& column, Slice& slice, const FormatOptions& options) const override; @@ -57,36 +57,37 @@ class DataTypeDate64SerDe : public DataTypeNumberSerDe { const FormatOptions& options) const override; void write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, int end, + arrow::ArrayBuilder* array_builder, int64_t start, int64_t end, const cctz::time_zone& ctz) const override; void read_column_from_arrow(IColumn& column, const arrow::Array* arrow_array, int start, int end, const cctz::time_zone& ctz) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, orc::ColumnVectorBatch* orc_col_batch, - int start, int end, + int64_t start, int64_t end, std::vector& buffer_list) const override; private: template Status _write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, const FormatOptions& options) const; + int64_t row_idx, bool col_const, + const FormatOptions& options) const; }; class DataTypeDateTimeSerDe : public DataTypeDate64SerDe { public: DataTypeDateTimeSerDe(int nesting_level = 1) : DataTypeDate64SerDe(nesting_level) {}; - Status serialize_column_to_json(const IColumn& column, int start_idx, int end_idx, + Status serialize_column_to_json(const IColumn& column, int64_t start_idx, int64_t end_idx, BufferWritable& bw, FormatOptions& options) const override; - Status serialize_one_cell_to_json(const IColumn& column, int row_num, BufferWritable& bw, + Status serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const override; Status deserialize_one_cell_from_json(IColumn& column, Slice& slice, diff --git a/be/src/vec/data_types/serde/data_type_datetimev2_serde.cpp b/be/src/vec/data_types/serde/data_type_datetimev2_serde.cpp index e231545ba5e0c5..fd030e85fe5e8e 100644 --- a/be/src/vec/data_types/serde/data_type_datetimev2_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_datetimev2_serde.cpp @@ -20,6 +20,7 @@ #include #include // IWYU pragma: keep +#include #include "vec/columns/column_const.h" #include "vec/io/io_helper.h" @@ -33,14 +34,15 @@ enum { namespace doris::vectorized { static const int64_t micr_to_nano_second = 1000; +#include "common/compile_check_begin.h" -Status DataTypeDateTimeV2SerDe::serialize_column_to_json(const IColumn& column, int start_idx, - int end_idx, BufferWritable& bw, +Status DataTypeDateTimeV2SerDe::serialize_column_to_json(const IColumn& column, int64_t start_idx, + int64_t end_idx, BufferWritable& bw, FormatOptions& options) const { SERIALIZE_COLUMN_TO_JSON(); } -Status DataTypeDateTimeV2SerDe::serialize_one_cell_to_json(const IColumn& column, int row_num, +Status DataTypeDateTimeV2SerDe::serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const { auto result = check_column_const_set_readability(column, row_num); @@ -56,7 +58,7 @@ Status DataTypeDateTimeV2SerDe::serialize_one_cell_to_json(const IColumn& column if (options.date_olap_format) { std::string format = "%Y-%m-%d %H:%i:%s.%f"; char buf[30 + SAFE_FORMAT_STRING_MARGIN]; - val.to_format_string_conservative(format.c_str(), format.size(), buf, + val.to_format_string_conservative(format.c_str(), cast_set(format.size()), buf, 30 + SAFE_FORMAT_STRING_MARGIN); std::string s = std::string(buf); bw.write(s.c_str(), s.length()); @@ -81,8 +83,9 @@ Status DataTypeDateTimeV2SerDe::deserialize_one_cell_from_json(IColumn& column, if (options.date_olap_format) { DateV2Value datetimev2_value; std::string date_format = "%Y-%m-%d %H:%i:%s.%f"; - if (datetimev2_value.from_date_format_str(date_format.data(), date_format.size(), - slice.data, slice.size)) { + if (datetimev2_value.from_date_format_str(date_format.data(), + cast_set(date_format.size()), slice.data, + slice.size)) { val = datetimev2_value.to_date_int_val(); } else { val = MIN_DATETIME_V2; @@ -98,8 +101,9 @@ Status DataTypeDateTimeV2SerDe::deserialize_one_cell_from_json(IColumn& column, } void DataTypeDateTimeV2SerDe::write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, - int end, const cctz::time_zone& ctz) const { + arrow::ArrayBuilder* array_builder, + int64_t start, int64_t end, + const cctz::time_zone& ctz) const { const auto& col_data = static_cast&>(column).get_data(); auto& timestamp_builder = assert_cast(*array_builder); for (size_t i = start; i < end; ++i) { @@ -174,7 +178,7 @@ void DataTypeDateTimeV2SerDe::read_column_from_arrow(IColumn& column, template Status DataTypeDateTimeV2SerDe::_write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const { const auto& data = assert_cast&>(column).get_data(); const auto col_index = index_check_const(row_idx, col_const); @@ -199,15 +203,15 @@ Status DataTypeDateTimeV2SerDe::_write_column_to_mysql(const IColumn& column, } Status DataTypeDateTimeV2SerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, - bool col_const, + MysqlRowBuffer& row_buffer, + int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status DataTypeDateTimeV2SerDe::write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } @@ -215,7 +219,7 @@ Status DataTypeDateTimeV2SerDe::write_column_to_mysql(const IColumn& column, Status DataTypeDateTimeV2SerDe::write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, orc::ColumnVectorBatch* orc_col_batch, - int start, int end, + int64_t start, int64_t end, std::vector& buffer_list) const { const auto& col_data = assert_cast&>(column).get_data(); auto* cur_batch = dynamic_cast(orc_col_batch); diff --git a/be/src/vec/data_types/serde/data_type_datetimev2_serde.h b/be/src/vec/data_types/serde/data_type_datetimev2_serde.h index ef4aa6843a068c..484df3df62a3e4 100644 --- a/be/src/vec/data_types/serde/data_type_datetimev2_serde.h +++ b/be/src/vec/data_types/serde/data_type_datetimev2_serde.h @@ -46,10 +46,10 @@ class DataTypeDateTimeV2SerDe : public DataTypeNumberSerDe { DataTypeDateTimeV2SerDe(int scale, int nesting_level = 1) : DataTypeNumberSerDe(nesting_level), scale(scale) {}; - Status serialize_one_cell_to_json(const IColumn& column, int row_num, BufferWritable& bw, + Status serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const override; - Status serialize_column_to_json(const IColumn& column, int start_idx, int end_idx, + Status serialize_column_to_json(const IColumn& column, int64_t start_idx, int64_t end_idx, BufferWritable& bw, FormatOptions& options) const override; Status deserialize_one_cell_from_json(IColumn& column, Slice& slice, @@ -60,21 +60,21 @@ class DataTypeDateTimeV2SerDe : public DataTypeNumberSerDe { const FormatOptions& options) const override; void write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, int end, + arrow::ArrayBuilder* array_builder, int64_t start, int64_t end, const cctz::time_zone& ctz) const override; void read_column_from_arrow(IColumn& column, const arrow::Array* arrow_array, int start, int end, const cctz::time_zone& ctz) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, orc::ColumnVectorBatch* orc_col_batch, - int start, int end, + int64_t start, int64_t end, std::vector& buffer_list) const override; Status deserialize_column_from_fixed_json(IColumn& column, Slice& slice, int rows, @@ -85,7 +85,8 @@ class DataTypeDateTimeV2SerDe : public DataTypeNumberSerDe { private: template Status _write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, const FormatOptions& options) const; + int64_t row_idx, bool col_const, + const FormatOptions& options) const; int scale; }; } // namespace vectorized diff --git a/be/src/vec/data_types/serde/data_type_datev2_serde.cpp b/be/src/vec/data_types/serde/data_type_datev2_serde.cpp index 95109ee408caee..a8455fd1c9eae6 100644 --- a/be/src/vec/data_types/serde/data_type_datev2_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_datev2_serde.cpp @@ -19,6 +19,7 @@ #include +#include #include #include "vec/columns/column_const.h" @@ -29,14 +30,15 @@ namespace vectorized { // This number represents the number of days from 0000-01-01 to 1970-01-01 static const int32_t date_threshold = 719528; +#include "common/compile_check_begin.h" -Status DataTypeDateV2SerDe::serialize_column_to_json(const IColumn& column, int start_idx, - int end_idx, BufferWritable& bw, +Status DataTypeDateV2SerDe::serialize_column_to_json(const IColumn& column, int64_t start_idx, + int64_t end_idx, BufferWritable& bw, FormatOptions& options) const { SERIALIZE_COLUMN_TO_JSON(); } -Status DataTypeDateV2SerDe::serialize_one_cell_to_json(const IColumn& column, int row_num, +Status DataTypeDateV2SerDe::serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const { auto result = check_column_const_set_readability(column, row_num); @@ -81,19 +83,19 @@ Status DataTypeDateV2SerDe::deserialize_one_cell_from_json(IColumn& column, Slic } void DataTypeDateV2SerDe::write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, - int end, const cctz::time_zone& ctz) const { + arrow::ArrayBuilder* array_builder, int64_t start, + int64_t end, const cctz::time_zone& ctz) const { const auto& col_data = static_cast&>(column).get_data(); auto& date32_builder = assert_cast(*array_builder); for (size_t i = start; i < end; ++i) { - int32_t daynr = binary_cast>(col_data[i]).daynr() - - date_threshold; + auto daynr = binary_cast>(col_data[i]).daynr() - + date_threshold; if (null_map && (*null_map)[i]) { checkArrowStatus(date32_builder.AppendNull(), column.get_name(), array_builder->type()->name()); } else { - checkArrowStatus(date32_builder.Append(daynr), column.get_name(), - array_builder->type()->name()); + checkArrowStatus(date32_builder.Append(cast_set(daynr)), + column.get_name(), array_builder->type()->name()); } } } @@ -118,7 +120,7 @@ void DataTypeDateV2SerDe::read_column_from_arrow(IColumn& column, const arrow::A template Status DataTypeDateV2SerDe::_write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const { auto& data = assert_cast&>(column).get_data(); auto col_index = index_check_const(row_idx, col_const); @@ -143,23 +145,23 @@ Status DataTypeDateV2SerDe::_write_column_to_mysql(const IColumn& column, } Status DataTypeDateV2SerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, + MysqlRowBuffer& row_buffer, int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status DataTypeDateV2SerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, - bool col_const, + MysqlRowBuffer& row_buffer, + int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status DataTypeDateV2SerDe::write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, - orc::ColumnVectorBatch* orc_col_batch, int start, - int end, + orc::ColumnVectorBatch* orc_col_batch, + int64_t start, int64_t end, std::vector& buffer_list) const { const auto& col_data = assert_cast&>(column).get_data(); auto* cur_batch = dynamic_cast(orc_col_batch); diff --git a/be/src/vec/data_types/serde/data_type_datev2_serde.h b/be/src/vec/data_types/serde/data_type_datev2_serde.h index 52e4cec364ebb6..c1f8bab15ad004 100644 --- a/be/src/vec/data_types/serde/data_type_datev2_serde.h +++ b/be/src/vec/data_types/serde/data_type_datev2_serde.h @@ -45,9 +45,9 @@ class DataTypeDateV2SerDe : public DataTypeNumberSerDe { public: DataTypeDateV2SerDe(int nesting_level = 1) : DataTypeNumberSerDe(nesting_level) {}; - Status serialize_one_cell_to_json(const IColumn& column, int row_num, BufferWritable& bw, + Status serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const override; - Status serialize_column_to_json(const IColumn& column, int start_idx, int end_idx, + Status serialize_column_to_json(const IColumn& column, int64_t start_idx, int64_t end_idx, BufferWritable& bw, FormatOptions& options) const override; Status deserialize_one_cell_from_json(IColumn& column, Slice& slice, @@ -58,20 +58,20 @@ class DataTypeDateV2SerDe : public DataTypeNumberSerDe { const FormatOptions& options) const override; void write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, int end, + arrow::ArrayBuilder* array_builder, int64_t start, int64_t end, const cctz::time_zone& ctz) const override; void read_column_from_arrow(IColumn& column, const arrow::Array* arrow_array, int start, int end, const cctz::time_zone& ctz) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, orc::ColumnVectorBatch* orc_col_batch, - int start, int end, + int64_t start, int64_t end, std::vector& buffer_list) const override; Status deserialize_column_from_fixed_json(IColumn& column, Slice& slice, int rows, @@ -83,7 +83,8 @@ class DataTypeDateV2SerDe : public DataTypeNumberSerDe { private: template Status _write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, const FormatOptions& options) const; + int64_t row_idx, bool col_const, + const FormatOptions& options) const; }; } // namespace vectorized } // namespace doris 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 acb09ee773ec62..32b08c3990fe16 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 @@ -25,21 +25,23 @@ #include "arrow/type.h" #include "vec/columns/column_decimal.h" #include "vec/common/arithmetic_overflow.h" +#include "vec/core/types.h" #include "vec/io/io_helper.h" namespace doris { namespace vectorized { +// #include "common/compile_check_begin.h" template -Status DataTypeDecimalSerDe::serialize_column_to_json(const IColumn& column, int start_idx, - int end_idx, BufferWritable& bw, +Status DataTypeDecimalSerDe::serialize_column_to_json(const IColumn& column, int64_t start_idx, + int64_t end_idx, BufferWritable& bw, FormatOptions& options) const { SERIALIZE_COLUMN_TO_JSON(); } template -Status DataTypeDecimalSerDe::serialize_one_cell_to_json(const IColumn& column, int row_num, +Status DataTypeDecimalSerDe::serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const { auto result = check_column_const_set_readability(column, row_num); @@ -85,8 +87,9 @@ Status DataTypeDecimalSerDe::deserialize_one_cell_from_json(IColumn& column, template void DataTypeDecimalSerDe::write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, - int end, const cctz::time_zone& ctz) const { + arrow::ArrayBuilder* array_builder, + int64_t start, int64_t end, + const cctz::time_zone& ctz) const { auto& col = reinterpret_cast&>(column); auto& builder = reinterpret_cast(*array_builder); if constexpr (std::is_same_v>) { @@ -101,7 +104,7 @@ void DataTypeDecimalSerDe::write_column_to_arrow(const IColumn& column, const const auto& data_ref = col.get_data_at(i); const PackedInt128* p_value = reinterpret_cast(data_ref.data); int64_t high = (p_value->value) >> 64; - uint64 low = p_value->value; + uint64 low = cast_set((p_value->value) & 0xFFFFFFFFFFFFFFFF); arrow::Decimal128 value(high, low); checkArrowStatus(builder.Append(value), column.get_name(), array_builder->type()->name()); @@ -119,7 +122,7 @@ void DataTypeDecimalSerDe::write_column_to_arrow(const IColumn& column, const const auto& data_ref = col.get_data_at(i); const PackedInt128* p_value = reinterpret_cast(data_ref.data); int64_t high = (p_value->value) >> 64; - uint64 low = p_value->value; + uint64 low = cast_set((p_value->value) & 0xFFFFFFFFFFFFFFFF); arrow::Decimal128 value(high, low); checkArrowStatus(builder.Append(value), column.get_name(), array_builder->type()->name()); @@ -207,7 +210,7 @@ template template Status DataTypeDecimalSerDe::_write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const { auto& data = assert_cast&>(column).get_data(); const auto col_index = index_check_const(row_idx, col_const); @@ -228,8 +231,8 @@ Status DataTypeDecimalSerDe::_write_column_to_mysql(const IColumn& column, template Status DataTypeDecimalSerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, - bool col_const, + MysqlRowBuffer& row_buffer, + int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } @@ -237,7 +240,7 @@ Status DataTypeDecimalSerDe::write_column_to_mysql(const IColumn& column, template Status DataTypeDecimalSerDe::write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } @@ -246,11 +249,11 @@ template Status DataTypeDecimalSerDe::write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, orc::ColumnVectorBatch* orc_col_batch, - int start, int end, + int64_t start, int64_t end, std::vector& buffer_list) const { auto& col_data = assert_cast&>(column).get_data(); - if constexpr (IsDecimal128V2 || IsDecimal128V3) { + if constexpr (IsDecimal128V2 || IsDecimal128V3 || IsDecimal256) { orc::Decimal128VectorBatch* cur_batch = dynamic_cast(orc_col_batch); diff --git a/be/src/vec/data_types/serde/data_type_decimal_serde.h b/be/src/vec/data_types/serde/data_type_decimal_serde.h index dd31c3321afcc9..51867ced18fb04 100644 --- a/be/src/vec/data_types/serde/data_type_decimal_serde.h +++ b/be/src/vec/data_types/serde/data_type_decimal_serde.h @@ -43,6 +43,7 @@ namespace vectorized { template class ColumnDecimal; class Arena; +#include "common/compile_check_begin.h" template class DataTypeDecimalSerDe : public DataTypeSerDe { @@ -76,10 +77,10 @@ class DataTypeDecimalSerDe : public DataTypeSerDe { precision(precision_), scale_multiplier(decimal_scale_multiplier(scale)) {} - Status serialize_one_cell_to_json(const IColumn& column, int row_num, BufferWritable& bw, + Status serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const override; - Status serialize_column_to_json(const IColumn& column, int start_idx, int end_idx, + Status serialize_column_to_json(const IColumn& column, int64_t start_idx, int64_t end_idx, BufferWritable& bw, FormatOptions& options) const override; Status deserialize_one_cell_from_json(IColumn& column, Slice& slice, @@ -89,30 +90,30 @@ class DataTypeDecimalSerDe : public DataTypeSerDe { int* num_deserialized, const FormatOptions& options) const override; - Status write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const override; + Status write_column_to_pb(const IColumn& column, PValues& result, int64_t start, + int64_t end) const override; Status read_column_from_pb(IColumn& column, const PValues& arg) const override; void write_one_cell_to_jsonb(const IColumn& column, JsonbWriter& result, Arena* mem_pool, - int32_t col_id, int row_num) const override; + int32_t col_id, int64_t row_num) const override; void read_one_cell_from_jsonb(IColumn& column, const JsonbValue* arg) const override; void write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, int end, + arrow::ArrayBuilder* array_builder, int64_t start, int64_t end, const cctz::time_zone& ctz) const override; void read_column_from_arrow(IColumn& column, const arrow::Array* arrow_array, int start, int end, const cctz::time_zone& ctz) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, orc::ColumnVectorBatch* orc_col_batch, - int start, int end, + int64_t start, int64_t end, std::vector& buffer_list) const override; Status deserialize_column_from_fixed_json(IColumn& column, Slice& slice, int rows, @@ -124,7 +125,8 @@ class DataTypeDecimalSerDe : public DataTypeSerDe { private: template Status _write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, const FormatOptions& options) const; + int64_t row_idx, bool col_const, + const FormatOptions& options) const; int scale; int precision; @@ -134,8 +136,8 @@ class DataTypeDecimalSerDe : public DataTypeSerDe { template Status DataTypeDecimalSerDe::write_column_to_pb(const IColumn& column, PValues& result, - int start, int end) const { - int row_count = end - start; + int64_t start, int64_t end) const { + auto row_count = cast_set(end - start); const auto* col = check_and_get_column>(column); auto* ptype = result.mutable_type(); if constexpr (std::is_same_v>) { @@ -179,9 +181,9 @@ Status DataTypeDecimalSerDe::read_column_from_pb(IColumn& column, const PValu template void DataTypeDecimalSerDe::write_one_cell_to_jsonb(const IColumn& column, JsonbWriter& result, Arena* mem_pool, int32_t col_id, - int row_num) const { + int64_t row_num) const { StringRef data_ref = column.get_data_at(row_num); - result.writeKey(col_id); + result.writeKey(cast_set(col_id)); if constexpr (std::is_same_v>) { Decimal128V2::NativeType val = *reinterpret_cast(data_ref.data); @@ -229,5 +231,6 @@ void DataTypeDecimalSerDe::read_one_cell_from_jsonb(IColumn& column, "read_one_cell_from_jsonb with type " + column.get_name()); } } +#include "common/compile_check_end.h" } // namespace vectorized } // namespace doris diff --git a/be/src/vec/data_types/serde/data_type_hll_serde.cpp b/be/src/vec/data_types/serde/data_type_hll_serde.cpp index 799e1c15d63b18..c22bb31862e41c 100644 --- a/be/src/vec/data_types/serde/data_type_hll_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_hll_serde.cpp @@ -37,14 +37,15 @@ namespace doris { namespace vectorized { class IColumn; +#include "common/compile_check_begin.h" -Status DataTypeHLLSerDe::serialize_column_to_json(const IColumn& column, int start_idx, int end_idx, - BufferWritable& bw, +Status DataTypeHLLSerDe::serialize_column_to_json(const IColumn& column, int64_t start_idx, + int64_t end_idx, BufferWritable& bw, FormatOptions& options) const { SERIALIZE_COLUMN_TO_JSON(); } -Status DataTypeHLLSerDe::serialize_one_cell_to_json(const IColumn& column, int row_num, +Status DataTypeHLLSerDe::serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const { if (!options._output_object_data) { @@ -89,12 +90,12 @@ Status DataTypeHLLSerDe::deserialize_one_cell_from_json(IColumn& column, Slice& return Status::OK(); } -Status DataTypeHLLSerDe::write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const { +Status DataTypeHLLSerDe::write_column_to_pb(const IColumn& column, PValues& result, int64_t start, + int64_t end) const { auto ptype = result.mutable_type(); ptype->set_id(PGenericType::HLL); auto& data_column = assert_cast(column); - int row_count = end - start; + auto row_count = cast_set(end - start); result.mutable_bytes_value()->Reserve(row_count); for (size_t row_num = start; row_num < end; ++row_num) { auto& value = const_cast(data_column.get_element(row_num)); @@ -115,12 +116,13 @@ Status DataTypeHLLSerDe::read_column_from_pb(IColumn& column, const PValues& arg } void DataTypeHLLSerDe::write_one_cell_to_jsonb(const IColumn& column, JsonbWriter& result, - Arena* mem_pool, int32_t col_id, int row_num) const { - result.writeKey(col_id); - auto& data_column = assert_cast(column); + Arena* mem_pool, int32_t col_id, + int64_t row_num) const { + result.writeKey(cast_set(col_id)); + const auto& data_column = assert_cast(column); auto& hll_value = const_cast(data_column.get_element(row_num)); auto size = hll_value.max_serialized_size(); - auto ptr = reinterpret_cast(mem_pool->alloc(size)); + auto* ptr = reinterpret_cast(mem_pool->alloc(size)); size_t actual_size = hll_value.serialize((uint8_t*)ptr); result.writeStartBinary(); result.writeBinary(reinterpret_cast(ptr), actual_size); @@ -134,8 +136,8 @@ void DataTypeHLLSerDe::read_one_cell_from_jsonb(IColumn& column, const JsonbValu } void DataTypeHLLSerDe::write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, int end, - const cctz::time_zone& ctz) const { + arrow::ArrayBuilder* array_builder, int64_t start, + int64_t end, const cctz::time_zone& ctz) const { const auto& col = assert_cast(column); auto& builder = assert_cast(*array_builder); for (size_t string_i = start; string_i < end; ++string_i) { @@ -156,7 +158,7 @@ void DataTypeHLLSerDe::write_column_to_arrow(const IColumn& column, const NullMa template Status DataTypeHLLSerDe::_write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const { auto& data_column = assert_cast(column); if (_return_object_as_string) { @@ -177,21 +179,22 @@ Status DataTypeHLLSerDe::_write_column_to_mysql(const IColumn& column, } Status DataTypeHLLSerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, + MysqlRowBuffer& row_buffer, int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status DataTypeHLLSerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, + MysqlRowBuffer& row_buffer, int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status DataTypeHLLSerDe::write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, - orc::ColumnVectorBatch* orc_col_batch, int start, - int end, std::vector& buffer_list) const { + orc::ColumnVectorBatch* orc_col_batch, int64_t start, + int64_t end, + std::vector& buffer_list) const { auto& col_data = assert_cast(column); orc::StringVectorBatch* cur_batch = dynamic_cast(orc_col_batch); diff --git a/be/src/vec/data_types/serde/data_type_hll_serde.h b/be/src/vec/data_types/serde/data_type_hll_serde.h index f0cd31b24d2785..36835b22db62c5 100644 --- a/be/src/vec/data_types/serde/data_type_hll_serde.h +++ b/be/src/vec/data_types/serde/data_type_hll_serde.h @@ -35,25 +35,25 @@ class DataTypeHLLSerDe : public DataTypeSerDe { public: DataTypeHLLSerDe(int nesting_level = 1) : DataTypeSerDe(nesting_level) {}; - Status serialize_one_cell_to_json(const IColumn& column, int row_num, BufferWritable& bw, + Status serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const override; - Status serialize_column_to_json(const IColumn& column, int start_idx, int end_idx, + Status serialize_column_to_json(const IColumn& column, int64_t start_idx, int64_t end_idx, BufferWritable& bw, FormatOptions& options) const override; Status deserialize_one_cell_from_json(IColumn& column, Slice& slice, const FormatOptions& options) const override; Status deserialize_column_from_json_vector(IColumn& column, std::vector& slices, int* num_deserialized, const FormatOptions& options) const override; - Status write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const override; + Status write_column_to_pb(const IColumn& column, PValues& result, int64_t start, + int64_t end) const override; Status read_column_from_pb(IColumn& column, const PValues& arg) const override; void write_one_cell_to_jsonb(const IColumn& column, JsonbWriter& result, Arena* mem_pool, - int32_t col_id, int row_num) const override; + int32_t col_id, int64_t row_num) const override; void read_one_cell_from_jsonb(IColumn& column, const JsonbValue* arg) const override; void write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, int end, + arrow::ArrayBuilder* array_builder, int64_t start, int64_t end, const cctz::time_zone& ctz) const override; void read_column_from_arrow(IColumn& column, const arrow::Array* arrow_array, int start, int end, const cctz::time_zone& ctz) const override { @@ -62,22 +62,23 @@ class DataTypeHLLSerDe : public DataTypeSerDe { } Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, orc::ColumnVectorBatch* orc_col_batch, - int start, int end, + int64_t start, int64_t end, std::vector& buffer_list) const override; private: // Hll is binary data which is not shown by mysql. template Status _write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, const FormatOptions& options) const; + int64_t row_idx, bool col_const, + const FormatOptions& options) const; }; } // namespace vectorized } // namespace doris diff --git a/be/src/vec/data_types/serde/data_type_ipv4_serde.cpp b/be/src/vec/data_types/serde/data_type_ipv4_serde.cpp index a2661fa203680a..bd53277d743eae 100644 --- a/be/src/vec/data_types/serde/data_type_ipv4_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_ipv4_serde.cpp @@ -25,11 +25,12 @@ namespace doris { namespace vectorized { +#include "common/compile_check_begin.h" template Status DataTypeIPv4SerDe::_write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const { auto& data = assert_cast&>(column).get_data(); auto col_index = index_check_const(row_idx, col_const); @@ -53,20 +54,20 @@ Status DataTypeIPv4SerDe::_write_column_to_mysql(const IColumn& column, } Status DataTypeIPv4SerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, + MysqlRowBuffer& row_buffer, int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status DataTypeIPv4SerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, + MysqlRowBuffer& row_buffer, int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } -Status DataTypeIPv4SerDe::serialize_one_cell_to_json(const IColumn& column, int row_num, +Status DataTypeIPv4SerDe::serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const { auto result = check_column_const_set_readability(column, row_num); @@ -92,13 +93,13 @@ Status DataTypeIPv4SerDe::deserialize_one_cell_from_json(IColumn& column, Slice& return Status::OK(); } -Status DataTypeIPv4SerDe::write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const { +Status DataTypeIPv4SerDe::write_column_to_pb(const IColumn& column, PValues& result, int64_t start, + int64_t end) const { const auto& column_data = assert_cast(column).get_data(); auto* ptype = result.mutable_type(); ptype->set_id(PGenericType::IPV4); auto* values = result.mutable_uint32_value(); - values->Reserve(end - start); + values->Reserve(cast_set(end - start)); values->Add(column_data.begin() + start, column_data.begin() + end); return Status::OK(); } @@ -114,8 +115,8 @@ Status DataTypeIPv4SerDe::read_column_from_pb(IColumn& column, const PValues& ar } void DataTypeIPv4SerDe::write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, - int end, const cctz::time_zone& ctz) const { + arrow::ArrayBuilder* array_builder, int64_t start, + int64_t end, const cctz::time_zone& ctz) const { const auto& col_data = assert_cast(column).get_data(); auto& int32_builder = assert_cast(*array_builder); auto arrow_null_map = revert_null_map(null_map, start, end); diff --git a/be/src/vec/data_types/serde/data_type_ipv4_serde.h b/be/src/vec/data_types/serde/data_type_ipv4_serde.h index 65bd2469b5bbb2..44093412678165 100644 --- a/be/src/vec/data_types/serde/data_type_ipv4_serde.h +++ b/be/src/vec/data_types/serde/data_type_ipv4_serde.h @@ -43,20 +43,20 @@ class DataTypeIPv4SerDe : public DataTypeNumberSerDe { DataTypeIPv4SerDe(int nesting_level = 1) : DataTypeNumberSerDe(nesting_level) {}; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; - Status serialize_one_cell_to_json(const IColumn& column, int row_num, BufferWritable& bw, + Status serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const override; Status deserialize_one_cell_from_json(IColumn& column, Slice& slice, const FormatOptions& options) const override; - Status write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const override; + Status write_column_to_pb(const IColumn& column, PValues& result, int64_t start, + int64_t end) const override; Status read_column_from_pb(IColumn& column, const PValues& arg) const override; void write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, int end, + arrow::ArrayBuilder* array_builder, int64_t start, int64_t end, const cctz::time_zone& ctz) const override; void read_column_from_arrow(IColumn& column, const arrow::Array* arrow_array, int start, int end, const cctz::time_zone& ctz) const override; @@ -64,7 +64,8 @@ class DataTypeIPv4SerDe : public DataTypeNumberSerDe { private: template Status _write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, const FormatOptions& options) const; + int64_t row_idx, bool col_const, + const FormatOptions& options) const; }; } // namespace vectorized } // namespace doris diff --git a/be/src/vec/data_types/serde/data_type_ipv6_serde.cpp b/be/src/vec/data_types/serde/data_type_ipv6_serde.cpp index 612c9ce42227dd..ac4dbc030432b8 100644 --- a/be/src/vec/data_types/serde/data_type_ipv6_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_ipv6_serde.cpp @@ -19,6 +19,7 @@ #include +#include #include #include "vec/columns/column_const.h" @@ -27,11 +28,12 @@ namespace doris { namespace vectorized { +#include "common/compile_check_begin.h" template Status DataTypeIPv6SerDe::_write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const { auto& data = assert_cast&>(column).get_data(); auto col_index = index_check_const(row_idx, col_const); @@ -55,14 +57,14 @@ Status DataTypeIPv6SerDe::_write_column_to_mysql(const IColumn& column, } Status DataTypeIPv6SerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, + MysqlRowBuffer& row_buffer, int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status DataTypeIPv6SerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, + MysqlRowBuffer& row_buffer, int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); @@ -75,9 +77,10 @@ void DataTypeIPv6SerDe::read_one_cell_from_jsonb(IColumn& column, const JsonbVal void DataTypeIPv6SerDe::write_one_cell_to_jsonb(const IColumn& column, JsonbWriterT& result, - Arena* mem_pool, int col_id, int row_num) const { + Arena* mem_pool, int col_id, + int64_t row_num) const { // we make ipv6 as BinaryValue in jsonb - result.writeKey(col_id); + result.writeKey(cast_set(col_id)); const char* begin = nullptr; // maybe serialize_value_into_arena should move to here later. StringRef value = column.serialize_value_into_arena(row_num, *mem_pool, begin); @@ -86,7 +89,7 @@ void DataTypeIPv6SerDe::write_one_cell_to_jsonb(const IColumn& column, result.writeEndBinary(); } -Status DataTypeIPv6SerDe::serialize_one_cell_to_json(const IColumn& column, int row_num, +Status DataTypeIPv6SerDe::serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const { auto result = check_column_const_set_readability(column, row_num); @@ -112,13 +115,13 @@ Status DataTypeIPv6SerDe::deserialize_one_cell_from_json(IColumn& column, Slice& return Status::OK(); } -Status DataTypeIPv6SerDe::write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const { +Status DataTypeIPv6SerDe::write_column_to_pb(const IColumn& column, PValues& result, int64_t start, + int64_t end) const { const auto& column_data = assert_cast(column); - result.mutable_bytes_value()->Reserve(end - start); + result.mutable_bytes_value()->Reserve(cast_set(end - start)); auto* ptype = result.mutable_type(); ptype->set_id(PGenericType::IPV6); - for (int i = start; i < end; ++i) { + for (auto i = start; i < end; ++i) { const auto& val = column_data.get_data_at(i); result.add_bytes_value(val.data, val.size); } @@ -136,8 +139,8 @@ Status DataTypeIPv6SerDe::read_column_from_pb(IColumn& column, const PValues& ar } void DataTypeIPv6SerDe::write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, - int end, const cctz::time_zone& ctz) const { + arrow::ArrayBuilder* array_builder, int64_t start, + int64_t end, const cctz::time_zone& ctz) const { const auto& col_data = assert_cast(column).get_data(); auto& string_builder = assert_cast(*array_builder); for (size_t i = start; i < end; ++i) { @@ -146,7 +149,8 @@ void DataTypeIPv6SerDe::write_column_to_arrow(const IColumn& column, const NullM array_builder->type()->name()); } else { std::string ipv6_str = IPv6Value::to_string(col_data[i]); - checkArrowStatus(string_builder.Append(ipv6_str.c_str(), ipv6_str.size()), + checkArrowStatus(string_builder.Append(ipv6_str.c_str(), + cast_set(ipv6_str.size())), column.get_name(), array_builder->type()->name()); } } @@ -178,8 +182,9 @@ void DataTypeIPv6SerDe::read_column_from_arrow(IColumn& column, const arrow::Arr Status DataTypeIPv6SerDe::write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, - orc::ColumnVectorBatch* orc_col_batch, int start, - int end, std::vector& buffer_list) const { + orc::ColumnVectorBatch* orc_col_batch, int64_t start, + int64_t end, + std::vector& buffer_list) const { const auto& col_data = assert_cast(column).get_data(); orc::StringVectorBatch* cur_batch = assert_cast(orc_col_batch); char* ptr = (char*)malloc(BUFFER_UNIT_SIZE); diff --git a/be/src/vec/data_types/serde/data_type_ipv6_serde.h b/be/src/vec/data_types/serde/data_type_ipv6_serde.h index d308da418592dd..2634c2efbef3d7 100644 --- a/be/src/vec/data_types/serde/data_type_ipv6_serde.h +++ b/be/src/vec/data_types/serde/data_type_ipv6_serde.h @@ -46,35 +46,36 @@ class DataTypeIPv6SerDe : public DataTypeNumberSerDe { DataTypeIPv6SerDe(int nesting_level = 1) : DataTypeNumberSerDe(nesting_level) {}; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; - Status serialize_one_cell_to_json(const IColumn& column, int row_num, BufferWritable& bw, + Status serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const override; Status deserialize_one_cell_from_json(IColumn& column, Slice& slice, const FormatOptions& options) const override; - Status write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const override; + Status write_column_to_pb(const IColumn& column, PValues& result, int64_t start, + int64_t end) const override; Status read_column_from_pb(IColumn& column, const PValues& arg) const override; Status write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, orc::ColumnVectorBatch* orc_col_batch, - int start, int end, + int64_t start, int64_t end, std::vector& buffer_list) const override; void write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, int end, + arrow::ArrayBuilder* array_builder, int64_t start, int64_t end, const cctz::time_zone& ctz) const override; void read_column_from_arrow(IColumn& column, const arrow::Array* arrow_array, int start, int end, const cctz::time_zone& ctz) const override; void read_one_cell_from_jsonb(IColumn& column, const JsonbValue* arg) const override; void write_one_cell_to_jsonb(const IColumn& column, JsonbWriterT& result, - Arena* mem_pool, int unique_id, int row_num) const override; + Arena* mem_pool, int unique_id, int64_t row_num) const override; private: template Status _write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, const FormatOptions& options) const; + int64_t row_idx, bool col_const, + const FormatOptions& options) const; }; } // namespace vectorized } // namespace doris diff --git a/be/src/vec/data_types/serde/data_type_jsonb_serde.cpp b/be/src/vec/data_types/serde/data_type_jsonb_serde.cpp index 08514a6eea764a..10218e4164d5c1 100644 --- a/be/src/vec/data_types/serde/data_type_jsonb_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_jsonb_serde.cpp @@ -21,6 +21,9 @@ #include #include +#include +#include + #include "arrow/array/builder_binary.h" #include "common/exception.h" #include "common/status.h" @@ -34,11 +37,12 @@ #endif namespace doris { namespace vectorized { +#include "common/compile_check_begin.h" template Status DataTypeJsonbSerDe::_write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const { auto& data = assert_cast(column); const auto col_index = index_check_const(row_idx, col_const); @@ -58,26 +62,26 @@ Status DataTypeJsonbSerDe::_write_column_to_mysql(const IColumn& column, } Status DataTypeJsonbSerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, + MysqlRowBuffer& row_buffer, int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status DataTypeJsonbSerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, + MysqlRowBuffer& row_buffer, int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } -Status DataTypeJsonbSerDe::serialize_column_to_json(const IColumn& column, int start_idx, - int end_idx, BufferWritable& bw, +Status DataTypeJsonbSerDe::serialize_column_to_json(const IColumn& column, int64_t start_idx, + int64_t end_idx, BufferWritable& bw, FormatOptions& options) const { SERIALIZE_COLUMN_TO_JSON(); } -Status DataTypeJsonbSerDe::serialize_one_cell_to_json(const IColumn& column, int row_num, +Status DataTypeJsonbSerDe::serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const { auto result = check_column_const_set_readability(column, row_num); @@ -114,8 +118,8 @@ Status DataTypeJsonbSerDe::deserialize_one_cell_from_json(IColumn& column, Slice } void DataTypeJsonbSerDe::write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, - int end, const cctz::time_zone& ctz) const { + arrow::ArrayBuilder* array_builder, int64_t start, + int64_t end, const cctz::time_zone& ctz) const { const auto& string_column = assert_cast(column); auto& builder = assert_cast(*array_builder); for (size_t string_i = start; string_i < end; ++string_i) { @@ -127,15 +131,17 @@ void DataTypeJsonbSerDe::write_column_to_arrow(const IColumn& column, const Null std::string_view string_ref = string_column.get_data_at(string_i).to_string_view(); std::string json_string = JsonbToJson::jsonb_to_json_string(string_ref.data(), string_ref.size()); - checkArrowStatus(builder.Append(json_string.data(), json_string.size()), column.get_name(), - array_builder->type()->name()); + checkArrowStatus(builder.Append(json_string.data(), + cast_set(json_string.size())), + column.get_name(), array_builder->type()->name()); } } Status DataTypeJsonbSerDe::write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, - orc::ColumnVectorBatch* orc_col_batch, int start, - int end, std::vector& buffer_list) const { + orc::ColumnVectorBatch* orc_col_batch, int64_t start, + int64_t end, + std::vector& buffer_list) const { return Status::NotSupported("write_column_to_orc with type [{}]", column.get_name()); } @@ -208,7 +214,7 @@ void convert_jsonb_to_rapidjson(const JsonbValue& val, rapidjson::Value& target, Status DataTypeJsonbSerDe::write_one_cell_to_json(const IColumn& column, rapidjson::Value& result, rapidjson::Document::AllocatorType& allocator, - Arena& mem_pool, int row_num) const { + Arena& mem_pool, int64_t row_num) const { const auto& data = assert_cast(column); const auto jsonb_val = data.get_data_at(row_num); if (jsonb_val.empty()) { @@ -242,10 +248,10 @@ Status DataTypeJsonbSerDe::read_one_cell_from_json(IColumn& column, parser.getWriter().getOutput()->getSize()); return Status::OK(); } -Status DataTypeJsonbSerDe::write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const { +Status DataTypeJsonbSerDe::write_column_to_pb(const IColumn& column, PValues& result, int64_t start, + int64_t end) const { const auto& string_column = assert_cast(column); - result.mutable_string_value()->Reserve(end - start); + result.mutable_string_value()->Reserve(cast_set(end - start)); auto* ptype = result.mutable_type(); ptype->set_id(PGenericType::JSONB); for (size_t row_num = start; row_num < end; ++row_num) { diff --git a/be/src/vec/data_types/serde/data_type_jsonb_serde.h b/be/src/vec/data_types/serde/data_type_jsonb_serde.h index f1c5969f4c0749..5080b1ba46ed3c 100644 --- a/be/src/vec/data_types/serde/data_type_jsonb_serde.h +++ b/be/src/vec/data_types/serde/data_type_jsonb_serde.h @@ -38,18 +38,18 @@ class DataTypeJsonbSerDe : public DataTypeStringSerDe { DataTypeJsonbSerDe(int nesting_level = 1) : DataTypeStringSerDe(nesting_level) {}; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; void write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, int end, + arrow::ArrayBuilder* array_builder, int64_t start, int64_t end, const cctz::time_zone& ctz) const override; - Status serialize_one_cell_to_json(const IColumn& column, int row_num, BufferWritable& bw, + Status serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const override; - Status serialize_column_to_json(const IColumn& column, int start_idx, int end_idx, + Status serialize_column_to_json(const IColumn& column, int64_t start_idx, int64_t end_idx, BufferWritable& bw, FormatOptions& options) const override; Status deserialize_one_cell_from_json(IColumn& column, Slice& slice, @@ -61,20 +61,21 @@ class DataTypeJsonbSerDe : public DataTypeStringSerDe { Status write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, orc::ColumnVectorBatch* orc_col_batch, - int start, int end, + int64_t start, int64_t end, std::vector& buffer_list) const override; Status write_one_cell_to_json(const IColumn& column, rapidjson::Value& result, rapidjson::Document::AllocatorType& allocator, Arena& mem_pool, - int row_num) const override; + int64_t row_num) const override; Status read_one_cell_from_json(IColumn& column, const rapidjson::Value& result) const override; - Status write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const override; + Status write_column_to_pb(const IColumn& column, PValues& result, int64_t start, + int64_t end) const override; Status read_column_from_pb(IColumn& column, const PValues& arg) const override; private: template Status _write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, const FormatOptions& options) const; + int64_t row_idx, bool col_const, + const FormatOptions& options) const; }; void convert_jsonb_to_rapidjson(const JsonbValue& val, rapidjson::Value& target, diff --git a/be/src/vec/data_types/serde/data_type_map_serde.cpp b/be/src/vec/data_types/serde/data_type_map_serde.cpp index 2140885942d1d9..e6b641ee6c9528 100644 --- a/be/src/vec/data_types/serde/data_type_map_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_map_serde.cpp @@ -30,14 +30,14 @@ namespace doris { namespace vectorized { class Arena; - -Status DataTypeMapSerDe::serialize_column_to_json(const IColumn& column, int start_idx, int end_idx, - BufferWritable& bw, +#include "common/compile_check_begin.h" +Status DataTypeMapSerDe::serialize_column_to_json(const IColumn& column, int64_t start_idx, + int64_t end_idx, BufferWritable& bw, FormatOptions& options) const { SERIALIZE_COLUMN_TO_JSON(); } -Status DataTypeMapSerDe::serialize_one_cell_to_json(const IColumn& column, int row_num, +Status DataTypeMapSerDe::serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const { auto result = check_column_const_set_readability(column, row_num); @@ -143,7 +143,7 @@ Status DataTypeMapSerDe::deserialize_column_from_hive_text_vector( } Status DataTypeMapSerDe::serialize_one_cell_to_hive_text( - const IColumn& column, int row_num, BufferWritable& bw, FormatOptions& options, + const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options, int hive_text_complex_type_delimiter_level) const { auto result = check_column_const_set_readability(column, row_num); ColumnPtr ptr = result.first; @@ -319,8 +319,9 @@ void DataTypeMapSerDe::read_one_cell_from_jsonb(IColumn& column, const JsonbValu } void DataTypeMapSerDe::write_one_cell_to_jsonb(const IColumn& column, JsonbWriter& result, - Arena* mem_pool, int32_t col_id, int row_num) const { - result.writeKey(col_id); + Arena* mem_pool, int32_t col_id, + int64_t row_num) const { + result.writeKey(cast_set(col_id)); const char* begin = nullptr; // maybe serialize_value_into_arena should move to here later. StringRef value = column.serialize_value_into_arena(row_num, *mem_pool, begin); @@ -330,8 +331,8 @@ void DataTypeMapSerDe::write_one_cell_to_jsonb(const IColumn& column, JsonbWrite } void DataTypeMapSerDe::write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, int end, - const cctz::time_zone& ctz) const { + arrow::ArrayBuilder* array_builder, int64_t start, + int64_t end, const cctz::time_zone& ctz) const { auto& builder = assert_cast(*array_builder); auto& map_column = assert_cast(column); const IColumn& nested_keys_column = map_column.get_keys(); @@ -402,7 +403,7 @@ void DataTypeMapSerDe::read_column_from_arrow(IColumn& column, const arrow::Arra template Status DataTypeMapSerDe::_write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const { auto& map_column = assert_cast(column); const IColumn& nested_keys_column = map_column.get_keys(); @@ -472,21 +473,22 @@ Status DataTypeMapSerDe::_write_column_to_mysql(const IColumn& column, } Status DataTypeMapSerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, + MysqlRowBuffer& row_buffer, int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status DataTypeMapSerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, + MysqlRowBuffer& row_buffer, int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status DataTypeMapSerDe::write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, - orc::ColumnVectorBatch* orc_col_batch, int start, - int end, std::vector& buffer_list) const { + orc::ColumnVectorBatch* orc_col_batch, int64_t start, + int64_t end, + std::vector& buffer_list) const { auto* cur_batch = dynamic_cast(orc_col_batch); cur_batch->offsets[0] = 0; @@ -514,8 +516,8 @@ Status DataTypeMapSerDe::write_column_to_orc(const std::string& timezone, const return Status::OK(); } -Status DataTypeMapSerDe::write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const { +Status DataTypeMapSerDe::write_column_to_pb(const IColumn& column, PValues& result, int64_t start, + int64_t end) const { const auto& map_column = assert_cast(column); auto* ptype = result.mutable_type(); ptype->set_id(PGenericType::MAP); diff --git a/be/src/vec/data_types/serde/data_type_map_serde.h b/be/src/vec/data_types/serde/data_type_map_serde.h index 5e10a7ec3f2a20..599533eb4d0951 100644 --- a/be/src/vec/data_types/serde/data_type_map_serde.h +++ b/be/src/vec/data_types/serde/data_type_map_serde.h @@ -33,6 +33,7 @@ class JsonbValue; namespace vectorized { class IColumn; class Arena; +#include "common/compile_check_begin.h" class DataTypeMapSerDe : public DataTypeSerDe { public: @@ -40,9 +41,9 @@ class DataTypeMapSerDe : public DataTypeSerDe { int nesting_level = 1) : DataTypeSerDe(nesting_level), key_serde(_key_serde), value_serde(_value_serde) {} - Status serialize_one_cell_to_json(const IColumn& column, int row_num, BufferWritable& bw, + Status serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const override; - Status serialize_column_to_json(const IColumn& column, int start_idx, int end_idx, + Status serialize_column_to_json(const IColumn& column, int64_t start_idx, int64_t end_idx, BufferWritable& bw, FormatOptions& options) const override; Status deserialize_one_cell_from_json(IColumn& column, Slice& slice, const FormatOptions& options) const override; @@ -61,32 +62,32 @@ class DataTypeMapSerDe : public DataTypeSerDe { int hive_text_complex_type_delimiter_level = 1) const override; Status serialize_one_cell_to_hive_text( - const IColumn& column, int row_num, BufferWritable& bw, FormatOptions& options, + const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options, int hive_text_complex_type_delimiter_level = 1) const override; - Status write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const override; + Status write_column_to_pb(const IColumn& column, PValues& result, int64_t start, + int64_t end) const override; Status read_column_from_pb(IColumn& column, const PValues& arg) const override; void write_one_cell_to_jsonb(const IColumn& column, JsonbWriter& result, Arena* mem_pool, - int32_t col_id, int row_num) const override; + int32_t col_id, int64_t row_num) const override; void read_one_cell_from_jsonb(IColumn& column, const JsonbValue* arg) const override; void write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, int end, + arrow::ArrayBuilder* array_builder, int64_t start, int64_t end, const cctz::time_zone& ctz) const override; void read_column_from_arrow(IColumn& column, const arrow::Array* arrow_array, int start, int end, const cctz::time_zone& ctz) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, orc::ColumnVectorBatch* orc_col_batch, - int start, int end, + int64_t start, int64_t end, std::vector& buffer_list) const override; void set_return_object_as_string(bool value) override { @@ -98,10 +99,12 @@ class DataTypeMapSerDe : public DataTypeSerDe { private: template Status _write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, const FormatOptions& options) const; + int64_t row_idx, bool col_const, + const FormatOptions& options) const; DataTypeSerDeSPtr key_serde; DataTypeSerDeSPtr value_serde; }; +#include "common/compile_check_end.h" } // namespace vectorized } // namespace doris diff --git a/be/src/vec/data_types/serde/data_type_nothing_serde.h b/be/src/vec/data_types/serde/data_type_nothing_serde.h index b39c3b5776ece4..7bf7d2e64314cc 100644 --- a/be/src/vec/data_types/serde/data_type_nothing_serde.h +++ b/be/src/vec/data_types/serde/data_type_nothing_serde.h @@ -38,12 +38,12 @@ class DataTypeNothingSerde : public DataTypeSerDe { public: DataTypeNothingSerde() = default; - Status serialize_one_cell_to_json(const IColumn& column, int row_num, BufferWritable& bw, + Status serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const override { return Status::NotSupported("serialize_one_cell_to_json with type " + column.get_name()); } - Status serialize_column_to_json(const IColumn& column, int start_idx, int end_idx, + Status serialize_column_to_json(const IColumn& column, int64_t start_idx, int64_t end_idx, BufferWritable& bw, FormatOptions& options) const override { return Status::NotSupported("serialize_column_to_json with type [{}]", column.get_name()); } @@ -59,15 +59,15 @@ class DataTypeNothingSerde : public DataTypeSerDe { column.get_name()); } - Status write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const override { + Status write_column_to_pb(const IColumn& column, PValues& result, int64_t start, + int64_t end) const override { return Status::NotSupported("write_column_to_pb with type " + column.get_name()); } Status read_column_from_pb(IColumn& column, const PValues& arg) const override { return Status::NotSupported("read_column_from_pb with type " + column.get_name()); } void write_one_cell_to_jsonb(const IColumn& column, JsonbWriter& result, Arena* mem_pool, - int32_t col_id, int row_num) const override { + int32_t col_id, int64_t row_num) const override { throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR, "write_one_cell_to_jsonb with type " + column.get_name()); } @@ -78,7 +78,7 @@ class DataTypeNothingSerde : public DataTypeSerDe { } void write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, int end, + arrow::ArrayBuilder* array_builder, int64_t start, int64_t end, const cctz::time_zone& ctz) const override { throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR, "write_column_to_arrow with type " + column.get_name()); @@ -90,20 +90,20 @@ class DataTypeNothingSerde : public DataTypeSerDe { } Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override { return Status::NotSupported("write_column_to_mysql with type " + column.get_name()); } Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override { return Status::NotSupported("write_column_to_mysql with type " + column.get_name()); } Status write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, orc::ColumnVectorBatch* orc_col_batch, - int start, int end, + int64_t start, int64_t end, std::vector& buffer_list) const override { return Status::NotSupported("write_column_to_orc with type " + column.get_name()); } diff --git a/be/src/vec/data_types/serde/data_type_nullable_serde.cpp b/be/src/vec/data_types/serde/data_type_nullable_serde.cpp index 3b46e0e784f8f3..f21f160fb0a891 100644 --- a/be/src/vec/data_types/serde/data_type_nullable_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_nullable_serde.cpp @@ -39,14 +39,14 @@ namespace doris { namespace vectorized { class Arena; - -Status DataTypeNullableSerDe::serialize_column_to_json(const IColumn& column, int start_idx, - int end_idx, BufferWritable& bw, +#include "common/compile_check_begin.h" +Status DataTypeNullableSerDe::serialize_column_to_json(const IColumn& column, int64_t start_idx, + int64_t end_idx, BufferWritable& bw, FormatOptions& options) const { SERIALIZE_COLUMN_TO_JSON(); } -Status DataTypeNullableSerDe::serialize_one_cell_to_json(const IColumn& column, int row_num, +Status DataTypeNullableSerDe::serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const { auto result = check_column_const_set_readability(column, row_num); @@ -80,7 +80,7 @@ Status DataTypeNullableSerDe::deserialize_column_from_json_vector( } Status DataTypeNullableSerDe::serialize_one_cell_to_hive_text( - const IColumn& column, int row_num, BufferWritable& bw, FormatOptions& options, + const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options, int hive_text_complex_type_delimiter_level) const { auto result = check_column_const_set_readability(column, row_num); ColumnPtr ptr = result.first; @@ -221,9 +221,9 @@ Status DataTypeNullableSerDe::deserialize_one_cell_from_json(IColumn& column, Sl return Status::OK(); } -Status DataTypeNullableSerDe::write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const { - int row_count = end - start; +Status DataTypeNullableSerDe::write_column_to_pb(const IColumn& column, PValues& result, + int64_t start, int64_t end) const { + auto row_count = cast_set(end - start); const auto& nullable_col = assert_cast(column); const auto& null_col = nullable_col.get_null_map_column(); if (nullable_col.has_null(row_count)) { @@ -262,9 +262,9 @@ Status DataTypeNullableSerDe::read_column_from_pb(IColumn& column, const PValues void DataTypeNullableSerDe::write_one_cell_to_jsonb(const IColumn& column, JsonbWriter& result, Arena* mem_pool, int32_t col_id, - int row_num) const { + int64_t row_num) const { auto& nullable_col = assert_cast(column); - result.writeKey(col_id); + result.writeKey(cast_set(col_id)); if (nullable_col.is_null_at(row_num)) { result.writeNull(); } else { @@ -289,8 +289,8 @@ void DataTypeNullableSerDe::read_one_cell_from_jsonb(IColumn& column, const Json 2/ pass the arrow null byteamp to nested column , and call AppendValues **/ void DataTypeNullableSerDe::write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, - int end, const cctz::time_zone& ctz) const { + arrow::ArrayBuilder* array_builder, int64_t start, + int64_t end, const cctz::time_zone& ctz) const { const auto& column_nullable = assert_cast(column); nested_serde->write_column_to_arrow(column_nullable.get_nested_column(), &column_nullable.get_null_map_data(), array_builder, start, @@ -313,7 +313,7 @@ void DataTypeNullableSerDe::read_column_from_arrow(IColumn& column, const arrow: template Status DataTypeNullableSerDe::_write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const { const auto& col = assert_cast(column); const auto col_index = index_check_const(row_idx, col_const); @@ -330,23 +330,23 @@ Status DataTypeNullableSerDe::_write_column_to_mysql(const IColumn& column, } Status DataTypeNullableSerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, - bool col_const, + MysqlRowBuffer& row_buffer, + int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status DataTypeNullableSerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, - bool col_const, + MysqlRowBuffer& row_buffer, + int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status DataTypeNullableSerDe::write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, - orc::ColumnVectorBatch* orc_col_batch, int start, - int end, + orc::ColumnVectorBatch* orc_col_batch, + int64_t start, int64_t end, std::vector& buffer_list) const { const auto& column_nullable = assert_cast(column); orc_col_batch->hasNulls = true; @@ -367,7 +367,7 @@ Status DataTypeNullableSerDe::write_column_to_orc(const std::string& timezone, Status DataTypeNullableSerDe::write_one_cell_to_json(const IColumn& column, rapidjson::Value& result, rapidjson::Document::AllocatorType& allocator, - Arena& mem_pool, int row_num) const { + Arena& mem_pool, int64_t row_num) const { auto& col = static_cast(column); auto& nested_col = col.get_nested_column(); if (col.is_null_at(row_num)) { diff --git a/be/src/vec/data_types/serde/data_type_nullable_serde.h b/be/src/vec/data_types/serde/data_type_nullable_serde.h index e9af344fb65f75..6051c7f722d62a 100644 --- a/be/src/vec/data_types/serde/data_type_nullable_serde.h +++ b/be/src/vec/data_types/serde/data_type_nullable_serde.h @@ -30,15 +30,15 @@ class JsonbValue; namespace vectorized { class IColumn; class Arena; - +#include "common/compile_check_begin.h" class DataTypeNullableSerDe : public DataTypeSerDe { public: DataTypeNullableSerDe(const DataTypeSerDeSPtr& _nested_serde, int nesting_level = 1) : DataTypeSerDe(nesting_level), nested_serde(_nested_serde) {} - Status serialize_one_cell_to_json(const IColumn& column, int row_num, BufferWritable& bw, + Status serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const override; - Status serialize_column_to_json(const IColumn& column, int start_idx, int end_idx, + Status serialize_column_to_json(const IColumn& column, int64_t start_idx, int64_t end_idx, BufferWritable& bw, FormatOptions& options) const override; Status deserialize_one_cell_from_json(IColumn& column, Slice& slice, const FormatOptions& options) const override; @@ -60,33 +60,33 @@ class DataTypeNullableSerDe : public DataTypeSerDe { int hive_text_complex_type_delimiter_level = 1) const override; Status serialize_one_cell_to_hive_text( - const IColumn& column, int row_num, BufferWritable& bw, FormatOptions& options, + const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options, int hive_text_complex_type_delimiter_level = 1) const override; - Status write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const override; + Status write_column_to_pb(const IColumn& column, PValues& result, int64_t start, + int64_t end) const override; Status read_column_from_pb(IColumn& column, const PValues& arg) const override; void write_one_cell_to_jsonb(const IColumn& column, JsonbWriter& result, Arena* mem_pool, - int32_t col_id, int row_num) const override; + int32_t col_id, int64_t row_num) const override; void read_one_cell_from_jsonb(IColumn& column, const JsonbValue* arg) const override; void write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, int end, + arrow::ArrayBuilder* array_builder, int64_t start, int64_t end, const cctz::time_zone& ctz) const override; void read_column_from_arrow(IColumn& column, const arrow::Array* arrow_array, int start, int end, const cctz::time_zone& ctz) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, orc::ColumnVectorBatch* orc_col_batch, - int start, int end, + int64_t start, int64_t end, std::vector& buffer_list) const override; void set_return_object_as_string(bool value) override { @@ -96,15 +96,17 @@ class DataTypeNullableSerDe : public DataTypeSerDe { Status write_one_cell_to_json(const IColumn& column, rapidjson::Value& result, rapidjson::Document::AllocatorType& allocator, Arena& mem_pool, - int row_num) const override; + int64_t row_num) const override; Status read_one_cell_from_json(IColumn& column, const rapidjson::Value& result) const override; private: template Status _write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, const FormatOptions& options) const; + int64_t row_idx, bool col_const, + const FormatOptions& options) const; DataTypeSerDeSPtr nested_serde; }; +#include "common/compile_check_end.h" } // namespace vectorized } // namespace doris diff --git a/be/src/vec/data_types/serde/data_type_number_serde.cpp b/be/src/vec/data_types/serde/data_type_number_serde.cpp index f4fb6bbbb1f9cf..9416fc9a8b3020 100644 --- a/be/src/vec/data_types/serde/data_type_number_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_number_serde.cpp @@ -30,7 +30,7 @@ namespace doris { namespace vectorized { - +#include "common/compile_check_begin.h" // Type map的基本结构 template struct TypeMap { @@ -71,8 +71,9 @@ using DORIS_NUMERIC_ARROW_BUILDER = template void DataTypeNumberSerDe::write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, - int end, const cctz::time_zone& ctz) const { + arrow::ArrayBuilder* array_builder, + int64_t start, int64_t end, + const cctz::time_zone& ctz) const { auto& col_data = assert_cast(column).get_data(); using ARROW_BUILDER_TYPE = typename TypeMapLookup::ValueType; auto arrow_null_map = revert_null_map(null_map, start, end); @@ -102,8 +103,10 @@ void DataTypeNumberSerDe::write_column_to_arrow(const IColumn& column, const checkArrowStatus(string_builder.AppendNull(), column.get_name(), array_builder->type()->name()); } else { - checkArrowStatus(string_builder.Append(value_str.data(), value_str.length()), - column.get_name(), array_builder->type()->name()); + checkArrowStatus( + string_builder.Append(value_str.data(), + cast_set(value_str.length())), + column.get_name(), array_builder->type()->name()); } } } else if constexpr (std::is_same_v || std::is_same_v) { @@ -153,14 +156,14 @@ Status DataTypeNumberSerDe::deserialize_one_cell_from_json(IColumn& column, S } template -Status DataTypeNumberSerDe::serialize_column_to_json(const IColumn& column, int start_idx, - int end_idx, BufferWritable& bw, +Status DataTypeNumberSerDe::serialize_column_to_json(const IColumn& column, int64_t start_idx, + int64_t end_idx, BufferWritable& bw, FormatOptions& options) const { SERIALIZE_COLUMN_TO_JSON(); } template -Status DataTypeNumberSerDe::serialize_one_cell_to_json(const IColumn& column, int row_num, +Status DataTypeNumberSerDe::serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const { auto result = check_column_const_set_readability(column, row_num); @@ -266,7 +269,7 @@ template template Status DataTypeNumberSerDe::_write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const { int buf_ret = 0; auto& data = assert_cast(column).get_data(); @@ -305,16 +308,16 @@ Status DataTypeNumberSerDe::_write_column_to_mysql(const IColumn& column, template Status DataTypeNumberSerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, - bool col_const, + MysqlRowBuffer& row_buffer, + int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } template Status DataTypeNumberSerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, - bool col_const, + MysqlRowBuffer& row_buffer, + int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } @@ -331,8 +334,8 @@ Status DataTypeNumberSerDe::write_column_to_mysql(const IColumn& column, template Status DataTypeNumberSerDe::write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, - orc::ColumnVectorBatch* orc_col_batch, int start, - int end, + orc::ColumnVectorBatch* orc_col_batch, + int64_t start, int64_t end, std::vector& buffer_list) const { auto& col_data = assert_cast(column).get_data(); diff --git a/be/src/vec/data_types/serde/data_type_number_serde.h b/be/src/vec/data_types/serde/data_type_number_serde.h index 69fdd6e045e1f7..203cd9dbf46d67 100644 --- a/be/src/vec/data_types/serde/data_type_number_serde.h +++ b/be/src/vec/data_types/serde/data_type_number_serde.h @@ -38,7 +38,7 @@ namespace doris { class JsonbOutStream; - +#include "common/compile_check_begin.h" namespace vectorized { class Arena; @@ -59,9 +59,9 @@ class DataTypeNumberSerDe : public DataTypeSerDe { DataTypeNumberSerDe(int nesting_level = 1) : DataTypeSerDe(nesting_level) {}; - Status serialize_one_cell_to_json(const IColumn& column, int row_num, BufferWritable& bw, + Status serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const override; - Status serialize_column_to_json(const IColumn& column, int start_idx, int end_idx, + Status serialize_column_to_json(const IColumn& column, int64_t start_idx, int64_t end_idx, BufferWritable& bw, FormatOptions& options) const override; Status deserialize_one_cell_from_json(IColumn& column, Slice& slice, const FormatOptions& options) const override; @@ -76,55 +76,66 @@ class DataTypeNumberSerDe : public DataTypeSerDe { void insert_column_last_value_multiple_times(IColumn& column, int times) const override; - Status write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const override; + Status write_column_to_pb(const IColumn& column, PValues& result, int64_t start, + int64_t end) const override; Status read_column_from_pb(IColumn& column, const PValues& arg) const override; void write_one_cell_to_jsonb(const IColumn& column, JsonbWriter& result, Arena* mem_pool, - int32_t col_id, int row_num) const override; + int32_t col_id, int64_t row_num) const override; void read_one_cell_from_jsonb(IColumn& column, const JsonbValue* arg) const override; void write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, int end, + arrow::ArrayBuilder* array_builder, int64_t start, int64_t end, const cctz::time_zone& ctz) const override; void read_column_from_arrow(IColumn& column, const arrow::Array* arrow_array, int start, int end, const cctz::time_zone& ctz) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, orc::ColumnVectorBatch* orc_col_batch, - int start, int end, + int64_t start, int64_t end, std::vector& buffer_list) const override; Status write_one_cell_to_json(const IColumn& column, rapidjson::Value& result, rapidjson::Document::AllocatorType& allocator, Arena& mem_pool, - int row_num) const override; + int64_t row_num) const override; Status read_one_cell_from_json(IColumn& column, const rapidjson::Value& result) const override; private: template Status _write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, const FormatOptions& options) const; + int64_t row_idx, bool col_const, + const FormatOptions& options) const; }; template Status DataTypeNumberSerDe::read_column_from_pb(IColumn& column, const PValues& arg) const { auto old_column_size = column.size(); - if constexpr (std::is_same_v || std::is_same_v || - std::is_same_v) { + if constexpr (std::is_same_v || std::is_same_v) { + column.resize(old_column_size + arg.uint32_value_size()); + auto& data = assert_cast(column).get_data(); + for (int i = 0; i < arg.uint32_value_size(); ++i) { + data[old_column_size + i] = cast_set(arg.uint32_value(i)); + } + } else if constexpr (std::is_same_v) { column.resize(old_column_size + arg.uint32_value_size()); auto& data = assert_cast(column).get_data(); for (int i = 0; i < arg.uint32_value_size(); ++i) { data[old_column_size + i] = arg.uint32_value(i); } - } else if constexpr (std::is_same_v || std::is_same_v || - std::is_same_v) { + } else if constexpr (std::is_same_v || std::is_same_v) { + column.resize(old_column_size + arg.int32_value_size()); + auto& data = reinterpret_cast(column).get_data(); + for (int i = 0; i < arg.int32_value_size(); ++i) { + data[old_column_size + i] = cast_set(arg.int32_value(i)); + } + } else if constexpr (std::is_same_v) { column.resize(old_column_size + arg.int32_value_size()); auto& data = reinterpret_cast(column).get_data(); for (int i = 0; i < arg.int32_value_size(); ++i) { @@ -167,9 +178,9 @@ Status DataTypeNumberSerDe::read_column_from_pb(IColumn& column, const PValue } template -Status DataTypeNumberSerDe::write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const { - int row_count = end - start; +Status DataTypeNumberSerDe::write_column_to_pb(const IColumn& column, PValues& result, + int64_t start, int64_t end) const { + auto row_count = cast_set(end - start); auto* ptype = result.mutable_type(); const auto* col = check_and_get_column>(column); if constexpr (std::is_same_v) { @@ -265,8 +276,8 @@ template void DataTypeNumberSerDe::write_one_cell_to_jsonb(const IColumn& column, JsonbWriterT& result, Arena* mem_pool, int32_t col_id, - int row_num) const { - result.writeKey(col_id); + int64_t row_num) const { + result.writeKey(cast_set(col_id)); StringRef data_ref = column.get_data_at(row_num); // TODO: Casting unsigned integers to signed integers may result in loss of data precision. // However, as Doris currently does not support unsigned integers, only the boolean type uses @@ -303,7 +314,7 @@ template Status DataTypeNumberSerDe::write_one_cell_to_json(const IColumn& column, rapidjson::Value& result, rapidjson::Document::AllocatorType& allocator, - Arena& mem_pool, int row_num) const { + Arena& mem_pool, int64_t row_num) const { const auto& data = reinterpret_cast(column).get_data(); if constexpr (std::is_same_v || std::is_same_v || std::is_same_v) { result.SetInt(data[row_num]); @@ -358,6 +369,6 @@ Status DataTypeNumberSerDe::read_one_cell_from_json(IColumn& column, } return Status::OK(); } - +#include "common/compile_check_end.h" } // namespace vectorized } // namespace doris diff --git a/be/src/vec/data_types/serde/data_type_object_serde.cpp b/be/src/vec/data_types/serde/data_type_object_serde.cpp index f356c454b3f8f1..f67194372857cf 100644 --- a/be/src/vec/data_types/serde/data_type_object_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_object_serde.cpp @@ -19,6 +19,8 @@ #include +#include + #include "common/exception.h" #include "common/status.h" #include "vec/columns/column.h" @@ -37,11 +39,12 @@ namespace doris { namespace vectorized { +#include "common/compile_check_begin.h" template Status DataTypeObjectSerDe::_write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const { const auto& variant = assert_cast(column); if (!variant.is_finalized()) { @@ -70,27 +73,27 @@ Status DataTypeObjectSerDe::_write_column_to_mysql(const IColumn& column, } Status DataTypeObjectSerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, + MysqlRowBuffer& row_buffer, int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status DataTypeObjectSerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, - bool col_const, + MysqlRowBuffer& row_buffer, + int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } void DataTypeObjectSerDe::write_one_cell_to_jsonb(const IColumn& column, JsonbWriter& result, Arena* mem_pool, int32_t col_id, - int row_num) const { + int64_t row_num) const { const auto& variant = assert_cast(column); if (!variant.is_finalized()) { const_cast(variant).finalize(); } - result.writeKey(col_id); + result.writeKey(cast_set(col_id)); std::string value_str; if (!variant.serialize_one_row_to_string(row_num, &value_str)) { throw doris::Exception(ErrorCode::INTERNAL_ERROR, "Failed to serialize variant {}", @@ -129,7 +132,7 @@ void DataTypeObjectSerDe::read_one_cell_from_jsonb(IColumn& column, const JsonbV variant.insert(field); } -Status DataTypeObjectSerDe::serialize_one_cell_to_json(const IColumn& column, int row_num, +Status DataTypeObjectSerDe::serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const { const auto* var = check_and_get_column(column); @@ -140,8 +143,8 @@ Status DataTypeObjectSerDe::serialize_one_cell_to_json(const IColumn& column, in } void DataTypeObjectSerDe::write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, - int end, const cctz::time_zone& ctz) const { + arrow::ArrayBuilder* array_builder, int64_t start, + int64_t end, const cctz::time_zone& ctz) const { const auto* var = check_and_get_column(column); auto& builder = assert_cast(*array_builder); for (size_t i = start; i < end; ++i) { diff --git a/be/src/vec/data_types/serde/data_type_object_serde.h b/be/src/vec/data_types/serde/data_type_object_serde.h index 9351b200f5344e..414755ef0f8d04 100644 --- a/be/src/vec/data_types/serde/data_type_object_serde.h +++ b/be/src/vec/data_types/serde/data_type_object_serde.h @@ -29,7 +29,7 @@ namespace doris { class PValues; class JsonbValue; - +#include "common/compile_check_begin.h" namespace vectorized { class IColumn; class Arena; @@ -38,10 +38,10 @@ class DataTypeObjectSerDe : public DataTypeSerDe { public: DataTypeObjectSerDe(int nesting_level = 1) : DataTypeSerDe(nesting_level) {}; - Status serialize_one_cell_to_json(const IColumn& column, int row_num, BufferWritable& bw, + Status serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const override; - Status serialize_column_to_json(const IColumn& column, int start_idx, int end_idx, + Status serialize_column_to_json(const IColumn& column, int64_t start_idx, int64_t end_idx, BufferWritable& bw, FormatOptions& options) const override { return Status::NotSupported("serialize_column_to_json with type [{}]", column.get_name()); } @@ -57,20 +57,20 @@ class DataTypeObjectSerDe : public DataTypeSerDe { column.get_name()); } - Status write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const override { + Status write_column_to_pb(const IColumn& column, PValues& result, int64_t start, + int64_t end) const override { return Status::NotSupported("write_column_to_pb with type " + column.get_name()); } Status read_column_from_pb(IColumn& column, const PValues& arg) const override { return Status::NotSupported("read_column_from_pb with type " + column.get_name()); } void write_one_cell_to_jsonb(const IColumn& column, JsonbWriter& result, Arena* mem_pool, - int32_t col_id, int row_num) const override; + int32_t col_id, int64_t row_num) const override; void read_one_cell_from_jsonb(IColumn& column, const JsonbValue* arg) const override; void write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, int end, + arrow::ArrayBuilder* array_builder, int64_t start, int64_t end, const cctz::time_zone& ctz) const override; void read_column_from_arrow(IColumn& column, const arrow::Array* arrow_array, int start, int end, const cctz::time_zone& ctz) const override { @@ -79,16 +79,16 @@ class DataTypeObjectSerDe : public DataTypeSerDe { } Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, orc::ColumnVectorBatch* orc_col_batch, - int start, int end, + int64_t start, int64_t end, std::vector& buffer_list) const override { return Status::NotSupported("write_column_to_orc with type " + column.get_name()); } @@ -96,7 +96,9 @@ class DataTypeObjectSerDe : public DataTypeSerDe { private: template Status _write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, const FormatOptions& options) const; + int64_t row_idx, bool col_const, + const FormatOptions& options) const; }; +#include "common/compile_check_end.h" } // namespace vectorized } // namespace doris diff --git a/be/src/vec/data_types/serde/data_type_quantilestate_serde.h b/be/src/vec/data_types/serde/data_type_quantilestate_serde.h index e91fe0166e112b..9608bf1cb7899a 100644 --- a/be/src/vec/data_types/serde/data_type_quantilestate_serde.h +++ b/be/src/vec/data_types/serde/data_type_quantilestate_serde.h @@ -36,17 +36,17 @@ namespace doris { namespace vectorized { - +#include "common/compile_check_begin.h" class DataTypeQuantileStateSerDe : public DataTypeSerDe { public: DataTypeQuantileStateSerDe(int nesting_level = 1) : DataTypeSerDe(nesting_level) {}; - Status serialize_one_cell_to_json(const IColumn& column, int row_num, BufferWritable& bw, + Status serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const override { return Status::NotSupported("serialize_one_cell_to_json with type [{}]", column.get_name()); } - Status serialize_column_to_json(const IColumn& column, int start_idx, int end_idx, + Status serialize_column_to_json(const IColumn& column, int64_t start_idx, int64_t end_idx, BufferWritable& bw, FormatOptions& options) const override { return Status::NotSupported("serialize_column_to_json with type [{}]", column.get_name()); } @@ -63,9 +63,9 @@ class DataTypeQuantileStateSerDe : public DataTypeSerDe { column.get_name()); } - Status write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const override { - result.mutable_bytes_value()->Reserve(end - start); + Status write_column_to_pb(const IColumn& column, PValues& result, int64_t start, + int64_t end) const override { + result.mutable_bytes_value()->Reserve(cast_set(end - start)); for (size_t row_num = start; row_num < end; ++row_num) { StringRef data = column.get_data_at(row_num); result.add_bytes_value(data.to_string()); @@ -81,12 +81,12 @@ class DataTypeQuantileStateSerDe : public DataTypeSerDe { } void write_one_cell_to_jsonb(const IColumn& column, JsonbWriter& result, Arena* mem_pool, - int32_t col_id, int row_num) const override { + int32_t col_id, int64_t row_num) const override { auto& col = reinterpret_cast(column); auto& val = const_cast(col.get_element(row_num)); size_t actual_size = val.get_serialized_size(); auto ptr = mem_pool->alloc(actual_size); - result.writeKey(col_id); + result.writeKey(cast_set(col_id)); result.writeStartBinary(); result.writeBinary(reinterpret_cast(ptr), actual_size); result.writeEndBinary(); @@ -100,7 +100,7 @@ class DataTypeQuantileStateSerDe : public DataTypeSerDe { col.insert_value(val); } void write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, int end, + arrow::ArrayBuilder* array_builder, int64_t start, int64_t end, const cctz::time_zone& ctz) const override { throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR, "write_column_to_arrow with type " + column.get_name()); @@ -112,19 +112,19 @@ class DataTypeQuantileStateSerDe : public DataTypeSerDe { } Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, orc::ColumnVectorBatch* orc_col_batch, - int start, int end, + int64_t start, int64_t end, std::vector& buffer_list) const override { return Status::NotSupported("write_column_to_orc with type [{}]", column.get_name()); } @@ -132,14 +132,15 @@ class DataTypeQuantileStateSerDe : public DataTypeSerDe { private: template Status _write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, const FormatOptions& options) const; + int64_t row_idx, bool col_const, + const FormatOptions& options) const; }; // QuantileState is binary data which is not shown by mysql template Status DataTypeQuantileStateSerDe::_write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const { auto& data_column = reinterpret_cast(column); @@ -159,6 +160,6 @@ Status DataTypeQuantileStateSerDe::_write_column_to_mysql(const IColumn& column, } return Status::OK(); } - +#include "common/compile_check_end.h" } // namespace vectorized } // namespace doris diff --git a/be/src/vec/data_types/serde/data_type_serde.cpp b/be/src/vec/data_types/serde/data_type_serde.cpp index 0709df03bb733d..4aab198e70c84b 100644 --- a/be/src/vec/data_types/serde/data_type_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_serde.cpp @@ -16,6 +16,7 @@ // under the License. #include "data_type_serde.h" +#include "common/cast_set.h" #include "common/exception.h" #include "common/status.h" #include "runtime/descriptors.h" @@ -26,6 +27,7 @@ namespace doris { namespace vectorized { +#include "common/compile_check_begin.h" DataTypeSerDe::~DataTypeSerDe() = default; DataTypeSerDeSPtrs create_data_type_serdes(const DataTypes& types) { @@ -55,7 +57,7 @@ void DataTypeSerDe::convert_variant_map_to_rapidjson( continue; } rapidjson::Value key; - key.SetString(item.first.data(), item.first.size()); + key.SetString(item.first.data(), cast_set(item.first.size())); rapidjson::Value val; convert_field_to_rapidjson(item.second, val, allocator); if (val.IsNull() && item.first.empty()) { @@ -99,7 +101,7 @@ void DataTypeSerDe::convert_field_to_rapidjson(const vectorized::Field& field, } case vectorized::Field::Types::String: { const String& val = field.get(); - target.SetString(val.data(), val.size()); + target.SetString(val.data(), cast_set(val.size())); break; } case vectorized::Field::Types::Array: { @@ -121,7 +123,7 @@ void DataTypeSerDe::convert_field_to_rapidjson(const vectorized::Field& field, Status DataTypeSerDe::write_one_cell_to_json(const IColumn& column, rapidjson::Value& result, rapidjson::Document::AllocatorType& allocator, - Arena& mem_pool, int row_num) const { + Arena& mem_pool, int64_t row_num) const { return Status::InternalError("Not support write {} to rapidjson", column.get_name()); } diff --git a/be/src/vec/data_types/serde/data_type_serde.h b/be/src/vec/data_types/serde/data_type_serde.h index 46236faa926c6f..f0e9eb27961439 100644 --- a/be/src/vec/data_types/serde/data_type_serde.h +++ b/be/src/vec/data_types/serde/data_type_serde.h @@ -20,11 +20,13 @@ #include #include +#include #include #include #include #include "arrow/status.h" +#include "common/cast_set.h" #include "common/status.h" #include "util/jsonb_writer.h" #include "util/mysql_row_buffer.h" @@ -48,7 +50,7 @@ struct ColumnVectorBatch; } // namespace orc #define SERIALIZE_COLUMN_TO_JSON() \ - for (size_t i = start_idx; i < end_idx; ++i) { \ + for (auto i = start_idx; i < end_idx; ++i) { \ if (i != start_idx) { \ bw.write(options.field_delim.data(), options.field_delim.size()); \ } \ @@ -92,7 +94,7 @@ namespace doris { class PValues; class JsonbValue; class SlotDescriptor; - +#include "common/compile_check_begin.h" namespace vectorized { class IColumn; class Arena; @@ -187,19 +189,20 @@ class DataTypeSerDe { ans = map_key_delim; } else if (hive_text_complex_type_delimiter_level <= 7) { // [3, 7] -> [4, 8] - ans = hive_text_complex_type_delimiter_level + 1; + ans = cast_set(hive_text_complex_type_delimiter_level + 1); } else if (hive_text_complex_type_delimiter_level == 8) { // [8] -> [11] ans = 11; } else if (hive_text_complex_type_delimiter_level <= 21) { // [9, 21] -> [14, 26] - ans = hive_text_complex_type_delimiter_level + 5; + ans = cast_set(hive_text_complex_type_delimiter_level + 5); } else if (hive_text_complex_type_delimiter_level <= 25) { // [22, 25] -> [28, 31] - ans = hive_text_complex_type_delimiter_level + 6; + ans = cast_set(hive_text_complex_type_delimiter_level + 6); } else { // [26, 153] -> [-128, -1] - ans = hive_text_complex_type_delimiter_level + (-26 - 128); + ans = cast_set(hive_text_complex_type_delimiter_level + + (-26 - 128)); } return ans; @@ -226,12 +229,13 @@ class DataTypeSerDe { DataTypeSerDe(int nesting_level = 1) : _nesting_level(nesting_level) {}; virtual ~DataTypeSerDe(); // Text serializer and deserializer with formatOptions to handle different text format - virtual Status serialize_one_cell_to_json(const IColumn& column, int row_num, + virtual Status serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const = 0; // this function serialize multi-column to one row text to avoid virtual function call in complex type nested loop - virtual Status serialize_column_to_json(const IColumn& column, int start_idx, int end_idx, - BufferWritable& bw, FormatOptions& options) const = 0; + virtual Status serialize_column_to_json(const IColumn& column, int64_t start_idx, + int64_t end_idx, BufferWritable& bw, + FormatOptions& options) const = 0; virtual Status deserialize_one_cell_from_json(IColumn& column, Slice& slice, const FormatOptions& options) const = 0; @@ -281,30 +285,31 @@ class DataTypeSerDe { return deserialize_column_from_json_vector(column, slices, num_deserialized, options); }; virtual Status serialize_one_cell_to_hive_text( - const IColumn& column, int row_num, BufferWritable& bw, FormatOptions& options, + const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options, int hive_text_complex_type_delimiter_level = 1) const { return serialize_one_cell_to_json(column, row_num, bw, options); } // Protobuf serializer and deserializer - virtual Status write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const = 0; + virtual Status write_column_to_pb(const IColumn& column, PValues& result, int64_t start, + int64_t end) const = 0; virtual Status read_column_from_pb(IColumn& column, const PValues& arg) const = 0; // JSONB serializer and deserializer, should write col_id virtual void write_one_cell_to_jsonb(const IColumn& column, JsonbWriter& result, - Arena* mem_pool, int32_t col_id, int row_num) const = 0; + Arena* mem_pool, int32_t col_id, + int64_t row_num) const = 0; virtual void read_one_cell_from_jsonb(IColumn& column, const JsonbValue* arg) const = 0; // MySQL serializer and deserializer virtual Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const = 0; virtual Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const = 0; // Thrift serializer and deserializer @@ -312,16 +317,16 @@ class DataTypeSerDe { // Arrow serializer and deserializer virtual void write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, int end, - const cctz::time_zone& ctz) const = 0; + arrow::ArrayBuilder* array_builder, int64_t start, + int64_t end, const cctz::time_zone& ctz) const = 0; virtual void read_column_from_arrow(IColumn& column, const arrow::Array* arrow_array, int start, int end, const cctz::time_zone& ctz) const = 0; // ORC serializer virtual Status write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, - orc::ColumnVectorBatch* orc_col_batch, int start, int end, - std::vector& buffer_list) const = 0; + orc::ColumnVectorBatch* orc_col_batch, int64_t start, + int64_t end, std::vector& buffer_list) const = 0; // ORC deserializer virtual void set_return_object_as_string(bool value) { _return_object_as_string = value; } @@ -329,7 +334,7 @@ class DataTypeSerDe { // rapidjson virtual Status write_one_cell_to_json(const IColumn& column, rapidjson::Value& result, rapidjson::Document::AllocatorType& allocator, - Arena& mem_pool, int row_num) const; + Arena& mem_pool, int64_t row_num) const; virtual Status read_one_cell_from_json(IColumn& column, const rapidjson::Value& result) const; protected: @@ -380,6 +385,6 @@ using DataTypeSerDeSPtrs = std::vector; DataTypeSerDeSPtrs create_data_type_serdes( const std::vector>& types); DataTypeSerDeSPtrs create_data_type_serdes(const std::vector& slots); - +#include "common/compile_check_end.h" } // namespace vectorized } // namespace doris diff --git a/be/src/vec/data_types/serde/data_type_string_serde.h b/be/src/vec/data_types/serde/data_type_string_serde.h index 583772c582530f..69a8cc2617191d 100644 --- a/be/src/vec/data_types/serde/data_type_string_serde.h +++ b/be/src/vec/data_types/serde/data_type_string_serde.h @@ -39,6 +39,7 @@ class JsonbValue; namespace vectorized { class IColumn; class Arena; +#include "common/compile_check_begin.h" inline void escape_string(const char* src, size_t& len, char escape_char) { const char* start = src; @@ -68,7 +69,7 @@ class DataTypeStringSerDeBase : public DataTypeSerDe { public: DataTypeStringSerDeBase(int nesting_level = 1) : DataTypeSerDe(nesting_level) {}; - Status serialize_one_cell_to_json(const IColumn& column, int row_num, BufferWritable& bw, + Status serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const override { auto result = check_column_const_set_readability(column, row_num); ColumnPtr ptr = result.first; @@ -97,7 +98,7 @@ class DataTypeStringSerDeBase : public DataTypeSerDe { } Status serialize_one_cell_to_hive_text( - const IColumn& column, int row_num, BufferWritable& bw, FormatOptions& options, + const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options, int hive_text_complex_type_delimiter_level = 1) const override { auto result = check_column_const_set_readability(column, row_num); ColumnPtr ptr = result.first; @@ -158,7 +159,7 @@ class DataTypeStringSerDeBase : public DataTypeSerDe { } } - Status serialize_column_to_json(const IColumn& column, int start_idx, int end_idx, + Status serialize_column_to_json(const IColumn& column, int64_t start_idx, int64_t end_idx, BufferWritable& bw, FormatOptions& options) const override { SERIALIZE_COLUMN_TO_JSON(); } @@ -203,9 +204,9 @@ class DataTypeStringSerDeBase : public DataTypeSerDe { return Status::OK(); } - Status write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const override { - result.mutable_string_value()->Reserve(end - start); + Status write_column_to_pb(const IColumn& column, PValues& result, int64_t start, + int64_t end) const override { + result.mutable_string_value()->Reserve(cast_set(end - start)); auto* ptype = result.mutable_type(); ptype->set_id(PGenericType::STRING); for (size_t row_num = start; row_num < end; ++row_num) { @@ -254,8 +255,8 @@ class DataTypeStringSerDeBase : public DataTypeSerDe { return Status::OK(); } void write_one_cell_to_jsonb(const IColumn& column, JsonbWriter& result, Arena* mem_pool, - int32_t col_id, int row_num) const override { - result.writeKey(col_id); + int32_t col_id, int64_t row_num) const override { + result.writeKey(cast_set(col_id)); const auto& data_ref = column.get_data_at(row_num); result.writeStartBinary(); result.writeBinary(reinterpret_cast(data_ref.data), data_ref.size); @@ -269,7 +270,7 @@ class DataTypeStringSerDeBase : public DataTypeSerDe { } void write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, int end, + arrow::ArrayBuilder* array_builder, int64_t start, int64_t end, const cctz::time_zone& ctz) const override { const auto& string_column = assert_cast(column); auto& builder = assert_cast(*array_builder); @@ -280,8 +281,9 @@ class DataTypeStringSerDeBase : public DataTypeSerDe { continue; } auto string_ref = string_column.get_data_at(string_i); - checkArrowStatus(builder.Append(string_ref.data, string_ref.size), column.get_name(), - array_builder->type()->name()); + checkArrowStatus( + builder.Append(string_ref.data, cast_set(string_ref.size)), + column.get_name(), array_builder->type()->name()); } } void read_column_from_arrow(IColumn& column, const arrow::Array* arrow_array, int start, @@ -318,23 +320,23 @@ class DataTypeStringSerDeBase : public DataTypeSerDe { } Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, orc::ColumnVectorBatch* orc_col_batch, - int start, int end, + int64_t start, int64_t end, std::vector& buffer_list) const override { auto* cur_batch = dynamic_cast(orc_col_batch); - for (size_t row_id = start; row_id < end; row_id++) { + for (auto row_id = start; row_id < end; row_id++) { const auto& ele = assert_cast(column).get_data_at(row_id); cur_batch->data[row_id] = const_cast(ele.data); cur_batch->length[row_id] = ele.size; @@ -345,10 +347,10 @@ class DataTypeStringSerDeBase : public DataTypeSerDe { } Status write_one_cell_to_json(const IColumn& column, rapidjson::Value& result, rapidjson::Document::AllocatorType& allocator, Arena& mem_pool, - int row_num) const override { + int64_t row_num) const override { const auto& col = assert_cast(column); const auto& data_ref = col.get_data_at(row_num); - result.SetString(data_ref.data, data_ref.size); + result.SetString(data_ref.data, cast_set(data_ref.size)); return Status::OK(); } Status read_one_cell_from_json(IColumn& column, const rapidjson::Value& result) const override { @@ -367,7 +369,8 @@ class DataTypeStringSerDeBase : public DataTypeSerDe { private: template Status _write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, const FormatOptions& options) const { + int64_t row_idx, bool col_const, + const FormatOptions& options) const { const auto col_index = index_check_const(row_idx, col_const); const auto string_val = assert_cast(column).get_data_at(col_index); result.push_string(string_val.data, string_val.size); @@ -377,5 +380,6 @@ class DataTypeStringSerDeBase : public DataTypeSerDe { using DataTypeStringSerDe = DataTypeStringSerDeBase; using DataTypeFixedLengthObjectSerDe = DataTypeStringSerDeBase; +#include "common/compile_check_end.h" } // namespace vectorized } // namespace doris diff --git a/be/src/vec/data_types/serde/data_type_struct_serde.cpp b/be/src/vec/data_types/serde/data_type_struct_serde.cpp index c88b0088e5a8d4..eb571dcc7a82d5 100644 --- a/be/src/vec/data_types/serde/data_type_struct_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_struct_serde.cpp @@ -29,6 +29,7 @@ namespace doris { namespace vectorized { class Arena; +#include "common/compile_check_begin.h" std::optional DataTypeStructSerDe::try_get_position_by_name(const String& name) const { size_t size = elem_serdes_ptrs.size(); @@ -40,13 +41,13 @@ std::optional DataTypeStructSerDe::try_get_position_by_name(const String return std::nullopt; } -Status DataTypeStructSerDe::serialize_column_to_json(const IColumn& column, int start_idx, - int end_idx, BufferWritable& bw, +Status DataTypeStructSerDe::serialize_column_to_json(const IColumn& column, int64_t start_idx, + int64_t end_idx, BufferWritable& bw, FormatOptions& options) const { SERIALIZE_COLUMN_TO_JSON(); } -Status DataTypeStructSerDe::serialize_one_cell_to_json(const IColumn& column, int row_num, +Status DataTypeStructSerDe::serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const { auto result = check_column_const_set_readability(column, row_num); @@ -227,8 +228,8 @@ Status DataTypeStructSerDe::deserialize_column_from_json_vector( void DataTypeStructSerDe::write_one_cell_to_jsonb(const IColumn& column, JsonbWriter& result, Arena* mem_pool, int32_t col_id, - int row_num) const { - result.writeKey(col_id); + int64_t row_num) const { + result.writeKey(cast_set(col_id)); const char* begin = nullptr; // maybe serialize_value_into_arena should move to here later. StringRef value = column.serialize_value_into_arena(row_num, *mem_pool, begin); @@ -277,7 +278,7 @@ Status DataTypeStructSerDe::deserialize_column_from_hive_text_vector( } Status DataTypeStructSerDe::serialize_one_cell_to_hive_text( - const IColumn& column, int row_num, BufferWritable& bw, FormatOptions& options, + const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options, int hive_text_complex_type_delimiter_level) const { auto result = check_column_const_set_readability(column, row_num); ColumnPtr ptr = result.first; @@ -305,19 +306,19 @@ void DataTypeStructSerDe::read_one_cell_from_jsonb(IColumn& column, const JsonbV } void DataTypeStructSerDe::write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, - int end, const cctz::time_zone& ctz) const { + arrow::ArrayBuilder* array_builder, int64_t start, + int64_t end, const cctz::time_zone& ctz) const { auto& builder = assert_cast(*array_builder); auto& struct_column = assert_cast(column); - for (int r = start; r < end; ++r) { + for (auto r = start; r < end; ++r) { if (null_map != nullptr && (*null_map)[r]) { checkArrowStatus(builder.AppendNull(), struct_column.get_name(), builder.type()->name()); continue; } checkArrowStatus(builder.Append(), struct_column.get_name(), builder.type()->name()); - for (size_t ei = 0; ei < struct_column.tuple_size(); ++ei) { - auto elem_builder = builder.field_builder(ei); + for (auto ei = 0; ei < struct_column.tuple_size(); ++ei) { + auto* elem_builder = builder.field_builder(ei); elem_serdes_ptrs[ei]->write_column_to_arrow(struct_column.get_column(ei), nullptr, elem_builder, r, r + 1, ctz); } @@ -330,7 +331,7 @@ void DataTypeStructSerDe::read_column_from_arrow(IColumn& column, const arrow::A auto& struct_column = static_cast(column); auto concrete_struct = dynamic_cast(arrow_array); DCHECK_EQ(struct_column.tuple_size(), concrete_struct->num_fields()); - for (size_t i = 0; i < struct_column.tuple_size(); ++i) { + for (auto i = 0; i < struct_column.tuple_size(); ++i) { elem_serdes_ptrs[i]->read_column_from_arrow( struct_column.get_column(i), concrete_struct->field(i).get(), start, end, ctz); } @@ -339,7 +340,7 @@ void DataTypeStructSerDe::read_column_from_arrow(IColumn& column, const arrow::A template Status DataTypeStructSerDe::_write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const { auto& col = assert_cast(column); const auto col_index = index_check_const(row_idx, col_const); @@ -399,27 +400,27 @@ Status DataTypeStructSerDe::_write_column_to_mysql(const IColumn& column, } Status DataTypeStructSerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, + MysqlRowBuffer& row_buffer, int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status DataTypeStructSerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, - bool col_const, + MysqlRowBuffer& row_buffer, + int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status DataTypeStructSerDe::write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, - orc::ColumnVectorBatch* orc_col_batch, int start, - int end, + orc::ColumnVectorBatch* orc_col_batch, + int64_t start, int64_t end, std::vector& buffer_list) const { auto* cur_batch = dynamic_cast(orc_col_batch); const auto& struct_col = assert_cast(column); - for (size_t row_id = start; row_id < end; row_id++) { + for (auto row_id = start; row_id < end; row_id++) { for (int i = 0; i < struct_col.tuple_size(); ++i) { RETURN_IF_ERROR(elem_serdes_ptrs[i]->write_column_to_orc( timezone, struct_col.get_column(i), nullptr, cur_batch->fields[i], row_id, @@ -431,8 +432,8 @@ Status DataTypeStructSerDe::write_column_to_orc(const std::string& timezone, con return Status::OK(); } -Status DataTypeStructSerDe::write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const { +Status DataTypeStructSerDe::write_column_to_pb(const IColumn& column, PValues& result, + int64_t start, int64_t end) const { const auto& struct_col = assert_cast(column); auto* ptype = result.mutable_type(); ptype->set_id(PGenericType::STRUCT); @@ -451,7 +452,7 @@ Status DataTypeStructSerDe::write_column_to_pb(const IColumn& column, PValues& r Status DataTypeStructSerDe::read_column_from_pb(IColumn& column, const PValues& arg) const { auto& struct_column = assert_cast(column); DCHECK_EQ(struct_column.tuple_size(), arg.child_element_size()); - for (size_t i = 0; i < struct_column.tuple_size(); ++i) { + for (auto i = 0; i < struct_column.tuple_size(); ++i) { RETURN_IF_ERROR(elem_serdes_ptrs[i]->read_column_from_pb(struct_column.get_column(i), arg.child_element(i))); } diff --git a/be/src/vec/data_types/serde/data_type_struct_serde.h b/be/src/vec/data_types/serde/data_type_struct_serde.h index 84e988e150bbdc..2ec871838d7ed7 100644 --- a/be/src/vec/data_types/serde/data_type_struct_serde.h +++ b/be/src/vec/data_types/serde/data_type_struct_serde.h @@ -33,6 +33,7 @@ class JsonbValue; namespace vectorized { class IColumn; class Arena; +#include "common/compile_check_begin.h" class DataTypeStructSerDe : public DataTypeSerDe { public: @@ -114,10 +115,10 @@ class DataTypeStructSerDe : public DataTypeSerDe { elem_serdes_ptrs(_elem_serdes_ptrs), elem_names(names) {} - Status serialize_one_cell_to_json(const IColumn& column, int row_num, BufferWritable& bw, + Status serialize_one_cell_to_json(const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options) const override; - Status serialize_column_to_json(const IColumn& column, int start_idx, int end_idx, + Status serialize_column_to_json(const IColumn& column, int64_t start_idx, int64_t end_idx, BufferWritable& bw, FormatOptions& options) const override; Status deserialize_one_cell_from_json(IColumn& column, Slice& slice, @@ -135,33 +136,33 @@ class DataTypeStructSerDe : public DataTypeSerDe { const FormatOptions& options, int hive_text_complex_type_delimiter_level = 1) const override; Status serialize_one_cell_to_hive_text( - const IColumn& column, int row_num, BufferWritable& bw, FormatOptions& options, + const IColumn& column, int64_t row_num, BufferWritable& bw, FormatOptions& options, int hive_text_complex_type_delimiter_level = 1) const override; - Status write_column_to_pb(const IColumn& column, PValues& result, int start, - int end) const override; + Status write_column_to_pb(const IColumn& column, PValues& result, int64_t start, + int64_t end) const override; Status read_column_from_pb(IColumn& column, const PValues& arg) const override; void write_one_cell_to_jsonb(const IColumn& column, JsonbWriter& result, Arena* mem_pool, - int32_t col_id, int row_num) const override; + int32_t col_id, int64_t row_num) const override; void read_one_cell_from_jsonb(IColumn& column, const JsonbValue* arg) const override; void write_column_to_arrow(const IColumn& column, const NullMap* null_map, - arrow::ArrayBuilder* array_builder, int start, int end, + arrow::ArrayBuilder* array_builder, int64_t start, int64_t end, const cctz::time_zone& ctz) const override; void read_column_from_arrow(IColumn& column, const arrow::Array* arrow_array, int start, int end, const cctz::time_zone& ctz) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_orc(const std::string& timezone, const IColumn& column, const NullMap* null_map, orc::ColumnVectorBatch* orc_col_batch, - int start, int end, + int64_t start, int64_t end, std::vector& buffer_list) const override; void set_return_object_as_string(bool value) override { @@ -177,14 +178,16 @@ class DataTypeStructSerDe : public DataTypeSerDe { template Status _write_column_to_mysql(const IColumn& column, bool return_object_data_as_binary, std::vector>& result, - int row_idx, int start, int end, bool col_const, + int64_t row_idx, int start, int end, bool col_const, const FormatOptions& options) const; template Status _write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, const FormatOptions& options) const; + int64_t row_idx, bool col_const, + const FormatOptions& options) const; DataTypeSerDeSPtrs elem_serdes_ptrs; Strings elem_names; }; +#include "common/compile_check_end.h" } // namespace vectorized } // namespace doris diff --git a/be/src/vec/data_types/serde/data_type_time_serde.cpp b/be/src/vec/data_types/serde/data_type_time_serde.cpp index 01e9b5ecd5dfa4..5cb20b534f3331 100644 --- a/be/src/vec/data_types/serde/data_type_time_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_time_serde.cpp @@ -18,23 +18,23 @@ #include "data_type_time_serde.h" namespace doris { namespace vectorized { - +#include "common/compile_check_begin.h" Status DataTypeTimeV2SerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, + MysqlRowBuffer& row_buffer, int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } Status DataTypeTimeV2SerDe::write_column_to_mysql(const IColumn& column, - MysqlRowBuffer& row_buffer, int row_idx, - bool col_const, + MysqlRowBuffer& row_buffer, + int64_t row_idx, bool col_const, const FormatOptions& options) const { return _write_column_to_mysql(column, row_buffer, row_idx, col_const, options); } template Status DataTypeTimeV2SerDe::_write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const { auto& data = assert_cast(column).get_data(); const auto col_index = index_check_const(row_idx, col_const); diff --git a/be/src/vec/data_types/serde/data_type_time_serde.h b/be/src/vec/data_types/serde/data_type_time_serde.h index 24e3da8ec21609..0ebe79e522cbda 100644 --- a/be/src/vec/data_types/serde/data_type_time_serde.h +++ b/be/src/vec/data_types/serde/data_type_time_serde.h @@ -26,24 +26,26 @@ namespace doris { class JsonbOutStream; - +#include "common/compile_check_begin.h" namespace vectorized { class DataTypeTimeV2SerDe : public DataTypeNumberSerDe { public: DataTypeTimeV2SerDe(int scale = 0, int nesting_level = 1) : DataTypeNumberSerDe(nesting_level), scale(scale) {}; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; Status write_column_to_mysql(const IColumn& column, MysqlRowBuffer& row_buffer, - int row_idx, bool col_const, + int64_t row_idx, bool col_const, const FormatOptions& options) const override; private: template Status _write_column_to_mysql(const IColumn& column, MysqlRowBuffer& result, - int row_idx, bool col_const, const FormatOptions& options) const; + int64_t row_idx, bool col_const, + const FormatOptions& options) const; int scale; }; +#include "common/compile_check_end.h" } // namespace vectorized } // namespace doris diff --git a/be/src/vec/runtime/vdatetime_value.cpp b/be/src/vec/runtime/vdatetime_value.cpp index 877573bcccb846..797fee1a50db15 100644 --- a/be/src/vec/runtime/vdatetime_value.cpp +++ b/be/src/vec/runtime/vdatetime_value.cpp @@ -1204,7 +1204,7 @@ static int check_word(const char* lib[], const char* str, const char* end, const // this method is exactly same as fromDateFormatStr() in DateLiteral.java in FE // change this method should also change that. bool VecDateTimeValue::from_date_format_str(const char* format, int format_len, const char* value, - int value_len, const char** sub_val_end) { + int64_t value_len, const char** sub_val_end) { if (value_len <= 0) [[unlikely]] { return false; } @@ -2254,7 +2254,7 @@ void DateV2Value::set_zero() { // change this method should also change that. template bool DateV2Value::from_date_format_str(const char* format, int format_len, const char* value, - int value_len, const char** sub_val_end) { + int64_t value_len, const char** sub_val_end) { if (value_len <= 0) [[unlikely]] { return false; } @@ -3439,7 +3439,7 @@ void DateV2Value::unchecked_set_time(uint8_t hour, uint8_t minute, uint8_t se } template -void DateV2Value::set_microsecond(uint32_t microsecond) { +void DateV2Value::set_microsecond(uint64_t microsecond) { if constexpr (is_datetime) { date_v2_value_.microsecond_ = microsecond; } else { diff --git a/be/src/vec/runtime/vdatetime_value.h b/be/src/vec/runtime/vdatetime_value.h index ebda0e60ec1493..9bb8916710299f 100644 --- a/be/src/vec/runtime/vdatetime_value.h +++ b/be/src/vec/runtime/vdatetime_value.h @@ -356,7 +356,7 @@ class VecDateTimeValue { // Now this type is a temp solution with little changes } bool from_date_format_str(const char* format, int format_len, const char* value, - int value_len) { + int64_t value_len) { memset(this, 0, sizeof(*this)); return from_date_format_str(format, format_len, value, value_len, nullptr); } @@ -731,8 +731,8 @@ class VecDateTimeValue { // Now this type is a temp solution with little changes void set_zero(int type); void set_max_time(bool neg); - bool from_date_format_str(const char* format, int format_len, const char* value, int value_len, - const char** sub_val_end); + bool from_date_format_str(const char* format, int format_len, const char* value, + int64_t value_len, const char** sub_val_end); // 1 bits for neg. 3 bits for type. 12bit for second uint16_t _neg : 1; // Used for time value. @@ -783,7 +783,7 @@ class DateV2Value { return datetime; } - void set_microsecond(uint32_t microsecond); + void set_microsecond(uint64_t microsecond); bool from_olap_date(uint64_t date) { auto [year, month, day] = std::tuple {0, 0, 0}; @@ -832,7 +832,7 @@ class DateV2Value { int max_valid_length) const; bool from_date_format_str(const char* format, int format_len, const char* value, - int value_len) { + int64_t value_len) { return from_date_format_str(format, format_len, value, value_len, nullptr); } @@ -1287,8 +1287,8 @@ class DateV2Value { } } - bool from_date_format_str(const char* format, int format_len, const char* value, int value_len, - const char** sub_val_end); + bool from_date_format_str(const char* format, int format_len, const char* value, + int64_t value_len, const char** sub_val_end); static constexpr int MAX_DATE_PARTS = 7; static constexpr uint32_t MAX_TIME_PART_VALUE[3] = {23, 59, 59}; diff --git a/regression-test/suites/query_p0/sql_functions/json_functions/json_search.groovy b/regression-test/suites/query_p0/sql_functions/json_functions/json_search.groovy index 0872758cd12fa0..43487be6d98aa1 100644 --- a/regression-test/suites/query_p0/sql_functions/json_functions/json_search.groovy +++ b/regression-test/suites/query_p0/sql_functions/json_functions/json_search.groovy @@ -24,7 +24,7 @@ suite("test_json_search") { sql """use ${dbName}""" def testTable = "test_json_search" - + sql """ drop table if exists test_json_search;""" sql """ CREATE TABLE `${testTable}` ( `id` int NULL, From 09cfca191e18c5ae6d71e2130b7c3cd76b9c1031 Mon Sep 17 00:00:00 2001 From: Petrichor <31833513+vinlee19@users.noreply.github.com> Date: Tue, 19 Nov 2024 16:56:31 +0800 Subject: [PATCH 28/63] [feat](Nereids) support refresh catalog command (#43449) Issue Number: close # https://github.com/apache/doris/issues/42580 --- .../org/apache/doris/nereids/DorisParser.g4 | 6 +- .../apache/doris/catalog/RefreshManager.java | 6 +- .../nereids/parser/LogicalPlanBuilder.java | 14 ++ .../doris/nereids/trees/plans/PlanType.java | 1 + .../refresh/RefreshCatalogCommand.java | 128 ++++++++++++++++++ .../trees/plans/visitor/CommandVisitor.java | 5 + .../test_nereids_refresh_catalog.out | 63 +++++++++ .../test_nereids_refresh_catalog.groovy | 70 ++++++++++ 8 files changed, 289 insertions(+), 4 deletions(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/refresh/RefreshCatalogCommand.java create mode 100644 regression-test/data/external_table_p0/nereids_commands/test_nereids_refresh_catalog.out create mode 100644 regression-test/suites/external_table_p0/nereids_commands/test_nereids_refresh_catalog.groovy 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 734be9fa51da79..c9958e68641b1b 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 @@ -55,6 +55,7 @@ statementBase | supportedDropStatement #supportedDropStatementAlias | supportedSetStatement #supportedSetStatementAlias | supportedUnsetStatement #supportedUnsetStatementAlias + | supportedRefreshStatement #supportedRefreshStatementAlias | supportedShowStatement #supportedShowStatementAlias | unsupportedStatement #unsupported | supportedRecoverStatement #supportedRecoverStatementAlias @@ -418,10 +419,13 @@ channelDescription partitionSpec? columnList=identifierList? ; +supportedRefreshStatement + : REFRESH CATALOG name=identifier propertyClause? #refreshCatalog + ; + unsupportedRefreshStatement : REFRESH TABLE name=multipartIdentifier #refreshTable | REFRESH DATABASE name=multipartIdentifier propertyClause? #refreshDatabase - | REFRESH CATALOG name=identifier propertyClause? #refreshCatalog | REFRESH LDAP (ALL | (FOR user=identifierOrText)) #refreshLdap ; diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/RefreshManager.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/RefreshManager.java index 52694e5a5bdffb..e421cc1475c03d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/RefreshManager.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/RefreshManager.java @@ -32,8 +32,8 @@ import org.apache.doris.datasource.ExternalTable; import org.apache.doris.datasource.InternalCatalog; import org.apache.doris.datasource.hive.HMSExternalTable; +import org.apache.doris.nereids.trees.plans.commands.refresh.RefreshCatalogCommand; import org.apache.doris.persist.OperationType; -import org.apache.doris.qe.DdlExecutor; import com.google.common.collect.Maps; import org.apache.logging.log4j.LogManager; @@ -284,9 +284,9 @@ public void run() { * {@link org.apache.doris.analysis.RefreshCatalogStmt#analyze(Analyzer)} is ok, * because the default value of invalidCache is true. * */ - RefreshCatalogStmt refreshCatalogStmt = new RefreshCatalogStmt(catalogName, null); + RefreshCatalogCommand refreshCatalogCommand = new RefreshCatalogCommand(catalogName, null); try { - DdlExecutor.execute(Env.getCurrentEnv(), refreshCatalogStmt); + refreshCatalogCommand.handleRefreshCatalog(); } catch (Exception e) { LOG.warn("failed to refresh catalog {}", catalogName, e); } 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 064e9568ac2d69..6fc011d69263c7 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 @@ -163,6 +163,7 @@ import org.apache.doris.nereids.DorisParser.QueryOrganizationContext; import org.apache.doris.nereids.DorisParser.QueryTermContext; import org.apache.doris.nereids.DorisParser.RecoverDatabaseContext; +import org.apache.doris.nereids.DorisParser.RefreshCatalogContext; import org.apache.doris.nereids.DorisParser.RefreshMTMVContext; import org.apache.doris.nereids.DorisParser.RefreshMethodContext; import org.apache.doris.nereids.DorisParser.RefreshScheduleContext; @@ -513,6 +514,7 @@ import org.apache.doris.nereids.trees.plans.commands.insert.BatchInsertIntoTableCommand; import org.apache.doris.nereids.trees.plans.commands.insert.InsertIntoTableCommand; import org.apache.doris.nereids.trees.plans.commands.insert.InsertOverwriteTableCommand; +import org.apache.doris.nereids.trees.plans.commands.refresh.RefreshCatalogCommand; 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.LogicalExcept; @@ -4050,6 +4052,17 @@ public SetDefaultStorageVaultCommand visitSetDefaultStorageVault(SetDefaultStora } @Override + + public Object visitRefreshCatalog(RefreshCatalogContext ctx) { + if (ctx.name != null) { + String catalogName = ctx.name.getText(); + Map properties = ctx.propertyClause() != null + ? Maps.newHashMap(visitPropertyClause(ctx.propertyClause())) : Maps.newHashMap(); + return new RefreshCatalogCommand(catalogName, properties); + } + throw new AnalysisException("catalog name can not be null"); + } + public LogicalPlan visitShowLastInsert(ShowLastInsertContext ctx) { return new ShowLastInsertCommand(); } @@ -4061,6 +4074,7 @@ public LogicalPlan visitShowPartitionId(ShowPartitionIdContext ctx) { partitionId = Long.parseLong(ctx.partitionId.getText()); } return new ShowPartitionIdCommand(partitionId); + } @Override 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 55c73c11a81e87..e255ac326215d9 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 @@ -174,6 +174,7 @@ public enum PlanType { SET_TRANSACTION_COMMAND, SET_USER_PROPERTIES_COMMAND, SET_DEFAULT_STORAGE_VAULT_COMMAND, + REFRESH_CATALOG_COMMAND, PREPARED_COMMAND, EXECUTE_COMMAND, SHOW_BACKENDS_COMMAND, diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/refresh/RefreshCatalogCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/refresh/RefreshCatalogCommand.java new file mode 100644 index 00000000000000..7b6433038197dd --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/refresh/RefreshCatalogCommand.java @@ -0,0 +1,128 @@ +// 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.commands.refresh; + +import org.apache.doris.analysis.StmtType; +import org.apache.doris.catalog.Env; +import org.apache.doris.common.AnalysisException; +import org.apache.doris.common.ErrorCode; +import org.apache.doris.common.ErrorReport; +import org.apache.doris.common.util.Util; +import org.apache.doris.datasource.CatalogIf; +import org.apache.doris.datasource.CatalogLog; +import org.apache.doris.datasource.ExternalCatalog; +import org.apache.doris.datasource.InternalCatalog; +import org.apache.doris.mysql.privilege.PrivPredicate; +import org.apache.doris.nereids.trees.plans.PlanType; +import org.apache.doris.nereids.trees.plans.commands.Command; +import org.apache.doris.nereids.trees.plans.commands.ForwardWithSync; +import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor; +import org.apache.doris.persist.OperationType; +import org.apache.doris.qe.ConnectContext; +import org.apache.doris.qe.StmtExecutor; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.Map; + +/** + * Manually refresh the catalog metadata. + */ +public class RefreshCatalogCommand extends Command implements ForwardWithSync { + private static final Logger LOG = LogManager.getLogger(RefreshCatalogCommand.class); + private static final String INVALID_CACHE = "invalid_cache"; + private final String catalogName; + private Map properties; + private boolean invalidCache = true; + + public RefreshCatalogCommand(String catalogName, Map properties) { + super(PlanType.REFRESH_CATALOG_COMMAND); + this.catalogName = catalogName; + this.properties = properties; + } + + private void validate() throws AnalysisException { + Util.checkCatalogAllRules(catalogName); + if (catalogName.equals(InternalCatalog.INTERNAL_CATALOG_NAME)) { + throw new AnalysisException("Internal catalog name can't be refresh."); + } + + if (!Env.getCurrentEnv().getAccessManager().checkCtlPriv( + ConnectContext.get(), catalogName, PrivPredicate.SHOW)) { + ErrorReport.reportAnalysisException(ErrorCode.ERR_CATALOG_ACCESS_DENIED_ERROR, + PrivPredicate.SHOW.getPrivs().toString(), catalogName); + } + + if (properties != null) { + // Set to false only if user set the property "invalid_cache"="false" + invalidCache = !(properties.get(INVALID_CACHE) != null && properties.get(INVALID_CACHE) + .equalsIgnoreCase("false")); + } + + } + + private void refreshCatalogInternal(CatalogIf catalog) { + if (!catalogName.equals(InternalCatalog.INTERNAL_CATALOG_NAME)) { + ((ExternalCatalog) catalog).onRefreshCache(invalidCache); + LOG.info("refresh catalog {} with invalidCache {}", catalogName, invalidCache); + } + } + + /** + * refresh catalog + */ + public void handleRefreshCatalog() throws AnalysisException { + CatalogIf catalog = Env.getCurrentEnv().getCatalogMgr().getCatalogOrAnalysisException(catalogName); + CatalogLog log = new CatalogLog(); + log.setCatalogId(catalog.getId()); + log.setInvalidCache(invalidCache); + refreshCatalogInternal(catalog); + Env.getCurrentEnv().getEditLog().logCatalogLog(OperationType.OP_REFRESH_CATALOG, log); + } + + @Override + public void run(ConnectContext ctx, StmtExecutor executor) throws Exception { + validate(); + handleRefreshCatalog(); + } + + @Override + public R accept(PlanVisitor visitor, C context) { + return visitor.visitRefreshCatalogCommand(this, context); + } + + @Override + public StmtType stmtType() { + return StmtType.REFRESH; + } + + /** + * return sql expression of this command + * + * @return sql command + */ + public String toSql() { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("REFRESH CATALOG ") + .append("`") + .append(catalogName) + .append("`"); + return stringBuilder.toString(); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java index 2ffdcc767ab3d8..117c42b7bfc359 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java @@ -77,6 +77,7 @@ import org.apache.doris.nereids.trees.plans.commands.insert.BatchInsertIntoTableCommand; import org.apache.doris.nereids.trees.plans.commands.insert.InsertIntoTableCommand; import org.apache.doris.nereids.trees.plans.commands.insert.InsertOverwriteTableCommand; +import org.apache.doris.nereids.trees.plans.commands.refresh.RefreshCatalogCommand; /** CommandVisitor. */ public interface CommandVisitor { @@ -255,6 +256,10 @@ default R visitSetDefaultStorageVault(SetDefaultStorageVaultCommand setDefaultSt return visitCommand(setDefaultStorageVaultCommand, context); } + default R visitRefreshCatalogCommand(RefreshCatalogCommand refreshCatalogCommand, C context) { + return visitCommand(refreshCatalogCommand, context); + } + default R visitShowLastInsertCommand(ShowLastInsertCommand showLastInsertCommand, C context) { return visitCommand(showLastInsertCommand, context); } diff --git a/regression-test/data/external_table_p0/nereids_commands/test_nereids_refresh_catalog.out b/regression-test/data/external_table_p0/nereids_commands/test_nereids_refresh_catalog.out new file mode 100644 index 00000000000000..89b47bbe4eb1e7 --- /dev/null +++ b/regression-test/data/external_table_p0/nereids_commands/test_nereids_refresh_catalog.out @@ -0,0 +1,63 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +DORIS +Doris +doris +doris_test +information_schema +init_db +mysql +show_test_do_not_modify + +-- !ex_tb0_where -- +111 + +-- !ex_tb0 -- +111 abc +112 abd +113 abe +114 abf +115 abg + +-- !sql -- +DORIS +Doris +doris +doris_test +information_schema +init_db +mysql +show_test_do_not_modify + +-- !sql -- +DORIS +Doris +doris +doris_test +information_schema +init_db +mysql +new_mysql_db +show_test_do_not_modify + +-- !sql -- +DORIS +Doris +doris +doris_test +information_schema +init_db +mysql +new_mysql_db +show_test_do_not_modify + +-- !sql -- +DORIS +Doris +doris +doris_test +information_schema +init_db +mysql +show_test_do_not_modify + diff --git a/regression-test/suites/external_table_p0/nereids_commands/test_nereids_refresh_catalog.groovy b/regression-test/suites/external_table_p0/nereids_commands/test_nereids_refresh_catalog.groovy new file mode 100644 index 00000000000000..f74f78a3709dc2 --- /dev/null +++ b/regression-test/suites/external_table_p0/nereids_commands/test_nereids_refresh_catalog.groovy @@ -0,0 +1,70 @@ +// 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_nereids_refresh_catalog", "p0,external,mysql,external_docker,external_docker_mysql") { + String enabled = context.config.otherConfigs.get("enableJdbcTest") + String externalEnvIp = context.config.otherConfigs.get("externalEnvIp") + String s3_endpoint = getS3Endpoint() + String bucket = getS3BucketName() + String driver_url = "https://${bucket}.${s3_endpoint}/regression/jdbc_driver/mysql-connector-java-8.0.25.jar" + if (enabled != null && enabled.equalsIgnoreCase("true")) { + String catalog_name = "refresh_catalog_mysql_catalog_nereids"; + String internal_db_name = "regression_test_jdbc_catalog_p0"; + String ex_db_name = "doris_test"; + String mysql_port = context.config.otherConfigs.get("mysql_57_port"); + String ex_tb0 = "ex_tb0"; + String new_mysql_db = "new_mysql_db"; + + sql """drop catalog if exists ${catalog_name} """ + + sql """set enable_nereids_planner=true;""" + sql """set enable_fallback_to_original_planner=false;""" + + sql """create catalog if not exists ${catalog_name} properties( + "type"="jdbc", + "user"="root", + "password"="123456", + "jdbc_url" = "jdbc:mysql://${externalEnvIp}:${mysql_port}/doris_test?useSSL=false", + "driver_url" = "${driver_url}", + "driver_class" = "com.mysql.cj.jdbc.Driver" + );""" + + sql """switch ${catalog_name}""" + sql """CALL EXECUTE_STMT("${catalog_name}", "drop database if exists ${new_mysql_db}");""" + + qt_sql """show databases;""" + sql """ use ${ex_db_name}""" + + qt_ex_tb0_where """select id from ${ex_tb0} where id = 111;""" + order_qt_ex_tb0 """ select id, name from ${ex_tb0} order by id; """ + // create database in mysql + sql """CALL EXECUTE_STMT("${catalog_name}", "create database ${new_mysql_db} ;");""" + qt_sql """show databases;""" + checkNereidsExecute("refresh catalog ${catalog_name} ;") + qt_sql """show databases;""" + + checkNereidsExecute("refresh catalog ${catalog_name} properties ('invalid_cache'='true');") + + sql """CALL EXECUTE_STMT("${catalog_name}", "drop database if exists ${new_mysql_db} ;");""" + qt_sql """show databases;""" + + checkNereidsExecute("refresh catalog ${catalog_name} properties ('invalid_cache'='true');") + qt_sql """show databases;""" + + sql """ drop catalog if exists ${catalog_name} ;""" + } +} From 43b7fa5eb4be442d1306edff6fe588382c2ad6fa Mon Sep 17 00:00:00 2001 From: Vallish Pai Date: Tue, 19 Nov 2024 14:29:17 +0530 Subject: [PATCH 29/63] [Enhancement] (nereids)implement showSqlBlockRuleCommand in nereids (#42979) Issue Number: close #42719 implement showSqlBlockRuleCommand in nereids --- .../org/apache/doris/nereids/DorisParser.g4 | 4 +- .../doris/blockrule/SqlBlockRuleMgr.java | 7 ++ .../nereids/parser/LogicalPlanBuilder.java | 11 +++ .../doris/nereids/trees/plans/PlanType.java | 1 + .../commands/ShowSqlBlockRuleCommand.java | 80 +++++++++++++++++++ .../trees/plans/visitor/CommandVisitor.java | 5 ++ .../sql_block_rule_p0/test_sql_block_rule.out | 8 +- .../test_sql_block_rule.groovy | 12 ++- 8 files changed, 124 insertions(+), 4 deletions(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowSqlBlockRuleCommand.java 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 c9958e68641b1b..2f15ec1fd99d08 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 @@ -210,6 +210,7 @@ supportedShowStatement | SHOW PRIVILEGES #showPrivileges | SHOW PROC path=STRING_LITERAL #showProc | SHOW STORAGE? ENGINES #showStorageEngines + | SHOW SQL_BLOCK_RULE (FOR ruleName=identifier)? #showSqlBlockRule | SHOW CREATE MATERIALIZED VIEW mvName=identifier ON tableName=multipartIdentifier #showCreateMaterializedView | SHOW BACKENDS #showBackends @@ -246,8 +247,7 @@ lockTable unsupportedShowStatement - : SHOW SQL_BLOCK_RULE (FOR ruleName=identifier)? #showSqlBlockRule - | SHOW ROW POLICY (FOR (userIdentify | (ROLE role=identifier)))? #showRowPolicy + : SHOW ROW POLICY (FOR (userIdentify | (ROLE role=identifier)))? #showRowPolicy | SHOW STORAGE POLICY (USING (FOR policy=identifierOrText)?)? #showStoragePolicy | SHOW STAGES #showStages | SHOW STORAGE (VAULT | VAULTS) #showStorageVault diff --git a/fe/fe-core/src/main/java/org/apache/doris/blockrule/SqlBlockRuleMgr.java b/fe/fe-core/src/main/java/org/apache/doris/blockrule/SqlBlockRuleMgr.java index 13df2eb9377b17..c6dd0af42109eb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/blockrule/SqlBlockRuleMgr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/blockrule/SqlBlockRuleMgr.java @@ -80,6 +80,13 @@ public boolean existRule(String name) { **/ public List getSqlBlockRule(ShowSqlBlockRuleStmt stmt) throws AnalysisException { String ruleName = stmt.getRuleName(); + return getSqlBlockRule(ruleName); + } + + /** + * Get SqlBlockRule by rulename. + **/ + public List getSqlBlockRule(String ruleName) throws AnalysisException { if (StringUtils.isNotEmpty(ruleName)) { if (nameToSqlBlockRuleMap.containsKey(ruleName)) { SqlBlockRule sqlBlockRule = nameToSqlBlockRuleMap.get(ruleName); 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 6fc011d69263c7..d92e06081198c2 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 @@ -211,6 +211,7 @@ import org.apache.doris.nereids.DorisParser.ShowProcedureStatusContext; import org.apache.doris.nereids.DorisParser.ShowRepositoriesContext; import org.apache.doris.nereids.DorisParser.ShowRolesContext; +import org.apache.doris.nereids.DorisParser.ShowSqlBlockRuleContext; import org.apache.doris.nereids.DorisParser.ShowStorageEnginesContext; import org.apache.doris.nereids.DorisParser.ShowTableIdContext; import org.apache.doris.nereids.DorisParser.ShowVariablesContext; @@ -458,6 +459,7 @@ import org.apache.doris.nereids.trees.plans.commands.ShowProcedureStatusCommand; import org.apache.doris.nereids.trees.plans.commands.ShowRepositoriesCommand; import org.apache.doris.nereids.trees.plans.commands.ShowRolesCommand; +import org.apache.doris.nereids.trees.plans.commands.ShowSqlBlockRuleCommand; import org.apache.doris.nereids.trees.plans.commands.ShowStorageEnginesCommand; import org.apache.doris.nereids.trees.plans.commands.ShowTableIdCommand; import org.apache.doris.nereids.trees.plans.commands.ShowVariablesCommand; @@ -4127,6 +4129,15 @@ public LogicalPlan visitShowPlugins(ShowPluginsContext ctx) { return new ShowPluginsCommand(); } + @Override + public LogicalPlan visitShowSqlBlockRule(ShowSqlBlockRuleContext ctx) { + String ruleName = null; + if (ctx.ruleName != null) { + ruleName = ctx.ruleName.getText(); + } + return new ShowSqlBlockRuleCommand(ruleName); + } + @Override public LogicalPlan visitShowRepositories(ShowRepositoriesContext ctx) { return new ShowRepositoriesCommand(); 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 e255ac326215d9..ab6f1dc79fcf10 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 @@ -178,6 +178,7 @@ public enum PlanType { PREPARED_COMMAND, EXECUTE_COMMAND, SHOW_BACKENDS_COMMAND, + SHOW_BLOCK_RULE_COMMAND, SHOW_CONFIG_COMMAND, SHOW_CREATE_MATERIALIZED_VIEW_COMMAND, SHOW_FRONTENDS_COMMAND, diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowSqlBlockRuleCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowSqlBlockRuleCommand.java new file mode 100644 index 00000000000000..e9a32cd091e544 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowSqlBlockRuleCommand.java @@ -0,0 +1,80 @@ +// 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.commands; + +import org.apache.doris.blockrule.SqlBlockRule; +import org.apache.doris.catalog.Column; +import org.apache.doris.catalog.Env; +import org.apache.doris.catalog.ScalarType; +import org.apache.doris.common.ErrorCode; +import org.apache.doris.common.ErrorReport; +import org.apache.doris.mysql.privilege.PrivPredicate; +import org.apache.doris.nereids.trees.plans.PlanType; +import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor; +import org.apache.doris.qe.ConnectContext; +import org.apache.doris.qe.ShowResultSet; +import org.apache.doris.qe.ShowResultSetMetaData; +import org.apache.doris.qe.StmtExecutor; + +import com.google.common.collect.Lists; + +import java.util.List; + +/** + * show sql block rule command + */ +public class ShowSqlBlockRuleCommand extends ShowCommand { + private static final ShowResultSetMetaData META_DATA = + ShowResultSetMetaData.builder() + .addColumn(new Column("Name", ScalarType.createVarchar(50))) + .addColumn(new Column("Sql", ScalarType.createVarchar(65535))) + .addColumn(new Column("SqlHash", ScalarType.createVarchar(65535))) + .addColumn(new Column("PartitionNum", ScalarType.createVarchar(10))) + .addColumn(new Column("TabletNum", ScalarType.createVarchar(10))) + .addColumn(new Column("Cardinality", ScalarType.createVarchar(20))) + .addColumn(new Column("Global", ScalarType.createVarchar(4))) + .addColumn(new Column("Enable", ScalarType.createVarchar(4))) + .build(); + private final String ruleName; // optional + + /** + * constructor + */ + public ShowSqlBlockRuleCommand(String ruleName) { + super(PlanType.SHOW_BLOCK_RULE_COMMAND); + this.ruleName = ruleName; + } + + @Override + public ShowResultSet doRun(ConnectContext ctx, StmtExecutor executor) throws Exception { + // check auth + if (!Env.getCurrentEnv().getAccessManager().checkGlobalPriv(ConnectContext.get(), PrivPredicate.ADMIN)) { + ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR, "ADMIN"); + } + + List> rows = Lists.newArrayList(); + List sqlBlockRules = Env.getCurrentEnv().getSqlBlockRuleMgr().getSqlBlockRule(ruleName); + sqlBlockRules.forEach(rule -> rows.add(rule.getShowInfo())); + return new ShowResultSet(META_DATA, rows); + } + + @Override + public R accept(PlanVisitor visitor, C context) { + return visitor.visitShowSqlBlockRuleCommand(this, context); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java index 117c42b7bfc359..c4d46c6cad1542 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java @@ -66,6 +66,7 @@ import org.apache.doris.nereids.trees.plans.commands.ShowProcedureStatusCommand; import org.apache.doris.nereids.trees.plans.commands.ShowRepositoriesCommand; import org.apache.doris.nereids.trees.plans.commands.ShowRolesCommand; +import org.apache.doris.nereids.trees.plans.commands.ShowSqlBlockRuleCommand; import org.apache.doris.nereids.trees.plans.commands.ShowStorageEnginesCommand; import org.apache.doris.nereids.trees.plans.commands.ShowTableIdCommand; import org.apache.doris.nereids.trees.plans.commands.ShowVariablesCommand; @@ -280,6 +281,10 @@ default R visitShowBackendsCommand(ShowBackendsCommand showBackendsCommand, C co return visitCommand(showBackendsCommand, context); } + default R visitShowSqlBlockRuleCommand(ShowSqlBlockRuleCommand showblockruleCommand, C context) { + return visitCommand(showblockruleCommand, context); + } + default R visitShowPluginsCommand(ShowPluginsCommand showPluginsCommand, C context) { return visitCommand(showPluginsCommand, context); } diff --git a/regression-test/data/sql_block_rule_p0/test_sql_block_rule.out b/regression-test/data/sql_block_rule_p0/test_sql_block_rule.out index f958424e65c626..373ec1348d1b39 100644 --- a/regression-test/data/sql_block_rule_p0/test_sql_block_rule.out +++ b/regression-test/data/sql_block_rule_p0/test_sql_block_rule.out @@ -1,3 +1,9 @@ -- This file is automatically generated. You should know what you did if you want to edit this --- !select -- +-- !select1 -- +test_rule_sql SELECT abcd FROM table_2 NULL 0 0 0 true true + +-- !select2 -- +test_rule_sql SELECT abcd FROM table_2 NULL 0 0 0 true true + +-- !select3 -- diff --git a/regression-test/suites/sql_block_rule_p0/test_sql_block_rule.groovy b/regression-test/suites/sql_block_rule_p0/test_sql_block_rule.groovy index 651ee946bd92bb..e0243e35a090a7 100644 --- a/regression-test/suites/sql_block_rule_p0/test_sql_block_rule.groovy +++ b/regression-test/suites/sql_block_rule_p0/test_sql_block_rule.groovy @@ -82,6 +82,16 @@ suite("test_sql_block_rule", "nonConcurrent") { exception "sql match regex sql block rule: test_rule_sql" } + checkNereidsExecute("SHOW SQL_BLOCK_RULE") + + qt_select1 """ + SHOW SQL_BLOCK_RULE + """ + + qt_select2 """ + SHOW SQL_BLOCK_RULE FOR test_rule_sql + """ + sql """ DROP SQL_BLOCK_RULE if exists test_rule_sql """ @@ -100,7 +110,7 @@ suite("test_sql_block_rule", "nonConcurrent") { exception "sql hits sql block rule: test_rule_num, reach tablet_num : 1" } */ - qt_select """ + qt_select3 """ SHOW SQL_BLOCK_RULE """ From 6f8795af771f4f554b36daed5de9a90132eb9820 Mon Sep 17 00:00:00 2001 From: Dongyang Li Date: Tue, 19 Nov 2024 17:11:28 +0800 Subject: [PATCH 30/63] [chore](ci) adjust some invalid url (#44261) --- docker/thirdparties/docker-compose/hive/scripts/README | 4 ++-- docker/thirdparties/run-thirdparties-docker.sh | 2 +- .../src/main/groovy/org/apache/doris/regression/Config.groovy | 2 +- .../external_table_p0/tvf/test_s3_tvf_with_resource.groovy | 1 - 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/docker/thirdparties/docker-compose/hive/scripts/README b/docker/thirdparties/docker-compose/hive/scripts/README index 4eaf3893486b3a..4e8d5bb0b8ad9c 100644 --- a/docker/thirdparties/docker-compose/hive/scripts/README +++ b/docker/thirdparties/docker-compose/hive/scripts/README @@ -1,9 +1,9 @@ 1. Download parquet file packages from: - https://doris-build-hk-1308700295.cos.ap-hongkong.myqcloud.com/regression/load/tpch1_parquet/tpch1.db.tar.gz + https://doris-regression-hk.oss-cn-hongkong.aliyuncs.com/regression/datalake/pipeline_data/tpch1.db.tar.gz 2. Unzip and name it to "tpch1.db" 3. Download paimon file from: - https://doris-build-hk-1308700295.cos.ap-hongkong.myqcloud.com/regression/paimon/paimon1.tar.gz + https://doris-regression-hk.oss-cn-hongkong.aliyuncs.com/regression/datalake/pipeline_data/paimon1.tar.gz 4. Unzip and name it to "paimon1" diff --git a/docker/thirdparties/run-thirdparties-docker.sh b/docker/thirdparties/run-thirdparties-docker.sh index e6a5bb43771e16..4bd09b7b137c61 100755 --- a/docker/thirdparties/run-thirdparties-docker.sh +++ b/docker/thirdparties/run-thirdparties-docker.sh @@ -446,7 +446,7 @@ start_hudi() { sudo rm -rf "${ROOT}"/docker-compose/hudi/hive-metastore-postgresql sudo mkdir "${ROOT}"/docker-compose/hudi/hive-metastore-postgresql if [[ ! -d "${ROOT}/docker-compose/hudi/scripts/hudi_docker_compose_attached_file" ]]; then - echo "Attached files does not exist, please download the https://doris-build-hk-1308700295.cos.ap-hongkong.myqcloud.com/regression/load/hudi/hudi_docker_compose_attached_file.zip file to the docker-compose/hudi/scripts/ directory and unzip it." + echo "Attached files does not exist, please download the https://doris-regression-hk.oss-cn-hongkong.aliyuncs.com/regression/load/hudi/hudi_docker_compose_attached_file.zip file to the docker-compose/hudi/scripts/ directory and unzip it." exit 1 fi sudo docker compose -f "${ROOT}"/docker-compose/hudi/hudi.yaml --env-file "${ROOT}"/docker-compose/hudi/hadoop.env up -d diff --git a/regression-test/framework/src/main/groovy/org/apache/doris/regression/Config.groovy b/regression-test/framework/src/main/groovy/org/apache/doris/regression/Config.groovy index 7f971e83bfb02f..7b0d24482a29a1 100644 --- a/regression-test/framework/src/main/groovy/org/apache/doris/regression/Config.groovy +++ b/regression-test/framework/src/main/groovy/org/apache/doris/regression/Config.groovy @@ -669,7 +669,7 @@ class Config { if (config.s3Source == "aliyun") { s3BucketName = "doris-regression-hk" } else if (config.s3Source == "aliyun-internal") { - s3BucketName = "doris-regression" + s3BucketName = "doris-regression-bj" } else if (config.s3Source == "tencent") { s3BucketName = "doris-build-1308700295" } else if (config.s3Source == "huawei") { diff --git a/regression-test/suites/external_table_p0/tvf/test_s3_tvf_with_resource.groovy b/regression-test/suites/external_table_p0/tvf/test_s3_tvf_with_resource.groovy index 695b3506b5c7fe..23116cca9330bd 100644 --- a/regression-test/suites/external_table_p0/tvf/test_s3_tvf_with_resource.groovy +++ b/regression-test/suites/external_table_p0/tvf/test_s3_tvf_with_resource.groovy @@ -99,7 +99,6 @@ suite("test_s3_tvf_with_resource", "p0") { // test outfile to s3 def outfile_url = outfile_to_S3() - // outfile_url like: s3://doris-build-hk-1308700295/est_s3_tvf/export_test/exp_f2cb650bbb94431a-ab0bc3e6f3e89f04_* // 1. normal try { From 37b6c5065646cdf85634be7c6302c98166fa1d76 Mon Sep 17 00:00:00 2001 From: Vallish Pai Date: Tue, 19 Nov 2024 15:19:38 +0530 Subject: [PATCH 31/63] [Enhancement] (nereids)implement showWhitelistCommand in nereids (#44155) Issue Number: close #42725 implement showWhitelistCommand in nereids --- .../org/apache/doris/nereids/DorisParser.g4 | 2 +- .../nereids/parser/LogicalPlanBuilder.java | 7 +++ .../doris/nereids/trees/plans/PlanType.java | 1 + .../plans/commands/ShowBackendsCommand.java | 4 -- .../plans/commands/ShowFrontendsCommand.java | 3 - .../commands/ShowStorageEnginesCommand.java | 3 - .../plans/commands/ShowWhiteListCommand.java | 58 +++++++++++++++++++ .../trees/plans/visitor/CommandVisitor.java | 5 ++ ...ids.out => test_show_commands_nereids.out} | 0 .../show/test_nereids_frontbackends.groovy | 22 ------- .../show/test_nereids_showbackends.groovy | 22 ------- ...oovy => test_show_commands_nereids.groovy} | 6 +- 12 files changed, 77 insertions(+), 56 deletions(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowWhiteListCommand.java rename regression-test/data/nereids_p0/show/{test_show_engines_nereids.out => test_show_commands_nereids.out} (100%) delete mode 100644 regression-test/suites/nereids_p0/show/test_nereids_frontbackends.groovy delete mode 100644 regression-test/suites/nereids_p0/show/test_nereids_showbackends.groovy rename regression-test/suites/nereids_p0/show/{test_show_engines_nereids.groovy => test_show_commands_nereids.groovy} (85%) 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 2f15ec1fd99d08..567a62c9a90753 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 @@ -216,6 +216,7 @@ supportedShowStatement | SHOW BACKENDS #showBackends | SHOW FRONTENDS name=identifier? #showFrontends | SHOW TABLE tableId=INTEGER_VALUE #showTableId + | SHOW WHITELIST #showWhitelist ; unsupportedOtherStatement @@ -252,7 +253,6 @@ unsupportedShowStatement | SHOW STAGES #showStages | SHOW STORAGE (VAULT | VAULTS) #showStorageVault | SHOW CREATE REPOSITORY FOR identifier #showCreateRepository - | SHOW WHITELIST #showWhitelist | SHOW OPEN TABLES ((FROM | IN) database=multipartIdentifier)? wildWhere? #showOpenTables | SHOW TABLE STATUS ((FROM | IN) database=multipartIdentifier)? wildWhere? #showTableStatus | SHOW FULL? TABLES ((FROM | IN) database=multipartIdentifier)? wildWhere? #showTables 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 d92e06081198c2..a5256394f20659 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 @@ -216,6 +216,7 @@ import org.apache.doris.nereids.DorisParser.ShowTableIdContext; import org.apache.doris.nereids.DorisParser.ShowVariablesContext; import org.apache.doris.nereids.DorisParser.ShowViewContext; +import org.apache.doris.nereids.DorisParser.ShowWhitelistContext; import org.apache.doris.nereids.DorisParser.SimpleColumnDefContext; import org.apache.doris.nereids.DorisParser.SimpleColumnDefsContext; import org.apache.doris.nereids.DorisParser.SingleStatementContext; @@ -464,6 +465,7 @@ import org.apache.doris.nereids.trees.plans.commands.ShowTableIdCommand; import org.apache.doris.nereids.trees.plans.commands.ShowVariablesCommand; import org.apache.doris.nereids.trees.plans.commands.ShowViewCommand; +import org.apache.doris.nereids.trees.plans.commands.ShowWhiteListCommand; import org.apache.doris.nereids.trees.plans.commands.UnsetDefaultStorageVaultCommand; import org.apache.doris.nereids.trees.plans.commands.UnsetVariableCommand; import org.apache.doris.nereids.trees.plans.commands.UnsupportedCommand; @@ -4176,6 +4178,11 @@ public LogicalPlan visitShowFrontends(ShowFrontendsContext ctx) { return new ShowFrontendsCommand(detail); } + @Override + public LogicalPlan visitShowWhitelist(ShowWhitelistContext ctx) { + return new ShowWhiteListCommand(); + } + @Override public LogicalPlan visitRecoverDatabase(RecoverDatabaseContext ctx) { String dbName = ctx.name.getText(); 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 ab6f1dc79fcf10..b251530fe901ac 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 @@ -194,6 +194,7 @@ public enum PlanType { SHOW_VARIABLES_COMMAND, SHOW_AUTHORS_COMMAND, SHOW_VIEW_COMMAND, + SHOW_WHITE_LIST_COMMAND, RECOVER_DATABASE_COMMAND, RECOVER_TABLE_COMMAND, RECOVER_PARTITION_COMMAND, diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowBackendsCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowBackendsCommand.java index 9119e8490f4b00..5e6d759ea5a8d9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowBackendsCommand.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowBackendsCommand.java @@ -32,9 +32,6 @@ import org.apache.doris.qe.ShowResultSetMetaData; import org.apache.doris.qe.StmtExecutor; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - import java.util.Comparator; import java.util.List; @@ -42,7 +39,6 @@ * show backends command */ public class ShowBackendsCommand extends ShowCommand { - public static final Logger LOG = LogManager.getLogger(ShowBackendsCommand.class); /** * constructor diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowFrontendsCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowFrontendsCommand.java index 718b5474efd3a9..639c93a2872398 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowFrontendsCommand.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowFrontendsCommand.java @@ -35,8 +35,6 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import java.util.List; @@ -44,7 +42,6 @@ * show frontends command */ public class ShowFrontendsCommand extends ShowCommand { - public static final Logger LOG = LogManager.getLogger(ShowFrontendsCommand.class); private final String detail; /** diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowStorageEnginesCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowStorageEnginesCommand.java index e57d3d4091686d..5fd10581a3e2a6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowStorageEnginesCommand.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowStorageEnginesCommand.java @@ -27,8 +27,6 @@ import org.apache.doris.qe.StmtExecutor; import com.google.common.collect.Lists; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import java.util.List; @@ -36,7 +34,6 @@ * show storage engines command */ public class ShowStorageEnginesCommand extends ShowCommand { - public static final Logger LOG = LogManager.getLogger(ShowStorageEnginesCommand.class); /** * constructor diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowWhiteListCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowWhiteListCommand.java new file mode 100644 index 00000000000000..f3108cf347a0a2 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowWhiteListCommand.java @@ -0,0 +1,58 @@ +// 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.commands; + +import org.apache.doris.catalog.Column; +import org.apache.doris.catalog.ScalarType; +import org.apache.doris.nereids.trees.plans.PlanType; +import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor; +import org.apache.doris.qe.ConnectContext; +import org.apache.doris.qe.ShowResultSet; +import org.apache.doris.qe.ShowResultSetMetaData; +import org.apache.doris.qe.StmtExecutor; + +import com.google.common.collect.Lists; + +import java.util.List; + +/** + * show whitelist + */ +public class ShowWhiteListCommand extends ShowCommand { + private static final ShowResultSetMetaData META_DATA = + ShowResultSetMetaData.builder() + .addColumn(new Column("user_name", ScalarType.createVarchar(20))) + .addColumn(new Column("white_list", ScalarType.createVarchar(1000))) + .build(); + + public ShowWhiteListCommand() { + super(PlanType.SHOW_WHITE_LIST_COMMAND); + } + + @Override + public R accept(PlanVisitor visitor, C context) { + return visitor.visitShowWhiteListCommand(this, context); + } + + @Override + public ShowResultSet doRun(ConnectContext ctx, StmtExecutor executor) throws Exception { + List> rowSet = Lists.newArrayList(); + // show whitelist doesnt return any data currently. + return new ShowResultSet(META_DATA, rowSet); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java index c4d46c6cad1542..60d47db04d570e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java @@ -71,6 +71,7 @@ import org.apache.doris.nereids.trees.plans.commands.ShowTableIdCommand; import org.apache.doris.nereids.trees.plans.commands.ShowVariablesCommand; import org.apache.doris.nereids.trees.plans.commands.ShowViewCommand; +import org.apache.doris.nereids.trees.plans.commands.ShowWhiteListCommand; import org.apache.doris.nereids.trees.plans.commands.UnsetDefaultStorageVaultCommand; import org.apache.doris.nereids.trees.plans.commands.UnsetVariableCommand; import org.apache.doris.nereids.trees.plans.commands.UnsupportedCommand; @@ -318,6 +319,10 @@ default R visitShowFrontendsCommand(ShowFrontendsCommand showFrontendsCommand, C return visitCommand(showFrontendsCommand, context); } + default R visitShowWhiteListCommand(ShowWhiteListCommand whiteListCommand, C context) { + return visitCommand(whiteListCommand, context); + } + default R visitRecoverDatabaseCommand(RecoverDatabaseCommand recoverDatabaseCommand, C context) { return visitCommand(recoverDatabaseCommand, context); } diff --git a/regression-test/data/nereids_p0/show/test_show_engines_nereids.out b/regression-test/data/nereids_p0/show/test_show_commands_nereids.out similarity index 100% rename from regression-test/data/nereids_p0/show/test_show_engines_nereids.out rename to regression-test/data/nereids_p0/show/test_show_commands_nereids.out diff --git a/regression-test/suites/nereids_p0/show/test_nereids_frontbackends.groovy b/regression-test/suites/nereids_p0/show/test_nereids_frontbackends.groovy deleted file mode 100644 index 18204713e2b9fb..00000000000000 --- a/regression-test/suites/nereids_p0/show/test_nereids_frontbackends.groovy +++ /dev/null @@ -1,22 +0,0 @@ -// 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_nereids_showfrontends") { - checkNereidsExecute("""show frontends;""") -} - diff --git a/regression-test/suites/nereids_p0/show/test_nereids_showbackends.groovy b/regression-test/suites/nereids_p0/show/test_nereids_showbackends.groovy deleted file mode 100644 index 66980ab0e61ac8..00000000000000 --- a/regression-test/suites/nereids_p0/show/test_nereids_showbackends.groovy +++ /dev/null @@ -1,22 +0,0 @@ -// 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_nereids_showbackends") { - checkNereidsExecute("""show backends;""") -} - diff --git a/regression-test/suites/nereids_p0/show/test_show_engines_nereids.groovy b/regression-test/suites/nereids_p0/show/test_show_commands_nereids.groovy similarity index 85% rename from regression-test/suites/nereids_p0/show/test_show_engines_nereids.groovy rename to regression-test/suites/nereids_p0/show/test_show_commands_nereids.groovy index 4ef725a4adf098..7721130d5586f0 100644 --- a/regression-test/suites/nereids_p0/show/test_show_engines_nereids.groovy +++ b/regression-test/suites/nereids_p0/show/test_show_commands_nereids.groovy @@ -15,10 +15,14 @@ // specific language governing permissions and limitations // under the License. -suite("test_show_engines_nereids") { +suite("test_show_commands_nereids") { checkNereidsExecute("show engines;") qt_cmd_1("show engines;") checkNereidsExecute("show storage engines;") qt_cmd_2("show storage engines;") // can not use qt to check, the output may change. + + checkNereidsExecute("""show frontends;""") + checkNereidsExecute("""show backends;""") + checkNereidsExecute("""show whitelist;""") } From 7fdba82fab7244c93f924f1a9d1dab2e4e79215a Mon Sep 17 00:00:00 2001 From: Vallish Pai Date: Tue, 19 Nov 2024 15:20:08 +0530 Subject: [PATCH 32/63] [Enhancement] (nereids)implement showGrantsCommand in nereids (#44158) Issue Number: close #42766 #42767 implement showGrantsCommand and showGrantsForUserCommand in nereids --- .../org/apache/doris/nereids/DorisParser.g4 | 6 +- .../nereids/parser/LogicalPlanBuilder.java | 15 +++ .../doris/nereids/trees/plans/PlanType.java | 1 + .../plans/commands/ShowGrantsCommand.java | 102 ++++++++++++++++++ .../trees/plans/visitor/CommandVisitor.java | 5 + .../manager/test_manager_interface_3.groovy | 6 +- 6 files changed, 129 insertions(+), 6 deletions(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowGrantsCommand.java 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 567a62c9a90753..37c9be99177fb3 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 @@ -199,7 +199,9 @@ supportedDropStatement supportedShowStatement : SHOW (GLOBAL | SESSION | LOCAL)? VARIABLES wildWhere? #showVariables | SHOW AUTHORS #showAuthors - | SHOW LAST INSERT #showLastInsert + | SHOW LAST INSERT #showLastInsert + | SHOW ALL? GRANTS #showGrants + | SHOW GRANTS FOR userIdentify #showGrantsForUser | SHOW VIEW (FROM |IN) tableName=multipartIdentifier ((FROM | IN) database=identifier)? #showView @@ -309,8 +311,6 @@ unsupportedShowStatement | SHOW WORKLOAD GROUPS wildWhere? #showWorkloadGroups | SHOW TRASH (ON backend=STRING_LITERAL)? #showTrash | SHOW SNAPSHOT ON repo=identifier wildWhere? #showSnapshot - | SHOW ALL? GRANTS #showGrants - | SHOW GRANTS FOR userIdentify #showGrantsForUser | SHOW FULL? BUILTIN? FUNCTIONS ((FROM | IN) database=multipartIdentifier)? wildWhere? #showFunctions | SHOW GLOBAL FULL? FUNCTIONS wildWhere? #showGlobalFunctions 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 a5256394f20659..32f85a52a1282f 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 @@ -203,6 +203,8 @@ import org.apache.doris.nereids.DorisParser.ShowCreateMaterializedViewContext; import org.apache.doris.nereids.DorisParser.ShowCreateProcedureContext; import org.apache.doris.nereids.DorisParser.ShowFrontendsContext; +import org.apache.doris.nereids.DorisParser.ShowGrantsContext; +import org.apache.doris.nereids.DorisParser.ShowGrantsForUserContext; import org.apache.doris.nereids.DorisParser.ShowLastInsertContext; import org.apache.doris.nereids.DorisParser.ShowPartitionIdContext; import org.apache.doris.nereids.DorisParser.ShowPluginsContext; @@ -452,6 +454,7 @@ import org.apache.doris.nereids.trees.plans.commands.ShowCreateMaterializedViewCommand; import org.apache.doris.nereids.trees.plans.commands.ShowCreateProcedureCommand; import org.apache.doris.nereids.trees.plans.commands.ShowFrontendsCommand; +import org.apache.doris.nereids.trees.plans.commands.ShowGrantsCommand; import org.apache.doris.nereids.trees.plans.commands.ShowLastInsertCommand; import org.apache.doris.nereids.trees.plans.commands.ShowPartitionIdCommand; import org.apache.doris.nereids.trees.plans.commands.ShowPluginsCommand; @@ -4071,6 +4074,18 @@ public LogicalPlan visitShowLastInsert(ShowLastInsertContext ctx) { return new ShowLastInsertCommand(); } + @Override + public LogicalPlan visitShowGrants(ShowGrantsContext ctx) { + boolean all = (ctx.ALL() != null) ? true : false; + return new ShowGrantsCommand(null, all); + } + + @Override + public LogicalPlan visitShowGrantsForUser(ShowGrantsForUserContext ctx) { + UserIdentity userIdent = visitUserIdentify(ctx.userIdentify()); + return new ShowGrantsCommand(userIdent, false); + } + @Override public LogicalPlan visitShowPartitionId(ShowPartitionIdContext ctx) { long partitionId = -1; 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 b251530fe901ac..8f68cd7287efd6 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 @@ -182,6 +182,7 @@ public enum PlanType { SHOW_CONFIG_COMMAND, SHOW_CREATE_MATERIALIZED_VIEW_COMMAND, SHOW_FRONTENDS_COMMAND, + SHOW_GRANTS_COMMAND, SHOW_LAST_INSERT_COMMAND, SHOW_PARTITIONID_COMMAND, SHOW_PROC_COMMAND, diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowGrantsCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowGrantsCommand.java new file mode 100644 index 00000000000000..f877f42b83599f --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowGrantsCommand.java @@ -0,0 +1,102 @@ +// 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.commands; + +import org.apache.doris.analysis.UserIdentity; +import org.apache.doris.catalog.Column; +import org.apache.doris.catalog.Env; +import org.apache.doris.catalog.ScalarType; +import org.apache.doris.common.AnalysisException; +import org.apache.doris.common.ErrorCode; +import org.apache.doris.common.ErrorReport; +import org.apache.doris.common.proc.AuthProcDir; +import org.apache.doris.mysql.privilege.PrivPredicate; +import org.apache.doris.nereids.trees.plans.PlanType; +import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor; +import org.apache.doris.qe.ConnectContext; +import org.apache.doris.qe.ShowResultSet; +import org.apache.doris.qe.ShowResultSetMetaData; +import org.apache.doris.qe.StmtExecutor; + +import com.google.common.base.Preconditions; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.List; + +/** + * show grants command + */ +public class ShowGrantsCommand extends ShowCommand { + public static final Logger LOG = LogManager.getLogger(ShowGrantsCommand.class); + private static final ShowResultSetMetaData META_DATA; + private final boolean isAll; + private UserIdentity userIdent; // if not given will update with self. + + static { + ShowResultSetMetaData.Builder builder = ShowResultSetMetaData.builder(); + for (String col : AuthProcDir.TITLE_NAMES) { + builder.addColumn(new Column(col, ScalarType.createVarchar(100))); + } + META_DATA = builder.build(); + } + + /** + * constructor + */ + public ShowGrantsCommand(UserIdentity userIdent, boolean isAll) { + super(PlanType.SHOW_GRANTS_COMMAND); + this.userIdent = userIdent; + this.isAll = isAll; + } + + @Override + public ShowResultSet doRun(ConnectContext ctx, StmtExecutor executor) throws Exception { + if (userIdent != null) { + if (isAll) { + throw new AnalysisException("Can not specified keyword ALL when specified user"); + } + userIdent.analyze(); + } else { + if (!isAll) { + // self + userIdent = ConnectContext.get().getCurrentUserIdentity(); + } + } + Preconditions.checkState(isAll || userIdent != null); + UserIdentity self = ConnectContext.get().getCurrentUserIdentity(); + + // if show all grants, or show other user's grants, need global GRANT priv. + if (isAll || !self.equals(userIdent)) { + if (!Env.getCurrentEnv().getAccessManager().checkGlobalPriv(ConnectContext.get(), PrivPredicate.GRANT)) { + ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR, "GRANT"); + } + } + if (userIdent != null && !Env.getCurrentEnv().getAccessManager().getAuth().doesUserExist(userIdent)) { + throw new AnalysisException(String.format("User: %s does not exist", userIdent)); + } + List> infos = Env.getCurrentEnv().getAuth().getAuthInfo(userIdent); + return new ShowResultSet(META_DATA, infos); + } + + @Override + public R accept(PlanVisitor visitor, C context) { + return visitor.visitShowGrantsCommand(this, context); + } + +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java index 60d47db04d570e..d80a24cd347172 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java @@ -58,6 +58,7 @@ import org.apache.doris.nereids.trees.plans.commands.ShowCreateMaterializedViewCommand; import org.apache.doris.nereids.trees.plans.commands.ShowCreateProcedureCommand; import org.apache.doris.nereids.trees.plans.commands.ShowFrontendsCommand; +import org.apache.doris.nereids.trees.plans.commands.ShowGrantsCommand; import org.apache.doris.nereids.trees.plans.commands.ShowLastInsertCommand; import org.apache.doris.nereids.trees.plans.commands.ShowPartitionIdCommand; import org.apache.doris.nereids.trees.plans.commands.ShowPluginsCommand; @@ -266,6 +267,10 @@ default R visitShowLastInsertCommand(ShowLastInsertCommand showLastInsertCommand return visitCommand(showLastInsertCommand, context); } + default R visitShowGrantsCommand(ShowGrantsCommand showGrantsCommand, C context) { + return visitCommand(showGrantsCommand, context); + } + default R visitShowPartitionIdCommand(ShowPartitionIdCommand showPartitionIdCommand, C context) { return visitCommand(showPartitionIdCommand, context); } diff --git a/regression-test/suites/manager/test_manager_interface_3.groovy b/regression-test/suites/manager/test_manager_interface_3.groovy index 52e5f5f99db55b..587fa48f9ebb01 100644 --- a/regression-test/suites/manager/test_manager_interface_3.groovy +++ b/regression-test/suites/manager/test_manager_interface_3.groovy @@ -267,8 +267,8 @@ suite('test_manager_interface_3',"p0") { } } assertTrue(x == 4) - - + checkNereidsExecute("show grants for ${user2}"); + checkNereidsExecute("show grants"); result = sql """show grants """ x = 0 for(int i = 0;i < result.size(); i++ ) { @@ -438,7 +438,7 @@ suite('test_manager_interface_3',"p0") { assertTrue(x == 20) } - + checkNereidsExecute("show all grants"); result = sql """ show all grants""" x = 0 for(int i = 0;i < result.size(); i++ ) { From 192549b8551e5795b59fce25d597a90e82f23029 Mon Sep 17 00:00:00 2001 From: Dongyang Li Date: Tue, 19 Nov 2024 18:19:45 +0800 Subject: [PATCH 33/63] [fix](case) avoid same table name in different cases (#43064) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### What problem does this PR solve? avoid the same table name in different cases,which may cause case unstable. --- .../schema_change_p0/test_agg_schema_key_change_modify.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/regression-test/suites/schema_change_p0/test_agg_schema_key_change_modify.groovy b/regression-test/suites/schema_change_p0/test_agg_schema_key_change_modify.groovy index 70e2c2c242c0cf..6b59c7afc3fa2a 100644 --- a/regression-test/suites/schema_change_p0/test_agg_schema_key_change_modify.groovy +++ b/regression-test/suites/schema_change_p0/test_agg_schema_key_change_modify.groovy @@ -16,8 +16,8 @@ // under the License. suite("test_agg_schema_key_change_modify","p0") { - def tbName1 = "test_agg_schema_key_change_modify1" - def tbName2 = "test_agg_schema_key_change_modify_1" + def tbName1 = "test_agg_schema_key_change_modify" + def tbName2 = "test_agg_schema_key_change_modify_" def initTable1 = "" def initTableData1 = "" From cfc84c505d9d3118961a6efc6d5aa5464d7ba935 Mon Sep 17 00:00:00 2001 From: zclllhhjj Date: Tue, 19 Nov 2024 18:22:36 +0800 Subject: [PATCH 34/63] [testcase](docs) testcases for partition documents refactor (#44191) ### What problem does this PR solve? Issue Number: close #xxx Related PR: #xxx Problem Summary: NOTICE: in this pr we changed jdbc conf of regression test p0&cloud_p0. we expect it has no other effect. --- regression-test/conf/regression-conf.groovy | 4 +- .../conf/regression-conf-custom.groovy | 3 + .../pipeline/p0/conf/regression-conf.groovy | 4 +- .../auto-partitioning.md.groovy | 262 ++++++++++-------- .../basic-concepts.md.groovy | 243 +++++++++++++--- 5 files changed, 353 insertions(+), 163 deletions(-) diff --git a/regression-test/conf/regression-conf.groovy b/regression-test/conf/regression-conf.groovy index a5304e995bf030..2ee288d489487d 100644 --- a/regression-test/conf/regression-conf.groovy +++ b/regression-test/conf/regression-conf.groovy @@ -24,8 +24,8 @@ defaultDb = "regression_test" // init cmd like: select @@session.tx_read_only // at each time we connect. // add allowLoadLocalInfile so that the jdbc can execute mysql load data from client. -jdbcUrl = "jdbc:mysql://127.0.0.1:9030/?useLocalSessionState=true&allowLoadLocalInfile=true" -targetJdbcUrl = "jdbc:mysql://127.0.0.1:9030/?useLocalSessionState=true&allowLoadLocalInfile=true" +jdbcUrl = "jdbc:mysql://127.0.0.1:9030/?useLocalSessionState=true&allowLoadLocalInfile=true&zeroDateTimeBehavior=round" +targetJdbcUrl = "jdbc:mysql://127.0.0.1:9030/?useLocalSessionState=true&allowLoadLocalInfile=true&zeroDateTimeBehavior=round" jdbcUser = "root" jdbcPassword = "" diff --git a/regression-test/pipeline/cloud_p0/conf/regression-conf-custom.groovy b/regression-test/pipeline/cloud_p0/conf/regression-conf-custom.groovy index fabf9f2e490797..4fe22d3d2cbfe4 100644 --- a/regression-test/pipeline/cloud_p0/conf/regression-conf-custom.groovy +++ b/regression-test/pipeline/cloud_p0/conf/regression-conf-custom.groovy @@ -17,6 +17,9 @@ testGroups = "p0" +jdbcUrl = "jdbc:mysql://127.0.0.1:9030/?useLocalSessionState=true&allowLoadLocalInfile=true&zeroDateTimeBehavior=round" +targetJdbcUrl = "jdbc:mysql://127.0.0.1:9030/?useLocalSessionState=true&allowLoadLocalInfile=true&zeroDateTimeBehavior=round" + // exclude groups and exclude suites is more prior than include groups and include suites. // keep them in lexico order(add/remove cases between the sentinals and sort): // * sort lines in vim: select lines and then type :sort diff --git a/regression-test/pipeline/p0/conf/regression-conf.groovy b/regression-test/pipeline/p0/conf/regression-conf.groovy index 0b8c3a2508934e..f89365ef4f4fac 100644 --- a/regression-test/pipeline/p0/conf/regression-conf.groovy +++ b/regression-test/pipeline/p0/conf/regression-conf.groovy @@ -20,8 +20,8 @@ // **Note**: default db will be create if not exist defaultDb = "regression_test" -jdbcUrl = "jdbc:mysql://172.19.0.2:9131/?useLocalSessionState=true&allowLoadLocalInfile=true" -targetJdbcUrl = "jdbc:mysql://172.19.0.2:9131/?useLocalSessionState=true&allowLoadLocalInfile=true" +jdbcUrl = "jdbc:mysql://172.19.0.2:9131/?useLocalSessionState=true&allowLoadLocalInfile=true&zeroDateTimeBehavior=round" +targetJdbcUrl = "jdbc:mysql://172.19.0.2:9131/?useLocalSessionState=true&allowLoadLocalInfile=true&zeroDateTimeBehavior=round" jdbcUser = "root" jdbcPassword = "" diff --git a/regression-test/suites/doc/table-design/data-partitioning/auto-partitioning.md.groovy b/regression-test/suites/doc/table-design/data-partitioning/auto-partitioning.md.groovy index b8b40c87cf033f..c67537d78c9a98 100644 --- a/regression-test/suites/doc/table-design/data-partitioning/auto-partitioning.md.groovy +++ b/regression-test/suites/doc/table-design/data-partitioning/auto-partitioning.md.groovy @@ -18,140 +18,162 @@ import org.junit.jupiter.api.Assertions; suite("docs/table-design/data-partitioning/auto-partitioning.md") { - try { - sql "drop table if exists `DAILY_TRADE_VALUE`" - sql """ - CREATE TABLE `DAILY_TRADE_VALUE` - ( - `TRADE_DATE` datev2 NOT NULL COMMENT '交易日期', - `TRADE_ID` varchar(40) NOT NULL COMMENT '交易编号', - ) - UNIQUE KEY(`TRADE_DATE`, `TRADE_ID`) - PARTITION BY RANGE(`TRADE_DATE`) - ( - PARTITION p_2000 VALUES [('2000-01-01'), ('2001-01-01')), - PARTITION p_2001 VALUES [('2001-01-01'), ('2002-01-01')), - PARTITION p_2002 VALUES [('2002-01-01'), ('2003-01-01')), - PARTITION p_2003 VALUES [('2003-01-01'), ('2004-01-01')), - PARTITION p_2004 VALUES [('2004-01-01'), ('2005-01-01')), - PARTITION p_2005 VALUES [('2005-01-01'), ('2006-01-01')), - PARTITION p_2006 VALUES [('2006-01-01'), ('2007-01-01')), - PARTITION p_2007 VALUES [('2007-01-01'), ('2008-01-01')), - PARTITION p_2008 VALUES [('2008-01-01'), ('2009-01-01')), - PARTITION p_2009 VALUES [('2009-01-01'), ('2010-01-01')), - PARTITION p_2010 VALUES [('2010-01-01'), ('2011-01-01')), - PARTITION p_2011 VALUES [('2011-01-01'), ('2012-01-01')), - PARTITION p_2012 VALUES [('2012-01-01'), ('2013-01-01')), - PARTITION p_2013 VALUES [('2013-01-01'), ('2014-01-01')), - PARTITION p_2014 VALUES [('2014-01-01'), ('2015-01-01')), - PARTITION p_2015 VALUES [('2015-01-01'), ('2016-01-01')), - PARTITION p_2016 VALUES [('2016-01-01'), ('2017-01-01')), - PARTITION p_2017 VALUES [('2017-01-01'), ('2018-01-01')), - PARTITION p_2018 VALUES [('2018-01-01'), ('2019-01-01')), - PARTITION p_2019 VALUES [('2019-01-01'), ('2020-01-01')), - PARTITION p_2020 VALUES [('2020-01-01'), ('2021-01-01')), - PARTITION p_2021 VALUES [('2021-01-01'), ('2022-01-01')) - ) - DISTRIBUTED BY HASH(`TRADE_DATE`) BUCKETS 10 - PROPERTIES ( - "replication_num" = "1" - ) - """ + sql "drop table if exists `DAILY_TRADE_VALUE`" + sql """ + CREATE TABLE `DAILY_TRADE_VALUE` + ( + `TRADE_DATE` datev2 NOT NULL COMMENT '交易日期', + `TRADE_ID` varchar(40) NOT NULL COMMENT '交易编号', + ) + UNIQUE KEY(`TRADE_DATE`, `TRADE_ID`) + PARTITION BY RANGE(`TRADE_DATE`) + ( + PARTITION p_2000 VALUES [('2000-01-01'), ('2001-01-01')), + PARTITION p_2001 VALUES [('2001-01-01'), ('2002-01-01')), + PARTITION p_2002 VALUES [('2002-01-01'), ('2003-01-01')), + PARTITION p_2003 VALUES [('2003-01-01'), ('2004-01-01')), + PARTITION p_2004 VALUES [('2004-01-01'), ('2005-01-01')), + PARTITION p_2005 VALUES [('2005-01-01'), ('2006-01-01')), + PARTITION p_2006 VALUES [('2006-01-01'), ('2007-01-01')), + PARTITION p_2007 VALUES [('2007-01-01'), ('2008-01-01')), + PARTITION p_2008 VALUES [('2008-01-01'), ('2009-01-01')), + PARTITION p_2009 VALUES [('2009-01-01'), ('2010-01-01')), + PARTITION p_2010 VALUES [('2010-01-01'), ('2011-01-01')), + PARTITION p_2011 VALUES [('2011-01-01'), ('2012-01-01')), + PARTITION p_2012 VALUES [('2012-01-01'), ('2013-01-01')), + PARTITION p_2013 VALUES [('2013-01-01'), ('2014-01-01')), + PARTITION p_2014 VALUES [('2014-01-01'), ('2015-01-01')), + PARTITION p_2015 VALUES [('2015-01-01'), ('2016-01-01')), + PARTITION p_2016 VALUES [('2016-01-01'), ('2017-01-01')), + PARTITION p_2017 VALUES [('2017-01-01'), ('2018-01-01')), + PARTITION p_2018 VALUES [('2018-01-01'), ('2019-01-01')), + PARTITION p_2019 VALUES [('2019-01-01'), ('2020-01-01')), + PARTITION p_2020 VALUES [('2020-01-01'), ('2021-01-01')), + PARTITION p_2021 VALUES [('2021-01-01'), ('2022-01-01')) + ) + DISTRIBUTED BY HASH(`TRADE_DATE`) BUCKETS 10 + PROPERTIES ( + "replication_num" = "1" + ) + """ - sql "drop table if exists `date_table`" - sql """ - CREATE TABLE `date_table` ( - `TIME_STAMP` datev2 NOT NULL COMMENT '采集日期' - ) ENGINE=OLAP - DUPLICATE KEY(`TIME_STAMP`) - AUTO PARTITION BY RANGE (date_trunc(`TIME_STAMP`, 'month')) - ( - ) - DISTRIBUTED BY HASH(`TIME_STAMP`) BUCKETS 10 - PROPERTIES ( - "replication_allocation" = "tag.location.default: 1" - ) - """ + sql "drop table if exists `date_table`" + sql """ + CREATE TABLE `date_table` ( + `TIME_STAMP` datev2 NOT NULL COMMENT '采集日期' + ) ENGINE=OLAP + DUPLICATE KEY(`TIME_STAMP`) + AUTO PARTITION BY RANGE (date_trunc(`TIME_STAMP`, 'month')) + ( + ) + DISTRIBUTED BY HASH(`TIME_STAMP`) BUCKETS 10 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1" + ) + """ + + sql "drop table if exists `str_table`" + sql """ + CREATE TABLE `str_table` ( + `str` varchar not null + ) ENGINE=OLAP + DUPLICATE KEY(`str`) + AUTO PARTITION BY LIST (`str`) + ( + ) + DISTRIBUTED BY HASH(`str`) BUCKETS 10 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1" + ) + """ - sql "drop table if exists `str_table`" + sql "drop table if exists auto_null_list" + multi_sql """ + create table auto_null_list( + k0 varchar null + ) + auto partition by list (k0) + ( + ) + DISTRIBUTED BY HASH(`k0`) BUCKETS 1 + properties("replication_num" = "1"); + + insert into auto_null_list values (null); + select * from auto_null_list; + select * from auto_null_list partition(pX); + """ + + try { + sql "drop table if exists `range_table_nullable`" sql """ - CREATE TABLE `str_table` ( - `str` varchar not null + CREATE TABLE `range_table_nullable` ( + `k1` INT, + `k2` DATETIMEV2(3), + `k3` DATETIMEV2(6) ) ENGINE=OLAP - DUPLICATE KEY(`str`) - AUTO PARTITION BY LIST (`str`) + DUPLICATE KEY(`k1`) + AUTO PARTITION BY RANGE (date_trunc(`k2`, 'day')) ( ) - DISTRIBUTED BY HASH(`str`) BUCKETS 10 + DISTRIBUTED BY HASH(`k1`) BUCKETS 16 PROPERTIES ( "replication_allocation" = "tag.location.default: 1" ) """ + Assertions.fail("The SQL above should throw an exception as follows:\n\t\terrCode = 2, detailMessage = AUTO RANGE PARTITION doesn't support NULL column") + } catch (Exception e) { + assertTrue(e.getMessage().contains("errCode = 2, detailMessage = AUTO RANGE PARTITION doesn't support NULL column")) + } - sql "drop table if exists auto_null_list" - multi_sql """ - create table auto_null_list( - k0 varchar null - ) - auto partition by list (k0) - ( - ) - DISTRIBUTED BY HASH(`k0`) BUCKETS 1 - properties("replication_num" = "1"); + sql "create database if not exists auto_partition_doc_test" + sql "use auto_partition_doc_test" + sql "drop table if exists `DAILY_TRADE_VALUE`" + sql """ + CREATE TABLE `DAILY_TRADE_VALUE` + ( + `TRADE_DATE` datev2 NOT NULL COMMENT '交易日期', + `TRADE_ID` varchar(40) NOT NULL COMMENT '交易编号', + ) + UNIQUE KEY(`TRADE_DATE`, `TRADE_ID`) + AUTO PARTITION BY RANGE (date_trunc(`TRADE_DATE`, 'year')) + ( + ) + DISTRIBUTED BY HASH(`TRADE_DATE`) BUCKETS 10 + PROPERTIES ( + "replication_num" = "1" + ) + """ + def res1 = sql "show partitions from `DAILY_TRADE_VALUE`" + assertTrue(res1.isEmpty()) - insert into auto_null_list values (null); - select * from auto_null_list; - select * from auto_null_list partition(pX); - """ + def res2 = multi_sql """ + insert into `DAILY_TRADE_VALUE` values ('2012-12-13', 1), ('2008-02-03', 2), ('2014-11-11', 3); + show partitions from `DAILY_TRADE_VALUE`; + """ + assertTrue(res2[1].size() == 3) - try { - sql "drop table if exists `range_table_nullable`" - sql """ - CREATE TABLE `range_table_nullable` ( - `k1` INT, - `k2` DATETIMEV2(3), - `k3` DATETIMEV2(6) - ) ENGINE=OLAP - DUPLICATE KEY(`k1`) - AUTO PARTITION BY RANGE (date_trunc(`k2`, 'day')) - ( - ) - DISTRIBUTED BY HASH(`k1`) BUCKETS 16 - PROPERTIES ( - "replication_allocation" = "tag.location.default: 1" - ) - """ - Assertions.fail("The SQL above should throw an exception as follows:\n\t\terrCode = 2, detailMessage = AUTO RANGE PARTITION doesn't support NULL column") - } catch (Exception e) { - assertTrue(e.getMessage().contains("errCode = 2, detailMessage = AUTO RANGE PARTITION doesn't support NULL column")) - } + sql """ + select * from partitions("catalog"="internal","database"="auto_partition_doc_test","table"="DAILY_TRADE_VALUE") where PartitionName = auto_partition_name('range', 'year', '2008-02-03'); + """ - sql "drop table if exists `DAILY_TRADE_VALUE`" - sql """ - CREATE TABLE `DAILY_TRADE_VALUE` - ( - `TRADE_DATE` datev2 NOT NULL COMMENT '交易日期', - `TRADE_ID` varchar(40) NOT NULL COMMENT '交易编号', - ) - UNIQUE KEY(`TRADE_DATE`, `TRADE_ID`) - AUTO PARTITION BY RANGE (date_trunc(`TRADE_DATE`, 'year')) - ( - ) - DISTRIBUTED BY HASH(`TRADE_DATE`) BUCKETS 10 - PROPERTIES ( - "replication_num" = "1" - ) - """ - def res1 = sql "show partitions from `DAILY_TRADE_VALUE`" - assertTrue(res1.isEmpty()) - def res2 = multi_sql """ - insert into `DAILY_TRADE_VALUE` values ('2012-12-13', 1), ('2008-02-03', 2), ('2014-11-11', 3); - show partitions from `DAILY_TRADE_VALUE`; - """ - assertTrue(res2[1].size() == 3) - } catch (Throwable t) { - Assertions.fail("examples in docs/table-design/data-partitioning/auto-partitioning.md failed to exec, please fix it", t) - } + sql "drop table if exists auto_dynamic" + sql """ + create table auto_dynamic( + k0 datetime(6) NOT NULL + ) + auto partition by range (date_trunc(k0, 'year')) + ( + ) + DISTRIBUTED BY HASH(`k0`) BUCKETS 2 + properties( + "dynamic_partition.enable" = "true", + "dynamic_partition.prefix" = "p", + "dynamic_partition.start" = "-50", + "dynamic_partition.end" = "0", --- Dynamic Partition 不创建分区 + "dynamic_partition.time_unit" = "year", + "replication_num" = "1" + ); + """ } diff --git a/regression-test/suites/doc/table-design/data-partitioning/basic-concepts.md.groovy b/regression-test/suites/doc/table-design/data-partitioning/basic-concepts.md.groovy index b257b434a05c70..8558aadb218cbc 100644 --- a/regression-test/suites/doc/table-design/data-partitioning/basic-concepts.md.groovy +++ b/regression-test/suites/doc/table-design/data-partitioning/basic-concepts.md.groovy @@ -18,43 +18,208 @@ import org.junit.jupiter.api.Assertions; suite("docs/table-design/data-partitioning/basic-concepts.md") { - try { - sql "drop table if exists example_range_tbl" - multi_sql """ - -- Range Partition - CREATE TABLE IF NOT EXISTS example_range_tbl - ( - `user_id` LARGEINT NOT NULL COMMENT "用户id", - `date` DATE NOT NULL COMMENT "数据灌入日期时间", - `timestamp` DATETIME NOT NULL COMMENT "数据灌入的时间戳", - `city` VARCHAR(20) COMMENT "用户所在城市", - `age` SMALLINT COMMENT "用户年龄", - `sex` TINYINT COMMENT "用户性别", - `last_visit_date` DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间", - `cost` BIGINT SUM DEFAULT "0" COMMENT "用户总消费", - `max_dwell_time` INT MAX DEFAULT "0" COMMENT "用户最大停留时间", - `min_dwell_time` INT MIN DEFAULT "99999" COMMENT "用户最小停留时间" - ) - ENGINE=OLAP - AGGREGATE KEY(`user_id`, `date`, `timestamp`, `city`, `age`, `sex`) - PARTITION BY RANGE(`date`) - ( - PARTITION `p201701` VALUES LESS THAN ("2017-02-01"), - PARTITION `p201702` VALUES LESS THAN ("2017-03-01"), - PARTITION `p201703` VALUES LESS THAN ("2017-04-01"), - PARTITION `p2018` VALUES [("2018-01-01"), ("2019-01-01")) - ) - DISTRIBUTED BY HASH(`user_id`) BUCKETS 16 - PROPERTIES - ( - "replication_num" = "1" - ); - """ - - sql "show create table example_range_tbl" - sql "show partitions from example_range_tbl" - sql """ALTER TABLE example_range_tbl ADD PARTITION p201704 VALUES LESS THAN("2020-05-01") DISTRIBUTED BY HASH(`user_id`) BUCKETS 5""" - } catch (Throwable t) { - Assertions.fail("examples in docs/table-design/data-partitioning/basic-concepts.md failed to exec, please fix it", t) - } + sql "drop table if exists example_range_tbl" + sql """ + -- Range Partition + CREATE TABLE IF NOT EXISTS example_range_tbl + ( + `user_id` LARGEINT NOT NULL COMMENT "用户id", + `date` DATE NOT NULL COMMENT "数据灌入日期时间", + `timestamp` DATETIME NOT NULL COMMENT "数据灌入的时间戳", + `city` VARCHAR(20) COMMENT "用户所在城市", + `age` SMALLINT COMMENT "用户年龄", + `sex` TINYINT COMMENT "用户性别", + `last_visit_date` DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间", + `cost` BIGINT SUM DEFAULT "0" COMMENT "用户总消费", + `max_dwell_time` INT MAX DEFAULT "0" COMMENT "用户最大停留时间", + `min_dwell_time` INT MIN DEFAULT "99999" COMMENT "用户最小停留时间" + ) + ENGINE=OLAP + AGGREGATE KEY(`user_id`, `date`, `timestamp`, `city`, `age`, `sex`) + PARTITION BY RANGE(`date`) + ( + PARTITION `p201701` VALUES LESS THAN ("2017-02-01"), + PARTITION `p201702` VALUES LESS THAN ("2017-03-01"), + PARTITION `p201703` VALUES LESS THAN ("2017-04-01"), + PARTITION `p2018` VALUES [("2018-01-01"), ("2019-01-01")) + ) + DISTRIBUTED BY HASH(`user_id`) BUCKETS 16 + PROPERTIES + ( + "replication_num" = "1" + ); + """ + + sql "show create table example_range_tbl" + sql "show partitions from example_range_tbl" + sql """ALTER TABLE example_range_tbl ADD PARTITION p201704 VALUES LESS THAN("2020-05-01") DISTRIBUTED BY HASH(`user_id`) BUCKETS 5""" + + + + // table items + sql "drop table if exists example_range_tbl" + sql """ + CREATE TABLE IF NOT EXISTS example_range_tbl + ( + `user_id` LARGEINT NOT NULL COMMENT "用户id", + `date` DATE NOT NULL COMMENT "数据灌入日期时间", + `timestamp` DATETIME NOT NULL COMMENT "数据灌入的时间戳", + `city` VARCHAR(20) COMMENT "用户所在城市", + `age` SMALLINT COMMENT "用户年龄", + `sex` TINYINT COMMENT "用户性别", + `last_visit_date` DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间", + `cost` BIGINT SUM DEFAULT "0" COMMENT "用户总消费", + `max_dwell_time` INT MAX DEFAULT "0" COMMENT "用户最大停留时间", + `min_dwell_time` INT MIN DEFAULT "99999" COMMENT "用户最小停留时间" + ) + ENGINE=OLAP + AGGREGATE KEY(`user_id`, `date`, `timestamp`, `city`, `age`, `sex`) + AUTO PARTITION BY RANGE(date_trunc(`date`, 'month')) --- 使用月作为分区粒度 + () + DISTRIBUTED BY HASH(`user_id`) BUCKETS 16 + PROPERTIES + ( + "replication_num" = "1" + ); + """ + + sql "drop table if exists example_range_tbl" + sql """ + CREATE TABLE IF NOT EXISTS example_range_tbl + ( + `user_id` LARGEINT NOT NULL COMMENT "用户id", + `date` DATE NOT NULL COMMENT "数据灌入日期时间", + `timestamp` DATETIME NOT NULL COMMENT "数据灌入的时间戳", + `city` VARCHAR(20) COMMENT "用户所在城市", + `age` SMALLINT COMMENT "用户年龄", + `sex` TINYINT COMMENT "用户性别", + `last_visit_date` DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间", + `cost` BIGINT SUM DEFAULT "0" COMMENT "用户总消费", + `max_dwell_time` INT MAX DEFAULT "0" COMMENT "用户最大停留时间", + `min_dwell_time` INT MIN DEFAULT "99999" COMMENT "用户最小停留时间" + ) + ENGINE=OLAP + AGGREGATE KEY(`user_id`, `date`, `timestamp`, `city`, `age`, `sex`) + PARTITION BY RANGE(`date`) + () + DISTRIBUTED BY HASH(`user_id`) BUCKETS 16 + PROPERTIES + ( + "replication_num" = "1", + "dynamic_partition.enable" = "true", + "dynamic_partition.time_unit" = "WEEK", --- 分区粒度为周 + "dynamic_partition.start" = "-2", --- 向前保留两周 + "dynamic_partition.end" = "2", --- 提前创建后两周 + "dynamic_partition.prefix" = "p", + "dynamic_partition.buckets" = "8" + ); + """ + + sql "drop table if exists example_range_tbl" + sql """ + CREATE TABLE IF NOT EXISTS example_range_tbl + ( + `user_id` LARGEINT NOT NULL COMMENT "用户id", + `date` DATE NOT NULL COMMENT "数据灌入日期时间", + `timestamp` DATETIME NOT NULL COMMENT "数据灌入的时间戳", + `city` VARCHAR(20) COMMENT "用户所在城市", + `age` SMALLINT COMMENT "用户年龄", + `sex` TINYINT COMMENT "用户性别", + `last_visit_date` DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间", + `cost` BIGINT SUM DEFAULT "0" COMMENT "用户总消费", + `max_dwell_time` INT MAX DEFAULT "0" COMMENT "用户最大停留时间", + `min_dwell_time` INT MIN DEFAULT "99999" COMMENT "用户最小停留时间" + ) + ENGINE=OLAP + AGGREGATE KEY(`user_id`, `date`, `timestamp`, `city`, `age`, `sex`) + AUTO PARTITION BY RANGE(date_trunc(`date`, 'month')) --- 使用月作为分区粒度 + () + DISTRIBUTED BY HASH(`user_id`) BUCKETS 16 + PROPERTIES + ( + "replication_num" = "1", + "dynamic_partition.enable" = "true", + "dynamic_partition.time_unit" = "month", --- 二者粒度必须相同 + "dynamic_partition.start" = "-2", --- 动态分区自动清理超过两周的历史分区 + "dynamic_partition.end" = "0", --- 动态分区不创建未来分区,完全交给自动分区 + "dynamic_partition.prefix" = "p", + "dynamic_partition.buckets" = "8" + ); + """ + + sql "drop table if exists example_range_tbl" + sql """ + CREATE TABLE IF NOT EXISTS example_range_tbl + ( + `user_id` LARGEINT NOT NULL COMMENT "用户id", + `date` DATE NOT NULL COMMENT "数据灌入日期时间", + `timestamp` DATETIME NOT NULL COMMENT "数据灌入的时间戳", + `city` VARCHAR(20) COMMENT "用户所在城市", + `age` SMALLINT COMMENT "用户年龄", + `sex` TINYINT COMMENT "用户性别", + `last_visit_date` DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间", + `cost` BIGINT SUM DEFAULT "0" COMMENT "用户总消费", + `max_dwell_time` INT MAX DEFAULT "0" COMMENT "用户最大停留时间", + `min_dwell_time` INT MIN DEFAULT "99999" COMMENT "用户最小停留时间" + ) + ENGINE=OLAP + AGGREGATE KEY(`user_id`, `date`, `timestamp`, `city`, `age`, `sex`) + PARTITION BY RANGE(`date`) + ( + PARTITION `p201701` VALUES LESS THAN ("2017-02-01"), + PARTITION `p201702` VALUES LESS THAN ("2017-03-01"), + PARTITION `p201703` VALUES LESS THAN ("2017-04-01"), + PARTITION `p2018` VALUES [("2018-01-01"), ("2019-01-01")) + ) + DISTRIBUTED BY HASH(`user_id`) BUCKETS AUTO + PROPERTIES + ( + "replication_num" = "1", + "estimate_partition_size" = "2G" --- 用户估计一个分区将有的数据量,不提供则默认为 10G + ); + """ + + + + // Partition Retrieval + sql "create database if not exists partition_basic_concepts" + sql "use partition_basic_concepts" + sql "drop table if exists DAILY_TRADE_VALUE" + sql """ + CREATE TABLE `DAILY_TRADE_VALUE` + ( + `TRADE_DATE` datev2 NOT NULL COMMENT '交易日期', + `TRADE_ID` varchar(40) NOT NULL COMMENT '交易编号', + ) + UNIQUE KEY(`TRADE_DATE`, `TRADE_ID`) + AUTO PARTITION BY RANGE (date_trunc(`TRADE_DATE`, 'year')) + ( + ) + DISTRIBUTED BY HASH(`TRADE_DATE`) BUCKETS 10 + PROPERTIES ( + "replication_num" = "1" + ); + """ + + sql "drop table if exists list_table1" + sql """ + CREATE TABLE `list_table1` ( + `str` varchar + ) ENGINE=OLAP + DUPLICATE KEY(`str`) + COMMENT 'OLAP' + AUTO PARTITION BY LIST (`str`) + ( + ) + DISTRIBUTED BY HASH(`str`) BUCKETS 10 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1" + ); + """ + sql """ insert into list_table1 values ("Beijing"), ("XXX"), ("xxx"), ("Beijing"), ("Abc"), (null) """ + sql """ insert into list_table1 values (null), ("") """ // not same partition + + sql """ select * from partitions("catalog"="internal", "database"="partition_basic_concepts", "table"="DAILY_TRADE_VALUE") where PartitionName = auto_partition_name('range', 'year', '2008-02-03'); """ + sql """ select * from information_schema.partitions where TABLE_SCHEMA='partition_basic_concepts' and TABLE_NAME='list_table1' and PARTITION_NAME=auto_partition_name('list', null); """ + sql """ select * from information_schema.partitions where TABLE_NAME='DAILY_TRADE_VALUE' and PARTITION_DESCRIPTION like "[('2012-01-01'),%"; """ } From 787347b253ff266a815c3ad82f7154e20ce10f29 Mon Sep 17 00:00:00 2001 From: zclllhhjj Date: Tue, 19 Nov 2024 18:23:26 +0800 Subject: [PATCH 35/63] [chore](minor) Remove some useless file and refactor a illogical name of Column interface (#44214) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### What problem does this PR solve? Issue Number: close #xxx Related PR: #xxx Problem Summary: 1. `insert_many_data` -> `insert_data_repeatly` 2. remove installation of docs build 3. remove a weird useless regression realData file(may carried up by mistake before) --- .../olap/rowset/segment_v2/column_reader.cpp | 12 +++--- be/src/vec/columns/column.h | 2 +- .../table_function/vexplode_json_array.h | 4 +- .../exprs/table_function/vexplode_split.cpp | 3 +- be/src/vec/functions/function_string.h | 3 +- build.sh | 11 ----- docs/build_help_zip.sh | 41 ------------------- .../txn_insert_values_with_schema_change.out | 13 ------ 8 files changed, 13 insertions(+), 76 deletions(-) delete mode 100755 docs/build_help_zip.sh delete mode 100644 regression-test/regression-test/realData/insert_p0/txn_insert_values_with_schema_change.out diff --git a/be/src/olap/rowset/segment_v2/column_reader.cpp b/be/src/olap/rowset/segment_v2/column_reader.cpp index 6e3d64628e8a44..b96cf4f7e6794e 100644 --- a/be/src/olap/rowset/segment_v2/column_reader.cpp +++ b/be/src/olap/rowset/segment_v2/column_reader.cpp @@ -411,7 +411,7 @@ Status ColumnReader::next_batch_of_zone_map(size_t* n, vectorized::MutableColumn } else { if (is_string) { auto sv = (StringRef*)min_value->cell_ptr(); - dst->insert_many_data(sv->data, sv->size, size); + dst->insert_data_repeatedly(sv->data, sv->size, size); } else { // TODO: the work may cause performance problem, opt latter for (int i = 0; i < size; ++i) { @@ -1508,7 +1508,7 @@ void DefaultValueColumnIterator::insert_default_data(const TypeInfo* type_info, value.cast_to_date(); int64 = binary_cast(value); - dst->insert_many_data(data_ptr, data_len, n); + dst->insert_data_repeatedly(data_ptr, data_len, n); break; } case FieldType::OLAP_FIELD_TYPE_DATETIME: { @@ -1526,7 +1526,7 @@ void DefaultValueColumnIterator::insert_default_data(const TypeInfo* type_info, value.to_datetime(); int64 = binary_cast(value); - dst->insert_many_data(data_ptr, data_len, n); + dst->insert_data_repeatedly(data_ptr, data_len, n); break; } case FieldType::OLAP_FIELD_TYPE_DECIMAL: { @@ -1538,7 +1538,7 @@ void DefaultValueColumnIterator::insert_default_data(const TypeInfo* type_info, sizeof(FieldTypeTraits::CppType)); //decimal12_t decimal12_t* d = (decimal12_t*)mem_value; int128 = DecimalV2Value(d->integer, d->fraction).value(); - dst->insert_many_data(data_ptr, data_len, n); + dst->insert_data_repeatedly(data_ptr, data_len, n); break; } case FieldType::OLAP_FIELD_TYPE_STRING: @@ -1548,7 +1548,7 @@ void DefaultValueColumnIterator::insert_default_data(const TypeInfo* type_info, case FieldType::OLAP_FIELD_TYPE_AGG_STATE: { char* data_ptr = ((Slice*)mem_value)->data; size_t data_len = ((Slice*)mem_value)->size; - dst->insert_many_data(data_ptr, data_len, n); + dst->insert_data_repeatedly(data_ptr, data_len, n); break; } case FieldType::OLAP_FIELD_TYPE_ARRAY: { @@ -1566,7 +1566,7 @@ void DefaultValueColumnIterator::insert_default_data(const TypeInfo* type_info, default: { char* data_ptr = (char*)mem_value; size_t data_len = type_size; - dst->insert_many_data(data_ptr, data_len, n); + dst->insert_data_repeatedly(data_ptr, data_len, n); } } } diff --git a/be/src/vec/columns/column.h b/be/src/vec/columns/column.h index d96446298d90b3..d45757b329c00f 100644 --- a/be/src/vec/columns/column.h +++ b/be/src/vec/columns/column.h @@ -290,7 +290,7 @@ class IColumn : public COW { "Method insert_many_raw_data is not supported for " + get_name()); } - void insert_many_data(const char* pos, size_t length, size_t data_num) { + void insert_data_repeatedly(const char* pos, size_t length, size_t data_num) { for (size_t i = 0; i < data_num; ++i) { insert_data(pos, length); } diff --git a/be/src/vec/exprs/table_function/vexplode_json_array.h b/be/src/vec/exprs/table_function/vexplode_json_array.h index 94378708f9e4a2..b1115dadb58dd5 100644 --- a/be/src/vec/exprs/table_function/vexplode_json_array.h +++ b/be/src/vec/exprs/table_function/vexplode_json_array.h @@ -193,8 +193,8 @@ struct ParsedDataStringBase : public ParsedData { void insert_many_same_value_from_parsed_data(MutableColumnPtr& column, int64_t cur_offset, int length) override { assert_cast(column.get()) - ->insert_many_data(_data_string_ref[cur_offset].data, - _data_string_ref[cur_offset].size, length); + ->insert_data_repeatedly(_data_string_ref[cur_offset].data, + _data_string_ref[cur_offset].size, length); } void reset() override { diff --git a/be/src/vec/exprs/table_function/vexplode_split.cpp b/be/src/vec/exprs/table_function/vexplode_split.cpp index 950459f9b202c2..9b0ab6bb88b7f3 100644 --- a/be/src/vec/exprs/table_function/vexplode_split.cpp +++ b/be/src/vec/exprs/table_function/vexplode_split.cpp @@ -130,7 +130,8 @@ void VExplodeSplitTableFunction::get_same_many_values(MutableColumnPtr& column, if (current_empty()) { column->insert_many_defaults(length); } else { - column->insert_many_data(_backup[_cur_offset].data, _backup[_cur_offset].size, length); + column->insert_data_repeatedly(_backup[_cur_offset].data, _backup[_cur_offset].size, + length); } } diff --git a/be/src/vec/functions/function_string.h b/be/src/vec/functions/function_string.h index 40d0ce9167cce5..6e4a18fdd3100e 100644 --- a/be/src/vec/functions/function_string.h +++ b/be/src/vec/functions/function_string.h @@ -1235,7 +1235,8 @@ class FunctionStringElt : public IFunction { null_map = ColumnUInt8::create(input_rows_count, is_null); res->insert_many_defaults(input_rows_count); } else { - res->insert_many_data(target_data.data, target_data.size, input_rows_count); + res->insert_data_repeatedly(target_data.data, target_data.size, + input_rows_count); } } else if (auto target_nullable_column = check_and_get_column(*target_column)) { diff --git a/build.sh b/build.sh index 35c989d0b0a4ec..5d70f523f8e3b6 100755 --- a/build.sh +++ b/build.sh @@ -506,9 +506,6 @@ fi # Assesmble FE modules FE_MODULES='' -# TODO: docs are temporarily removed, so this var is always OFF -# Fix it later -BUILD_DOCS='OFF' modules=("") if [[ "${BUILD_FE}" -eq 1 ]]; then modules+=("fe-common") @@ -648,14 +645,6 @@ if [[ "${BUILD_CLOUD}" -eq 1 ]]; then echo "Build cloud done" fi -if [[ "${BUILD_DOCS}" = "ON" ]]; then - # Build docs, should be built before Frontend - echo "Build docs" - cd "${DORIS_HOME}/docs" - ./build_help_zip.sh - cd "${DORIS_HOME}" -fi - function build_ui() { NPM='npm' if ! ${NPM} --version; then diff --git a/docs/build_help_zip.sh b/docs/build_help_zip.sh deleted file mode 100755 index b77db9c07378a8..00000000000000 --- a/docs/build_help_zip.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env bash -# 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. - -############################################################## -# This script is used to build help doc zip file -############################################################## - -#!/bin/bash - -set -eo pipefail - -ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)" - -BUILD_DIR='build' -HELP_DIR='contents' -HELP_ZIP_FILE='help-resource.zip' -SQL_REF_DOC_DIR='zh-CN/docs/sql-manual' - -cd "${ROOT}" -rm -rf "${BUILD_DIR}" "${HELP_DIR}" "${HELP_ZIP_FILE}" -mkdir -p "${BUILD_DIR}" "${HELP_DIR}" - -cp -r "${SQL_REF_DOC_DIR}"/* "${HELP_DIR}"/ - -zip -r "${HELP_ZIP_FILE}" "${HELP_DIR}" -mv "${HELP_ZIP_FILE}" "${BUILD_DIR}"/ diff --git a/regression-test/regression-test/realData/insert_p0/txn_insert_values_with_schema_change.out b/regression-test/regression-test/realData/insert_p0/txn_insert_values_with_schema_change.out deleted file mode 100644 index 9e1016fe0e26e7..00000000000000 --- a/regression-test/regression-test/realData/insert_p0/txn_insert_values_with_schema_change.out +++ /dev/null @@ -1,13 +0,0 @@ --- This file is automatically generated. You should know what you did if you want to edit this --- !select1 -- -0 a 10 -1 b 20 -2 c 30 -3 d 40 - --- !select2 -- -0 a 10 -1 b 20 -2 c 30 -3 d 40 - From 701573ca92d5965291a0faae0303df7411c56200 Mon Sep 17 00:00:00 2001 From: zclllhhjj Date: Tue, 19 Nov 2024 18:24:06 +0800 Subject: [PATCH 36/63] [Fix](cases) Make auto&dynamic cases sleep long enough (#44228) ### What problem does this PR solve? Issue Number: close #xxx Related PR: https://github.com/apache/doris/pull/42210 Problem Summary: in the pr above we make daemon thread may need 5s+ to be aware of session variables' change. so we need sleep much longer. --- .../suites/partition_p0/auto_partition/test_auto_dynamic.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regression-test/suites/partition_p0/auto_partition/test_auto_dynamic.groovy b/regression-test/suites/partition_p0/auto_partition/test_auto_dynamic.groovy index a9e8a134fee086..2c94b41cbb141e 100644 --- a/regression-test/suites/partition_p0/auto_partition/test_auto_dynamic.groovy +++ b/regression-test/suites/partition_p0/auto_partition/test_auto_dynamic.groovy @@ -134,7 +134,7 @@ suite("test_auto_dynamic", "nonConcurrent") { } sql """ admin set frontend config ('dynamic_partition_check_interval_seconds' = '1') """ - sleep(2000) + sleep(10000) part_result = sql " show partitions from auto_dynamic " log.info("${part_result}".toString()) assertEquals(part_result.size, 3) From 8be13b0e2db1c589414b8a4f046a4c102093b123 Mon Sep 17 00:00:00 2001 From: zclllhhjj Date: Tue, 19 Nov 2024 19:24:00 +0800 Subject: [PATCH 37/63] [Refactor](block) Refactor interface of shrink column (#44046) Refactor interface of shrink column --- be/src/vec/columns/column.h | 13 ++---- be/src/vec/columns/column_array.cpp | 12 +----- be/src/vec/columns/column_array.h | 3 +- be/src/vec/columns/column_map.cpp | 24 ++--------- be/src/vec/columns/column_map.h | 3 +- be/src/vec/columns/column_nullable.cpp | 13 +----- be/src/vec/columns/column_nullable.h | 4 +- be/src/vec/columns/column_object.h | 6 --- be/src/vec/columns/column_string.cpp | 31 +++++++++----- be/src/vec/columns/column_string.h | 4 +- be/src/vec/columns/column_struct.cpp | 24 ++--------- be/src/vec/columns/column_struct.h | 3 +- be/src/vec/core/block.cpp | 2 +- be/test/vec/columns/column_string_test.cpp | 48 ++++++++++++++++++++++ 14 files changed, 90 insertions(+), 100 deletions(-) create mode 100644 be/test/vec/columns/column_string_test.cpp diff --git a/be/src/vec/columns/column.h b/be/src/vec/columns/column.h index d45757b329c00f..975827bd13ea9f 100644 --- a/be/src/vec/columns/column.h +++ b/be/src/vec/columns/column.h @@ -126,16 +126,9 @@ class IColumn : public COW { return nullptr; } - // shrink the end zeros for CHAR type or ARRAY type - virtual MutablePtr get_shrinked_column() { - throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR, - "Method get_shrinked_column is not supported for " + get_name()); - return nullptr; - } - - // check the column whether could shrinked - // now support only in char type, or the nested type in complex type: array{char}, struct{char}, map{char} - virtual bool could_shrinked_column() { return false; } + // shrink the end zeros for ColumnStr(also for who has it nested). so nest column will call it for all nested. + // for non-str col, will reach here(do nothing). only ColumnStr will really shrink itself. + virtual void shrink_padding_chars() {} /// Some columns may require finalization before using of other operations. virtual void finalize() {} diff --git a/be/src/vec/columns/column_array.cpp b/be/src/vec/columns/column_array.cpp index e66e016381e83b..bd4464e2caf81c 100644 --- a/be/src/vec/columns/column_array.cpp +++ b/be/src/vec/columns/column_array.cpp @@ -79,16 +79,8 @@ ColumnArray::ColumnArray(MutableColumnPtr&& nested_column) : data(std::move(nest offsets = ColumnOffsets::create(); } -bool ColumnArray::could_shrinked_column() { - return data->could_shrinked_column(); -} - -MutableColumnPtr ColumnArray::get_shrinked_column() { - if (could_shrinked_column()) { - return ColumnArray::create(data->get_shrinked_column(), offsets->assume_mutable()); - } else { - return ColumnArray::create(data->assume_mutable(), offsets->assume_mutable()); - } +void ColumnArray::shrink_padding_chars() { + data->shrink_padding_chars(); } std::string ColumnArray::get_name() const { diff --git a/be/src/vec/columns/column_array.h b/be/src/vec/columns/column_array.h index a3c79ffaa0298d..4dbc8e91e52b88 100644 --- a/be/src/vec/columns/column_array.h +++ b/be/src/vec/columns/column_array.h @@ -112,8 +112,7 @@ class ColumnArray final : public COWHelper { return Base::create(std::forward(args)...); } - MutableColumnPtr get_shrinked_column() override; - bool could_shrinked_column() override; + void shrink_padding_chars() override; /** On the index i there is an offset to the beginning of the i + 1 -th element. */ using ColumnOffsets = ColumnVector; diff --git a/be/src/vec/columns/column_map.cpp b/be/src/vec/columns/column_map.cpp index 85964ca967b095..eb3b431a229d7b 100644 --- a/be/src/vec/columns/column_map.cpp +++ b/be/src/vec/columns/column_map.cpp @@ -502,27 +502,9 @@ ColumnPtr ColumnMap::replicate(const Offsets& offsets) const { return res; } -bool ColumnMap::could_shrinked_column() { - return keys_column->could_shrinked_column() || values_column->could_shrinked_column(); -} - -MutableColumnPtr ColumnMap::get_shrinked_column() { - MutableColumns new_columns(2); - - if (keys_column->could_shrinked_column()) { - new_columns[0] = keys_column->get_shrinked_column(); - } else { - new_columns[0] = keys_column->get_ptr(); - } - - if (values_column->could_shrinked_column()) { - new_columns[1] = values_column->get_shrinked_column(); - } else { - new_columns[1] = values_column->get_ptr(); - } - - return ColumnMap::create(new_columns[0]->assume_mutable(), new_columns[1]->assume_mutable(), - offsets_column->assume_mutable()); +void ColumnMap::shrink_padding_chars() { + keys_column->shrink_padding_chars(); + values_column->shrink_padding_chars(); } void ColumnMap::reserve(size_t n) { diff --git a/be/src/vec/columns/column_map.h b/be/src/vec/columns/column_map.h index 08eee11c436d2c..ae482a2d4e058c 100644 --- a/be/src/vec/columns/column_map.h +++ b/be/src/vec/columns/column_map.h @@ -118,8 +118,7 @@ class ColumnMap final : public COWHelper { const char* deserialize_and_insert_from_arena(const char* pos) override; void update_hash_with_value(size_t n, SipHash& hash) const override; - MutableColumnPtr get_shrinked_column() override; - bool could_shrinked_column() override; + void shrink_padding_chars() override; ColumnPtr filter(const Filter& filt, ssize_t result_size_hint) const override; size_t filter(const Filter& filter) override; ColumnPtr permute(const Permutation& perm, size_t limit) const override; diff --git a/be/src/vec/columns/column_nullable.cpp b/be/src/vec/columns/column_nullable.cpp index 8fffe1dfe652da..493aabdae31608 100644 --- a/be/src/vec/columns/column_nullable.cpp +++ b/be/src/vec/columns/column_nullable.cpp @@ -51,17 +51,8 @@ ColumnNullable::ColumnNullable(MutableColumnPtr&& nested_column_, MutableColumnP _need_update_has_null = true; } -bool ColumnNullable::could_shrinked_column() { - return get_nested_column_ptr()->could_shrinked_column(); -} - -MutableColumnPtr ColumnNullable::get_shrinked_column() { - if (could_shrinked_column()) { - return ColumnNullable::create(get_nested_column_ptr()->get_shrinked_column(), - get_null_map_column_ptr()); - } else { - return ColumnNullable::create(get_nested_column_ptr(), get_null_map_column_ptr()); - } +void ColumnNullable::shrink_padding_chars() { + get_nested_column_ptr()->shrink_padding_chars(); } void ColumnNullable::update_xxHash_with_value(size_t start, size_t end, uint64_t& hash, diff --git a/be/src/vec/columns/column_nullable.h b/be/src/vec/columns/column_nullable.h index 35787cd52d81ff..6096fd4b66965a 100644 --- a/be/src/vec/columns/column_nullable.h +++ b/be/src/vec/columns/column_nullable.h @@ -143,8 +143,8 @@ class ColumnNullable final : public COWHelper, public N return Base::create(std::forward(args)...); } - MutableColumnPtr get_shrinked_column() override; - bool could_shrinked_column() override; + void shrink_padding_chars() override; + bool is_variable_length() const override { return nested_column->is_variable_length(); } std::string get_name() const override { return "Nullable(" + nested_column->get_name() + ")"; } diff --git a/be/src/vec/columns/column_object.h b/be/src/vec/columns/column_object.h index d7dd0a88da8a04..244692e9ddd1bc 100644 --- a/be/src/vec/columns/column_object.h +++ b/be/src/vec/columns/column_object.h @@ -446,12 +446,6 @@ class ColumnObject final : public COWHelper { void update_crc_with_value(size_t start, size_t end, uint32_t& hash, const uint8_t* __restrict null_data) const override; - // Not implemented - MutableColumnPtr get_shrinked_column() override { - throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR, - "get_shrinked_column" + get_name()); - } - Int64 get_int(size_t /*n*/) const override { throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR, "get_int" + get_name()); } diff --git a/be/src/vec/columns/column_string.cpp b/be/src/vec/columns/column_string.cpp index 6eb3e45b2e015a..3caa194551bf79 100644 --- a/be/src/vec/columns/column_string.cpp +++ b/be/src/vec/columns/column_string.cpp @@ -22,6 +22,7 @@ #include #include +#include #include "util/memcpy_inlined.h" #include "util/simd/bits.h" @@ -81,16 +82,26 @@ MutableColumnPtr ColumnStr::clone_resized(size_t to_size) const { } template -MutableColumnPtr ColumnStr::get_shrinked_column() { - auto shrinked_column = ColumnStr::create(); - shrinked_column->get_offsets().reserve(offsets.size()); - shrinked_column->get_chars().reserve(chars.size()); - for (int i = 0; i < size(); i++) { - StringRef str = get_data_at(i); - reinterpret_cast*>(shrinked_column.get()) - ->insert_data(str.data, strnlen(str.data, str.size)); - } - return shrinked_column; +void ColumnStr::shrink_padding_chars() { + if (size() == 0) { + return; + } + char* data = reinterpret_cast(chars.data()); + auto* offset = offsets.data(); + size_t size = offsets.size(); + + // deal the 0-th element. no need to move. + auto next_start = offset[0]; + offset[0] = strnlen(data, size_at(0)); + for (size_t i = 1; i < size; i++) { + // get the i-th length and whole move it to cover the last's trailing void + auto length = strnlen(data + next_start, offset[i] - next_start); + memmove(data + offset[i - 1], data + next_start, length); + // offset i will be changed. so save the old value for (i+1)-th to get its length. + next_start = offset[i]; + offset[i] = offset[i - 1] + length; + } + chars.resize_fill(offsets.back()); // just call it to shrink memory here. no possible to expand. } // This method is only called by MutableBlock::merge_ignore_overflow diff --git a/be/src/vec/columns/column_string.h b/be/src/vec/columns/column_string.h index 0881c887288692..a72a3ec5cdc96a 100644 --- a/be/src/vec/columns/column_string.h +++ b/be/src/vec/columns/column_string.h @@ -85,6 +85,7 @@ class ColumnStr final : public COWHelper> { /// For convenience, every string ends with terminating zero byte. Note that strings could contain zero bytes in the middle. Chars chars; + // Start position of i-th element. size_t ALWAYS_INLINE offset_at(ssize_t i) const { return offsets[i - 1]; } /// Size of i-th element, including terminating zero. @@ -117,8 +118,7 @@ class ColumnStr final : public COWHelper> { MutableColumnPtr clone_resized(size_t to_size) const override; - MutableColumnPtr get_shrinked_column() override; - bool could_shrinked_column() override { return true; } + void shrink_padding_chars() override; Field operator[](size_t n) const override { assert(n < size()); diff --git a/be/src/vec/columns/column_struct.cpp b/be/src/vec/columns/column_struct.cpp index ec0c5e6a6877fc..3a238a09c0d1d4 100644 --- a/be/src/vec/columns/column_struct.cpp +++ b/be/src/vec/columns/column_struct.cpp @@ -313,28 +313,10 @@ ColumnPtr ColumnStruct::replicate(const Offsets& offsets) const { return ColumnStruct::create(new_columns); } -bool ColumnStruct::could_shrinked_column() { - const size_t tuple_size = columns.size(); - for (size_t i = 0; i < tuple_size; ++i) { - if (columns[i]->could_shrinked_column()) { - return true; - } - } - return false; -} - -MutableColumnPtr ColumnStruct::get_shrinked_column() { - const size_t tuple_size = columns.size(); - MutableColumns new_columns(tuple_size); - - for (size_t i = 0; i < tuple_size; ++i) { - if (columns[i]->could_shrinked_column()) { - new_columns[i] = columns[i]->get_shrinked_column(); - } else { - new_columns[i] = columns[i]->get_ptr(); - } +void ColumnStruct::shrink_padding_chars() { + for (auto& column : columns) { + column->shrink_padding_chars(); } - return ColumnStruct::create(std::move(new_columns)); } void ColumnStruct::reserve(size_t n) { diff --git a/be/src/vec/columns/column_struct.h b/be/src/vec/columns/column_struct.h index 15836604792a74..e9f8014d9db06e 100644 --- a/be/src/vec/columns/column_struct.h +++ b/be/src/vec/columns/column_struct.h @@ -151,8 +151,7 @@ class ColumnStruct final : public COWHelper { int compare_at(size_t n, size_t m, const IColumn& rhs_, int nan_direction_hint) const override; - MutableColumnPtr get_shrinked_column() override; - bool could_shrinked_column() override; + void shrink_padding_chars() override; void reserve(size_t n) override; void resize(size_t n) override; diff --git a/be/src/vec/core/block.cpp b/be/src/vec/core/block.cpp index 11075335fb17af..b15b83cf77ea9c 100644 --- a/be/src/vec/core/block.cpp +++ b/be/src/vec/core/block.cpp @@ -1215,7 +1215,7 @@ void Block::shrink_char_type_column_suffix_zero(const std::vector& char_ for (auto idx : char_type_idx) { if (idx < data.size()) { auto& col_and_name = this->get_by_position(idx); - col_and_name.column = col_and_name.column->assume_mutable()->get_shrinked_column(); + col_and_name.column->assume_mutable()->shrink_padding_chars(); } } } diff --git a/be/test/vec/columns/column_string_test.cpp b/be/test/vec/columns/column_string_test.cpp new file mode 100644 index 00000000000000..07195afe1cfcac --- /dev/null +++ b/be/test/vec/columns/column_string_test.cpp @@ -0,0 +1,48 @@ +// 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. + +#include "vec/columns/column_string.h" + +#include +#include + +#include "vec/common/string_ref.h" +#include "vec/core/types.h" + +using namespace doris; +using namespace doris::vectorized; + +TEST(ColumnStringTest, shrink_padding_chars) { + ColumnString::MutablePtr col = ColumnString::create(); + col->insert_data("123\0 ", 7); + col->insert_data("456\0xx", 6); + col->insert_data("78", 2); + col->shrink_padding_chars(); + + EXPECT_EQ(col->size(), 3); + EXPECT_EQ(col->get_data_at(0), StringRef("123")); + EXPECT_EQ(col->get_data_at(0).size, 3); + EXPECT_EQ(col->get_data_at(1), StringRef("456")); + EXPECT_EQ(col->get_data_at(1).size, 3); + EXPECT_EQ(col->get_data_at(2), StringRef("78")); + EXPECT_EQ(col->get_data_at(2).size, 2); + + col->insert_data("xyz", 2); // only xy + + EXPECT_EQ(col->size(), 4); + EXPECT_EQ(col->get_data_at(3), StringRef("xy")); +} \ No newline at end of file From cd94cf1a05b1e57df2be647b13e71c9e65fa8d20 Mon Sep 17 00:00:00 2001 From: meiyi Date: Tue, 19 Nov 2024 20:14:31 +0800 Subject: [PATCH 38/63] [fix](cluster key) fix some cluster key problems (#43574) --- be/src/olap/base_tablet.cpp | 4 + be/src/olap/memtable.cpp | 6 +- be/src/olap/merger.cpp | 5 +- be/src/olap/primary_key_index.cpp | 3 + be/src/olap/rowset/rowset_writer.h | 2 +- be/src/olap/rowset/segment_creator.cpp | 3 +- .../rowset/vertical_beta_rowset_writer.cpp | 8 +- .../olap/rowset/vertical_beta_rowset_writer.h | 2 +- .../java/org/apache/doris/common/Config.java | 4 + .../org/apache/doris/analysis/KeysDesc.java | 3 +- .../java/org/apache/doris/catalog/Env.java | 4 +- .../plans/commands/info/CreateTableInfo.java | 38 +- .../data/point_query_p0/load_ck.out | 40 + .../schema_change_p0/unique_ck/all_types.csv | 2500 +++++++++++++++++ .../test_unique_schema_value_modify.out | 381 +++ .../test_unique_schema_value_modify1.out | 81 + .../data/unique_with_mow_c_p0/all_types.csv | 2500 +++++++++++++++++ .../unique/test_unique_table_auto_inc.groovy | 6 +- .../http_stream/test_http_stream.groovy | 4 +- .../stream_load/test_stream_load_new.groovy | 4 +- .../test_stream_load_new_move_memtable.groovy | 4 +- .../suites/point_query_p0/load_ck.groovy | 167 ++ .../test_schema_change_unique.groovy | 248 ++ .../test_unique_schema_value_drop.groovy | 1027 +++++++ .../test_unique_schema_value_modify.groovy | 1928 +++++++++++++ .../test_unique_schema_value_modify1.groovy | 1073 +++++++ .../test_unique_schema_value_modify2.groovy | 962 +++++++ .../test_unique_schema_value_modify3.groovy | 552 ++++ ...ompaction_with_multi_append_columns.groovy | 143 + 29 files changed, 11681 insertions(+), 21 deletions(-) create mode 100644 regression-test/data/point_query_p0/load_ck.out create mode 100644 regression-test/data/schema_change_p0/unique_ck/all_types.csv create mode 100644 regression-test/data/schema_change_p0/unique_ck/test_unique_schema_value_modify.out create mode 100644 regression-test/data/schema_change_p0/unique_ck/test_unique_schema_value_modify1.out create mode 100644 regression-test/data/unique_with_mow_c_p0/all_types.csv create mode 100644 regression-test/suites/point_query_p0/load_ck.groovy create mode 100644 regression-test/suites/schema_change_p0/unique_ck/test_schema_change_unique.groovy create mode 100644 regression-test/suites/schema_change_p0/unique_ck/test_unique_schema_value_drop.groovy create mode 100644 regression-test/suites/schema_change_p0/unique_ck/test_unique_schema_value_modify.groovy create mode 100644 regression-test/suites/schema_change_p0/unique_ck/test_unique_schema_value_modify1.groovy create mode 100644 regression-test/suites/schema_change_p0/unique_ck/test_unique_schema_value_modify2.groovy create mode 100644 regression-test/suites/schema_change_p0/unique_ck/test_unique_schema_value_modify3.groovy create mode 100644 regression-test/suites/unique_with_mow_c_p0/test_compaction_with_multi_append_columns.groovy diff --git a/be/src/olap/base_tablet.cpp b/be/src/olap/base_tablet.cpp index e5ec38738155e5..89886ec8b4bea7 100644 --- a/be/src/olap/base_tablet.cpp +++ b/be/src/olap/base_tablet.cpp @@ -1566,6 +1566,10 @@ Status BaseTablet::check_rowid_conversion( VLOG_DEBUG << "check_rowid_conversion, location_map is empty"; return Status::OK(); } + if (!tablet_schema()->cluster_key_idxes().empty()) { + VLOG_DEBUG << "skip check_rowid_conversion for mow tables with cluster keys"; + return Status::OK(); + } std::vector dst_segments; RETURN_IF_ERROR( diff --git a/be/src/olap/memtable.cpp b/be/src/olap/memtable.cpp index e0f19b1624df5b..233c59f0910871 100644 --- a/be/src/olap/memtable.cpp +++ b/be/src/olap/memtable.cpp @@ -385,8 +385,12 @@ Status MemTable::_sort_by_cluster_keys() { for (int i = 0; i < row_in_blocks.size(); i++) { row_pos_vec.emplace_back(row_in_blocks[i]->_row_pos); } + std::vector column_offset; + for (int i = 0; i < _column_offset.size(); ++i) { + column_offset.emplace_back(i); + } return _output_mutable_block.add_rows(&in_block, row_pos_vec.data(), - row_pos_vec.data() + in_block.rows(), &_column_offset); + row_pos_vec.data() + in_block.rows(), &column_offset); } void MemTable::_sort_one_column(std::vector& row_in_blocks, Tie& tie, diff --git a/be/src/olap/merger.cpp b/be/src/olap/merger.cpp index a79434551b5cc1..694b7d6db84d8e 100644 --- a/be/src/olap/merger.cpp +++ b/be/src/olap/merger.cpp @@ -260,8 +260,10 @@ Status Merger::vertical_compact_one_group( } reader_params.tablet_schema = merge_tablet_schema; + bool has_cluster_key = false; if (!tablet->tablet_schema()->cluster_key_idxes().empty()) { reader_params.delete_bitmap = &tablet->tablet_meta()->delete_bitmap(); + has_cluster_key = true; } if (is_key && stats_output && stats_output->rowid_conversion) { @@ -290,7 +292,8 @@ Status Merger::vertical_compact_one_group( "failed to read next block when merging rowsets of tablet " + std::to_string(tablet->tablet_id())); RETURN_NOT_OK_STATUS_WITH_WARN( - dst_rowset_writer->add_columns(&block, column_group, is_key, max_rows_per_segment), + dst_rowset_writer->add_columns(&block, column_group, is_key, max_rows_per_segment, + has_cluster_key), "failed to write block when merging rowsets of tablet " + std::to_string(tablet->tablet_id())); diff --git a/be/src/olap/primary_key_index.cpp b/be/src/olap/primary_key_index.cpp index 9d40ff5a8fad51..e416639cfb06cd 100644 --- a/be/src/olap/primary_key_index.cpp +++ b/be/src/olap/primary_key_index.cpp @@ -64,6 +64,9 @@ Status PrimaryKeyIndexBuilder::add_item(const Slice& key) { if (UNLIKELY(_num_rows == 0)) { _min_key.append(key.get_data(), key.get_size()); } + DCHECK(key.compare(_max_key) > 0) + << "found duplicate key or key is not sorted! current key: " << key + << ", last max key: " << _max_key; _max_key.clear(); _max_key.append(key.get_data(), key.get_size()); _num_rows++; diff --git a/be/src/olap/rowset/rowset_writer.h b/be/src/olap/rowset/rowset_writer.h index ad42982488b316..f84ff964ea3051 100644 --- a/be/src/olap/rowset/rowset_writer.h +++ b/be/src/olap/rowset/rowset_writer.h @@ -80,7 +80,7 @@ class RowsetWriter { "RowsetWriter not support add_block"); } virtual Status add_columns(const vectorized::Block* block, const std::vector& col_ids, - bool is_key, uint32_t max_rows_per_segment) { + bool is_key, uint32_t max_rows_per_segment, bool has_cluster_key) { return Status::Error( "RowsetWriter not support add_columns"); } diff --git a/be/src/olap/rowset/segment_creator.cpp b/be/src/olap/rowset/segment_creator.cpp index e0eb7534123a86..c2a4469d97f324 100644 --- a/be/src/olap/rowset/segment_creator.cpp +++ b/be/src/olap/rowset/segment_creator.cpp @@ -115,7 +115,8 @@ Status SegmentFlusher::close() { bool SegmentFlusher::need_buffering() { // buffering variants for schema change return _context.write_type == DataWriteType::TYPE_SCHEMA_CHANGE && - _context.tablet_schema->num_variant_columns() > 0; + (_context.tablet_schema->num_variant_columns() > 0 || + !_context.tablet_schema->cluster_key_idxes().empty()); } Status SegmentFlusher::_add_rows(std::unique_ptr& segment_writer, diff --git a/be/src/olap/rowset/vertical_beta_rowset_writer.cpp b/be/src/olap/rowset/vertical_beta_rowset_writer.cpp index 46070f8dccd7ce..ee9bfd97745c9b 100644 --- a/be/src/olap/rowset/vertical_beta_rowset_writer.cpp +++ b/be/src/olap/rowset/vertical_beta_rowset_writer.cpp @@ -50,7 +50,8 @@ template requires std::is_base_of_v Status VerticalBetaRowsetWriter::add_columns(const vectorized::Block* block, const std::vector& col_ids, bool is_key, - uint32_t max_rows_per_segment) { + uint32_t max_rows_per_segment, + bool has_cluster_key) { auto& context = this->_context; VLOG_NOTICE << "VerticalBetaRowsetWriter::add_columns, columns: " << block->columns(); @@ -71,7 +72,10 @@ Status VerticalBetaRowsetWriter::add_columns(const vectorized::Block* block, _cur_writer_idx = 0; RETURN_IF_ERROR(_segment_writers[_cur_writer_idx]->append_block(block, 0, num_rows)); } else if (is_key) { - if (_segment_writers[_cur_writer_idx]->num_rows_written() > max_rows_per_segment) { + // TODO for cluster key, always create new segment writer because the primary keys are + // sorted in SegmentWriter::_generate_primary_key_index, will cause too many segments + if (_segment_writers[_cur_writer_idx]->num_rows_written() > max_rows_per_segment || + has_cluster_key) { // segment is full, need flush columns and create new segment writer RETURN_IF_ERROR(_flush_columns(_segment_writers[_cur_writer_idx].get(), true)); diff --git a/be/src/olap/rowset/vertical_beta_rowset_writer.h b/be/src/olap/rowset/vertical_beta_rowset_writer.h index dcb4ae5a8b5d16..ce756334308fcd 100644 --- a/be/src/olap/rowset/vertical_beta_rowset_writer.h +++ b/be/src/olap/rowset/vertical_beta_rowset_writer.h @@ -41,7 +41,7 @@ class VerticalBetaRowsetWriter final : public T { ~VerticalBetaRowsetWriter() override = default; Status add_columns(const vectorized::Block* block, const std::vector& col_ids, - bool is_key, uint32_t max_rows_per_segment) override; + bool is_key, uint32_t max_rows_per_segment, bool has_cluster_key) override; // flush last segment's column Status flush_columns(bool is_key) override; diff --git a/fe/fe-common/src/main/java/org/apache/doris/common/Config.java b/fe/fe-common/src/main/java/org/apache/doris/common/Config.java index 39cda4806b35a4..efc2d11a092e3b 100644 --- a/fe/fe-common/src/main/java/org/apache/doris/common/Config.java +++ b/fe/fe-common/src/main/java/org/apache/doris/common/Config.java @@ -563,6 +563,10 @@ public class Config extends ConfigBase { "Default timeout for insert load job, in seconds."}) public static int insert_load_default_timeout_second = 14400; // 4 hour + @ConfField(mutable = true, masterOnly = true, description = {"对mow表随机设置cluster keys,用于测试", + "random set cluster keys for mow table for test"}) + public static boolean random_add_cluster_keys_for_mow = false; + @ConfField(mutable = true, masterOnly = true, description = { "等内部攒批真正写入完成才返回;insert into和stream load默认开启攒批", "Wait for the internal batch to be written before returning; " diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/KeysDesc.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/KeysDesc.java index 563533ae323a89..1c80fd418e6b2f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/KeysDesc.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/KeysDesc.java @@ -19,6 +19,7 @@ import org.apache.doris.catalog.KeysType; import org.apache.doris.common.AnalysisException; +import org.apache.doris.common.Config; import org.apache.doris.common.io.Text; import org.apache.doris.common.io.Writable; @@ -138,7 +139,7 @@ private void analyzeClusterKeys(List cols) throws AnalysisException { break; } } - if (sameKey) { + if (sameKey && !Config.random_add_cluster_keys_for_mow) { throw new AnalysisException("Unique keys and cluster keys should be different."); } // check that cluster key column exists diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java index 8543e18fd5b843..687129dab774bc 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java @@ -4691,13 +4691,13 @@ public static short calcShortKeyColumnCount(List columns, Map 0 && shortKeyColumnCount < clusterColumns.size()) { boolean sameKey = true; - for (int i = 0; i < shortKeyColumnCount; i++) { + for (int i = 0; i < shortKeyColumnCount && i < indexColumns.size(); i++) { if (!clusterColumns.get(i).getName().equals(indexColumns.get(i).getName())) { sameKey = false; break; } } - if (sameKey) { + if (sameKey && !Config.random_add_cluster_keys_for_mow) { throw new DdlException(shortKeyColumnCount + " short keys is a part of unique keys"); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateTableInfo.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateTableInfo.java index e45e71bd1f997d..aac3feeb0b92c5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateTableInfo.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateTableInfo.java @@ -83,13 +83,17 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Random; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; @@ -99,7 +103,6 @@ * table info in creating table. */ public class CreateTableInfo { - public static final String ENGINE_OLAP = "olap"; public static final String ENGINE_JDBC = "jdbc"; public static final String ENGINE_ELASTICSEARCH = "elasticsearch"; @@ -111,6 +114,8 @@ public class CreateTableInfo { private static final ImmutableSet GENERATED_COLUMN_ALLOW_AGG_TYPE = ImmutableSet.of(AggregateType.REPLACE, AggregateType.REPLACE_IF_NOT_NULL); + private static final Logger LOG = LogManager.getLogger(CreateTableInfo.class); + private final boolean ifNotExists; private String ctlName; private String dbName; @@ -422,6 +427,35 @@ public void validate(ConnectContext ctx) { } } + try { + if (Config.random_add_cluster_keys_for_mow && isEnableMergeOnWrite && clusterKeysColumnNames.isEmpty() + && PropertyAnalyzer.analyzeUseLightSchemaChange(new HashMap<>(properties))) { + // exclude columns whose data type can not be cluster key, see {@link ColumnDefinition#validate} + List clusterKeysCandidates = columns.stream().filter(c -> { + DataType type = c.getType(); + return !(type.isFloatLikeType() || type.isStringType() || type.isArrayType() + || type.isBitmapType() || type.isHllType() || type.isQuantileStateType() + || type.isJsonType() + || type.isVariantType() + || type.isMapType() + || type.isStructType()); + }).collect(Collectors.toList()); + if (clusterKeysCandidates.size() > 0) { + clusterKeysColumnNames = new ArrayList<>(); + Random random = new Random(); + int randomClusterKeysCount = random.nextInt(clusterKeysCandidates.size()) + 1; + Collections.shuffle(clusterKeysCandidates); + for (int i = 0; i < randomClusterKeysCount; i++) { + clusterKeysColumnNames.add(clusterKeysCandidates.get(i).getName()); + } + LOG.info("Randomly add cluster keys for table {}.{}: {}", + dbName, tableName, clusterKeysColumnNames); + } + } + } catch (Exception e) { + throw new AnalysisException(e.getMessage(), e.getCause()); + } + validateKeyColumns(); if (!clusterKeysColumnNames.isEmpty()) { if (!isEnableMergeOnWrite) { @@ -830,7 +864,7 @@ private void validateKeyColumns() { break; } } - if (sameKey) { + if (sameKey && !Config.random_add_cluster_keys_for_mow) { throw new AnalysisException("Unique keys and cluster keys should be different."); } // check that cluster key column exists diff --git a/regression-test/data/point_query_p0/load_ck.out b/regression-test/data/point_query_p0/load_ck.out new file mode 100644 index 00000000000000..e2a2ef88733269 --- /dev/null +++ b/regression-test/data/point_query_p0/load_ck.out @@ -0,0 +1,40 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +-2147475406 true 45 23794 -11023 915989078 2115356192 15927.068 1.392557423391501E9 45951348783208518.810 8340516346665031.310 2022-01-26 2022-04-13T11:13:48 2022-01-31 2022-02-16T06:07:21 130.50.6.0 DeniseMatthews@Yozio.mil Londonderry Alley 61 +-2147424303 false -28 -5177 -1409 149417728 553396597 -10123.558 -1.268722910924068E9 67354830622005524.848 52407243294991364.348 2022-06-29 2022-05-06T09:30:02 2023-01-09 2022-03-12T14:26 109.50.92.119 CraigHughes@Talane.biz Heath Drive 38 +-2147413967 true -75 30533 -5435 -727385447 32929830 9577.564 1.334766997510087E9 39973144022098028.800 5886463393340733.108 2022-06-23 2022-05-10T19:13:50 2022-01-17 2022-11-26T22:49:36 157.38.90.25 JoshuaLewis@Jayo.mil Loeprich Crossing 43 +-2147380173 true -79 -5785 9752 1851350218 1121852298 25652.402 -1.618061059513558E9 95821873014545736.897 38923569966532828.626 2022-10-30 2022-05-02T17:06:33 2022-08-11 2022-02-08T10:19:47 217.198.98.239 JoseBoyd@Voonder.info Lawn Lane 78 +-2147374459 false -118 -30267 -14606 262497842 -1811881704 8211.805 2.37851933046663E8 37354136531251060.755 63024710145324035.720 2022-10-11 2022-01-17T10:20:18 2022-04-12 2022-10-24T18:14:38 16.243.195.81 BrendaBoyd@Talane.net Annamark Pass 72 +-2147369329 false -121 -22859 4733 -378861997 385323541 -22969.846 1.483825622420542E9 50940877800950041.950 87108729227937387.294 2022-06-05 2022-08-18T05:39:56 2022-08-21 2022-12-12T08:43:59 16.27.107.167 PhyllisSmith@Zoombox.org Village Green Terrace 55 +-2147367329 true 84 21471 -29331 1823545950 1200800855 -13832.219 8.01505090724918E8 45495296019797580.477 45196001436348967.557 2022-02-17 2022-05-23T01:44:31 2022-08-01 2022-08-16T10:32:36 84.110.209.128 vLane@Dablist.edu Packers Street 34 +-2147339287 true 62 28989 -32018 650184880 -365849435 -21644.414 -7.8648426469503E7 92593387160450273.870 39588697152489527.185 2022-07-23 2023-01-03T11:54:35 2022-08-02 2022-05-19T18:35:36 30.194.6.115 veniam@Thoughtstorm.mil Basil Street 79 +-2147336695 false 42 -7202 27919 1898713395 1177326785 -302.0104 -1.268944460183375E9 61604656210729534.717 6683002058708470.832 2022-08-20 2022-08-14T01:41:12 2022-11-02 2022-05-15T04:22:07 36.86.77.214 delectus_maiores_fugit@Rhyzio.org Briar Crest Crossing 37 +-2147330925 false -122 -21211 -2331 1906695924 -1342280417 5545.3013 -1.286038914681617E9 31911132334645267.930 84364209624711210.131 2022-02-16 2022-03-11T12:05:33 2022-11-24 2022-12-17T19:56:16 6.87.14.74 rCampbell@Riffpath.com Forest Run Terrace 13 + +-- !sql -- +-2145739104 true 10 -22603 6132 -984517723 138439036 8683.904 1.681202635040786E9 49683339998558535.395 38251259739648714.297 2022-04-26 2022-09-12T00:32:18 2022-11-20 2023-01-09T16:19:06 180.215.212.86 KathyRoberts@Talane.info Darwin Center 26 +-2140012242 false 10 30893 -16192 -175522451 -1382546546 21324.643 2.017216342012696E9 41477187479096470.647 25445001389089818.791 2022-11-06 2022-09-02T12:04:05 2022-05-29 2022-02-04T22:21:46 24.25.69.81 nam_quasi@Photospace.mil Jay Way 9 +-2130269306 false 10 30342 -18732 1461226453 -1257020753 -10751.815 3.44246067782915E8 2456538047280540.838 37394928326629689.946 2022-11-28 2022-05-04T20:40:19 2022-08-25 2022-03-18T10:17:35 179.198.200.96 eFuller@Skynoodle.com Tennyson Street 83 +-2122709724 true 10 -8985 -30620 -1375603501 631094037 14711.055 -1.210030062083139E9 96220820029888063.156 42161382030214480.728 2022-05-28 2023-01-03T20:44:27 2022-06-11 2022-07-26T22:49:22 13.249.135.222 uDixon@Shufflebeat.name Riverside Parkway 72 +-2117749737 false 10 26335 30644 1841596444 283308539 18848.148 3.5339747538014E8 11924963560520504.166 28287350935413049.601 2022-08-01 2022-04-21T02:28:54 2022-02-27 2022-09-02T17:11:17 183.108.102.1 pHanson@Cogibox.com Maple Wood Street 40 +-2113239713 false 10 27624 31311 711781944 -1838033894 -12299.482 -1.88263132184351E9 9480201396831049.605 52114965946122870.302 2022-06-11 2022-08-31T08:54:30 2022-03-26 2023-01-08T23:28:27 200.161.156.176 et@Buzzster.net Westport Drive 82 +-2107773486 false 10 27096 10368 1579374450 1370327646 -15339.031 2.110010890135424E9 54514853031265543.378 38546969634312019.180 2022-12-31 2022-10-07T10:18:27 2022-10-01 2022-07-09T11:41:11 121.120.227.53 JuliaDean@Plambee.com Sugar Crossing 43 +-2107242025 true 10 25215 26566 1292568651 -2126795906 11912.074 -2.140044503516609E9 98695561934257164.368 18845397264645075.775 2022-05-21 2022-09-24T23:00:21 2022-02-12 2022-11-24T19:17:03 141.226.90.50 AnnaGonzalez@Eimbee.mil Cody Street 78 +-2106969609 true 10 29572 16738 1736115820 -957295886 -13319.206 -1.333603562816737E9 91224478600376111.942 69457425159617037.453 2022-09-06 2022-05-08T19:52:36 2022-04-05 2022-08-17T19:23:31 222.79.139.99 WalterFox@Voomm.net Oxford Alley 77 +-2102307005 true 10 -23674 24613 -1810828490 -47095409 -14686.167 2.072108685694799E9 39847820962230526.125 584354832299375.156 2022-03-27 2022-02-11T13:46:06 2022-12-25 2022-11-28T09:37:49 213.146.33.250 JuliaSimmons@Zazio.info Eagle Crest Terrace 84 + +-- !sql -- +26743529 + +-- !sql -- +103 + +-- !sql -- +2999834 + +-- !sql -- +-2147303679 2022-12-02T04:39:45 + +-- !sql -- +-2147303679 84525658185172942.967 + diff --git a/regression-test/data/schema_change_p0/unique_ck/all_types.csv b/regression-test/data/schema_change_p0/unique_ck/all_types.csv new file mode 100644 index 00000000000000..57ea871e4b7a57 --- /dev/null +++ b/regression-test/data/schema_change_p0/unique_ck/all_types.csv @@ -0,0 +1,2500 @@ +0,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +3,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +4,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +5,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +6,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +7,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +8,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +9,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +10,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +11,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +12,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +13,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +14,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +15,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +16,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +17,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +18,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +19,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +20,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +21,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +22,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +23,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +24,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +25,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +26,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +27,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +28,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +29,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +30,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +31,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +32,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +33,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +34,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +35,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +36,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +37,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +38,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +39,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +40,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +41,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +42,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +43,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +44,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +45,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +46,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +47,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +48,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +49,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +50,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +51,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +52,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +53,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +54,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +55,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +56,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +57,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +58,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +59,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +60,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +61,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +62,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +63,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +64,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +65,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +66,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +67,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +68,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +69,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +70,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +71,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +72,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +73,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +74,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +75,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +76,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +77,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +78,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +79,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +80,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +81,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +82,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +83,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +84,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +85,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +86,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +87,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +88,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +89,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +90,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +91,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +92,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +93,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +94,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +95,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +96,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +97,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +98,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +99,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +100,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +101,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +102,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +103,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +104,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +105,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +106,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +107,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +108,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +109,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +110,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +111,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +112,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +113,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +114,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +115,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +116,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +117,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +118,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +119,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +120,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +121,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +122,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +123,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +124,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +125,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +126,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +127,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +128,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +129,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +130,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +131,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +132,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +133,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +134,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +135,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +136,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +137,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +138,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +139,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +140,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +141,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +142,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +143,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +144,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +145,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +146,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +147,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +148,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +149,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +150,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +151,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +152,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +153,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +154,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +155,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +156,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +157,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +158,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +159,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +160,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +161,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +162,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +163,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +164,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +165,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +166,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +167,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +168,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +169,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +170,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +171,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +172,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +173,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +174,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +175,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +176,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +177,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +178,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +179,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +180,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +181,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +182,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +183,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +184,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +185,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +186,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +187,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +188,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +189,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +190,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +191,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +192,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +193,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +194,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +195,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +196,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +197,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +198,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +199,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +200,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +201,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +202,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +203,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +204,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +205,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +206,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +207,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +208,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +209,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +210,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +211,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +212,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +213,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +214,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +215,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +216,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +217,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +218,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +219,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +220,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +221,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +222,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +223,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +224,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +225,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +226,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +227,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +228,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +229,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +230,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +231,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +232,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +233,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +234,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +235,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +236,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +237,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +238,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +239,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +240,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +241,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +242,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +243,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +244,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +245,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +246,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +247,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +248,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +249,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +250,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +251,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +252,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +253,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +254,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +255,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +256,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +257,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +258,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +259,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +260,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +261,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +262,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +263,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +264,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +265,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +266,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +267,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +268,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +269,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +270,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +271,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +272,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +273,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +274,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +275,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +276,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +277,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +278,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +279,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +280,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +281,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +282,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +283,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +284,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +285,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +286,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +287,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +288,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +289,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +290,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +291,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +292,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +293,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +294,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +295,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +296,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +297,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +298,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +299,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +300,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +301,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +302,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +303,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +304,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +305,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +306,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +307,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +308,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +309,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +310,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +311,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +312,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +313,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +314,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +315,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +316,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +317,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +318,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +319,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +320,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +321,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +322,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +323,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +324,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +325,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +326,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +327,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +328,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +329,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +330,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +331,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +332,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +333,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +334,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +335,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +336,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +337,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +338,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +339,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +340,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +341,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +342,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +343,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +344,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +345,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +346,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +347,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +348,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +349,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +350,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +351,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +352,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +353,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +354,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +355,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +356,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +357,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +358,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +359,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +360,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +361,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +362,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +363,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +364,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +365,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +366,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +367,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +368,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +369,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +370,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +371,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +372,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +373,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +374,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +375,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +376,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +377,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +378,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +379,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +380,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +381,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +382,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +383,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +384,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +385,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +386,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +387,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +388,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +389,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +390,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +391,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +392,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +393,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +394,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +395,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +396,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +397,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +398,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +399,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +400,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +401,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +402,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +403,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +404,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +405,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +406,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +407,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +408,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +409,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +410,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +411,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +412,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +413,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +414,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +415,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +416,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +417,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +418,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +419,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +420,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +421,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +422,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +423,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +424,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +425,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +426,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +427,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +428,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +429,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +430,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +431,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +432,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +433,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +434,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +435,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +436,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +437,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +438,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +439,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +440,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +441,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +442,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +443,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +444,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +445,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +446,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +447,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +448,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +449,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +450,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +451,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +452,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +453,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +454,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +455,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +456,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +457,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +458,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +459,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +460,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +461,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +462,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +463,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +464,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +465,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +466,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +467,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +468,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +469,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +470,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +471,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +472,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +473,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +474,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +475,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +476,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +477,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +478,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +479,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +480,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +481,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +482,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +483,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +484,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +485,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +486,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +487,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +488,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +489,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +490,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +491,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +492,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +493,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +494,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +495,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +496,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +497,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +498,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +499,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +500,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +501,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +502,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +503,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +504,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +505,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +506,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +507,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +508,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +509,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +510,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +511,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +512,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +513,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +514,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +515,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +516,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +517,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +518,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +519,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +520,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +521,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +522,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +523,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +524,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +525,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +526,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +527,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +528,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +529,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +530,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +531,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +532,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +533,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +534,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +535,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +536,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +537,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +538,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +539,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +540,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +541,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +542,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +543,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +544,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +545,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +546,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +547,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +548,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +549,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +550,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +551,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +552,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +553,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +554,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +555,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +556,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +557,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +558,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +559,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +560,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +561,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +562,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +563,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +564,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +565,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +566,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +567,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +568,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +569,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +570,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +571,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +572,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +573,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +574,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +575,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +576,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +577,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +578,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +579,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +580,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +581,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +582,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +583,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +584,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +585,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +586,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +587,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +588,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +589,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +590,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +591,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +592,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +593,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +594,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +595,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +596,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +597,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +598,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +599,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +600,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +601,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +602,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +603,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +604,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +605,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +606,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +607,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +608,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +609,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +610,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +611,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +612,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +613,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +614,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +615,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +616,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +617,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +618,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +619,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +620,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +621,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +622,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +623,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +624,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +625,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +626,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +627,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +628,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +629,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +630,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +631,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +632,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +633,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +634,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +635,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +636,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +637,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +638,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +639,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +640,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +641,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +642,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +643,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +644,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +645,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +646,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +647,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +648,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +649,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +650,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +651,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +652,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +653,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +654,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +655,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +656,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +657,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +658,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +659,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +660,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +661,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +662,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +663,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +664,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +665,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +666,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +667,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +668,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +669,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +670,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +671,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +672,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +673,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +674,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +675,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +676,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +677,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +678,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +679,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +680,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +681,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +682,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +683,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +684,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +685,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +686,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +687,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +688,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +689,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +690,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +691,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +692,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +693,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +694,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +695,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +696,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +697,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +698,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +699,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +700,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +701,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +702,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +703,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +704,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +705,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +706,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +707,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +708,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +709,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +710,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +711,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +712,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +713,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +714,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +715,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +716,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +717,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +718,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +719,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +720,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +721,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +722,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +723,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +724,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +725,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +726,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +727,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +728,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +729,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +730,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +731,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +732,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +733,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +734,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +735,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +736,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +737,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +738,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +739,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +740,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +741,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +742,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +743,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +744,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +745,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +746,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +747,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +748,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +749,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +750,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +751,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +752,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +753,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +754,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +755,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +756,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +757,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +758,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +759,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +760,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +761,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +762,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +763,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +764,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +765,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +766,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +767,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +768,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +769,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +770,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +771,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +772,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +773,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +774,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +775,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +776,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +777,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +778,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +779,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +780,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +781,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +782,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +783,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +784,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +785,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +786,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +787,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +788,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +789,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +790,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +791,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +792,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +793,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +794,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +795,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +796,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +797,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +798,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +799,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +800,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +801,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +802,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +803,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +804,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +805,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +806,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +807,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +808,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +809,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +810,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +811,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +812,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +813,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +814,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +815,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +816,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +817,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +818,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +819,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +820,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +821,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +822,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +823,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +824,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +825,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +826,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +827,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +828,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +829,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +830,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +831,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +832,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +833,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +834,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +835,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +836,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +837,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +838,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +839,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +840,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +841,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +842,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +843,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +844,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +845,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +846,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +847,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +848,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +849,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +850,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +851,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +852,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +853,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +854,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +855,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +856,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +857,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +858,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +859,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +860,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +861,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +862,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +863,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +864,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +865,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +866,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +867,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +868,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +869,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +870,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +871,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +872,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +873,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +874,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +875,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +876,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +877,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +878,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +879,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +880,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +881,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +882,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +883,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +884,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +885,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +886,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +887,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +888,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +889,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +890,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +891,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +892,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +893,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +894,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +895,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +896,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +897,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +898,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +899,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +900,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +901,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +902,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +903,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +904,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +905,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +906,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +907,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +908,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +909,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +910,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +911,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +912,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +913,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +914,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +915,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +916,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +917,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +918,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +919,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +920,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +921,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +922,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +923,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +924,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +925,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +926,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +927,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +928,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +929,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +930,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +931,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +932,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +933,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +934,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +935,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +936,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +937,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +938,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +939,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +940,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +941,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +942,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +943,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +944,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +945,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +946,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +947,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +948,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +949,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +950,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +951,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +952,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +953,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +954,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +955,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +956,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +957,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +958,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +959,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +960,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +961,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +962,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +963,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +964,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +965,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +966,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +967,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +968,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +969,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +970,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +971,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +972,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +973,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +974,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +975,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +976,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +977,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +978,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +979,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +980,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +981,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +982,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +983,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +984,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +985,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +986,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +987,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +988,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +989,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +990,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +991,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +992,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +993,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +994,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +995,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +996,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +997,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +998,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +999,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1000,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1001,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1002,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1003,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1004,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1005,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1006,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1007,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1008,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1009,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1010,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1011,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1012,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1013,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1014,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1015,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1016,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1017,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1018,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1019,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1020,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1021,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1022,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1023,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1024,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1025,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1026,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1027,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1028,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1029,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1030,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1031,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1032,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1033,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1034,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1035,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1036,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1037,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1038,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1039,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1040,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1041,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1042,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1043,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1044,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1045,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1046,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1047,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1048,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1049,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1050,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1051,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1052,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1053,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1054,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1055,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1056,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1057,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1058,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1059,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1060,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1061,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1062,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1063,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1064,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1065,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1066,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1067,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1068,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1069,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1070,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1071,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1072,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1073,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1074,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1075,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1076,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1077,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1078,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1079,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1080,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1081,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1082,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1083,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1084,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1085,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1086,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1087,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1088,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1089,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1090,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1091,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1092,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1093,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1094,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1095,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1096,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1097,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1098,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1099,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1100,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1101,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1102,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1103,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1104,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1105,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1106,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1107,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1108,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1109,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1110,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1111,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1112,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1113,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1114,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1115,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1116,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1117,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1118,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1119,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1120,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1121,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1122,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1123,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1124,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1125,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1126,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1127,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1128,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1129,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1130,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1131,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1132,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1133,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1134,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1135,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1136,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1137,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1138,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1139,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1140,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1141,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1142,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1143,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1144,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1145,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1146,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1147,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1148,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1149,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1150,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1151,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1152,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1153,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1154,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1155,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1156,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1157,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1158,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1159,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1160,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1161,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1162,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1163,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1164,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1165,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1166,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1167,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1168,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1169,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1170,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1171,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1172,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1173,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1174,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1175,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1176,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1177,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1178,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1179,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1180,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1181,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1182,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1183,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1184,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1185,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1186,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1187,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1188,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1189,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1190,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1191,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1192,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1193,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1194,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1195,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1196,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1197,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1198,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1199,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1200,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1201,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1202,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1203,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1204,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1205,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1206,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1207,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1208,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1209,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1210,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1211,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1212,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1213,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1214,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1215,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1216,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1217,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1218,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1219,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1220,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1221,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1222,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1223,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1224,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1225,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1226,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1227,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1228,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1229,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1230,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1231,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1232,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1233,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1234,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1235,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1236,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1237,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1238,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1239,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1240,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1241,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1242,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1243,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1244,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1245,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1246,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1247,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1248,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1249,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1250,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1251,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1252,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1253,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1254,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1255,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1256,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1257,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1258,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1259,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1260,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1261,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1262,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1263,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1264,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1265,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1266,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1267,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1268,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1269,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1270,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1271,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1272,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1273,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1274,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1275,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1276,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1277,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1278,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1279,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1280,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1281,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1282,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1283,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1284,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1285,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1286,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1287,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1288,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1289,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1290,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1291,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1292,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1293,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1294,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1295,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1296,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1297,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1298,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1299,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1300,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1301,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1302,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1303,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1304,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1305,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1306,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1307,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1308,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1309,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1310,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1311,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1312,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1313,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1314,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1315,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1316,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1317,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1318,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1319,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1320,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1321,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1322,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1323,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1324,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1325,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1326,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1327,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1328,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1329,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1330,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1331,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1332,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1333,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1334,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1335,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1336,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1337,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1338,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1339,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1340,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1341,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1342,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1343,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1344,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1345,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1346,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1347,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1348,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1349,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1350,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1351,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1352,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1353,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1354,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1355,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1356,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1357,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1358,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1359,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1360,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1361,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1362,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1363,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1364,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1365,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1366,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1367,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1368,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1369,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1370,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1371,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1372,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1373,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1374,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1375,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1376,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1377,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1378,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1379,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1380,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1381,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1382,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1383,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1384,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1385,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1386,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1387,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1388,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1389,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1390,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1391,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1392,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1393,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1394,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1395,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1396,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1397,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1398,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1399,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1400,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1401,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1402,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1403,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1404,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1405,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1406,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1407,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1408,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1409,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1410,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1411,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1412,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1413,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1414,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1415,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1416,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1417,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1418,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1419,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1420,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1421,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1422,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1423,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1424,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1425,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1426,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1427,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1428,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1429,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1430,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1431,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1432,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1433,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1434,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1435,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1436,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1437,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1438,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1439,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1440,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1441,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1442,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1443,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1444,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1445,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1446,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1447,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1448,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1449,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1450,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1451,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1452,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1453,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1454,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1455,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1456,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1457,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1458,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1459,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1460,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1461,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1462,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1463,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1464,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1465,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1466,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1467,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1468,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1469,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1470,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1471,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1472,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1473,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1474,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1475,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1476,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1477,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1478,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1479,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1480,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1481,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1482,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1483,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1484,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1485,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1486,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1487,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1488,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1489,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1490,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1491,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1492,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1493,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1494,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1495,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1496,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1497,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1498,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1499,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1500,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1501,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1502,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1503,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1504,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1505,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1506,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1507,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1508,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1509,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1510,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1511,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1512,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1513,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1514,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1515,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1516,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1517,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1518,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1519,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1520,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1521,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1522,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1523,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1524,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1525,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1526,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1527,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1528,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1529,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1530,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1531,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1532,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1533,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1534,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1535,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1536,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1537,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1538,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1539,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1540,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1541,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1542,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1543,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1544,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1545,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1546,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1547,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1548,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1549,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1550,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1551,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1552,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1553,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1554,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1555,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1556,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1557,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1558,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1559,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1560,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1561,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1562,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1563,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1564,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1565,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1566,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1567,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1568,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1569,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1570,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1571,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1572,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1573,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1574,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1575,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1576,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1577,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1578,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1579,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1580,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1581,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1582,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1583,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1584,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1585,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1586,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1587,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1588,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1589,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1590,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1591,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1592,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1593,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1594,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1595,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1596,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1597,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1598,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1599,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1600,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1601,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1602,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1603,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1604,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1605,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1606,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1607,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1608,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1609,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1610,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1611,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1612,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1613,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1614,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1615,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1616,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1617,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1618,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1619,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1620,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1621,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1622,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1623,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1624,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1625,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1626,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1627,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1628,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1629,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1630,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1631,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1632,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1633,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1634,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1635,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1636,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1637,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1638,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1639,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1640,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1641,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1642,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1643,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1644,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1645,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1646,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1647,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1648,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1649,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1650,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1651,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1652,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1653,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1654,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1655,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1656,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1657,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1658,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1659,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1660,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1661,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1662,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1663,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1664,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1665,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1666,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1667,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1668,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1669,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1670,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1671,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1672,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1673,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1674,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1675,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1676,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1677,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1678,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1679,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1680,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1681,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1682,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1683,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1684,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1685,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1686,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1687,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1688,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1689,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1690,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1691,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1692,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1693,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1694,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1695,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1696,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1697,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1698,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1699,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1700,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1701,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1702,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1703,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1704,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1705,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1706,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1707,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1708,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1709,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1710,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1711,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1712,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1713,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1714,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1715,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1716,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1717,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1718,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1719,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1720,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1721,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1722,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1723,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1724,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1725,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1726,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1727,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1728,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1729,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1730,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1731,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1732,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1733,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1734,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1735,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1736,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1737,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1738,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1739,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1740,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1741,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1742,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1743,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1744,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1745,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1746,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1747,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1748,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1749,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1750,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1751,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1752,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1753,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1754,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1755,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1756,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1757,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1758,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1759,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1760,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1761,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1762,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1763,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1764,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1765,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1766,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1767,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1768,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1769,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1770,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1771,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1772,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1773,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1774,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1775,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1776,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1777,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1778,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1779,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1780,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1781,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1782,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1783,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1784,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1785,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1786,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1787,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1788,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1789,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1790,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1791,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1792,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1793,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1794,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1795,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1796,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1797,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1798,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1799,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1800,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1801,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1802,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1803,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1804,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1805,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1806,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1807,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1808,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1809,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1810,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1811,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1812,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1813,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1814,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1815,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1816,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1817,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1818,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1819,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1820,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1821,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1822,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1823,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1824,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1825,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1826,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1827,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1828,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1829,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1830,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1831,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1832,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1833,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1834,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1835,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1836,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1837,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1838,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1839,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1840,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1841,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1842,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1843,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1844,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1845,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1846,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1847,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1848,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1849,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1850,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1851,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1852,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1853,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1854,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1855,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1856,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1857,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1858,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1859,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1860,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1861,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1862,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1863,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1864,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1865,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1866,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1867,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1868,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1869,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1870,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1871,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1872,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1873,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1874,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1875,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1876,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1877,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1878,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1879,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1880,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1881,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1882,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1883,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1884,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1885,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1886,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1887,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1888,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1889,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1890,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1891,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1892,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1893,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1894,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1895,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1896,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1897,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1898,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1899,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1900,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1901,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1902,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1903,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1904,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1905,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1906,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1907,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1908,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1909,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1910,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1911,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1912,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1913,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1914,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1915,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1916,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1917,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1918,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1919,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1920,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1921,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1922,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1923,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1924,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1925,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1926,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1927,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1928,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1929,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1930,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1931,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1932,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1933,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1934,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1935,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1936,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1937,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1938,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1939,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1940,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1941,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1942,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1943,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1944,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1945,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1946,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1947,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1948,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1949,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1950,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1951,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1952,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1953,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1954,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1955,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1956,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1957,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1958,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1959,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1960,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1961,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1962,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1963,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1964,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1965,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1966,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1967,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1968,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1969,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1970,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1971,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1972,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1973,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1974,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1975,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1976,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1977,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1978,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1979,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1980,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1981,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1982,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1983,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1984,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1985,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1986,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1987,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1988,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1989,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1990,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1991,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1992,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1993,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1994,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1995,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1996,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1997,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1998,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1999,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2000,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2001,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2002,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2003,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2004,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2005,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2006,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2007,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2008,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2009,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2010,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2011,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2012,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2013,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2014,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2015,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2016,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2017,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2018,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2019,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2020,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2021,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2022,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2023,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2024,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2025,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2026,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2027,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2028,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2029,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2030,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2031,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2032,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2033,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2034,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2035,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2036,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2037,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2038,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2039,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2040,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2041,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2042,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2043,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2044,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2045,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2046,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2047,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2048,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2049,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2050,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2051,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2052,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2053,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2054,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2055,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2056,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2057,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2058,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2059,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2060,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2061,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2062,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2063,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2064,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2065,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2066,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2067,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2068,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2069,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2070,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2071,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2072,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2073,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2074,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2075,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2076,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2077,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2078,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2079,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2080,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2081,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2082,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2083,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2084,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2085,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2086,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2087,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2088,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2089,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2090,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2091,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2092,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2093,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2094,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2095,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2096,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2097,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2098,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2099,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2100,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2101,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2102,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2103,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2104,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2105,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2106,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2107,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2108,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2109,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2110,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2111,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2112,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2113,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2114,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2115,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2116,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2117,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2118,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2119,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2120,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2121,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2122,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2123,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2124,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2125,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2126,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2127,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2128,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2129,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2130,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2131,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2132,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2133,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2134,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2135,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2136,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2137,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2138,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2139,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2140,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2141,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2142,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2143,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2144,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2145,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2146,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2147,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2148,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2149,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2150,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2151,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2152,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2153,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2154,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2155,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2156,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2157,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2158,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2159,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2160,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2161,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2162,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2163,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2164,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2165,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2166,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2167,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2168,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2169,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2170,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2171,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2172,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2173,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2174,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2175,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2176,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2177,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2178,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2179,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2180,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2181,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2182,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2183,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2184,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2185,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2186,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2187,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2188,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2189,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2190,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2191,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2192,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2193,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2194,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2195,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2196,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2197,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2198,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2199,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2200,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2201,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2202,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2203,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2204,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2205,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2206,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2207,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2208,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2209,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2210,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2211,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2212,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2213,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2214,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2215,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2216,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2217,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2218,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2219,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2220,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2221,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2222,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2223,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2224,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2225,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2226,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2227,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2228,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2229,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2230,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2231,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2232,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2233,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2234,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2235,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2236,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2237,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2238,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2239,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2240,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2241,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2242,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2243,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2244,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2245,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2246,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2247,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2248,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2249,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2250,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2251,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2252,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2253,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2254,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2255,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2256,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2257,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2258,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2259,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2260,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2261,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2262,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2263,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2264,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2265,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2266,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2267,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2268,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2269,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2270,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2271,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2272,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2273,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2274,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2275,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2276,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2277,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2278,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2279,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2280,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2281,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2282,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2283,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2284,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2285,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2286,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2287,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2288,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2289,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2290,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2291,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2292,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2293,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2294,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2295,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2296,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2297,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2298,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2299,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2300,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2301,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2302,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2303,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2304,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2305,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2306,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2307,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2308,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2309,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2310,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2311,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2312,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2313,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2314,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2315,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2316,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2317,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2318,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2319,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2320,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2321,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2322,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2323,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2324,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2325,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2326,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2327,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2328,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2329,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2330,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2331,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2332,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2333,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2334,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2335,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2336,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2337,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2338,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2339,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2340,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2341,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2342,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2343,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2344,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2345,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2346,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2347,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2348,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2349,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2350,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2351,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2352,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2353,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2354,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2355,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2356,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2357,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2358,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2359,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2360,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2361,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2362,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2363,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2364,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2365,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2366,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2367,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2368,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2369,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2370,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2371,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2372,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2373,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2374,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2375,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2376,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2377,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2378,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2379,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2380,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2381,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2382,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2383,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2384,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2385,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2386,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2387,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2388,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2389,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2390,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2391,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2392,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2393,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2394,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2395,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2396,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2397,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2398,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2399,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2400,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2401,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2402,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2403,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2404,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2405,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2406,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2407,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2408,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2409,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2410,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2411,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2412,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2413,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2414,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2415,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2416,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2417,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2418,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2419,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2420,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2421,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2422,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2423,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2424,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2425,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2426,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2427,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2428,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2429,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2430,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2431,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2432,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2433,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2434,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2435,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2436,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2437,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2438,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2439,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2440,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2441,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2442,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2443,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2444,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2445,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2446,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2447,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2448,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2449,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2450,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2451,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2452,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2453,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2454,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2455,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2456,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2457,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2458,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2459,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2460,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2461,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2462,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2463,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2464,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2465,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2466,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2467,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2468,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2469,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2470,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2471,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2472,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2473,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2474,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2475,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2476,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2477,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2478,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2479,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2480,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2481,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2482,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2483,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2484,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2485,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2486,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2487,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2488,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2489,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2490,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2491,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2492,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2493,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2494,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2495,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2496,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2497,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2498,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2499,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 diff --git a/regression-test/data/schema_change_p0/unique_ck/test_unique_schema_value_modify.out b/regression-test/data/schema_change_p0/unique_ck/test_unique_schema_value_modify.out new file mode 100644 index 00000000000000..a815449d45a5d6 --- /dev/null +++ b/regression-test/data/schema_change_p0/unique_ck/test_unique_schema_value_modify.out @@ -0,0 +1,381 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- ! -- +123456789 Alice 1 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 1 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 1 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 1 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 0 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 0 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 1 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice 1 Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 1 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 1 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 1 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 1 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 0 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 0 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 1 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice 1 Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 1 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 1 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 1 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 1 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 0 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 0 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 1 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice 1 Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 1.0 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 1.0 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 1.0 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 1.0 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 0.0 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 0.0 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 1.0 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice 1.2 Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 1.0 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 1.0 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 1.0 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 1.0 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 0.0 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 0.0 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 1.0 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice 1.23 Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 1 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 1 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 1 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 1 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 0 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 0 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 1 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice asd Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 1 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 1 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 1 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 1 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 0 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 0 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 1 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice asd Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 13243 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 13445 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 15768 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 14243 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 10768 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 14325 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 15686 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice 3 Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 13243 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 13445 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 15768 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 14243 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 10768 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 14325 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 15686 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice 4 Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 13243 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 13445 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 15768 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 14243 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 10768 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 14325 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 15686 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice 5 Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 13243.0 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 13445.0 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 15768.0 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 14243.0 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 10768.0 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 14325.0 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 15686.0 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice 1.2 Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 13243.0 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 13445.0 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 15768.0 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 14243.0 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 10768.0 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 14325.0 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 15686.0 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice 1.23 Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 13243 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 13445 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 15768 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 14243 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 10768 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 14325 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 15686 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice asd Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 13243 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 13445 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 15768 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 14243 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 10768 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 14325 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 15686 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice asd Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 2147483641 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 214748364 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 2147483441 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 2147483141 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 2127483141 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 2124483141 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 2123483141 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice 3 Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 2147483641 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 214748364 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 2147483441 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 2147483141 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 2127483141 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 2124483141 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 2123483141 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice 4 Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 2147483641 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 214748364 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 2147483441 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 2147483141 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 2127483141 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 2124483141 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 2123483141 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice 5 Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 2.14748365E9 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 2.14748368E8 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 2.14748339E9 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 2.14748314E9 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 2.12748314E9 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 2.1244832E9 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 2.12348314E9 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice 1.2 Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 2.147483641E9 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 2.14748364E8 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 2.147483441E9 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 2.147483141E9 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 2.127483141E9 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 2.124483141E9 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 2.123483141E9 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice 1.23 Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 2147483641 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 214748364 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 2147483441 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 2147483141 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 2127483141 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 2124483141 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 2123483141 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice asd Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 2147483641 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 214748364 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 2147483441 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 2147483141 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 2127483141 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 2124483141 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 2123483141 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice asd Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 21474832641 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 21474348364 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 214742383441 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 21474283141 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 21274863141 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 21244883141 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 21234683141 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice 5 Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 2.14748324E10 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 2.14743491E10 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 2.14742385E11 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 2.14742835E10 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 2.12748636E10 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 2.12448829E10 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 2.12346839E10 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice 1.2 Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 2.1474832641E10 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 2.1474348364E10 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 2.14742383441E11 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 2.1474283141E10 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 2.1274863141E10 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 2.1244883141E10 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 2.1234683141E10 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice 1.23 Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 21474832641 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 21474348364 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 214742383441 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 21474283141 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 21274863141 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 21244883141 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 21234683141 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice asd Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 21474832641 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 21474348364 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 214742383441 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 21474283141 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 21274863141 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 21244883141 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 21234683141 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice asd Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 2.14748324E10 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 2.14743491E10 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 2.14742385E11 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 2.14742835E10 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 2.12748636E10 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 2.12448829E10 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 2.12346839E10 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice 1.2 Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 2.1474832641E10 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 2.1474348364E10 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 2.14742383441E11 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 2.1474283141E10 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 2.1274863141E10 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 2.1244883141E10 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 2.1234683141E10 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice 1.23 Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 21474832641 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 21474348364 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 214742383441 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 21474283141 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 21274863141 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 21244883141 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 21234683141 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice asd Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 21474832641 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 +234567890 Bob 21474348364 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 +345678901 Carol 214742383441 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 +456789012 Dave 21474283141 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 +567890123 Eve 21274863141 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 +678901234 Frank 21244883141 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 +789012345 Grace 21234683141 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 +993456689 Alice asd Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 + +-- ! -- +123456789 Alice 1.7999999523162842 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 {"a":100, "b":200} ["abc","def"] +234567890 Bob 1.8899999856948853 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 {"a":200, "b":200} ["abc","def"] +345678901 Carol 2.5999999046325684 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 {"a":300, "b":200} ["abc","def"] +456789012 Dave 3.9000000953674316 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 {"a":400, "b":200} ["abc","def"] +567890123 Eve 4.199999809265137 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 {"a":500, "b":200} ["abc","def"] +678901234 Frank 2.5 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 {"a":600, "b":200} ["abc","def"] +789012345 Grace 2.0999999046325684 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 {"a":700, "b":200} ["abc","def"] +993456689 Alice 1.23 Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 {"a":100, "b":200} ["abc","def"] + +-- ! -- +123456789 Alice 1.8 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 {"a":100, "b":200} ["abc","def"] +234567890 Bob 1.89 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 {"a":200, "b":200} ["abc","def"] +345678901 Carol 2.6 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 {"a":300, "b":200} ["abc","def"] +456789012 Dave 3.9 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 {"a":400, "b":200} ["abc","def"] +567890123 Eve 4.2 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 {"a":500, "b":200} ["abc","def"] +678901234 Frank 2.5 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 {"a":600, "b":200} ["abc","def"] +789012345 Grace 2.1 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 {"a":700, "b":200} ["abc","def"] +993456689 Alice asd Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 {"a":100, "b":200} ["abc","def"] + +-- ! -- +123456789 Alice 1.8 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 {"a":100, "b":200} ["abc","def"] +234567890 Bob 1.89 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 {"a":200, "b":200} ["abc","def"] +345678901 Carol 2.6 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 {"a":300, "b":200} ["abc","def"] +456789012 Dave 3.9 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 {"a":400, "b":200} ["abc","def"] +567890123 Eve 4.2 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 {"a":500, "b":200} ["abc","def"] +678901234 Frank 2.5 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 {"a":600, "b":200} ["abc","def"] +789012345 Grace 2.1 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 {"a":700, "b":200} ["abc","def"] +993456689 Alice asd Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 {"a":100, "b":200} ["abc","def"] + +-- ! -- +123456789 Alice 1.8 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 {"a":100, "b":200} ["abc","def"] +234567890 Bob 1.89 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 {"a":200, "b":200} ["abc","def"] +345678901 Carol 2.6 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 {"a":300, "b":200} ["abc","def"] +456789012 Dave 3.9 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 {"a":400, "b":200} ["abc","def"] +567890123 Eve 4.2 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 {"a":500, "b":200} ["abc","def"] +678901234 Frank 2.5 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 {"a":600, "b":200} ["abc","def"] +789012345 Grace 2.1 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 {"a":700, "b":200} ["abc","def"] +993456689 Alice asd Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 {"a":100, "b":200} ["abc","def"] + +-- ! -- +123456789 Alice 1.8 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 {"a":100, "b":200} ["abc","def"] +234567890 Bob 1.89 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 {"a":200, "b":200} ["abc","def"] +345678901 Carol 2.6 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 {"a":300, "b":200} ["abc","def"] +456789012 Dave 3.9 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 {"a":400, "b":200} ["abc","def"] +567890123 Eve 4.2 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 {"a":500, "b":200} ["abc","def"] +678901234 Frank 2.5 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 {"a":600, "b":200} ["abc","def"] +789012345 Grace 2.1 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 {"a":700, "b":200} ["abc","def"] +993456689 Alice asd Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 {"a":100, "b":200} ["abc","def"] + +-- ! -- +123456789 Alice 2 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 {"a":100, "b":200} ["abc","def"] +234567890 Bob 2 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 {"a":200, "b":200} ["abc","def"] +345678901 Carol 3 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 {"a":300, "b":200} ["abc","def"] +456789012 Dave 4 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 {"a":400, "b":200} ["abc","def"] +567890123 Eve 4 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 {"a":500, "b":200} ["abc","def"] +678901234 Frank 3 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 {"a":600, "b":200} ["abc","def"] +789012345 Grace 2 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 {"a":700, "b":200} ["abc","def"] +993456689 Alice 1 Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 {"a":100, "b":200} ["abc","def"] + +-- ! -- +123456789 Alice 1.8300000000 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 {"a":100, "b":200} ["abc","def"] +234567890 Bob 1.8900000000 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 {"a":200, "b":200} ["abc","def"] +345678901 Carol 2.6689000000 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 {"a":300, "b":200} ["abc","def"] +456789012 Dave 3.9456000000 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 {"a":400, "b":200} ["abc","def"] +567890123 Eve 4.2230000000 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 {"a":500, "b":200} ["abc","def"] +678901234 Frank 2.5454000000 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 {"a":600, "b":200} ["abc","def"] +789012345 Grace 2.1965600000 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 {"a":700, "b":200} ["abc","def"] +993456689 Alice asd Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 {"a":100, "b":200} ["abc","def"] + +-- ! -- +123456789 Alice 1.8300000000 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 {"a":100, "b":200} ["abc","def"] +234567890 Bob 1.8900000000 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T12:00 {"a":200, "b":200} ["abc","def"] +345678901 Carol 2.6689000000 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T14:00 {"a":300, "b":200} ["abc","def"] +456789012 Dave 3.9456000000 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T16:00 {"a":400, "b":200} ["abc","def"] +567890123 Eve 4.2230000000 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T18:00 {"a":500, "b":200} ["abc","def"] +678901234 Frank 2.5454000000 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T20:00 {"a":600, "b":200} ["abc","def"] +789012345 Grace 2.1965600000 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T22:00 {"a":700, "b":200} ["abc","def"] +993456689 Alice asd Yaan 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T10:00 {"a":100, "b":200} ["abc","def"] + diff --git a/regression-test/data/schema_change_p0/unique_ck/test_unique_schema_value_modify1.out b/regression-test/data/schema_change_p0/unique_ck/test_unique_schema_value_modify1.out new file mode 100644 index 00000000000000..fd8ef9e88bfd1b --- /dev/null +++ b/regression-test/data/schema_change_p0/unique_ck/test_unique_schema_value_modify1.out @@ -0,0 +1,81 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- ! -- +123456789 Alice 1.8 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T00:00 {"a":100, "b":200} ["abc","def"] +234567890 Bob 1.89 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T00:00 {"a":200, "b":200} ["abc","def"] +345678901 Carol 2.6 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T00:00 {"a":300, "b":200} ["abc","def"] +456789012 Dave 3.9 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T00:00 {"a":400, "b":200} ["abc","def"] +567890123 Eve 4.2 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T00:00 {"a":500, "b":200} ["abc","def"] +678901234 Frank 2.5 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T00:00 {"a":600, "b":200} ["abc","def"] +789012345 Grace 2.1 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T00:00 {"a":700, "b":200} ["abc","def"] +923456689 Alice 1.2 Yaan 25 0 13812345678 No. 123 Street, Beijing 2003-12-31T20:12:12 {"a":100, "b":200} ["abc","def"] + +-- ! -- +123456789 Alice 1.8 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T00:00 {"a":100, "b":200} ["abc","def"] +234567890 Bob 1.89 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T00:00 {"a":200, "b":200} ["abc","def"] +345678901 Carol 2.6 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T00:00 {"a":300, "b":200} ["abc","def"] +456789012 Dave 3.9 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T00:00 {"a":400, "b":200} ["abc","def"] +567890123 Eve 4.2 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T00:00 {"a":500, "b":200} ["abc","def"] +678901234 Frank 2.5 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T00:00 {"a":600, "b":200} ["abc","def"] +789012345 Grace 2.1 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T00:00 {"a":700, "b":200} ["abc","def"] +923456689 Alice 5.69 Yaan 25 0 13812345678 No. 123 Street, Beijing 2003-12-31T20:12:12 {"a":100, "b":200} ["abc","def"] + +-- ! -- +123456789 Alice 1.8 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T00:00 {"a":100, "b":200} ["abc","def"] +234567890 Bob 1.89 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T00:00 {"a":200, "b":200} ["abc","def"] +345678901 Carol 2.6 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T00:00 {"a":300, "b":200} ["abc","def"] +456789012 Dave 3.9 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T00:00 {"a":400, "b":200} ["abc","def"] +567890123 Eve 4.2 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T00:00 {"a":500, "b":200} ["abc","def"] +678901234 Frank 2.5 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T00:00 {"a":600, "b":200} ["abc","def"] +789012345 Grace 2.1 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T00:00 {"a":700, "b":200} ["abc","def"] +923456689 Alice 1.2 Yaan 25 0 13812345678 No. 123 Street, Beijing 2003-12-31T20:12:12 {"a":100, "b":200} ["abc","def"] + +-- ! -- +123456789 Alice 1.8 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01T00:00 {"a":100, "b":200} ["abc","def"] +234567890 Bob 1.89 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02T00:00 {"a":200, "b":200} ["abc","def"] +345678901 Carol 2.6 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03T00:00 {"a":300, "b":200} ["abc","def"] +456789012 Dave 3.9 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04T00:00 {"a":400, "b":200} ["abc","def"] +567890123 Eve 4.2 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05T00:00 {"a":500, "b":200} ["abc","def"] +678901234 Frank 2.5 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06T00:00 {"a":600, "b":200} ["abc","def"] +789012345 Grace 2.1 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07T00:00 {"a":700, "b":200} ["abc","def"] +923456689 Alice 5.69 Yaan 25 0 13812345678 No. 123 Street, Beijing 2003-12-31T20:12:12 {"a":100, "b":200} ["abc","def"] + +-- ! -- +123456789 Alice 1.8 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01 {"a":100, "b":200} ["abc","def"] +234567890 Bob 1.89 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02 {"a":200, "b":200} ["abc","def"] +345678901 Carol 2.6 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03 {"a":300, "b":200} ["abc","def"] +456789012 Dave 3.9 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04 {"a":400, "b":200} ["abc","def"] +567890123 Eve 4.2 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05 {"a":500, "b":200} ["abc","def"] +678901234 Frank 2.5 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06 {"a":600, "b":200} ["abc","def"] +789012345 Grace 2.1 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07 {"a":700, "b":200} ["abc","def"] +923456689 Alice 1.2 Yaan 25 0 13812345678 No. 123 Street, Beijing 2003-12-31 {"a":100, "b":200} ["abc","def"] + +-- ! -- +123456789 Alice 1.8 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01 {"a":100, "b":200} ["abc","def"] +234567890 Bob 1.89 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02 {"a":200, "b":200} ["abc","def"] +345678901 Carol 2.6 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03 {"a":300, "b":200} ["abc","def"] +456789012 Dave 3.9 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04 {"a":400, "b":200} ["abc","def"] +567890123 Eve 4.2 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05 {"a":500, "b":200} ["abc","def"] +678901234 Frank 2.5 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06 {"a":600, "b":200} ["abc","def"] +789012345 Grace 2.1 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07 {"a":700, "b":200} ["abc","def"] +923456689 Alice 5.69 Yaan 25 0 13812345678 No. 123 Street, Beijing 2003-12-31 {"a":100, "b":200} ["abc","def"] + +-- ! -- +123456789 Alice 1.8 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01 {"a":100, "b":200} ["abc","def"] +234567890 Bob 1.89 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02 {"a":200, "b":200} ["abc","def"] +345678901 Carol 2.6 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03 {"a":300, "b":200} ["abc","def"] +456789012 Dave 3.9 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04 {"a":400, "b":200} ["abc","def"] +567890123 Eve 4.2 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05 {"a":500, "b":200} ["abc","def"] +678901234 Frank 2.5 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06 {"a":600, "b":200} ["abc","def"] +789012345 Grace 2.1 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07 {"a":700, "b":200} ["abc","def"] +923456689 Alice 1.2 Yaan 25 0 13812345678 No. 123 Street, Beijing 2003-12-31 {"a":100, "b":200} ["abc","def"] + +-- ! -- +123456789 Alice 1.8 Beijing 25 0 13812345678 No. 123 Street, Beijing 2022-01-01 {"a":100, "b":200} ["abc","def"] +234567890 Bob 1.89 Shanghai 30 1 13998765432 No. 456 Street, Shanghai 2022-02-02 {"a":200, "b":200} ["abc","def"] +345678901 Carol 2.6 Guangzhou 28 0 13724681357 No. 789 Street, Guangzhou 2022-03-03 {"a":300, "b":200} ["abc","def"] +456789012 Dave 3.9 Shenzhen 35 1 13680864279 No. 987 Street, Shenzhen 2022-04-04 {"a":400, "b":200} ["abc","def"] +567890123 Eve 4.2 Chengdu 27 0 13572468091 No. 654 Street, Chengdu 2022-05-05 {"a":500, "b":200} ["abc","def"] +678901234 Frank 2.5 Hangzhou 32 1 13467985213 No. 321 Street, Hangzhou 2022-06-06 {"a":600, "b":200} ["abc","def"] +789012345 Grace 2.1 Xian 29 0 13333333333 No. 222 Street, Xian 2022-07-07 {"a":700, "b":200} ["abc","def"] +923456689 Alice 5.69 Yaan 25 0 13812345678 No. 123 Street, Beijing 2003-12-31 {"a":100, "b":200} ["abc","def"] + diff --git a/regression-test/data/unique_with_mow_c_p0/all_types.csv b/regression-test/data/unique_with_mow_c_p0/all_types.csv new file mode 100644 index 00000000000000..0ce6865998e0f4 --- /dev/null +++ b/regression-test/data/unique_with_mow_c_p0/all_types.csv @@ -0,0 +1,2500 @@ +0,1,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1,51,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +3,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +4,11,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +5,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +6,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +7,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +8,1,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +9,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +10,3,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +11,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +12,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +13,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +14,65,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +15,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +16,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +17,27,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +18,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +19,62,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +20,40,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +21,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +22,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +23,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +24,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +25,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +26,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +27,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +28,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +29,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +30,23,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +31,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +32,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +33,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +34,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +35,62,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +36,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +37,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +38,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +39,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +40,41,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +41,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +42,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +43,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +44,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +45,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +46,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +47,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +48,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +49,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +50,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +51,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +52,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +53,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +54,41,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +55,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +56,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +57,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +58,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +59,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +60,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +61,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +62,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +63,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +64,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +65,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +66,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +67,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +68,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +69,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +70,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +71,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +72,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +73,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +74,32,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +75,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +76,62,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +77,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +78,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +79,33,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +80,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +81,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +82,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +83,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +84,51,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +85,32,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +86,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +87,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +88,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +89,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +90,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +91,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +92,49,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +93,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +94,56,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +95,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +96,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +97,40,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +98,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +99,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +100,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +101,32,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +102,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +103,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +104,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +105,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +106,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +107,8,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +108,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +109,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +110,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +111,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +112,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +113,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +114,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +115,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +116,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +117,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +118,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +119,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +120,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +121,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +122,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +123,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +124,49,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +125,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +126,59,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +127,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +128,73,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +129,65,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +130,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +131,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +132,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +133,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +134,27,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +135,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +136,27,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +137,4,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +138,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +139,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +140,3,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +141,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +142,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +143,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +144,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +145,55,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +146,14,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +147,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +148,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +149,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +150,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +151,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +152,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +153,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +154,51,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +155,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +156,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +157,56,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +158,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +159,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +160,49,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +161,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +162,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +163,27,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +164,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +165,3,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +166,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +167,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +168,51,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +169,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +170,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +171,23,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +172,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +173,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +174,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +175,11,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +176,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +177,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +178,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +179,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +180,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +181,11,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +182,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +183,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +184,29,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +185,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +186,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +187,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +188,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +189,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +190,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +191,23,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +192,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +193,33,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +194,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +195,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +196,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +197,32,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +198,3,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +199,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +200,41,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +201,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +202,23,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +203,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +204,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +205,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +206,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +207,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +208,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +209,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +210,55,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +211,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +212,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +213,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +214,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +215,87,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +216,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +217,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +218,49,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +219,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +220,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +221,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +222,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +223,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +224,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +225,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +226,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +227,84,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +228,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +229,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +230,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +231,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +232,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +233,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +234,14,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +235,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +236,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +237,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +238,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +239,9,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +240,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +241,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +242,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +243,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +244,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +245,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +246,49,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +247,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +248,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +249,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +250,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +251,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +252,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +253,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +254,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +255,9,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +256,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +257,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +258,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +259,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +260,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +261,3,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +262,73,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +263,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +264,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +265,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +266,41,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +267,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +268,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +269,87,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +270,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +271,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +272,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +273,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +274,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +275,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +276,4,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +277,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +278,33,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +279,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +280,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +281,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +282,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +283,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +284,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +285,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +286,25,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +287,87,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +288,49,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +289,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +290,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +291,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +292,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +293,33,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +294,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +295,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +296,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +297,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +298,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +299,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +300,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +301,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +302,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +303,56,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +304,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +305,40,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +306,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +307,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +308,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +309,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +310,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +311,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +312,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +313,62,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +314,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +315,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +316,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +317,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +318,14,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +319,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +320,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +321,87,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +322,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +323,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +324,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +325,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +326,33,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +327,87,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +328,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +329,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +330,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +331,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +332,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +333,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +334,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +335,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +336,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +337,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +338,11,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +339,59,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +340,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +341,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +342,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +343,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +344,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +345,40,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +346,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +347,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +348,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +349,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +350,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +351,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +352,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +353,59,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +354,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +355,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +356,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +357,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +358,49,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +359,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +360,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +361,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +362,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +363,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +364,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +365,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +366,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +367,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +368,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +369,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +370,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +371,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +372,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +373,65,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +374,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +375,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +376,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +377,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +378,3,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +379,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +380,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +381,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +382,49,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +383,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +384,51,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +385,25,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +386,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +387,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +388,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +389,9,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +390,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +391,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +392,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +393,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +394,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +395,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +396,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +397,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +398,55,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +399,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +400,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +401,32,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +402,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +403,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +404,73,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +405,7,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +406,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +407,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +408,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +409,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +410,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +411,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +412,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +413,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +414,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +415,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +416,9,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +417,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +418,14,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +419,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +420,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +421,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +422,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +423,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +424,75,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +425,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +426,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +427,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +428,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +429,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +430,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +431,3,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +432,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +433,7,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +434,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +435,14,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +436,1,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +437,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +438,84,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +439,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +440,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +441,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +442,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +443,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +444,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +445,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +446,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +447,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +448,4,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +449,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +450,32,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +451,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +452,55,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +453,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +454,32,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +455,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +456,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +457,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +458,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +459,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +460,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +461,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +462,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +463,14,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +464,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +465,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +466,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +467,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +468,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +469,3,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +470,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +471,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +472,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +473,41,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +474,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +475,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +476,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +477,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +478,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +479,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +480,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +481,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +482,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +483,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +484,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +485,62,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +486,53,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +487,3,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +488,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +489,62,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +490,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +491,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +492,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +493,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +494,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +495,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +496,8,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +497,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +498,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +499,41,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +500,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +501,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +502,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +503,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +504,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +505,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +506,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +507,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +508,1,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +509,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +510,73,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +511,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +512,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +513,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +514,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +515,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +516,3,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +517,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +518,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +519,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +520,1,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +521,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +522,8,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +523,65,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +524,1,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +525,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +526,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +527,87,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +528,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +529,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +530,41,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +531,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +532,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +533,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +534,33,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +535,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +536,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +537,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +538,23,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +539,75,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +540,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +541,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +542,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +543,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +544,25,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +545,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +546,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +547,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +548,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +549,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +550,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +551,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +552,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +553,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +554,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +555,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +556,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +557,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +558,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +559,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +560,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +561,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +562,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +563,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +564,8,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +565,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +566,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +567,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +568,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +569,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +570,84,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +571,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +572,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +573,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +574,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +575,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +576,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +577,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +578,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +579,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +580,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +581,53,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +582,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +583,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +584,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +585,75,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +586,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +587,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +588,62,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +589,9,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +590,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +591,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +592,59,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +593,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +594,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +595,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +596,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +597,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +598,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +599,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +600,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +601,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +602,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +603,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +604,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +605,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +606,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +607,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +608,4,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +609,23,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +610,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +611,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +612,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +613,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +614,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +615,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +616,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +617,14,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +618,65,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +619,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +620,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +621,56,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +622,11,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +623,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +624,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +625,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +626,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +627,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +628,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +629,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +630,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +631,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +632,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +633,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +634,27,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +635,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +636,51,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +637,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +638,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +639,41,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +640,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +641,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +642,19,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +643,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +644,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +645,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +646,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +647,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +648,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +649,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +650,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +651,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +652,23,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +653,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +654,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +655,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +656,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +657,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +658,14,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +659,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +660,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +661,9,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +662,33,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +663,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +664,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +665,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +666,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +667,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +668,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +669,87,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +670,11,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +671,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +672,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +673,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +674,59,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +675,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +676,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +677,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +678,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +679,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +680,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +681,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +682,51,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +683,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +684,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +685,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +686,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +687,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +688,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +689,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +690,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +691,23,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +692,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +693,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +694,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +695,9,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +696,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +697,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +698,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +699,75,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +700,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +701,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +702,19,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +703,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +704,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +705,75,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +706,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +707,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +708,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +709,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +710,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +711,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +712,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +713,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +714,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +715,75,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +716,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +717,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +718,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +719,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +720,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +721,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +722,33,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +723,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +724,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +725,84,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +726,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +727,33,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +728,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +729,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +730,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +731,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +732,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +733,32,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +734,49,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +735,25,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +736,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +737,53,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +738,32,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +739,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +740,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +741,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +742,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +743,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +744,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +745,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +746,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +747,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +748,40,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +749,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +750,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +751,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +752,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +753,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +754,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +755,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +756,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +757,19,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +758,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +759,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +760,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +761,40,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +762,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +763,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +764,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +765,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +766,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +767,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +768,25,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +769,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +770,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +771,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +772,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +773,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +774,62,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +775,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +776,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +777,19,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +778,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +779,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +780,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +781,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +782,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +783,23,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +784,25,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +785,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +786,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +787,56,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +788,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +789,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +790,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +791,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +792,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +793,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +794,4,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +795,8,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +796,19,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +797,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +798,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +799,84,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +800,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +801,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +802,49,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +803,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +804,11,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +805,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +806,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +807,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +808,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +809,1,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +810,56,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +811,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +812,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +813,51,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +814,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +815,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +816,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +817,84,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +818,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +819,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +820,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +821,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +822,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +823,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +824,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +825,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +826,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +827,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +828,19,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +829,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +830,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +831,53,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +832,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +833,19,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +834,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +835,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +836,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +837,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +838,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +839,7,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +840,55,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +841,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +842,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +843,87,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +844,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +845,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +846,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +847,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +848,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +849,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +850,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +851,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +852,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +853,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +854,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +855,75,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +856,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +857,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +858,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +859,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +860,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +861,75,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +862,1,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +863,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +864,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +865,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +866,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +867,11,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +868,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +869,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +870,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +871,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +872,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +873,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +874,55,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +875,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +876,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +877,27,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +878,8,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +879,62,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +880,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +881,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +882,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +883,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +884,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +885,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +886,25,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +887,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +888,56,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +889,25,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +890,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +891,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +892,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +893,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +894,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +895,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +896,8,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +897,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +898,59,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +899,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +900,33,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +901,25,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +902,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +903,40,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +904,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +905,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +906,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +907,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +908,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +909,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +910,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +911,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +912,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +913,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +914,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +915,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +916,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +917,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +918,56,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +919,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +920,19,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +921,23,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +922,84,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +923,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +924,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +925,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +926,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +927,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +928,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +929,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +930,51,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +931,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +932,32,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +933,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +934,33,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +935,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +936,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +937,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +938,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +939,55,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +940,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +941,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +942,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +943,9,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +944,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +945,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +946,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +947,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +948,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +949,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +950,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +951,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +952,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +953,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +954,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +955,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +956,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +957,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +958,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +959,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +960,7,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +961,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +962,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +963,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +964,1,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +965,25,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +966,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +967,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +968,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +969,65,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +970,25,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +971,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +972,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +973,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +974,87,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +975,75,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +976,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +977,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +978,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +979,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +980,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +981,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +982,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +983,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +984,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +985,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +986,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +987,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +988,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +989,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +990,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +991,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +992,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +993,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +994,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +995,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +996,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +997,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +998,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +999,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1000,3,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1001,65,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1002,53,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1003,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1004,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1005,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1006,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1007,7,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1008,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1009,27,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1010,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1011,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1012,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1013,11,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1014,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1015,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1016,7,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1017,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1018,1,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1019,9,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1020,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1021,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1022,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1023,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1024,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1025,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1026,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1027,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1028,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1029,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1030,75,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1031,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1032,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1033,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1034,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1035,49,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1036,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1037,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1038,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1039,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1040,11,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1041,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1042,8,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1043,25,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1044,51,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1045,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1046,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1047,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1048,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1049,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1050,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1051,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1052,3,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1053,32,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1054,9,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1055,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1056,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1057,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1058,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1059,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1060,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1061,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1062,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1063,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1064,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1065,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1066,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1067,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1068,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1069,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1070,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1071,8,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1072,32,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1073,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1074,9,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1075,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1076,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1077,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1078,40,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1079,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1080,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1081,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1082,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1083,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1084,25,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1085,56,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1086,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1087,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1088,8,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1089,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1090,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1091,87,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1092,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1093,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1094,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1095,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1096,27,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1097,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1098,27,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1099,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1100,73,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1101,73,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1102,32,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1103,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1104,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1105,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1106,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1107,11,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1108,29,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1109,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1110,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1111,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1112,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1113,65,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1114,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1115,8,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1116,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1117,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1118,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1119,9,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1120,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1121,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1122,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1123,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1124,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1125,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1126,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1127,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1128,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1129,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1130,19,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1131,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1132,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1133,87,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1134,14,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1135,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1136,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1137,11,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1138,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1139,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1140,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1141,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1142,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1143,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1144,25,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1145,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1146,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1147,9,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1148,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1149,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1150,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1151,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1152,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1153,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1154,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1155,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1156,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1157,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1158,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1159,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1160,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1161,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1162,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1163,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1164,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1165,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1166,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1167,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1168,4,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1169,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1170,75,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1171,3,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1172,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1173,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1174,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1175,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1176,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1177,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1178,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1179,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1180,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1181,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1182,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1183,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1184,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1185,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1186,84,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1187,29,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1188,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1189,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1190,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1191,73,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1192,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1193,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1194,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1195,40,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1196,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1197,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1198,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1199,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1200,9,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1201,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1202,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1203,19,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1204,27,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1205,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1206,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1207,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1208,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1209,40,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1210,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1211,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1212,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1213,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1214,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1215,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1216,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1217,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1218,27,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1219,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1220,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1221,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1222,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1223,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1224,40,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1225,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1226,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1227,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1228,3,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1229,62,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1230,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1231,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1232,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1233,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1234,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1235,56,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1236,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1237,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1238,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1239,7,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1240,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1241,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1242,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1243,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1244,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1245,11,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1246,41,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1247,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1248,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1249,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1250,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1251,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1252,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1253,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1254,1,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1255,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1256,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1257,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1258,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1259,27,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1260,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1261,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1262,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1263,11,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1264,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1265,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1266,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1267,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1268,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1269,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1270,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1271,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1272,53,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1273,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1274,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1275,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1276,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1277,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1278,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1279,56,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1280,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1281,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1282,55,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1283,33,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1284,49,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1285,51,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1286,19,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1287,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1288,87,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1289,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1290,73,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1291,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1292,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1293,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1294,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1295,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1296,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1297,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1298,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1299,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1300,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1301,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1302,19,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1303,27,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1304,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1305,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1306,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1307,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1308,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1309,53,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1310,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1311,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1312,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1313,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1314,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1315,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1316,87,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1317,23,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1318,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1319,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1320,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1321,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1322,1,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1323,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1324,53,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1325,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1326,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1327,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1328,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1329,87,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1330,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1331,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1332,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1333,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1334,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1335,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1336,53,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1337,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1338,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1339,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1340,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1341,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1342,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1343,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1344,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1345,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1346,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1347,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1348,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1349,7,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1350,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1351,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1352,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1353,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1354,33,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1355,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1356,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1357,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1358,32,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1359,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1360,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1361,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1362,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1363,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1364,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1365,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1366,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1367,3,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1368,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1369,4,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1370,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1371,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1372,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1373,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1374,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1375,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1376,65,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1377,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1378,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1379,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1380,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1381,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1382,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1383,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1384,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1385,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1386,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1387,55,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1388,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1389,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1390,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1391,7,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1392,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1393,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1394,65,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1395,7,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1396,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1397,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1398,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1399,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1400,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1401,4,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1402,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1403,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1404,29,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1405,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1406,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1407,14,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1408,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1409,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1410,3,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1411,29,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1412,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1413,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1414,73,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1415,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1416,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1417,65,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1418,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1419,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1420,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1421,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1422,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1423,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1424,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1425,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1426,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1427,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1428,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1429,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1430,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1431,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1432,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1433,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1434,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1435,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1436,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1437,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1438,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1439,29,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1440,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1441,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1442,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1443,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1444,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1445,87,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1446,29,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1447,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1448,9,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1449,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1450,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1451,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1452,7,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1453,4,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1454,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1455,14,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1456,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1457,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1458,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1459,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1460,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1461,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1462,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1463,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1464,23,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1465,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1466,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1467,8,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1468,7,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1469,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1470,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1471,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1472,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1473,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1474,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1475,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1476,27,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1477,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1478,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1479,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1480,55,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1481,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1482,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1483,41,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1484,53,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1485,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1486,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1487,7,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1488,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1489,73,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1490,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1491,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1492,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1493,4,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1494,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1495,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1496,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1497,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1498,3,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1499,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1500,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1501,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1502,41,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1503,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1504,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1505,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1506,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1507,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1508,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1509,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1510,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1511,33,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1512,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1513,73,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1514,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1515,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1516,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1517,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1518,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1519,1,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1520,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1521,41,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1522,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1523,59,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1524,62,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1525,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1526,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1527,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1528,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1529,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1530,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1531,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1532,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1533,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1534,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1535,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1536,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1537,73,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1538,51,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1539,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1540,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1541,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1542,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1543,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1544,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1545,87,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1546,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1547,41,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1548,62,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1549,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1550,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1551,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1552,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1553,53,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1554,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1555,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1556,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1557,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1558,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1559,33,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1560,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1561,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1562,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1563,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1564,23,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1565,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1566,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1567,41,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1568,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1569,75,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1570,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1571,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1572,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1573,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1574,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1575,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1576,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1577,9,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1578,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1579,49,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1580,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1581,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1582,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1583,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1584,14,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1585,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1586,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1587,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1588,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1589,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1590,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1591,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1592,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1593,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1594,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1595,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1596,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1597,7,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1598,49,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1599,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1600,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1601,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1602,23,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1603,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1604,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1605,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1606,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1607,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1608,25,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1609,41,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1610,65,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1611,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1612,73,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1613,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1614,62,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1615,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1616,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1617,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1618,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1619,11,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1620,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1621,41,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1622,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1623,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1624,33,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1625,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1626,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1627,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1628,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1629,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1630,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1631,55,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1632,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1633,25,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1634,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1635,3,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1636,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1637,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1638,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1639,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1640,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1641,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1642,29,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1643,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1644,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1645,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1646,4,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1647,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1648,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1649,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1650,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1651,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1652,87,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1653,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1654,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1655,84,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1656,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1657,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1658,51,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1659,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1660,51,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1661,9,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1662,19,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1663,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1664,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1665,65,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1666,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1667,29,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1668,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1669,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1670,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1671,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1672,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1673,8,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1674,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1675,23,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1676,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1677,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1678,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1679,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1680,84,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1681,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1682,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1683,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1684,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1685,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1686,11,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1687,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1688,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1689,4,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1690,55,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1691,40,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1692,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1693,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1694,33,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1695,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1696,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1697,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1698,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1699,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1700,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1701,4,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1702,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1703,65,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1704,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1705,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1706,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1707,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1708,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1709,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1710,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1711,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1712,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1713,65,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1714,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1715,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1716,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1717,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1718,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1719,84,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1720,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1721,19,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1722,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1723,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1724,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1725,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1726,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1727,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1728,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1729,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1730,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1731,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1732,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1733,84,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1734,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1735,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1736,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1737,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1738,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1739,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1740,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1741,84,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1742,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1743,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1744,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1745,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1746,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1747,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1748,23,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1749,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1750,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1751,56,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1752,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1753,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1754,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1755,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1756,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1757,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1758,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1759,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1760,14,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1761,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1762,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1763,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1764,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1765,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1766,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1767,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1768,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1769,56,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1770,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1771,9,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1772,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1773,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1774,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1775,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1776,75,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1777,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1778,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1779,11,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1780,56,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1781,33,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1782,51,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1783,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1784,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1785,25,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1786,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1787,7,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1788,29,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1789,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1790,8,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1791,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1792,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1793,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1794,1,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1795,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1796,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1797,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1798,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1799,41,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1800,23,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1801,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1802,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1803,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1804,11,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1805,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1806,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1807,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1808,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1809,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1810,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1811,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1812,73,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1813,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1814,56,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1815,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1816,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1817,4,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1818,65,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1819,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1820,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1821,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1822,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1823,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1824,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1825,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1826,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1827,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1828,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1829,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1830,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1831,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1832,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1833,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1834,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1835,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1836,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1837,62,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1838,32,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1839,55,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1840,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1841,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1842,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1843,56,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1844,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1845,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1846,75,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1847,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1848,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1849,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1850,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1851,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1852,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1853,53,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1854,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1855,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1856,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1857,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1858,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1859,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1860,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1861,14,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1862,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1863,32,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1864,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1865,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1866,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1867,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1868,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1869,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1870,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1871,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1872,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1873,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1874,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1875,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1876,32,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1877,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1878,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1879,27,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1880,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1881,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1882,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1883,23,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1884,8,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1885,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1886,1,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1887,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1888,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1889,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1890,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1891,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1892,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1893,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1894,40,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1895,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1896,56,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1897,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1898,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1899,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1900,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1901,3,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1902,4,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1903,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1904,73,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1905,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1906,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1907,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1908,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1909,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1910,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1911,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1912,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1913,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1914,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1915,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1916,11,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1917,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1918,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1919,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1920,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1921,65,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1922,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1923,59,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1924,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1925,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1926,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1927,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1928,9,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1929,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1930,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1931,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1932,1,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1933,27,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1934,59,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1935,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1936,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1937,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1938,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1939,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1940,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1941,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1942,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1943,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1944,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1945,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1946,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1947,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1948,8,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1949,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1950,32,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1951,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1952,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1953,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1954,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1955,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1956,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1957,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1958,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1959,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1960,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1961,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1962,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1963,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1964,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1965,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1966,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1967,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1968,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1969,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1970,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1971,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1972,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1973,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1974,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1975,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1976,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1977,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1978,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1979,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1980,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1981,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1982,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1983,73,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1984,27,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1985,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1986,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1987,9,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1988,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1989,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1990,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1991,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1992,26,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1993,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1994,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1995,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1996,3,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1997,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1998,59,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +1999,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2000,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2001,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2002,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2003,33,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2004,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2005,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2006,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2007,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2008,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2009,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2010,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2011,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2012,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2013,51,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2014,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2015,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2016,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2017,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2018,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2019,65,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2020,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2021,53,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2022,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2023,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2024,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2025,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2026,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2027,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2028,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2029,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2030,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2031,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2032,55,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2033,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2034,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2035,8,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2036,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2037,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2038,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2039,51,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2040,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2041,7,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2042,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2043,55,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2044,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2045,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2046,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2047,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2048,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2049,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2050,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2051,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2052,81,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2053,84,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2054,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2055,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2056,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2057,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2058,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2059,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2060,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2061,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2062,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2063,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2064,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2065,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2066,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2067,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2068,3,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2069,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2070,84,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2071,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2072,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2073,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2074,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2075,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2076,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2077,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2078,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2079,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2080,5,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2081,29,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2082,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2083,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2084,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2085,3,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2086,27,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2087,62,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2088,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2089,73,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2090,25,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2091,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2092,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2093,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2094,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2095,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2096,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2097,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2098,51,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2099,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2100,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2101,8,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2102,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2103,53,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2104,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2105,32,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2106,27,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2107,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2108,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2109,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2110,59,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2111,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2112,49,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2113,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2114,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2115,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2116,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2117,87,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2118,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2119,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2120,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2121,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2122,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2123,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2124,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2125,29,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2126,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2127,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2128,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2129,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2130,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2131,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2132,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2133,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2134,84,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2135,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2136,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2137,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2138,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2139,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2140,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2141,75,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2142,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2143,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2144,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2145,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2146,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2147,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2148,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2149,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2150,14,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2151,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2152,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2153,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2154,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2155,73,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2156,75,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2157,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2158,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2159,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2160,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2161,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2162,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2163,53,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2164,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2165,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2166,14,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2167,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2168,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2169,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2170,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2171,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2172,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2173,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2174,25,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2175,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2176,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2177,59,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2178,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2179,56,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2180,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2181,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2182,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2183,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2184,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2185,56,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2186,75,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2187,29,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2188,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2189,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2190,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2191,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2192,75,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2193,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2194,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2195,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2196,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2197,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2198,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2199,59,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2200,23,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2201,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2202,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2203,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2204,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2205,53,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2206,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2207,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2208,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2209,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2210,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2211,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2212,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2213,87,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2214,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2215,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2216,82,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2217,9,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2218,68,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2219,29,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2220,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2221,14,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2222,73,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2223,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2224,29,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2225,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2226,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2227,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2228,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2229,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2230,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2231,51,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2232,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2233,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2234,55,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2235,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2236,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2237,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2238,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2239,87,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2240,67,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2241,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2242,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2243,32,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2244,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2245,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2246,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2247,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2248,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2249,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2250,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2251,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2252,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2253,14,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2254,14,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2255,84,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2256,27,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2257,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2258,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2259,41,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2260,96,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2261,87,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2262,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2263,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2264,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2265,14,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2266,4,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2267,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2268,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2269,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2270,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2271,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2272,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2273,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2274,49,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2275,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2276,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2277,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2278,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2279,56,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2280,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2281,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2282,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2283,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2284,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2285,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2286,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2287,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2288,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2289,65,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2290,14,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2291,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2292,49,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2293,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2294,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2295,8,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2296,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2297,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2298,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2299,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2300,89,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2301,14,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2302,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2303,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2304,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2305,4,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2306,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2307,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2308,19,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2309,88,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2310,32,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2311,53,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2312,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2313,1,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2314,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2315,28,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2316,57,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2317,7,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2318,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2319,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2320,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2321,41,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2322,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2323,75,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2324,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2325,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2326,53,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2327,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2328,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2329,59,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2330,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2331,1,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2332,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2333,73,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2334,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2335,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2336,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2337,53,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2338,33,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2339,62,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2340,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2341,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2342,51,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2343,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2344,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2345,63,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2346,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2347,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2348,83,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2349,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2350,54,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2351,62,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2352,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2353,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2354,45,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2355,10,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2356,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2357,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2358,61,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2359,84,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2360,7,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2361,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2362,84,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2363,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2364,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2365,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2366,1,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2367,85,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2368,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2369,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2370,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2371,1,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2372,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2373,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2374,60,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2375,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2376,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2377,91,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2378,92,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2379,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2380,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2381,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2382,36,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2383,16,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2384,19,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2385,86,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2386,37,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2387,29,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2388,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2389,95,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2390,90,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2391,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2392,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2393,29,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2394,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2395,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2396,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2397,87,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2398,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2399,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2400,42,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2401,11,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2402,17,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2403,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2404,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2405,51,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2406,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2407,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2408,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2409,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2410,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2411,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2412,98,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2413,38,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2414,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2415,48,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2416,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2417,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2418,49,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2419,53,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2420,12,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2421,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2422,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2423,64,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2424,73,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2425,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2426,51,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2427,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2428,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2429,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2430,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2431,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2432,0,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2433,27,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2434,11,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2435,70,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2436,65,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2437,6,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2438,7,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2439,29,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2440,39,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2441,77,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2442,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2443,9,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2444,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2445,20,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2446,94,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2447,78,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2448,24,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2449,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2450,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2451,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2452,31,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2453,33,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2454,49,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2455,69,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2456,25,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2457,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2458,27,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2459,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2460,15,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2461,71,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2462,23,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2463,18,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2464,80,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2465,65,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2466,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2467,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2468,66,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2469,1,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2470,79,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2471,62,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2472,47,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2473,35,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2474,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2475,32,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2476,97,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2477,43,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2478,50,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2479,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2480,72,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2481,99,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2482,21,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2483,22,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2484,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2485,52,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2486,2,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2487,44,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2488,74,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2489,34,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2490,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2491,23,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2492,46,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2493,1,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2494,93,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2495,30,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2496,58,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2497,13,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2498,53,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 +2499,76,3,4,5,6.6,7.7,8.8,abc,def,ghiaaaaaa,2020-10-10,2020-10-10 11:12:59 diff --git a/regression-test/suites/data_model_p0/unique/test_unique_table_auto_inc.groovy b/regression-test/suites/data_model_p0/unique/test_unique_table_auto_inc.groovy index 10a5444a8e5be8..f1830db2c548a7 100644 --- a/regression-test/suites/data_model_p0/unique/test_unique_table_auto_inc.groovy +++ b/regression-test/suites/data_model_p0/unique/test_unique_table_auto_inc.groovy @@ -47,7 +47,7 @@ suite("test_unique_table_auto_inc") { time 10000 // limit inflight 10s } sql "sync" - qt_sql "select * from ${table1};" + order_qt_sql "select * from ${table1};" sql """ insert into ${table1} values(0, "Bob", 123), (2, "Tom", 323), (4, "Carter", 523);""" qt_sql "select * from ${table1} order by id" sql "drop table if exists ${table1};" @@ -117,7 +117,7 @@ suite("test_unique_table_auto_inc") { time 10000 // limit inflight 10s } sql "sync" - qt_sql "select * from ${table3};" + order_qt_sql "select * from ${table3};" sql """ insert into ${table3} values(0, "Bob", 123), (2, "Tom", 323), (4, "Carter", 523);""" qt_sql "select * from ${table3} order by id" sql "drop table if exists ${table3};" @@ -152,7 +152,7 @@ suite("test_unique_table_auto_inc") { time 10000 // limit inflight 10s } sql "sync" - qt_update_inplace "select * from ${table4};" + order_qt_update_inplace "select * from ${table4};" sql "drop table if exists ${table4};" // test for partial update, auto inc col is key diff --git a/regression-test/suites/load_p0/http_stream/test_http_stream.groovy b/regression-test/suites/load_p0/http_stream/test_http_stream.groovy index 8a7d5763604e4b..f732f7ce3c2f8f 100644 --- a/regression-test/suites/load_p0/http_stream/test_http_stream.groovy +++ b/regression-test/suites/load_p0/http_stream/test_http_stream.groovy @@ -377,7 +377,7 @@ suite("test_http_stream", "p0") { } } - qt_sql8 "select * from ${tableName8}" + order_qt_sql8 "select * from ${tableName8}" } finally { try_sql "DROP TABLE IF EXISTS ${tableName8}" } @@ -425,7 +425,7 @@ suite("test_http_stream", "p0") { } } - qt_sql9 "select * from ${tableName9}" + order_qt_sql9 "select * from ${tableName9}" } finally { try_sql "DROP TABLE IF EXISTS ${tableName9}" } diff --git a/regression-test/suites/load_p0/stream_load/test_stream_load_new.groovy b/regression-test/suites/load_p0/stream_load/test_stream_load_new.groovy index 48c3e5f9654870..f2eae1b5488e81 100644 --- a/regression-test/suites/load_p0/stream_load/test_stream_load_new.groovy +++ b/regression-test/suites/load_p0/stream_load/test_stream_load_new.groovy @@ -358,7 +358,7 @@ suite("test_stream_load_new", "p0") { } } sql """ sync; """ - qt_sql8 "select * from ${tableName8}" + order_qt_sql8 "select * from ${tableName8}" } finally { try_sql "DROP TABLE IF EXISTS ${tableName8}" } @@ -404,7 +404,7 @@ suite("test_stream_load_new", "p0") { } } sql """ sync; """ - qt_sql9 "select * from ${tableName9}" + order_qt_sql9 "select * from ${tableName9}" } finally { try_sql "DROP TABLE IF EXISTS ${tableName9}" } diff --git a/regression-test/suites/load_p0/stream_load/test_stream_load_new_move_memtable.groovy b/regression-test/suites/load_p0/stream_load/test_stream_load_new_move_memtable.groovy index a7821d5588b3be..9569a013c866eb 100644 --- a/regression-test/suites/load_p0/stream_load/test_stream_load_new_move_memtable.groovy +++ b/regression-test/suites/load_p0/stream_load/test_stream_load_new_move_memtable.groovy @@ -374,7 +374,7 @@ suite("test_stream_load_new_move_memtable", "p0") { } sql """ sync; """ - qt_sql8 "select * from ${tableName8}" + order_qt_sql8 "select * from ${tableName8}" } finally { try_sql "DROP TABLE IF EXISTS ${tableName8}" } @@ -422,7 +422,7 @@ suite("test_stream_load_new_move_memtable", "p0") { } sql """ sync; """ - qt_sql9 "select * from ${tableName9}" + order_qt_sql9 "select * from ${tableName9}" } finally { try_sql "DROP TABLE IF EXISTS ${tableName9}" } diff --git a/regression-test/suites/point_query_p0/load_ck.groovy b/regression-test/suites/point_query_p0/load_ck.groovy new file mode 100644 index 00000000000000..751e23b3d4c82e --- /dev/null +++ b/regression-test/suites/point_query_p0/load_ck.groovy @@ -0,0 +1,167 @@ +// 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_load_and_schema_change_row_store_ck", "p0") { + def dataFile = """${getS3Url()}/regression/datatypes/test_scalar_types_10w.csv""" + + // define dup key table1 + def testTable = "tbl_scalar_types_dup_ck" + sql "DROP TABLE IF EXISTS ${testTable} FORCE" + sql """ + CREATE TABLE IF NOT EXISTS ${testTable} ( + `k1` bigint(11) NULL, + `c_bool` boolean NULL, + `c_tinyint` tinyint(4) NULL, + `c_smallint` smallint(6) NULL, + `c_int` int(11) NULL, + `c_bigint` bigint(20) NULL, + `c_largeint` largeint(40) NULL, + `c_float` float NULL, + `c_double` double NULL, + `c_decimal` decimal(20, 3) NULL, + `c_decimalv3` decimalv3(20, 3) NULL, + `c_date` date NULL, + `c_datetime` datetime NULL, + `c_datev2` datev2 NULL, + `c_datetimev2` datetimev2(0) NULL, + `c_char` char(15) NULL, + `c_varchar` varchar(100) NULL, + `c_string` text NULL + ) ENGINE=OLAP + DUPLICATE KEY(`k1`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`k1`) BUCKETS 10 + PROPERTIES("replication_num" = "1", "row_store_columns" = "k1,c_bool,c_tinyint,c_bigint,c_decimal,c_decimalv3,c_datev2,c_string"); + """ + + + // load data + streamLoad { + table testTable + file dataFile + time 60000 + + check { result, exception, startTime, endTime -> + if (exception != null) { + throw exception + } + log.info("Stream load result: ${result}".toString()) + def json = parseJson(result) + assertEquals(100000, json.NumberTotalRows) + assertEquals(100000, json.NumberLoadedRows) + } + } + + sql "set topn_opt_limit_threshold = 100" + qt_sql "SELECT * from ${testTable} order by 1, 2, 3 limit 10" + qt_sql "SELECT * from ${testTable} where c_tinyint = 10 order by 1, 2, 3 limit 10 " + + sql """ + ALTER table ${testTable} MODIFY COLUMN c_int BIGINT; + """ + def getJobState = { tableName -> + def jobStateResult = sql """ SHOW ALTER TABLE COLUMN WHERE IndexName='${tableName}' ORDER BY createtime DESC LIMIT 1 """ + return jobStateResult[0][9] + } + def wait_job_done = { tableName -> + def max_try_time = 100 + while (max_try_time--){ + String result = getJobState("${tableName}") + if (result == "FINISHED") { + break + } else { + sleep(2000) + if (max_try_time < 1){ + assertEquals(1,2) + } + } + } + } + + sql "DROP TABLE IF EXISTS tbl_scalar_types_dup_ck_1 FORCE" + sql """ + CREATE TABLE IF NOT EXISTS tbl_scalar_types_dup_ck_1 ( + `k1` bigint(11) NULL, + `c_bool` boolean NULL, + `c_tinyint` tinyint(4) NULL, + `c_smallint` smallint(6) NULL, + `c_int` int(11) NULL, + `c_bigint` bigint(20) NULL, + `c_largeint` largeint(40) NULL, + `c_float` float NULL, + `c_double` double NULL, + `c_decimal` decimal(20, 3) NULL, + `c_decimalv3` decimalv3(20, 3) NULL, + `c_date` date NULL, + `c_datetime` datetime NULL, + `c_datev2` datev2 NULL, + `c_datetimev2` datetimev2(0) NULL, + `c_char` char(15) NULL, + `c_varchar` varchar(100) NULL, + `c_string` text NULL + ) ENGINE=OLAP + UNIQUE KEY(`k1`) + CLUSTER BY(c_datev2, c_date, c_largeint, c_tinyint, c_varchar, c_char, c_datetimev2, c_int, c_decimalv3, k1, c_decimal) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`k1`) BUCKETS 10 + PROPERTIES("replication_num" = "1"); + """ + + wait_job_done.call(testTable) + sql "INSERT INTO tbl_scalar_types_dup_ck_1 SELECT * from ${testTable}" + sql """alter table tbl_scalar_types_dup_ck_1 set ("bloom_filter_columns" = "c_largeint")""" + wait_job_done.call("tbl_scalar_types_dup_ck_1") + sql """alter table tbl_scalar_types_dup_ck_1 set ("store_row_column" = "true")""" + wait_job_done.call("tbl_scalar_types_dup_ck_1") + qt_sql "select sum(length(__DORIS_ROW_STORE_COL__)) from tbl_scalar_types_dup_ck_1" + sql """ + ALTER table tbl_scalar_types_dup_ck_1 ADD COLUMN new_column1 INT default "123"; + """ + sql "select /*+ SET_VAR(enable_nereids_planner=true)*/ * from tbl_scalar_types_dup_ck_1 where k1 = -2147303679" + sql """insert into tbl_scalar_types_dup_ck_1(new_column1) values (9999999)""" + qt_sql """select length(__DORIS_ROW_STORE_COL__) from tbl_scalar_types_dup_ck_1 where new_column1 = 9999999""" + + explain { + sql("select /*+ SET_VAR(enable_nereids_planner=true)*/ * from tbl_scalar_types_dup_ck_1 where k1 = -2147303679") + contains "SHORT-CIRCUIT" + } + sql """alter table tbl_scalar_types_dup_ck_1 set ("row_store_columns" = "k1,c_datetimev2")""" + wait_job_done.call("tbl_scalar_types_dup_ck_1") + qt_sql "select sum(length(__DORIS_ROW_STORE_COL__)) from tbl_scalar_types_dup_ck_1" + sql "set enable_short_circuit_query_access_column_store = false" + // TODO + //test { + // sql "select /*+ SET_VAR(enable_nereids_planner=true,enable_short_circuit_query_access_column_store=false)*/ * from tbl_scalar_types_dup_ck_1 where k1 = -2147303679" + // exception("Not support column store") + //} + explain { + sql("select /*+ SET_VAR(enable_nereids_planner=true)*/ k1, c_datetimev2 from tbl_scalar_types_dup_ck_1 where k1 = -2147303679") + contains "SHORT-CIRCUIT" + } + qt_sql "select /*+ SET_VAR(enable_nereids_planner=true)*/ k1, c_datetimev2 from tbl_scalar_types_dup_ck_1 where k1 = -2147303679" + + sql """alter table tbl_scalar_types_dup_ck_1 set ("row_store_columns" = "k1,c_decimalv3")""" + wait_job_done.call("tbl_scalar_types_dup_ck_1") + test { + sql "select /*+ SET_VAR(enable_nereids_planner=true,enable_short_circuit_query_access_column_store=false)*/ k1,c_datetimev2 from tbl_scalar_types_dup_ck_1 where k1 = -2147303679" + exception("Not support column store") + } + qt_sql "select /*+ SET_VAR(enable_nereids_planner=true,enable_short_circuit_query_access_column_store=false)*/ k1, c_decimalv3 from tbl_scalar_types_dup_ck_1 where k1 = -2147303679" + sql "set enable_short_circuit_query_access_column_store = true" +} diff --git a/regression-test/suites/schema_change_p0/unique_ck/test_schema_change_unique.groovy b/regression-test/suites/schema_change_p0/unique_ck/test_schema_change_unique.groovy new file mode 100644 index 00000000000000..be20986c4af9ae --- /dev/null +++ b/regression-test/suites/schema_change_p0/unique_ck/test_schema_change_unique.groovy @@ -0,0 +1,248 @@ +// 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 java.util.Date +import java.text.SimpleDateFormat +import org.apache.http.HttpResponse +import org.apache.http.client.methods.HttpPut +import org.apache.http.impl.client.CloseableHttpClient +import org.apache.http.impl.client.HttpClients +import org.apache.http.entity.ContentType +import org.apache.http.entity.StringEntity +import org.apache.http.client.config.RequestConfig +import org.apache.http.client.RedirectStrategy +import org.apache.http.protocol.HttpContext +import org.apache.http.HttpRequest +import org.apache.http.impl.client.LaxRedirectStrategy +import org.apache.http.client.methods.RequestBuilder +import org.apache.http.entity.StringEntity +import org.apache.http.client.methods.CloseableHttpResponse +import org.apache.http.util.EntityUtils + +suite("test_schema_change_unique", "p0") { + def tableName3 = "test_all_unique" + + def getJobState = { tableName -> + def jobStateResult = sql """ SHOW ALTER TABLE COLUMN WHERE IndexName='${tableName}' ORDER BY createtime DESC LIMIT 1 """ + return jobStateResult[0][9] + } + + def getCreateViewState = { tableName -> + def createViewStateResult = sql """ SHOW ALTER TABLE MATERIALIZED VIEW WHERE IndexName='${tableName}' ORDER BY createtime DESC LIMIT 1 """ + return createViewStateResult[0][8] + } + + def execStreamLoad = { + streamLoad { + table "${tableName3}" + + set 'column_separator', ',' + + file 'all_types.csv' + time 10000 // limit inflight 10s + + check { result, exception, startTime, endTime -> + if (exception != null) { + throw exception + } + log.info("Stream load result: ${result}".toString()) + def json = parseJson(result) + assertEquals("success", json.Status.toLowerCase()) + assertEquals(2500, json.NumberTotalRows) + assertEquals(0, json.NumberFilteredRows) + } + } + } + + def checkNoDuplicatedKeys = { tableName -> + def res = sql """ show tablets from ${tableName}; """ + log.info("tablets: " + res) + + def rowCount = sql """ select count() from ${tableName}; """ + log.info("rowCount: " + rowCount) + + List> cnt = sql """ select k1,k2,k3,count(*) a from ${tableName} group by k1,k2,k3 having a > 1; """ + log.info("ensure there are no duplicated keys") + if (cnt.size() > 0) { + log.info("find duplicated keys: " + cnt.get(0)) + } + assertEquals(0, cnt.size()) + } + + sql """ DROP TABLE IF EXISTS ${tableName3} """ + + sql """ + CREATE TABLE IF NOT EXISTS ${tableName3} ( + `k1` int(11) NULL, + `k2` tinyint(4) NULL, + `k3` smallint(6) NULL, + `k4` int(30) NULL, + `k5` largeint(40) NULL, + `k6` float NULL, + `k7` double NULL, + `k8` decimal(9, 0) NULL, + `k9` char(10) NULL, + `k10` varchar(1024) NULL, + `k11` text NULL, + `k12` date NULL, + `k13` datetime NULL + ) ENGINE=OLAP + unique KEY(k1, k2, k3) + CLUSTER BY (`k13`) + DISTRIBUTED BY HASH(`k1`) BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + execStreamLoad() + + sql """ alter table ${tableName3} modify column k4 string NULL""" + sleep(10) + int max_try_num = 60 + while (max_try_num--) { + String res = getJobState(tableName3) + if (res == "FINISHED" || res == "CANCELLED") { + assertEquals("FINISHED", res) + sleep(3000) + break + } else { + execStreamLoad() + if (max_try_num < 1) { + println "test timeout," + "state:" + res + assertEquals("FINISHED",res) + } + } + } + checkNoDuplicatedKeys(tableName3) + + sql """ alter table ${tableName3} modify column k2 bigint(11) key NULL""" + sleep(10) + max_try_num = 60 + while (max_try_num--) { + String res = getJobState(tableName3) + if (res == "FINISHED" || res == "CANCELLED") { + assertEquals("FINISHED", res) + sleep(3000) + break + } else { + execStreamLoad() + if (max_try_num < 1) { + println "test timeout," + "state:" + res + assertEquals("FINISHED",res) + } + } + } + checkNoDuplicatedKeys(tableName3) + + /* + sql """ create materialized view view_1 as select k2, k1, k4, k5 from ${tableName3} """ + sleep(10) + max_try_num = 60 + while (max_try_num--) { + String res = getCreateViewState(tableName3) + if (res == "FINISHED" || res == "CANCELLED") { + assertEquals("FINISHED", res) + sleep(3000) + break + } else { + execStreamLoad() + if (max_try_num < 1) { + println "test timeout," + "state:" + res + assertEquals("FINISHED",res) + } + } + } + */ + + sql """ alter table ${tableName3} modify column k5 string NULL""" + sleep(10) + max_try_num = 60 + while (max_try_num--) { + String res = getJobState(tableName3) + if (res == "FINISHED" || res == "CANCELLED") { + assertEquals("FINISHED", res) + sleep(3000) + break + } else { + execStreamLoad() + if (max_try_num < 1) { + println "test timeout," + "state:" + res + assertEquals("FINISHED",res) + } + } + } + checkNoDuplicatedKeys(tableName3) + + sql """ alter table ${tableName3} add column v14 int NOT NULL default "1" after k13 """ + sql """ insert into ${tableName3} values (10001, 2, 3, 4, 5, 6.6, 1.7, 8.8, + 'a', 'b', 'c', '2021-10-30', '2021-10-30 00:00:00', 10086) """ + checkNoDuplicatedKeys(tableName3) + + sql """ alter table ${tableName3} modify column v14 int NULL default "1" """ + sleep(10) + max_try_num = 6000 + while (max_try_num--) { + String res = getJobState(tableName3) + if (res == "FINISHED" || res == "CANCELLED") { + assertEquals("FINISHED", res) + sleep(3000) + break + } else { + int val = 100000 + max_try_num + sql """ insert into ${tableName3} values (${val}, 2, 3, 4, 5, 6.6, 1.7, 8.8, + 'a', 'b', 'c', '2021-10-30', '2021-10-30 00:00:00', 9527) """ + sleep(10) + if (max_try_num < 1) { + println "test timeout," + "state:" + res + assertEquals("FINISHED",res) + } + } + } + checkNoDuplicatedKeys(tableName3) + + sql """ alter table ${tableName3} drop column v14 """ + execStreamLoad() + checkNoDuplicatedKeys(tableName3) + + sql """ alter table ${tableName3} add column v14 int NOT NULL default "1" after k13 """ + + sql """ insert into ${tableName3} values (10002, 2, 3, 4, 5, 6.6, 1.7, 8.8, + 'a', 'b', 'c', '2021-10-30', '2021-10-30 00:00:00', 10086) """ + checkNoDuplicatedKeys(tableName3) + + sql """ alter table ${tableName3} drop column v14 """ + + sql """ alter table ${tableName3} add column v14 bitmap after k13 """ + + sql """ insert into ${tableName3} values (10002, 2, 3, 4, 5, 6.6, 1.7, 8.8, + 'a', 'b', 'c', '2021-10-30', '2021-10-30 00:00:00', to_bitmap(243)) """ + checkNoDuplicatedKeys(tableName3) + + sql """ alter table ${tableName3} drop column v14 """ + + + List> result = sql """ select * from ${tableName3} """ + for (row : result) { + assertEquals(2, row[1]); + assertEquals(3, row[2]); + assertEquals("4", row[3]); + assertEquals("5", row[4]); + } + checkNoDuplicatedKeys(tableName3) +} + diff --git a/regression-test/suites/schema_change_p0/unique_ck/test_unique_schema_value_drop.groovy b/regression-test/suites/schema_change_p0/unique_ck/test_unique_schema_value_drop.groovy new file mode 100644 index 00000000000000..e465661cdbceec --- /dev/null +++ b/regression-test/suites/schema_change_p0/unique_ck/test_unique_schema_value_drop.groovy @@ -0,0 +1,1027 @@ +// 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_unique_schema_value_drop", "p0") { + def tbName = "test_unique_model_schema_value_drop" + def tbName2 = "test_unique_model_schema_value_drop_1" + def on_write = true + println String.format("current enable_unique_key_merge_on_write is : %s ",on_write) + sql """ DROP TABLE IF EXISTS ${tbName} """ + def initTable1 = "" + def initTableData1 = "" + def getTableStatusSql = " SHOW ALTER TABLE COLUMN WHERE IndexName='${tbName}' ORDER BY createtime DESC LIMIT 1 " + def errorMessage = "" + def insertSql = "insert into ${tbName} values(123456689, 'Alice', '四川省', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00');" + + /** + * Test the unique model by drop a value type + */ + + + sql """ DROP TABLE IF EXISTS ${tbName} """ + def initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` CHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `is_ok` BOOLEAN COMMENT \"是否完成\",\n" + + " `t_int` INT COMMENT \"测试int\",\n" + + " `t_bigint` BIGINT COMMENT \"测试BIGINT\",\n" + + " `t_date` DATE COMMENT \"测试DATE\",\n" + + " `t_datev2` DATEV2 COMMENT \"测试DATEV2\",\n" + + " `t_datetimev2` DATETIMEV2 COMMENT \"测试DATETIMEV2\",\n" + + " `t_datetime` DATETIME COMMENT \"用户注册时间\",\n" + + " `t_string` STRING COMMENT \"测试string\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`)\n" + + " CLUSTER BY(SCORE, user_id)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + def initTableData = "insert into ${tbName} values(1, 'John Doe', 95.5, 'New York', 25, 1, 1234567890, true, 10, 1000000000, '2024-06-11', '2024-06-11', '2024-06-11 08:30:00', '2024-06-11 08:30:00', 'Test String 1', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (2, 'Jane Smith', 85.2, 'Los Angeles', 30, 2, 9876543210, false, 20, 2000000000, '2024-06-12', '2024-06-12', '2024-06-12 09:45:00', '2024-06-12 09:45:00', 'Test String 2', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (3, 'Mike Johnson', 77.8, 'Chicago', 35, 1, 1112223334, true, 30, 3000000000, '2024-06-13', '2024-06-13', '2024-06-13 11:15:00', '2024-06-13 11:15:00', 'Test String 3', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (4, 'Emily Brown', 92.0, 'San Francisco', 28, 2, 5556667778, true, 40, 4000000000, '2024-06-14', '2024-06-14', '2024-06-14 13:30:00', '2024-06-14 13:30:00', 'Test String 4', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (5, 'David Wilson', 88.9, 'Seattle', 32, 1, 9998887776, false, 50, 5000000000, '2024-06-15', '2024-06-15', '2024-06-15 15:45:00', '2024-06-15 15:45:00', 'Test String 5', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]');" + + // Test the unique model by drop a value type from BOOLEAN + sql initTable + sql initTableData + sql """ alter table ${tbName} DROP column is_ok """ + insertSql = "insert into ${tbName} values(6, 'Sophia Lee', 91.3, 'Boston', 29, 2, 7778889990, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable1 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` CHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `t_int` INT COMMENT \"测试int\",\n" + + " `t_bigint` BIGINT COMMENT \"测试BIGINT\",\n" + + " `t_date` DATE COMMENT \"测试DATE\",\n" + + " `t_datev2` DATEV2 COMMENT \"测试DATEV2\",\n" + + " `t_datetimev2` DATETIMEV2 COMMENT \"测试DATETIMEV2\",\n" + + " `t_datetime` DATETIME COMMENT \"用户注册时间\",\n" + + " `t_string` STRING COMMENT \"测试string\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`)\n" + + " CLUSTER BY(t_bigint, username, age)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData1 = "insert into ${tbName2} values(1, 'John Doe', 95.5, 'New York', 25, 1, 1234567890, 10, 1000000000, '2024-06-11', '2024-06-11', '2024-06-11 08:30:00', '2024-06-11 08:30:00', 'Test String 1', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (2, 'Jane Smith', 85.2, 'Los Angeles', 30, 2, 9876543210, 20, 2000000000, '2024-06-12', '2024-06-12', '2024-06-12 09:45:00', '2024-06-12 09:45:00', 'Test String 2', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (3, 'Mike Johnson', 77.8, 'Chicago', 35, 1, 1112223334, 30, 3000000000, '2024-06-13', '2024-06-13', '2024-06-13 11:15:00', '2024-06-13 11:15:00', 'Test String 3', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (4, 'Emily Brown', 92.0, 'San Francisco', 28, 2, 5556667778, 40, 4000000000, '2024-06-14', '2024-06-14', '2024-06-14 13:30:00', '2024-06-14 13:30:00', 'Test String 4', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (6, 'Sophia Lee', 91.3, 'Boston', 29, 2, 7778889990, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\\\"k1\\\":\\\"v1\\\", \\\"k2\\\": 200}')," + + " (5, 'David Wilson', 88.9, 'Seattle', 32, 1, 9998887776, 50, 5000000000, '2024-06-15', '2024-06-15', '2024-06-15 15:45:00', '2024-06-15 15:45:00', 'Test String 5', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]');" + + sql initTable1 + sql initTableData1 + checkTableData("${tbName}", "${tbName2}", "t_int") + sql """ DROP TABLE IF EXISTS ${tbName} """ + + + // Test the unique model by drop a value type from TINYINT + sql initTable + sql initTableData + sql """ alter table ${tbName} DROP column sex """ + insertSql = "insert into ${tbName} values(6, 'Sophia Lee', 91.3, 'Boston', 29, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable1 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` CHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `is_ok` BOOLEAN COMMENT \"是否完成\",\n" + + " `t_int` INT COMMENT \"测试int\",\n" + + " `t_bigint` BIGINT COMMENT \"测试BIGINT\",\n" + + " `t_date` DATE COMMENT \"测试DATE\",\n" + + " `t_datev2` DATEV2 COMMENT \"测试DATEV2\",\n" + + " `t_datetimev2` DATETIMEV2 COMMENT \"测试DATETIMEV2\",\n" + + " `t_datetime` DATETIME COMMENT \"用户注册时间\",\n" + + " `t_string` STRING COMMENT \"测试string\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`)\n" + + " CLUSTER BY(t_bigint, USER_ID, username, age)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData1 = "insert into ${tbName2} values(1, 'John Doe', 95.5, 'New York', 25, 1234567890, true, 10, 1000000000, '2024-06-11', '2024-06-11', '2024-06-11 08:30:00', '2024-06-11 08:30:00', 'Test String 1', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (2, 'Jane Smith', 85.2, 'Los Angeles', 30, 9876543210, false, 20, 2000000000, '2024-06-12', '2024-06-12', '2024-06-12 09:45:00', '2024-06-12 09:45:00', 'Test String 2', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (3, 'Mike Johnson', 77.8, 'Chicago', 35, 1112223334, true, 30, 3000000000, '2024-06-13', '2024-06-13', '2024-06-13 11:15:00', '2024-06-13 11:15:00', 'Test String 3', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (4, 'Emily Brown', 92.0, 'San Francisco', 28, 5556667778, true, 40, 4000000000, '2024-06-14', '2024-06-14', '2024-06-14 13:30:00', '2024-06-14 13:30:00', 'Test String 4', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (6, 'Sophia Lee', 91.3, 'Boston', 29, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (5, 'David Wilson', 88.9, 'Seattle', 32, 9998887776, false, 50, 5000000000, '2024-06-15', '2024-06-15', '2024-06-15 15:45:00', '2024-06-15 15:45:00', 'Test String 5', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]');" + + sql initTable1 + sql initTableData1 + checkTableData("${tbName}", "${tbName2}", "phone") + sql """ DROP TABLE IF EXISTS ${tbName} """ + + + // Test the unique model by drop a value type from SMALLINT + sql initTable + sql initTableData + sql """ alter table ${tbName} DROP column age """ + insertSql = "insert into ${tbName} values(6, 'Sophia Lee', 91.3, 'Boston', 2, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable1 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` CHAR(20) COMMENT \"用户所在城市\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `is_ok` BOOLEAN COMMENT \"是否完成\",\n" + + " `t_int` INT COMMENT \"测试int\",\n" + + " `t_bigint` BIGINT COMMENT \"测试BIGINT\",\n" + + " `t_date` DATE COMMENT \"测试DATE\",\n" + + " `t_datev2` DATEV2 COMMENT \"测试DATEV2\",\n" + + " `t_datetimev2` DATETIMEV2 COMMENT \"测试DATETIMEV2\",\n" + + " `t_datetime` DATETIME COMMENT \"用户注册时间\",\n" + + " `t_string` STRING COMMENT \"测试string\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`)\n" + + " CLUSTER BY(t_datev2, USER_ID, CITY)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData1 = "insert into ${tbName2} values(1, 'John Doe', 95.5, 'New York', 1, 1234567890, true, 10, 1000000000, '2024-06-11', '2024-06-11', '2024-06-11 08:30:00', '2024-06-11 08:30:00', 'Test String 1', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (2, 'Jane Smith', 85.2, 'Los Angeles', 2, 9876543210, false, 20, 2000000000, '2024-06-12', '2024-06-12', '2024-06-12 09:45:00', '2024-06-12 09:45:00', 'Test String 2', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (3, 'Mike Johnson', 77.8, 'Chicago', 1, 1112223334, true, 30, 3000000000, '2024-06-13', '2024-06-13', '2024-06-13 11:15:00', '2024-06-13 11:15:00', 'Test String 3', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (4, 'Emily Brown', 92.0, 'San Francisco', 2, 5556667778, true, 40, 4000000000, '2024-06-14', '2024-06-14', '2024-06-14 13:30:00', '2024-06-14 13:30:00', 'Test String 4', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (6, 'Sophia Lee', 91.3, 'Boston', 2, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (5, 'David Wilson', 88.9, 'Seattle', 1, 9998887776, false, 50, 5000000000, '2024-06-15', '2024-06-15', '2024-06-15 15:45:00', '2024-06-15 15:45:00', 'Test String 5', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]');" + + sql initTable1 + sql initTableData1 + checkTableData("${tbName}", "${tbName2}", "sex") + sql """ DROP TABLE IF EXISTS ${tbName} """ + + + // Test the unique model by drop a value type from INT + sql initTable + sql initTableData + sql """ alter table ${tbName} DROP column t_int """ + insertSql = "insert into ${tbName} values(6, 'Sophia Lee', 91.3, 'Boston', 29, 2, 7778889990, true, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable1 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` CHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `is_ok` BOOLEAN COMMENT \"是否完成\",\n" + + " `t_bigint` BIGINT COMMENT \"测试BIGINT\",\n" + + " `t_date` DATE COMMENT \"测试DATE\",\n" + + " `t_datev2` DATEV2 COMMENT \"测试DATEV2\",\n" + + " `t_datetimev2` DATETIMEV2 COMMENT \"测试DATETIMEV2\",\n" + + " `t_datetime` DATETIME COMMENT \"用户注册时间\",\n" + + " `t_string` STRING COMMENT \"测试string\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`)\n" + + " CLUSTER BY(t_datetimev2, USER_ID, t_datev2, CITY, age)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData1 = "insert into ${tbName2} values(1, 'John Doe', 95.5, 'New York', 25, 1, 1234567890, true, 1000000000, '2024-06-11', '2024-06-11', '2024-06-11 08:30:00', '2024-06-11 08:30:00', 'Test String 1', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (2, 'Jane Smith', 85.2, 'Los Angeles', 30, 2, 9876543210, false, 2000000000, '2024-06-12', '2024-06-12', '2024-06-12 09:45:00', '2024-06-12 09:45:00', 'Test String 2', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (3, 'Mike Johnson', 77.8, 'Chicago', 35, 1, 1112223334, true, 3000000000, '2024-06-13', '2024-06-13', '2024-06-13 11:15:00', '2024-06-13 11:15:00', 'Test String 3', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (4, 'Emily Brown', 92.0, 'San Francisco', 28, 2, 5556667778, true, 4000000000, '2024-06-14', '2024-06-14', '2024-06-14 13:30:00', '2024-06-14 13:30:00', 'Test String 4', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (6, 'Sophia Lee', 91.3, 'Boston', 29, 2, 7778889990, true, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\\\"k1\\\":\\\"v1\\\", \\\"k2\\\": 200}')," + + " (5, 'David Wilson', 88.9, 'Seattle', 32, 1, 9998887776, false, 5000000000, '2024-06-15', '2024-06-15', '2024-06-15 15:45:00', '2024-06-15 15:45:00', 'Test String 5', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]');" + + sql initTable1 + sql initTableData1 + checkTableData("${tbName}", "${tbName2}", "t_bigint") + sql """ DROP TABLE IF EXISTS ${tbName} """ + + + // Test the unique model by drop a value type from BIGINT + sql initTable + sql initTableData + sql """ alter table ${tbName} DROP column t_bigint """ + insertSql = "insert into ${tbName} values(6, 'Sophia Lee', 91.3, 'Boston', 29, 2, 7778889990, true, 60, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable1 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` CHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `is_ok` BOOLEAN COMMENT \"是否完成\",\n" + + " `t_int` INT COMMENT \"测试int\",\n" + + " `t_date` DATE COMMENT \"测试DATE\",\n" + + " `t_datev2` DATEV2 COMMENT \"测试DATEV2\",\n" + + " `t_datetimev2` DATETIMEV2 COMMENT \"测试DATETIMEV2\",\n" + + " `t_datetime` DATETIME COMMENT \"用户注册时间\",\n" + + " `t_string` STRING COMMENT \"测试string\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`)\n" + + " CLUSTER BY(t_datetimev2, sex, t_datev2, age, city)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData1 = "insert into ${tbName2} values(1, 'John Doe', 95.5, 'New York', 25, 1, 1234567890, true, 10, '2024-06-11', '2024-06-11', '2024-06-11 08:30:00', '2024-06-11 08:30:00', 'Test String 1', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (2, 'Jane Smith', 85.2, 'Los Angeles', 30, 2, 9876543210, false, 20, '2024-06-12', '2024-06-12', '2024-06-12 09:45:00', '2024-06-12 09:45:00', 'Test String 2', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (3, 'Mike Johnson', 77.8, 'Chicago', 35, 1, 1112223334, true, 30, '2024-06-13', '2024-06-13', '2024-06-13 11:15:00', '2024-06-13 11:15:00', 'Test String 3', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (4, 'Emily Brown', 92.0, 'San Francisco', 28, 2, 5556667778, true, 40, '2024-06-14', '2024-06-14', '2024-06-14 13:30:00', '2024-06-14 13:30:00', 'Test String 4', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (6, 'Sophia Lee', 91.3, 'Boston', 29, 2, 7778889990, true, 60, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\\\"k1\\\":\\\"v1\\\", \\\"k2\\\": 200}')," + + " (5, 'David Wilson', 88.9, 'Seattle', 32, 1, 9998887776, false, 50, '2024-06-15', '2024-06-15', '2024-06-15 15:45:00', '2024-06-15 15:45:00', 'Test String 5', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]');" + + sql initTable1 + sql initTableData1 + checkTableData("${tbName}", "${tbName2}", "t_date") + sql """ DROP TABLE IF EXISTS ${tbName} """ + + + // Test the unique model by drop a value type from LARGEINT + sql initTable + sql initTableData + sql """ alter table ${tbName} DROP column phone """ + insertSql = "insert into ${tbName} values(6, 'Sophia Lee', 91.3, 'Boston', 29, 2, true, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable1 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` CHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `is_ok` BOOLEAN COMMENT \"是否完成\",\n" + + " `t_int` INT COMMENT \"测试int\",\n" + + " `t_bigint` BIGINT COMMENT \"测试BIGINT\",\n" + + " `t_date` DATE COMMENT \"测试DATE\",\n" + + " `t_datev2` DATEV2 COMMENT \"测试DATEV2\",\n" + + " `t_datetimev2` DATETIMEV2 COMMENT \"测试DATETIMEV2\",\n" + + " `t_datetime` DATETIME COMMENT \"用户注册时间\",\n" + + " `t_string` STRING COMMENT \"测试string\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`)\n" + + " CLUSTER BY(score, t_date, sex, t_datev2, age)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData1 = "insert into ${tbName2} values(1, 'John Doe', 95.5, 'New York', 25, 1, true, 10, 1000000000, '2024-06-11', '2024-06-11', '2024-06-11 08:30:00', '2024-06-11 08:30:00', 'Test String 1', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (2, 'Jane Smith', 85.2, 'Los Angeles', 30, 2, false, 20, 2000000000, '2024-06-12', '2024-06-12', '2024-06-12 09:45:00', '2024-06-12 09:45:00', 'Test String 2', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (3, 'Mike Johnson', 77.8, 'Chicago', 35, 1, true, 30, 3000000000, '2024-06-13', '2024-06-13', '2024-06-13 11:15:00', '2024-06-13 11:15:00', 'Test String 3', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (4, 'Emily Brown', 92.0, 'San Francisco', 28, 2, true, 40, 4000000000, '2024-06-14', '2024-06-14', '2024-06-14 13:30:00', '2024-06-14 13:30:00', 'Test String 4', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (6, 'Sophia Lee', 91.3, 'Boston', 29, 2, true, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\\\"k1\\\":\\\"v1\\\", \\\"k2\\\": 200}')," + + " (5, 'David Wilson', 88.9, 'Seattle', 32, 1, false, 50, 5000000000, '2024-06-15', '2024-06-15', '2024-06-15 15:45:00', '2024-06-15 15:45:00', 'Test String 5', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]');" + + sql initTable1 + sql initTableData1 + checkTableData("${tbName}", "${tbName2}", "is_ok") + sql """ DROP TABLE IF EXISTS ${tbName} """ + + + // Test the unique model by drop a value type from DATE + sql initTable + sql initTableData + sql """ alter table ${tbName} DROP column t_date """ + insertSql = "insert into ${tbName} values(6, 'Sophia Lee', 91.3, 'Boston', 29, 2, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable1 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` CHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `is_ok` BOOLEAN COMMENT \"是否完成\",\n" + + " `t_int` INT COMMENT \"测试int\",\n" + + " `t_bigint` BIGINT COMMENT \"测试BIGINT\",\n" + + " `t_datev2` DATEV2 COMMENT \"测试DATEV2\",\n" + + " `t_datetimev2` DATETIMEV2 COMMENT \"测试DATETIMEV2\",\n" + + " `t_datetime` DATETIME COMMENT \"用户注册时间\",\n" + + " `t_string` STRING COMMENT \"测试string\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData1 = "insert into ${tbName2} values(1, 'John Doe', 95.5, 'New York', 25, 1, 1234567890, true, 10, 1000000000, '2024-06-11', '2024-06-11 08:30:00', '2024-06-11 08:30:00', 'Test String 1', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (2, 'Jane Smith', 85.2, 'Los Angeles', 30, 2, 9876543210, false, 20, 2000000000, '2024-06-12', '2024-06-12 09:45:00', '2024-06-12 09:45:00', 'Test String 2', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (3, 'Mike Johnson', 77.8, 'Chicago', 35, 1, 1112223334, true, 30, 3000000000, '2024-06-13', '2024-06-13 11:15:00', '2024-06-13 11:15:00', 'Test String 3', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (4, 'Emily Brown', 92.0, 'San Francisco', 28, 2, 5556667778, true, 40, 4000000000, '2024-06-14', '2024-06-14 13:30:00', '2024-06-14 13:30:00', 'Test String 4', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (6, 'Sophia Lee', 91.3, 'Boston', 29, 2, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\\\"k1\\\":\\\"v1\\\", \\\"k2\\\": 200}')," + + " (5, 'David Wilson', 88.9, 'Seattle', 32, 1, 9998887776, false, 50, 5000000000, '2024-06-15', '2024-06-15 15:45:00', '2024-06-15 15:45:00', 'Test String 5', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]');" + + sql initTable1 + sql initTableData1 + checkTableData("${tbName}", "${tbName2}", "t_datev2") + sql """ DROP TABLE IF EXISTS ${tbName} """ + + + // Test the unique model by drop a value type from DATEV2 + sql initTable + sql initTableData + sql """ alter table ${tbName} DROP column t_datev2 """ + insertSql = "insert into ${tbName} values(6, 'Sophia Lee', 91.3, 'Boston', 29, 2, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable1 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` CHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `is_ok` BOOLEAN COMMENT \"是否完成\",\n" + + " `t_int` INT COMMENT \"测试int\",\n" + + " `t_bigint` BIGINT COMMENT \"测试BIGINT\",\n" + + " `t_date` DATE COMMENT \"测试DATEV2\",\n" + + " `t_datetimev2` DATETIMEV2 COMMENT \"测试DATETIMEV2\",\n" + + " `t_datetime` DATETIME COMMENT \"用户注册时间\",\n" + + " `t_string` STRING COMMENT \"测试string\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData1 = "insert into ${tbName2} values(1, 'John Doe', 95.5, 'New York', 25, 1, 1234567890, true, 10, 1000000000, '2024-06-11', '2024-06-11 08:30:00', '2024-06-11 08:30:00', 'Test String 1', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (2, 'Jane Smith', 85.2, 'Los Angeles', 30, 2, 9876543210, false, 20, 2000000000, '2024-06-12', '2024-06-12 09:45:00', '2024-06-12 09:45:00', 'Test String 2', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (3, 'Mike Johnson', 77.8, 'Chicago', 35, 1, 1112223334, true, 30, 3000000000, '2024-06-13', '2024-06-13 11:15:00', '2024-06-13 11:15:00', 'Test String 3', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (4, 'Emily Brown', 92.0, 'San Francisco', 28, 2, 5556667778, true, 40, 4000000000, '2024-06-14', '2024-06-14 13:30:00', '2024-06-14 13:30:00', 'Test String 4', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (6, 'Sophia Lee', 91.3, 'Boston', 29, 2, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\\\"k1\\\":\\\"v1\\\", \\\"k2\\\": 200}')," + + " (5, 'David Wilson', 88.9, 'Seattle', 32, 1, 9998887776, false, 50, 5000000000, '2024-06-15', '2024-06-15 15:45:00', '2024-06-15 15:45:00', 'Test String 5', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]');" + + sql initTable1 + sql initTableData1 + checkTableData("${tbName}", "${tbName2}", "t_datetimev2") + sql """ DROP TABLE IF EXISTS ${tbName} """ + + + // Test the unique model by drop a value type from t_datetimev2 + sql initTable + sql initTableData + sql """ alter table ${tbName} DROP column t_datetimev2 """ + insertSql = "insert into ${tbName} values(6, 'Sophia Lee', 91.3, 'Boston', 29, 2, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable1 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` CHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `is_ok` BOOLEAN COMMENT \"是否完成\",\n" + + " `t_int` INT COMMENT \"测试int\",\n" + + " `t_bigint` BIGINT COMMENT \"测试BIGINT\",\n" + + " `t_date` DATE COMMENT \"测试DATE\",\n" + + " `t_datev2` DATEV2 COMMENT \"测试DATEV2\",\n" + + " `t_datetime` DATETIME COMMENT \"用户注册时间\",\n" + + " `t_string` STRING COMMENT \"测试string\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData1 = "insert into ${tbName2} values(1, 'John Doe', 95.5, 'New York', 25, 1, 1234567890, true, 10, 1000000000, '2024-06-11', '2024-06-11', '2024-06-11 08:30:00', 'Test String 1', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (2, 'Jane Smith', 85.2, 'Los Angeles', 30, 2, 9876543210, false, 20, 2000000000, '2024-06-12', '2024-06-12', '2024-06-12 09:45:00', 'Test String 2', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (3, 'Mike Johnson', 77.8, 'Chicago', 35, 1, 1112223334, true, 30, 3000000000, '2024-06-13', '2024-06-13', '2024-06-13 11:15:00', 'Test String 3', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (4, 'Emily Brown', 92.0, 'San Francisco', 28, 2, 5556667778, true, 40, 4000000000, '2024-06-14', '2024-06-14', '2024-06-14 13:30:00', 'Test String 4', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (6, 'Sophia Lee', 91.3, 'Boston', 29, 2, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\\\"k1\\\":\\\"v1\\\", \\\"k2\\\": 200}')," + + " (5, 'David Wilson', 88.9, 'Seattle', 32, 1, 9998887776, false, 50, 5000000000, '2024-06-15', '2024-06-15', '2024-06-15 15:45:00', 'Test String 5', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]');" + + sql initTable1 + sql initTableData1 + checkTableData("${tbName}", "${tbName2}", "t_datetime") + sql """ DROP TABLE IF EXISTS ${tbName} """ + + + // Test the unique model by drop a value type from t_datetimev2 + sql initTable + sql initTableData + sql """ alter table ${tbName} DROP column t_datetimev2 """ + insertSql = "insert into ${tbName} values(6, 'Sophia Lee', 91.3, 'Boston', 29, 2, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable1 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` CHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `is_ok` BOOLEAN COMMENT \"是否完成\",\n" + + " `t_int` INT COMMENT \"测试int\",\n" + + " `t_bigint` BIGINT COMMENT \"测试BIGINT\",\n" + + " `t_date` DATE COMMENT \"测试DATE\",\n" + + " `t_datev2` DATEV2 COMMENT \"测试DATEV2\",\n" + + " `t_datetimev2` DATETIMEv2 COMMENT \"用户注册时间\",\n" + + " `t_string` STRING COMMENT \"测试string\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData1 = "insert into ${tbName2} values(1, 'John Doe', 95.5, 'New York', 25, 1, 1234567890, true, 10, 1000000000, '2024-06-11', '2024-06-11', '2024-06-11 08:30:00', 'Test String 1', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (2, 'Jane Smith', 85.2, 'Los Angeles', 30, 2, 9876543210, false, 20, 2000000000, '2024-06-12', '2024-06-12', '2024-06-12 09:45:00', 'Test String 2', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (3, 'Mike Johnson', 77.8, 'Chicago', 35, 1, 1112223334, true, 30, 3000000000, '2024-06-13', '2024-06-13', '2024-06-13 11:15:00', 'Test String 3', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (4, 'Emily Brown', 92.0, 'San Francisco', 28, 2, 5556667778, true, 40, 4000000000, '2024-06-14', '2024-06-14', '2024-06-14 13:30:00', 'Test String 4', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (6, 'Sophia Lee', 91.3, 'Boston', 29, 2, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\\\"k1\\\":\\\"v1\\\", \\\"k2\\\": 200}')," + + " (5, 'David Wilson', 88.9, 'Seattle', 32, 1, 9998887776, false, 50, 5000000000, '2024-06-15', '2024-06-15', '2024-06-15 15:45:00', 'Test String 5', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]');" + + sql initTable1 + sql initTableData1 + checkTableData("${tbName}", "${tbName2}", "t_string") + sql """ DROP TABLE IF EXISTS ${tbName} """ + + + // Test the unique model by drop a value type from t_datetime + sql initTable + sql initTableData + sql """ alter table ${tbName} DROP column t_datetime """ + insertSql = "insert into ${tbName} values(6, 'Sophia Lee', 91.3, 'Boston', 29, 2, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable1 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` CHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `is_ok` BOOLEAN COMMENT \"是否完成\",\n" + + " `t_int` INT COMMENT \"测试int\",\n" + + " `t_bigint` BIGINT COMMENT \"测试BIGINT\",\n" + + " `t_date` DATE COMMENT \"测试DATE\",\n" + + " `t_datev2` DATEV2 COMMENT \"测试DATEV2\",\n" + + " `t_datetimev2` DATETIMEv2 COMMENT \"用户注册时间\",\n" + + " `t_string` STRING COMMENT \"测试string\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData1 = "insert into ${tbName2} values(1, 'John Doe', 95.5, 'New York', 25, 1, 1234567890, true, 10, 1000000000, '2024-06-11', '2024-06-11', '2024-06-11 08:30:00', 'Test String 1', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (2, 'Jane Smith', 85.2, 'Los Angeles', 30, 2, 9876543210, false, 20, 2000000000, '2024-06-12', '2024-06-12', '2024-06-12 09:45:00', 'Test String 2', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (3, 'Mike Johnson', 77.8, 'Chicago', 35, 1, 1112223334, true, 30, 3000000000, '2024-06-13', '2024-06-13', '2024-06-13 11:15:00', 'Test String 3', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (4, 'Emily Brown', 92.0, 'San Francisco', 28, 2, 5556667778, true, 40, 4000000000, '2024-06-14', '2024-06-14', '2024-06-14 13:30:00', 'Test String 4', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (6, 'Sophia Lee', 91.3, 'Boston', 29, 2, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\\\"k1\\\":\\\"v1\\\", \\\"k2\\\": 200}')," + + " (5, 'David Wilson', 88.9, 'Seattle', 32, 1, 9998887776, false, 50, 5000000000, '2024-06-15', '2024-06-15', '2024-06-15 15:45:00', 'Test String 5', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]');" + + sql initTable1 + sql initTableData1 + checkTableData("${tbName}", "${tbName2}", "t_string") + sql """ DROP TABLE IF EXISTS ${tbName} """ + + + // Test the unique model by drop a value type from CHAR + sql initTable + sql initTableData + sql """ alter table ${tbName} DROP column city """ + insertSql = "insert into ${tbName} values(6, 'Sophia Lee', 91.3, 29, 2, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable1 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `is_ok` BOOLEAN COMMENT \"是否完成\",\n" + + " `t_int` INT COMMENT \"测试int\",\n" + + " `t_bigint` BIGINT COMMENT \"测试BIGINT\",\n" + + " `t_date` DATE COMMENT \"测试DATE\",\n" + + " `t_datev2` DATEV2 COMMENT \"测试DATEV2\",\n" + + " `t_datetimev2` DATETIMEV2 COMMENT \"测试DATETIMEV2\",\n" + + " `t_datetime` DATETIME COMMENT \"用户注册时间\",\n" + + " `t_string` STRING COMMENT \"测试string\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData1 = "insert into ${tbName2} values(1, 'John Doe', 95.5, 25, 1, 1234567890, true, 10, 1000000000, '2024-06-11', '2024-06-11', '2024-06-11 08:30:00', '2024-06-11 08:30:00', 'Test String 1', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (2, 'Jane Smith', 85.2, 30, 2, 9876543210, false, 20, 2000000000, '2024-06-12', '2024-06-12', '2024-06-12 09:45:00', '2024-06-12 09:45:00', 'Test String 2', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (3, 'Mike Johnson', 77.8, 35, 1, 1112223334, true, 30, 3000000000, '2024-06-13', '2024-06-13', '2024-06-13 11:15:00', '2024-06-13 11:15:00', 'Test String 3', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (4, 'Emily Brown', 92.0, 28, 2, 5556667778, true, 40, 4000000000, '2024-06-14', '2024-06-14', '2024-06-14 13:30:00', '2024-06-14 13:30:00', 'Test String 4', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (6, 'Sophia Lee', 91.3, 29, 2, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\\\"k1\\\":\\\"v1\\\", \\\"k2\\\": 200}')," + + " (5, 'David Wilson', 88.9, 32, 1, 9998887776, false, 50, 5000000000, '2024-06-15', '2024-06-15', '2024-06-15 15:45:00', '2024-06-15 15:45:00', 'Test String 5', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]');" + + sql initTable1 + sql initTableData1 + checkTableData("${tbName}", "${tbName2}", "age") + sql """ DROP TABLE IF EXISTS ${tbName} """ + + + // Test the unique model by drop a value type from VARCHAR + sql initTable + sql initTableData + sql """ alter table ${tbName} DROP column username """ + insertSql = "insert into ${tbName} values(6, 91.3, 'Boston', 29, 2, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable1 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` CHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `is_ok` BOOLEAN COMMENT \"是否完成\",\n" + + " `t_int` INT COMMENT \"测试int\",\n" + + " `t_bigint` BIGINT COMMENT \"测试BIGINT\",\n" + + " `t_date` DATE COMMENT \"测试DATE\",\n" + + " `t_datev2` DATEV2 COMMENT \"测试DATEV2\",\n" + + " `t_datetimev2` DATETIMEV2 COMMENT \"测试DATETIMEV2\",\n" + + " `t_datetime` DATETIME COMMENT \"用户注册时间\",\n" + + " `t_string` STRING COMMENT \"测试string\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData1 = "insert into ${tbName2} values(1, 95.5, 'New York', 25, 1, 1234567890, true, 10, 1000000000, '2024-06-11', '2024-06-11', '2024-06-11 08:30:00', '2024-06-11 08:30:00', 'Test String 1', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (2, 85.2, 'Los Angeles', 30, 2, 9876543210, false, 20, 2000000000, '2024-06-12', '2024-06-12', '2024-06-12 09:45:00', '2024-06-12 09:45:00', 'Test String 2', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (3, 77.8, 'Chicago', 35, 1, 1112223334, true, 30, 3000000000, '2024-06-13', '2024-06-13', '2024-06-13 11:15:00', '2024-06-13 11:15:00', 'Test String 3', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (4, 92.0, 'San Francisco', 28, 2, 5556667778, true, 40, 4000000000, '2024-06-14', '2024-06-14', '2024-06-14 13:30:00', '2024-06-14 13:30:00', 'Test String 4', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (6, 91.3, 'Boston', 29, 2, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', {'a': 500, 'b': 200}, '{\\\"k1\\\":\\\"v1\\\", \\\"k2\\\": 200}')," + + " (5, 88.9, 'Seattle', 32, 1, 9998887776, false, 50, 5000000000, '2024-06-15', '2024-06-15', '2024-06-15 15:45:00', '2024-06-15 15:45:00', 'Test String 5', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]');" + + sql initTable1 + sql initTableData1 + checkTableData("${tbName}", "${tbName2}", "score") + sql """ DROP TABLE IF EXISTS ${tbName} """ + + + // Test the unique model by drop a value type from STRING + sql initTable + sql initTableData + sql """ alter table ${tbName} DROP column t_string """ + insertSql = "insert into ${tbName} values(6, 'Sophia Lee', 91.3, 'Boston', 29, 2, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', {'a': 500, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable1 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` CHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `is_ok` BOOLEAN COMMENT \"是否完成\",\n" + + " `t_int` INT COMMENT \"测试int\",\n" + + " `t_bigint` BIGINT COMMENT \"测试BIGINT\",\n" + + " `t_date` DATE COMMENT \"测试DATE\",\n" + + " `t_datev2` DATEV2 COMMENT \"测试DATEV2\",\n" + + " `t_datetimev2` DATETIMEV2 COMMENT \"测试DATETIMEV2\",\n" + + " `t_datetime` DATETIME COMMENT \"用户注册时间\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData1 = "insert into ${tbName2} values(1, 'John Doe', 95.5, 'New York', 25, 1, 1234567890, true, 10, 1000000000, '2024-06-11', '2024-06-11', '2024-06-11 08:30:00', '2024-06-11 08:30:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (2, 'Jane Smith', 85.2, 'Los Angeles', 30, 2, 9876543210, false, 20, 2000000000, '2024-06-12', '2024-06-12', '2024-06-12 09:45:00', '2024-06-12 09:45:00', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (3, 'Mike Johnson', 77.8, 'Chicago', 35, 1, 1112223334, true, 30, 3000000000, '2024-06-13', '2024-06-13', '2024-06-13 11:15:00', '2024-06-13 11:15:00', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (4, 'Emily Brown', 92.0, 'San Francisco', 28, 2, 5556667778, true, 40, 4000000000, '2024-06-14', '2024-06-14', '2024-06-14 13:30:00', '2024-06-14 13:30:00', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (6, 'Sophia Lee', 91.3, 'Boston', 29, 2, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', {'a': 500, 'b': 200}, '{\\\"k1\\\":\\\"v1\\\", \\\"k2\\\": 200}')," + + " (5, 'David Wilson', 88.9, 'Seattle', 32, 1, 9998887776, false, 50, 5000000000, '2024-06-15', '2024-06-15', '2024-06-15 15:45:00', '2024-06-15 15:45:00', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]');" + + sql initTable1 + sql initTableData1 + checkTableData("${tbName}", "${tbName2}", "score") + sql """ DROP TABLE IF EXISTS ${tbName} """ + + + // Test the unique model by drop a value type from Map + sql initTable + sql initTableData + sql """ alter table ${tbName} DROP column m """ + insertSql = "insert into ${tbName} values(6, 'Sophia Lee', 91.3, 'Boston', 29, 2, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable1 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` CHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `is_ok` BOOLEAN COMMENT \"是否完成\",\n" + + " `t_int` INT COMMENT \"测试int\",\n" + + " `t_bigint` BIGINT COMMENT \"测试BIGINT\",\n" + + " `t_date` DATE COMMENT \"测试DATE\",\n" + + " `t_datev2` DATEV2 COMMENT \"测试DATEV2\",\n" + + " `t_datetimev2` DATETIMEV2 COMMENT \"测试DATETIMEV2\",\n" + + " `t_datetime` DATETIME COMMENT \"用户注册时间\",\n" + + " `t_string` STRING COMMENT \"测试string\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData1 = "insert into ${tbName2} values(1, 'John Doe', 95.5, 'New York', 25, 1, 1234567890, true, 10, 1000000000, '2024-06-11', '2024-06-11', '2024-06-11 08:30:00', '2024-06-11 08:30:00', 'Test String 1', '[\"abc\", \"def\"]')," + + " (2, 'Jane Smith', 85.2, 'Los Angeles', 30, 2, 9876543210, false, 20, 2000000000, '2024-06-12', '2024-06-12', '2024-06-12 09:45:00', '2024-06-12 09:45:00', 'Test String 2', '[\"abc\", \"def\"]')," + + " (3, 'Mike Johnson', 77.8, 'Chicago', 35, 1, 1112223334, true, 30, 3000000000, '2024-06-13', '2024-06-13', '2024-06-13 11:15:00', '2024-06-13 11:15:00', 'Test String 3', '[\"abc\", \"def\"]')," + + " (4, 'Emily Brown', 92.0, 'San Francisco', 28, 2, 5556667778, true, 40, 4000000000, '2024-06-14', '2024-06-14', '2024-06-14 13:30:00', '2024-06-14 13:30:00', 'Test String 4', '[\"abc\", \"def\"]')," + + " (6, 'Sophia Lee', 91.3, 'Boston', 29, 2, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', '{\\\"k1\\\":\\\"v1\\\", \\\"k2\\\": 200}')," + + " (5, 'David Wilson', 88.9, 'Seattle', 32, 1, 9998887776, false, 50, 5000000000, '2024-06-15', '2024-06-15', '2024-06-15 15:45:00', '2024-06-15 15:45:00', 'Test String 5', '[\"abc\", \"def\"]');" + + sql initTable1 + sql initTableData1 + checkTableData("${tbName}", "${tbName2}", "score") + sql """ DROP TABLE IF EXISTS ${tbName} """ + + + // Test the unique model by drop a value type from JSON + sql initTable + sql initTableData + sql """ alter table ${tbName} DROP column j """ + insertSql = "insert into ${tbName} values(6, 'Sophia Lee', 91.3, 'Boston', 29, 2, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', {'a': 100, 'b': 200}); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable1 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` CHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `is_ok` BOOLEAN COMMENT \"是否完成\",\n" + + " `t_int` INT COMMENT \"测试int\",\n" + + " `t_bigint` BIGINT COMMENT \"测试BIGINT\",\n" + + " `t_date` DATE COMMENT \"测试DATE\",\n" + + " `t_datev2` DATEV2 COMMENT \"测试DATEV2\",\n" + + " `t_datetimev2` DATETIMEV2 COMMENT \"测试DATETIMEV2\",\n" + + " `t_datetime` DATETIME COMMENT \"用户注册时间\",\n" + + " `t_string` STRING COMMENT \"测试string\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " )\n" + + " UNIQUE KEY(`user_id`)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData1 = "insert into ${tbName2} values(1, 'John Doe', 95.5, 'New York', 25, 1, 1234567890, true, 10, 1000000000, '2024-06-11', '2024-06-11', '2024-06-11 08:30:00', '2024-06-11 08:30:00', 'Test String 1', {'a': 100, 'b': 200})," + + " (2, 'Jane Smith', 85.2, 'Los Angeles', 30, 2, 9876543210, false, 20, 2000000000, '2024-06-12', '2024-06-12', '2024-06-12 09:45:00', '2024-06-12 09:45:00', 'Test String 2', {'a': 100, 'b': 200})," + + " (3, 'Mike Johnson', 77.8, 'Chicago', 35, 1, 1112223334, true, 30, 3000000000, '2024-06-13', '2024-06-13', '2024-06-13 11:15:00', '2024-06-13 11:15:00', 'Test String 3', {'a': 100, 'b': 200})," + + " (4, 'Emily Brown', 92.0, 'San Francisco', 28, 2, 5556667778, true, 40, 4000000000, '2024-06-14', '2024-06-14', '2024-06-14 13:30:00', '2024-06-14 13:30:00', 'Test String 4', {'a': 100, 'b': 200})," + + " (6, 'Sophia Lee', 91.3, 'Boston', 29, 2, 7778889990, true, 60, 6000000000, '2024-06-16', '2024-06-16', '2024-06-16 17:00:00', '2024-06-16 17:00:00', 'Test String 6', {'a': 100, 'b': 200})," + + " (5, 'David Wilson', 88.9, 'Seattle', 32, 1, 9998887776, false, 50, 5000000000, '2024-06-15', '2024-06-15', '2024-06-15 15:45:00', '2024-06-15 15:45:00', 'Test String 5', {'a': 100, 'b': 200});" + + sql initTable1 + sql initTableData1 + checkTableData("${tbName}", "${tbName2}", "user_id") + sql """ DROP TABLE IF EXISTS ${tbName} """ + + + initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `t_decimal` DECIMAL(38,10) COMMENT \"测试decimal\",\n" + + " `t_float` FLOAT COMMENT \"测试float\",\n" + + " `t_double` DOUBLE COMMENT \"测试double\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData = "insert into ${tbName} values(1, 123.4567890123, 123.45, 1234.5678901234)," + + " (2, 234.5678901234, 234.56, 2345.6789012345)," + + " (3, 345.6789012345, 345.67, 3456.7890123456)," + + " (4, 456.7890123456, 456.78, 4567.8901234567)," + + " (5, 567.8901234567, 567.89, 5678.9012345678);" + + + // Test the unique model by drop a value type from DECIMAL + sql initTable + sql initTableData + sql """ alter table ${tbName} DROP column t_decimal """ + insertSql = "insert into ${tbName} values(6, 678.90, 6789.0123456789); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable1 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `t_float` FLOAT COMMENT \"测试float\",\n" + + " `t_double` DOUBLE COMMENT \"测试double\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData1 = "insert into ${tbName2} values(1, 123.45, 1234.5678901234)," + + " (2, 234.56, 2345.6789012345)," + + " (3, 345.67, 3456.7890123456)," + + " (4, 456.78, 4567.8901234567)," + + " (6, 678.90, 6789.0123456789)," + + " (5, 567.89, 5678.9012345678);" + + sql initTable1 + sql initTableData1 + checkTableData("${tbName}", "${tbName2}", "t_float") + sql """ DROP TABLE IF EXISTS ${tbName} """ + + + // Test the unique model by drop a value type from FLOAT + sql initTable + sql initTableData + sql """ alter table ${tbName} DROP column t_float """ + insertSql = "insert into ${tbName} values(6, 678.9012345678, 6789.0123456789); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable1 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `t_decimal` DECIMAL(38,10) COMMENT \"测试decimal\",\n" + + " `t_double` DOUBLE COMMENT \"测试double\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData1 = "insert into ${tbName2} values(1, 123.4567890123, 1234.5678901234)," + + " (2, 234.5678901234, 2345.6789012345)," + + " (3, 345.6789012345, 3456.7890123456)," + + " (4, 456.7890123456, 4567.8901234567)," + + " (6, 678.9012345678, 6789.0123456789)," + + " (5, 567.8901234567, 5678.9012345678);" + + sql initTable1 + sql initTableData1 + checkTableData("${tbName}", "${tbName2}", "t_double") + sql """ DROP TABLE IF EXISTS ${tbName} """ + + + // Test the unique model by drop a value type from DOUBLE + sql initTable + sql initTableData + sql """ alter table ${tbName} DROP column t_double """ + insertSql = "insert into ${tbName} values(6, 678.9012345678, 678.90); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable1 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `t_decimal` DECIMAL(38,10) COMMENT \"测试decimal\",\n" + + " `t_float` FLOAT COMMENT \"测试float\",\n" + + " )\n" + + " UNIQUE KEY(`user_id`)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData1 = "insert into ${tbName2} values(1, 123.4567890123, 123.45)," + + " (2, 234.5678901234, 234.56)," + + " (3, 345.6789012345, 345.67)," + + " (4, 456.7890123456, 456.78)," + + " (6, 678.9012345678, 678.90)," + + " (5, 567.8901234567, 567.89);" + + sql initTable1 + sql initTableData1 + checkTableData("${tbName}", "${tbName2}", "user_id") + sql """ DROP TABLE IF EXISTS ${tbName} """ + + +} diff --git a/regression-test/suites/schema_change_p0/unique_ck/test_unique_schema_value_modify.groovy b/regression-test/suites/schema_change_p0/unique_ck/test_unique_schema_value_modify.groovy new file mode 100644 index 00000000000000..c1d7df20b09df4 --- /dev/null +++ b/regression-test/suites/schema_change_p0/unique_ck/test_unique_schema_value_modify.groovy @@ -0,0 +1,1928 @@ +// 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_unique_schema_value_modify","p0") { + def tbName = "unique_model_value_change0" + def tbName2 = "unique_model_value_change_0" + def on_write = true + println String.format("current enable_unique_key_merge_on_write is : %s ",on_write) + //Test the unique model by adding a value column + sql """ DROP TABLE IF EXISTS ${tbName} """ + def getTableStatusSql = " SHOW ALTER TABLE COLUMN WHERE IndexName='${tbName}' ORDER BY createtime DESC LIMIT 1 " + def errorMessage="" + /** + * Test the unique model by modify a value type + */ + def initTable2 = "" + def initTableData2 = "" + sql """ DROP TABLE IF EXISTS ${tbName} """ + def initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `is_teacher` BOOLEAN COMMENT \"是否是老师\",\n" + + " `city` VARCHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(age, user_id)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + def initTableData = "insert into ${tbName} values(123456789, 'Alice', 0, 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00')," + + " (234567890, 'Bob', 0, 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 12:00:00')," + + " (345678901, 'Carol', 1, 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 14:00:00')," + + " (456789012, 'Dave', 0, 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 16:00:00')," + + " (567890123, 'Eve', 0, 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 18:00:00')," + + " (678901234, 'Frank', 1, 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 20:00:00')," + + " (789012345, 'Grace', 0, 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 22:00:00');" + def insertSql = "" + //TODO Test the unique model by modify a value type from BOOLEAN to TINYINT + errorMessage="errCode = 2, detailMessage = Can not change BOOLEAN to TINYINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column is_teacher TINYINT DEFAULT "0" """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true,"${tbName}") + },errorMessage) + + + //TODO Test the unique model by modify a value type from BOOLEAN to SMALLINT + errorMessage="errCode = 2, detailMessage = Can not change BOOLEAN to SMALLINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column is_teacher SMALLINT DEFAULT "0" """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true,"${tbName}") + },errorMessage) + + + //TODO Test the unique model by modify a value type from BOOLEAN to INT + errorMessage="errCode = 2, detailMessage = Can not change BOOLEAN to INT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column is_teacher INT DEFAULT "0" """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true,"${tbName}") + },errorMessage) + + + + //TODO Test the unique model by modify a value type from BOOLEAN to BIGINT + errorMessage="errCode = 2, detailMessage = Can not change BOOLEAN to BIGINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column is_teacher BIGINT DEFAULT "0" """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true,"${tbName}") + },errorMessage) + + + + //TODO Test the unique model by modify a value type from BOOLEAN to FLOAT + errorMessage="errCode = 2, detailMessage = Can not change BOOLEAN to FLOAT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column is_teacher FLOAT DEFAULT "0" """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.0, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true,"${tbName}") + },errorMessage) + + + //TODO Test the unique model by modify a value type from BOOLEAN to DOUBLE + errorMessage="errCode = 2, detailMessage = Can not change BOOLEAN to DOUBLE" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column is_teacher DOUBLE DEFAULT "0" """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.0, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true,"${tbName}") + },errorMessage) + + + //TODO Test the unique model by modify a value type from BOOLEAN to DECIMAL + errorMessage="errCode = 2, detailMessage = Can not change BOOLEAN to DECIMAL32" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column is_teacher DECIMAL DEFAULT "0" """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.0, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true,"${tbName}") + },errorMessage) + + + //TODO Test the unique model by modify a value type from BOOLEAN to CHAR + errorMessage="errCode = 2, detailMessage = Can not change BOOLEAN to CHAR" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column is_teacher CHAR DEFAULT "0" """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', '1', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true,"${tbName}") + },errorMessage) + + + //TODO Test the unique model by modify a value type from BOOLEAN to STRING + errorMessage="errCode = 2, detailMessage = Can not change BOOLEAN to STRING" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column is_teacher STRING DEFAULT "0" """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', '1', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true,"${tbName}") + },errorMessage) + + + //TODO Test the unique model by modify a value type from BOOLEAN to VARCHAR + errorMessage="errCode = 2, detailMessage = Can not change BOOLEAN to VARCHAR" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column is_teacher VARCHAR(32) DEFAULT "0" """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', '1', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true,"${tbName}") + },errorMessage) + + + + + /** + * Test the unique model by modify a value type from TINYINT to other type + */ + sql """ DROP TABLE IF EXISTS ${tbName} """ + initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `is_student` TINYINT COMMENT \"是否是学生\",\n" + + " `city` VARCHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(phone, age, user_id)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData = "insert into ${tbName} values(123456789, 'Alice', 1, 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00')," + + " (234567890, 'Bob', 1, 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 12:00:00')," + + " (345678901, 'Carol', 1, 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 14:00:00')," + + " (456789012, 'Dave', 1, 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 16:00:00')," + + " (567890123, 'Eve', 0, 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 18:00:00')," + + " (678901234, 'Frank', 0, 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 20:00:00')," + + " (789012345, 'Grace', 1, 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 22:00:00');" + + //TODO Test the unique model by modify a value type from TINYINT to BOOLEAN + errorMessage="errCode = 2, detailMessage = Can not change TINYINT to BOOLEAN" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column is_student BOOLEAN DEFAULT "true" """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', false, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true,"${tbName}") + },errorMessage) + + + + + //Test the unique model by modify a value type from TINYINT to SMALLINT + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column is_student SMALLINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false,"${tbName}") + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable2 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `is_student` SMALLINT COMMENT \"是否是学生\",\n" + + " `city` VARCHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(sex, user_id, phone)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData2 = "insert into ${tbName2} values(123456789, 'Alice', 1, 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00')," + + " (234567890, 'Bob', 1, 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 12:00:00')," + + " (345678901, 'Carol', 1, 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 14:00:00')," + + " (456789012, 'Dave', 1, 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 16:00:00')," + + " (567890123, 'Eve', 0, 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 18:00:00')," + + " (678901234, 'Frank', 0, 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 20:00:00')," + + " (789012345, 'Grace', 1, 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 22:00:00')," + + " (993456689, 'Alice', 1, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00');" + sql initTable2 + sql initTableData2 + checkTableData("${tbName}","${tbName2}","is_student") + + //Test the unique model by modify a value type from TINYINT to INT + sql """ DROP TABLE IF EXISTS ${tbName} """ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column is_student INT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true,"${tbName}") + + + //Test the unique model by modify a value type from TINYINT to BIGINT + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column is_student BIGINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true,"${tbName}") + + //Test the unique model by modify a value type from TINYINT to LARGEINT + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column is_student LARGEINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true,"${tbName}") + + + //Test the unique model by modify a value type from TINYINT to FLOAT + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column is_student FLOAT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.2, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true,"${tbName}") + + //Test the unique model by modify a value type from TINYINT to DOUBLE + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column is_student DOUBLE """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true,"${tbName}") + + + //TODO Test the unique model by modify a value type from TINYINT to DECIMAL32 + errorMessage="errCode = 2, detailMessage = Can not change TINYINT to DECIMAL32" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column is_student DECIMAL """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true,"${tbName}") + + },errorMessage) + + //TODO Test the unique model by modify a value type from TINYINT to CHAR + errorMessage="errCode = 2, detailMessage = Can not change TINYINT to CHAR" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column is_student CHAR(15) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true,"${tbName}") + },errorMessage) + + + + + //Test the unique model by modify a value type from TINYINT to VARCHAR + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column is_student VARCHAR(100) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true,"${tbName}") + + + //Test the unique model by modify a value type from TINYINT to STRING + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column is_student STRING """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true,"${tbName}") + + + /** + * Test the unique model by modify a value type from SMALLINT to other type + */ + sql """ DROP TABLE IF EXISTS ${tbName} """ + initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `car_number` SMALLINT COMMENT \"市民卡\",\n" + + " `city` VARCHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(age, sex, phone)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData = "insert into ${tbName} values(123456789, 'Alice', 13243, 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00')," + + " (234567890, 'Bob', 13445, 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 12:00:00')," + + " (345678901, 'Carol', 15768, 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 14:00:00')," + + " (456789012, 'Dave', 14243, 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 16:00:00')," + + " (567890123, 'Eve', 10768, 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 18:00:00')," + + " (678901234, 'Frank', 14325, 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 20:00:00')," + + " (789012345, 'Grace', 15686, 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 22:00:00');" + + //TODO Test the unique model by modify a value type from SMALLINT to BOOLEAN + errorMessage = "errCode = 2, detailMessage = Can not change SMALLINT to BOOLEAN" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column car_number BOOLEAN """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', false, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + // TODO Test the unique model by modify a value type from SMALLINT to TINYINT + errorMessage = "errCode = 2, detailMessage = Can not change SMALLINT to TINYINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column car_number TINYINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 2, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from SMALLINT to INT + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column car_number INT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 3, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + + //Test the unique model by modify a value type from SMALLINT to BIGINT + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column car_number BIGINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 4, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + //Test the unique model by modify a value type from SMALLINT to LARGEINT + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column car_number LARGEINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 5, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column car_number FLOAT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.2, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column car_number DOUBLE """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + + //TODO Test the unique model by modify a value type from SMALLINT to DECIMAL + errorMessage = "errCode = 2, detailMessage = Can not change SMALLINT to DECIMAL32" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column car_number DECIMAL """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from SMALLINT to CHAR + errorMessage = "errCode = 2, detailMessage = Can not change SMALLINT to CHAR" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column car_number CHAR(15) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from SMALLINT to VARCHAR + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column car_number VARCHAR(100) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + + //Test the unique model by modify a value type from SMALLINT to STRING + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column car_number STRING """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + + + /** + * Test the unique model by modify a value type from INT to other type + */ + sql """ DROP TABLE IF EXISTS ${tbName} """ + initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `sn_number` INT COMMENT \"sn卡\",\n" + + " `city` VARCHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(address, register_time)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData = "insert into ${tbName} values(123456789, 'Alice', 2147483641, 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00')," + + " (234567890, 'Bob', 214748364, 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 12:00:00')," + + " (345678901, 'Carol', 2147483441, 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 14:00:00')," + + " (456789012, 'Dave', 2147483141, 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 16:00:00')," + + " (567890123, 'Eve', 2127483141, 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 18:00:00')," + + " (678901234, 'Frank', 2124483141, 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 20:00:00')," + + " (789012345, 'Grace', 2123483141, 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 22:00:00');" + + //TODO Test the unique model by modify a value type from INT to BOOLEAN + errorMessage = "errCode = 2, detailMessage = Can not change INT to BOOLEAN" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column sn_number BOOLEAN """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', false, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + // TODO Test the unique model by modify a value type from INT to TINYINT + errorMessage = "errCode = 2, detailMessage = Can not change INT to TINYINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column sn_number TINYINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 2, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from INT to SMALLINT + errorMessage = "errCode = 2, detailMessage = Can not change INT to SMALLINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column sn_number INT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 3, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from INT to BIGINT + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column sn_number BIGINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 4, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + //Test the unique model by modify a value type from INT to LARGEINT + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column sn_number LARGEINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 5, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + //Test the unique model by modify a value type from INT to FLOAT + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column sn_number FLOAT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.2, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + //Test the unique model by modify a value type from INT to DOUBLE + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column sn_number DOUBLE """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + + //TODO Test the unique model by modify a value type from INT to DECIMAL + errorMessage = "errCode = 2, detailMessage = Can not change INT to DECIMAL128" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column sn_number DECIMAL(38,0) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from INT to CHAR + errorMessage = "errCode = 2, detailMessage = Can not change INT to CHAR" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column sn_number CHAR(15) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from INT to VARCHAR + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column sn_number VARCHAR(100) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + //Test the unique model by modify a value type from INT to VARCHAR + errorMessage="errCode = 2, detailMessage = Can not change from wider type int to narrower type varchar(2)" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column sn_number VARCHAR(2) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + },errorMessage) + + //Test the unique model by modify a value type from INT to STRING + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column sn_number STRING """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + + /** + * Test the unique model by modify a value type from BIGINT to other type + */ + sql """ DROP TABLE IF EXISTS ${tbName} """ + initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `fan_number` BIGINT COMMENT \"fan序列号\",\n" + + " `city` VARCHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(age, phone, user_id)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData = "insert into ${tbName} values(123456789, 'Alice', 21474832641, 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00')," + + " (234567890, 'Bob', 21474348364, 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 12:00:00')," + + " (345678901, 'Carol', 214742383441, 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 14:00:00')," + + " (456789012, 'Dave', 21474283141, 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 16:00:00')," + + " (567890123, 'Eve', 21274863141, 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 18:00:00')," + + " (678901234, 'Frank', 21244883141, 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 20:00:00')," + + " (789012345, 'Grace', 21234683141, 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 22:00:00');" + + //TODO Test the unique model by modify a value type from BIGINT to BOOLEAN + errorMessage = "errCode = 2, detailMessage = Can not change BIGINT to BOOLEAN" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column fan_number BOOLEAN """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', false, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + // TODO Test the unique model by modify a value type from BIGINT to TINYINT + errorMessage = "errCode = 2, detailMessage = Can not change BIGINT to TINYINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column fan_number TINYINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 2, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from BIGINT to SMALLINT + errorMessage = "errCode = 2, detailMessage = Can not change BIGINT to SMALLINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column fan_number SMALLINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 3, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from BIGINT to INT + errorMessage = "errCode = 2, detailMessage = Can not change BIGINT to INT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column fan_number INT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 4, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from BIGINT to LARGEINT + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column fan_number LARGEINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 5, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + //Test the unique model by modify a value type from BIGINT to FLOAT + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column fan_number FLOAT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.2, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + //Test the unique model by modify a value type from BIGINT to DOUBLE + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column fan_number DOUBLE """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + + //TODO Test the unique model by modify a value type from BIGINT to DECIMAL + errorMessage = "errCode = 2, detailMessage = Can not change BIGINT to DECIMAL128" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column fan_number DECIMAL(38,0) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from BIGINT to CHAR + errorMessage = "errCode = 2, detailMessage = Can not change BIGINT to CHAR" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column fan_number CHAR(15) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from BIGINT to VARCHAR + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column fan_number VARCHAR(100) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + + //Test the unique model by modify a value type from BIGINT to VARCHAR(2) + errorMessage="errCode = 2, detailMessage = Can not change from wider type bigint to narrower type varchar(2)" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column fan_number VARCHAR(2) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + },errorMessage) + + + //Test the unique model by modify a value type from BIGINT to STRING + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column fan_number STRING """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + /** + * Test the unique model by modify a value type from LARGEINT to other type + */ + sql """ DROP TABLE IF EXISTS ${tbName} """ + initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `item_number` LARGEINT COMMENT \"item序列号\",\n" + + " `city` VARCHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(sex, age, user_id)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData = "insert into ${tbName} values(123456789, 'Alice', 21474832641, 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00')," + + " (234567890, 'Bob', 21474348364, 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 12:00:00')," + + " (345678901, 'Carol', 214742383441, 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 14:00:00')," + + " (456789012, 'Dave', 21474283141, 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 16:00:00')," + + " (567890123, 'Eve', 21274863141, 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 18:00:00')," + + " (678901234, 'Frank', 21244883141, 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 20:00:00')," + + " (789012345, 'Grace', 21234683141, 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 22:00:00');" + + //TODO Test the unique model by modify a value type from LARGEINT to BOOLEAN + errorMessage = "errCode = 2, detailMessage = Can not change LARGEINT to BOOLEAN" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column item_number BOOLEAN """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', false, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + // TODO Test the unique model by modify a value type from LARGEINT to TINYINT + errorMessage = "errCode = 2, detailMessage = Can not change LARGEINT to TINYINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column item_number TINYINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 2, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from LARGEINT to SMALLINT + errorMessage = "errCode = 2, detailMessage = Can not change LARGEINT to SMALLINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column item_number SMALLINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 3, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from LARGEINT to INT + errorMessage = "errCode = 2, detailMessage = Can not change LARGEINT to INT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column item_number INT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 4, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from LARGEINT to BIGINT + errorMessage="errCode = 2, detailMessage = Can not change LARGEINT to BIGINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column item_number BIGINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 5, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + },errorMessage) + + + //Test the unique model by modify a value type from LARGEINT to FLOAT + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column item_number FLOAT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.2, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + //Test the unique model by modify a value type from LARGEINT to DOUBLE + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column item_number DOUBLE """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + + //TODO Test the unique model by modify a value type from LARGEINT to DECIMAL + errorMessage = "errCode = 2, detailMessage = Can not change LARGEINT to DECIMAL128" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column item_number DECIMAL(38,0) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from LARGEINT to CHAR + errorMessage = "errCode = 2, detailMessage = Can not change LARGEINT to CHAR" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column item_number CHAR(15) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from LARGEINT to VARCHAR + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column item_number VARCHAR(100) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + + //Test the unique model by modify a value type from LARGEINT to VARCHAR(2) + errorMessage="errCode = 2, detailMessage = Can not change from wider type largeint to narrower type varchar(2)" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column item_number VARCHAR(2) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + },errorMessage) + + + //Test the unique model by modify a value type from LARGEINT to STRING + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column item_number STRING """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + + /** + * Test the unique model by modify a value type from FLOAT to other type + */ + sql """ DROP TABLE IF EXISTS ${tbName} """ + initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` FLOAT COMMENT \"分数\",\n" + + " `city` VARCHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(age, user_id, sex)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData = "insert into ${tbName} values(123456789, 'Alice', 1.8, 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (234567890, 'Bob', 1.89, 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 12:00:00', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (345678901, 'Carol', 2.6, 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 14:00:00', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (456789012, 'Dave', 3.9, 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 16:00:00', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (567890123, 'Eve', 4.2, 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 18:00:00', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]')," + + " (678901234, 'Frank', 2.5, 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 20:00:00', {'a': 600, 'b': 200}, '[\"abc\", \"def\"]')," + + " (789012345, 'Grace', 2.1, 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 22:00:00', {'a': 700, 'b': 200}, '[\"abc\", \"def\"]');" + + //TODO Test the unique model by modify a value type from FLOAT to BOOLEAN + errorMessage = "errCode = 2, detailMessage = Can not change FLOAT to BOOLEAN" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score BOOLEAN """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', false, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + // TODO Test the unique model by modify a value type from FLOAT to TINYINT + errorMessage = "errCode = 2, detailMessage = Can not change FLOAT to TINYINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score TINYINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 2, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from FLOAT to SMALLINT + errorMessage = "errCode = 2, detailMessage = Can not change FLOAT to SMALLINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score SMALLINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 3, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from FLOAT to INT + errorMessage = "errCode = 2, detailMessage = Can not change FLOAT to INT" + expectException({ + sql initTable + sql initTableData + + sql """ alter table ${tbName} MODIFY column score INT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 4, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from FLOAT to BIGINT + errorMessage = "errCode = 2, detailMessage = Can not change FLOAT to BIGINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score BIGINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 545645, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from FLOAT to LARGEINT + errorMessage = "errCode = 2, detailMessage = Can not change FLOAT to LARGEINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score LARGEINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 156546, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from FLOAT to DOUBLE + errorMessage = "errCode = 2, detailMessage = Can not change FLOAT to DOUBLE" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score DOUBLE """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //TODO Test the unique model by modify a value type from FLOAT to DECIMAL + errorMessage = "errCode = 2, detailMessage = Can not change FLOAT to DECIMAL128" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score DECIMAL(38,0) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from FLOAT to DATE + errorMessage = "errCode = 2, detailMessage = Can not change FLOAT to DATEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score DATE """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', '2003-12-31', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from FLOAT to DATE + errorMessage = "errCode = 2, detailMessage = Can not change FLOAT to DATEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score DATEV2 """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', '2003-12-31', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from FLOAT to DATETIME + errorMessage = "errCode = 2, detailMessage = Can not change FLOAT to DATETIMEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score DATETIME """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', '2003-12-31 20:12:12', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from FLOAT to DATETIME + errorMessage = "errCode = 2, detailMessage = Can not change FLOAT to DATETIMEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score DATETIMEV2 """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', '2003-12-31 20:12:12', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from FLOAT to CHAR + errorMessage = "errCode = 2, detailMessage = Can not change FLOAT to CHAR" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score CHAR(15) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //TODO Test the unique model by modify a value type from FLOAT to VARCHAR + //Test the unique model by modify a value type from FLOAT to VARCHAR + errorMessage = "errCode = 2, detailMessage = Can not change aggregation type" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score VARCHAR(100) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //TODO Test the unique model by modify a value type from FLOAT to STRING + //Test the unique model by modify a value type from FLOAT to STRING + errorMessage = "errCode = 2, detailMessage = Can not change aggregation type" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score STRING """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //TODO Test the unique model by modify a value type from FLOAT to map + //Test the unique model by modify a value type from FLOAT to STRING + errorMessage = "errCode = 2, detailMessage = Can not change FLOAT to MAP" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score Map """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', {'a': 100, 'b': 200}, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from FLOAT to JSON + errorMessage = "errCode = 2, detailMessage = Can not change FLOAT to JSON" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score JSON """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', '{'a': 100, 'b': 200}', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + + /** + * Test the unique model by modify a value type from DOUBLE to other type + */ + sql """ DROP TABLE IF EXISTS ${tbName} """ + initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DOUBLE COMMENT \"分数\",\n" + + " `city` VARCHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(sex, age, user_id)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData = "insert into ${tbName} values(123456789, 'Alice', 1.8, 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (234567890, 'Bob', 1.89, 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 12:00:00', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (345678901, 'Carol', 2.6, 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 14:00:00', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (456789012, 'Dave', 3.9, 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 16:00:00', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (567890123, 'Eve', 4.2, 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 18:00:00', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]')," + + " (678901234, 'Frank', 2.5, 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 20:00:00', {'a': 600, 'b': 200}, '[\"abc\", \"def\"]')," + + " (789012345, 'Grace', 2.1, 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 22:00:00', {'a': 700, 'b': 200}, '[\"abc\", \"def\"]');" + + //TODO Test the unique model by modify a value type from DOUBLE to BOOLEAN + errorMessage = "errCode = 2, detailMessage = Can not change DOUBLE to BOOLEAN" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score BOOLEAN """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', false, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + // TODO Test the unique model by modify a value type from DOUBLE to TINYINT + errorMessage = "errCode = 2, detailMessage = Can not change DOUBLE to TINYINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score TINYINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 2, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DOUBLE to SMALLINT + errorMessage = "errCode = 2, detailMessage = Can not change DOUBLE to SMALLINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score SMALLINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 3, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from DOUBLE to INT + errorMessage = "errCode = 2, detailMessage = Can not change DOUBLE to INT" + expectException({ + sql initTable + sql initTableData + + sql """ alter table ${tbName} MODIFY column score INT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 4, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DOUBLE to BIGINT + errorMessage = "errCode = 2, detailMessage = Can not change DOUBLE to BIGINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score BIGINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 545645, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from DOUBLE to LARGEINT + errorMessage = "errCode = 2, detailMessage = Can not change DOUBLE to LARGEINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score LARGEINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 156546, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DOUBLE to FLOAT + errorMessage = "errCode = 2, detailMessage = Can not change DOUBLE to FLOAT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score FLOAT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DOUBLE to DECIMAL + errorMessage = "errCode = 2, detailMessage = Can not change DOUBLE to DECIMAL128" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score DECIMAL(38,0) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DOUBLE to DATE + errorMessage = "errCode = 2, detailMessage = Can not change DOUBLE to DATEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score DATE """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', '2003-12-31', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from DOUBLE to DATE + errorMessage = "errCode = 2, detailMessage = Can not change DOUBLE to DATEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score DATEV2 """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', '2003-12-31', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DOUBLE to DATETIME + errorMessage = "errCode = 2, detailMessage = Can not change DOUBLE to DATETIMEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score DATETIME """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', '2003-12-31 20:12:12', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from DOUBLE to DATETIME + errorMessage = "errCode = 2, detailMessage = Can not change DOUBLE to DATETIMEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score DATETIMEV2 """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', '2003-12-31 20:12:12', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from DOUBLE to CHAR + errorMessage = "errCode = 2, detailMessage = Can not change DOUBLE to CHAR" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score CHAR(15) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //TODO Test the unique model by modify a value type from DOUBLE to VARCHAR + //Test the unique model by modify a value type from DOUBLE to VARCHAR + errorMessage = "errCode = 2, detailMessage = Can not change aggregation type" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score VARCHAR(100) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //TODO Test the unique model by modify a value type from DOUBLE to STRING + //Test the unique model by modify a value type from DOUBLE to STRING + errorMessage = "errCode = 2, detailMessage = Can not change aggregation type" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score STRING """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DOUBLE to map + //Test the unique model by modify a value type from DOUBLE to STRING + errorMessage = "errCode = 2, detailMessage = Can not change DOUBLE to MAP" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score Map """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', {'a': 100, 'b': 200}, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DOUBLE to JSON + errorMessage = "errCode = 2, detailMessage = Can not change DOUBLE to JSON" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score JSON """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', '{'a': 100, 'b': 200}', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + /** + * Test the unique model by modify a value type from DECIMAL to other type + */ + sql """ DROP TABLE IF EXISTS ${tbName} """ + initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` VARCHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(phone, user_id, username)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData = "insert into ${tbName} values(123456789, 'Alice', 1.83, 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (234567890, 'Bob', 1.89, 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 12:00:00', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (345678901, 'Carol', 2.6689, 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 14:00:00', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (456789012, 'Dave', 3.9456, 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 16:00:00', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (567890123, 'Eve', 4.223, 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 18:00:00', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]')," + + " (678901234, 'Frank', 2.5454, 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 20:00:00', {'a': 600, 'b': 200}, '[\"abc\", \"def\"]')," + + " (789012345, 'Grace', 2.19656, 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 22:00:00', {'a': 700, 'b': 200}, '[\"abc\", \"def\"]');" + + //TODO Test the unique model by modify a value type from DECIMAL128 to BOOLEAN + errorMessage = "errCode = 2, detailMessage = Can not change DECIMAL128 to BOOLEAN" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score BOOLEAN """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', false, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + // TODO Test the unique model by modify a value type from DECIMAL128 to TINYINT + errorMessage = "errCode = 2, detailMessage = Can not change DECIMAL128 to TINYINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score TINYINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 2, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DECIMAL128 to SMALLINT + errorMessage = "errCode = 2, detailMessage = Can not change DECIMAL128 to SMALLINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score SMALLINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 3, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from DECIMAL128 to INT + errorMessage = "errCode = 2, detailMessage = Can not change DECIMAL128 to INT" + expectException({ + sql initTable + sql initTableData + + sql """ alter table ${tbName} MODIFY column score INT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 4, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DECIMAL128 to BIGINT + errorMessage = "errCode = 2, detailMessage = Can not change DECIMAL128 to BIGINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score BIGINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 545645, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from DECIMAL128 to LARGEINT + errorMessage = "errCode = 2, detailMessage = Can not change DECIMAL128 to LARGEINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score LARGEINT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 156546, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DECIMAL128 to FLOAT + errorMessage = "errCode = 2, detailMessage = Can not change DECIMAL128 to FLOAT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score FLOAT """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DECIMAL128 to DECIMAL + errorMessage = "errCode = 2, detailMessage = Can not change DECIMAL128 to DECIMAL128" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score DECIMAL(38,0) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DECIMAL128 to DATE + errorMessage = "errCode = 2, detailMessage = Can not change DECIMAL128 to DATEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score DATE """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', '2003-12-31', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from DECIMAL128 to DATE + errorMessage = "errCode = 2, detailMessage = Can not change DECIMAL128 to DATEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score DATEV2 """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', '2003-12-31', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DECIMAL128 to DATETIME + errorMessage = "errCode = 2, detailMessage = Can not change DECIMAL128 to DATETIMEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score DATETIME """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', '2003-12-31 20:12:12', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from DECIMAL128 to DATETIME + errorMessage = "errCode = 2, detailMessage = Can not change DECIMAL128 to DATETIMEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score DATETIMEV2 """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', '2003-12-31 20:12:12', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from DECIMAL128 to CHAR + errorMessage = "errCode = 2, detailMessage = Can not change DECIMAL128 to CHAR" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score CHAR(15) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //TODO Test the unique model by modify a value type from DECIMAL128 to VARCHAR + //Test the unique model by modify a value type from DECIMAL128 to VARCHAR + errorMessage = "errCode = 2, detailMessage = Can not change aggregation type" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score VARCHAR(100) """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //TODO Test the unique model by modify a value type from DECIMAL128 to STRING + //Test the unique model by modify a value type from DECIMAL128 to STRING + errorMessage = "errCode = 2, detailMessage = Can not change aggregation type" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score STRING """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', 'asd', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DECIMAL128 to map + //Test the unique model by modify a value type from DECIMAL128 to STRING + errorMessage = "errCode = 2, detailMessage = Can not change DECIMAL128 to MAP" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score Map """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', {'a': 100, 'b': 200}, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DECIMAL128 to JSON + errorMessage = "errCode = 2, detailMessage = Can not change DECIMAL128 to JSON" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column score JSON """ + insertSql = "insert into ${tbName} values(993456689, 'Alice', '{'a': 100, 'b': 200}', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + +} diff --git a/regression-test/suites/schema_change_p0/unique_ck/test_unique_schema_value_modify1.groovy b/regression-test/suites/schema_change_p0/unique_ck/test_unique_schema_value_modify1.groovy new file mode 100644 index 00000000000000..c9d30bff727b6c --- /dev/null +++ b/regression-test/suites/schema_change_p0/unique_ck/test_unique_schema_value_modify1.groovy @@ -0,0 +1,1073 @@ +// 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_unique_schema_value_modify1","p0") { + def tbName = "test_unique_model_value_change1" + def tbName2 = "test_unique_model_value_change_1" + def on_write = true + println String.format("current enable_unique_key_merge_on_write is : %s ",on_write) + //Test the unique model by adding a value column + sql """ DROP TABLE IF EXISTS ${tbName} """ + def initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `city` VARCHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(phone, user_id, username)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + def initTableData = "insert into ${tbName} values(123456789, 'Alice', 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01')," + + " (234567890, 'Bob', 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 12:00:00')," + + " (345678901, 'Carol', 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 14:00:00')," + + " (456789012, 'Dave', 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 16:00:00')," + + " (567890123, 'Eve', 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 18:00:00')," + + " (678901234, 'Frank', 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 20:00:00')," + + " (789012345, 'Grace', 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 22:00:00');" + + //Test the unique model by adding a value column with VARCHAR + sql initTable + sql initTableData + def getTableStatusSql = " SHOW ALTER TABLE COLUMN WHERE IndexName='${tbName}' ORDER BY createtime DESC LIMIT 1 " + def errorMessage="" + def insertSql = "insert into ${tbName} values(923456689, 'Alice', '四川省', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01');" + + + + + /** + * Test the unique model by modify a value type from DATE to other type + */ + sql """ DROP TABLE IF EXISTS ${tbName} """ + initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` FLOAT COMMENT \"分数\",\n" + + " `city` VARCHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATE COMMENT \"用户注册时间\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(age, user_id, address)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData = "insert into ${tbName} values(123456789, 'Alice', 1.8, 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (234567890, 'Bob', 1.89, 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (345678901, 'Carol', 2.6, 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (456789012, 'Dave', 3.9, 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (567890123, 'Eve', 4.2, 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]')," + + " (678901234, 'Frank', 2.5, 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06', {'a': 600, 'b': 200}, '[\"abc\", \"def\"]')," + + " (789012345, 'Grace', 2.1, 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07', {'a': 700, 'b': 200}, '[\"abc\", \"def\"]');" + + //TODO Test the unique model by modify a value type from DATE to BOOLEAN + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to BOOLEAN" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time BOOLEAN """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 6.4, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', false, {'a': 100, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + // TODO Test the unique model by modify a value type from DATE to TINYINT + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to TINYINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time TINYINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 2.2, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 1', {'a': 100, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DATE to SMALLINT + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to SMALLINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time SMALLINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 3, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 2, {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from DATE to INT + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to INT" + expectException({ + sql initTable + sql initTableData + + sql """ alter table ${tbName} MODIFY column register_time INT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 4, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 156, {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DATE to BIGINT + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to BIGINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time BIGINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 545645, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '15662', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from DATE to LARGEINT + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to LARGEINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time LARGEINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 156546, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 15898, {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DATE to DOUBLE + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to DOUBLE" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time DOUBLE """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 3.65, {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DATE to DECIMAL + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to DECIMAL128" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time DECIMAL(38,0) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 3.6598, {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DATE to FLOAT + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to FLOAT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time FLOAT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 2.6, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 1.65, {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DATE to DATETIME + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time DATETIME """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.2, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2003-12-31 20:12:12', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + //TODO Test the unique model by modify a value type from DATE to DATETIME + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time DATETIMEV2 """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.69, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2003-12-31 20:12:12', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + //TODO Test the unique model by modify a value type from DATE to CHAR + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to CHAR" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time CHAR(15) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.69, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 'cs1', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //TODO Test the unique model by modify a value type from DATE to VARCHAR + //Test the unique model by modify a value type from DATE to VARCHAR + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to VARCHAR" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time VARCHAR(100) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 8.45, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 'asd', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //TODO Test the unique model by modify a value type from DATE to STRING + //Test the unique model by modify a value type from DATE to STRING + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to STRING" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time STRING """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.89, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DATE to map + //Test the unique model by modify a value type from DATE to STRING + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to MAP" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time Map """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.49, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', {'a': 100, 'b': 200}, {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DATE to JSON + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to JSON" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time JSON """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.34, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '{'a': 100, 'b': 200}', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + + /** + * Test the unique model by modify a value type from DATE to other type + */ + sql """ DROP TABLE IF EXISTS ${tbName} """ + initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` FLOAT COMMENT \"分数\",\n" + + " `city` VARCHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATEV2 COMMENT \"用户注册时间\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(address, age, sex)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData = "insert into ${tbName} values(123456789, 'Alice', 1.8, 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (234567890, 'Bob', 1.89, 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (345678901, 'Carol', 2.6, 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (456789012, 'Dave', 3.9, 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (567890123, 'Eve', 4.2, 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]')," + + " (678901234, 'Frank', 2.5, 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06', {'a': 600, 'b': 200}, '[\"abc\", \"def\"]')," + + " (789012345, 'Grace', 2.1, 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07', {'a': 700, 'b': 200}, '[\"abc\", \"def\"]');" + + //TODO Test the unique model by modify a value type from DATEV2 to BOOLEAN + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to BOOLEAN" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time BOOLEAN """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 6.4, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', false, {'a': 100, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + // TODO Test the unique model by modify a value type from DATEV2 to TINYINT + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to TINYINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time TINYINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 2.2, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 1', {'a': 100, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DATEV2 to SMALLINT + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to SMALLINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time SMALLINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 3, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 2, {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from DATEV2 to INT + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to INT" + expectException({ + sql initTable + sql initTableData + + sql """ alter table ${tbName} MODIFY column register_time INT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 4, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 156, {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DATEV2 to BIGINT + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to BIGINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time BIGINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 545645, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '15662', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from DATEV2 to LARGEINT + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to LARGEINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time LARGEINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 156546, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 15898, {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DATEV2 to DOUBLE + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to DOUBLE" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time DOUBLE """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 3.65, {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DATEV2 to DECIMAL + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to DECIMAL128" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time DECIMAL(38,0) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 3.6598, {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DATEV2 to FLOAT + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to FLOAT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time FLOAT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 2.6, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 1.65, {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DATEV2 to DATETIME + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time DATETIME """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.2, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2003-12-31 20:12:12', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + //TODO Test the unique model by modify a value type from DATEV2 to DATETIME + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time DATETIMEV2 """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.69, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2003-12-31 20:12:12', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + //TODO Test the unique model by modify a value type from DATEV2 to CHAR + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to CHAR" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time CHAR(15) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.69, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 'cs1', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //TODO Test the unique model by modify a value type from DATEV2 to VARCHAR + //Test the unique model by modify a value type from DATE to VARCHAR + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to VARCHAR" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time VARCHAR(100) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 8.45, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 'asd', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //TODO Test the unique model by modify a value type from DATEV2 to STRING + //Test the unique model by modify a value type from DATE to STRING + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to STRING" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time STRING """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.89, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DATEV2 to map + //Test the unique model by modify a value type from DATE to STRING + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to MAP" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time Map """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.49, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', {'a': 100, 'b': 200}, {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DATEV2 to JSON + errorMessage = "errCode = 2, detailMessage = Can not change DATEV2 to JSON" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time JSON """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.34, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '{'a': 100, 'b': 200}', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + + + /** + * Test the unique model by modify a value type from DATETIME to other type + */ + sql """ DROP TABLE IF EXISTS ${tbName} """ + initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` FLOAT COMMENT \"分数\",\n" + + " `city` VARCHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(address, city, username)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData = "insert into ${tbName} values(123456789, 'Alice', 1.8, 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:48:26', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (234567890, 'Bob', 1.89, 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 10:48:26', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (345678901, 'Carol', 2.6, 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 10:48:26', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (456789012, 'Dave', 3.9, 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 10:48:26', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (567890123, 'Eve', 4.2, 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 10:48:26', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]')," + + " (678901234, 'Frank', 2.5, 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 10:48:26', {'a': 600, 'b': 200}, '[\"abc\", \"def\"]')," + + " (789012345, 'Grace', 2.1, 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 10:48:26', {'a': 700, 'b': 200}, '[\"abc\", \"def\"]');" + + //TODO Test the unique model by modify a value type from DATETIME to BOOLEAN + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to BOOLEAN" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time BOOLEAN """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 6.4, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', false, {'a': 100, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + // TODO Test the unique model by modify a value type from DATETIME to TINYINT + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to TINYINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time TINYINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 2.2, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 1', {'a': 100, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DATETIME to SMALLINT + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to SMALLINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time SMALLINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 3, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 2, {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from DATETIME to INT + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to INT" + expectException({ + sql initTable + sql initTableData + + sql """ alter table ${tbName} MODIFY column register_time INT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 4, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 156, {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DATETIME to BIGINT + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to BIGINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time BIGINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 545645, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '15662', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from DATETIME to LARGEINT + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to LARGEINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time LARGEINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 156546, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 15898, {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DATETIME to DOUBLE + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to DOUBLE" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time DOUBLE """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 3.65, {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DATETIME to DECIMAL + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to DECIMAL128" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time DECIMAL(38,0) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 3.6598, {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DATETIME to FLOAT + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to FLOAT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time FLOAT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 2.6, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 1.65, {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DATETIME to DATE + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time DATE """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.2, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2003-12-31', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + //TODO Test the unique model by modify a value type from DATETIME to DATEV2 + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time DATEV2 """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.69, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2003-12-31', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + //TODO Test the unique model by modify a value type from DATETIME to CHAR + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to CHAR" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time CHAR(15) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.69, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 'cs1', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //TODO Test the unique model by modify a value type from DATETIME to VARCHAR + //Test the unique model by modify a value type from DATETIME to VARCHAR + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to VARCHAR" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time VARCHAR(100) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 8.45, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 'asd', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //TODO Test the unique model by modify a value type from DATETIME to STRING + //Test the unique model by modify a value type from DATETIME to STRING + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to STRING" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time STRING """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.89, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DATETIME to map + //Test the unique model by modify a value type from DATETIME to STRING + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to MAP" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time Map """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.49, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', {'a': 100, 'b': 200}, {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DATETIME to JSON + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to JSON" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time JSON """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.34, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '{'a': 100, 'b': 200}', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + /** + * Test the unique model by modify a value type from DATETIMEV2 to other type + */ + sql """ DROP TABLE IF EXISTS ${tbName} """ + initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` FLOAT COMMENT \"分数\",\n" + + " `city` VARCHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(phone, address, username)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData = "insert into ${tbName} values(123456789, 'Alice', 1.8, 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:48:26', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (234567890, 'Bob', 1.89, 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 10:48:26', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (345678901, 'Carol', 2.6, 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 10:48:26', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (456789012, 'Dave', 3.9, 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 10:48:26', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (567890123, 'Eve', 4.2, 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 10:48:26', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]')," + + " (678901234, 'Frank', 2.5, 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 10:48:26', {'a': 600, 'b': 200}, '[\"abc\", \"def\"]')," + + " (789012345, 'Grace', 2.1, 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 10:48:26', {'a': 700, 'b': 200}, '[\"abc\", \"def\"]');" + + //TODO Test the unique model by modify a value type from DATETIMEV2 to BOOLEAN + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to BOOLEAN" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time BOOLEAN """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 6.4, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', false, {'a': 100, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + // TODO Test the unique model by modify a value type from DATETIMEV2 to TINYINT + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to TINYINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time TINYINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 2.2, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 1', {'a': 100, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DATETIMEV2 to SMALLINT + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to SMALLINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time SMALLINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 3, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 2, {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from DATETIMEV2 to INT + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to INT" + expectException({ + sql initTable + sql initTableData + + sql """ alter table ${tbName} MODIFY column register_time INT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 4, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 156, {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DATETIMEV2 to BIGINT + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to BIGINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time BIGINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 545645, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '15662', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from DATETIMEV2 to LARGEINT + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to LARGEINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time LARGEINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 156546, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 15898, {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DATETIMEV2 to DOUBLE + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to DOUBLE" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time DOUBLE """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 3.65, {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DATETIMEV2 to DECIMAL + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to DECIMAL128" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time DECIMAL(38,0) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.23, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 3.6598, {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DATETIMEV2 to FLOAT + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to FLOAT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time FLOAT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 2.6, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 1.65, {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DATETIMEV2 to DATE + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time DATE """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.2, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2003-12-31', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + //TODO Test the unique model by modify a value type from DATETIMEV2 to DATEV2 + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time DATEV2 """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.69, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2003-12-31', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + //TODO Test the unique model by modify a value type from DATETIMEV2 to CHAR + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to CHAR" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time CHAR(15) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.69, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 'cs1', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //TODO Test the unique model by modify a value type from DATETIMEV2 to VARCHAR + //Test the unique model by modify a value type from DATETIME to VARCHAR + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to VARCHAR" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time VARCHAR(100) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 8.45, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', 'asd', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + //TODO Test the unique model by modify a value type from DATETIMEV2 to STRING + //Test the unique model by modify a value type from DATETIME to STRING + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to STRING" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time STRING """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.89, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //TODO Test the unique model by modify a value type from DATETIMEV2 to map + //Test the unique model by modify a value type from DATETIME to STRING + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to MAP" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time Map """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.49, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', {'a': 100, 'b': 200}, {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from DATETIMEV2 to JSON + errorMessage = "errCode = 2, detailMessage = Can not change DATETIMEV2 to JSON" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column register_time JSON """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.34, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '{'a': 100, 'b': 200}', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + +} diff --git a/regression-test/suites/schema_change_p0/unique_ck/test_unique_schema_value_modify2.groovy b/regression-test/suites/schema_change_p0/unique_ck/test_unique_schema_value_modify2.groovy new file mode 100644 index 00000000000000..5ba388d98b9c8d --- /dev/null +++ b/regression-test/suites/schema_change_p0/unique_ck/test_unique_schema_value_modify2.groovy @@ -0,0 +1,962 @@ +// 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_unique_schema_value_modify2", "p0") { + def tbName = "test_unique_model_value_change2" + def tbName2 = "test_unique_model_value_change_2" + def initTable1 = "" + def initTableData1 = "" + def on_write = true + println String.format("current enable_unique_key_merge_on_write is : %s ",on_write) + //Test the unique model by adding a value column + sql """ DROP TABLE IF EXISTS ${tbName} """ + def initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `city` VARCHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(address, age, sex)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + def initTableData = "insert into ${tbName} values(123456789, 'Alice', 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00')," + + " (234567890, 'Bob', 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 12:00:00')," + + " (345678901, 'Carol', 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 14:00:00')," + + " (456789012, 'Dave', 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 16:00:00')," + + " (567890123, 'Eve', 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 18:00:00')," + + " (678901234, 'Frank', 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 20:00:00')," + + " (789012345, 'Grace', 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 22:00:00');" + + //Test the unique model by adding a value column with VARCHAR + sql initTable + sql initTableData + def getTableStatusSql = " SHOW ALTER TABLE COLUMN WHERE IndexName='${tbName}' ORDER BY createtime DESC LIMIT 1 " + def errorMessage = "" + def insertSql = "insert into ${tbName} values(923456689, 'Alice', '四川省', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00');" + + + /** + * Test the unique model by modify a value type from CHAR to other type + */ + sql """ DROP TABLE IF EXISTS ${tbName} """ + initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` CHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(address, user_id, sex, age)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData = "insert into ${tbName} values(123456789, 'Alice', 1.83, 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (234567890, 'Bob', 1.89, 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 12:00:00', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (345678901, 'Carol', 2.6689, 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 14:00:00', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (456789012, 'Dave', 3.9456, 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 16:00:00', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (567890123, 'Eve', 4.223, 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 18:00:00', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]')," + + " (678901234, 'Frank', 2.5454, 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 20:00:00', {'a': 600, 'b': 200}, '[\"abc\", \"def\"]')," + + " (789012345, 'Grace', 2.19656, 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 22:00:00', {'a': 700, 'b': 200}, '[\"abc\", \"def\"]');" + + //TODO Test the unique model by modify a value type from CHAR to BOOLEAN + errorMessage = "errCode = 2, detailMessage = Can not change CHAR to BOOLEAN" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city BOOLEAN """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.2, false, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + // TODO Test the unique model by modify a value type from CHAR to TINYINT + errorMessage = "expected:<[FINISH]ED> but was:<[CANCELL]ED>" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city TINYINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 2.2, 1, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 120 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from CHAR to SMALLINT + errorMessage = "expected:<[FINISH]ED> but was:<[CANCELL]ED>" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city SMALLINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 3, 3, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //Test the unique model by modify a value type from CHAR to INT + errorMessage = "expected:<[FINISH]ED> but was:<[CANCELL]ED>" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city INT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 4.1, 23, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //Test the unique model by modify a value type from CHAR to BIGINT + errorMessage = "expected:<[FINISH]ED> but was:<[CANCELL]ED>" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city BIGINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.6, 2423, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //Test the unique model by modify a value type from CHAR to LARGEINT + errorMessage = "expected:<[FINISH]ED> but was:<[CANCELL]ED>" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city LARGEINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 2.36, 4561, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from CHAR to FLOAT + errorMessage = "expected:<[FINISH]ED> but was:<[CANCELL]ED>" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city FLOAT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.23, 1.25, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //TODO Test the unique model by modify a value type from CHAR to DECIMAL + errorMessage = "errCode = 2, detailMessage = Can not change CHAR to DECIMAL128" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city DECIMAL(38,0) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.23, 56.98, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from CHAR to DATE + errorMessage = "errCode = 2, detailMessage = Can not change CHAR to DATEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city DATE """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.6, '2003-12-31', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from CHAR to DATEV2 + errorMessage = "errCode = 2, detailMessage = Can not change CHAR to DATEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city DATEV2 """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 6.3, '2003-12-31', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from CHAR to DATETIME + errorMessage = "errCode = 2, detailMessage = Can not change CHAR to DATETIMEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city DATETIME """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 9.63, '2003-12-31 20:12:12', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from CHAR to DATETIME + errorMessage = "errCode = 2, detailMessage = Can not change CHAR to DATETIMEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city DATETIMEV2 """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.69, '2003-12-31 20:12:12', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //Test the unique model by modify a value type from CHAR to VARCHAR + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city VARCHAR(100) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.69, 'Yaan1', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable1 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` VARCHAR(100) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(age, city, sex)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData1 = "insert into ${tbName2} values(123456789, 'Alice', 1.83, 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (234567890, 'Bob', 1.89, 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 12:00:00', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (345678901, 'Carol', 2.6689, 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 14:00:00', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (456789012, 'Dave', 3.9456, 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 16:00:00', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (567890123, 'Eve', 4.223, 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 18:00:00', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]')," + + " (678901234, 'Frank', 2.5454, 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 20:00:00', {'a': 600, 'b': 200}, '[\"abc\", \"def\"]')," + + " (923456689, 'Alice', 5.69, 'Yaan1', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\\\"abc\\\", \\\"def\\\"]')," + + " (789012345, 'Grace', 2.19656, 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 22:00:00', {'a': 700, 'b': 200}, '[\"abc\", \"def\"]');" + + + sql initTable1 + sql initTableData1 + checkTableData("${tbName}","${tbName2}","city") + sql """ DROP TABLE IF EXISTS ${tbName} """ + + //Test the unique model by modify a value type from CHAR to STRING + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city STRING """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 6.59, 'Yaan2', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable1 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` STRING COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(register_time, age, user_id, sex)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData1 = "insert into ${tbName2} values(123456789, 'Alice', 1.83, 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (234567890, 'Bob', 1.89, 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 12:00:00', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (345678901, 'Carol', 2.6689, 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 14:00:00', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (456789012, 'Dave', 3.9456, 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 16:00:00', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (567890123, 'Eve', 4.223, 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 18:00:00', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]')," + + " (678901234, 'Frank', 2.5454, 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 20:00:00', {'a': 600, 'b': 200}, '[\"abc\", \"def\"]')," + + " (923456689, 'Alice', 5.69, 'Yaan2', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\\\"abc\\\", \\\"def\\\"]')," + + " (789012345, 'Grace', 2.19656, 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 22:00:00', {'a': 700, 'b': 200}, '[\"abc\", \"def\"]');" + + + sql initTable1 + sql initTableData1 + checkTableData("${tbName}","${tbName2}","city") + sql """ DROP TABLE IF EXISTS ${tbName} """ + + + + //TODO Test the unique model by modify a value type from CHAR to map + //Test the unique model by modify a value type from CHAR to map + errorMessage = "errCode = 2, detailMessage = Can not change CHAR to MAP" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city Map """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.98, {'a': 100, 'b': 200}, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from CHAR to JSON + errorMessage = "errCode = 2, detailMessage = Can not change CHAR to JSON" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city JSON """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 8.47, '{'a': 100, 'b': 200}', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + + /** + * Test the unique model by modify a value type from VARCHAR to other type + */ + sql """ DROP TABLE IF EXISTS ${tbName} """ + initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` VARCHAR(255) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(username, age, sex)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData = "insert into ${tbName} values(123456789, 'Alice', 1.83, 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (234567890, 'Bob', 1.89, 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 12:00:00', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (345678901, 'Carol', 2.6689, 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 14:00:00', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (456789012, 'Dave', 3.9456, 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 16:00:00', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (567890123, 'Eve', 4.223, 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 18:00:00', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]')," + + " (678901234, 'Frank', 2.5454, 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 20:00:00', {'a': 600, 'b': 200}, '[\"abc\", \"def\"]')," + + " (789012345, 'Grace', 2.19656, 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 22:00:00', {'a': 700, 'b': 200}, '[\"abc\", \"def\"]');" + + //TODO Test the unique model by modify a value type from VARCHAR to BOOLEAN + errorMessage = "errCode = 2, detailMessage = Can not change VARCHAR to BOOLEAN" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city BOOLEAN """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.2, false, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + // TODO Test the unique model by modify a value type from VARCHAR to TINYINT + errorMessage = "expected:<[FINISH]ED> but was:<[CANCELL]ED>" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city TINYINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 2.2, 1, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 120 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from VARCHAR to SMALLINT + errorMessage = "expected:<[FINISH]ED> but was:<[CANCELL]ED>" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city SMALLINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 3, 3, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //Test the unique model by modify a value type from VARCHAR to INT + errorMessage = "expected:<[FINISH]ED> but was:<[CANCELL]ED>" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city INT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 4.1, 23, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //Test the unique model by modify a value type from VARCHAR to BIGINT + errorMessage = "expected:<[FINISH]ED> but was:<[CANCELL]ED>" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city BIGINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.6, 2423, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //Test the unique model by modify a value type from VARCHAR to LARGEINT + errorMessage = "expected:<[FINISH]ED> but was:<[CANCELL]ED>" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city LARGEINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 2.36, 4561, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from VARCHAR to FLOAT + errorMessage = "expected:<[FINISH]ED> but was:<[CANCELL]ED>" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city FLOAT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.23, 1.25, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //TODO Test the unique model by modify a value type from VARCHAR to DECIMAL + errorMessage = "errCode = 2, detailMessage = Can not change VARCHAR to DECIMAL128" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city DECIMAL(38,0) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.23, 56.98, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from VARCHAR to DATE + errorMessage = "expected:<[FINISH]ED> but was:<[CANCELL]ED>" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city DATE """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.6, '2003-12-31', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from VARCHAR to DATEV2 + errorMessage = "expected:<[FINISH]ED> but was:<[CANCELL]ED>" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city DATEV2 """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 6.3, '2003-12-31', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from VARCHAR to DATETIME + errorMessage = "errCode = 2, detailMessage = Can not change VARCHAR to DATETIMEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city DATETIME """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 9.63, '2003-12-31 20:12:12', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from VARCHAR to DATETIME + errorMessage = "errCode = 2, detailMessage = Can not change VARCHAR to DATETIMEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city DATETIMEV2 """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.69, '2003-12-31 20:12:12', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //Test the unique model by modify a value type from VARCHAR to CHAR + errorMessage = "errCode = 2, detailMessage = Can not change VARCHAR to CHAR" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city CHAR(3) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.69, 'Yaan1', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from VARCHAR to STRING + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city STRING """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 6.59, 'Yaan2', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + + + sql """ DROP TABLE IF EXISTS ${tbName2} """ + initTable1 = " CREATE TABLE IF NOT EXISTS ${tbName2}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` STRING COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(score, age, sex)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData1 = "insert into ${tbName2} values(123456789, 'Alice', 1.83, 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (234567890, 'Bob', 1.89, 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 12:00:00', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (345678901, 'Carol', 2.6689, 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 14:00:00', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (456789012, 'Dave', 3.9456, 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 16:00:00', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (567890123, 'Eve', 4.223, 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 18:00:00', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]')," + + " (678901234, 'Frank', 2.5454, 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 20:00:00', {'a': 600, 'b': 200}, '[\"abc\", \"def\"]')," + + " (923456689, 'Alice', 5.69, 'Yaan2', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\\\"abc\\\", \\\"def\\\"]')," + + " (789012345, 'Grace', 2.19656, 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 22:00:00', {'a': 700, 'b': 200}, '[\"abc\", \"def\"]');" + + + sql initTable1 + sql initTableData1 + checkTableData("${tbName}","${tbName2}","city") + sql """ DROP TABLE IF EXISTS ${tbName} """ + + + + //TODO Test the unique model by modify a value type from VARCHAR to map + //Test the unique model by modify a value type from VARCHAR to STRING + errorMessage = "errCode = 2, detailMessage = Can not change VARCHAR to MAP" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city Map """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.98, {'a': 100, 'b': 200}, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from VARCHAR to JSON + errorMessage = "expected:<[FINISH]ED> but was:<[CANCELL]ED>" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city JSON """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 8.47, '{'a': 100, 'b': 200}', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + /** + * Test the unique model by modify a value type from STRING to other type + */ + sql """ DROP TABLE IF EXISTS ${tbName} """ + initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` STRING COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(score, user_id, address, age, sex)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData = "insert into ${tbName} values(123456789, 'Alice', 1.83, 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (234567890, 'Bob', 1.89, 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 12:00:00', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (345678901, 'Carol', 2.6689, 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 14:00:00', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (456789012, 'Dave', 3.9456, 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 16:00:00', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (567890123, 'Eve', 4.223, 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 18:00:00', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]')," + + " (678901234, 'Frank', 2.5454, 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 20:00:00', {'a': 600, 'b': 200}, '[\"abc\", \"def\"]')," + + " (789012345, 'Grace', 2.19656, 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 22:00:00', {'a': 700, 'b': 200}, '[\"abc\", \"def\"]');" + + //TODO Test the unique model by modify a value type from STRING to BOOLEAN + errorMessage = "errCode = 2, detailMessage = Can not change STRING to BOOLEAN" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city BOOLEAN """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.2, false, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + // TODO Test the unique model by modify a value type from STRING to TINYINT + errorMessage = "errCode = 2, detailMessage = Can not change STRING to TINYINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city TINYINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 2.2, 1, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 120 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from STRING to SMALLINT + errorMessage = "errCode = 2, detailMessage = Can not change STRING to SMALLINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city SMALLINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 3, 3, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //Test the unique model by modify a value type from STRING to INT + errorMessage = "errCode = 2, detailMessage = Can not change STRING to INT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city INT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 4.1, 23, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //Test the unique model by modify a value type from STRING to BIGINT + errorMessage = "errCode = 2, detailMessage = Can not change STRING to BIGINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city BIGINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.6, 2423, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //Test the unique model by modify a value type from STRING to LARGEINT + errorMessage = "errCode = 2, detailMessage = Can not change STRING to LARGEINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city LARGEINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 2.36, 4561, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from STRING to FLOAT + errorMessage = "errCode = 2, detailMessage = Can not change STRING to FLOAT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city FLOAT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.23, 1.25, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //TODO Test the unique model by modify a value type from STRING to DECIMAL + errorMessage = "errCode = 2, detailMessage = Can not change STRING to DECIMAL128" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city DECIMAL(38,0) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.23, 56.98, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from STRING to DATE + errorMessage = "errCode = 2, detailMessage = Can not change STRING to DATEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city DATE """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.6, '2003-12-31', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from STRING to DATEV2 + errorMessage = "errCode = 2, detailMessage = Can not change STRING to DATEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city DATEV2 """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 6.3, '2003-12-31', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from STRING to DATETIME + errorMessage = "errCode = 2, detailMessage = Can not change STRING to DATETIMEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city DATETIME """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 9.63, '2003-12-31 20:12:12', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from STRING to DATETIME + errorMessage = "errCode = 2, detailMessage = Can not change STRING to DATETIMEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city DATETIMEV2 """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.69, '2003-12-31 20:12:12', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //Test the unique model by modify a value type from STRING to CHAR + errorMessage = "errCode = 2, detailMessage = Can not change STRING to CHAR" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city CHAR(3) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.69, 'Yaan1', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from STRING to VARCHAR + errorMessage = "errCode = 2, detailMessage = Can not change STRING to VARCHAR" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city VARCHAR(256) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 6.59, 'Yaan2', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //TODO Test the unique model by modify a value type from STRING to map + //Test the unique model by modify a value type from STRING to STRING + errorMessage = "errCode = 2, detailMessage = Can not change STRING to MAP" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city Map """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.98, {'a': 100, 'b': 200}, 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from STRING to JSON + errorMessage = "expected:<[FINISH]ED> but was:<[CANCELL]ED>" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column city JSON """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 8.47, '{'a': 100, 'b': 200}', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + + +} diff --git a/regression-test/suites/schema_change_p0/unique_ck/test_unique_schema_value_modify3.groovy b/regression-test/suites/schema_change_p0/unique_ck/test_unique_schema_value_modify3.groovy new file mode 100644 index 00000000000000..0c8e30acc779af --- /dev/null +++ b/regression-test/suites/schema_change_p0/unique_ck/test_unique_schema_value_modify3.groovy @@ -0,0 +1,552 @@ +// 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_unique_schema_value_modify3", "p0") { + def tbName = "test_unique_model_value_change3" + def tbName2 = "test_unique_model_value_change_3" + def on_write = true + println String.format("current enable_unique_key_merge_on_write is : %s ",on_write) + //Test the unique model by adding a value column + sql """ DROP TABLE IF EXISTS ${tbName} """ + def initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `city` VARCHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(user_id, address, age, sex)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + def initTableData = "insert into ${tbName} values(123456789, 'Alice', 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00')," + + " (234567890, 'Bob', 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 12:00:00')," + + " (345678901, 'Carol', 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 14:00:00')," + + " (456789012, 'Dave', 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 16:00:00')," + + " (567890123, 'Eve', 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 18:00:00')," + + " (678901234, 'Frank', 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 20:00:00')," + + " (789012345, 'Grace', 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 22:00:00');" + + //Test the unique model by adding a value column with VARCHAR + sql initTable + sql initTableData + def getTableStatusSql = " SHOW ALTER TABLE COLUMN WHERE IndexName='${tbName}' ORDER BY createtime DESC LIMIT 1 " + def errorMessage = "" + def insertSql = "insert into ${tbName} values(923456689, 'Alice', '四川省', 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00');" + + + /** + * Test the unique model by modify a value type from MAP to other type + */ + sql """ DROP TABLE IF EXISTS ${tbName} """ + initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` CHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(score, age, sex)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData = "insert into ${tbName} values(123456789, 'Alice', 1.83, 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (234567890, 'Bob', 1.89, 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 12:00:00', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (345678901, 'Carol', 2.6689, 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 14:00:00', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (456789012, 'Dave', 3.9456, 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 16:00:00', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (567890123, 'Eve', 4.223, 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 18:00:00', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]')," + + " (678901234, 'Frank', 2.5454, 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 20:00:00', {'a': 600, 'b': 200}, '[\"abc\", \"def\"]')," + + " (789012345, 'Grace', 2.19656, 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 22:00:00', {'a': 700, 'b': 200}, '[\"abc\", \"def\"]');" + + //TODO Test the unique model by modify a value type from MAP to BOOLEAN + errorMessage = "errCode = 2, detailMessage = Can not change" + expectExceptionLike({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column m BOOLEAN """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.2, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', false, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + // TODO Test the unique model by modify a value type from MAP to TINYINT + errorMessage = "errCode = 2, detailMessage = Can not change" + expectExceptionLike({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column m TINYINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 2.2, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', 1, '{\"k1\":\"v1\", \"k2\": 200}'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 120 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from MAP to SMALLINT + errorMessage = "errCode = 2, detailMessage = Can not change" + expectExceptionLike({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column m SMALLINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 3, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', 3, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //Test the unique model by modify a value type from MAP to INT + errorMessage = "errCode = 2, detailMessage = Can not change" + expectExceptionLike({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column m INT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 4.1, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', 23, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //Test the unique model by modify a value type from MAP to BIGINT + errorMessage = "errCode = 2, detailMessage = Can not change" + expectExceptionLike({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column m BIGINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.6, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', 4564, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //Test the unique model by modify a value type from MAP to LARGEINT + errorMessage = "errCode = 2, detailMessage = Can not change" + expectExceptionLike({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column m LARGEINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 2.36, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', 43643734, [\"abc\", \"def\"]); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from MAP to FLOAT + errorMessage = "errCode = 2, detailMessage = Can not change" + expectExceptionLike({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column m FLOAT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.23, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', 5.6, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //TODO Test the unique model by modify a value type from MAP to DECIMAL + errorMessage = "errCode = 2, detailMessage = Can not change" + expectExceptionLike({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column m DECIMAL(38,0) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.23, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', 895.666, '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from MAP to DATE + errorMessage = "errCode = 2, detailMessage = Can not change" + expectExceptionLike({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column m DATE """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.6, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', '2003-12-31', '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from MAP to DATEV2 + errorMessage = "errCode = 2, detailMessage = Can not change" + expectExceptionLike({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column m DATEV2 """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 6.3, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', '2003-12-31', '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from MAP to DATETIME + errorMessage = "errCode = 2, detailMessage = Can not change" + expectExceptionLike({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column m DATETIME """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 9.63, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', '2003-12-31 20:12:12', '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from MAP to DATETIME + errorMessage = "errCode = 2, detailMessage = Can not change" + expectExceptionLike({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column m DATETIMEV2 """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.69, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', '2003-12-31 20:12:12', '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //Test the unique model by modify a value type from MAP to VARCHAR + errorMessage = "errCode = 2, detailMessage = Can not change" + expectExceptionLike({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column m VARCHAR(100) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.69, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', 'sdfghjk', '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from MAP to STRING + errorMessage = "errCode = 2, detailMessage = Can not change" + expectExceptionLike({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column m STRING """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 6.59, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', 'wertyu', '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from MAP to JSON + errorMessage = "errCode = 2, detailMessage = Can not change" + expectExceptionLike({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column m JSON """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 8.47, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', '{'a': 100, 'b': 200}', '[\"abc\", \"def\"]'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + /** + * Test the unique model by modify a value type from JSON to other type + */ + sql """ DROP TABLE IF EXISTS ${tbName} """ + initTable = " CREATE TABLE IF NOT EXISTS ${tbName}\n" + + " (\n" + + " `user_id` LARGEINT NOT NULL COMMENT \"用户id\",\n" + + " `username` VARCHAR(50) NOT NULL COMMENT \"用户昵称\",\n" + + " `score` DECIMAL(38,10) COMMENT \"分数\",\n" + + " `city` CHAR(20) COMMENT \"用户所在城市\",\n" + + " `age` SMALLINT COMMENT \"用户年龄\",\n" + + " `sex` TINYINT COMMENT \"用户性别\",\n" + + " `phone` LARGEINT COMMENT \"用户电话\",\n" + + " `address` VARCHAR(500) COMMENT \"用户地址\",\n" + + " `register_time` DATETIME COMMENT \"用户注册时间\",\n" + + " `m` Map NULL COMMENT \"\",\n" + + " `j` JSON NULL COMMENT \"\"\n" + + " )\n" + + " UNIQUE KEY(`user_id`, `username`)\n" + + " CLUSTER BY(score, user_id, age, sex)\n" + + " DISTRIBUTED BY HASH(`user_id`) BUCKETS 1\n" + + " PROPERTIES (\n" + + " \"replication_allocation\" = \"tag.location.default: 1\",\n" + + " \"enable_unique_key_merge_on_write\" = \"${on_write}\"\n" + + " );" + + initTableData = "insert into ${tbName} values(123456789, 'Alice', 1.83, 'Beijing', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 100, 'b': 200}, '[\"abc\", \"def\"]')," + + " (234567890, 'Bob', 1.89, 'Shanghai', 30, 1, 13998765432, 'No. 456 Street, Shanghai', '2022-02-02 12:00:00', {'a': 200, 'b': 200}, '[\"abc\", \"def\"]')," + + " (345678901, 'Carol', 2.6689, 'Guangzhou', 28, 0, 13724681357, 'No. 789 Street, Guangzhou', '2022-03-03 14:00:00', {'a': 300, 'b': 200}, '[\"abc\", \"def\"]')," + + " (456789012, 'Dave', 3.9456, 'Shenzhen', 35, 1, 13680864279, 'No. 987 Street, Shenzhen', '2022-04-04 16:00:00', {'a': 400, 'b': 200}, '[\"abc\", \"def\"]')," + + " (567890123, 'Eve', 4.223, 'Chengdu', 27, 0, 13572468091, 'No. 654 Street, Chengdu', '2022-05-05 18:00:00', {'a': 500, 'b': 200}, '[\"abc\", \"def\"]')," + + " (678901234, 'Frank', 2.5454, 'Hangzhou', 32, 1, 13467985213, 'No. 321 Street, Hangzhou', '2022-06-06 20:00:00', {'a': 600, 'b': 200}, '[\"abc\", \"def\"]')," + + " (789012345, 'Grace', 2.19656, 'Xian', 29, 0, 13333333333, 'No. 222 Street, Xian', '2022-07-07 22:00:00', {'a': 700, 'b': 200}, '[\"abc\", \"def\"]');" + + //TODO Test the unique model by modify a value type from JSON to BOOLEAN + errorMessage = "errCode = 2, detailMessage = Can not change JSON to BOOLEAN" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column j BOOLEAN """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.2, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', , false); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + // TODO Test the unique model by modify a value type from JSON to TINYINT + errorMessage = "errCode = 2, detailMessage = Can not change JSON to TINYINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column j TINYINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 2.2, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 700, 'b': 200}, 1); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 120 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from JSON to SMALLINT + errorMessage = "errCode = 2, detailMessage = Can not change JSON to SMALLINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column j SMALLINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 3, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 700, 'b': 200}, 21); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //Test the unique model by modify a value type from JSON to INT + errorMessage = "errCode = 2, detailMessage = Can not change JSON to INT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column j INT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 4.1, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 700, 'b': 200}, 25); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //Test the unique model by modify a value type from JSON to BIGINT + errorMessage = "errCode = 2, detailMessage = Can not change JSON to BIGINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column j BIGINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.6, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 700, 'b': 200}, 32523); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //Test the unique model by modify a value type from JSON to LARGEINT + errorMessage = "errCode = 2, detailMessage = Can not change JSON to LARGEINT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column j LARGEINT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 2.36, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 700, 'b': 200}, 356436); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //Test the unique model by modify a value type from JSON to FLOAT + errorMessage = "errCode = 2, detailMessage = Can not change JSON to FLOAT" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column j FLOAT """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.23, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 700, 'b': 200}, 86.5); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + + //TODO Test the unique model by modify a value type from JSON to DECIMAL + errorMessage = "errCode = 2, detailMessage = Can not change JSON to DECIMAL128" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column j DECIMAL(38,0) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 1.23, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 700, 'b': 200}, 896.2356); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from JSON to DATE + errorMessage = "errCode = 2, detailMessage = Can not change JSON to DATEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column j DATE """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.6, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 700, 'b': 200}, '2003-12-31'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from JSON to DATEV2 + errorMessage = "errCode = 2, detailMessage = Can not change JSON to DATEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column j DATEV2 """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 6.3, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 700, 'b': 200}, '2003-12-31'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //TODO Test the unique model by modify a value type from JSON to DATETIME + errorMessage = "errCode = 2, detailMessage = Can not change JSON to DATETIMEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column j DATETIME """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 9.63, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 700, 'b': 200}, '2003-12-31 20:12:12'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + //TODO Test the unique model by modify a value type from JSON to DATETIME + errorMessage = "errCode = 2, detailMessage = Can not change JSON to DATETIMEV2" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column j DATETIMEV2 """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.69, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 700, 'b': 200}, '2003-12-31 20:12:12'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + + }, errorMessage) + + + //Test the unique model by modify a value type from JSON to VARCHAR + errorMessage = "errCode = 2, detailMessage = Can not change JSON to VARCHAR" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column j VARCHAR(100) """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 5.69, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 700, 'b': 200}, 'erwtewxa'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from JSON to STRING + errorMessage = "errCode = 2, detailMessage = Can not change JSON to STRING" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column j STRING """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 6.59, 'Yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 700, 'b': 200}, '36tgeryda'); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, false, "${tbName}") + }, errorMessage) + + //Test the unique model by modify a value type from JSON to MAP + errorMessage = "expected:<[FINISH]ED> but was:<[CANCELL]ED>" + expectException({ + sql initTable + sql initTableData + sql """ alter table ${tbName} MODIFY column j JSON """ + insertSql = "insert into ${tbName} values(923456689, 'Alice', 8.47, 'yaan', 25, 0, 13812345678, 'No. 123 Street, Beijing', '2022-01-01 10:00:00', {'a': 700, 'b': 200}, {'a': 700, 'b': 200}); " + waitForSchemaChangeDone({ + sql getTableStatusSql + time 600 + }, insertSql, true, "${tbName}") + }, errorMessage) + + +} diff --git a/regression-test/suites/unique_with_mow_c_p0/test_compaction_with_multi_append_columns.groovy b/regression-test/suites/unique_with_mow_c_p0/test_compaction_with_multi_append_columns.groovy new file mode 100644 index 00000000000000..8403b17cce5b6d --- /dev/null +++ b/regression-test/suites/unique_with_mow_c_p0/test_compaction_with_multi_append_columns.groovy @@ -0,0 +1,143 @@ +// 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_compaction_with_multi_append_columns", "p0") { + def tableName = "test_compaction_with_multi_append_columns" + + def execStreamLoad = { + streamLoad { + table "${tableName}" + + set 'column_separator', ',' + + file 'all_types.csv' + time 10000 // limit inflight 10s + + check { result, exception, startTime, endTime -> + if (exception != null) { + throw exception + } + log.info("Stream load result: ${result}".toString()) + def json = parseJson(result) + assertEquals("success", json.Status.toLowerCase()) + assertEquals(2500, json.NumberTotalRows) + assertEquals(0, json.NumberFilteredRows) + } + } + } + + def checkNoDuplicatedKeys = { + def res = sql """ show tablets from ${tableName}; """ + log.info("tablets: " + res) + + def rowCount = sql """ select count() from ${tableName}; """ + log.info("rowCount: " + rowCount) + + List> cnt = sql """ select k1,k2,k3,count(*) a from ${tableName} group by k1,k2,k3 having a > 1; """ + // log.info("ensure there are no duplicated keys") + if (cnt.size() > 0) { + log.info("find duplicated keys: " + cnt.get(0)) + } + assertEquals(0, cnt.size()) + } + + sql """ DROP TABLE IF EXISTS ${tableName} """ + + sql """ + CREATE TABLE IF NOT EXISTS ${tableName} ( + `k1` int(11) NULL, + `k2` tinyint(4) NULL, + `k3` smallint(6) NULL, + `k4` int(30) NULL, + `k5` largeint(40) NULL, + `k6` float NULL, + `k7` double NULL, + `k8` decimal(9, 0) NULL, + `k9` char(10) NULL, + `k10` varchar(1024) NULL, + `k11` text NULL, + `k12` date NULL, + `k13` datetime NULL + ) ENGINE=OLAP + unique KEY(k1, k2, k3) + CLUSTER BY (`k13`, `k2`) + DISTRIBUTED BY HASH(`k1`) BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + // 1. load data + for (int i = 0; i < 10; i++) { + execStreamLoad() + checkNoDuplicatedKeys(tableName) + } + + // 2. compaction + // get be info + def backendId_to_backendIP = [:] + def backendId_to_backendHttpPort = [:] + getBackendIpHttpPort(backendId_to_backendIP, backendId_to_backendHttpPort) + // get config 'disableAutoCompaction' + boolean disableAutoCompaction = true + if (true) { + String backend_id = backendId_to_backendIP.keySet()[0] + def (code, out, err) = show_be_config(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id)) + logger.info("Show config: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def configList = parseJson(out.trim()) + assert configList instanceof List + for (Object ele in (List) configList) { + assert ele instanceof List + if (((List) ele)[0] == "disable_auto_compaction") { + disableAutoCompaction = Boolean.parseBoolean(((List) ele)[2]) + } + } + } + logger.info("disableAutoCompaction: " + disableAutoCompaction) + // trigger compactions for all tablets in ${tableName} + def tablets = sql_return_maparray """ show tablets from ${tableName}; """ + for (def tablet in tablets) { + String tablet_id = tablet.TabletId + def backend_id = tablet.BackendId + + def (code, out, err) = be_run_cumulative_compaction(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id), tablet_id) + logger.info("Run compaction: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def compactJson = parseJson(out.trim()) + logger.info("compact json: " + compactJson) + if (compactJson.status.toLowerCase() == "fail") { + assertEquals(disableAutoCompaction, false) + logger.info("Compaction was done automatically!") + } + if (disableAutoCompaction) { + assertEquals("success", compactJson.status.toLowerCase()) + } + + (code, out, err) = be_show_tablet_status(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id), tablet_id) + logger.info("Show tablet status: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def json = parseJson(out.trim()) + logger.info("tablet rowset: " + json) + } + checkNoDuplicatedKeys(tableName) + + // 3. load data + execStreamLoad() + checkNoDuplicatedKeys(tableName) +} + From 34383ad0048254d7f913683f5479bd7bfa5b2431 Mon Sep 17 00:00:00 2001 From: zhengyu Date: Tue, 19 Nov 2024 20:36:13 +0800 Subject: [PATCH 39/63] [fix](regression) warmup_show_stmt flaky by concurrent execution (#44226) ### What problem does this PR solve? def hotTableName = "regression_test_cloud_p0_cache_multi_cluster_warm_up_hotspot.customer" for (int i = 0; i < result.size(); ++i) { if (!result[i].get("TableName").equals(hotTableName)) { org.junit.Assert.assertTrue(getLineNumber() + "cannot find expected cache hotspot ${hotTableName}", result.size() > i + 1) Signed-off-by: zhengyu --- .../warm_up/hotspot/test_warmup_show_stmt_2.groovy | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/regression-test/suites/cloud_p0/cache/multi_cluster/warm_up/hotspot/test_warmup_show_stmt_2.groovy b/regression-test/suites/cloud_p0/cache/multi_cluster/warm_up/hotspot/test_warmup_show_stmt_2.groovy index 6ebe891f5f34b8..221edfef550522 100644 --- a/regression-test/suites/cloud_p0/cache/multi_cluster/warm_up/hotspot/test_warmup_show_stmt_2.groovy +++ b/regression-test/suites/cloud_p0/cache/multi_cluster/warm_up/hotspot/test_warmup_show_stmt_2.groovy @@ -38,7 +38,7 @@ suite("test_warmup_show_stmt_2") { |"exec_mem_limit" = "8589934592", |"load_parallelism" = "3")""".stripMargin() - def load_customer_once = { + def load_customer_once = { def uniqueID = Math.abs(UUID.randomUUID().hashCode()).toString() def loadLabel = table + "_" + uniqueID // load data from cos @@ -84,15 +84,17 @@ suite("test_warmup_show_stmt_2") { log.info(result.toString()) org.junit.Assert.assertTrue("result.size() " + result.size() + " > 0", result.size() > 0) def hotTableName = "regression_test_cloud_p0_cache_multi_cluster_warm_up_hotspot.customer" + def found = false for (int i = 0; i < result.size(); ++i) { if (!result[i].get("TableName").equals(hotTableName)) { - org.junit.Assert.assertTrue(getLineNumber() + "cannot find expected cache hotspot ${hotTableName}", result.size() > i + 1) continue } + found = true assertEquals(result[i].get("ComputeGroupId"), "regression_cluster_id0") assertEquals(result[i].get("ComputeGroupName"), "regression_cluster_name0") assertEquals(result[i].get("TableName"), "regression_test_cloud_p0_cache_multi_cluster_warm_up_hotspot.customer") } + org.junit.Assert.assertTrue(getLineNumber() + "cannot find expected cache hotspot ${hotTableName}", found) result = sql_return_maparray """ show cache hotspot "/regression_cluster_name0" """ log.info(result.toString()) @@ -111,14 +113,16 @@ suite("test_warmup_show_stmt_2") { result = sql_return_maparray """ show cache hotspot "/" """ log.info(result.toString()) org.junit.Assert.assertTrue("result.size() " + result.size() + " > 0", result.size() > 0) + found = false for (int i = 0; i < result.size(); ++i) { if (!result[i].get("TableName").equals(hotTableName)) { - org.junit.Assert.assertTrue("cannot find expected cache hotspot ${hotTableName}", result.size() > i + 1) continue } + found = true assertEquals(result[i].get("ComputeGroupId"), "regression_cluster_id0") assertEquals(result[i].get("ComputeGroupName"), "regression_cluster_name0") assertEquals(result[i].get("TableName"), "regression_test_cloud_p0_cache_multi_cluster_warm_up_hotspot.customer") break } + org.junit.Assert.assertTrue("cannot find expected cache hotspot ${hotTableName}", found) } From 606d0756c92c82d8ec319964a6ff2b9e47c4a1d0 Mon Sep 17 00:00:00 2001 From: zzzxl Date: Tue, 19 Nov 2024 21:12:11 +0800 Subject: [PATCH 40/63] [opt](inverted index) Add troubleshooting logs (#44182) Problem Summary: 1. Occasionally encounter 'No segments* file found' issue, need to add troubleshooting logs. --- be/src/olap/rowset/segment_v2/inverted_index_searcher.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/be/src/olap/rowset/segment_v2/inverted_index_searcher.cpp b/be/src/olap/rowset/segment_v2/inverted_index_searcher.cpp index de8b494cd8be6d..5dfbd984813fd8 100644 --- a/be/src/olap/rowset/segment_v2/inverted_index_searcher.cpp +++ b/be/src/olap/rowset/segment_v2/inverted_index_searcher.cpp @@ -34,6 +34,9 @@ Status FulltextIndexSearcherBuilder::build(lucene::store::Directory* directory, reader = lucene::index::IndexReader::open( directory, config::inverted_index_read_buffer_size, close_directory); } catch (const CLuceneError& e) { + std::vector file_names; + directory->list(&file_names); + LOG(ERROR) << fmt::format("Directory list: {}", fmt::join(file_names, ", ")); std::string msg = "FulltextIndexSearcherBuilder build error: " + std::string(e.what()); if (e.number() == CL_ERR_EmptyIndexSegment) { return Status::Error(msg); From b3cb4809364fe41d61f256ac9e91094ccd6619ae Mon Sep 17 00:00:00 2001 From: Siyang Tang Date: Tue, 19 Nov 2024 21:42:41 +0800 Subject: [PATCH 41/63] [fix](regression-test) Remove docker tag from non docker case `test_dynamic_partition_mod_distribution_key` (#44229) Remove docker tag from non docker case `test_dynamic_partition_mod_distribution_key` ### Release note Remove docker tag from non docker case `test_dynamic_partition_mod_distribution_key` --- .../test_dynamic_partition_mod_distribution_key.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regression-test/suites/partition_p0/dynamic_partition/test_dynamic_partition_mod_distribution_key.groovy b/regression-test/suites/partition_p0/dynamic_partition/test_dynamic_partition_mod_distribution_key.groovy index e3bef5fce10ae9..a2c1e3035a680e 100644 --- a/regression-test/suites/partition_p0/dynamic_partition/test_dynamic_partition_mod_distribution_key.groovy +++ b/regression-test/suites/partition_p0/dynamic_partition/test_dynamic_partition_mod_distribution_key.groovy @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -suite("test_dynamic_partition_mod_distribution_key", "docker") { +suite("test_dynamic_partition_mod_distribution_key") { // FIXME: for historical bugs, this case will fail if adding k2 as dup key or unique key // see in https://github.com/apache/doris/issues/39798 // From ee9252a676a10d14e268139ed6887d5550f8548c Mon Sep 17 00:00:00 2001 From: TengJianPing Date: Wed, 20 Nov 2024 10:27:55 +0800 Subject: [PATCH 42/63] [wg](chore) rename workload group memory property names (#44028) --- .../schema_workload_groups_scanner.cpp | 4 +- .../runtime/workload_group/workload_group.cpp | 42 +++++----- .../runtime/workload_group/workload_group.h | 22 ++--- .../org/apache/doris/catalog/SchemaTable.java | 4 +- .../resource/workloadgroup/WorkloadGroup.java | 84 ++++++++++++------- .../workloadgroup/WorkloadGroupMgr.java | 2 +- gensrc/thrift/BackendService.thrift | 4 +- .../workload_manager_p0/test_curd_wlg.groovy | 50 +++++------ 8 files changed, 116 insertions(+), 96 deletions(-) diff --git a/be/src/exec/schema_scanner/schema_workload_groups_scanner.cpp b/be/src/exec/schema_scanner/schema_workload_groups_scanner.cpp index 43562a8f52cbf1..481360eee90557 100644 --- a/be/src/exec/schema_scanner/schema_workload_groups_scanner.cpp +++ b/be/src/exec/schema_scanner/schema_workload_groups_scanner.cpp @@ -39,8 +39,8 @@ std::vector SchemaWorkloadGroupsScanner::_s_tbls_colu {"SCAN_THREAD_NUM", TYPE_BIGINT, sizeof(int64_t), true}, {"MAX_REMOTE_SCAN_THREAD_NUM", TYPE_BIGINT, sizeof(int64_t), true}, {"MIN_REMOTE_SCAN_THREAD_NUM", TYPE_BIGINT, sizeof(int64_t), true}, - {"SPILL_THRESHOLD_LOW_WATERMARK", TYPE_VARCHAR, sizeof(StringRef), true}, - {"SPILL_THRESHOLD_HIGH_WATERMARK", TYPE_VARCHAR, sizeof(StringRef), true}, + {"MEMORY_LOW_WATERMARK", TYPE_VARCHAR, sizeof(StringRef), true}, + {"MEMORY_HIGH_WATERMARK", TYPE_VARCHAR, sizeof(StringRef), true}, {"TAG", TYPE_VARCHAR, sizeof(StringRef), true}, {"READ_BYTES_PER_SECOND", TYPE_BIGINT, sizeof(int64_t), true}, {"REMOTE_READ_BYTES_PER_SECOND", TYPE_BIGINT, sizeof(int64_t), true}, diff --git a/be/src/runtime/workload_group/workload_group.cpp b/be/src/runtime/workload_group/workload_group.cpp index 4a98a4fa8d8992..f9405de12737dc 100644 --- a/be/src/runtime/workload_group/workload_group.cpp +++ b/be/src/runtime/workload_group/workload_group.cpp @@ -47,8 +47,8 @@ namespace doris { const static std::string MEMORY_LIMIT_DEFAULT_VALUE = "0%"; const static bool ENABLE_MEMORY_OVERCOMMIT_DEFAULT_VALUE = true; const static int CPU_HARD_LIMIT_DEFAULT_VALUE = -1; -const static int SPILL_LOW_WATERMARK_DEFAULT_VALUE = 50; -const static int SPILL_HIGH_WATERMARK_DEFAULT_VALUE = 80; +const static int MEMORY_LOW_WATERMARK_DEFAULT_VALUE = 50; +const static int MEMORY_HIGH_WATERMARK_DEFAULT_VALUE = 80; WorkloadGroup::WorkloadGroup(const WorkloadGroupInfo& wg_info) : WorkloadGroup(wg_info, true) {} @@ -64,8 +64,8 @@ WorkloadGroup::WorkloadGroup(const WorkloadGroupInfo& tg_info, bool need_create_ _scan_thread_num(tg_info.scan_thread_num), _max_remote_scan_thread_num(tg_info.max_remote_scan_thread_num), _min_remote_scan_thread_num(tg_info.min_remote_scan_thread_num), - _spill_low_watermark(tg_info.spill_low_watermark), - _spill_high_watermark(tg_info.spill_high_watermark), + _memory_low_watermark(tg_info.memory_low_watermark), + _memory_high_watermark(tg_info.memory_high_watermark), _scan_bytes_per_second(tg_info.read_bytes_per_second), _remote_scan_bytes_per_second(tg_info.remote_read_bytes_per_second), _need_create_query_thread_pool(need_create_query_thread_pool) { @@ -91,12 +91,12 @@ std::string WorkloadGroup::debug_string() const { "TG[id = {}, name = {}, cpu_share = {}, memory_limit = {}, enable_memory_overcommit = " "{}, version = {}, cpu_hard_limit = {}, scan_thread_num = " "{}, max_remote_scan_thread_num = {}, min_remote_scan_thread_num = {}, " - "spill_low_watermark={}, spill_high_watermark={}, is_shutdown={}, query_num={}, " + "memory_low_watermark={}, memory_high_watermark={}, is_shutdown={}, query_num={}, " "read_bytes_per_second={}, remote_read_bytes_per_second={}]", _id, _name, cpu_share(), PrettyPrinter::print(_memory_limit, TUnit::BYTES), _enable_memory_overcommit ? "true" : "false", _version, cpu_hard_limit(), _scan_thread_num, _max_remote_scan_thread_num, _min_remote_scan_thread_num, - _spill_low_watermark, _spill_high_watermark, _is_shutdown, _query_ctxs.size(), + _memory_low_watermark, _memory_high_watermark, _is_shutdown, _query_ctxs.size(), _scan_bytes_per_second, _remote_scan_bytes_per_second); } @@ -104,14 +104,14 @@ std::string WorkloadGroup::memory_debug_string() const { return fmt::format( "TG[id = {}, name = {}, memory_limit = {}, enable_memory_overcommit = " "{}, weighted_memory_limit = {}, total_mem_used = {}, " - "wg_refresh_interval_memory_growth = {}, spill_low_watermark = {}, " - "spill_high_watermark = {}, version = {}, is_shutdown = {}, query_num = {}]", + "wg_refresh_interval_memory_growth = {}, memory_low_watermark = {}, " + "memory_high_watermark = {}, version = {}, is_shutdown = {}, query_num = {}]", _id, _name, PrettyPrinter::print(_memory_limit, TUnit::BYTES), _enable_memory_overcommit ? "true" : "false", PrettyPrinter::print(_weighted_memory_limit, TUnit::BYTES), PrettyPrinter::print(_total_mem_used, TUnit::BYTES), PrettyPrinter::print(_wg_refresh_interval_memory_growth, TUnit::BYTES), - _spill_low_watermark, _spill_high_watermark, _version, _is_shutdown, + _memory_low_watermark, _memory_high_watermark, _version, _is_shutdown, _query_ctxs.size()); } @@ -137,8 +137,8 @@ void WorkloadGroup::check_and_update(const WorkloadGroupInfo& tg_info) { _scan_thread_num = tg_info.scan_thread_num; _max_remote_scan_thread_num = tg_info.max_remote_scan_thread_num; _min_remote_scan_thread_num = tg_info.min_remote_scan_thread_num; - _spill_low_watermark = tg_info.spill_low_watermark; - _spill_high_watermark = tg_info.spill_high_watermark; + _memory_low_watermark = tg_info.memory_low_watermark; + _memory_high_watermark = tg_info.memory_high_watermark; _scan_bytes_per_second = tg_info.read_bytes_per_second; _remote_scan_bytes_per_second = tg_info.remote_read_bytes_per_second; } else { @@ -396,16 +396,16 @@ WorkloadGroupInfo WorkloadGroupInfo::parse_topic_info( min_remote_scan_thread_num = tworkload_group_info.min_remote_scan_thread_num; } - // 12 spill low watermark - int spill_low_watermark = SPILL_LOW_WATERMARK_DEFAULT_VALUE; - if (tworkload_group_info.__isset.spill_threshold_low_watermark) { - spill_low_watermark = tworkload_group_info.spill_threshold_low_watermark; + // 12 memory low watermark + int memory_low_watermark = MEMORY_LOW_WATERMARK_DEFAULT_VALUE; + if (tworkload_group_info.__isset.memory_low_watermark) { + memory_low_watermark = tworkload_group_info.memory_low_watermark; } - // 13 spil high watermark - int spill_high_watermark = SPILL_HIGH_WATERMARK_DEFAULT_VALUE; - if (tworkload_group_info.__isset.spill_threshold_high_watermark) { - spill_high_watermark = tworkload_group_info.spill_threshold_high_watermark; + // 13 memory high watermark + int memory_high_watermark = MEMORY_HIGH_WATERMARK_DEFAULT_VALUE; + if (tworkload_group_info.__isset.memory_high_watermark) { + memory_high_watermark = tworkload_group_info.memory_high_watermark; } // 14 scan io @@ -433,8 +433,8 @@ WorkloadGroupInfo WorkloadGroupInfo::parse_topic_info( .scan_thread_num = scan_thread_num, .max_remote_scan_thread_num = max_remote_scan_thread_num, .min_remote_scan_thread_num = min_remote_scan_thread_num, - .spill_low_watermark = spill_low_watermark, - .spill_high_watermark = spill_high_watermark, + .memory_low_watermark = memory_low_watermark, + .memory_high_watermark = memory_high_watermark, .read_bytes_per_second = read_bytes_per_second, .remote_read_bytes_per_second = remote_read_bytes_per_second}; } diff --git a/be/src/runtime/workload_group/workload_group.h b/be/src/runtime/workload_group/workload_group.h index 96b8a36df1cfda..fb89ed8101ad49 100644 --- a/be/src/runtime/workload_group/workload_group.h +++ b/be/src/runtime/workload_group/workload_group.h @@ -94,11 +94,11 @@ class WorkloadGroup : public std::enable_shared_from_this { void do_sweep(); - int spill_threshold_low_water_mark() const { - return _spill_low_watermark.load(std::memory_order_relaxed); + int memory_low_watermark() const { + return _memory_low_watermark.load(std::memory_order_relaxed); } - int spill_threashold_high_water_mark() const { - return _spill_high_watermark.load(std::memory_order_relaxed); + int memory_high_watermark() const { + return _memory_high_watermark.load(std::memory_order_relaxed); } void set_weighted_memory_ratio(double ratio); @@ -107,7 +107,7 @@ class WorkloadGroup : public std::enable_shared_from_this { _total_mem_used + _wg_refresh_interval_memory_growth.load() + size; if ((realtime_total_mem_used > ((double)_weighted_memory_limit * - _spill_high_watermark.load(std::memory_order_relaxed) / 100))) { + _memory_high_watermark.load(std::memory_order_relaxed) / 100))) { return false; } else { _wg_refresh_interval_memory_growth.fetch_add(size); @@ -122,10 +122,10 @@ class WorkloadGroup : public std::enable_shared_from_this { auto realtime_total_mem_used = _total_mem_used + _wg_refresh_interval_memory_growth.load(); *is_low_wartermark = (realtime_total_mem_used > ((double)_weighted_memory_limit * - _spill_low_watermark.load(std::memory_order_relaxed) / 100)); + _memory_low_watermark.load(std::memory_order_relaxed) / 100)); *is_high_wartermark = (realtime_total_mem_used > ((double)_weighted_memory_limit * - _spill_high_watermark.load(std::memory_order_relaxed) / 100)); + _memory_high_watermark.load(std::memory_order_relaxed) / 100)); } std::string debug_string() const; @@ -233,8 +233,8 @@ class WorkloadGroup : public std::enable_shared_from_this { std::atomic _scan_thread_num; std::atomic _max_remote_scan_thread_num; std::atomic _min_remote_scan_thread_num; - std::atomic _spill_low_watermark; - std::atomic _spill_high_watermark; + std::atomic _memory_low_watermark; + std::atomic _memory_high_watermark; std::atomic _scan_bytes_per_second {-1}; std::atomic _remote_scan_bytes_per_second {-1}; @@ -282,8 +282,8 @@ struct WorkloadGroupInfo { const int scan_thread_num = 0; const int max_remote_scan_thread_num = 0; const int min_remote_scan_thread_num = 0; - const int spill_low_watermark = 0; - const int spill_high_watermark = 0; + const int memory_low_watermark = 0; + const int memory_high_watermark = 0; const int read_bytes_per_second = -1; const int remote_read_bytes_per_second = -1; // log cgroup cpu info diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/SchemaTable.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/SchemaTable.java index e022cb85296a84..17942dd04a2102 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/SchemaTable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/SchemaTable.java @@ -487,8 +487,8 @@ public class SchemaTable extends Table { .column("SCAN_THREAD_NUM", ScalarType.createType(PrimitiveType.BIGINT)) .column("MAX_REMOTE_SCAN_THREAD_NUM", ScalarType.createType(PrimitiveType.BIGINT)) .column("MIN_REMOTE_SCAN_THREAD_NUM", ScalarType.createType(PrimitiveType.BIGINT)) - .column("SPILL_THRESHOLD_LOW_WATERMARK", ScalarType.createVarchar(256)) - .column("SPILL_THRESHOLD_HIGH_WATERMARK", ScalarType.createVarchar(256)) + .column("MEMORY_LOW_WATERMARK", ScalarType.createVarchar(256)) + .column("MEMORY_HIGH_WATERMARK", ScalarType.createVarchar(256)) .column("TAG", ScalarType.createVarchar(256)) .column("READ_BYTES_PER_SECOND", ScalarType.createType(PrimitiveType.BIGINT)) .column("REMOTE_READ_BYTES_PER_SECOND", ScalarType.createType(PrimitiveType.BIGINT)) diff --git a/fe/fe-core/src/main/java/org/apache/doris/resource/workloadgroup/WorkloadGroup.java b/fe/fe-core/src/main/java/org/apache/doris/resource/workloadgroup/WorkloadGroup.java index 0d5df7ef1cbba8..2bd4a394d84dac 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/resource/workloadgroup/WorkloadGroup.java +++ b/fe/fe-core/src/main/java/org/apache/doris/resource/workloadgroup/WorkloadGroup.java @@ -75,9 +75,9 @@ public class WorkloadGroup implements Writable, GsonPostProcessable { public static final String MIN_REMOTE_SCAN_THREAD_NUM = "min_remote_scan_thread_num"; - public static final String SPILL_THRESHOLD_LOW_WATERMARK = "spill_threshold_low_watermark"; + public static final String MEMORY_LOW_WATERMARK = "memory_low_watermark"; - public static final String SPILL_THRESHOLD_HIGH_WATERMARK = "spill_threshold_high_watermark"; + public static final String MEMORY_HIGH_WATERMARK = "memory_high_watermark"; public static final String TAG = "tag"; @@ -90,6 +90,10 @@ public class WorkloadGroup implements Writable, GsonPostProcessable { // later more type and workload may be included in the future. public static final String INTERNAL_TYPE = "internal_type"; + // deprecated, use MEMORY_LOW_WATERMARK and MEMORY_HIGH_WATERMARK instead. + public static final String SPILL_THRESHOLD_LOW_WATERMARK = "spill_threshold_low_watermark"; + public static final String SPILL_THRESHOLD_HIGH_WATERMARK = "spill_threshold_high_watermark"; + // NOTE(wb): all property is not required, some properties default value is set in be // default value is as followed // cpu_share=1024, memory_limit=0%(0 means not limit), enable_memory_overcommit=true @@ -97,14 +101,19 @@ public class WorkloadGroup implements Writable, GsonPostProcessable { .add(CPU_SHARE).add(MEMORY_LIMIT).add(ENABLE_MEMORY_OVERCOMMIT).add(MAX_CONCURRENCY) .add(MAX_QUEUE_SIZE).add(QUEUE_TIMEOUT).add(CPU_HARD_LIMIT).add(SCAN_THREAD_NUM) .add(MAX_REMOTE_SCAN_THREAD_NUM).add(MIN_REMOTE_SCAN_THREAD_NUM) - .add(SPILL_THRESHOLD_LOW_WATERMARK).add(SPILL_THRESHOLD_HIGH_WATERMARK) + .add(MEMORY_LOW_WATERMARK).add(MEMORY_HIGH_WATERMARK) .add(TAG).add(READ_BYTES_PER_SECOND).add(REMOTE_READ_BYTES_PER_SECOND).add(INTERNAL_TYPE).build(); + private static final ImmutableMap DEPRECATED_PROPERTIES_NAME = + new ImmutableMap.Builder() + .put(SPILL_THRESHOLD_LOW_WATERMARK, MEMORY_LOW_WATERMARK) + .put(SPILL_THRESHOLD_HIGH_WATERMARK, MEMORY_HIGH_WATERMARK).build(); + public static final ImmutableMap WORKLOAD_TYPE_MAP = new ImmutableMap.Builder() .put(TWorkloadType.INTERNAL.toString().toLowerCase(), TWorkloadType.INTERNAL.getValue()).build(); - public static final int SPILL_LOW_WATERMARK_DEFAULT_VALUE = 50; - public static final int SPILL_HIGH_WATERMARK_DEFAULT_VALUE = 80; + public static final int MEMORY_LOW_WATERMARK_DEFAULT_VALUE = 50; + public static final int MEMORY_HIGH_WATERMARK_DEFAULT_VALUE = 80; private static final Map ALL_PROPERTIES_DEFAULT_VALUE_MAP = Maps.newHashMap(); @@ -119,8 +128,8 @@ public class WorkloadGroup implements Writable, GsonPostProcessable { ALL_PROPERTIES_DEFAULT_VALUE_MAP.put(SCAN_THREAD_NUM, "-1"); ALL_PROPERTIES_DEFAULT_VALUE_MAP.put(MAX_REMOTE_SCAN_THREAD_NUM, "-1"); ALL_PROPERTIES_DEFAULT_VALUE_MAP.put(MIN_REMOTE_SCAN_THREAD_NUM, "-1"); - ALL_PROPERTIES_DEFAULT_VALUE_MAP.put(SPILL_THRESHOLD_LOW_WATERMARK, "50%"); - ALL_PROPERTIES_DEFAULT_VALUE_MAP.put(SPILL_THRESHOLD_HIGH_WATERMARK, "80%"); + ALL_PROPERTIES_DEFAULT_VALUE_MAP.put(MEMORY_LOW_WATERMARK, "50%"); + ALL_PROPERTIES_DEFAULT_VALUE_MAP.put(MEMORY_HIGH_WATERMARK, "80%"); ALL_PROPERTIES_DEFAULT_VALUE_MAP.put(TAG, ""); ALL_PROPERTIES_DEFAULT_VALUE_MAP.put(READ_BYTES_PER_SECOND, "-1"); ALL_PROPERTIES_DEFAULT_VALUE_MAP.put(REMOTE_READ_BYTES_PER_SECOND, "-1"); @@ -169,19 +178,19 @@ private WorkloadGroup(long id, String name, Map properties, long this.cpuHardLimit = Integer.parseInt(cpuHardLimitStr); this.properties.put(CPU_HARD_LIMIT, cpuHardLimitStr); } - if (properties.containsKey(SPILL_THRESHOLD_LOW_WATERMARK)) { - String lowWatermarkStr = properties.get(SPILL_THRESHOLD_LOW_WATERMARK); + if (properties.containsKey(MEMORY_LOW_WATERMARK)) { + String lowWatermarkStr = properties.get(MEMORY_LOW_WATERMARK); if (lowWatermarkStr.endsWith("%")) { lowWatermarkStr = lowWatermarkStr.substring(0, lowWatermarkStr.length() - 1); } - this.properties.put(SPILL_THRESHOLD_LOW_WATERMARK, lowWatermarkStr); + this.properties.put(MEMORY_LOW_WATERMARK, lowWatermarkStr); } - if (properties.containsKey(SPILL_THRESHOLD_HIGH_WATERMARK)) { - String highWatermarkStr = properties.get(SPILL_THRESHOLD_HIGH_WATERMARK); + if (properties.containsKey(MEMORY_HIGH_WATERMARK)) { + String highWatermarkStr = properties.get(MEMORY_HIGH_WATERMARK); if (highWatermarkStr.endsWith("%")) { highWatermarkStr = highWatermarkStr.substring(0, highWatermarkStr.length() - 1); } - this.properties.put(SPILL_THRESHOLD_HIGH_WATERMARK, highWatermarkStr); + this.properties.put(MEMORY_HIGH_WATERMARK, highWatermarkStr); } if (properties.containsKey(TAG)) { this.properties.put(TAG, properties.get(TAG).toLowerCase()); @@ -402,9 +411,9 @@ private static void checkProperties(Map properties) throws DdlEx } } - int lowWaterMark = SPILL_LOW_WATERMARK_DEFAULT_VALUE; - if (properties.containsKey(SPILL_THRESHOLD_LOW_WATERMARK)) { - String lowVal = properties.get(SPILL_THRESHOLD_LOW_WATERMARK); + int lowWaterMark = MEMORY_LOW_WATERMARK_DEFAULT_VALUE; + if (properties.containsKey(MEMORY_LOW_WATERMARK)) { + String lowVal = properties.get(MEMORY_LOW_WATERMARK); if (lowVal.endsWith("%")) { lowVal = lowVal.substring(0, lowVal.length() - 1); } @@ -416,15 +425,15 @@ private static void checkProperties(Map properties) throws DdlEx lowWaterMark = intValue; } catch (NumberFormatException e) { throw new DdlException( - "The allowed " + SPILL_THRESHOLD_LOW_WATERMARK + "The allowed " + MEMORY_LOW_WATERMARK + " value is an integer value between 1 and 100, but input value is " + lowVal); } } - int highWaterMark = SPILL_HIGH_WATERMARK_DEFAULT_VALUE; - if (properties.containsKey(SPILL_THRESHOLD_HIGH_WATERMARK)) { - String highVal = properties.get(SPILL_THRESHOLD_HIGH_WATERMARK); + int highWaterMark = MEMORY_HIGH_WATERMARK_DEFAULT_VALUE; + if (properties.containsKey(MEMORY_HIGH_WATERMARK)) { + String highVal = properties.get(MEMORY_HIGH_WATERMARK); if (highVal.endsWith("%")) { highVal = highVal.substring(0, highVal.length() - 1); } @@ -436,15 +445,15 @@ private static void checkProperties(Map properties) throws DdlEx highWaterMark = intValue; } catch (NumberFormatException e) { throw new DdlException( - "The allowed " + SPILL_THRESHOLD_HIGH_WATERMARK + "The allowed " + MEMORY_HIGH_WATERMARK + " value is an integer value between 1 and 100, but input value is " + highVal); } } if (lowWaterMark > highWaterMark) { - throw new DdlException(SPILL_THRESHOLD_HIGH_WATERMARK + "(" + highWaterMark + ") should bigger than " - + SPILL_THRESHOLD_LOW_WATERMARK + "(" + lowWaterMark + ")"); + throw new DdlException(MEMORY_HIGH_WATERMARK + "(" + highWaterMark + ") should bigger than " + + MEMORY_LOW_WATERMARK + "(" + lowWaterMark + ")"); } if (properties.containsKey(READ_BYTES_PER_SECOND)) { @@ -552,8 +561,8 @@ public void getProcNodeData(BaseProcResult result, QueryQueue qq) { if (StringUtils.isEmpty(val)) { row.add(ALL_PROPERTIES_DEFAULT_VALUE_MAP.get(key)); } else if ((CPU_HARD_LIMIT.equals(key) && !"-1".equals(val)) - || SPILL_THRESHOLD_LOW_WATERMARK.equals(key) - || SPILL_THRESHOLD_HIGH_WATERMARK.equals(key)) { + || MEMORY_LOW_WATERMARK.equals(key) + || MEMORY_HIGH_WATERMARK.equals(key)) { row.add(val + "%"); } else { row.add(val); @@ -652,14 +661,14 @@ public TopicInfo toTopicInfo() { tWorkloadGroupInfo.setMinRemoteScanThreadNum(Integer.parseInt(minRemoteScanThreadNumStr)); } - String spillLowWatermarkStr = properties.get(SPILL_THRESHOLD_LOW_WATERMARK); - if (spillLowWatermarkStr != null) { - tWorkloadGroupInfo.setSpillThresholdLowWatermark(Integer.parseInt(spillLowWatermarkStr)); + String memoryLowWatermarkStr = properties.get(MEMORY_LOW_WATERMARK); + if (memoryLowWatermarkStr != null) { + tWorkloadGroupInfo.setMemoryLowWatermark(Integer.parseInt(memoryLowWatermarkStr)); } - String spillHighWatermarkStr = properties.get(SPILL_THRESHOLD_HIGH_WATERMARK); - if (spillHighWatermarkStr != null) { - tWorkloadGroupInfo.setSpillThresholdHighWatermark(Integer.parseInt(spillHighWatermarkStr)); + String memoryHighWatermarkStr = properties.get(MEMORY_HIGH_WATERMARK); + if (memoryHighWatermarkStr != null) { + tWorkloadGroupInfo.setMemoryHighWatermark(Integer.parseInt(memoryHighWatermarkStr)); } String readBytesPerSecStr = properties.get(READ_BYTES_PER_SECOND); @@ -690,7 +699,18 @@ public void write(DataOutput out) throws IOException { public static WorkloadGroup read(DataInput in) throws IOException { String json = Text.readString(in); - return GsonUtils.GSON.fromJson(json, WorkloadGroup.class); + WorkloadGroup workloadGroup = GsonUtils.GSON.fromJson(json, WorkloadGroup.class); + // "spill_threshold_low_watermark" and "spill_threshold_high_watermark" + // are renamed and deprecated, replace them with "memory_low_watermark" + // and "memory_high_watermark" + for (String key : DEPRECATED_PROPERTIES_NAME.keySet()) { + if (workloadGroup.properties.containsKey(key)) { + String value = workloadGroup.properties.get(key); + workloadGroup.properties.remove(key); + workloadGroup.properties.put(DEPRECATED_PROPERTIES_NAME.get(key), value); + } + } + return workloadGroup; } void setMemLimitPercent(Map props) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/resource/workloadgroup/WorkloadGroupMgr.java b/fe/fe-core/src/main/java/org/apache/doris/resource/workloadgroup/WorkloadGroupMgr.java index 31da477912d5e6..5e61f48bec6f2e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/resource/workloadgroup/WorkloadGroupMgr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/resource/workloadgroup/WorkloadGroupMgr.java @@ -85,7 +85,7 @@ public class WorkloadGroupMgr extends MasterDaemon implements Writable, GsonPost .add(WorkloadGroup.QUEUE_TIMEOUT).add(WorkloadGroup.CPU_HARD_LIMIT) .add(WorkloadGroup.SCAN_THREAD_NUM).add(WorkloadGroup.MAX_REMOTE_SCAN_THREAD_NUM) .add(WorkloadGroup.MIN_REMOTE_SCAN_THREAD_NUM) - .add(WorkloadGroup.SPILL_THRESHOLD_LOW_WATERMARK).add(WorkloadGroup.SPILL_THRESHOLD_HIGH_WATERMARK) + .add(WorkloadGroup.MEMORY_LOW_WATERMARK).add(WorkloadGroup.MEMORY_HIGH_WATERMARK) .add(WorkloadGroup.TAG) .add(WorkloadGroup.READ_BYTES_PER_SECOND).add(WorkloadGroup.REMOTE_READ_BYTES_PER_SECOND) .add(QueryQueue.RUNNING_QUERY_NUM).add(QueryQueue.WAITING_QUERY_NUM) diff --git a/gensrc/thrift/BackendService.thrift b/gensrc/thrift/BackendService.thrift index 533999a853ff38..7f073b2b71095a 100644 --- a/gensrc/thrift/BackendService.thrift +++ b/gensrc/thrift/BackendService.thrift @@ -265,8 +265,8 @@ struct TWorkloadGroupInfo { 9: optional i32 scan_thread_num 10: optional i32 max_remote_scan_thread_num 11: optional i32 min_remote_scan_thread_num - 12: optional i32 spill_threshold_low_watermark - 13: optional i32 spill_threshold_high_watermark + 12: optional i32 memory_low_watermark + 13: optional i32 memory_high_watermark 14: optional i64 read_bytes_per_second 15: optional i64 remote_read_bytes_per_second 16: optional string tag diff --git a/regression-test/suites/workload_manager_p0/test_curd_wlg.groovy b/regression-test/suites/workload_manager_p0/test_curd_wlg.groovy index 8eb6b7d92a7eb2..5c3e0aafe76857 100644 --- a/regression-test/suites/workload_manager_p0/test_curd_wlg.groovy +++ b/regression-test/suites/workload_manager_p0/test_curd_wlg.groovy @@ -441,71 +441,71 @@ suite("test_crud_wlg") { // test workload spill property // 1 create group test { - sql "create workload group if not exists spill_group_test_failed properties ( 'spill_threshold_low_watermark'='90%');" - exception "should bigger than spill_threshold_low_watermark" + sql "create workload group if not exists spill_group_test_failed properties ( 'memory_low_watermark'='90%');" + exception "should bigger than memory_low_watermark" } - sql "create workload group if not exists spill_group_test properties ( 'spill_threshold_low_watermark'='10%','spill_threshold_high_watermark'='10%');" - qt_show_spill_1 "select name,cpu_share,memory_limit,enable_memory_overcommit,max_concurrency,max_queue_size,queue_timeout,cpu_hard_limit,scan_thread_num,spill_threshold_low_watermark,spill_threshold_high_watermark from information_schema.workload_groups where name in ('spill_group_test');" + sql "create workload group if not exists spill_group_test properties ( 'memory_low_watermark'='10%','memory_high_watermark'='10%');" + qt_show_spill_1 "select name,cpu_share,memory_limit,enable_memory_overcommit,max_concurrency,max_queue_size,queue_timeout,cpu_hard_limit,scan_thread_num,memory_low_watermark,memory_high_watermark from information_schema.workload_groups where name in ('spill_group_test');" test { - sql "create workload group if not exists spill_group_test properties ( 'spill_threshold_low_watermark'='20%','spill_threshold_high_watermark'='10%');" - exception "should bigger than spill_threshold_low_watermark" + sql "create workload group if not exists spill_group_test properties ( 'memory_low_watermark'='20%','memory_high_watermark'='10%');" + exception "should bigger than memory_low_watermark" } // 2 alter low - sql "alter workload group spill_group_test properties ( 'spill_threshold_low_watermark'='5%' );" - qt_show_spill_2 "select name,cpu_share,memory_limit,enable_memory_overcommit,max_concurrency,max_queue_size,queue_timeout,cpu_hard_limit,scan_thread_num,spill_threshold_low_watermark,spill_threshold_high_watermark from information_schema.workload_groups where name in ('spill_group_test');" + sql "alter workload group spill_group_test properties ( 'memory_low_watermark'='5%' );" + qt_show_spill_2 "select name,cpu_share,memory_limit,enable_memory_overcommit,max_concurrency,max_queue_size,queue_timeout,cpu_hard_limit,scan_thread_num,memory_low_watermark,memory_high_watermark from information_schema.workload_groups where name in ('spill_group_test');" test { - sql "alter workload group spill_group_test properties ( 'spill_threshold_low_watermark'='20%' );" - exception "should bigger than spill_threshold_low_watermark" + sql "alter workload group spill_group_test properties ( 'memory_low_watermark'='20%' );" + exception "should bigger than memory_low_watermark" } test { - sql "alter workload group spill_group_test properties ( 'spill_threshold_low_watermark'='0%' );" + sql "alter workload group spill_group_test properties ( 'memory_low_watermark'='0%' );" exception "value is an integer value between 1 and 100" } test { - sql "alter workload group spill_group_test properties ( 'spill_threshold_low_watermark'='101%' );" + sql "alter workload group spill_group_test properties ( 'memory_low_watermark'='101%' );" exception "value is an integer value between 1 and 100" } test { - sql "create workload group if not exists spill_group_test2 properties ( 'spill_threshold_low_watermark'='0%')" + sql "create workload group if not exists spill_group_test2 properties ( 'memory_low_watermark'='0%')" exception "value is an integer value between 1 and 100" } test { - sql "create workload group if not exists spill_group_test2 properties ( 'spill_threshold_low_watermark'='101%')" + sql "create workload group if not exists spill_group_test2 properties ( 'memory_low_watermark'='101%')" exception "value is an integer value between 1 and 100" } // 3 alter high - sql "alter workload group spill_group_test properties ( 'spill_threshold_high_watermark'='40%' );" - qt_show_spill_3 "select name,cpu_share,memory_limit,enable_memory_overcommit,max_concurrency,max_queue_size,queue_timeout,cpu_hard_limit,scan_thread_num,spill_threshold_low_watermark,spill_threshold_high_watermark from information_schema.workload_groups where name in ('spill_group_test');" + sql "alter workload group spill_group_test properties ( 'memory_high_watermark'='40%' );" + qt_show_spill_3 "select name,cpu_share,memory_limit,enable_memory_overcommit,max_concurrency,max_queue_size,queue_timeout,cpu_hard_limit,scan_thread_num,memory_low_watermark,memory_high_watermark from information_schema.workload_groups where name in ('spill_group_test');" test { - sql "alter workload group spill_group_test properties ( 'spill_threshold_high_watermark'='1%' );" - exception "should bigger than spill_threshold_low_watermark" + sql "alter workload group spill_group_test properties ( 'memory_high_watermark'='1%' );" + exception "should bigger than memory_low_watermark" } test { - sql "alter workload group spill_group_test properties ( 'spill_threshold_high_watermark'='0%' );" + sql "alter workload group spill_group_test properties ( 'memory_high_watermark'='0%' );" exception "value is an integer value between 1 and 100" } test { - sql "alter workload group spill_group_test properties ( 'spill_threshold_high_watermark'='101%' );" + sql "alter workload group spill_group_test properties ( 'memory_high_watermark'='101%' );" exception "value is an integer value between 1 and 100" } test { - sql "create workload group if not exists spill_group_test2 properties ( 'spill_threshold_high_watermark'='0%')" + sql "create workload group if not exists spill_group_test2 properties ( 'memory_high_watermark'='0%')" exception "value is an integer value between 1 and 100" } test { - sql "create workload group if not exists spill_group_test2 properties ( 'spill_threshold_high_watermark'='101%')" + sql "create workload group if not exists spill_group_test2 properties ( 'memory_high_watermark'='101%')" exception "value is an integer value between 1 and 100" } @@ -744,7 +744,7 @@ suite("test_crud_wlg") { // test default value sql "drop workload group if exists default_val_wg" sql "create workload group default_val_wg properties('enable_memory_overcommit'='true');" - qt_select_default_val_wg_1 "select name,cpu_share,memory_limit,enable_memory_overcommit,max_concurrency,max_queue_size,queue_timeout,cpu_hard_limit,scan_thread_num,max_remote_scan_thread_num,min_remote_scan_thread_num,spill_threshold_low_watermark,spill_threshold_high_watermark,tag,read_bytes_per_second,remote_read_bytes_per_second from information_schema.workload_groups where name = 'default_val_wg'" + qt_select_default_val_wg_1 "select name,cpu_share,memory_limit,enable_memory_overcommit,max_concurrency,max_queue_size,queue_timeout,cpu_hard_limit,scan_thread_num,max_remote_scan_thread_num,min_remote_scan_thread_num,memory_low_watermark,memory_high_watermark,tag,read_bytes_per_second,remote_read_bytes_per_second from information_schema.workload_groups where name = 'default_val_wg'" sql """ alter workload group default_val_wg properties( @@ -763,7 +763,7 @@ suite("test_crud_wlg") { 'remote_read_bytes_per_second'='10'); """ - qt_select_default_val_wg_2 "select name,cpu_share,memory_limit,enable_memory_overcommit,max_concurrency,max_queue_size,queue_timeout,cpu_hard_limit,scan_thread_num,max_remote_scan_thread_num,min_remote_scan_thread_num,spill_threshold_low_watermark,spill_threshold_high_watermark,tag,read_bytes_per_second,remote_read_bytes_per_second from information_schema.workload_groups where name = 'default_val_wg'" + qt_select_default_val_wg_2 "select name,cpu_share,memory_limit,enable_memory_overcommit,max_concurrency,max_queue_size,queue_timeout,cpu_hard_limit,scan_thread_num,max_remote_scan_thread_num,min_remote_scan_thread_num,memory_low_watermark,memory_high_watermark,tag,read_bytes_per_second,remote_read_bytes_per_second from information_schema.workload_groups where name = 'default_val_wg'" sql """ alter workload group default_val_wg properties( @@ -783,7 +783,7 @@ suite("test_crud_wlg") { ); """ - qt_select_default_val_wg_3 "select name,cpu_share,memory_limit,enable_memory_overcommit,max_concurrency,max_queue_size,queue_timeout,cpu_hard_limit,scan_thread_num,max_remote_scan_thread_num,min_remote_scan_thread_num,spill_threshold_low_watermark,spill_threshold_high_watermark,tag,read_bytes_per_second,remote_read_bytes_per_second from information_schema.workload_groups where name = 'default_val_wg'" + qt_select_default_val_wg_3 "select name,cpu_share,memory_limit,enable_memory_overcommit,max_concurrency,max_queue_size,queue_timeout,cpu_hard_limit,scan_thread_num,max_remote_scan_thread_num,min_remote_scan_thread_num,memory_low_watermark,memory_high_watermark,tag,read_bytes_per_second,remote_read_bytes_per_second from information_schema.workload_groups where name = 'default_val_wg'" sql "drop workload group if exists default_val_wg" From 946b4ae9d0201042e02f956938baa68973dc522f Mon Sep 17 00:00:00 2001 From: zhangdong Date: Wed, 20 Nov 2024 10:58:06 +0800 Subject: [PATCH 43/63] [enhance](mtmv)MTMV no longer generate cache when replaying logs (#44283) ### What problem does this PR solve? When replaying logs, cache will no longer be generated because the catalog may not have been initialized or the dependent environment may not be connected, causing it to freeze here and preventing FE from starting The cost is that after the materialized view is refreshed, the cache of the follower node will be empty, and a cache will be generated when the query is first used Problem Summary: MTMV no longer generate cache when replaying logs --- .../src/main/java/org/apache/doris/alter/Alter.java | 3 ++- .../src/main/java/org/apache/doris/catalog/MTMV.java | 10 +++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java b/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java index 2b213d0558385a..15c8df9195ddf1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java @@ -1022,7 +1022,8 @@ public void processAlterMTMV(AlterMTMV alterMTMV, boolean isReplay) { mtmv.alterMvProperties(alterMTMV.getMvProperties()); break; case ADD_TASK: - mtmv.addTaskResult(alterMTMV.getTask(), alterMTMV.getRelation(), alterMTMV.getPartitionSnapshots()); + mtmv.addTaskResult(alterMTMV.getTask(), alterMTMV.getRelation(), alterMTMV.getPartitionSnapshots(), + isReplay); break; default: throw new RuntimeException("Unknown type value: " + alterMTMV.getOpType()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/MTMV.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/MTMV.java index b0d25ad2b252b2..955bfd4279fd5c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/MTMV.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/MTMV.java @@ -190,15 +190,19 @@ public MTMVStatus alterStatus(MTMVStatus newStatus) { } public void addTaskResult(MTMVTask task, MTMVRelation relation, - Map partitionSnapshots) { + Map partitionSnapshots, boolean isReplay) { MTMVCache mtmvCache = null; boolean needUpdateCache = false; if (task.getStatus() == TaskStatus.SUCCESS && !Env.isCheckpointThread() && !Config.enable_check_compatibility_mode) { needUpdateCache = true; try { - // shouldn't do this while holding mvWriteLock - mtmvCache = MTMVCache.from(this, MTMVPlanUtil.createMTMVContext(this), true); + // The replay thread may not have initialized the catalog yet to avoid getting stuck due + // to connection issues such as S3, so it is directly set to null + if (!isReplay) { + // shouldn't do this while holding mvWriteLock + mtmvCache = MTMVCache.from(this, MTMVPlanUtil.createMTMVContext(this), true); + } } catch (Throwable e) { mtmvCache = null; LOG.warn("generate cache failed", e); From 50a89d5d2306d0709caefb661e7c3ce501ab6607 Mon Sep 17 00:00:00 2001 From: Sridhar R Manikarnike Date: Wed, 20 Nov 2024 09:50:12 +0530 Subject: [PATCH 44/63] [Enhancement] (nereids)implement showCreateTableCommand in nereids (#43137) Issue Number: close #42736 implement showCreateTableCommand in nereids --- .../org/apache/doris/nereids/DorisParser.g4 | 2 +- .../nereids/parser/LogicalPlanBuilder.java | 8 + .../doris/nereids/trees/plans/PlanType.java | 1 + .../commands/ShowCreateTableCommand.java | 152 ++++++++++++++++++ .../trees/plans/visitor/CommandVisitor.java | 5 + .../test_show_create_table_nereids.groovy | 63 ++++++++ 6 files changed, 230 insertions(+), 1 deletion(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowCreateTableCommand.java create mode 100644 regression-test/suites/nereids_p0/show/test_show_create_table_nereids.groovy 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 37c9be99177fb3..b18322cc440bb3 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 @@ -207,6 +207,7 @@ supportedShowStatement ((FROM | IN) database=identifier)? #showView | SHOW PLUGINS #showPlugins | SHOW REPOSITORIES #showRepositories + | SHOW BRIEF? CREATE TABLE name=multipartIdentifier #showCreateTable | SHOW ROLES #showRoles | SHOW PARTITION partitionId=INTEGER_VALUE #showPartitionId | SHOW PRIVILEGES #showPrivileges @@ -263,7 +264,6 @@ unsupportedShowStatement | SHOW (GLOBAL | SESSION | LOCAL)? STATUS wildWhere? #showStatus | SHOW FULL? TRIGGERS ((FROM | IN) database=multipartIdentifier)? wildWhere? #showTriggers | SHOW EVENTS ((FROM | IN) database=multipartIdentifier)? wildWhere? #showEvents - | SHOW BRIEF? CREATE TABLE name=multipartIdentifier #showCreateTable | SHOW CREATE VIEW name=multipartIdentifier #showCreateView | SHOW CREATE MATERIALIZED VIEW name=multipartIdentifier #showMaterializedView | SHOW CREATE (DATABASE | SCHEMA) name=multipartIdentifier #showCreateDatabase 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 32f85a52a1282f..491857858b0beb 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 @@ -202,6 +202,7 @@ import org.apache.doris.nereids.DorisParser.ShowCreateMTMVContext; import org.apache.doris.nereids.DorisParser.ShowCreateMaterializedViewContext; import org.apache.doris.nereids.DorisParser.ShowCreateProcedureContext; +import org.apache.doris.nereids.DorisParser.ShowCreateTableContext; import org.apache.doris.nereids.DorisParser.ShowFrontendsContext; import org.apache.doris.nereids.DorisParser.ShowGrantsContext; import org.apache.doris.nereids.DorisParser.ShowGrantsForUserContext; @@ -453,6 +454,7 @@ import org.apache.doris.nereids.trees.plans.commands.ShowCreateMTMVCommand; import org.apache.doris.nereids.trees.plans.commands.ShowCreateMaterializedViewCommand; import org.apache.doris.nereids.trees.plans.commands.ShowCreateProcedureCommand; +import org.apache.doris.nereids.trees.plans.commands.ShowCreateTableCommand; import org.apache.doris.nereids.trees.plans.commands.ShowFrontendsCommand; import org.apache.doris.nereids.trees.plans.commands.ShowGrantsCommand; import org.apache.doris.nereids.trees.plans.commands.ShowLastInsertCommand; @@ -4176,6 +4178,12 @@ public LogicalPlan visitShowStorageEngines(ShowStorageEnginesContext ctx) { return new ShowStorageEnginesCommand(); } + @Override + public LogicalPlan visitShowCreateTable(ShowCreateTableContext ctx) { + List nameParts = visitMultipartIdentifier(ctx.name); + return new ShowCreateTableCommand(new TableNameInfo(nameParts), ctx.BRIEF() != null); + } + @Override public LogicalPlan visitShowCreateMaterializedView(ShowCreateMaterializedViewContext ctx) { List nameParts = visitMultipartIdentifier(ctx.tableName); 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 8f68cd7287efd6..377bd4ce880bc6 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 @@ -181,6 +181,7 @@ public enum PlanType { SHOW_BLOCK_RULE_COMMAND, SHOW_CONFIG_COMMAND, SHOW_CREATE_MATERIALIZED_VIEW_COMMAND, + SHOW_CREATE_TABLE_COMMAND, SHOW_FRONTENDS_COMMAND, SHOW_GRANTS_COMMAND, SHOW_LAST_INSERT_COMMAND, diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowCreateTableCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowCreateTableCommand.java new file mode 100644 index 00000000000000..c0aeaad1d5d132 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowCreateTableCommand.java @@ -0,0 +1,152 @@ +// 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.commands; + +import org.apache.doris.catalog.Column; +import org.apache.doris.catalog.DatabaseIf; +import org.apache.doris.catalog.Env; +import org.apache.doris.catalog.MTMV; +import org.apache.doris.catalog.ScalarType; +import org.apache.doris.catalog.Table; +import org.apache.doris.catalog.TableIf; +import org.apache.doris.catalog.View; +import org.apache.doris.common.AnalysisException; +import org.apache.doris.common.ErrorCode; +import org.apache.doris.common.ErrorReport; +import org.apache.doris.datasource.hive.HMSExternalTable; +import org.apache.doris.datasource.hive.HiveMetaStoreClientHelper; +import org.apache.doris.mysql.privilege.PrivPredicate; +import org.apache.doris.nereids.trees.plans.PlanType; +import org.apache.doris.nereids.trees.plans.commands.info.TableNameInfo; +import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor; +import org.apache.doris.qe.ConnectContext; +import org.apache.doris.qe.ShowResultSet; +import org.apache.doris.qe.ShowResultSetMetaData; +import org.apache.doris.qe.StmtExecutor; + +import com.google.common.collect.Lists; + +import java.util.Arrays; +import java.util.List; + +/** + * Represents the command for SHOW CREATE TABLE. + */ +public class ShowCreateTableCommand extends ShowCommand { + private static final ShowResultSetMetaData META_DATA = + ShowResultSetMetaData.builder() + .addColumn(new Column("Table", ScalarType.createVarchar(20))) + .addColumn(new Column("Create Table", ScalarType.createVarchar(30))) + .build(); + + private static final ShowResultSetMetaData VIEW_META_DATA = + ShowResultSetMetaData.builder() + .addColumn(new Column("View", ScalarType.createVarchar(20))) + .addColumn(new Column("Create View", ScalarType.createVarchar(30))) + .addColumn(new Column("character_set_client", ScalarType.createVarchar(30))) + .addColumn(new Column("collation_connection", ScalarType.createVarchar(30))) + .build(); + + private static final ShowResultSetMetaData MATERIALIZED_VIEW_META_DATA = + ShowResultSetMetaData.builder() + .addColumn(new Column("Materialized View", ScalarType.createVarchar(20))) + .addColumn(new Column("Create Materialized View", ScalarType.createVarchar(30))) + .build(); + + private final TableNameInfo tblNameInfo; + private final boolean isBrief; + + public ShowCreateTableCommand(TableNameInfo tableNameInfo, boolean isBrief) { + super(PlanType.SHOW_CREATE_TABLE_COMMAND); + this.tblNameInfo = tableNameInfo; + this.isBrief = isBrief; + } + + private void validate(ConnectContext ctx) throws AnalysisException { + tblNameInfo.analyze(ctx); + + TableIf tableIf = Env.getCurrentEnv().getCatalogMgr() + .getCatalogOrAnalysisException(tblNameInfo.getCtl()) + .getDbOrAnalysisException(tblNameInfo.getDb()).getTableOrAnalysisException(tblNameInfo.getTbl()); + + if (tableIf instanceof MTMV) { + ErrorReport.reportAnalysisException("not support async materialized view, " + + "please use `show create materialized view`"); + } + + PrivPredicate wanted; + if (tableIf instanceof View) { + wanted = PrivPredicate.SHOW_VIEW; + } else { + wanted = PrivPredicate.SHOW; + } + + if (!Env.getCurrentEnv().getAccessManager().checkTblPriv(ConnectContext.get(), + tblNameInfo.getCtl(), tblNameInfo.getDb(), tblNameInfo.getTbl(), wanted)) { + ErrorReport.reportAnalysisException(ErrorCode.ERR_TABLEACCESS_DENIED_ERROR, "SHOW CREATE TABLE", + ConnectContext.get().getQualifiedUser(), + ConnectContext.get().getRemoteIP(), + tblNameInfo.getDb() + ": " + tblNameInfo.getTbl()); + } + } + + @Override + public R accept(PlanVisitor visitor, C context) { + return visitor.visitShowCreateTableCommand(this, context); + } + + @Override + public ShowResultSet doRun(ConnectContext ctx, StmtExecutor executor) throws Exception { + validate(ctx); + + // Fetch the catalog, database, and table metadata + DatabaseIf db = ctx.getEnv().getCatalogMgr().getCatalogOrAnalysisException(tblNameInfo.getCtl()) + .getDbOrMetaException(tblNameInfo.getDb()); + TableIf table = db.getTableOrMetaException(tblNameInfo.getTbl()); + + List> rows = Lists.newArrayList(); + + table.readLock(); + try { + if (table.getType() == Table.TableType.HMS_EXTERNAL_TABLE) { + rows.add(Arrays.asList(table.getName(), + HiveMetaStoreClientHelper.showCreateTable(((HMSExternalTable) table).getRemoteTable()))); + return new ShowResultSet(META_DATA, rows); + } + List createTableStmt = Lists.newArrayList(); + Env.getDdlStmt(null, null, table, createTableStmt, null, null, false, + true /* hide password */, false, -1L, isBrief, false); + if (createTableStmt.isEmpty()) { + return new ShowResultSet(META_DATA, rows); + } + + if (table instanceof View) { + rows.add(Lists.newArrayList(table.getName(), createTableStmt.get(0), "utf8mb4", "utf8mb4_0900_bin")); + return new ShowResultSet(VIEW_META_DATA, rows); + } else { + rows.add(Lists.newArrayList(table.getName(), createTableStmt.get(0))); + return (table.getType() != Table.TableType.MATERIALIZED_VIEW + ? new ShowResultSet(META_DATA, rows) + : new ShowResultSet(MATERIALIZED_VIEW_META_DATA, rows)); + } + } finally { + table.readUnlock(); + } + } + +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java index d80a24cd347172..2959f3f8a56793 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java @@ -57,6 +57,7 @@ import org.apache.doris.nereids.trees.plans.commands.ShowCreateMTMVCommand; import org.apache.doris.nereids.trees.plans.commands.ShowCreateMaterializedViewCommand; import org.apache.doris.nereids.trees.plans.commands.ShowCreateProcedureCommand; +import org.apache.doris.nereids.trees.plans.commands.ShowCreateTableCommand; import org.apache.doris.nereids.trees.plans.commands.ShowFrontendsCommand; import org.apache.doris.nereids.trees.plans.commands.ShowGrantsCommand; import org.apache.doris.nereids.trees.plans.commands.ShowLastInsertCommand; @@ -287,6 +288,10 @@ default R visitShowBackendsCommand(ShowBackendsCommand showBackendsCommand, C co return visitCommand(showBackendsCommand, context); } + default R visitShowCreateTableCommand(ShowCreateTableCommand showCreateTableCommand, C context) { + return visitCommand(showCreateTableCommand, context); + } + default R visitShowSqlBlockRuleCommand(ShowSqlBlockRuleCommand showblockruleCommand, C context) { return visitCommand(showblockruleCommand, context); } diff --git a/regression-test/suites/nereids_p0/show/test_show_create_table_nereids.groovy b/regression-test/suites/nereids_p0/show/test_show_create_table_nereids.groovy new file mode 100644 index 00000000000000..53f2242d1fa7f6 --- /dev/null +++ b/regression-test/suites/nereids_p0/show/test_show_create_table_nereids.groovy @@ -0,0 +1,63 @@ +// 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_show_create_table_nereids", "query,arrow_flight_sql") { + String tb_name = "tb_show_create_table"; + try { + sql """drop table if exists ${tb_name} """ + sql """ + CREATE TABLE IF NOT EXISTS ${tb_name}( + datek1 datev2 COMMENT "a", + datetimek1 datetimev2 COMMENT "b", + datetimek2 datetimev2(3) COMMENT "c", + datetimek3 datetimev2(6) COMMENT "d", + datev1 datev2 MAX NOT NULL COMMENT "e", + datetimev1 datetimev2 MAX NOT NULL COMMENT "f", + datetimev2 datetimev2(3) MAX NOT NULL COMMENT "g", + datetimev3 datetimev2(6) MAX NOT NULL COMMENT "h" + ) + AGGREGATE KEY (datek1, datetimek1, datetimek2, datetimek3) + DISTRIBUTED BY HASH(datek1) BUCKETS 5 properties("replication_num" = "1"); + """ + + def res = sql "show create table `${tb_name}`" + assertTrue(res.size() != 0) + + sql """drop table if exists ${tb_name} """ + sql """ + CREATE TABLE IF NOT EXISTS ${tb_name}( + datek1 datev2 COMMENT "a", + datetimek1 datetimev2 COMMENT "b", + datetimek2 datetimev2(3) COMMENT "c", + datetimek3 datetimev2(6) COMMENT "d", + datev1 datev2 NOT NULL COMMENT "e", + datetimev1 datetimev2 NOT NULL COMMENT "f", + datetimev2 datetimev2(3) NOT NULL COMMENT "g", + datetimev3 datetimev2(6) NOT NULL COMMENT "h" + ) + DUPLICATE KEY (datek1, datetimek1, datetimek2, datetimek3) + DISTRIBUTED BY RANDOM BUCKETS 5 properties("replication_num" = "1"); + """ + + checkNereidsExecute("""show create table `${tb_name}`;""") + + } finally { + + try_sql("DROP TABLE IF EXISTS `${tb_name}`") + } + +} From d7c0711012e0bc3c41e187546ec5316fc0aae2a1 Mon Sep 17 00:00:00 2001 From: zclllhhjj Date: Wed, 20 Nov 2024 12:48:58 +0800 Subject: [PATCH 45/63] [Fix](debug) Support dump const nullable Column from Block (#44029) ### What problem does this PR solve? Issue Number: close #xxx Related PR: https://github.com/apache/doris/pull/41175 --- be/src/vec/columns/column.h | 4 +++- be/src/vec/columns/column_const.h | 3 ++- be/src/vec/columns/column_nullable.h | 1 + be/src/vec/core/block.cpp | 17 +++++++---------- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/be/src/vec/columns/column.h b/be/src/vec/columns/column.h index 975827bd13ea9f..ce155aefad2321 100644 --- a/be/src/vec/columns/column.h +++ b/be/src/vec/columns/column.h @@ -570,8 +570,10 @@ class IColumn : public COW { /// Various properties on behaviour of column type. - /// True if column contains something nullable inside. It's true for ColumnNullable, can be true or false for ColumnConst, etc. + /// It's true for ColumnNullable only. virtual bool is_nullable() const { return false; } + /// It's true for ColumnNullable, can be true or false for ColumnConst, etc. + virtual bool is_concrete_nullable() const { return false; } virtual bool is_bitmap() const { return false; } diff --git a/be/src/vec/columns/column_const.h b/be/src/vec/columns/column_const.h index d1d9c6e047b15e..980d9d64148ae4 100644 --- a/be/src/vec/columns/column_const.h +++ b/be/src/vec/columns/column_const.h @@ -259,7 +259,8 @@ class ColumnConst final : public COWHelper { return false; } - // bool is_nullable() const override { return is_column_nullable(*data); } + // ColumnConst is not nullable, but may be concrete nullable. + bool is_concrete_nullable() const override { return is_column_nullable(*data); } bool only_null() const override { return data->is_null_at(0); } bool is_numeric() const override { return data->is_numeric(); } bool is_fixed_and_contiguous() const override { return data->is_fixed_and_contiguous(); } diff --git a/be/src/vec/columns/column_nullable.h b/be/src/vec/columns/column_nullable.h index 6096fd4b66965a..0e5e104dce9a8d 100644 --- a/be/src/vec/columns/column_nullable.h +++ b/be/src/vec/columns/column_nullable.h @@ -332,6 +332,7 @@ class ColumnNullable final : public COWHelper, public N void set_datetime_type() override { get_nested_column().set_datetime_type(); } bool is_nullable() const override { return true; } + bool is_concrete_nullable() const override { return true; } bool is_bitmap() const override { return get_nested_column().is_bitmap(); } bool is_hll() const override { return get_nested_column().is_hll(); } bool is_column_decimal() const override { return get_nested_column().is_column_decimal(); } diff --git a/be/src/vec/core/block.cpp b/be/src/vec/core/block.cpp index b15b83cf77ea9c..6083be0287738e 100644 --- a/be/src/vec/core/block.cpp +++ b/be/src/vec/core/block.cpp @@ -509,16 +509,13 @@ std::string Block::dump_data(size_t begin, size_t row_limit, bool allow_null_mis continue; } std::string s; - if (data[i].column) { - if (data[i].type->is_nullable() && !data[i].column->is_nullable()) { - if (is_column_const(*data[i].column)) { - s = data[i].to_string(0); - } else { - assert(allow_null_mismatch); - s = assert_cast(data[i].type.get()) - ->get_nested_type() - ->to_string(*data[i].column, row_num); - } + if (data[i].column) { // column may be const + // for code inside `default_implementation_for_nulls`, there's could have: type = null, col != null + if (data[i].type->is_nullable() && !data[i].column->is_concrete_nullable()) { + assert(allow_null_mismatch); + s = assert_cast(data[i].type.get()) + ->get_nested_type() + ->to_string(*data[i].column, row_num); } else { s = data[i].to_string(row_num); } From 5260a987eb96d6dd7ae158417a161eb58e4c7036 Mon Sep 17 00:00:00 2001 From: zclllhhjj Date: Wed, 20 Nov 2024 12:49:28 +0800 Subject: [PATCH 46/63] [Enhancement](tools) Introduce new BE benchmark and remove old one (#44181) ### What problem does this PR solve? Issue Number: close #xxx Related PR: #xxx Problem Summary: the old be-benchmark has been not maintained for long time. now it's time to drop it. in this pr we split google-benchmark as a individual component rather than in be-ut. replace https://github.com/apache/doris/pull/41180 To get closest to the actual test results, we compile the executable with the entire BE binary (so that binary bloat, etc. is consistent with the actual BE) and start it with `start_be.sh`, so that jemalloc, etc. conditions are also consistent. usage: ```bash ./build.sh --benchmark ...... be/bin/start_be.sh --benchmark ``` --- be/CMakeLists.txt | 61 +++-- be/benchmark/benchmark_main.cpp | 52 ++++ be/src/runtime/memory/jemalloc_hook.cpp | 2 +- be/src/service/CMakeLists.txt | 2 +- be/test/CMakeLists.txt | 11 - be/test/tools/benchmark_tool.cpp | 320 ------------------------ bin/start_be.sh | 17 +- build.sh | 21 ++ 8 files changed, 128 insertions(+), 358 deletions(-) create mode 100644 be/benchmark/benchmark_main.cpp delete mode 100644 be/test/tools/benchmark_tool.cpp diff --git a/be/CMakeLists.txt b/be/CMakeLists.txt index 1d79048f96511c..d476af8e2110df 100644 --- a/be/CMakeLists.txt +++ b/be/CMakeLists.txt @@ -130,6 +130,8 @@ message(STATUS "THIRDPARTY_DIR is ${THIRDPARTY_DIR}") option(MAKE_TEST "ON for make unit test or OFF for not" OFF) message(STATUS "make test: ${MAKE_TEST}") +option(BUILD_BENCHMARK "ON for make google benchmark or OFF for not" OFF) +message(STATUS "make benchmark: ${BUILD_BENCHMARK}") option(WITH_MYSQL "Support access MySQL" ON) @@ -568,7 +570,7 @@ if (OS_MACOSX) ) endif() -if (MAKE_TEST) +if (BUILD_BENCHMARK) set(COMMON_THIRDPARTY ${COMMON_THIRDPARTY} benchmark @@ -708,6 +710,11 @@ if (MAKE_TEST) endif() endif () +# use this to avoid some runtime tracker. reuse BE_TEST symbol, no need another. +if (BUILD_BENCHMARK) + add_definitions(-DBE_TEST) +endif() + get_directory_property(COMPILER_FLAGS COMPILE_OPTIONS) get_directory_property(COMPILER_DEFINES COMPILE_DEFINITIONS) message(STATUS "Compiler: ${CMAKE_CXX_COMPILER_ID}-${CMAKE_CXX_COMPILER_VERSION}") @@ -754,7 +761,7 @@ add_subdirectory(${SRC_DIR}/http) add_subdirectory(${SRC_DIR}/io) add_subdirectory(${SRC_DIR}/olap) add_subdirectory(${SRC_DIR}/runtime) -add_subdirectory(${SRC_DIR}/service) +add_subdirectory(${SRC_DIR}/service) # this include doris_be add_subdirectory(${SRC_DIR}/udf) add_subdirectory(${SRC_DIR}/cloud) @@ -772,36 +779,44 @@ add_subdirectory(${SRC_DIR}/util) add_subdirectory(${SRC_DIR}/vec) add_subdirectory(${SRC_DIR}/pipeline) +# this include doris_be_test if (MAKE_TEST) add_subdirectory(${TEST_DIR}) endif () add_subdirectory(${COMMON_SRC_DIR}/cpp ${BUILD_DIR}/src/common_cpp) -# Install be -install(DIRECTORY DESTINATION ${OUTPUT_DIR}) -install(DIRECTORY DESTINATION ${OUTPUT_DIR}/bin) -install(DIRECTORY DESTINATION ${OUTPUT_DIR}/conf) - -install(FILES - ${BASE_DIR}/../bin/start_be.sh - ${BASE_DIR}/../bin/stop_be.sh - ${BASE_DIR}/../tools/jeprof - PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE - GROUP_READ GROUP_WRITE GROUP_EXECUTE - WORLD_READ WORLD_EXECUTE - DESTINATION ${OUTPUT_DIR}/bin) - -install(FILES - ${BASE_DIR}/../conf/be.conf - ${BASE_DIR}/../conf/odbcinst.ini - ${BASE_DIR}/../conf/asan_suppr.conf - ${BASE_DIR}/../conf/lsan_suppr.conf - DESTINATION ${OUTPUT_DIR}/conf) +if(NOT BUILD_BENCHMARK) + # Install be + install(DIRECTORY DESTINATION ${OUTPUT_DIR}) + install(DIRECTORY DESTINATION ${OUTPUT_DIR}/bin) + install(DIRECTORY DESTINATION ${OUTPUT_DIR}/conf) + + install(FILES + ${BASE_DIR}/../bin/start_be.sh + ${BASE_DIR}/../bin/stop_be.sh + ${BASE_DIR}/../tools/jeprof + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE + GROUP_READ GROUP_WRITE GROUP_EXECUTE + WORLD_READ WORLD_EXECUTE + DESTINATION ${OUTPUT_DIR}/bin) + + install(FILES + ${BASE_DIR}/../conf/be.conf + ${BASE_DIR}/../conf/odbcinst.ini + ${BASE_DIR}/../conf/asan_suppr.conf + ${BASE_DIR}/../conf/lsan_suppr.conf + DESTINATION ${OUTPUT_DIR}/conf) +endif() get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) foreach(dir ${dirs}) message(STATUS "dir='${dir}'") endforeach() - +if (BUILD_BENCHMARK) + add_executable(benchmark_test ${BASE_DIR}/benchmark/benchmark_main.cpp) + target_link_libraries(benchmark_test ${DORIS_LINK_LIBS}) + message(STATUS "Add benchmark to build") + install(TARGETS benchmark_test DESTINATION ${OUTPUT_DIR}/lib) +endif() \ No newline at end of file diff --git a/be/benchmark/benchmark_main.cpp b/be/benchmark/benchmark_main.cpp new file mode 100644 index 00000000000000..cad6463e981852 --- /dev/null +++ b/be/benchmark/benchmark_main.cpp @@ -0,0 +1,52 @@ +// 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. + +#include + +#include + +#include "vec/columns/column_string.h" +#include "vec/core/block.h" +#include "vec/data_types/data_type.h" +#include "vec/data_types/data_type_string.h" + +namespace doris::vectorized { // change if need + +static void Example1(benchmark::State& state) { + // init. dont time it. + state.PauseTiming(); + Block block; + DataTypePtr str_type = std::make_shared(); + std::vector vals {100, "content"}; + state.ResumeTiming(); + + // do test + for (auto _ : state) { + auto str_col = ColumnString::create(); + for (auto& v : vals) { + str_col->insert_data(v.data(), v.size()); + } + block.insert({std::move(str_col), str_type, "col"}); + benchmark::DoNotOptimize(block); // mark the watched target + } +} +// could BENCHMARK many functions to compare them together. +BENCHMARK(Example1); + +} // namespace doris::vectorized + +BENCHMARK_MAIN(); diff --git a/be/src/runtime/memory/jemalloc_hook.cpp b/be/src/runtime/memory/jemalloc_hook.cpp index 445d60d382c270..dffc1344b71dbc 100644 --- a/be/src/runtime/memory/jemalloc_hook.cpp +++ b/be/src/runtime/memory/jemalloc_hook.cpp @@ -60,7 +60,7 @@ void* doris_realloc(void* p, size_t size) __THROW { return nullptr; } -#if USE_MEM_TRACKER +#if defined(USE_MEM_TRACKER) && !defined(BE_TEST) int64_t old_size = jemalloc_usable_size(p); CONSUME_THREAD_MEM_TRACKER_BY_HOOK_WITH_FN( [](size_t size, int64_t old_size) { return jenallocx(size, 0) - old_size; }, size, diff --git a/be/src/service/CMakeLists.txt b/be/src/service/CMakeLists.txt index 4ce611345840c1..e44045dffce17e 100644 --- a/be/src/service/CMakeLists.txt +++ b/be/src/service/CMakeLists.txt @@ -28,7 +28,7 @@ add_library(Service STATIC ${SRC_FILES}) pch_reuse(Service) -if (${MAKE_TEST} STREQUAL "OFF") +if (${MAKE_TEST} STREQUAL "OFF" AND ${BUILD_BENCHMARK} STREQUAL "OFF") add_executable(doris_be doris_main.cpp ) diff --git a/be/test/CMakeLists.txt b/be/test/CMakeLists.txt index 5a37267a9379c3..0060d304a859a8 100644 --- a/be/test/CMakeLists.txt +++ b/be/test/CMakeLists.txt @@ -113,14 +113,3 @@ if (OS_MACOSX AND ARCH_ARM) COMMAND ${LLVM_STRIP} --strip-all $ ) endif() - -if (BUILD_BENCHMARK_TOOL AND BUILD_BENCHMARK_TOOL STREQUAL "ON") - add_executable(benchmark_tool - tools/benchmark_tool.cpp - testutil/test_util.cpp - olap/tablet_schema_helper.cpp - ) - - target_link_libraries(benchmark_tool ${TEST_LINK_LIBS}) - set_target_properties(benchmark_tool PROPERTIES COMPILE_FLAGS "-fno-access-control") -endif() diff --git a/be/test/tools/benchmark_tool.cpp b/be/test/tools/benchmark_tool.cpp deleted file mode 100644 index 28c8f5c96f5cbe..00000000000000 --- a/be/test/tools/benchmark_tool.cpp +++ /dev/null @@ -1,320 +0,0 @@ -// 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. - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "common/compiler_util.h" -#include "common/logging.h" -#include "gutil/strings/split.h" -#include "gutil/strings/substitute.h" -#include "io/fs/file_system.h" -#include "io/fs/file_writer.h" -#include "io/fs/local_file_system.h" -#include "olap/comparison_predicate.h" -#include "olap/data_dir.h" -#include "olap/in_list_predicate.h" -#include "olap/olap_common.h" -#include "olap/row_cursor.h" -#include "olap/rowset/segment_v2/binary_dict_page.h" -#include "olap/rowset/segment_v2/binary_plain_page.h" -#include "olap/rowset/segment_v2/page_builder.h" -#include "olap/rowset/segment_v2/page_decoder.h" -#include "olap/rowset/segment_v2/segment_iterator.h" -#include "olap/rowset/segment_v2/segment_writer.h" -#include "olap/tablet_schema.h" -#include "olap/tablet_schema_helper.h" -#include "olap/types.h" -#include "testutil/test_util.h" -#include "util/debug_util.h" - -DEFINE_string(operation, "Custom", - "valid operation: Custom, BinaryDictPageEncode, BinaryDictPageDecode, SegmentScan, " - "SegmentWrite, " - "SegmentScanByFile, SegmentWriteByFile"); -DEFINE_string(input_file, "./sample.dat", "input file directory"); -DEFINE_string(column_type, "int,varchar", "valid type: int, char, varchar, string"); -DEFINE_string(rows_number, "10000", "rows number"); -DEFINE_string(iterations, "10", - "run times, this is set to 0 means the number of iterations is automatically set "); - -const std::string kSegmentDir = "./segment_benchmark"; - -std::string get_usage(const std::string& progname) { - std::stringstream ss; - ss << progname << " is the Doris BE benchmark tool.\n"; - ss << "Stop BE first before use this tool.\n"; - - ss << "Usage:\n"; - ss << "./benchmark_tool --operation=Custom\n"; - ss << "./benchmark_tool --operation=BinaryDictPageEncode " - "--rows_number=10000 --iterations=40\n"; - ss << "./benchmark_tool --operation=BinaryDictPageDecode " - "--rows_number=10000 --iterations=40\n"; - ss << "./benchmark_tool --operation=SegmentScan --column_type=int,varchar " - "--rows_number=10000 --iterations=0\n"; - ss << "./benchmark_tool --operation=SegmentWrite --column_type=int " - "--rows_number=10000 --iterations=10\n"; - ss << "./benchmark_tool --operation=SegmentScanByFile --input_file=./sample.dat " - "--iterations=10\n"; - ss << "./benchmark_tool --operation=SegmentWriteByFile --input_file=./sample.dat " - "--iterations=10\n"; - - ss << "Sampe data file format: \n" - << "The first line defines Shcema\n" - << "The rest of the content is DataSet\n" - << "For example: \n" - << "int,char,varchar\n" - << "123,hello,world\n" - << "321,good,bye\n"; - return ss.str(); -} - -namespace doris { -class BaseBenchmark { -public: - BaseBenchmark(const std::string& name, int iterations) : _name(name), _iterations(iterations) {} - virtual ~BaseBenchmark() = default; - - void add_name(const std::string& str) { _name += str; } - - virtual void init() {} - virtual void run() {} - - void register_bm() { - auto bm = benchmark::RegisterBenchmark(_name.c_str(), [&](benchmark::State& state) { - //first turn will use more time - this->init(); - this->run(); - for (auto _ : state) { - state.PauseTiming(); - this->init(); - state.ResumeTiming(); - this->run(); - } - }); - if (_iterations != 0) { - bm->Iterations(_iterations); - } - bm->Unit(benchmark::kMillisecond); - } - -private: - std::string _name; - int _iterations; -}; - -class BinaryDictPageBenchmark : public BaseBenchmark { -public: - BinaryDictPageBenchmark(const std::string& name, int iterations) - : BaseBenchmark(name, iterations) {} - virtual ~BinaryDictPageBenchmark() override {} - - virtual void init() override {} - virtual void run() override {} - - void encode_pages(const std::vector& contents) { - PageBuilderOptions options; - BinaryDictPageBuilder page_builder(options); - - results.clear(); - page_start_ids.clear(); - page_start_ids.push_back(0); - for (size_t i = 0; i < contents.size(); i++) { - const Slice* ptr = &contents[i]; - size_t add_num = 1; - (void)page_builder.add(reinterpret_cast(ptr), &add_num); - if (page_builder.is_page_full()) { - OwnedSlice s = page_builder.finish(); - results.emplace_back(std::move(s)); - page_start_ids.push_back(i + 1); - page_builder.reset(); - } - } - OwnedSlice s = page_builder.finish(); - results.emplace_back(std::move(s)); - page_start_ids.push_back(contents.size()); - - (void)page_builder.get_dictionary_page(&dict_slice); - } - - void decode_pages() { - // TODO should rewrite this method by using vectorized next batch method - } - -private: - std::vector results; - OwnedSlice dict_slice; - std::vector page_start_ids; -}; - -class BinaryDictPageEncodeBenchmark : public BinaryDictPageBenchmark { -public: - BinaryDictPageEncodeBenchmark(const std::string& name, int iterations, int rows_number) - : BinaryDictPageBenchmark(name + "/rows_number:" + std::to_string(rows_number), - iterations), - _rows_number(rows_number) {} - virtual ~BinaryDictPageEncodeBenchmark() override {} - - virtual void init() override { - src_strings.clear(); - for (int i = 0; i < _rows_number; i++) { - src_strings.emplace_back(rand_rng_string(rand_rng_int(1, 8))); - } - - slices.clear(); - for (auto s : src_strings) { - slices.emplace_back(s.c_str()); - } - } - virtual void run() override { encode_pages(slices); } - -private: - std::vector slices; - std::vector src_strings; - int _rows_number; -}; - -class BinaryDictPageDecodeBenchmark : public BinaryDictPageBenchmark { -public: - BinaryDictPageDecodeBenchmark(const std::string& name, int iterations, int rows_number) - : BinaryDictPageBenchmark(name + "/rows_number:" + std::to_string(rows_number), - iterations), - _rows_number(rows_number) {} - virtual ~BinaryDictPageDecodeBenchmark() override {} - - virtual void init() override { - src_strings.clear(); - for (int i = 0; i < _rows_number; i++) { - src_strings.emplace_back(rand_rng_string(rand_rng_int(1, 8))); - } - - slices.clear(); - for (auto s : src_strings) { - slices.emplace_back(s.c_str()); - } - - encode_pages(slices); - } - virtual void run() override { decode_pages(); } - -private: - std::vector slices; - std::vector src_strings; - int _rows_number; -}; // namespace doris - -// This is sample custom test. User can write custom test code at custom_init()&custom_run(). -// Call method: ./benchmark_tool --operation=Custom -class CustomBenchmark : public BaseBenchmark { -public: - CustomBenchmark(const std::string& name, int iterations, std::function init_func, - std::function run_func) - : BaseBenchmark(name, iterations), _init_func(init_func), _run_func(run_func) {} - virtual ~CustomBenchmark() override {} - - virtual void init() override { _init_func(); } - virtual void run() override { _run_func(); } - -private: - std::function _init_func; - std::function _run_func; -}; -void custom_init() {} -void custom_run_plus() { - int p = 100000; - int q = 0; - while (p--) { - q++; - if (UNLIKELY(q == 1024)) q = 0; - } -} -void custom_run_mod() { - int p = 100000; - int q = 0; - while (p--) { - q++; - if (q %= 1024) q = 0; - } -} - -class MultiBenchmark { -public: - MultiBenchmark() {} - ~MultiBenchmark() { - for (auto bm : benchmarks) { - delete bm; - } - } - - void add_bm() { - if (equal_ignore_case(FLAGS_operation, "Custom")) { - benchmarks.emplace_back( - new doris::CustomBenchmark("custom_run_plus", std::stoi(FLAGS_iterations), - doris::custom_init, doris::custom_run_plus)); - benchmarks.emplace_back( - new doris::CustomBenchmark("custom_run_mod", std::stoi(FLAGS_iterations), - doris::custom_init, doris::custom_run_mod)); - } else if (equal_ignore_case(FLAGS_operation, "BinaryDictPageEncode")) { - benchmarks.emplace_back(new doris::BinaryDictPageEncodeBenchmark( - FLAGS_operation, std::stoi(FLAGS_iterations), std::stoi(FLAGS_rows_number))); - } else if (equal_ignore_case(FLAGS_operation, "BinaryDictPageDecode")) { - benchmarks.emplace_back(new doris::BinaryDictPageDecodeBenchmark( - FLAGS_operation, std::stoi(FLAGS_iterations), std::stoi(FLAGS_rows_number))); - } else { - std::cout << "operation invalid!" << std::endl; - } - } - void register_bm() { - for (auto bm : benchmarks) { - bm->register_bm(); - } - } - -private: - std::vector benchmarks; -}; - -} //namespace doris -int main(int argc, char** argv) { - std::string usage = get_usage(argv[0]); - gflags::SetUsageMessage(usage); - google::ParseCommandLineFlags(&argc, &argv, true); - - doris::StoragePageCache::create_global_cache(1 << 30, 10, 0); - - doris::MultiBenchmark multi_bm; - multi_bm.add_bm(); - multi_bm.register_bm(); - - benchmark::Initialize(&argc, argv); - benchmark::RunSpecifiedBenchmarks(); - benchmark::Shutdown(); - - return 0; -} diff --git a/bin/start_be.sh b/bin/start_be.sh index 0ae0914d42ec20..5b7df5ead589fa 100755 --- a/bin/start_be.sh +++ b/bin/start_be.sh @@ -32,6 +32,7 @@ OPTS="$(getopt \ -l 'daemon' \ -l 'console' \ -l 'version' \ + -l 'benchmark' \ -- "$@")" eval set -- "${OPTS}" @@ -39,6 +40,8 @@ eval set -- "${OPTS}" RUN_DAEMON=0 RUN_CONSOLE=0 RUN_VERSION=0 +RUN_BENCHMARK=0 + while true; do case "$1" in --daemon) @@ -53,6 +56,10 @@ while true; do RUN_VERSION=1 shift ;; + --benchmark) + RUN_BENCHMARK=1 + shift + ;; --) shift break @@ -293,7 +300,7 @@ fi pidfile="${PID_DIR}/be.pid" -if [[ -f "${pidfile}" ]]; then +if [[ -f "${pidfile}" && "${RUN_BENCHMARK}" -eq 0 ]]; then if kill -0 "$(cat "${pidfile}")" >/dev/null 2>&1; then echo "Backend is already running as process $(cat "${pidfile}"), stop it first" exit 1 @@ -419,7 +426,13 @@ else export MALLOC_CONF="${JEMALLOC_CONF},prof_prefix:${JEMALLOC_PROF_PRFIX}" fi -if [[ "${RUN_DAEMON}" -eq 1 ]]; then +if [[ "${RUN_BENCHMARK}" -eq 1 ]]; then + if [[ "$(uname -s)" == 'Darwin' ]]; then + env DYLD_LIBRARY_PATH="${DYLD_LIBRARY_PATH}" ${LIMIT:+${LIMIT}} "${DORIS_HOME}/lib/benchmark_test" + else + ${LIMIT:+${LIMIT}} "${DORIS_HOME}/lib/benchmark_test" + fi +elif [[ "${RUN_DAEMON}" -eq 1 ]]; then if [[ "$(uname -s)" == 'Darwin' ]]; then nohup env DYLD_LIBRARY_PATH="${DYLD_LIBRARY_PATH}" ${LIMIT:+${LIMIT}} "${DORIS_HOME}/lib/doris_be" "$@" >>"${LOG_DIR}/be.out" 2>&1 --meta-tool build Backend meta tool. Default OFF. --cloud build Cloud. Default OFF. --index-tool build Backend inverted index tool. Default OFF. + --benchmark build Google Benchmark. Default OFF. --broker build Broker. Default ON. --spark-dpp build Spark DPP application. Default ON. --hive-udf build Hive UDF library for Spark Load. Default ON. @@ -64,12 +65,14 @@ Usage: $0 DISABLE_BE_JAVA_EXTENSIONS If set DISABLE_BE_JAVA_EXTENSIONS=ON, we will do not build binary with java-udf,hudi-scanner,jdbc-scanner and so on Default is OFF. DISABLE_JAVA_CHECK_STYLE If set DISABLE_JAVA_CHECK_STYLE=ON, it will skip style check of java code in FE. DISABLE_BUILD_AZURE If set DISABLE_BUILD_AZURE=ON, it will not build azure into BE. + Eg. $0 build all $0 --be build Backend $0 --meta-tool build Backend meta tool $0 --cloud build Cloud $0 --index-tool build Backend inverted index tool + $0 --benchmark build Google Benchmark of Backend $0 --fe --clean clean and build Frontend and Spark Dpp application $0 --fe --be --clean clean and build Frontend, Spark Dpp application and Backend $0 --spark-dpp build Spark DPP application alone @@ -129,6 +132,7 @@ if ! OPTS="$(getopt \ -l 'broker' \ -l 'meta-tool' \ -l 'index-tool' \ + -l 'benchmark' \ -l 'spark-dpp' \ -l 'hive-udf' \ -l 'be-java-extensions' \ @@ -151,6 +155,7 @@ BUILD_CLOUD=0 BUILD_BROKER=0 BUILD_META_TOOL='OFF' BUILD_INDEX_TOOL='OFF' +BUILD_BENCHMARK='OFF' BUILD_SPARK_DPP=0 BUILD_BE_JAVA_EXTENSIONS=0 BUILD_HIVE_UDF=0 @@ -170,6 +175,7 @@ if [[ "$#" == 1 ]]; then BUILD_BROKER=1 BUILD_META_TOOL='OFF' BUILD_INDEX_TOOL='OFF' + BUILD_BENCHMARK='OFF' BUILD_SPARK_DPP=1 BUILD_HIVE_UDF=1 BUILD_BE_JAVA_EXTENSIONS=1 @@ -205,6 +211,11 @@ else BUILD_INDEX_TOOL='ON' shift ;; + --benchmark) + BUILD_BENCHMARK='ON' + BUILD_BE=1 # go into BE cmake building, but benchmark instead of doris_be + shift + ;; --spark-dpp) BUILD_SPARK_DPP=1 shift @@ -446,6 +457,10 @@ if [[ -z "${ENABLE_CACHE_LOCK_DEBUG}" ]]; then ENABLE_CACHE_LOCK_DEBUG='OFF' fi +if [[ -z "${BUILD_BENCHMARK}" ]]; then + BUILD_BENCHMARK='OFF' +fi + if [[ -z "${RECORD_COMPILER_SWITCHES}" ]]; then RECORD_COMPILER_SWITCHES='OFF' fi @@ -476,6 +491,7 @@ echo "Get params: BUILD_BROKER -- ${BUILD_BROKER} BUILD_META_TOOL -- ${BUILD_META_TOOL} BUILD_INDEX_TOOL -- ${BUILD_INDEX_TOOL} + BUILD_BENCHMARK -- ${BUILD_BENCHMARK} BUILD_SPARK_DPP -- ${BUILD_SPARK_DPP} BUILD_BE_JAVA_EXTENSIONS -- ${BUILD_BE_JAVA_EXTENSIONS} BUILD_HIVE_UDF -- ${BUILD_HIVE_UDF} @@ -578,6 +594,7 @@ if [[ "${BUILD_BE}" -eq 1 ]]; then -DENABLE_INJECTION_POINT="${ENABLE_INJECTION_POINT}" \ -DENABLE_CACHE_LOCK_DEBUG="${ENABLE_CACHE_LOCK_DEBUG}" \ -DMAKE_TEST=OFF \ + -DBUILD_BENCHMARK="${BUILD_BENCHMARK}" \ -DBUILD_FS_BENCHMARK="${BUILD_FS_BENCHMARK}" \ ${CMAKE_USE_CCACHE:+${CMAKE_USE_CCACHE}} \ -DWITH_MYSQL="${WITH_MYSQL}" \ @@ -797,6 +814,10 @@ EOF cp -r -p "${DORIS_HOME}/be/output/lib/debug_info" "${DORIS_OUTPUT}/be/lib"/ fi + if [[ "${BUILD_BENCHMARK}" = "ON" ]]; then + cp -r -p "${DORIS_HOME}/be/output/lib/benchmark_test" "${DORIS_OUTPUT}/be/lib/"/ + fi + if [[ "${BUILD_FS_BENCHMARK}" = "ON" ]]; then cp -r -p "${DORIS_HOME}/bin/run-fs-benchmark.sh" "${DORIS_OUTPUT}/be/bin/"/ fi From feb4e01f903a8d2f8c11621f574a9c0381d21e57 Mon Sep 17 00:00:00 2001 From: Calvin Kirs Date: Wed, 20 Nov 2024 13:28:48 +0800 Subject: [PATCH 47/63] [Fix](log)To avoid SLF4J multiple binding issues and unnecessary dependency propagation. (#44310) ### What problem does this PR solve? ``` 2024-11-20 10:50:42,967 ERROR (main|1) [Util.report():128] SLF4J: Class path contains multiple SLF4J bindings. 2024-11-20 10:50:42,968 ERROR (main|1) [Util.report():128] SLF4J: Found binding in [jar:file:/Users/calvinkirs/.m2/repository/org/slf4j/slf4j-reload4j/1.7.36/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class] 2024-11-20 10:50:42,969 ERROR (main|1) [Util.report():128] SLF4J: Found binding in [jar:file:/Users/calvinkirs/.m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.18.0/log4j-slf4j-impl-2.18.0.jar!/org/slf4j/impl/StaticLoggerBinder.class] 2024-11-20 10:50:42,969 ERROR (main|1) [Util.report():128] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. 2024-11-20 10:50:42,993 ERROR (main|1) [Util.report():128] SLF4J: Actual binding is of type [org.slf4j.impl.Reload4jLoggerFactory] ``` SLF4J requires only one binding implementatio to be present at runtime. By setting the scope of other bindings, such as slf4j-reload4j, to test, we ensure that only the explicitly specified binding, like log4j-slf4j-impl, is used in the production environment, preventing runtime conflicts. **hadoop-auth** introduces **slf4j-reload4j** --- fe/pom.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/fe/pom.xml b/fe/pom.xml index d78cfd50b819b4..d1fed9fc7602f9 100644 --- a/fe/pom.xml +++ b/fe/pom.xml @@ -857,6 +857,15 @@ under the License. json-simple ${json-simple.version} + + + org.slf4j + slf4j-reload4j + test + org.junit.jupiter From 6c573d6b4430c3fe73a26761b465d2e641a980a8 Mon Sep 17 00:00:00 2001 From: zzzxl Date: Wed, 20 Nov 2024 13:53:04 +0800 Subject: [PATCH 48/63] [fix](store) Fix the issue where storage_page_size equals 0 in multi-FE scenarios (#44306) ### What problem does this PR solve? Related PR: https://github.com/apache/doris/pull/43690 https://github.com/apache/doris/pull/44080 Problem Summary: 1. Creating a table on a Follower will result in storage_page_size being equal to 0. --- .../src/main/java/org/apache/doris/catalog/TableProperty.java | 1 + .../suites/query_p0/system/test_storage_page_size.groovy | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/TableProperty.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/TableProperty.java index 25cf2f4287e5a9..1ac556c6846c05 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/TableProperty.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/TableProperty.java @@ -737,6 +737,7 @@ public void gsonPostProcess() throws IOException { buildStoreRowColumn(); buildRowStoreColumns(); buildRowStorePageSize(); + buildStoragePageSize(); buildSkipWriteIndexOnLoad(); buildCompactionPolicy(); buildTimeSeriesCompactionGoalSizeMbytes(); diff --git a/regression-test/suites/query_p0/system/test_storage_page_size.groovy b/regression-test/suites/query_p0/system/test_storage_page_size.groovy index 9d7b129226d38b..491d702938e898 100644 --- a/regression-test/suites/query_p0/system/test_storage_page_size.groovy +++ b/regression-test/suites/query_p0/system/test_storage_page_size.groovy @@ -33,7 +33,7 @@ suite ("test_storage_page_size") { test { sql "show create table table_1;" check { result, exception, startTime, endTime -> - assertFalse(result[0][1].contains("\"storage_page_size\" = \"65536\"")) + assertFalse(result[0][1].contains("storage_page_size")) } } From f5daeb5224c10a38b4c5b5edefc5324e239f72f8 Mon Sep 17 00:00:00 2001 From: Sun Chenyang Date: Wed, 20 Nov 2024 13:54:01 +0800 Subject: [PATCH 49/63] [opt](test) Make the case stable. (#44195) Problem Summary: Make the regression case stable --- ...e_compaction_with_variant_inverted_index.groovy | 2 +- .../test_variant_bloom_filter.groovy | 10 ++++++---- .../test_index_compaction_p0.groovy | 14 ++++++++------ .../inverted_index_p0/load/test_insert.groovy | 2 +- .../inverted_index_p0/load/test_stream_load.groovy | 2 +- .../test_index_compaction_p1.groovy | 11 ++++++----- .../test_variant_index_format_v1.groovy | 2 +- .../suites/load_p2/test_single_replica_load.groovy | 2 +- .../suites/variant_p0/with_index/var_index.groovy | 2 +- 9 files changed, 26 insertions(+), 21 deletions(-) diff --git a/regression-test/suites/compaction/test_single_compaction_with_variant_inverted_index.groovy b/regression-test/suites/compaction/test_single_compaction_with_variant_inverted_index.groovy index d450df1868c5a8..dc178556ebb65f 100644 --- a/regression-test/suites/compaction/test_single_compaction_with_variant_inverted_index.groovy +++ b/regression-test/suites/compaction/test_single_compaction_with_variant_inverted_index.groovy @@ -17,7 +17,7 @@ import org.codehaus.groovy.runtime.IOGroovyMethods -suite("test_single_compaction_with_variant_inverted", "p2") { +suite("test_single_compaction_with_variant_inverted", "p2, nonConcurrent") { if (isCloudMode()) { return; } diff --git a/regression-test/suites/fault_injection_p0/test_variant_bloom_filter.groovy b/regression-test/suites/fault_injection_p0/test_variant_bloom_filter.groovy index 33f93d1bef0a6f..88c529d685dfe8 100644 --- a/regression-test/suites/fault_injection_p0/test_variant_bloom_filter.groovy +++ b/regression-test/suites/fault_injection_p0/test_variant_bloom_filter.groovy @@ -72,8 +72,9 @@ suite("test_variant_bloom_filter", "nonConcurrent") { getBackendIpHttpPort(backendId_to_backendIP, backendId_to_backendHttpPort); def tablets = sql_return_maparray """ show tablets from ${index_table}; """ - int beforeSegmentCount = 0 + for (def tablet in tablets) { + int beforeSegmentCount = 0 String tablet_id = tablet.TabletId (code, out, err) = curl("GET", tablet.CompactionStatus) logger.info("Show tablets status: code=" + code + ", out=" + out + ", err=" + err) @@ -83,8 +84,8 @@ suite("test_variant_bloom_filter", "nonConcurrent") { for (String rowset in (List) tabletJson.rowsets) { beforeSegmentCount += Integer.parseInt(rowset.split(" ")[1]) } + assertEquals(beforeSegmentCount, 5) } - assertEquals(beforeSegmentCount, 5) // trigger compactions for all tablets in ${tableName} for (def tablet in tablets) { @@ -111,8 +112,8 @@ suite("test_variant_bloom_filter", "nonConcurrent") { }); } - int afterSegmentCount = 0 for (def tablet in tablets) { + int afterSegmentCount = 0 String tablet_id = tablet.TabletId (code, out, err) = curl("GET", tablet.CompactionStatus) logger.info("Show tablets status: code=" + code + ", out=" + out + ", err=" + err) @@ -123,8 +124,9 @@ suite("test_variant_bloom_filter", "nonConcurrent") { logger.info("rowset is: " + rowset) afterSegmentCount += Integer.parseInt(rowset.split(" ")[1]) } + assertEquals(afterSegmentCount, 1) } - assertEquals(afterSegmentCount, 1) + try { GetDebugPoint().enableDebugPointForAllBEs("bloom_filter_must_filter_data") diff --git a/regression-test/suites/inverted_index_p0/index_compaction/test_index_compaction_p0.groovy b/regression-test/suites/inverted_index_p0/index_compaction/test_index_compaction_p0.groovy index 30c0e1c6ccc1a7..e178d08baadd75 100644 --- a/regression-test/suites/inverted_index_p0/index_compaction/test_index_compaction_p0.groovy +++ b/regression-test/suites/inverted_index_p0/index_compaction/test_index_compaction_p0.groovy @@ -74,7 +74,6 @@ suite("test_index_compaction_p0", "p0, nonConcurrent") { (1..20).each { i -> def fileName = "documents-" + i + ".json" load_json_data.call(compaction_table_name, """${fileName}""") - } def backendId_to_backendIP = [:] @@ -91,8 +90,9 @@ suite("test_index_compaction_p0", "p0, nonConcurrent") { //TabletId,ReplicaId,BackendId,SchemaHash,Version,LstSuccessVersion,LstFailedVersion,LstFailedTime,LocalDataSize,RemoteDataSize,RowCount,State,LstConsistencyCheckTime,CheckVersion,VersionCount,QueryHits,PathHash,MetaUrl,CompactionStatus def tablets = sql_return_maparray """ show tablets from ${compaction_table_name}; """ - int beforeSegmentCount = 0 + for (def tablet in tablets) { + int beforeSegmentCount = 0 String tablet_id = tablet.TabletId (code, out, err) = curl("GET", tablet.CompactionStatus) logger.info("Show tablets status: code=" + code + ", out=" + out + ", err=" + err) @@ -102,14 +102,14 @@ suite("test_index_compaction_p0", "p0, nonConcurrent") { for (String rowset in (List) tabletJson.rowsets) { beforeSegmentCount += Integer.parseInt(rowset.split(" ")[1]) } + assertEquals(beforeSegmentCount, 20) } - assertEquals(beforeSegmentCount, 20) // trigger compactions for all tablets in ${tableName} for (def tablet in tablets) { String tablet_id = tablet.TabletId backend_id = tablet.BackendId - (code, out, err) = be_run_cumulative_compaction(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id), tablet_id) + (code, out, err) = be_run_full_compaction(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id), tablet_id) logger.info("Run compaction: code=" + code + ", out=" + out + ", err=" + err) assertEquals(code, 0) def compactJson = parseJson(out.trim()) @@ -130,8 +130,9 @@ suite("test_index_compaction_p0", "p0, nonConcurrent") { }); } - int afterSegmentCount = 0 + for (def tablet in tablets) { + int afterSegmentCount = 0 String tablet_id = tablet.TabletId (code, out, err) = curl("GET", tablet.CompactionStatus) logger.info("Show tablets status: code=" + code + ", out=" + out + ", err=" + err) @@ -142,6 +143,7 @@ suite("test_index_compaction_p0", "p0, nonConcurrent") { logger.info("rowset is: " + rowset) afterSegmentCount += Integer.parseInt(rowset.split(" ")[1]) } + assertEquals(afterSegmentCount, 1) } - assertEquals(afterSegmentCount, 1) + } diff --git a/regression-test/suites/inverted_index_p0/load/test_insert.groovy b/regression-test/suites/inverted_index_p0/load/test_insert.groovy index 03e7a3ccb26404..3f80fccc56d7f7 100644 --- a/regression-test/suites/inverted_index_p0/load/test_insert.groovy +++ b/regression-test/suites/inverted_index_p0/load/test_insert.groovy @@ -16,7 +16,7 @@ // under the License. import org.codehaus.groovy.runtime.IOGroovyMethods -suite("test_insert_with_index", "p0") { +suite("test_insert_with_index", "p0, nonConcurrent") { def set_be_config = { key, value -> def backendId_to_backendIP = [:] diff --git a/regression-test/suites/inverted_index_p0/load/test_stream_load.groovy b/regression-test/suites/inverted_index_p0/load/test_stream_load.groovy index 1912fdcfc50c4c..28875acc438fc7 100644 --- a/regression-test/suites/inverted_index_p0/load/test_stream_load.groovy +++ b/regression-test/suites/inverted_index_p0/load/test_stream_load.groovy @@ -16,7 +16,7 @@ // under the License. import org.codehaus.groovy.runtime.IOGroovyMethods -suite("test_stream_load_with_inverted_index_p0", "p0") { +suite("test_stream_load_with_inverted_index_p0", "p0, nonConcurrent") { def set_be_config = { key, value -> def backendId_to_backendIP = [:] diff --git a/regression-test/suites/inverted_index_p1/index_compaction/test_index_compaction_p1.groovy b/regression-test/suites/inverted_index_p1/index_compaction/test_index_compaction_p1.groovy index 27a8470bd26296..c55ae3c233bec0 100644 --- a/regression-test/suites/inverted_index_p1/index_compaction/test_index_compaction_p1.groovy +++ b/regression-test/suites/inverted_index_p1/index_compaction/test_index_compaction_p1.groovy @@ -95,8 +95,9 @@ suite("test_index_compaction_p1", "p1, nonConcurrent") { //TabletId,ReplicaId,BackendId,SchemaHash,Version,LstSuccessVersion,LstFailedVersion,LstFailedTime,LocalDataSize,RemoteDataSize,RowCount,State,LstConsistencyCheckTime,CheckVersion,VersionCount,QueryHits,PathHash,MetaUrl,CompactionStatus def tablets = sql_return_maparray """ show tablets from ${compaction_table_name}; """ - int beforeSegmentCount = 0 + for (def tablet in tablets) { + int beforeSegmentCount = 0 String tablet_id = tablet.TabletId (code, out, err) = curl("GET", tablet.CompactionStatus) logger.info("Show tablets status: code=" + code + ", out=" + out + ", err=" + err) @@ -106,14 +107,14 @@ suite("test_index_compaction_p1", "p1, nonConcurrent") { for (String rowset in (List) tabletJson.rowsets) { beforeSegmentCount += Integer.parseInt(rowset.split(" ")[1]) } + assertEquals(beforeSegmentCount, 110) } - assertEquals(beforeSegmentCount, 110) // trigger compactions for all tablets in ${tableName} for (def tablet in tablets) { String tablet_id = tablet.TabletId backend_id = tablet.BackendId - (code, out, err) = be_run_cumulative_compaction(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id), tablet_id) + (code, out, err) = be_run_full_compaction(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id), tablet_id) logger.info("Run compaction: code=" + code + ", out=" + out + ", err=" + err) assertEquals(code, 0) def compactJson = parseJson(out.trim()) @@ -134,8 +135,8 @@ suite("test_index_compaction_p1", "p1, nonConcurrent") { }); } - int afterSegmentCount = 0 for (def tablet in tablets) { + int afterSegmentCount = 0 String tablet_id = tablet.TabletId (code, out, err) = curl("GET", tablet.CompactionStatus) logger.info("Show tablets status: code=" + code + ", out=" + out + ", err=" + err) @@ -146,6 +147,6 @@ suite("test_index_compaction_p1", "p1, nonConcurrent") { logger.info("rowset is: " + rowset) afterSegmentCount += Integer.parseInt(rowset.split(" ")[1]) } + assertEquals(afterSegmentCount, 1) } - assertEquals(afterSegmentCount, 1) } diff --git a/regression-test/suites/inverted_index_p2/test_variant_index_format_v1.groovy b/regression-test/suites/inverted_index_p2/test_variant_index_format_v1.groovy index 5f262c8bf07775..2bf1d20b106323 100644 --- a/regression-test/suites/inverted_index_p2/test_variant_index_format_v1.groovy +++ b/regression-test/suites/inverted_index_p2/test_variant_index_format_v1.groovy @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -suite("test_variant_index_format_v1", "p2") { +suite("test_variant_index_format_v1", "p2, nonConcurrent") { def calc_file_crc_on_tablet = { ip, port, tablet -> return curl("GET", String.format("http://%s:%s/api/calc_crc?tablet_id=%s", ip, port, tablet)) } diff --git a/regression-test/suites/load_p2/test_single_replica_load.groovy b/regression-test/suites/load_p2/test_single_replica_load.groovy index cb4f970ac66d1f..67f0b4639f8821 100644 --- a/regression-test/suites/load_p2/test_single_replica_load.groovy +++ b/regression-test/suites/load_p2/test_single_replica_load.groovy @@ -19,7 +19,7 @@ // /testing/trino-product-tests/src/main/resources/sql-tests/testcases // and modified by Doris. -suite("test_single_replica_load", "p2") { +suite("test_single_replica_load", "p2, nonConcurrent") { def load_json_data = {table_name, file_name -> // load the json data diff --git a/regression-test/suites/variant_p0/with_index/var_index.groovy b/regression-test/suites/variant_p0/with_index/var_index.groovy index 2a302b96b6a22b..82234bc3b5a300 100644 --- a/regression-test/suites/variant_p0/with_index/var_index.groovy +++ b/regression-test/suites/variant_p0/with_index/var_index.groovy @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -suite("regression_test_variant_var_index", "p0"){ +suite("regression_test_variant_var_index", "p0, nonConcurrent"){ def table_name = "var_index" sql "DROP TABLE IF EXISTS var_index" sql """ From faa9da36b4baede0402a66dddb4bbca97a0190ab Mon Sep 17 00:00:00 2001 From: MoanasDaddyXu Date: Wed, 20 Nov 2024 14:34:13 +0800 Subject: [PATCH 50/63] [enhancement][fix] update storage vault case for upgrade test (#43948) ### What problem does this PR solve? Issue Number: close #xxx Related PR: #xxx Problem Summary: To adapt for the upgrade test, split this test case into two --- .../suites/vault_p0/create/load.groovy | 204 ++++++++++++++++++ .../vault_p0/create/test_create_vault.groovy | 135 ------------ 2 files changed, 204 insertions(+), 135 deletions(-) create mode 100644 regression-test/suites/vault_p0/create/load.groovy diff --git a/regression-test/suites/vault_p0/create/load.groovy b/regression-test/suites/vault_p0/create/load.groovy new file mode 100644 index 00000000000000..58974856db5e2a --- /dev/null +++ b/regression-test/suites/vault_p0/create/load.groovy @@ -0,0 +1,204 @@ +// 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("create_storage_vault", "nonConcurrent") { + if (!isCloudMode()) { + logger.info("skip test_create_vault case because not cloud mode") + return + } + + if (!enableStoragevault()) { + logger.info("skip test_create_vault case") + return + } + + expectExceptionLike({ + sql """ + CREATE STORAGE VAULT IF NOT EXISTS failed_vault + PROPERTIES ( + "type"="S3", + "fs.defaultFS"="${getHmsHdfsFs()}", + "path_prefix" = "ssb_sf1_p2", + "hadoop.username" = "hadoop" + ); + """ + }, "Missing [s3.endpoint] in properties") + + expectExceptionLike({ + sql """ + CREATE STORAGE VAULT IF NOT EXISTS failed_vault + PROPERTIES ( + "type"="hdfs", + "s3.bucket"="${getHmsHdfsFs()}", + "path_prefix" = "ssb_sf1_p2", + "hadoop.username" = "hadoop" + ); + """ + }, "invalid fs_name") + + expectExceptionLike({ + sql """ CREATE STORAGE VAULT IF NOT EXISTS failed_vault PROPERTIES (); """ + }, "mismatched input ')'") + + + sql """ + CREATE STORAGE VAULT IF NOT EXISTS create_hdfs_vault + PROPERTIES ( + "type"="hdfs", + "fs.defaultFS"="${getHmsHdfsFs()}", + "path_prefix" = "default_vault_ssb_hdfs_vault", + "hadoop.username" = "hadoop" + ); + """ + + try_sql """ DROP TABLE IF EXISTS create_table_use_vault FORCE; """ + + sql """ + CREATE TABLE IF NOT EXISTS create_table_use_vault ( + C_CUSTKEY INTEGER NOT NULL, + C_NAME INTEGER NOT NULL + ) + DUPLICATE KEY(C_CUSTKEY, C_NAME) + DISTRIBUTED BY HASH(C_CUSTKEY) BUCKETS 1 + PROPERTIES ( + "replication_num" = "1", + "storage_vault_name" = "create_hdfs_vault" + ) + """ + + String create_stmt = sql """ SHOW CREATE TABLE create_table_use_vault """ + + logger.info("the create table stmt is ${create_stmt}") + assertTrue(create_stmt.contains("create_hdfs_vault")) + + expectExceptionLike({ + sql """ + CREATE STORAGE VAULT create_hdfs_vault + PROPERTIES ( + "type"="hdfs", + "fs.defaultFS"="${getHmsHdfsFs()}", + "path_prefix" = "default_vault_ssb_hdfs_vault" + ); + """ + }, "already created") + + + sql """ + CREATE STORAGE VAULT IF NOT EXISTS create_s3_vault + PROPERTIES ( + "type"="S3", + "s3.endpoint"="${getS3Endpoint()}", + "s3.region" = "${getS3Region()}", + "s3.access_key" = "${getS3AK()}", + "s3.secret_key" = "${getS3SK()}", + "s3.root.path" = "test_create_s3_vault", + "s3.bucket" = "${getS3BucketName()}", + "s3.external_endpoint" = "", + "provider" = "${getS3Provider()}" + ); + """ + + expectExceptionLike({ + sql """ + CREATE STORAGE VAULT create_s3_vault + PROPERTIES ( + "type"="S3", + "s3.endpoint"="${getS3Endpoint()}", + "s3.region" = "${getS3Region()}", + "s3.access_key" = "${getS3AK()}", + "s3.secret_key" = "${getS3SK()}", + "s3.root.path" = "test_create_s3_vault", + "s3.bucket" = "${getS3BucketName()}", + "s3.external_endpoint" = "", + "provider" = "${getS3Provider()}" + ); + """ + }, "already created") + + // sql """ + // CREATE TABLE IF NOT EXISTS create_table_use_s3_vault ( + // C_CUSTKEY INTEGER NOT NULL, + // C_NAME INTEGER NOT NULL + // ) + // DUPLICATE KEY(C_CUSTKEY, C_NAME) + // DISTRIBUTED BY HASH(C_CUSTKEY) BUCKETS 1 + // PROPERTIES ( + // "replication_num" = "1", + // "storage_vault_name" = "create_s3_vault" + // ) + // """ + + // sql """ insert into create_table_use_s3_vault values(1,1); """ + + // sql """ select * from create_table_use_s3_vault; """ + + + // def vaults_info = try_sql """ show storage vault """ + + + // boolean create_hdfs_vault_exist = false; + // boolean create_s3_vault_exist = false; + // boolean built_in_storage_vault_exist = false; + // for (int i = 0; i < vaults_info.size(); i++) { + // def name = vaults_info[i][0] + // if (name.equals("create_hdfs_vault")) { + // create_hdfs_vault_exist = true; + // } + // if (name.equals("create_s3_vault")) { + // create_s3_vault_exist = true; + // } + // if (name.equals("built_in_storage_vault")) { + // built_in_storage_vault_exist = true + // } + // } + // assertTrue(create_hdfs_vault_exist) + // assertTrue(create_s3_vault_exist) + // assertTrue(built_in_storage_vault_exist) + + expectExceptionLike({ + sql """ + CREATE STORAGE VAULT built_in_storage_vault + PROPERTIES ( + "type"="S3", + "s3.endpoint"="${getS3Endpoint()}", + "s3.region" = "${getS3Region()}", + "s3.access_key" = "${getS3AK()}", + "s3.secret_key" = "${getS3SK()}", + "s3.root.path" = "test_built_in_storage_vault", + "s3.bucket" = "${getS3BucketName()}", + "s3.external_endpoint" = "", + "provider" = "${getS3Provider()}" + ); + """ + }, "already created") + + + // expectExceptionLike({ + // sql """ + // CREATE TABLE IF NOT EXISTS create_table_with_not_exist_vault ( + // C_CUSTKEY INTEGER NOT NULL, + // C_NAME INTEGER NOT NULL + // ) + // DUPLICATE KEY(C_CUSTKEY, C_NAME) + // DISTRIBUTED BY HASH(C_CUSTKEY) BUCKETS 1 + // PROPERTIES ( + // "replication_num" = "1", + // "storage_vault_name" = "not_exist_vault" + // ) + // """ + // }, "Storage vault 'not_exist_vault' does not exist") +} diff --git a/regression-test/suites/vault_p0/create/test_create_vault.groovy b/regression-test/suites/vault_p0/create/test_create_vault.groovy index 13c9f8d8283a4a..6bacf27fa5ab31 100644 --- a/regression-test/suites/vault_p0/create/test_create_vault.groovy +++ b/regression-test/suites/vault_p0/create/test_create_vault.groovy @@ -26,109 +26,6 @@ suite("test_create_vault", "nonConcurrent") { return } - expectExceptionLike({ - sql """ - CREATE STORAGE VAULT IF NOT EXISTS failed_vault - PROPERTIES ( - "type"="S3", - "fs.defaultFS"="${getHmsHdfsFs()}", - "path_prefix" = "ssb_sf1_p2", - "hadoop.username" = "hadoop" - ); - """ - }, "Missing [s3.endpoint] in properties") - - expectExceptionLike({ - sql """ - CREATE STORAGE VAULT IF NOT EXISTS failed_vault - PROPERTIES ( - "type"="hdfs", - "s3.bucket"="${getHmsHdfsFs()}", - "path_prefix" = "ssb_sf1_p2", - "hadoop.username" = "hadoop" - ); - """ - }, "invalid fs_name") - - expectExceptionLike({ - sql """ CREATE STORAGE VAULT IF NOT EXISTS failed_vault PROPERTIES (); """ - }, "mismatched input ')'") - - - sql """ - CREATE STORAGE VAULT IF NOT EXISTS create_hdfs_vault - PROPERTIES ( - "type"="hdfs", - "fs.defaultFS"="${getHmsHdfsFs()}", - "path_prefix" = "default_vault_ssb_hdfs_vault", - "hadoop.username" = "hadoop" - ); - """ - - try_sql """ DROP TABLE IF EXISTS create_table_use_vault FORCE; """ - - sql """ - CREATE TABLE IF NOT EXISTS create_table_use_vault ( - C_CUSTKEY INTEGER NOT NULL, - C_NAME INTEGER NOT NULL - ) - DUPLICATE KEY(C_CUSTKEY, C_NAME) - DISTRIBUTED BY HASH(C_CUSTKEY) BUCKETS 1 - PROPERTIES ( - "replication_num" = "1", - "storage_vault_name" = "create_hdfs_vault" - ) - """ - - String create_stmt = sql """ SHOW CREATE TABLE create_table_use_vault """ - - logger.info("the create table stmt is ${create_stmt}") - assertTrue(create_stmt.contains("create_hdfs_vault")) - - expectExceptionLike({ - sql """ - CREATE STORAGE VAULT create_hdfs_vault - PROPERTIES ( - "type"="hdfs", - "fs.defaultFS"="${getHmsHdfsFs()}", - "path_prefix" = "default_vault_ssb_hdfs_vault" - ); - """ - }, "already created") - - - sql """ - CREATE STORAGE VAULT IF NOT EXISTS create_s3_vault - PROPERTIES ( - "type"="S3", - "s3.endpoint"="${getS3Endpoint()}", - "s3.region" = "${getS3Region()}", - "s3.access_key" = "${getS3AK()}", - "s3.secret_key" = "${getS3SK()}", - "s3.root.path" = "test_create_s3_vault", - "s3.bucket" = "${getS3BucketName()}", - "s3.external_endpoint" = "", - "provider" = "${getS3Provider()}" - ); - """ - - expectExceptionLike({ - sql """ - CREATE STORAGE VAULT create_s3_vault - PROPERTIES ( - "type"="S3", - "s3.endpoint"="${getS3Endpoint()}", - "s3.region" = "${getS3Region()}", - "s3.access_key" = "${getS3AK()}", - "s3.secret_key" = "${getS3SK()}", - "s3.root.path" = "test_create_s3_vault", - "s3.bucket" = "${getS3BucketName()}", - "s3.external_endpoint" = "", - "provider" = "${getS3Provider()}" - ); - """ - }, "already created") - sql """ CREATE TABLE IF NOT EXISTS create_table_use_s3_vault ( C_CUSTKEY INTEGER NOT NULL, @@ -169,36 +66,4 @@ suite("test_create_vault", "nonConcurrent") { assertTrue(create_s3_vault_exist) assertTrue(built_in_storage_vault_exist) - expectExceptionLike({ - sql """ - CREATE STORAGE VAULT built_in_storage_vault - PROPERTIES ( - "type"="S3", - "s3.endpoint"="${getS3Endpoint()}", - "s3.region" = "${getS3Region()}", - "s3.access_key" = "${getS3AK()}", - "s3.secret_key" = "${getS3SK()}", - "s3.root.path" = "test_built_in_storage_vault", - "s3.bucket" = "${getS3BucketName()}", - "s3.external_endpoint" = "", - "provider" = "${getS3Provider()}" - ); - """ - }, "already created") - - - expectExceptionLike({ - sql """ - CREATE TABLE IF NOT EXISTS create_table_with_not_exist_vault ( - C_CUSTKEY INTEGER NOT NULL, - C_NAME INTEGER NOT NULL - ) - DUPLICATE KEY(C_CUSTKEY, C_NAME) - DISTRIBUTED BY HASH(C_CUSTKEY) BUCKETS 1 - PROPERTIES ( - "replication_num" = "1", - "storage_vault_name" = "not_exist_vault" - ) - """ - }, "Storage vault 'not_exist_vault' does not exist") } From eef94004420cf1ead472d60f4d04f66db42ab7f3 Mon Sep 17 00:00:00 2001 From: Gabriel Date: Wed, 20 Nov 2024 14:47:17 +0800 Subject: [PATCH 51/63] [fix](runtime filter) Fix runtime filter producers (#44294) A runtime filter producer may have multiple targets some of which are managed in global mgr and others are managed in local mgr. To process it, producer will be shared by both of global mgr and local mgr. In this PR, a producer will be always created by a local mgr and we can always find it by a queryCtx's RF mgr. --- be/src/exprs/runtime_filter.cpp | 14 +++++++------- be/src/exprs/runtime_filter.h | 15 +++++---------- be/src/runtime/runtime_filter_mgr.cpp | 27 ++++++++++++++------------- be/src/runtime/runtime_filter_mgr.h | 3 ++- be/src/runtime/runtime_state.cpp | 9 ++++++--- 5 files changed, 34 insertions(+), 34 deletions(-) diff --git a/be/src/exprs/runtime_filter.cpp b/be/src/exprs/runtime_filter.cpp index becda350d21d30..3eb3d406ad2901 100644 --- a/be/src/exprs/runtime_filter.cpp +++ b/be/src/exprs/runtime_filter.cpp @@ -975,8 +975,8 @@ class RuntimePredicateWrapper { Status IRuntimeFilter::create(RuntimeFilterParamsContext* state, const TRuntimeFilterDesc* desc, const TQueryOptions* query_options, const RuntimeFilterRole role, int node_id, std::shared_ptr* res, - bool build_bf_exactly, bool need_local_merge) { - *res = std::make_shared(state, desc, need_local_merge); + bool build_bf_exactly) { + *res = std::make_shared(state, desc); (*res)->set_role(role); return (*res)->init_with_desc(desc, query_options, node_id, build_bf_exactly); } @@ -1326,10 +1326,10 @@ bool IRuntimeFilter::get_ignored() { std::string IRuntimeFilter::formatted_state() const { return fmt::format( - "[IsPushDown = {}, RuntimeFilterState = {}, HasRemoteTarget = {}, " + "[Id = {}, IsPushDown = {}, RuntimeFilterState = {}, HasRemoteTarget = {}, " "HasLocalTarget = {}, Ignored = {}]", - _is_push_down, _get_explain_state_string(), _has_remote_target, _has_local_target, - _wrapper->_context->ignored); + _filter_id, _is_push_down, _get_explain_state_string(), _has_remote_target, + _has_local_target, _wrapper->_context->ignored); } Status IRuntimeFilter::init_with_desc(const TRuntimeFilterDesc* desc, const TQueryOptions* options, @@ -1524,9 +1524,9 @@ void IRuntimeFilter::update_runtime_filter_type_to_profile() { std::string IRuntimeFilter::debug_string() const { return fmt::format( - "RuntimeFilter: (id = {}, type = {}, need_local_merge: {}, is_broadcast: {}, " + "RuntimeFilter: (id = {}, type = {}, is_broadcast: {}, " "build_bf_cardinality: {}, error_msg: {}", - _filter_id, to_string(_runtime_filter_type), _need_local_merge, _is_broadcast_join, + _filter_id, to_string(_runtime_filter_type), _is_broadcast_join, _wrapper->get_build_bf_cardinality(), _wrapper->_context->err_msg); } diff --git a/be/src/exprs/runtime_filter.h b/be/src/exprs/runtime_filter.h index 4faefd10efa7cf..9d9021a747ba7b 100644 --- a/be/src/exprs/runtime_filter.h +++ b/be/src/exprs/runtime_filter.h @@ -192,8 +192,7 @@ enum RuntimeFilterState { /// that can be pushed down to node based on the results of the right table. class IRuntimeFilter { public: - IRuntimeFilter(RuntimeFilterParamsContext* state, const TRuntimeFilterDesc* desc, - bool need_local_merge = false) + IRuntimeFilter(RuntimeFilterParamsContext* state, const TRuntimeFilterDesc* desc) : _state(state), _filter_id(desc->filter_id), _is_broadcast_join(true), @@ -206,17 +205,16 @@ class IRuntimeFilter { _wait_infinitely(_state->get_query_ctx()->runtime_filter_wait_infinitely()), _rf_wait_time_ms(_state->get_query_ctx()->runtime_filter_wait_time_ms()), _runtime_filter_type(get_runtime_filter_type(desc)), - _profile( - new RuntimeProfile(fmt::format("RuntimeFilter: (id = {}, type = {})", - _filter_id, to_string(_runtime_filter_type)))), - _need_local_merge(need_local_merge) {} + _profile(new RuntimeProfile(fmt::format("RuntimeFilter: (id = {}, type = {})", + _filter_id, + to_string(_runtime_filter_type)))) {} ~IRuntimeFilter() = default; static Status create(RuntimeFilterParamsContext* state, const TRuntimeFilterDesc* desc, const TQueryOptions* query_options, const RuntimeFilterRole role, int node_id, std::shared_ptr* res, - bool build_bf_exactly = false, bool need_local_merge = false); + bool build_bf_exactly = false); RuntimeFilterContextSPtr& get_shared_context_ref(); @@ -417,9 +415,6 @@ class IRuntimeFilter { // parent profile // only effect on consumer std::unique_ptr _profile; - // `_need_local_merge` indicates whether this runtime filter is global on this BE. - // All runtime filters should be merged on each BE before push_to_remote or publish. - bool _need_local_merge = false; std::vector> _filter_timer; diff --git a/be/src/runtime/runtime_filter_mgr.cpp b/be/src/runtime/runtime_filter_mgr.cpp index 05dda38820f956..70ce8add789d13 100644 --- a/be/src/runtime/runtime_filter_mgr.cpp +++ b/be/src/runtime/runtime_filter_mgr.cpp @@ -110,8 +110,7 @@ Status RuntimeFilterMgr::register_consumer_filter(const TRuntimeFilterDesc& desc if (!has_exist) { std::shared_ptr filter; RETURN_IF_ERROR(IRuntimeFilter::create(_state, &desc, &options, RuntimeFilterRole::CONSUMER, - node_id, &filter, build_bf_exactly, - need_local_merge)); + node_id, &filter, build_bf_exactly)); _consumer_map[key].emplace_back(node_id, filter); *consumer_filter = filter; } else if (!need_local_merge) { @@ -123,7 +122,7 @@ Status RuntimeFilterMgr::register_consumer_filter(const TRuntimeFilterDesc& desc Status RuntimeFilterMgr::register_local_merge_producer_filter( const doris::TRuntimeFilterDesc& desc, const doris::TQueryOptions& options, - std::shared_ptr* producer_filter, bool build_bf_exactly) { + std::shared_ptr producer_filter, bool build_bf_exactly) { DCHECK(_is_global); SCOPED_CONSUME_MEM_TRACKER(_tracker.get()); int32_t key = desc.filter_id; @@ -139,21 +138,19 @@ Status RuntimeFilterMgr::register_local_merge_producer_filter( } DCHECK(_state != nullptr); - RETURN_IF_ERROR(IRuntimeFilter::create(_state, &desc, &options, RuntimeFilterRole::PRODUCER, -1, - producer_filter, build_bf_exactly, true)); { std::lock_guard l(*iter->second.lock); if (iter->second.filters.empty()) { std::shared_ptr merge_filter; RETURN_IF_ERROR(IRuntimeFilter::create(_state, &desc, &options, RuntimeFilterRole::PRODUCER, -1, &merge_filter, - build_bf_exactly, true)); + build_bf_exactly)); merge_filter->set_ignored(); iter->second.filters.emplace_back(merge_filter); } iter->second.merge_time++; iter->second.merge_size_times++; - iter->second.filters.emplace_back(*producer_filter); + iter->second.filters.emplace_back(producer_filter); } return Status::OK(); } @@ -174,6 +171,16 @@ Status RuntimeFilterMgr::get_local_merge_producer_filters( return Status::OK(); } +doris::LocalMergeFilters* RuntimeFilterMgr::get_local_merge_producer_filters(int filter_id) { + DCHECK(_is_global); + std::lock_guard l(_lock); + auto iter = _local_merge_producer_map.find(filter_id); + if (iter == _local_merge_producer_map.end()) { + return nullptr; + } + return &iter->second; +} + Status RuntimeFilterMgr::register_producer_filter(const TRuntimeFilterDesc& desc, const TQueryOptions& options, std::shared_ptr* producer_filter, @@ -385,12 +392,6 @@ Status RuntimeFilterMergeControllerEntity::send_filter_size(std::weak_ptrfilter_id()); - if (filter) { - filter->set_synced_size(request->filter_size()); - return Status::OK(); - } - LocalMergeFilters* local_merge_filters = nullptr; RETURN_IF_ERROR(get_local_merge_producer_filters(request->filter_id(), &local_merge_filters)); // first filter size merged filter diff --git a/be/src/runtime/runtime_filter_mgr.h b/be/src/runtime/runtime_filter_mgr.h index 0be5f213ea4744..83c526c31a9569 100644 --- a/be/src/runtime/runtime_filter_mgr.h +++ b/be/src/runtime/runtime_filter_mgr.h @@ -102,10 +102,11 @@ class RuntimeFilterMgr { Status register_local_merge_producer_filter(const TRuntimeFilterDesc& desc, const TQueryOptions& options, - std::shared_ptr* producer_filter, + std::shared_ptr producer_filter, bool build_bf_exactly = false); Status get_local_merge_producer_filters(int filter_id, LocalMergeFilters** local_merge_filters); + LocalMergeFilters* get_local_merge_producer_filters(int filter_id); Status register_producer_filter(const TRuntimeFilterDesc& desc, const TQueryOptions& options, std::shared_ptr* producer_filter, diff --git a/be/src/runtime/runtime_state.cpp b/be/src/runtime/runtime_state.cpp index a4572dffad6bb4..344180bad771ac 100644 --- a/be/src/runtime/runtime_state.cpp +++ b/be/src/runtime/runtime_state.cpp @@ -518,10 +518,13 @@ RuntimeFilterMgr* RuntimeState::global_runtime_filter_mgr() { Status RuntimeState::register_producer_runtime_filter( const TRuntimeFilterDesc& desc, std::shared_ptr* producer_filter, bool build_bf_exactly) { - RETURN_IF_ERROR(global_runtime_filter_mgr()->register_local_merge_producer_filter( + // Producers are created by local runtime filter mgr and shared by global runtime filter manager. + // When RF is published, consumers in both global and local RF mgr will be found. + RETURN_IF_ERROR(local_runtime_filter_mgr()->register_producer_filter( desc, query_options(), producer_filter, build_bf_exactly)); - return local_runtime_filter_mgr()->register_producer_filter(desc, query_options(), - producer_filter, build_bf_exactly); + RETURN_IF_ERROR(global_runtime_filter_mgr()->register_local_merge_producer_filter( + desc, query_options(), *producer_filter, build_bf_exactly)); + return Status::OK(); } Status RuntimeState::register_consumer_runtime_filter( From c412e94e40dcb64b1c66f2d6031d3374035ef48e Mon Sep 17 00:00:00 2001 From: Yongqiang YANG Date: Wed, 20 Nov 2024 14:50:37 +0800 Subject: [PATCH 52/63] [chore](build) put tools in release package (#44216) --- build-for-release.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/build-for-release.sh b/build-for-release.sh index 2347f9ebaab5e1..41580c91a00f86 100755 --- a/build-for-release.sh +++ b/build-for-release.sh @@ -128,6 +128,7 @@ FE="fe" BE="be" CLOUD="ms" EXT="extensions" +TOOLS="tools" PACKAGE="apache-doris-${VERSION}-bin-${ARCH}" if [[ "${_USE_AVX2}" == "0" ]]; then @@ -139,6 +140,7 @@ OUTPUT_FE="${OUTPUT}/${FE}" OUTPUT_EXT="${OUTPUT}/${EXT}" OUTPUT_BE="${OUTPUT}/${BE}" OUTPUT_CLOUD="${OUTPUT}/${CLOUD}" +OUTPUT_TOOLS="${OUTPUT}/${TOOLS}" echo "Package Name:" echo "FE: ${OUTPUT_FE}" @@ -152,7 +154,7 @@ sh build.sh --clean && echo "Begin to pack" rm -rf "${OUTPUT}" -mkdir -p "${OUTPUT_FE}" "${OUTPUT_BE}" "${OUTPUT_EXT}" "${OUTPUT_CLOUD}" +mkdir -p "${OUTPUT_FE}" "${OUTPUT_BE}" "${OUTPUT_EXT}" "${OUTPUT_CLOUD}" "${OUTPUT_TOOLS}" # FE cp -R "${ORI_OUTPUT}"/fe/* "${OUTPUT_FE}"/ @@ -177,5 +179,8 @@ if [[ "${TAR}" -eq 1 ]]; then cd - fi +# TOOL +cp -R "${ORI_OUTPUT}"/tools/* "${OUTPUT_TOOLS}"/ + echo "Output dir: ${OUTPUT}" exit 0 From 070489cc82864e1d2eaaaefb96c3b7962dc289e0 Mon Sep 17 00:00:00 2001 From: 924060929 Date: Wed, 20 Nov 2024 15:10:57 +0800 Subject: [PATCH 53/63] [fix](Nerieds) fix Illegal join with wrong distribution STORAGE_BUCKETED (#44257) fix ``` java.lang.IllegalStateException: exceptions : exception : errCode = 2, detailMessage = Illegal join with wrong distribution, left: STORAGE_BUCKETED, right: STORAGE_BUCKETED ``` --- .../ChildOutputPropertyDeriver.java | 24 +----- .../shuffle_storage_bucketed.groovy | 78 +++++++++++++++++++ 2 files changed, 80 insertions(+), 22 deletions(-) create mode 100644 regression-test/suites/nereids_syntax_p0/distribute/shuffle_storage_bucketed.groovy 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 1a95fb5f9e3807..11d35f933464ad 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 @@ -549,30 +549,10 @@ private ShuffleSide computeShuffleSide(DistributionSpecHash leftHashSpec, Distri ShuffleType rightShuffleType = rightHashSpec.getShuffleType(); switch (leftShuffleType) { case EXECUTION_BUCKETED: - if (rightShuffleType == ShuffleType.EXECUTION_BUCKETED) { - return ShuffleSide.BOTH; - } - break; case STORAGE_BUCKETED: - if (rightShuffleType == ShuffleType.NATURAL) { - // use storage hash to shuffle left to right to do bucket shuffle join - return ShuffleSide.LEFT; - } - break; + return rightShuffleType == ShuffleType.NATURAL ? ShuffleSide.LEFT : ShuffleSide.BOTH; case NATURAL: - switch (rightShuffleType) { - case NATURAL: - // colocate join - return ShuffleSide.NONE; - case STORAGE_BUCKETED: - // use storage hash to shuffle right to left to do bucket shuffle join - return ShuffleSide.RIGHT; - case EXECUTION_BUCKETED: - // compatible old ut - return ShuffleSide.RIGHT; - default: - } - break; + return rightShuffleType == ShuffleType.NATURAL ? ShuffleSide.NONE : ShuffleSide.RIGHT; default: } throw new IllegalStateException( diff --git a/regression-test/suites/nereids_syntax_p0/distribute/shuffle_storage_bucketed.groovy b/regression-test/suites/nereids_syntax_p0/distribute/shuffle_storage_bucketed.groovy new file mode 100644 index 00000000000000..884336d0b73f65 --- /dev/null +++ b/regression-test/suites/nereids_syntax_p0/distribute/shuffle_storage_bucketed.groovy @@ -0,0 +1,78 @@ +// 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("shuffle_storage_bucketed") { + multi_sql """ + drop table if exists du; + drop table if exists o; + drop table if exists ds; + + CREATE TABLE `du` ( + `et` datetime NOT NULL, + `st` datetime NOT NULL, + `gc` varchar(50) NOT NULL, + `pc` varchar(50) NOT NULL, + `uk` varchar(255) NOT NULL + ) ENGINE=OLAP + DUPLICATE KEY(`et`, `st`, `gc`, `pc`, `uk`) + DISTRIBUTED BY HASH(`gc`, `pc`) BUCKETS 4 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1" + ); + + CREATE TABLE `o` ( + `d` date NULL, + `g` varchar(500) NULL, + `p` varchar(500) NULL, + `dt` datetime NULL + ) ENGINE=OLAP + DUPLICATE KEY(`d`, `g`, `p`) + DISTRIBUTED BY HASH(`g`, `p`) BUCKETS 4 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1" + ); + + CREATE TABLE `ds` ( + `gc` varchar(50) NOT NULL, + `pc` varchar(50) NOT NULL, + `s` int NULL, + `n` varchar(50) NULL + ) ENGINE=OLAP + DUPLICATE KEY(`gc`, `pc`, `s`, `n`) + DISTRIBUTED BY HASH(`gc`, `pc`, `s`, `n`) BUCKETS 4 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1" + ); + + set disable_nereids_rules='PRUNE_EMPTY_PARTITION'; + """ + + sql """ + explain plan + select * + from du + right outer join + ( + select g gc, p pc + from o + where date(dt) = '2020-05-25 00:00:00' + ) r + on r.gc=du.gc and r.pc=du.pc + left join ds s + on r.gc=s.gc and r.pc=s.pc; + """ +} From 61a49ad9386b2f3d6dd89363657d6dc06d768a13 Mon Sep 17 00:00:00 2001 From: wudi Date: Wed, 20 Nov 2024 15:13:30 +0800 Subject: [PATCH 54/63] [improve](extension) improve kettle plugin and add some testcase (#44324) ### What problem does this PR solve? improve kettle plugin and add some testcase --- extension/kettle/impl/pom.xml | 6 + .../dorisstreamloader/DorisStreamLoader.java | 6 + .../DorisStreamLoaderMeta.java | 18 +- .../load/DorisBatchStreamLoad.java | 10 +- .../DorisBatchStreamLoadTest.java | 2 +- .../DorisRecordSerializerTest.java | 82 ++++ .../DorisStreamLoaderMetaTest.java | 114 +++++ .../DorisStreamLoaderTest.java | 389 ++++++++++++++++++ 8 files changed, 623 insertions(+), 4 deletions(-) create mode 100644 extension/kettle/impl/src/test/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisRecordSerializerTest.java create mode 100644 extension/kettle/impl/src/test/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisStreamLoaderMetaTest.java create mode 100644 extension/kettle/impl/src/test/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisStreamLoaderTest.java diff --git a/extension/kettle/impl/pom.xml b/extension/kettle/impl/pom.xml index 59b3f42934b82c..64eb91076ddda9 100644 --- a/extension/kettle/impl/pom.xml +++ b/extension/kettle/impl/pom.xml @@ -66,6 +66,12 @@ under the License. tests test + + mysql + mysql-connector-java + 8.0.26 + test + diff --git a/extension/kettle/impl/src/main/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisStreamLoader.java b/extension/kettle/impl/src/main/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisStreamLoader.java index 85dc097be4e69a..91b546baf2104f 100644 --- a/extension/kettle/impl/src/main/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisStreamLoader.java +++ b/extension/kettle/impl/src/main/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisStreamLoader.java @@ -17,6 +17,7 @@ package org.pentaho.di.trans.steps.dorisstreamloader; +import com.google.common.annotations.VisibleForTesting; import org.apache.commons.lang.StringUtils; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.row.ValueMetaInterface; @@ -172,4 +173,9 @@ public void dispose( StepMetaInterface smi, StepDataInterface sdi ) { super.dispose( smi, sdi ); } + + @VisibleForTesting + public DorisBatchStreamLoad getStreamLoad(){ + return streamLoad; + } } diff --git a/extension/kettle/impl/src/main/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisStreamLoaderMeta.java b/extension/kettle/impl/src/main/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisStreamLoaderMeta.java index 12d72d838afd1d..5e111b1bf38cf7 100644 --- a/extension/kettle/impl/src/main/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisStreamLoaderMeta.java +++ b/extension/kettle/impl/src/main/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisStreamLoaderMeta.java @@ -24,9 +24,11 @@ import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.exception.KettleStepException; import org.pentaho.di.core.exception.KettleXMLException; +import org.pentaho.di.core.injection.AfterInjection; import org.pentaho.di.core.injection.Injection; import org.pentaho.di.core.injection.InjectionSupported; import org.pentaho.di.core.row.RowMetaInterface; +import org.pentaho.di.core.util.Utils; import org.pentaho.di.core.variables.VariableSpace; import org.pentaho.di.core.xml.XMLHandler; import org.pentaho.di.i18n.BaseMessages; @@ -341,7 +343,7 @@ public void setDeletable(boolean deletable) { this.deletable = deletable; } - public String[] getFieldTable() { + public String[] getFieldTable() { return fieldTable; } @@ -379,4 +381,18 @@ public String toString() { ", fieldStream=" + Arrays.toString(fieldStream) + '}'; } + + /** + * If we use injection we can have different arrays lengths. + * We need synchronize them for consistency behavior with UI + */ + @AfterInjection + public void afterInjectionSynchronization() { + int nrFields = (fieldTable == null) ? -1 : fieldTable.length; + if (nrFields <= 0) { + return; + } + String[][] rtnStrings = Utils.normalizeArrays(nrFields, fieldStream); + fieldStream = rtnStrings[0]; + } } diff --git a/extension/kettle/impl/src/main/java/org/pentaho/di/trans/steps/dorisstreamloader/load/DorisBatchStreamLoad.java b/extension/kettle/impl/src/main/java/org/pentaho/di/trans/steps/dorisstreamloader/load/DorisBatchStreamLoad.java index a73725add00ba2..226f5f61e7389d 100644 --- a/extension/kettle/impl/src/main/java/org/pentaho/di/trans/steps/dorisstreamloader/load/DorisBatchStreamLoad.java +++ b/extension/kettle/impl/src/main/java/org/pentaho/di/trans/steps/dorisstreamloader/load/DorisBatchStreamLoad.java @@ -259,6 +259,10 @@ private synchronized boolean doFlush( } private synchronized boolean flush(String bufferKey, boolean waitUtilDone) { + if (bufferMap.isEmpty()) { + // bufferMap may have been flushed by other threads + return false; + } if (null == bufferKey) { boolean flush = false; for (String key : bufferMap.keySet()) { @@ -275,7 +279,7 @@ private synchronized boolean flush(String bufferKey, boolean waitUtilDone) { } else if (bufferMap.containsKey(bufferKey)) { flushBuffer(bufferKey); } else { - throw new DorisRuntimeException("buffer not found for key: " + bufferKey); + log.logDetailed("buffer not found for key: {}, may be already flushed.", bufferKey); } if (waitUtilDone) { waitAsyncLoadFinish(); @@ -311,7 +315,9 @@ private void checkFlushException() { } private void waitAsyncLoadFinish() { - for (int i = 0; i < FLUSH_QUEUE_SIZE + 1; i++) { + // Because the flush thread will drainTo once after polling is completed + // if queue_size is 2, at least 4 empty queues must be consumed to ensure that flush has been completed + for (int i = 0; i < FLUSH_QUEUE_SIZE * 2; i++) { BatchRecordBuffer empty = new BatchRecordBuffer(); putRecordToFlushQueue(empty); } diff --git a/extension/kettle/impl/src/test/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisBatchStreamLoadTest.java b/extension/kettle/impl/src/test/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisBatchStreamLoadTest.java index c8d79156c18627..556d3737bf4575 100644 --- a/extension/kettle/impl/src/test/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisBatchStreamLoadTest.java +++ b/extension/kettle/impl/src/test/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisBatchStreamLoadTest.java @@ -32,7 +32,7 @@ public class DorisBatchStreamLoadTest { @Ignore public void testStreamLoad() throws Exception { DorisOptions options = DorisOptions.builder() - .withFenodes("10.16.10.6:28737") + .withFenodes("127.0.0.1:8030") .withDatabase("test") .withTable("test_flink_c") .withUsername("root") diff --git a/extension/kettle/impl/src/test/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisRecordSerializerTest.java b/extension/kettle/impl/src/test/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisRecordSerializerTest.java new file mode 100644 index 00000000000000..19b3ba6463cbb1 --- /dev/null +++ b/extension/kettle/impl/src/test/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisRecordSerializerTest.java @@ -0,0 +1,82 @@ +// 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.pentaho.di.trans.steps.dorisstreamloader; + +import org.junit.Assert; +import org.junit.Test; +import org.pentaho.di.core.logging.LogChannel; +import org.pentaho.di.core.row.ValueMetaInterface; +import org.pentaho.di.core.row.value.ValueMetaBigNumber; +import org.pentaho.di.core.row.value.ValueMetaBinary; +import org.pentaho.di.core.row.value.ValueMetaBoolean; +import org.pentaho.di.core.row.value.ValueMetaDate; +import org.pentaho.di.core.row.value.ValueMetaInteger; +import org.pentaho.di.core.row.value.ValueMetaInternetAddress; +import org.pentaho.di.core.row.value.ValueMetaNumber; +import org.pentaho.di.core.row.value.ValueMetaString; +import org.pentaho.di.core.row.value.ValueMetaTimestamp; +import org.pentaho.di.trans.steps.dorisstreamloader.serializer.DorisRecordSerializer; + +import java.math.BigDecimal; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import javax.mail.internet.InternetAddress; + +import static org.pentaho.di.trans.steps.dorisstreamloader.load.LoadConstants.CSV; + +public class DorisRecordSerializerTest { + + @Test + public void testSerialize() throws Exception { + ValueMetaInterface[] formatMeta = new ValueMetaInterface[]{ + new ValueMetaBoolean("boolean"), + new ValueMetaInteger("integer"), + new ValueMetaNumber("number"), + new ValueMetaBigNumber("bignumber"), + new ValueMetaDate("date"), + new ValueMetaTimestamp("timestamp"), + new ValueMetaBinary("binary"), + new ValueMetaString("string"), + new ValueMetaInternetAddress("address"), + }; + + DorisRecordSerializer serializer = DorisRecordSerializer.builder() + .setType(CSV) + .setFieldNames(new String[]{"c_boolean", "c_integer", "c_number", "c_bignumber", "c_date", "c_timestamp", "c_binary", "c_string", "c_internetAddress"}) + .setFormatMeta(formatMeta) + .setFieldDelimiter(",") + .setLogChannelInterface(new LogChannel()) + .setDeletable(false) + .build(); + + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + Object[] data = new Object[]{ + true, + 10L, + 123.23, + new BigDecimal("123456789.1234"), + dateFormat.parse("2024-01-01"), + Timestamp.valueOf("2024-01-01 10:11:22.123"), + "binary", + "string", + new InternetAddress("127.0.0.1")}; + String actual = serializer.buildCSVString(data, formatMeta.length); + String except = "true,10,123.23,123456789.1234,2024-01-01,2024-01-01 10:11:22.123,binary,string,127.0.0.1"; + Assert.assertEquals(except, actual); + } +} diff --git a/extension/kettle/impl/src/test/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisStreamLoaderMetaTest.java b/extension/kettle/impl/src/test/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisStreamLoaderMetaTest.java new file mode 100644 index 00000000000000..4a9f0f36c30bc8 --- /dev/null +++ b/extension/kettle/impl/src/test/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisStreamLoaderMetaTest.java @@ -0,0 +1,114 @@ +// 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.pentaho.di.trans.steps.dorisstreamloader; + +import org.junit.Assert; +import org.junit.ClassRule; +import org.junit.Test; +import org.pentaho.di.core.exception.KettleException; +import org.pentaho.di.junit.rules.RestorePDIEngineEnvironment; +import org.pentaho.di.trans.steps.loadsave.LoadSaveTester; +import org.pentaho.di.trans.steps.loadsave.validator.ArrayLoadSaveValidator; +import org.pentaho.di.trans.steps.loadsave.validator.FieldLoadSaveValidator; +import org.pentaho.di.trans.steps.loadsave.validator.IntLoadSaveValidator; +import org.pentaho.di.trans.steps.loadsave.validator.LongLoadSaveValidator; +import org.pentaho.di.trans.steps.loadsave.validator.StringLoadSaveValidator; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class DorisStreamLoaderMetaTest { + + @ClassRule + public static RestorePDIEngineEnvironment env = new RestorePDIEngineEnvironment(); + + @Test + public void testRoundTrip() throws KettleException { + List attributes = + Arrays.asList( "fenodes", "database", "table", "username", "password", + "streamLoadProp", "bufferFlushMaxRows", "bufferFlushMaxBytes", "maxRetries", + "deletable", "stream_name", "field_name"); + + Map getterMap = new HashMap<>(); + getterMap.put( "fenodes", "getFenodes" ); + getterMap.put( "database", "getDatabase" ); + getterMap.put( "table", "getTable" ); + getterMap.put( "username", "getUsername" ); + getterMap.put( "password", "getPassword" ); + getterMap.put( "streamLoadProp", "getStreamLoadProp" ); + getterMap.put( "bufferFlushMaxRows", "getBufferFlushMaxRows" ); + getterMap.put( "bufferFlushMaxBytes", "getBufferFlushMaxBytes" ); + getterMap.put( "maxRetries", "getMaxRetries" ); + getterMap.put( "deletable", "isDeletable" ); + getterMap.put( "stream_name", "getFieldTable" ); + getterMap.put( "field_name", "getFieldStream" ); + + Map setterMap = new HashMap<>(); + setterMap.put( "fenodes", "setFenodes" ); + setterMap.put( "database", "setDatabase" ); + setterMap.put( "table", "setTable" ); + setterMap.put( "username", "setUsername" ); + setterMap.put( "password", "setPassword" ); + setterMap.put( "streamLoadProp", "setStreamLoadProp" ); + setterMap.put( "bufferFlushMaxRows", "setBufferFlushMaxRows" ); + setterMap.put( "bufferFlushMaxBytes", "setBufferFlushMaxBytes" ); + setterMap.put( "maxRetries", "setMaxRetries" ); + setterMap.put( "deletable", "setDeletable" ); + setterMap.put( "stream_name", "setFieldTable" ); + setterMap.put( "field_name", "setFieldStream" ); + + Map> fieldLoadSaveValidatorAttributeMap = new HashMap<>(); + FieldLoadSaveValidator stringArrayLoadSaveValidator = new ArrayLoadSaveValidator<>( new StringLoadSaveValidator(), 25 ); + + fieldLoadSaveValidatorAttributeMap.put("maxRetries", new IntLoadSaveValidator( Integer.MAX_VALUE )); + fieldLoadSaveValidatorAttributeMap.put("bufferFlushMaxRows", new LongLoadSaveValidator()); + fieldLoadSaveValidatorAttributeMap.put("bufferFlushMaxBytes", new LongLoadSaveValidator()); + fieldLoadSaveValidatorAttributeMap.put("streamLoadProp", new StringLoadSaveValidator()); + fieldLoadSaveValidatorAttributeMap.put("stream_name", stringArrayLoadSaveValidator ); + fieldLoadSaveValidatorAttributeMap.put("field_name", stringArrayLoadSaveValidator ); + + LoadSaveTester loadSaveTester = + new LoadSaveTester( DorisStreamLoaderMeta.class, attributes, getterMap, setterMap, + fieldLoadSaveValidatorAttributeMap, new HashMap>() ); + + loadSaveTester.testSerialization(); + } + + @Test + public void testPDI16559() throws Exception { + DorisStreamLoaderMeta streamLoader = new DorisStreamLoaderMeta(); + streamLoader.setFieldTable( new String[] { "table1", "table2", "table3" } ); + streamLoader.setFieldStream( new String[] { "stream1" } ); + streamLoader.setTable( "test_table" ); + + try { + String badXml = streamLoader.getXML(); + Assert.fail( "Before calling afterInjectionSynchronization, should have thrown an ArrayIndexOOB" ); + } catch ( Exception expected ) { + // Do Nothing + } + streamLoader.afterInjectionSynchronization(); + //run without a exception + String ktrXml = streamLoader.getXML(); + + int targetSz = streamLoader.getFieldTable().length; + Assert.assertEquals( targetSz, streamLoader.getFieldStream().length ); + } +} diff --git a/extension/kettle/impl/src/test/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisStreamLoaderTest.java b/extension/kettle/impl/src/test/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisStreamLoaderTest.java new file mode 100644 index 00000000000000..45cadf62f78d5e --- /dev/null +++ b/extension/kettle/impl/src/test/java/org/pentaho/di/trans/steps/dorisstreamloader/DorisStreamLoaderTest.java @@ -0,0 +1,389 @@ +// 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.pentaho.di.trans.steps.dorisstreamloader; + +import com.google.common.base.Preconditions; +import org.apache.commons.lang.StringUtils; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Test; +import org.mockito.Mockito; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.pentaho.di.core.KettleEnvironment; +import org.pentaho.di.core.exception.KettleException; +import org.pentaho.di.core.plugins.PluginRegistry; +import org.pentaho.di.core.plugins.StepPluginType; +import org.pentaho.di.core.row.RowMeta; +import org.pentaho.di.core.row.value.ValueMetaBigNumber; +import org.pentaho.di.core.row.value.ValueMetaBoolean; +import org.pentaho.di.core.row.value.ValueMetaDate; +import org.pentaho.di.core.row.value.ValueMetaInteger; +import org.pentaho.di.core.row.value.ValueMetaNumber; +import org.pentaho.di.core.row.value.ValueMetaString; +import org.pentaho.di.core.row.value.ValueMetaTimestamp; +import org.pentaho.di.junit.rules.RestorePDIEngineEnvironment; +import org.pentaho.di.trans.Trans; +import org.pentaho.di.trans.TransMeta; +import org.pentaho.di.trans.step.StepMeta; +import org.pentaho.di.trans.steps.dorisstreamloader.load.DorisRuntimeException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.sql.Timestamp; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; + +/** + * Test the deletion and writing process of kettle, + * temporarily using the doris environment passed in by the user. + * mvn clean package -Ddoris_host=127.0.0.1 -Ddoris_http_port=8030 -Ddoris_passwd= -Ddoris_query_port=9030 -Ddoris_user=root + */ +public class DorisStreamLoaderTest { + + @ClassRule + public static RestorePDIEngineEnvironment env = new RestorePDIEngineEnvironment(); + private static final Logger LOG = LoggerFactory.getLogger(DorisStreamLoaderTest.class); + DorisStreamLoaderMeta lmeta; + DorisStreamLoaderData ldata; + DorisStreamLoader lder; + StepMeta smeta; + + private static final String JDBC_URL = "jdbc:mysql://%s:%s"; + private static final String DATABASE = "test_kettle"; + private static final String TABLE_INSERT = "tbl_insert"; + private static final String TABLE_DELETE = "tbl_delete"; + private static String HOST; + private static String QUERY_PORT; + private static String HTTP_PORT; + private static String USER; + private static String PASSWD; + + @BeforeClass + public static void initEnvironment() throws Exception { + checkParams(); + KettleEnvironment.init(); + } + + private static void checkParams() { + Preconditions.checkArgument( + System.getProperty("doris_host") != null, "doris_host is required."); + Preconditions.checkArgument( + System.getProperty("doris_query_port") != null, "doris_query_port is required."); + Preconditions.checkArgument( + System.getProperty("doris_http_port") != null, "doris_http_port is required."); + Preconditions.checkArgument( + System.getProperty("doris_user") != null, "doris_user is required."); + Preconditions.checkArgument( + System.getProperty("doris_passwd") != null, "doris_passwd is required."); + HOST = System.getProperty("doris_host"); + QUERY_PORT = System.getProperty("doris_query_port"); + HTTP_PORT = System.getProperty("doris_http_port"); + USER = System.getProperty("doris_user"); + PASSWD = System.getProperty("doris_passwd"); + } + + @Test + public void testWrite() throws KettleException, ParseException, InterruptedException { + TransMeta transMeta = new TransMeta(); + transMeta.setName( "DorisStreamLoader" ); + + Map vars = new HashMap(); + vars.put( "fenodes", HOST + ":" + HTTP_PORT); + vars.put( "database", DATABASE ); + vars.put( "table", TABLE_INSERT ); + vars.put( "username", USER ); + vars.put( "password", PASSWD ); + vars.put( "bufferFlushMaxRows", "10000"); + vars.put( "bufferFlushMaxBytes", 10 * 1024 * 1024 + ""); + vars.put( "streamLoadProp", "format:json;read_json_by_line:true" ); + vars.put( "maxRetries", "3" ); + vars.put( "deletable", "false" ); + transMeta.injectVariables(vars); + + lmeta = new DorisStreamLoaderMeta(); + lmeta.setFenodes(transMeta.environmentSubstitute("${fenodes}")); + lmeta.setDatabase(transMeta.environmentSubstitute("${database}")); + lmeta.setTable(transMeta.environmentSubstitute("${table}")); + lmeta.setUsername(transMeta.environmentSubstitute("${username}")); + lmeta.setPassword(transMeta.environmentSubstitute("${password}")); + lmeta.setBufferFlushMaxRows(Long.parseLong(transMeta.environmentSubstitute("${bufferFlushMaxRows}"))); + lmeta.setBufferFlushMaxBytes(Long.parseLong(transMeta.environmentSubstitute("${bufferFlushMaxBytes}"))); + lmeta.setMaxRetries(Integer.parseInt(transMeta.environmentSubstitute("${maxRetries}"))); + lmeta.setStreamLoadProp(transMeta.environmentSubstitute("${streamLoadProp}")); + lmeta.setDeletable(Boolean.parseBoolean(transMeta.environmentSubstitute("${deletable}"))); + lmeta.setFieldStream(new String[]{"id", "c1", "c2", "c3","c4","c5","c6"}); + lmeta.setFieldTable(new String[]{"id", "c1", "c2", "c3","c4","c5","c6"}); + + ldata = new DorisStreamLoaderData(); + PluginRegistry plugReg = PluginRegistry.getInstance(); + String mblPid = plugReg.getPluginId( StepPluginType.class, lmeta ); + smeta = new StepMeta( mblPid, "DorisStreamLoader", lmeta ); + Trans trans = new Trans( transMeta ); + transMeta.addStep( smeta ); + lder = Mockito.spy(new DorisStreamLoader( smeta, ldata, 1, transMeta, trans )); + + RowMeta rm = new RowMeta(); + rm.addValueMeta(new ValueMetaInteger("id")); + rm.addValueMeta(new ValueMetaBoolean("c1")); + rm.addValueMeta(new ValueMetaBigNumber("c2")); + rm.addValueMeta(new ValueMetaNumber("c3")); + rm.addValueMeta(new ValueMetaDate("c4")); + rm.addValueMeta(new ValueMetaTimestamp("c5")); + rm.addValueMeta(new ValueMetaString("c6")); + lder.setInputRowMeta(rm); + + lder.copyVariablesFrom( transMeta ); + initializeTable(TABLE_INSERT); + lder.init(lmeta, ldata); + + Object[] data = new Object[]{ + 1L, + true, + BigDecimal.valueOf(123456789L), + 12345.6789, + new SimpleDateFormat("yyyy-MM-dd").parse("2024-11-18"), + Timestamp.valueOf("2024-11-18 15:30:45"), + "First Row"}; + doReturn(data).when(lder).getRow(); + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocationOnMock) throws Throwable { + lder.dispose(lmeta, ldata); + return null; + } + }).when(lder).putRow(any(), any()); + lder.processRow(lmeta, ldata); + lder.dispose(lmeta, ldata); + + while (lder.getStreamLoad() != null && lder.getStreamLoad().isLoadThreadAlive()){ + Thread.sleep(1000); + LOG.info("Waiting for load thread to finish."); + } + List expected = Arrays.asList("1,true,123456789,12345.6789,2024-11-18,2024-11-18T15:30:45,First Row"); + String query = + String.format("select * from %s.%s order by 1", DATABASE, TABLE_INSERT); + checkResult(getQueryConnection(), LOG, expected, query, 7); + } + + + @Test + public void testDelete() throws KettleException, ParseException, InterruptedException { + TransMeta transMeta = new TransMeta(); + transMeta.setName( "DorisStreamLoaderDelete" ); + + Map vars = new HashMap(); + vars.put( "fenodes", HOST + ":" + HTTP_PORT); + vars.put( "database", DATABASE ); + vars.put( "table", TABLE_DELETE ); + vars.put( "username", USER ); + vars.put( "password", PASSWD ); + vars.put( "bufferFlushMaxRows", "10000"); + vars.put( "bufferFlushMaxBytes", 10 * 1024 * 1024 + ""); + vars.put( "streamLoadProp", "format:json;read_json_by_line:true" ); + vars.put( "maxRetries", "3" ); + vars.put( "deletable", "true" ); + transMeta.injectVariables(vars); + + lmeta = new DorisStreamLoaderMeta(); + lmeta.setFenodes(transMeta.environmentSubstitute("${fenodes}")); + lmeta.setDatabase(transMeta.environmentSubstitute("${database}")); + lmeta.setTable(transMeta.environmentSubstitute("${table}")); + lmeta.setUsername(transMeta.environmentSubstitute("${username}")); + lmeta.setPassword(transMeta.environmentSubstitute("${password}")); + lmeta.setBufferFlushMaxRows(Long.parseLong(transMeta.environmentSubstitute("${bufferFlushMaxRows}"))); + lmeta.setBufferFlushMaxBytes(Long.parseLong(transMeta.environmentSubstitute("${bufferFlushMaxBytes}"))); + lmeta.setMaxRetries(Integer.parseInt(transMeta.environmentSubstitute("${maxRetries}"))); + lmeta.setStreamLoadProp(transMeta.environmentSubstitute("${streamLoadProp}")); + lmeta.setDeletable(Boolean.parseBoolean(transMeta.environmentSubstitute("${deletable}"))); + lmeta.setFieldStream(new String[]{"id", "c1", "c2", "c3","c4","c5","c6"}); + lmeta.setFieldTable(new String[]{"id", "c1", "c2", "c3","c4","c5","c6"}); + + ldata = new DorisStreamLoaderData(); + PluginRegistry plugReg = PluginRegistry.getInstance(); + String mblPid = plugReg.getPluginId( StepPluginType.class, lmeta ); + smeta = new StepMeta( mblPid, "DorisStreamLoaderDelete", lmeta ); + Trans trans = new Trans( transMeta ); + transMeta.addStep( smeta ); + lder = Mockito.spy(new DorisStreamLoader( smeta, ldata, 1, transMeta, trans )); + + RowMeta rm = new RowMeta(); + rm.addValueMeta(new ValueMetaInteger("id")); + rm.addValueMeta(new ValueMetaBoolean("c1")); + rm.addValueMeta(new ValueMetaBigNumber("c2")); + rm.addValueMeta(new ValueMetaNumber("c3")); + rm.addValueMeta(new ValueMetaDate("c4")); + rm.addValueMeta(new ValueMetaTimestamp("c5")); + rm.addValueMeta(new ValueMetaString("c6")); + lder.setInputRowMeta(rm); + + lder.copyVariablesFrom( transMeta ); + initializeTable(TABLE_DELETE); + mockDorisData(TABLE_DELETE); + lder.init(lmeta, ldata); + + Object[] data = new Object[]{ + 1L, + true, + BigDecimal.valueOf(123456789L), + 12345.6789, + new SimpleDateFormat("yyyy-MM-dd").parse("2024-11-18"), + Timestamp.valueOf("2024-11-18 15:30:45"), + "First Row"}; + doReturn(data).when(lder).getRow(); + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocationOnMock) throws Throwable { + lder.dispose(lmeta, ldata); + return null; + } + }).when(lder).putRow(any(), any()); + lder.processRow(lmeta, ldata); + lder.dispose(lmeta, ldata); + + while (lder.getStreamLoad() != null && lder.getStreamLoad().isLoadThreadAlive()){ + Thread.sleep(1000); + LOG.info("Waiting for load thread to finish."); + } + List expected = Arrays.asList("2,false,987654321,98765.4321,2024-11-17,2024-11-17T08:15:30,Second Row"); + String query = + String.format("select * from %s.%s order by 1", DATABASE, TABLE_DELETE); + checkResult(getQueryConnection(), LOG, expected, query, 7); + } + + + private void initializeTable(String table) { + executeSQLStatement( + getQueryConnection(), + LOG, + String.format("CREATE DATABASE IF NOT EXISTS %s", DATABASE), + String.format("DROP TABLE IF EXISTS %s.%s", DATABASE, table), + String.format( + "CREATE TABLE %s.%s (\n" + + " `id` int, \n" + + " `c1` boolean, \n" + + " `c2` bigint,\n" + + " `c3` decimal(12,4),\n" + + " `c4` date,\n" + + " `c5` datetime,\n" + + " `c6` string\n" + + ") ENGINE=OLAP\n" + + "UNIQUE KEY(`id`)\n" + + "COMMENT 'OLAP'\n" + + "DISTRIBUTED BY HASH(`id`) BUCKETS 1\n" + + "PROPERTIES (\n" + + "\"replication_allocation\" = \"tag.location.default: 1\"\n" + + "); \n", + DATABASE, table)); + } + + public void mockDorisData(String table){ + executeSQLStatement( + getQueryConnection(), + LOG, + String.format("INSERT INTO %s.%s VALUES \n" + + "(1, TRUE, 123456789, 12345.6789, '2024-11-18', '2024-11-18 15:30:45', 'First Row')," + + "(2, FALSE, 987654321, 98765.4321, '2024-11-17', '2024-11-17 08:15:30', 'Second Row')", + DATABASE, table)); + } + + + public Connection getQueryConnection() { + LOG.info("Try to get query connection from doris."); + String jdbcUrl = + String.format( + JDBC_URL, + System.getProperty("doris_host"), + System.getProperty("doris_query_port")); + try { + return DriverManager.getConnection(jdbcUrl, USER, PASSWD); + } catch (SQLException e) { + LOG.info("Failed to get doris query connection. jdbcUrl={}", jdbcUrl, e); + throw new DorisRuntimeException(e); + } + } + + public static void executeSQLStatement(Connection connection, Logger logger, String... sql) { + if (Objects.isNull(sql) || sql.length == 0) { + return; + } + try (Statement statement = connection.createStatement()) { + for (String s : sql) { + if (StringUtils.isNotEmpty(s)) { + logger.info("start to execute sql={}", s); + statement.execute(s); + } + } + } catch (SQLException e) { + throw new DorisRuntimeException(e); + } + } + + public static void checkResult( + Connection connection, + Logger logger, + List expected, + String query, + int columnSize) { + List actual = new ArrayList<>(); + try (Statement statement = connection.createStatement()) { + ResultSet sinkResultSet = statement.executeQuery(query); + while (sinkResultSet.next()) { + List row = new ArrayList<>(); + for (int i = 1; i <= columnSize; i++) { + Object value = sinkResultSet.getObject(i); + if (value == null) { + row.add("null"); + } else { + row.add(value.toString()); + } + } + actual.add(StringUtils.join(row, ",")); + } + } catch (SQLException e) { + logger.info( + "Failed to check query result. expected={}, actual={}", + String.join(",", expected), + String.join(",", actual), + e); + throw new DorisRuntimeException(e); + } + logger.info( + "checking test result. expected={}, actual={}", + String.join(",", expected), + String.join(",", actual)); + Assert.assertArrayEquals(expected.toArray(), actual.toArray()); + } +} From 2a4885eac985166ff652df66a0142c095c7d8e76 Mon Sep 17 00:00:00 2001 From: Vallish Pai Date: Wed, 20 Nov 2024 12:44:41 +0530 Subject: [PATCH 55/63] [Enhancement] (nereids)implement RecoverCommand in nereids (#44071) Issue Number: close #42550 Support recover table and recover partition command in nereids. https://github.com/apache/doris/issues/42550 https://github.com/apache/doris/issues/42545 https://github.com/apache/doris/issues/42547 --- .../org/apache/doris/nereids/DorisParser.g4 | 8 +- .../java/org/apache/doris/catalog/Env.java | 9 ++ .../doris/datasource/InternalCatalog.java | 27 +++--- .../nereids/RecoverPartitionCommand.java | 76 +++++++++++++++ .../nereids/parser/LogicalPlanBuilder.java | 21 +++++ .../commands/RecoverDatabaseCommand.java | 4 - .../plans/commands/RecoverTableCommand.java | 73 +++++++++++++++ .../trees/plans/visitor/CommandVisitor.java | 10 ++ .../ddl/recover/test_recover_all.out | 52 +++++++++++ .../ddl/recover/test_recover_all.groovy | 93 +++++++++++++++++++ 10 files changed, 351 insertions(+), 22 deletions(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/RecoverPartitionCommand.java create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/RecoverTableCommand.java create mode 100644 regression-test/data/nereids_p0/ddl/recover/test_recover_all.out create mode 100644 regression-test/suites/nereids_p0/ddl/recover/test_recover_all.groovy 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 b18322cc440bb3..69de3fd4c45cb3 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 @@ -57,8 +57,8 @@ statementBase | supportedUnsetStatement #supportedUnsetStatementAlias | supportedRefreshStatement #supportedRefreshStatementAlias | supportedShowStatement #supportedShowStatementAlias - | unsupportedStatement #unsupported | supportedRecoverStatement #supportedRecoverStatementAlias + | unsupportedStatement #unsupported ; @@ -75,7 +75,6 @@ unsupportedStatement | unsupportedGrantRevokeStatement | unsupportedAdminStatement | unsupportedTransactionStatement - | unsupportedRecoverStatement | unsupportedCancelStatement | unsupportedJobStatement | unsupportedCleanStatement @@ -463,10 +462,7 @@ unsupportedCancelStatement supportedRecoverStatement : RECOVER DATABASE name=identifier id=INTEGER_VALUE? (AS alias=identifier)? #recoverDatabase - ; - -unsupportedRecoverStatement - :RECOVER TABLE name=multipartIdentifier + | RECOVER TABLE name=multipartIdentifier id=INTEGER_VALUE? (AS alias=identifier)? #recoverTable | RECOVER PARTITION name=identifier id=INTEGER_VALUE? (AS alias=identifier)? FROM tableName=multipartIdentifier #recoverPartition diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java index 687129dab774bc..fa406faf9d34d6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java @@ -3277,10 +3277,19 @@ public void recoverTable(RecoverTableStmt recoverStmt) throws DdlException { getInternalCatalog().recoverTable(recoverStmt); } + public void recoverTable(String dbName, String tableName, String newTableName, long tableId) throws DdlException { + getInternalCatalog().recoverTable(dbName, tableName, newTableName, tableId); + } + public void recoverPartition(RecoverPartitionStmt recoverStmt) throws DdlException { getInternalCatalog().recoverPartition(recoverStmt); } + public void recoverPartition(String dbName, String tableName, String partitionName, + String newPartitionName, long partitionId) throws DdlException { + getInternalCatalog().recoverPartition(dbName, tableName, partitionName, newPartitionName, partitionId); + } + public void dropCatalogRecycleBin(IdType idType, long id) throws DdlException { getInternalCatalog().dropCatalogRecycleBin(idType, id); } 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 ef049fca402f37..ac5cfd59a37588 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 @@ -662,11 +662,7 @@ public void recoverDatabase(RecoverDbStmt recoverStmt) throws DdlException { recoverDatabase(recoverStmt.getDbName(), recoverStmt.getDbId(), recoverStmt.getNewDbName()); } - public void recoverTable(RecoverTableStmt recoverStmt) throws DdlException { - String dbName = recoverStmt.getDbName(); - String tableName = recoverStmt.getTableName(); - String newTableName = recoverStmt.getNewTableName(); - + public void recoverTable(String dbName, String tableName, String newTableName, long tableId) throws DdlException { Database db = getDbOrDdlException(dbName); db.writeLockOrDdlException(); try { @@ -679,7 +675,7 @@ public void recoverTable(RecoverTableStmt recoverStmt) throws DdlException { ErrorReport.reportDdlException(ErrorCode.ERR_TABLE_EXISTS_ERROR, newTableName); } } - if (!Env.getCurrentRecycleBin().recoverTable(db, tableName, recoverStmt.getTableId(), newTableName)) { + if (!Env.getCurrentRecycleBin().recoverTable(db, tableName, tableId, newTableName)) { ErrorReport.reportDdlException(ErrorCode.ERR_UNKNOWN_TABLE, tableName, dbName); } } finally { @@ -687,16 +683,17 @@ public void recoverTable(RecoverTableStmt recoverStmt) throws DdlException { } } - public void recoverPartition(RecoverPartitionStmt recoverStmt) throws DdlException { - String dbName = recoverStmt.getDbName(); - String tableName = recoverStmt.getTableName(); + public void recoverTable(RecoverTableStmt recoverStmt) throws DdlException { + recoverTable(recoverStmt.getDbName(), recoverStmt.getTableName(), + recoverStmt.getNewTableName(), recoverStmt.getTableId()); + } + public void recoverPartition(String dbName, String tableName, String partitionName, + String newPartitionName, long partitionId) throws DdlException { Database db = getDbOrDdlException(dbName); OlapTable olapTable = db.getOlapTableOrDdlException(tableName); olapTable.writeLockOrDdlException(); try { - String partitionName = recoverStmt.getPartitionName(); - String newPartitionName = recoverStmt.getNewPartitionName(); if (Strings.isNullOrEmpty(newPartitionName)) { if (olapTable.getPartition(partitionName) != null) { throw new DdlException("partition[" + partitionName + "] " @@ -710,12 +707,18 @@ public void recoverPartition(RecoverPartitionStmt recoverStmt) throws DdlExcepti } Env.getCurrentRecycleBin().recoverPartition(db.getId(), olapTable, partitionName, - recoverStmt.getPartitionId(), newPartitionName); + partitionId, newPartitionName); } finally { olapTable.writeUnlock(); } } + public void recoverPartition(RecoverPartitionStmt recoverStmt) throws DdlException { + recoverPartition(recoverStmt.getDbName(), recoverStmt.getTableName(), + recoverStmt.getPartitionName(), recoverStmt.getNewPartitionName(), + recoverStmt.getPartitionId()); + } + public void dropCatalogRecycleBin(IdType idType, long id) throws DdlException { switch (idType) { case DATABASE_ID: diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/RecoverPartitionCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/RecoverPartitionCommand.java new file mode 100644 index 00000000000000..1b0580cc3dbb36 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/RecoverPartitionCommand.java @@ -0,0 +1,76 @@ +// 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.commands; + +import org.apache.doris.catalog.Env; +import org.apache.doris.common.ErrorCode; +import org.apache.doris.common.ErrorReport; +import org.apache.doris.common.UserException; +import org.apache.doris.common.util.Util; +import org.apache.doris.mysql.privilege.PrivPredicate; +import org.apache.doris.nereids.trees.plans.PlanType; +import org.apache.doris.nereids.trees.plans.commands.info.TableNameInfo; +import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor; +import org.apache.doris.qe.ConnectContext; +import org.apache.doris.qe.StmtExecutor; + +/** + * recover partition command + */ +public class RecoverPartitionCommand extends RecoverCommand { + private final TableNameInfo dbTblName; + private final String partitionName; + private final long partitionId; + private final String newPartitionName; + + /** + * constructor + */ + public RecoverPartitionCommand(TableNameInfo dbTblName, String partitionName, + long partitionId, String newPartitionName) { + super(PlanType.RECOVER_PARTITION_COMMAND); + this.dbTblName = dbTblName; + this.partitionName = partitionName; + this.partitionId = partitionId; + this.newPartitionName = newPartitionName; + } + + @Override + public void doRun(ConnectContext ctx, StmtExecutor executor) throws UserException { + dbTblName.analyze(ctx); + + // disallow external catalog + Util.prohibitExternalCatalog(dbTblName.getCtl(), this.getClass().getSimpleName()); + if (!Env.getCurrentEnv().getAccessManager() + .checkTblPriv(ConnectContext.get(), dbTblName.getCtl(), dbTblName.getDb(), + dbTblName.getTbl(), PrivPredicate.ALTER_CREATE)) { + ErrorReport.reportAnalysisException(ErrorCode.ERR_TABLEACCESS_DENIED_ERROR, "RECOVERY", + ConnectContext.get().getQualifiedUser(), + ConnectContext.get().getRemoteIP(), + dbTblName.getDb() + ": " + dbTblName.getTbl()); + } + + Env.getCurrentEnv().recoverPartition(dbTblName.getDb(), dbTblName.getTbl(), + partitionName, newPartitionName, partitionId); + } + + @Override + public R accept(PlanVisitor visitor, C context) { + return visitor.visitRecoverPartitionCommand(this, context); + } +} 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 491857858b0beb..51e3a901a4695a 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 @@ -163,6 +163,8 @@ import org.apache.doris.nereids.DorisParser.QueryOrganizationContext; import org.apache.doris.nereids.DorisParser.QueryTermContext; import org.apache.doris.nereids.DorisParser.RecoverDatabaseContext; +import org.apache.doris.nereids.DorisParser.RecoverPartitionContext; +import org.apache.doris.nereids.DorisParser.RecoverTableContext; import org.apache.doris.nereids.DorisParser.RefreshCatalogContext; import org.apache.doris.nereids.DorisParser.RefreshMTMVContext; import org.apache.doris.nereids.DorisParser.RefreshMethodContext; @@ -440,6 +442,8 @@ import org.apache.doris.nereids.trees.plans.commands.LoadCommand; import org.apache.doris.nereids.trees.plans.commands.PauseMTMVCommand; import org.apache.doris.nereids.trees.plans.commands.RecoverDatabaseCommand; +import org.apache.doris.nereids.trees.plans.commands.RecoverPartitionCommand; +import org.apache.doris.nereids.trees.plans.commands.RecoverTableCommand; import org.apache.doris.nereids.trees.plans.commands.RefreshMTMVCommand; import org.apache.doris.nereids.trees.plans.commands.ReplayCommand; import org.apache.doris.nereids.trees.plans.commands.ResumeMTMVCommand; @@ -4215,6 +4219,23 @@ public LogicalPlan visitRecoverDatabase(RecoverDatabaseContext ctx) { } @Override + public RecoverTableCommand visitRecoverTable(RecoverTableContext ctx) { + List dbTblNameParts = visitMultipartIdentifier(ctx.name); + String newTableName = (ctx.alias != null) ? ctx.alias.getText() : null; + long tableId = (ctx.id != null) ? Long.parseLong(ctx.id.getText()) : -1; + return new RecoverTableCommand(new TableNameInfo(dbTblNameParts), tableId, newTableName); + } + + @Override + public RecoverPartitionCommand visitRecoverPartition(RecoverPartitionContext ctx) { + String partitionName = ctx.name.getText(); + String newPartitionName = (ctx.alias != null) ? ctx.alias.getText() : null; + long partitionId = (ctx.id != null) ? Long.parseLong(ctx.id.getText()) : -1; + List dbTblNameParts = visitMultipartIdentifier(ctx.tableName); + return new RecoverPartitionCommand(new TableNameInfo(dbTblNameParts), + partitionName, partitionId, newPartitionName); + } + public LogicalPlan visitDropRole(DropRoleContext ctx) { return new DropRoleCommand(ctx.name.getText(), ctx.EXISTS() != null); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/RecoverDatabaseCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/RecoverDatabaseCommand.java index 17a7d6f4961616..17b637c0b9a0c7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/RecoverDatabaseCommand.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/RecoverDatabaseCommand.java @@ -29,15 +29,11 @@ import org.apache.doris.qe.StmtExecutor; import com.google.common.base.Strings; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; /** * recover database command */ public class RecoverDatabaseCommand extends RecoverCommand { - - public static final Logger LOG = LogManager.getLogger(RecoverDatabaseCommand.class); private final String dbName; private final long dbId; private final String newDbName; diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/RecoverTableCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/RecoverTableCommand.java new file mode 100644 index 00000000000000..7f2e0ac6b531e1 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/RecoverTableCommand.java @@ -0,0 +1,73 @@ +// 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.commands; + +import org.apache.doris.catalog.Env; +import org.apache.doris.common.ErrorCode; +import org.apache.doris.common.ErrorReport; +import org.apache.doris.common.UserException; +import org.apache.doris.common.util.Util; +import org.apache.doris.mysql.privilege.PrivPredicate; +import org.apache.doris.nereids.trees.plans.PlanType; +import org.apache.doris.nereids.trees.plans.commands.info.TableNameInfo; +import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor; +import org.apache.doris.qe.ConnectContext; +import org.apache.doris.qe.StmtExecutor; + +/** + * recover table command + */ +public class RecoverTableCommand extends RecoverCommand { + private final TableNameInfo dbTblName; + private final long tableId; + private final String newTableName; + + /** + * constructor + */ + public RecoverTableCommand(TableNameInfo dbTblName, long tableId, String newTableName) { + super(PlanType.RECOVER_TABLE_COMMAND); + this.dbTblName = dbTblName; + this.tableId = tableId; + this.newTableName = newTableName; + } + + @Override + public void doRun(ConnectContext ctx, StmtExecutor executor) throws UserException { + dbTblName.analyze(ctx); + + // disallow external catalog + Util.prohibitExternalCatalog(dbTblName.getCtl(), this.getClass().getSimpleName()); + + if (!Env.getCurrentEnv().getAccessManager().checkTblPriv( + ConnectContext.get(), dbTblName.getCtl(), dbTblName.getDb(), dbTblName.getTbl(), + PrivPredicate.ALTER_CREATE)) { + ErrorReport.reportAnalysisException(ErrorCode.ERR_TABLEACCESS_DENIED_ERROR, "RECOVERY", + ConnectContext.get().getQualifiedUser(), + ConnectContext.get().getRemoteIP(), + dbTblName.getDb() + ": " + dbTblName.getTbl()); + } + + Env.getCurrentEnv().recoverTable(dbTblName.getDb(), dbTblName.getTbl(), newTableName, tableId); + } + + @Override + public R accept(PlanVisitor visitor, C context) { + return visitor.visitRecoverTableCommand(this, context); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java index 2959f3f8a56793..646edc4a798c83 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java @@ -43,6 +43,8 @@ import org.apache.doris.nereids.trees.plans.commands.LoadCommand; import org.apache.doris.nereids.trees.plans.commands.PauseMTMVCommand; import org.apache.doris.nereids.trees.plans.commands.RecoverDatabaseCommand; +import org.apache.doris.nereids.trees.plans.commands.RecoverPartitionCommand; +import org.apache.doris.nereids.trees.plans.commands.RecoverTableCommand; import org.apache.doris.nereids.trees.plans.commands.RefreshMTMVCommand; import org.apache.doris.nereids.trees.plans.commands.ReplayCommand; import org.apache.doris.nereids.trees.plans.commands.ResumeMTMVCommand; @@ -337,6 +339,14 @@ default R visitRecoverDatabaseCommand(RecoverDatabaseCommand recoverDatabaseComm return visitCommand(recoverDatabaseCommand, context); } + default R visitRecoverTableCommand(RecoverTableCommand recoverTableCommand, C context) { + return visitCommand(recoverTableCommand, context); + } + + default R visitRecoverPartitionCommand(RecoverPartitionCommand recoverPartitionCommand, C context) { + return visitCommand(recoverPartitionCommand, context); + } + default R visitDropRoleCommand(DropRoleCommand dropRoleCommand, C context) { return visitCommand(dropRoleCommand, context); } diff --git a/regression-test/data/nereids_p0/ddl/recover/test_recover_all.out b/regression-test/data/nereids_p0/ddl/recover/test_recover_all.out new file mode 100644 index 00000000000000..c2651d467ae08d --- /dev/null +++ b/regression-test/data/nereids_p0/ddl/recover/test_recover_all.out @@ -0,0 +1,52 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !select -- +table1 +table2 + +-- !select2 -- +table1 + +-- !select3 -- +table1 +table2 + +-- !select4 -- +table1 + +-- !select5 -- +table1 +table3 + +-- !select_check_1 -- +1 a 2022-01-02 +2 a 2023-01-02 +3 a 2024-01-02 + +-- !select_partitions -- +p4 +p5 + +-- !select_partitions_2 -- +p3 +p4 +p5 + +-- !select_check_1 -- +1 a 2022-01-02 +2 a 2023-01-02 +3 a 2024-01-02 + +-- !select_partitions_3 -- +p4 +p5 + +-- !select_partitions_4 -- +p1 +p4 +p5 + +-- !select_check_1 -- +1 a 2022-01-02 +2 a 2023-01-02 +3 a 2024-01-02 + diff --git a/regression-test/suites/nereids_p0/ddl/recover/test_recover_all.groovy b/regression-test/suites/nereids_p0/ddl/recover/test_recover_all.groovy new file mode 100644 index 00000000000000..197199cd5b34e4 --- /dev/null +++ b/regression-test/suites/nereids_p0/ddl/recover/test_recover_all.groovy @@ -0,0 +1,93 @@ +// 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. + +// This will test database recover + +suite("test_recover_all") { + def testTable = "test_table" + def db = "test_recover_all_db" + sql "drop database IF EXISTS $db force" + sql "CREATE DATABASE IF NOT EXISTS $db " + sql "use $db " + sql """ + CREATE TABLE IF NOT EXISTS table1 ( + `id` int(11), + `name` varchar(128), + `da` date + ) + engine=olap + duplicate key(id) + partition by range(da)( + PARTITION p3 VALUES LESS THAN ('2023-01-01'), + PARTITION p4 VALUES LESS THAN ('2024-01-01'), + PARTITION p5 VALUES LESS THAN ('2025-01-01') + ) + distributed by hash(id) buckets 2 + properties( + "replication_num"="1", + "light_schema_change"="true" + ); + """ + sql """ + CREATE TABLE IF NOT EXISTS table2 ( + `id` int(11), + `name` varchar(128), + `da` date + ) + engine=olap + duplicate key(id) + partition by range(da)( + PARTITION p3 VALUES LESS THAN ('2023-01-01'), + PARTITION p4 VALUES LESS THAN ('2024-01-01'), + PARTITION p5 VALUES LESS THAN ('2025-01-01') + ) + distributed by hash(id) buckets 2 + properties( + "replication_num"="1", + "light_schema_change"="true" + ); + """ + qt_select "show tables"; + + sql " drop table table2" + qt_select2 "show tables"; + checkNereidsExecute("recover table table2;") + qt_select3 "show tables"; + sql " drop table table2" + qt_select4 "show tables"; + checkNereidsExecute("recover table table2 as table3;") + qt_select5 "show tables"; + + sql """ insert into table3 values(1, 'a', '2022-01-02'); """ + sql """ insert into table3 values(2, 'a', '2023-01-02'); """ + sql """ insert into table3 values(3, 'a', '2024-01-02'); """ + sql """ SYNC;""" + + qt_select_check_1 """ select * from table3 order by id,name,da; """ + sql """ ALTER TABLE table3 DROP PARTITION p3"""; + qt_select_partitions "select PARTITION_NAME from information_schema.partitions where TABLE_NAME = \"table3\" and TABLE_SCHEMA=\"${db}\" order by PARTITION_NAME"; + sql """ recover partition p3 from table3; """ + qt_select_partitions_2 "select PARTITION_NAME from information_schema.partitions where TABLE_NAME = \"table3\" and TABLE_SCHEMA=\"${db}\" order by PARTITION_NAME"; + + qt_select_check_1 """ select * from table3 order by id,name,da; """ + sql """ ALTER TABLE table3 DROP PARTITION p3"""; + qt_select_partitions_3 "select PARTITION_NAME from information_schema.partitions where TABLE_NAME = \"table3\" and TABLE_SCHEMA=\"${db}\" order by PARTITION_NAME"; + sql """ recover partition p3 as p1 from table3; """ + qt_select_partitions_4 "select PARTITION_NAME from information_schema.partitions where TABLE_NAME = \"table3\" and TABLE_SCHEMA=\"${db}\" order by PARTITION_NAME"; + qt_select_check_1 """ select * from table3 order by id,name,da; """ +} + From 1601d75fc01dbb80e1f2d856fbb6ee7dcffafb4c Mon Sep 17 00:00:00 2001 From: bobhan1 Date: Wed, 20 Nov 2024 15:17:06 +0800 Subject: [PATCH 56/63] [Fix](merge-on-write) Fix `MergeIndexDeleteBitmapCalculator::calculate_one()` coredump (#44284) ### What problem does this PR solve? Problem Summary: `MergeIndexDeleteBitmapCalculatorContext::get_current_key()` may return non-OK status when encounter memory allocation failure, which makes `MergeIndexDeleteBitmapCalculatorContext::Comparator::operator()` returns incorrect result and break some assumptions during the process of multiway merging, which leads to coredump. ``` 1# 0x00007F507D0B3520 in /lib/x86_64-linux-gnu/libc.so.6 2# pthread_kill at ./nptl/pthread_kill.c:89 3# raise at ../sysdeps/posix/raise.c:27 4# abort at ./stdlib/abort.c:81 5# 0x000055E3A805DD7D in /mnt/hdd01/ci/doris-deploy-branch-2.1-local/be/lib/doris_be 6# 0x000055E3A805047A in /mnt/hdd01/ci/doris-deploy-branch-2.1-local/be/lib/doris_be 7# google::LogMessage::SendToLog() in /mnt/hdd01/ci/doris-deploy-branch-2.1-local/be/lib/doris_be 8# google::LogMessage::Flush() in /mnt/hdd01/ci/doris-deploy-branch-2.1-local/be/lib/doris_be 9# google::LogMessageFatal::~LogMessageFatal() in /mnt/hdd01/ci/doris-deploy-branch-2.1-local/be/lib/doris_be 10# doris::MergeIndexDeleteBitmapCalculatorContext::seek_at_or_after(doris::Slice const&) in /mnt/hdd01/ci/doris-deploy-branch-2.1-local/be/lib/doris_be 11# doris::MergeIndexDeleteBitmapCalculator::calculate_one(doris::RowLocation&) at /home/zcp/repo_center/doris_branch-2.1/doris/be/src/olap/delete_bitmap_calculator.cpp:197 12# doris::MergeIndexDeleteBitmapCalculator::calculate_all(std::shared_ptr) in /mnt/hdd01/ci/doris-deploy-branch-2.1-local/be/lib/doris_be 13# doris::Tablet::calc_delete_bitmap_between_segments(std::shared_ptr, std::vector, std::allocator > > const&, std::shared_ptr) at /home/zcp/repo_center/doris_branch-2.1/doris/be/src/olap/tablet.cpp:4075 14# doris::Tablet::update_delete_bitmap_without_lock(std::shared_ptr const&, std::vector, std::allocator > > const*) at /home/zcp/repo_center/doris_branch-2.1/doris/be/src/olap/tablet.cpp:3468 15# doris::Tablet::revise_tablet_meta(std::vector, std::allocator > > const&, std::vector, std::allocator > > const&, bool) at /home/zcp/repo_center/doris_branch-2.1/doris/be/src/olap/tablet.cpp:415 16# doris::EngineCloneTask::_finish_incremental_clone(doris::Tablet*, std::shared_ptr const&, long) at /home/zcp/repo_center/doris_branch-2.1/doris/be/src/olap/task/engine_clone_task.cpp:795 17# doris::EngineCloneTask::_finish_clone(doris::Tablet*, std::__cxx11::basic_string, std::allocator > const&, long, bool) in /mnt/hdd01/ci/doris-deploy-branch-2.1-local/be/lib/doris_be 18# doris::EngineCloneTask::_do_clone() in /mnt/hdd01/ci/doris-deploy-branch-2.1-local/be/lib/doris_be 19# doris::EngineCloneTask::execute() at /home/zcp/repo_center/doris_branch-2.1/doris/be/src/olap/task/engine_clone_task.cpp:159 20# doris::clone_callback(doris::StorageEngine&, doris::TMasterInfo const&, doris::TAgentTaskRequest const&) in /mnt/hdd01/ci/doris-deploy-branch-2.1-local/be/lib/doris_be 21# std::_Function_handler(doris::TAgentTaskRequest const&) const::{lambda()#1}>::_M_invoke(std::_Any_data const&) at /var/local/ldb-toolchain/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_function.h:291 22# doris::ThreadPool::dispatch_thread() at /home/zcp/repo_center/doris_branch-2.1/doris/be/src/util/threadpool.cpp:551 23# doris::Thread::supervise_thread(void*) at /home/zcp/repo_center/doris_branch-2.1/doris/be/src/util/thread.cpp:499 24# start_thread at ./nptl/pthread_create.c:442 25# 0x00007F507D197850 at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:83 ``` --- be/src/olap/delete_bitmap_calculator.cpp | 70 +++++++++++++----------- 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/be/src/olap/delete_bitmap_calculator.cpp b/be/src/olap/delete_bitmap_calculator.cpp index 6f6e0ec8889954..017e3cff3d0489 100644 --- a/be/src/olap/delete_bitmap_calculator.cpp +++ b/be/src/olap/delete_bitmap_calculator.cpp @@ -90,8 +90,10 @@ bool MergeIndexDeleteBitmapCalculatorContext::Comparator::operator()( // std::proiroty_queue is a max heap, and function should return the result of `lhs < rhs` // so if the result of the function is true, rhs will be popped before lhs Slice key1, key2; - RETURN_IF_ERROR(lhs->get_current_key(key1)); - RETURN_IF_ERROR(rhs->get_current_key(key2)); + // MergeIndexDeleteBitmapCalculatorContext::get_current_key may return non-OK status if encounter + // memory allocation failure, we can only throw exception here to propagate error in this situation + THROW_IF_ERROR(lhs->get_current_key(key1)); + THROW_IF_ERROR(rhs->get_current_key(key2)); if (_sequence_length == 0 && _rowid_length == 0) { auto cmp_result = key1.compare(key2); // when key1 is the same as key2, @@ -135,28 +137,30 @@ Status MergeIndexDeleteBitmapCalculator::init(RowsetId rowset_id, std::vector const& segments, size_t seq_col_length, size_t rowdid_length, size_t max_batch_size) { - _rowset_id = rowset_id; - _seq_col_length = seq_col_length; - _rowid_length = rowdid_length; - _comparator = - MergeIndexDeleteBitmapCalculatorContext::Comparator(seq_col_length, _rowid_length); - _contexts.reserve(segments.size()); - _heap = std::make_unique(_comparator); + RETURN_IF_CATCH_EXCEPTION({ + _rowset_id = rowset_id; + _seq_col_length = seq_col_length; + _rowid_length = rowdid_length; + _comparator = + MergeIndexDeleteBitmapCalculatorContext::Comparator(seq_col_length, _rowid_length); + _contexts.reserve(segments.size()); + _heap = std::make_unique(_comparator); - for (auto& segment : segments) { - RETURN_IF_ERROR(segment->load_index()); - auto pk_idx = segment->get_primary_key_index(); - std::unique_ptr index; - RETURN_IF_ERROR(pk_idx->new_iterator(&index)); - auto index_type = vectorized::DataTypeFactory::instance().create_data_type( - pk_idx->type_info()->type(), 1, 0); - _contexts.emplace_back(std::move(index), index_type, segment->id(), pk_idx->num_rows()); - _heap->push(&_contexts.back()); - } - if (_rowid_length > 0) { - _rowid_coder = get_key_coder( - get_scalar_type_info()->type()); - } + for (auto& segment : segments) { + RETURN_IF_ERROR(segment->load_index()); + auto pk_idx = segment->get_primary_key_index(); + std::unique_ptr index; + RETURN_IF_ERROR(pk_idx->new_iterator(&index)); + auto index_type = vectorized::DataTypeFactory::instance().create_data_type( + pk_idx->type_info()->type(), 1, 0); + _contexts.emplace_back(std::move(index), index_type, segment->id(), pk_idx->num_rows()); + _heap->push(&_contexts.back()); + } + if (_rowid_length > 0) { + _rowid_coder = get_key_coder( + get_scalar_type_info()->type()); + } + }); return Status::OK(); } @@ -209,16 +213,18 @@ Status MergeIndexDeleteBitmapCalculator::calculate_one(RowLocation& loc) { } Status MergeIndexDeleteBitmapCalculator::calculate_all(DeleteBitmapPtr delete_bitmap) { - RowLocation loc; - while (true) { - auto st = calculate_one(loc); - if (st.is()) { - break; + RETURN_IF_CATCH_EXCEPTION({ + RowLocation loc; + while (true) { + auto st = calculate_one(loc); + if (st.is()) { + break; + } + RETURN_IF_ERROR(st); + delete_bitmap->add({_rowset_id, loc.segment_id, DeleteBitmap::TEMP_VERSION_COMMON}, + loc.row_id); } - RETURN_IF_ERROR(st); - delete_bitmap->add({_rowset_id, loc.segment_id, DeleteBitmap::TEMP_VERSION_COMMON}, - loc.row_id); - } + }); return Status::OK(); } From 0a11a9b1d18b593d6e010e9edcd42fb3b55f2e0b Mon Sep 17 00:00:00 2001 From: morrySnow Date: Wed, 20 Nov 2024 15:54:59 +0800 Subject: [PATCH 57/63] [fix](Nereids) simplify conditional function generate wrong nullable (#44209) Related PR: #37613 Problem Summary: because adjust nullable do not run after simplify confitional function, we should not change any output's nullable in this rule --- .../expression/rules/SimplifyConditionalFunction.java | 3 ++- .../expression/rules/SimplifyConditionalFunctionTest.java | 8 +++++--- .../simplify_conditional_function.out | 3 +++ .../simplify_conditional_function.groovy | 2 ++ 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunction.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunction.java index 359cb887fe54b7..c1c6283e32d21c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunction.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunction.java @@ -22,6 +22,7 @@ import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.functions.scalar.Coalesce; import org.apache.doris.nereids.trees.expressions.functions.scalar.NullIf; +import org.apache.doris.nereids.trees.expressions.functions.scalar.Nullable; import org.apache.doris.nereids.trees.expressions.functions.scalar.Nvl; import org.apache.doris.nereids.trees.expressions.literal.NullLiteral; @@ -98,7 +99,7 @@ private static Expression rewriteNvl(Nvl nvl) { */ private static Expression rewriteNullIf(NullIf nullIf) { if (nullIf.child(0) instanceof NullLiteral || nullIf.child(1) instanceof NullLiteral) { - return nullIf.child(0); + return new Nullable(nullIf.child(0)); } else { return nullIf; } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunctionTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunctionTest.java index 33c62f142c22aa..7ba9cf09ff26fd 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunctionTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunctionTest.java @@ -22,6 +22,7 @@ import org.apache.doris.nereids.trees.expressions.SlotReference; import org.apache.doris.nereids.trees.expressions.functions.scalar.Coalesce; import org.apache.doris.nereids.trees.expressions.functions.scalar.NullIf; +import org.apache.doris.nereids.trees.expressions.functions.scalar.Nullable; import org.apache.doris.nereids.trees.expressions.functions.scalar.Nvl; import org.apache.doris.nereids.trees.expressions.literal.NullLiteral; import org.apache.doris.nereids.types.BooleanType; @@ -99,13 +100,14 @@ public void testNullIf() { SlotReference slot = new SlotReference("a", StringType.INSTANCE, true); SlotReference nonNullableSlot = new SlotReference("b", StringType.INSTANCE, false); // nullif(null, slot) -> null - assertRewrite(new NullIf(NullLiteral.INSTANCE, slot), new NullLiteral(VarcharType.SYSTEM_DEFAULT)); + assertRewrite(new NullIf(NullLiteral.INSTANCE, slot), + new Nullable(new NullLiteral(VarcharType.SYSTEM_DEFAULT))); // nullif(nullable_slot, null) -> slot - assertRewrite(new NullIf(slot, NullLiteral.INSTANCE), slot); + assertRewrite(new NullIf(slot, NullLiteral.INSTANCE), new Nullable(slot)); // nullif(non-nullable_slot, null) -> non-nullable_slot - assertRewrite(new NullIf(nonNullableSlot, NullLiteral.INSTANCE), nonNullableSlot); + assertRewrite(new NullIf(nonNullableSlot, NullLiteral.INSTANCE), new Nullable(nonNullableSlot)); } } diff --git a/regression-test/data/nereids_rules_p0/simplify_conditional_function/simplify_conditional_function.out b/regression-test/data/nereids_rules_p0/simplify_conditional_function/simplify_conditional_function.out index 91f9110804b8b6..d9f4f3b335872c 100644 --- a/regression-test/data/nereids_rules_p0/simplify_conditional_function/simplify_conditional_function.out +++ b/regression-test/data/nereids_rules_p0/simplify_conditional_function/simplify_conditional_function.out @@ -131,3 +131,6 @@ abc ab abc +-- !test_nullable_nullif -- +1 1 + diff --git a/regression-test/suites/nereids_rules_p0/simplify_conditional_function/simplify_conditional_function.groovy b/regression-test/suites/nereids_rules_p0/simplify_conditional_function/simplify_conditional_function.groovy index 18443bb152abda..2b99ad0a23a8a5 100644 --- a/regression-test/suites/nereids_rules_p0/simplify_conditional_function/simplify_conditional_function.groovy +++ b/regression-test/suites/nereids_rules_p0/simplify_conditional_function/simplify_conditional_function.groovy @@ -49,4 +49,6 @@ suite("simplify_conditional_function") { qt_test_outer_ref_coalesce "select c1 from (select coalesce(null,a,c) c1,a,b from test_simplify_conditional_function order by c1,a,b limit 2) t group by c1 order by c1" qt_test_outer_ref_nvl "select c1 from (select ifnull(null, c) c1 from test_simplify_conditional_function order by 1 limit 2) t group by c1 order by c1" qt_test_outer_ref_nullif "select c1 from (select nullif(a, null) c1,c from test_simplify_conditional_function order by c1,c limit 2 ) t group by c1 order by c1" + + qt_test_nullable_nullif "SELECT COUNT( DISTINCT NULLIF ( 1, NULL ) ), COUNT( DISTINCT 72 )" } \ No newline at end of file From dda9e8b455886e4a664a602f3dcacf62dd931775 Mon Sep 17 00:00:00 2001 From: morrySnow Date: Wed, 20 Nov 2024 16:07:09 +0800 Subject: [PATCH 58/63] [fix](Nereids) repeat's output properties is not right (#44297) Related PR: #37219 Problem Summary: when child's output is hash distribution, repeat's output follow child only when all child's hash columns in all repeat set. otherwise, repeat's output should be any. --- .../ChildOutputPropertyDeriver.java | 5 +- .../ChildOutputPropertyDeriverTest.java | 74 +++++++++++++++---- 2 files changed, 64 insertions(+), 15 deletions(-) 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 11d35f933464ad..8f191b61286e43 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 @@ -371,8 +371,9 @@ public PhysicalProperties visitPhysicalRepeat(PhysicalRepeat rep intersectGroupingKeys, Utils.fastToImmutableSet(groupingSets.get(i)) ); } - if (!intersectGroupingKeys.isEmpty()) { - List orderedShuffledColumns = distributionSpecHash.getOrderedShuffledColumns(); + List orderedShuffledColumns = distributionSpecHash.getOrderedShuffledColumns(); + if (!intersectGroupingKeys.isEmpty() && intersectGroupingKeys.size() + >= Sets.newHashSet(orderedShuffledColumns).size()) { boolean hashColumnsChanged = false; for (Expression intersectGroupingKey : intersectGroupingKeys) { if (!(intersectGroupingKey instanceof SlotReference)) { diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/properties/ChildOutputPropertyDeriverTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/properties/ChildOutputPropertyDeriverTest.java index 91738e3cca457e..a39bc664e1c1de 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/properties/ChildOutputPropertyDeriverTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/properties/ChildOutputPropertyDeriverTest.java @@ -47,9 +47,11 @@ import org.apache.doris.nereids.trees.plans.physical.PhysicalLimit; import org.apache.doris.nereids.trees.plans.physical.PhysicalNestedLoopJoin; import org.apache.doris.nereids.trees.plans.physical.PhysicalQuickSort; +import org.apache.doris.nereids.trees.plans.physical.PhysicalRepeat; import org.apache.doris.nereids.trees.plans.physical.PhysicalTopN; import org.apache.doris.nereids.types.BigIntType; import org.apache.doris.nereids.types.IntegerType; +import org.apache.doris.nereids.types.TinyIntType; import org.apache.doris.nereids.util.ExpressionUtils; import org.apache.doris.nereids.util.JoinUtils; import org.apache.doris.qe.ConnectContext; @@ -133,7 +135,7 @@ ExpressionUtils.EMPTY_CONDITION, ExpressionUtils.EMPTY_CONDITION, new Distribute PhysicalProperties result = deriver.getOutputProperties(null, groupExpression); Assertions.assertTrue(result.getOrderSpec().getOrderKeys().isEmpty()); - Assertions.assertTrue(result.getDistributionSpec() instanceof DistributionSpecHash); + Assertions.assertInstanceOf(DistributionSpecHash.class, result.getDistributionSpec()); DistributionSpecHash actual = (DistributionSpecHash) result.getDistributionSpec(); Assertions.assertEquals(ShuffleType.NATURAL, actual.getShuffleType()); // check merged @@ -172,7 +174,7 @@ ExpressionUtils.EMPTY_CONDITION, ExpressionUtils.EMPTY_CONDITION, new Distribute PhysicalProperties result = deriver.getOutputProperties(null, groupExpression); Assertions.assertTrue(result.getOrderSpec().getOrderKeys().isEmpty()); - Assertions.assertTrue(result.getDistributionSpec() instanceof DistributionSpecHash); + Assertions.assertInstanceOf(DistributionSpecHash.class, result.getDistributionSpec()); DistributionSpecHash actual = (DistributionSpecHash) result.getDistributionSpec(); Assertions.assertEquals(ShuffleType.NATURAL, actual.getShuffleType()); // check merged @@ -211,7 +213,7 @@ ExpressionUtils.EMPTY_CONDITION, ExpressionUtils.EMPTY_CONDITION, new Distribute PhysicalProperties result = deriver.getOutputProperties(null, groupExpression); Assertions.assertTrue(result.getOrderSpec().getOrderKeys().isEmpty()); - Assertions.assertTrue(result.getDistributionSpec() instanceof DistributionSpecHash); + Assertions.assertInstanceOf(DistributionSpecHash.class, result.getDistributionSpec()); DistributionSpecHash actual = (DistributionSpecHash) result.getDistributionSpec(); Assertions.assertEquals(ShuffleType.NATURAL, actual.getShuffleType()); // check merged @@ -251,7 +253,7 @@ ExpressionUtils.EMPTY_CONDITION, ExpressionUtils.EMPTY_CONDITION, new Distribute PhysicalProperties result = deriver.getOutputProperties(null, groupExpression); Assertions.assertTrue(result.getOrderSpec().getOrderKeys().isEmpty()); - Assertions.assertTrue(result.getDistributionSpec() instanceof DistributionSpecHash); + Assertions.assertInstanceOf(DistributionSpecHash.class, result.getDistributionSpec()); DistributionSpecHash actual = (DistributionSpecHash) result.getDistributionSpec(); Assertions.assertEquals(ShuffleType.NATURAL, actual.getShuffleType()); // check merged @@ -291,7 +293,7 @@ ExpressionUtils.EMPTY_CONDITION, ExpressionUtils.EMPTY_CONDITION, new Distribute PhysicalProperties result = deriver.getOutputProperties(null, groupExpression); Assertions.assertTrue(result.getOrderSpec().getOrderKeys().isEmpty()); - Assertions.assertTrue(result.getDistributionSpec() instanceof DistributionSpecHash); + Assertions.assertInstanceOf(DistributionSpecHash.class, result.getDistributionSpec()); DistributionSpecHash actual = (DistributionSpecHash) result.getDistributionSpec(); Assertions.assertEquals(ShuffleType.NATURAL, actual.getShuffleType()); // check merged @@ -331,7 +333,7 @@ ExpressionUtils.EMPTY_CONDITION, ExpressionUtils.EMPTY_CONDITION, new Distribute PhysicalProperties result = deriver.getOutputProperties(null, groupExpression); Assertions.assertTrue(result.getOrderSpec().getOrderKeys().isEmpty()); - Assertions.assertTrue(result.getDistributionSpec() instanceof DistributionSpecHash); + Assertions.assertInstanceOf(DistributionSpecHash.class, result.getDistributionSpec()); DistributionSpecHash actual = (DistributionSpecHash) result.getDistributionSpec(); Assertions.assertEquals(ShuffleType.NATURAL, actual.getShuffleType()); // check merged @@ -371,7 +373,7 @@ ExpressionUtils.EMPTY_CONDITION, ExpressionUtils.EMPTY_CONDITION, new Distribute PhysicalProperties result = deriver.getOutputProperties(null, groupExpression); Assertions.assertTrue(result.getOrderSpec().getOrderKeys().isEmpty()); - Assertions.assertTrue(result.getDistributionSpec() instanceof DistributionSpecHash); + Assertions.assertInstanceOf(DistributionSpecHash.class, result.getDistributionSpec()); DistributionSpecHash actual = (DistributionSpecHash) result.getDistributionSpec(); Assertions.assertEquals(ShuffleType.NATURAL, actual.getShuffleType()); Assertions.assertEquals(-1, actual.getTableId()); @@ -412,7 +414,7 @@ ExpressionUtils.EMPTY_CONDITION, ExpressionUtils.EMPTY_CONDITION, new Distribute PhysicalProperties result = deriver.getOutputProperties(null, groupExpression); Assertions.assertTrue(result.getOrderSpec().getOrderKeys().isEmpty()); - Assertions.assertTrue(result.getDistributionSpec() instanceof DistributionSpecHash); + Assertions.assertInstanceOf(DistributionSpecHash.class, result.getDistributionSpec()); DistributionSpecHash actual = (DistributionSpecHash) result.getDistributionSpec(); Assertions.assertEquals(ShuffleType.NATURAL, actual.getShuffleType()); Assertions.assertEquals(-1, actual.getTableId()); @@ -453,7 +455,7 @@ ExpressionUtils.EMPTY_CONDITION, ExpressionUtils.EMPTY_CONDITION, new Distribute PhysicalProperties result = deriver.getOutputProperties(null, groupExpression); Assertions.assertTrue(result.getOrderSpec().getOrderKeys().isEmpty()); - Assertions.assertTrue(result.getDistributionSpec() instanceof DistributionSpecHash); + Assertions.assertInstanceOf(DistributionSpecHash.class, result.getDistributionSpec()); DistributionSpecHash actual = (DistributionSpecHash) result.getDistributionSpec(); Assertions.assertEquals(ShuffleType.NATURAL, actual.getShuffleType()); Assertions.assertEquals(-1, actual.getTableId()); @@ -576,7 +578,7 @@ ExpressionUtils.EMPTY_CONDITION, new DistributeHint(DistributeType.NONE), PhysicalProperties result = deriver.getOutputProperties(null, groupExpression); Assertions.assertTrue(result.getOrderSpec().getOrderKeys().isEmpty()); - Assertions.assertTrue(result.getDistributionSpec() instanceof DistributionSpecHash); + Assertions.assertInstanceOf(DistributionSpecHash.class, result.getDistributionSpec()); DistributionSpecHash actual = (DistributionSpecHash) result.getDistributionSpec(); Assertions.assertEquals(ShuffleType.NATURAL, actual.getShuffleType()); // check merged @@ -626,7 +628,7 @@ Pair, List> getOnClauseUsedSlots( PhysicalProperties result = deriver.getOutputProperties(null, groupExpression); Assertions.assertTrue(result.getOrderSpec().getOrderKeys().isEmpty()); - Assertions.assertTrue(result.getDistributionSpec() instanceof DistributionSpecHash); + Assertions.assertInstanceOf(DistributionSpecHash.class, result.getDistributionSpec()); DistributionSpecHash actual = (DistributionSpecHash) result.getDistributionSpec(); Assertions.assertEquals(ShuffleType.EXECUTION_BUCKETED, actual.getShuffleType()); // check merged @@ -659,7 +661,7 @@ void testNestedLoopJoin() { PhysicalProperties result = deriver.getOutputProperties(null, groupExpression); Assertions.assertTrue(result.getOrderSpec().getOrderKeys().isEmpty()); - Assertions.assertTrue(result.getDistributionSpec() instanceof DistributionSpecHash); + Assertions.assertInstanceOf(DistributionSpecHash.class, result.getDistributionSpec()); DistributionSpecHash actual = (DistributionSpecHash) result.getDistributionSpec(); Assertions.assertEquals(leftHash, actual); } @@ -712,7 +714,7 @@ void testGlobalPhaseAggregate() { ChildOutputPropertyDeriver deriver = new ChildOutputPropertyDeriver(Lists.newArrayList(child)); PhysicalProperties result = deriver.getOutputProperties(null, groupExpression); Assertions.assertTrue(result.getOrderSpec().getOrderKeys().isEmpty()); - Assertions.assertTrue(result.getDistributionSpec() instanceof DistributionSpecHash); + Assertions.assertInstanceOf(DistributionSpecHash.class, result.getDistributionSpec()); DistributionSpecHash actual = (DistributionSpecHash) result.getDistributionSpec(); Assertions.assertEquals(ShuffleType.EXECUTION_BUCKETED, actual.getShuffleType()); Assertions.assertEquals(Lists.newArrayList(partition).stream() @@ -837,4 +839,50 @@ void testAssertNumRows() { PhysicalProperties result = deriver.getOutputProperties(null, groupExpression); Assertions.assertEquals(PhysicalProperties.GATHER, result); } + + @Test + void testRepeatReturnAny() { + SlotReference c1 = new SlotReference( + new ExprId(1), "c1", TinyIntType.INSTANCE, true, ImmutableList.of()); + SlotReference c2 = new SlotReference( + new ExprId(2), "c2", TinyIntType.INSTANCE, true, ImmutableList.of()); + SlotReference c3 = new SlotReference( + new ExprId(3), "c3", TinyIntType.INSTANCE, true, ImmutableList.of()); + PhysicalRepeat repeat = new PhysicalRepeat<>( + ImmutableList.of(ImmutableList.of(c1, c2), ImmutableList.of(c1), ImmutableList.of(c1, c3)), + ImmutableList.of(c1, c2, c3), + logicalProperties, + groupPlan + ); + GroupExpression groupExpression = new GroupExpression(repeat); + new Group(null, groupExpression, null); + PhysicalProperties child = PhysicalProperties.createHash( + ImmutableList.of(new ExprId(1), new ExprId(2)), ShuffleType.EXECUTION_BUCKETED); + ChildOutputPropertyDeriver deriver = new ChildOutputPropertyDeriver(Lists.newArrayList(child)); + PhysicalProperties result = deriver.getOutputProperties(null, groupExpression); + Assertions.assertEquals(PhysicalProperties.ANY, result); + } + + @Test + void testRepeatReturnChild() { + SlotReference c1 = new SlotReference( + new ExprId(1), "c1", TinyIntType.INSTANCE, true, ImmutableList.of()); + SlotReference c2 = new SlotReference( + new ExprId(2), "c2", TinyIntType.INSTANCE, true, ImmutableList.of()); + SlotReference c3 = new SlotReference( + new ExprId(3), "c3", TinyIntType.INSTANCE, true, ImmutableList.of()); + PhysicalRepeat repeat = new PhysicalRepeat<>( + ImmutableList.of(ImmutableList.of(c1, c2), ImmutableList.of(c1), ImmutableList.of(c1, c3)), + ImmutableList.of(c1, c2, c3), + logicalProperties, + groupPlan + ); + GroupExpression groupExpression = new GroupExpression(repeat); + new Group(null, groupExpression, null); + PhysicalProperties child = PhysicalProperties.createHash( + ImmutableList.of(new ExprId(1)), ShuffleType.EXECUTION_BUCKETED); + ChildOutputPropertyDeriver deriver = new ChildOutputPropertyDeriver(Lists.newArrayList(child)); + PhysicalProperties result = deriver.getOutputProperties(null, groupExpression); + Assertions.assertEquals(child, result); + } } From 6eafef33491cb25e635c71ef1ceceb0f3c6fad05 Mon Sep 17 00:00:00 2001 From: Sridhar R Manikarnike Date: Wed, 20 Nov 2024 14:57:46 +0530 Subject: [PATCH 59/63] [Enhancement] (nereids)implement showCreateCatalogCommand in nereids (#43068) Issue Number: close #42740 implement showCreateCatalogCommand in nereids --- .../org/apache/doris/nereids/DorisParser.g4 | 3 +- .../apache/doris/datasource/CatalogMgr.java | 17 ++-- .../nereids/parser/LogicalPlanBuilder.java | 8 +- .../doris/nereids/trees/plans/PlanType.java | 1 + .../commands/ShowCreateCatalogCommand.java | 80 +++++++++++++++++++ .../trees/plans/visitor/CommandVisitor.java | 5 ++ .../show/test_show_create_catalog.out | 4 + .../show/test_show_create_catalog.groovy | 32 ++++++++ 8 files changed, 141 insertions(+), 9 deletions(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowCreateCatalogCommand.java create mode 100644 regression-test/data/nereids_p0/show/test_show_create_catalog.out create mode 100644 regression-test/suites/nereids_p0/show/test_show_create_catalog.groovy 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 69de3fd4c45cb3..3595fd35a5750e 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 @@ -212,6 +212,7 @@ supportedShowStatement | SHOW PRIVILEGES #showPrivileges | SHOW PROC path=STRING_LITERAL #showProc | SHOW STORAGE? ENGINES #showStorageEngines + | SHOW CREATE CATALOG name=identifier #showCreateCatalog | SHOW SQL_BLOCK_RULE (FOR ruleName=identifier)? #showSqlBlockRule | SHOW CREATE MATERIALIZED VIEW mvName=identifier ON tableName=multipartIdentifier #showCreateMaterializedView @@ -248,7 +249,6 @@ lockTable (READ (LOCAL)? | (LOW_PRIORITY)? WRITE) ; - unsupportedShowStatement : SHOW ROW POLICY (FOR (userIdentify | (ROLE role=identifier)))? #showRowPolicy | SHOW STORAGE POLICY (USING (FOR policy=identifierOrText)?)? #showStoragePolicy @@ -266,7 +266,6 @@ unsupportedShowStatement | SHOW CREATE VIEW name=multipartIdentifier #showCreateView | SHOW CREATE MATERIALIZED VIEW name=multipartIdentifier #showMaterializedView | SHOW CREATE (DATABASE | SCHEMA) name=multipartIdentifier #showCreateDatabase - | SHOW CREATE CATALOG name=identifier #showCreateCatalog | SHOW CREATE (GLOBAL | SESSION | LOCAL)? FUNCTION functionIdentifier LEFT_PAREN functionArguments? RIGHT_PAREN ((FROM | IN) database=multipartIdentifier)? #showCreateFunction diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java index 91273736ebfecc..1d1a44be7b4834 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java @@ -440,17 +440,16 @@ public static Map getCatalogPropertiesWithPrintable(CatalogIf return sortedMap; } - - public ShowResultSet showCreateCatalog(ShowCreateCatalogStmt showStmt) throws AnalysisException { + public List> showCreateCatalog(String catalogName) throws AnalysisException { List> rows = Lists.newArrayList(); readLock(); try { - CatalogIf catalog = nameToCatalog.get(showStmt.getCatalog()); + CatalogIf catalog = nameToCatalog.get(catalogName); if (catalog == null) { - throw new AnalysisException("No catalog found with name " + showStmt.getCatalog()); + throw new AnalysisException("No catalog found with name " + catalogName); } StringBuilder sb = new StringBuilder(); - sb.append("\nCREATE CATALOG `").append(ClusterNamespace.getNameFromFullName(showStmt.getCatalog())) + sb.append("\nCREATE CATALOG `").append(ClusterNamespace.getNameFromFullName(catalogName)) .append("`"); if (!Strings.isNullOrEmpty(catalog.getComment())) { sb.append("\nCOMMENT \"").append(catalog.getComment()).append("\"\n"); @@ -464,11 +463,17 @@ public ShowResultSet showCreateCatalog(ShowCreateCatalogStmt showStmt) throws An sb.append("\n);"); } - rows.add(Lists.newArrayList(ClusterNamespace.getNameFromFullName(showStmt.getCatalog()), sb.toString())); + rows.add(Lists.newArrayList(ClusterNamespace.getNameFromFullName(catalogName), sb.toString())); } finally { readUnlock(); } + return rows; + } + + public ShowResultSet showCreateCatalog(ShowCreateCatalogStmt showStmt) throws AnalysisException { + List> rows = showCreateCatalog(showStmt.getCatalog()); + return new ShowResultSet(showStmt.getMetaData(), rows); } 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 51e3a901a4695a..257cf5d3309499 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 @@ -201,6 +201,7 @@ import org.apache.doris.nereids.DorisParser.ShowBackendsContext; import org.apache.doris.nereids.DorisParser.ShowConfigContext; import org.apache.doris.nereids.DorisParser.ShowConstraintContext; +import org.apache.doris.nereids.DorisParser.ShowCreateCatalogContext; import org.apache.doris.nereids.DorisParser.ShowCreateMTMVContext; import org.apache.doris.nereids.DorisParser.ShowCreateMaterializedViewContext; import org.apache.doris.nereids.DorisParser.ShowCreateProcedureContext; @@ -455,6 +456,7 @@ import org.apache.doris.nereids.trees.plans.commands.ShowBackendsCommand; import org.apache.doris.nereids.trees.plans.commands.ShowConfigCommand; import org.apache.doris.nereids.trees.plans.commands.ShowConstraintsCommand; +import org.apache.doris.nereids.trees.plans.commands.ShowCreateCatalogCommand; import org.apache.doris.nereids.trees.plans.commands.ShowCreateMTMVCommand; import org.apache.doris.nereids.trees.plans.commands.ShowCreateMaterializedViewCommand; import org.apache.doris.nereids.trees.plans.commands.ShowCreateProcedureCommand; @@ -4065,7 +4067,6 @@ public SetDefaultStorageVaultCommand visitSetDefaultStorageVault(SetDefaultStora } @Override - public Object visitRefreshCatalog(RefreshCatalogContext ctx) { if (ctx.name != null) { String catalogName = ctx.name.getText(); @@ -4177,6 +4178,11 @@ public LogicalPlan visitShowProc(ShowProcContext ctx) { return new ShowProcCommand(path); } + @Override + public LogicalPlan visitShowCreateCatalog(ShowCreateCatalogContext ctx) { + return new ShowCreateCatalogCommand(ctx.identifier().getText()); + } + @Override public LogicalPlan visitShowStorageEngines(ShowStorageEnginesContext ctx) { return new ShowStorageEnginesCommand(); 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 377bd4ce880bc6..de80cffa1f3068 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 @@ -180,6 +180,7 @@ public enum PlanType { SHOW_BACKENDS_COMMAND, SHOW_BLOCK_RULE_COMMAND, SHOW_CONFIG_COMMAND, + SHOW_CREATE_CATALOG_COMMAND, SHOW_CREATE_MATERIALIZED_VIEW_COMMAND, SHOW_CREATE_TABLE_COMMAND, SHOW_FRONTENDS_COMMAND, diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowCreateCatalogCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowCreateCatalogCommand.java new file mode 100644 index 00000000000000..c00cb1e9464330 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowCreateCatalogCommand.java @@ -0,0 +1,80 @@ +// 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.commands; + +import org.apache.doris.catalog.Column; +import org.apache.doris.catalog.Env; +import org.apache.doris.catalog.ScalarType; +import org.apache.doris.common.ErrorCode; +import org.apache.doris.common.ErrorReport; +import org.apache.doris.mysql.privilege.PrivPredicate; +import org.apache.doris.nereids.trees.plans.PlanType; +import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor; +import org.apache.doris.qe.ConnectContext; +import org.apache.doris.qe.ShowResultSet; +import org.apache.doris.qe.ShowResultSetMetaData; +import org.apache.doris.qe.StmtExecutor; + +import com.google.common.base.Strings; + +import java.util.List; +import java.util.Objects; + +/** + * Represents the command for SHOW CREATE CATALOG. + */ +public class ShowCreateCatalogCommand extends ShowCommand { + private static final ShowResultSetMetaData META_DATA = + ShowResultSetMetaData.builder() + .addColumn(new Column("Catalog", ScalarType.createVarchar(20))) + .addColumn(new Column("CreateCatalog", ScalarType.createVarchar(30))) + .build(); + + private final String catalogName; + + public ShowCreateCatalogCommand(String catalogName) { + super(PlanType.SHOW_CREATE_CATALOG_COMMAND); + this.catalogName = Objects.requireNonNull(catalogName, "Catalog name cannot be null"); + } + + @Override + public ShowResultSet doRun(ConnectContext ctx, StmtExecutor executor) throws Exception { + if (Strings.isNullOrEmpty(catalogName)) { + ErrorReport.reportAnalysisException(ErrorCode.ERR_WRONG_CATALOG_NAME, catalogName); + } + + if (!Env.getCurrentEnv().getAccessManager() + .checkCtlPriv(ConnectContext.get(), catalogName, PrivPredicate.SHOW)) { + ErrorReport.reportAnalysisException(ErrorCode.ERR_CATALOG_ACCESS_DENIED, + ConnectContext.get().getQualifiedUser(), catalogName); + } + + List> rows = Env.getCurrentEnv().getCatalogMgr().showCreateCatalog(catalogName); + + return new ShowResultSet(getMetaData(), rows); + } + + @Override + public R accept(PlanVisitor visitor, C context) { + return visitor.visitShowCreateCatalogCommand(this, context); + } + + public ShowResultSetMetaData getMetaData() { + return META_DATA; + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java index 646edc4a798c83..4af2ec8c328123 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java @@ -56,6 +56,7 @@ import org.apache.doris.nereids.trees.plans.commands.ShowBackendsCommand; import org.apache.doris.nereids.trees.plans.commands.ShowConfigCommand; import org.apache.doris.nereids.trees.plans.commands.ShowConstraintsCommand; +import org.apache.doris.nereids.trees.plans.commands.ShowCreateCatalogCommand; import org.apache.doris.nereids.trees.plans.commands.ShowCreateMTMVCommand; import org.apache.doris.nereids.trees.plans.commands.ShowCreateMaterializedViewCommand; import org.apache.doris.nereids.trees.plans.commands.ShowCreateProcedureCommand; @@ -318,6 +319,10 @@ default R visitShowStorageEnginesCommand(ShowStorageEnginesCommand showStorageEn return visitCommand(showStorageEnginesCommand, context); } + default R visitShowCreateCatalogCommand(ShowCreateCatalogCommand showCreateCatalogCommand, C context) { + return visitCommand(showCreateCatalogCommand, context); + } + default R visitShowCreateMaterializedViewCommand(ShowCreateMaterializedViewCommand showCreateMtlzViewCommand, C context) { return visitCommand(showCreateMtlzViewCommand, context); diff --git a/regression-test/data/nereids_p0/show/test_show_create_catalog.out b/regression-test/data/nereids_p0/show/test_show_create_catalog.out new file mode 100644 index 00000000000000..ecc7164312f560 --- /dev/null +++ b/regression-test/data/nereids_p0/show/test_show_create_catalog.out @@ -0,0 +1,4 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !cmd -- +es \nCREATE CATALOG `es` PROPERTIES (\n"type" = "es",\n"hosts" = "http://127.0.0.1:9200"\n); + diff --git a/regression-test/suites/nereids_p0/show/test_show_create_catalog.groovy b/regression-test/suites/nereids_p0/show/test_show_create_catalog.groovy new file mode 100644 index 00000000000000..a90ed334ffe64c --- /dev/null +++ b/regression-test/suites/nereids_p0/show/test_show_create_catalog.groovy @@ -0,0 +1,32 @@ +// 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_show_create_catalog", "p0,external,hive,external_docker,external_docker_hive") { + + String catalog_name = "es" + + sql """drop catalog if exists ${catalog_name}""" + sql """create catalog if not exists ${catalog_name} properties ( + "type"="es", + "hosts"="http://127.0.0.1:9200" + );""" + + checkNereidsExecute("""show create catalog ${catalog_name}""") + qt_cmd("""show create catalog ${catalog_name}""") + + sql """drop catalog if exists ${catalog_name}""" +} From e86949d9fb5c95ded6bb3b537f22d18c6e17c881 Mon Sep 17 00:00:00 2001 From: Vallish Pai Date: Wed, 20 Nov 2024 14:58:46 +0530 Subject: [PATCH 60/63] [Enhancement] (nereids)implement showTabletBelongCommand in nereids (#44222) Issue Number: close #42758 --- .../org/apache/doris/nereids/DorisParser.g4 | 5 +- .../nereids/parser/LogicalPlanBuilder.java | 11 ++ .../doris/nereids/trees/plans/PlanType.java | 1 + .../commands/ShowTabletsBelongCommand.java | 154 ++++++++++++++++++ .../trees/plans/visitor/CommandVisitor.java | 5 + .../auth_call/test_show_tablet_auth.groovy | 3 + 6 files changed, 177 insertions(+), 2 deletions(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowTabletsBelongCommand.java 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 3595fd35a5750e..948b0d5599f86d 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 @@ -196,6 +196,7 @@ supportedDropStatement ; supportedShowStatement + : SHOW (GLOBAL | SESSION | LOCAL)? VARIABLES wildWhere? #showVariables | SHOW AUTHORS #showAuthors | SHOW LAST INSERT #showLastInsert @@ -220,6 +221,8 @@ supportedShowStatement | SHOW FRONTENDS name=identifier? #showFrontends | SHOW TABLE tableId=INTEGER_VALUE #showTableId | SHOW WHITELIST #showWhitelist + | SHOW TABLETS BELONG + tabletIds+=INTEGER_VALUE (COMMA tabletIds+=INTEGER_VALUE)* #showTabletsBelong ; unsupportedOtherStatement @@ -296,8 +299,6 @@ unsupportedShowStatement | SHOW TEMPORARY? PARTITIONS FROM tableName=multipartIdentifier wildWhere? sortClause? limitClause? #showPartitions | SHOW TABLET tabletId=INTEGER_VALUE #showTabletId - | SHOW TABLETS BELONG - tabletIds+=INTEGER_VALUE (COMMA tabletIds+=INTEGER_VALUE)* #showTabletBelong | SHOW TABLETS FROM tableName=multipartIdentifier partitionSpec? wildWhere? sortClause? limitClause? #showTabletsFromTable | SHOW PROPERTY (FOR user=identifierOrText)? wildWhere? #showUserProperties 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 257cf5d3309499..6b5e0b129c07e8 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 @@ -220,6 +220,7 @@ import org.apache.doris.nereids.DorisParser.ShowSqlBlockRuleContext; import org.apache.doris.nereids.DorisParser.ShowStorageEnginesContext; import org.apache.doris.nereids.DorisParser.ShowTableIdContext; +import org.apache.doris.nereids.DorisParser.ShowTabletsBelongContext; import org.apache.doris.nereids.DorisParser.ShowVariablesContext; import org.apache.doris.nereids.DorisParser.ShowViewContext; import org.apache.doris.nereids.DorisParser.ShowWhitelistContext; @@ -474,6 +475,7 @@ import org.apache.doris.nereids.trees.plans.commands.ShowSqlBlockRuleCommand; import org.apache.doris.nereids.trees.plans.commands.ShowStorageEnginesCommand; import org.apache.doris.nereids.trees.plans.commands.ShowTableIdCommand; +import org.apache.doris.nereids.trees.plans.commands.ShowTabletsBelongCommand; import org.apache.doris.nereids.trees.plans.commands.ShowVariablesCommand; import org.apache.doris.nereids.trees.plans.commands.ShowViewCommand; import org.apache.doris.nereids.trees.plans.commands.ShowWhiteListCommand; @@ -4259,4 +4261,13 @@ public LogicalPlan visitShowTableId(ShowTableIdContext ctx) { public LogicalPlan visitShowPrivileges(ShowPrivilegesContext ctx) { return new ShowPrivilegesCommand(); } + + @Override + public LogicalPlan visitShowTabletsBelong(ShowTabletsBelongContext ctx) { + List tabletIdLists = new ArrayList<>(); + ctx.tabletIds.stream().forEach(tabletToken -> { + tabletIdLists.add(Long.parseLong(tabletToken.getText())); + }); + return new ShowTabletsBelongCommand(tabletIdLists); + } } 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 de80cffa1f3068..06a32bb31020c7 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 @@ -198,6 +198,7 @@ public enum PlanType { SHOW_AUTHORS_COMMAND, SHOW_VIEW_COMMAND, SHOW_WHITE_LIST_COMMAND, + SHOW_TABLETS_BELONG_COMMAND, RECOVER_DATABASE_COMMAND, RECOVER_TABLE_COMMAND, RECOVER_PARTITION_COMMAND, diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowTabletsBelongCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowTabletsBelongCommand.java new file mode 100644 index 00000000000000..2243e60868f988 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowTabletsBelongCommand.java @@ -0,0 +1,154 @@ +// 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.commands; + +import org.apache.doris.analysis.RedirectStatus; +import org.apache.doris.catalog.Column; +import org.apache.doris.catalog.Database; +import org.apache.doris.catalog.Env; +import org.apache.doris.catalog.OlapTable; +import org.apache.doris.catalog.ScalarType; +import org.apache.doris.catalog.Table; +import org.apache.doris.catalog.TabletInvertedIndex; +import org.apache.doris.catalog.TabletMeta; +import org.apache.doris.common.ErrorCode; +import org.apache.doris.common.ErrorReport; +import org.apache.doris.common.Pair; +import org.apache.doris.common.util.DebugUtil; +import org.apache.doris.mysql.privilege.PrivPredicate; +import org.apache.doris.nereids.trees.plans.PlanType; +import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor; +import org.apache.doris.qe.ConnectContext; +import org.apache.doris.qe.ShowResultSet; +import org.apache.doris.qe.ShowResultSetMetaData; +import org.apache.doris.qe.StmtExecutor; + +import com.google.common.collect.ImmutableList; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * show tablet belong command + */ +public class ShowTabletsBelongCommand extends ShowCommand { + private static final ImmutableList TITLE_NAMES = new ImmutableList.Builder() + .add("DbName") + .add("TableName") + .add("TableSize") + .add("PartitionNum") + .add("BucketNum") + .add("ReplicaCount") + .add("TabletIds") + .build(); + private final List tabletIds; + + /** + * constructor + */ + public ShowTabletsBelongCommand(List tabletIds) { + super(PlanType.SHOW_TABLETS_BELONG_COMMAND); + this.tabletIds = tabletIds; + } + + public ShowResultSetMetaData getMetaData() { + ShowResultSetMetaData.Builder builder = ShowResultSetMetaData.builder(); + for (String title : TITLE_NAMES) { + builder.addColumn(new Column(title, ScalarType.createVarchar(128))); + } + return builder.build(); + } + + @Override + public ShowResultSet doRun(ConnectContext ctx, StmtExecutor executor) throws Exception { + //validation logic + // check auth + if (!Env.getCurrentEnv().getAccessManager().checkGlobalPriv(ConnectContext.get(), PrivPredicate.ADMIN)) { + ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR, + PrivPredicate.ADMIN.getPrivs().toString()); + } + if (tabletIds == null || tabletIds.isEmpty()) { + throw new Exception("Please supply at least one tablet id"); + } + + // main logic. + List> rows = new ArrayList<>(); + Env env = Env.getCurrentEnv(); + TabletInvertedIndex invertedIndex = Env.getCurrentInvertedIndex(); + Map> tableToTabletIdsMap = new HashMap<>(); + for (long tabletId : tabletIds) { + TabletMeta tabletMeta = invertedIndex.getTabletMeta(tabletId); + if (tabletMeta == null) { + continue; + } + Database db = env.getInternalCatalog().getDbNullable(tabletMeta.getDbId()); + if (db == null) { + continue; + } + long tableId = tabletMeta.getTableId(); + Table table = db.getTableNullable(tableId); + if (table == null) { + continue; + } + + if (!tableToTabletIdsMap.containsKey(tableId)) { + tableToTabletIdsMap.put(tableId, new HashSet<>()); + } + tableToTabletIdsMap.get(tableId).add(tabletId); + } + + for (long tableId : tableToTabletIdsMap.keySet()) { + Table table = env.getInternalCatalog().getTableByTableId(tableId); + List line = new ArrayList<>(); + line.add(table.getDatabase().getFullName()); + line.add(table.getName()); + + OlapTable olapTable = (OlapTable) table; + Pair tableSizePair = DebugUtil.getByteUint((long) olapTable.getDataSize()); + String readableSize = DebugUtil.DECIMAL_FORMAT_SCALE_3.format(tableSizePair.first) + " " + + tableSizePair.second; + line.add(readableSize); + line.add(new Long(olapTable.getPartitionNum()).toString()); + int totalBucketNum = 0; + Set partitionNamesSet = table.getPartitionNames(); + for (String partitionName : partitionNamesSet) { + totalBucketNum += table.getPartition(partitionName).getDistributionInfo().getBucketNum(); + } + line.add(new Long(totalBucketNum).toString()); + line.add(new Long(olapTable.getReplicaCount()).toString()); + line.add(tableToTabletIdsMap.get(tableId).toString()); + + rows.add(line); + } + return new ShowResultSet(getMetaData(), rows); + } + + @Override + public R accept(PlanVisitor visitor, C context) { + return visitor.visitShowTabletsBelongCommand(this, context); + } + + @Override + public RedirectStatus toRedirectStatus() { + return RedirectStatus.FORWARD_NO_SYNC; + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java index 4af2ec8c328123..5b77c5b5be019e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java @@ -74,6 +74,7 @@ import org.apache.doris.nereids.trees.plans.commands.ShowSqlBlockRuleCommand; import org.apache.doris.nereids.trees.plans.commands.ShowStorageEnginesCommand; import org.apache.doris.nereids.trees.plans.commands.ShowTableIdCommand; +import org.apache.doris.nereids.trees.plans.commands.ShowTabletsBelongCommand; import org.apache.doris.nereids.trees.plans.commands.ShowVariablesCommand; import org.apache.doris.nereids.trees.plans.commands.ShowViewCommand; import org.apache.doris.nereids.trees.plans.commands.ShowWhiteListCommand; @@ -363,4 +364,8 @@ default R visitShowTableIdCommand(ShowTableIdCommand showTableIdCommand, C conte default R visitShowPrivilegesCommand(ShowPrivilegesCommand showPrivilegesCommand, C context) { return visitCommand(showPrivilegesCommand, context); } + + default R visitShowTabletsBelongCommand(ShowTabletsBelongCommand showTabletBelongCommand, C context) { + return visitCommand(showTabletBelongCommand, context); + } } diff --git a/regression-test/suites/auth_call/test_show_tablet_auth.groovy b/regression-test/suites/auth_call/test_show_tablet_auth.groovy index 03f8ed58a8ed40..d071dcae074dec 100644 --- a/regression-test/suites/auth_call/test_show_tablet_auth.groovy +++ b/regression-test/suites/auth_call/test_show_tablet_auth.groovy @@ -78,6 +78,9 @@ suite("test_show_tablet_auth","p0,auth_call") { def tablet_res = sql """SHOW TABLET ${res[0][0]}""" assertTrue(tablet_res.size() == 1) + + checkNereidsExecute("SHOW TABLETS BELONG ${res[0][0]}") + checkNereidsExecute("SHOW TABLETS BELONG 100,101") tablet_res = sql """SHOW TABLETS BELONG ${res[0][0]}""" assertTrue(tablet_res.size() == 1) From e54c5de220478565e85abf43e18ffadd5223b215 Mon Sep 17 00:00:00 2001 From: Vallish Pai Date: Wed, 20 Nov 2024 15:00:27 +0530 Subject: [PATCH 61/63] [Enhancement] (nereids)implement DropSqlBlockRuleCommand in nereids (#44302) Issue Number: close #42624 --- .../org/apache/doris/nereids/DorisParser.g4 | 2 +- .../doris/blockrule/SqlBlockRuleMgr.java | 7 ++- .../nereids/parser/LogicalPlanBuilder.java | 7 +++ .../doris/nereids/trees/plans/PlanType.java | 1 + .../commands/DropSqlBlockRuleCommand.java | 60 +++++++++++++++++++ .../trees/plans/visitor/CommandVisitor.java | 5 ++ .../sql_block_rule_p0/test_sql_block_rule.out | 8 ++- .../test_sql_block_rule.groovy | 23 ++++++- 8 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropSqlBlockRuleCommand.java 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 948b0d5599f86d..97932c3bb2afd9 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 @@ -193,6 +193,7 @@ supportedAlterStatement supportedDropStatement : DROP CATALOG RECYCLE BIN WHERE idType=STRING_LITERAL EQ id=INTEGER_VALUE #dropCatalogRecycleBin | DROP ROLE (IF EXISTS)? name=identifier #dropRole + | DROP SQL_BLOCK_RULE (IF EXISTS)? identifierSeq #dropSqlBlockRule ; supportedShowStatement @@ -671,7 +672,6 @@ unsupportedDropStatement | DROP WORKLOAD GROUP (IF EXISTS)? name=identifierOrText #dropWorkloadGroup | DROP WORKLOAD POLICY (IF EXISTS)? name=identifierOrText #dropWorkloadPolicy | DROP ENCRYPTKEY (IF EXISTS)? name=multipartIdentifier #dropEncryptkey - | DROP SQL_BLOCK_RULE (IF EXISTS)? identifierSeq #dropSqlBlockRule | DROP ROW POLICY (IF EXISTS)? policyName=identifier ON tableName=multipartIdentifier (FOR (userIdentify | ROLE roleName=identifier))? #dropRowPolicy diff --git a/fe/fe-core/src/main/java/org/apache/doris/blockrule/SqlBlockRuleMgr.java b/fe/fe-core/src/main/java/org/apache/doris/blockrule/SqlBlockRuleMgr.java index c6dd0af42109eb..aa3b844f3e38ef 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/blockrule/SqlBlockRuleMgr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/blockrule/SqlBlockRuleMgr.java @@ -203,12 +203,15 @@ private void unprotectedAdd(SqlBlockRule sqlBlockRule) { * Drop SqlBlockRule for drop stmt. **/ public void dropSqlBlockRule(DropSqlBlockRuleStmt stmt) throws DdlException { + dropSqlBlockRule(stmt.getRuleNames(), stmt.isIfExists()); + } + + public void dropSqlBlockRule(List ruleNames, boolean isIfExists) throws DdlException { writeLock(); try { - List ruleNames = stmt.getRuleNames(); for (String ruleName : ruleNames) { if (!existRule(ruleName)) { - if (stmt.isIfExists()) { + if (isIfExists) { continue; } throw new DdlException("the sql block rule " + ruleName + " not exist"); 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 6b5e0b129c07e8..36b25e474df745 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 @@ -101,6 +101,7 @@ import org.apache.doris.nereids.DorisParser.DropMTMVContext; import org.apache.doris.nereids.DorisParser.DropProcedureContext; import org.apache.doris.nereids.DorisParser.DropRoleContext; +import org.apache.doris.nereids.DorisParser.DropSqlBlockRuleContext; import org.apache.doris.nereids.DorisParser.ElementAtContext; import org.apache.doris.nereids.DorisParser.ExceptContext; import org.apache.doris.nereids.DorisParser.ExceptOrReplaceContext; @@ -438,6 +439,7 @@ import org.apache.doris.nereids.trees.plans.commands.DropMTMVCommand; import org.apache.doris.nereids.trees.plans.commands.DropProcedureCommand; import org.apache.doris.nereids.trees.plans.commands.DropRoleCommand; +import org.apache.doris.nereids.trees.plans.commands.DropSqlBlockRuleCommand; import org.apache.doris.nereids.trees.plans.commands.ExplainCommand; import org.apache.doris.nereids.trees.plans.commands.ExplainCommand.ExplainLevel; import org.apache.doris.nereids.trees.plans.commands.ExportCommand; @@ -4248,6 +4250,11 @@ public LogicalPlan visitDropRole(DropRoleContext ctx) { return new DropRoleCommand(ctx.name.getText(), ctx.EXISTS() != null); } + @Override + public LogicalPlan visitDropSqlBlockRule(DropSqlBlockRuleContext ctx) { + return new DropSqlBlockRuleCommand(visitIdentifierSeq(ctx.identifierSeq()), ctx.EXISTS() != null); + } + @Override public LogicalPlan visitShowTableId(ShowTableIdContext ctx) { long tableId = -1; 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 06a32bb31020c7..e040d18b82f4fa 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 @@ -177,6 +177,7 @@ public enum PlanType { REFRESH_CATALOG_COMMAND, PREPARED_COMMAND, EXECUTE_COMMAND, + DROP_SQL_BLOCK_RULE_COMMAND, SHOW_BACKENDS_COMMAND, SHOW_BLOCK_RULE_COMMAND, SHOW_CONFIG_COMMAND, diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropSqlBlockRuleCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropSqlBlockRuleCommand.java new file mode 100644 index 00000000000000..37ce9104a44d07 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropSqlBlockRuleCommand.java @@ -0,0 +1,60 @@ +// 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.commands; + +import org.apache.doris.catalog.Env; +import org.apache.doris.common.ErrorCode; +import org.apache.doris.common.ErrorReport; +import org.apache.doris.mysql.privilege.PrivPredicate; +import org.apache.doris.nereids.trees.plans.PlanType; +import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor; +import org.apache.doris.qe.ConnectContext; +import org.apache.doris.qe.StmtExecutor; + +import java.util.List; + +/** + * drop sql block rule command + */ +public class DropSqlBlockRuleCommand extends DropCommand { + private final boolean ifExists; + private List ruleNames; + + /** + * constructor + */ + public DropSqlBlockRuleCommand(List ruleNames, boolean ifExists) { + super(PlanType.DROP_SQL_BLOCK_RULE_COMMAND); + this.ruleNames = ruleNames; + this.ifExists = ifExists; + } + + @Override + public void doRun(ConnectContext ctx, StmtExecutor executor) throws Exception { + // check auth + if (!Env.getCurrentEnv().getAccessManager().checkGlobalPriv(ConnectContext.get(), PrivPredicate.ADMIN)) { + ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR, "ADMIN"); + } + Env.getCurrentEnv().getSqlBlockRuleMgr().dropSqlBlockRule(ruleNames, ifExists); + } + + @Override + public R accept(PlanVisitor visitor, C context) { + return visitor.visitDropSqlBlockRuleCommand(this, context); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java index 5b77c5b5be019e..9bffb5a376e45e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java @@ -38,6 +38,7 @@ import org.apache.doris.nereids.trees.plans.commands.DropMTMVCommand; import org.apache.doris.nereids.trees.plans.commands.DropProcedureCommand; import org.apache.doris.nereids.trees.plans.commands.DropRoleCommand; +import org.apache.doris.nereids.trees.plans.commands.DropSqlBlockRuleCommand; import org.apache.doris.nereids.trees.plans.commands.ExplainCommand; import org.apache.doris.nereids.trees.plans.commands.ExportCommand; import org.apache.doris.nereids.trees.plans.commands.LoadCommand; @@ -357,6 +358,10 @@ default R visitDropRoleCommand(DropRoleCommand dropRoleCommand, C context) { return visitCommand(dropRoleCommand, context); } + default R visitDropSqlBlockRuleCommand(DropSqlBlockRuleCommand dropSqlBlockRuleCommand, C context) { + return visitCommand(dropSqlBlockRuleCommand, context); + } + default R visitShowTableIdCommand(ShowTableIdCommand showTableIdCommand, C context) { return visitCommand(showTableIdCommand, context); } diff --git a/regression-test/data/sql_block_rule_p0/test_sql_block_rule.out b/regression-test/data/sql_block_rule_p0/test_sql_block_rule.out index 373ec1348d1b39..c43c520177256b 100644 --- a/regression-test/data/sql_block_rule_p0/test_sql_block_rule.out +++ b/regression-test/data/sql_block_rule_p0/test_sql_block_rule.out @@ -5,5 +5,11 @@ test_rule_sql SELECT abcd FROM table_2 NULL 0 0 0 true true -- !select2 -- test_rule_sql SELECT abcd FROM table_2 NULL 0 0 0 true true --- !select3 -- +-- !select3_notexist -- + +-- !select4_exist -- +test_rule_sql SELECT \\* FROM table_2 NULL 0 0 0 true true +test_rule_sql1 SELECT \\* FROM table_2 NULL 0 0 0 true true + +-- !select5_not_exist -- diff --git a/regression-test/suites/sql_block_rule_p0/test_sql_block_rule.groovy b/regression-test/suites/sql_block_rule_p0/test_sql_block_rule.groovy index e0243e35a090a7..13b83d272decdb 100644 --- a/regression-test/suites/sql_block_rule_p0/test_sql_block_rule.groovy +++ b/regression-test/suites/sql_block_rule_p0/test_sql_block_rule.groovy @@ -92,8 +92,27 @@ suite("test_sql_block_rule", "nonConcurrent") { SHOW SQL_BLOCK_RULE FOR test_rule_sql """ + checkNereidsExecute("DROP SQL_BLOCK_RULE if exists test_rule_sql") + + qt_select3_notexist """ + SHOW SQL_BLOCK_RULE + """ + sql """ - DROP SQL_BLOCK_RULE if exists test_rule_sql + CREATE SQL_BLOCK_RULE if not exists test_rule_sql + PROPERTIES("sql"="SELECT \\\\* FROM table_2", "global"= "true", "enable"= "true") + """ + sql """ + CREATE SQL_BLOCK_RULE if not exists test_rule_sql1 + PROPERTIES("sql"="SELECT \\\\* FROM table_2", "global"= "true", "enable"= "true") + """ + + qt_select4_exist """ + SHOW SQL_BLOCK_RULE + """ + + sql """ + DROP SQL_BLOCK_RULE if exists test_rule_sql,test_rule_sql1 """ sql """ @@ -110,7 +129,7 @@ suite("test_sql_block_rule", "nonConcurrent") { exception "sql hits sql block rule: test_rule_num, reach tablet_num : 1" } */ - qt_select3 """ + qt_select5_not_exist """ SHOW SQL_BLOCK_RULE """ From d300eb16100e07b81f605f837add71a1831e85c9 Mon Sep 17 00:00:00 2001 From: "Mingyu Chen (Rayner)" Date: Wed, 20 Nov 2024 18:49:48 +0800 Subject: [PATCH 62/63] Revert "[Fix](log)To avoid SLF4J multiple binding issues and unnecessary dependency propagation." (#44347) Reverts apache/doris#44310 --- fe/pom.xml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/fe/pom.xml b/fe/pom.xml index d1fed9fc7602f9..d78cfd50b819b4 100644 --- a/fe/pom.xml +++ b/fe/pom.xml @@ -857,15 +857,6 @@ under the License. json-simple ${json-simple.version} - - - org.slf4j - slf4j-reload4j - test - org.junit.jupiter From 6898b77507182d6ae4e88c20512c54aa989edeab Mon Sep 17 00:00:00 2001 From: jw-sun <55874234+Sjwhello@users.noreply.github.com> Date: Wed, 20 Nov 2024 19:07:18 +0800 Subject: [PATCH 63/63] [improve][ms] Bvars add the FDB get_count_normalized indicator (#44036) ### What problem does this PR solve? Bvars add the FDB get_count_normalized indicator - g_bvar_txn_kv_ get_count_normalized Co-authored-by: sunjiangwei --- cloud/src/common/bvars.cpp | 2 ++ cloud/src/common/bvars.h | 1 + cloud/src/meta-service/txn_kv.cpp | 3 +++ 3 files changed, 6 insertions(+) diff --git a/cloud/src/common/bvars.cpp b/cloud/src/common/bvars.cpp index 2e2e312d0c1413..507acb00dff0b0 100644 --- a/cloud/src/common/bvars.cpp +++ b/cloud/src/common/bvars.cpp @@ -102,6 +102,8 @@ bvar::LatencyRecorder g_bvar_txn_kv_get_read_version("txn_kv", "get_read_version bvar::LatencyRecorder g_bvar_txn_kv_get_committed_version("txn_kv", "get_committed_version"); bvar::LatencyRecorder g_bvar_txn_kv_batch_get("txn_kv", "batch_get"); +bvar::Adder g_bvar_txn_kv_get_count_normalized("txn_kv", "get_count_normalized"); + bvar::Adder g_bvar_txn_kv_commit_error_counter; bvar::Window > g_bvar_txn_kv_commit_error_counter_minute( "txn_kv", "commit_error", &g_bvar_txn_kv_commit_error_counter, 60); diff --git a/cloud/src/common/bvars.h b/cloud/src/common/bvars.h index c2e21c66daad0d..373a3a63ff2703 100644 --- a/cloud/src/common/bvars.h +++ b/cloud/src/common/bvars.h @@ -198,6 +198,7 @@ extern bvar::LatencyRecorder g_bvar_txn_kv_batch_get; extern bvar::Adder g_bvar_txn_kv_commit_error_counter; extern bvar::Adder g_bvar_txn_kv_commit_conflict_counter; +extern bvar::Adder g_bvar_txn_kv_get_count_normalized; extern const int64_t BVAR_FDB_INVALID_VALUE; extern bvar::Status g_bvar_fdb_client_count; diff --git a/cloud/src/meta-service/txn_kv.cpp b/cloud/src/meta-service/txn_kv.cpp index f40bee76f7a441..ea31d5cb97bc11 100644 --- a/cloud/src/meta-service/txn_kv.cpp +++ b/cloud/src/meta-service/txn_kv.cpp @@ -377,6 +377,7 @@ TxnErrorCode Transaction::get(std::string_view key, std::string* val, bool snaps approximate_bytes_ += key.size() * 2; // See fdbclient/ReadYourWrites.actor.cpp for details auto* fut = fdb_transaction_get(txn_, (uint8_t*)key.data(), key.size(), snapshot); + g_bvar_txn_kv_get_count_normalized << 1; auto release_fut = [fut, &sw](int*) { fdb_future_destroy(fut); g_bvar_txn_kv_get << sw.elapsed_us(); @@ -434,6 +435,7 @@ TxnErrorCode Transaction::get(std::string_view begin, std::string_view end, std::unique_ptr ret(new RangeGetIterator(fut)); RETURN_IF_ERROR(ret->init()); + g_bvar_txn_kv_get_count_normalized << ret->size(); *(iter) = std::move(ret); @@ -619,6 +621,7 @@ TxnErrorCode Transaction::batch_get(std::vector>* res size_t num_keys = keys.size(); res->reserve(keys.size()); + g_bvar_txn_kv_get_count_normalized << keys.size(); std::vector> futures; futures.reserve(opts.concurrency); for (size_t i = 0; i < num_keys; i += opts.concurrency) {